@redaksjon/protokoll 1.0.32 → 1.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"file":"engineLogging.js","sources":["../src/mcp/uri.ts","../src/constants.ts","../src/context/index.ts","../src/mcp/roots.ts","../src/mcp/storage/types.ts","../src/mcp/storage/gcsUri.ts","../src/mcp/storage/gcsProvider.ts","../src/mcp/storage/fileProviders.ts","../src/mcp/serverConfig.ts","../src/mcp/resources/definitions.ts","../src/mcp/resources/discovery.ts","../src/logging.ts","../src/mcp/resources/entityIndexService.ts","../src/mcp/tools/shared.ts","../src/mcp/resources/transcriptIndexService.ts","../src/mcp/resources/transcriptResources.ts","../src/mcp/util/scopedEntityId.ts","../src/mcp/resources/entityResources.ts","../src/mcp/resources/audioResources.ts","../src/mcp/resources/configResource.ts","../src/mcp/resources/index.ts","../src/mcp/prompts/index.ts","../src/mcp/tools/discoveryTools.ts","../src/mcp/tools/audioTools.ts","../src/mcp/tools/contextTools.ts","../src/mcp/tools/entityTools.ts","../src/mcp/tools/assistTools.ts","../src/mcp/tools/transcriptTools.ts","../src/mcp/tools/systemTools.ts","../src/mcp/tools/relationshipTools.ts","../src/mcp/tools/contentTools.ts","../src/mcp/tools/statusTools.ts","../src/mcp/tools/queueTools.ts","../src/mcp/tools/index.ts","../src/mcp/configDiscovery.ts","../src/mcp/engineLogging.ts"],"sourcesContent":["/**\n * URI Parser for Protokoll MCP Resources\n * \n * Handles parsing and construction of protokoll:// URIs.\n * \n * URI Schemes:\n * - protokoll://transcript/{path}\n * - protokoll://entity/{type}/{id}\n * - protokoll://config/{path}\n * - protokoll://transcripts?directory={dir}&startDate={date}&...\n * - protokoll://entities/{type}\n */\n\nimport type {\n ParsedResourceUri,\n TranscriptUri,\n EntityUri,\n ConfigUri,\n TranscriptsListUri,\n EntitiesListUri,\n AudioInboundUri,\n AudioProcessedUri,\n ResourceType,\n} from './types';\n\nconst SCHEME = 'protokoll';\n\n/**\n * Parse a protokoll:// URI into its components\n */\nexport function parseUri(uri: string): ParsedResourceUri {\n if (!uri.startsWith(`${SCHEME}://`)) {\n throw new Error(`Invalid URI scheme: ${uri}. Expected protokoll://`);\n }\n\n const withoutScheme = uri.substring(`${SCHEME}://`.length);\n const [pathPart, queryPart] = withoutScheme.split('?');\n const segments = pathPart.split('/').filter(s => s.length > 0);\n\n if (segments.length === 0) {\n throw new Error(`Invalid URI: ${uri}. No resource type specified.`);\n }\n\n const firstSegment = segments[0];\n const params = parseQueryParams(queryPart);\n\n switch (firstSegment) {\n case 'transcript':\n return parseTranscriptUri(uri, segments, params);\n case 'entity':\n return parseEntityUri(uri, segments, params);\n case 'config':\n return parseConfigUri(uri, segments, params);\n case 'transcripts':\n case 'transcripts-list':\n return parseTranscriptsListUri(uri, segments, params);\n case 'entities':\n case 'entities-list':\n return parseEntitiesListUri(uri, segments, params);\n case 'audio':\n return parseAudioUri(uri, segments, params);\n default:\n throw new Error(`Unknown resource type: ${firstSegment}`);\n }\n}\n\nfunction parseQueryParams(queryPart?: string): Record<string, string> {\n if (!queryPart) return {};\n \n const params: Record<string, string> = {};\n const pairs = queryPart.split('&');\n \n for (const pair of pairs) {\n const [key, value] = pair.split('=');\n if (key && value !== undefined) {\n params[decodeURIComponent(key)] = decodeURIComponent(value);\n }\n }\n \n return params;\n}\n\nfunction parseTranscriptUri(\n uri: string,\n segments: string[],\n params: Record<string, string>\n): TranscriptUri {\n // protokoll://transcript/path/to/file\n // Note: URIs should NOT include file extensions (.md or .pkl)\n // The server resolves the actual file format automatically\n // \n // Handle both relative and absolute paths\n // If URI has double slash after transcript, it's an absolute path\n const withoutScheme = uri.substring(`${SCHEME}://`.length);\n const [pathPart] = withoutScheme.split('?');\n \n // Check if path starts with transcript/ followed by / (absolute path)\n const transcriptPrefix = 'transcript/';\n let transcriptPath: string;\n \n if (pathPart.startsWith(transcriptPrefix)) {\n // Extract everything after \"transcript/\"\n const afterPrefix = pathPart.substring(transcriptPrefix.length);\n // If it starts with /, it's an absolute path - preserve it\n if (afterPrefix.startsWith('/')) {\n transcriptPath = afterPrefix;\n } else {\n // Relative path - use segments\n transcriptPath = segments.slice(1).join('/');\n }\n } else {\n // Fallback to segments method\n transcriptPath = segments.slice(1).join('/');\n }\n \n if (!transcriptPath) {\n throw new Error(`Invalid transcript URI: ${uri}. No path specified.`);\n }\n\n // Decode the path - the server will resolve the actual file format\n const decodedPath = decodeURIComponent(transcriptPath);\n\n return {\n scheme: SCHEME,\n resourceType: 'transcript',\n path: transcriptPath,\n params,\n transcriptPath: decodedPath,\n };\n}\n\nfunction parseEntityUri(\n uri: string,\n segments: string[],\n params: Record<string, string>\n): EntityUri {\n // protokoll://entity/{type}/{id}\n if (segments.length < 3) {\n throw new Error(`Invalid entity URI: ${uri}. Expected protokoll://entity/{type}/{id}`);\n }\n\n const entityType = segments[1] as EntityUri['entityType'];\n const entityId = segments.slice(2).join('/');\n\n const validTypes = ['person', 'project', 'term', 'company', 'ignored'];\n if (!validTypes.includes(entityType)) {\n throw new Error(`Invalid entity type: ${entityType}. Expected one of: ${validTypes.join(', ')}`);\n }\n\n return {\n scheme: SCHEME,\n resourceType: 'entity',\n path: `${entityType}/${entityId}`,\n params,\n entityType,\n entityId: decodeURIComponent(entityId),\n };\n}\n\nfunction parseConfigUri(\n uri: string,\n segments: string[],\n params: Record<string, string>\n): ConfigUri {\n // protokoll://config/{path}\n const configPath = segments.slice(1).join('/');\n\n return {\n scheme: SCHEME,\n resourceType: 'config',\n path: configPath || '',\n params,\n configPath: configPath ? decodeURIComponent(configPath) : '',\n };\n}\n\nfunction parseTranscriptsListUri(\n uri: string,\n segments: string[],\n params: Record<string, string>\n): TranscriptsListUri {\n // protokoll://transcripts?directory={dir}&startDate={date}&projectId={id}&limit=&offset=...\n const directory = params.directory || '';\n\n const limitRaw = params.limit ? parseInt(params.limit, 10) : NaN;\n const offsetRaw = params.offset ? parseInt(params.offset, 10) : NaN;\n\n return {\n scheme: SCHEME,\n resourceType: 'transcripts-list',\n path: segments.slice(1).join('/'),\n params,\n directory,\n startDate: params.startDate,\n endDate: params.endDate,\n limit: Number.isFinite(limitRaw) && limitRaw > 0 ? limitRaw : undefined,\n offset: Number.isFinite(offsetRaw) && offsetRaw >= 0 ? offsetRaw : undefined,\n projectId: params.projectId,\n };\n}\n\nfunction parseEntitiesListUri(\n uri: string,\n segments: string[],\n params: Record<string, string>\n): EntitiesListUri {\n // protokoll://entities/{type}\n const entityType = (segments[1] || params.type || 'project') as EntitiesListUri['entityType'];\n\n return {\n scheme: SCHEME,\n resourceType: 'entities-list',\n path: entityType,\n params,\n entityType,\n };\n}\n\nfunction parseAudioUri(\n uri: string,\n segments: string[],\n params: Record<string, string>\n): AudioInboundUri | AudioProcessedUri {\n // protokoll://audio/inbound?directory={dir}\n // protokoll://audio/processed?directory={dir}\n const audioType = segments[1];\n \n if (audioType === 'inbound') {\n return {\n scheme: SCHEME,\n resourceType: 'audio-inbound',\n path: 'audio/inbound',\n params,\n directory: params.directory,\n };\n } else if (audioType === 'processed') {\n return {\n scheme: SCHEME,\n resourceType: 'audio-processed',\n path: 'audio/processed',\n params,\n directory: params.directory,\n };\n }\n \n throw new Error(`Invalid audio URI: ${uri}. Expected protokoll://audio/inbound or protokoll://audio/processed`);\n}\n\n// ============================================================================\n// URI Builders\n// ============================================================================\n\n/**\n * Build a transcript resource URI\n * \n * @param transcriptPath The transcript identifier (should NOT include file extension)\n * e.g., \"2026/1/29-1234-meeting\" not \"2026/1/29-1234-meeting.pkl\"\n * The server resolves the actual file format automatically\n */\nexport function buildTranscriptUri(transcriptPath: string): string {\n const encoded = encodeURIComponent(transcriptPath).replace(/%2F/g, '/');\n return `${SCHEME}://transcript/${encoded}`;\n}\n\n/**\n * Build an entity resource URI\n */\nexport function buildEntityUri(\n entityType: 'person' | 'project' | 'term' | 'company' | 'ignored',\n entityId: string\n): string {\n return `${SCHEME}://entity/${entityType}/${encodeURIComponent(entityId)}`;\n}\n\n/**\n * Build a config resource URI\n */\nexport function buildConfigUri(configPath?: string): string {\n if (configPath) {\n return `${SCHEME}://config/${encodeURIComponent(configPath)}`;\n }\n return `${SCHEME}://config`;\n}\n\n/**\n * Build a transcripts list URI\n */\nexport function buildTranscriptsListUri(options: {\n directory?: string;\n startDate?: string;\n endDate?: string;\n limit?: number;\n offset?: number;\n projectId?: string;\n}): string {\n const params = new URLSearchParams();\n if (options.directory) params.set('directory', options.directory);\n if (options.startDate) params.set('startDate', options.startDate);\n if (options.endDate) params.set('endDate', options.endDate);\n if (options.limit !== undefined) params.set('limit', String(options.limit));\n if (options.offset !== undefined) params.set('offset', String(options.offset));\n if (options.projectId) params.set('projectId', options.projectId);\n \n const queryString = params.toString();\n return queryString ? `${SCHEME}://transcripts?${queryString}` : `${SCHEME}://transcripts`;\n}\n\n/**\n * Build an entities list URI\n */\nexport function buildEntitiesListUri(\n entityType: 'person' | 'project' | 'term' | 'company' | 'ignored'\n): string {\n return `${SCHEME}://entities/${entityType}`;\n}\n\n/**\n * Build an inbound audio list URI\n */\nexport function buildAudioInboundUri(directory?: string): string {\n if (directory) {\n return `${SCHEME}://audio/inbound?directory=${encodeURIComponent(directory)}`;\n }\n return `${SCHEME}://audio/inbound`;\n}\n\n/**\n * Build a processed audio list URI\n */\nexport function buildAudioProcessedUri(directory?: string): string {\n if (directory) {\n return `${SCHEME}://audio/processed?directory=${encodeURIComponent(directory)}`;\n }\n return `${SCHEME}://audio/processed`;\n}\n\n/**\n * Check if a string is a valid Protokoll URI\n */\nexport function isProtokolUri(uri: string): boolean {\n return uri.startsWith(`${SCHEME}://`);\n}\n\n/**\n * Get the resource type from a URI without full parsing\n */\nexport function getResourceType(uri: string): ResourceType | null {\n if (!isProtokolUri(uri)) return null;\n \n const withoutScheme = uri.substring(`${SCHEME}://`.length);\n const segments = withoutScheme.split('/');\n const firstSegment = segments[0].split('?')[0];\n \n if (firstSegment === 'transcripts') return 'transcripts-list';\n if (firstSegment === 'entities') return 'entities-list';\n if (firstSegment === 'audio') {\n const secondSegment = segments[1]?.split('?')[0];\n if (secondSegment === 'inbound') return 'audio-inbound';\n if (secondSegment === 'processed') return 'audio-processed';\n }\n \n return firstSegment as ResourceType;\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 - Protokoll Adapter\n * \n * This module provides protokoll-specific extensions on top of @redaksjon/context runtime.\n * Most functionality is now provided by @redaksjon/context; this module adds:\n * - Smart assistance configuration (LLM model selection, feature flags)\n * - Protokoll-specific defaults\n */\n\nimport { \n create as createContext,\n type ContextInstance as BaseContextInstance,\n type CreateOptions as BaseCreateOptions,\n} from '@redaksjon/context';\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';\nimport type { SmartAssistanceConfig } from './types';\n\n// Re-export base types\nexport type { BaseContextInstance as ContextInstance };\n\n// Extend base create options with optional GCS configuration.\nexport interface CreateOptions extends BaseCreateOptions {\n gcs?: {\n bucketName: string;\n basePath: string;\n projectId?: string;\n credentialsFile?: string;\n };\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 * Extended ContextInstance with protokoll-specific methods\n */\nexport interface ProtokollContextInstance extends BaseContextInstance {\n getSmartAssistanceConfig(): SmartAssistanceConfig;\n}\n\n/**\n * Create a new context instance with protokoll-specific extensions\n */\nexport const create = async (options: CreateOptions = {}): Promise<ProtokollContextInstance> => {\n const baseInstance = await createContext(options as BaseCreateOptions);\n\n const resolveEntityByIdentifier = <T extends { id: string; slug?: string }>(\n identifier: string | null | undefined,\n directLookup: (id: string) => T | undefined,\n listAll: () => T[],\n ): T | undefined => {\n if (typeof identifier !== 'string') {\n return undefined;\n }\n const normalized = identifier.trim();\n if (!normalized) {\n return undefined;\n }\n\n const direct = directLookup(normalized);\n if (direct) {\n return direct;\n }\n\n const normalizedLower = normalized.toLowerCase();\n const uuidPrefix = normalizedLower.match(/^([a-f0-9]{8})/)?.[1];\n\n for (const entity of listAll()) {\n const entityId = entity.id.toLowerCase();\n const entitySlug = entity.slug?.toLowerCase();\n\n if (entityId === normalizedLower) {\n return entity;\n }\n if (entitySlug && entitySlug === normalizedLower) {\n return entity;\n }\n if (entityId.startsWith(normalizedLower) || normalizedLower.startsWith(entityId)) {\n return entity;\n }\n if (uuidPrefix && entityId.startsWith(uuidPrefix)) {\n return entity;\n }\n }\n\n return undefined;\n };\n \n return {\n ...baseInstance,\n getPerson: (id: string) => resolveEntityByIdentifier(id, baseInstance.getPerson, baseInstance.getAllPeople),\n getProject: (id: string) => resolveEntityByIdentifier(id, baseInstance.getProject, baseInstance.getAllProjects),\n getCompany: (id: string) => resolveEntityByIdentifier(id, baseInstance.getCompany, baseInstance.getAllCompanies),\n getTerm: (id: string) => resolveEntityByIdentifier(id, baseInstance.getTerm, baseInstance.getAllTerms),\n getIgnored: (id: string) => resolveEntityByIdentifier(id, baseInstance.getIgnored, baseInstance.getAllIgnored),\n getSmartAssistanceConfig: () => getSmartAssistanceConfig(baseInstance.getConfig()),\n };\n};\n\n// Re-export types from @redaksjon/context\nexport * from '@redaksjon/context';\n\n// Re-export protokoll-specific types\nexport * from './types';\n\n// Re-export discovery utilities (now from @redaksjon/context)\nexport { discoverConfigDirectories, loadHierarchicalConfig, deepMerge } from '@redaksjon/context';\n","/**\n * MCP Roots Module\n * \n * Enables the server to discover filesystem boundaries exposed by the client.\n * Roots define where the server is allowed to operate.\n * \n * Key behaviors:\n * - Server requests roots via roots/list\n * - Client may notify of changes via notifications/roots/list_changed\n * - All root URIs are file:// URIs\n */\n\nimport type { McpRoot } from './types';\n\n// Cached roots from the client\nlet cachedRoots: McpRoot[] | null = null;\n// eslint-disable-next-line @typescript-eslint/no-unused-vars\nlet rootsListChangedSupported = false;\n\n/**\n * Check if the client supports roots\n */\nexport function clientSupportsRoots(clientCapabilities: unknown): {\n supported: boolean;\n listChangedSupported: boolean;\n} {\n const caps = clientCapabilities as Record<string, unknown> | undefined;\n const roots = caps?.roots as Record<string, unknown> | undefined;\n \n if (!roots) {\n return { supported: false, listChangedSupported: false };\n }\n\n return {\n supported: true,\n listChangedSupported: roots.listChanged === true,\n };\n}\n\n/**\n * Store client capabilities for roots\n */\nexport function initializeRoots(clientCapabilities: unknown): void {\n const { listChangedSupported } = clientSupportsRoots(clientCapabilities);\n rootsListChangedSupported = listChangedSupported;\n cachedRoots = null; // Clear cache on init\n}\n\n/**\n * Cache roots received from the client\n */\nexport function setRoots(roots: McpRoot[]): void {\n cachedRoots = roots;\n}\n\n/**\n * Clear cached roots (call when roots/list_changed notification received)\n */\nexport function clearRootsCache(): void {\n cachedRoots = null;\n}\n\n/**\n * Get cached roots (returns null if not yet fetched)\n */\nexport function getCachedRoots(): McpRoot[] | null {\n return cachedRoots;\n}\n\n/**\n * Check if a path is within any of the roots\n */\nexport function isPathWithinRoots(path: string, roots: McpRoot[]): boolean {\n const normalizedPath = normalizePath(path);\n \n for (const root of roots) {\n const rootPath = fileUriToPath(root.uri);\n if (rootPath && normalizedPath.startsWith(normalizePath(rootPath))) {\n return true;\n }\n }\n \n return false;\n}\n\n/**\n * Find which root a path belongs to\n */\nexport function findRootForPath(path: string, roots: McpRoot[]): McpRoot | null {\n const normalizedPath = normalizePath(path);\n \n // Find the most specific (longest) matching root\n let bestMatch: McpRoot | null = null;\n let bestMatchLength = 0;\n \n for (const root of roots) {\n const rootPath = fileUriToPath(root.uri);\n if (rootPath) {\n const normalizedRoot = normalizePath(rootPath);\n if (normalizedPath.startsWith(normalizedRoot) && normalizedRoot.length > bestMatchLength) {\n bestMatch = root;\n bestMatchLength = normalizedRoot.length;\n }\n }\n }\n \n return bestMatch;\n}\n\n/**\n * Convert a file:// URI to a filesystem path\n */\nexport function fileUriToPath(uri: string): string | null {\n if (!uri.startsWith('file://')) {\n return null;\n }\n \n try {\n const url = new URL(uri);\n return decodeURIComponent(url.pathname);\n } catch {\n return null;\n }\n}\n\n/**\n * Convert a filesystem path to a file:// URI\n */\nexport function pathToFileUri(path: string): string {\n // Normalize path separators\n const normalized = path.replace(/\\\\/g, '/');\n \n // Ensure path starts with /\n const withLeadingSlash = normalized.startsWith('/') ? normalized : `/${normalized}`;\n \n return `file://${encodeURIComponent(withLeadingSlash).replace(/%2F/g, '/')}`;\n}\n\n/**\n * Normalize a path for comparison\n */\nfunction normalizePath(path: string): string {\n // Remove trailing slashes, normalize separators\n return path.replace(/\\\\/g, '/').replace(/\\/+$/, '');\n}\n\n/**\n * Get human-readable root names for display\n */\nexport function getRootDisplayNames(roots: McpRoot[]): string[] {\n return roots.map(root => root.name || fileUriToPath(root.uri) || root.uri);\n}\n\n/**\n * Validate that all provided paths are within roots\n * Returns paths that are NOT within roots\n */\nexport function validatePathsAgainstRoots(paths: string[], roots: McpRoot[]): string[] {\n return paths.filter(path => !isPathWithinRoots(path, roots));\n}\n","export interface GcsStorageConfig {\n /**\n * Optional explicit GCP project id.\n * When set, this should take precedence over ambient environment values.\n */\n projectId?: string;\n\n /**\n * Legacy URI-based config (still supported for backwards compatibility).\n */\n inputUri?: string;\n outputUri?: string;\n contextUri?: string;\n\n /**\n * RiotPlan-style split config.\n */\n inputBucket?: string;\n inputPrefix?: string;\n outputBucket?: string;\n outputPrefix?: string;\n contextBucket?: string;\n contextPrefix?: string;\n\n credentialsFile?: string;\n}\n\nexport interface StorageConfig {\n backend: 'filesystem' | 'gcs';\n gcs?: GcsStorageConfig;\n}\n\nexport const DEFAULT_STORAGE_CONFIG: StorageConfig = {\n backend: 'filesystem',\n};\n","export interface ParsedGcsUri {\n bucket: string;\n prefix: string;\n}\n\nfunction normalizePrefix(value: string): string {\n return value.replace(/^\\/+/, '').replace(/\\/+/g, '/').replace(/\\/+$/, '');\n}\n\nexport function parseGcsUri(uri: string): ParsedGcsUri {\n if (typeof uri !== 'string' || uri.trim().length === 0) {\n throw new Error('GCS URI must be a non-empty string.');\n }\n\n const trimmed = uri.trim();\n if (!trimmed.startsWith('gs://')) {\n throw new Error(`Invalid GCS URI \"${uri}\": must start with \"gs://\".`);\n }\n\n const withoutScheme = trimmed.slice('gs://'.length);\n if (withoutScheme.length === 0) {\n throw new Error(`Invalid GCS URI \"${uri}\": missing bucket name.`);\n }\n\n const slashIndex = withoutScheme.indexOf('/');\n const bucket = (slashIndex === -1 ? withoutScheme : withoutScheme.slice(0, slashIndex)).trim();\n if (bucket.length === 0) {\n throw new Error(`Invalid GCS URI \"${uri}\": missing bucket name.`);\n }\n\n const rawPrefix = slashIndex === -1 ? '' : withoutScheme.slice(slashIndex + 1);\n const prefix = normalizePrefix(rawPrefix);\n\n return { bucket, prefix };\n}\n","import { Storage } from '@google-cloud/storage';\nimport Logging from '@fjell/logging';\nimport { parseGcsUri } from './gcsUri';\nimport type { FileStorageProvider, StorageFileMetadata } from './fileProviders';\n\nconst logger = Logging.getLogger('@redaksjon/protokoll-mcp').get('gcs-storage');\n\nfunction normalizePath(value: string): string {\n return value.replace(/^\\/+/, '').replace(/\\\\/g, '/');\n}\n\nfunction joinObjectPath(basePrefix: string, objectPath: string): string {\n const normalizedBase = basePrefix.replace(/^\\/+|\\/+$/g, '');\n const normalizedObjectPath = normalizePath(objectPath);\n if (!normalizedBase) {\n return normalizedObjectPath;\n }\n if (!normalizedObjectPath) {\n return normalizedBase;\n }\n return `${normalizedBase}/${normalizedObjectPath}`;\n}\n\nexport class GcsStorageProvider implements FileStorageProvider {\n readonly name = 'gcs' as const;\n readonly cacheKey: string;\n\n constructor(\n private readonly storage: Storage,\n private readonly bucketName: string,\n private readonly basePrefix: string,\n ) {\n this.cacheKey = `gcs:${this.bucketName}/${this.basePrefix.replace(/^\\/+|\\/+$/g, '')}`;\n }\n\n private objectPath(pathValue: string): string {\n return joinObjectPath(this.basePrefix, pathValue);\n }\n\n async readFile(pathValue: string): Promise<Buffer> {\n const startedAt = Date.now();\n const objectPath = this.objectPath(pathValue);\n logger.debug('gcs.read.start', {\n bucket: this.bucketName,\n basePrefix: this.basePrefix,\n path: pathValue,\n objectPath,\n });\n const [contents] = await this.storage.bucket(this.bucketName).file(objectPath).download();\n logger.info('gcs.read.complete', {\n bucket: this.bucketName,\n objectPath,\n bytes: contents.length,\n elapsedMs: Date.now() - startedAt,\n });\n return contents;\n }\n\n async writeFile(pathValue: string, data: Buffer | string): Promise<void> {\n const startedAt = Date.now();\n const objectPath = this.objectPath(pathValue);\n const bytes = typeof data === 'string' ? Buffer.byteLength(data) : data.length;\n logger.debug('gcs.write.start', {\n bucket: this.bucketName,\n basePrefix: this.basePrefix,\n path: pathValue,\n objectPath,\n bytes,\n });\n await this.storage.bucket(this.bucketName).file(objectPath).save(data);\n logger.info('gcs.write.complete', {\n bucket: this.bucketName,\n objectPath,\n bytes,\n elapsedMs: Date.now() - startedAt,\n });\n }\n\n async listFiles(prefix: string, pattern?: string): Promise<string[]> {\n const withMetadata = await this.listFilesWithMetadata(prefix, pattern);\n return withMetadata.map((entry) => entry.path);\n }\n\n async listFilesWithMetadata(prefix: string, pattern?: string): Promise<StorageFileMetadata[]> {\n const startedAt = Date.now();\n const fullPrefix = this.objectPath(prefix);\n logger.debug('gcs.list.start', {\n bucket: this.bucketName,\n basePrefix: this.basePrefix,\n prefix,\n fullPrefix,\n pattern: pattern ?? null,\n });\n const [files] = await this.storage.bucket(this.bucketName).getFiles({ prefix: fullPrefix });\n const normalizedBase = this.basePrefix.replace(/^\\/+|\\/+$/g, '');\n const relativeEntries = files\n .map((fileRef) => ({\n fileName: fileRef.name,\n metadata: fileRef.metadata || {},\n }))\n .filter(({ fileName }) => !fileName.endsWith('/'))\n .map(({ fileName, metadata }) => {\n if (!normalizedBase) {\n return {\n path: fileName,\n size: Number(metadata.size || 0),\n updatedAt: (metadata.updated as string | undefined) || null,\n etag: metadata.etag as string | undefined,\n generation: metadata.generation as string | undefined,\n } satisfies StorageFileMetadata;\n }\n const prefixWithSlash = `${normalizedBase}/`;\n if (fileName.startsWith(prefixWithSlash)) {\n return {\n path: fileName.slice(prefixWithSlash.length),\n size: Number(metadata.size || 0),\n updatedAt: (metadata.updated as string | undefined) || null,\n etag: metadata.etag as string | undefined,\n generation: metadata.generation as string | undefined,\n } satisfies StorageFileMetadata;\n }\n return {\n path: fileName,\n size: Number(metadata.size || 0),\n updatedAt: (metadata.updated as string | undefined) || null,\n etag: metadata.etag as string | undefined,\n generation: metadata.generation as string | undefined,\n } satisfies StorageFileMetadata;\n });\n if (!pattern) {\n logger.debug('gcs.list.complete', {\n bucket: this.bucketName,\n fullPrefix,\n matchedCount: relativeEntries.length,\n elapsedMs: Date.now() - startedAt,\n });\n return relativeEntries;\n }\n const filtered = relativeEntries.filter((entry) => entry.path.includes(pattern));\n logger.debug('gcs.list.complete', {\n bucket: this.bucketName,\n fullPrefix,\n pattern,\n matchedCount: filtered.length,\n elapsedMs: Date.now() - startedAt,\n });\n return filtered;\n }\n\n async deleteFile(pathValue: string): Promise<void> {\n const startedAt = Date.now();\n const objectPath = this.objectPath(pathValue);\n logger.debug('gcs.delete.start', {\n bucket: this.bucketName,\n basePrefix: this.basePrefix,\n path: pathValue,\n objectPath,\n });\n await this.storage.bucket(this.bucketName).file(objectPath).delete({ ignoreNotFound: true });\n logger.info('gcs.delete.complete', {\n bucket: this.bucketName,\n objectPath,\n elapsedMs: Date.now() - startedAt,\n });\n }\n\n async exists(pathValue: string): Promise<boolean> {\n const startedAt = Date.now();\n const objectPath = this.objectPath(pathValue);\n logger.debug('gcs.exists.start', {\n bucket: this.bucketName,\n basePrefix: this.basePrefix,\n path: pathValue,\n objectPath,\n });\n const [exists] = await this.storage.bucket(this.bucketName).file(objectPath).exists();\n logger.info('gcs.exists.complete', {\n bucket: this.bucketName,\n objectPath,\n exists,\n elapsedMs: Date.now() - startedAt,\n });\n return exists;\n }\n\n async mkdir(_pathValue: string): Promise<void> {\n // No-op: GCS uses object prefixes instead of directories.\n }\n\n async verifyBucketAccess(): Promise<void> {\n const startedAt = Date.now();\n logger.debug('gcs.verify_bucket_access.start', {\n bucket: this.bucketName,\n basePrefix: this.basePrefix,\n });\n await this.storage.bucket(this.bucketName).getMetadata();\n logger.info('gcs.verify_bucket_access.complete', {\n bucket: this.bucketName,\n elapsedMs: Date.now() - startedAt,\n });\n }\n}\n\nexport function createGcsStorageProvider(uri: string, credentialsFile?: string, projectId?: string): GcsStorageProvider {\n const startedAt = Date.now();\n const { bucket, prefix } = parseGcsUri(uri);\n logger.debug('gcs.provider.create.start', {\n uri,\n bucket,\n prefix,\n hasCredentialsFile: Boolean(credentialsFile),\n hasProjectId: Boolean(projectId),\n });\n const storage = credentialsFile\n ? new Storage({ keyFilename: credentialsFile, projectId })\n : new Storage({ projectId });\n logger.info('gcs.provider.create.complete', {\n bucket,\n prefix,\n hasCredentialsFile: Boolean(credentialsFile),\n hasProjectId: Boolean(projectId),\n elapsedMs: Date.now() - startedAt,\n });\n return new GcsStorageProvider(storage, bucket, prefix);\n}\n","import { mkdir, readdir, readFile, rm, stat, writeFile } from 'node:fs/promises';\nimport { dirname, isAbsolute, join, relative, resolve } from 'node:path';\n\nexport interface StorageFileMetadata {\n path: string;\n size: number;\n updatedAt: string | null;\n etag?: string;\n generation?: string;\n}\n\nexport interface FileStorageProvider {\n readonly name: 'filesystem' | 'gcs';\n readonly cacheKey?: string;\n readFile(path: string): Promise<Buffer>;\n writeFile(path: string, data: Buffer | string): Promise<void>;\n listFiles(prefix: string, pattern?: string): Promise<string[]>;\n listFilesWithMetadata(prefix: string, pattern?: string): Promise<StorageFileMetadata[]>;\n deleteFile(path: string): Promise<void>;\n exists(path: string): Promise<boolean>;\n mkdir(path: string): Promise<void>;\n}\n\nasync function walkFilesRecursive(directory: string): Promise<string[]> {\n const entries = await readdir(directory, { withFileTypes: true });\n const files: string[] = [];\n\n for (const entry of entries) {\n const absolutePath = join(directory, entry.name);\n if (entry.isDirectory()) {\n files.push(...await walkFilesRecursive(absolutePath));\n } else if (entry.isFile()) {\n files.push(absolutePath);\n }\n }\n\n return files;\n}\n\nexport class FilesystemStorageProvider implements FileStorageProvider {\n readonly name = 'filesystem' as const;\n readonly cacheKey: string;\n\n constructor(private readonly baseDirectory: string) {\n this.cacheKey = `fs:${resolve(baseDirectory)}`;\n }\n\n private resolvePath(pathValue: string): string {\n if (isAbsolute(pathValue)) {\n return pathValue;\n }\n return resolve(this.baseDirectory, pathValue);\n }\n\n private toRelativePath(pathValue: string): string {\n return relative(this.baseDirectory, pathValue);\n }\n\n async readFile(pathValue: string): Promise<Buffer> {\n return readFile(this.resolvePath(pathValue));\n }\n\n async writeFile(pathValue: string, data: Buffer | string): Promise<void> {\n const resolvedPath = this.resolvePath(pathValue);\n await mkdir(dirname(resolvedPath), { recursive: true });\n await writeFile(resolvedPath, data);\n }\n\n async listFiles(prefix: string, pattern?: string): Promise<string[]> {\n const withMetadata = await this.listFilesWithMetadata(prefix, pattern);\n return withMetadata.map((entry) => entry.path);\n }\n\n async listFilesWithMetadata(prefix: string, pattern?: string): Promise<StorageFileMetadata[]> {\n const prefixPath = this.resolvePath(prefix || '.');\n let allFiles: string[] = [];\n try {\n allFiles = await walkFilesRecursive(prefixPath);\n } catch (error) {\n const code = (error as NodeJS.ErrnoException).code;\n if (code === 'ENOENT') {\n return [];\n }\n throw error;\n }\n const entries = await Promise.all(\n allFiles.map(async (filePath) => {\n const fileStat = await stat(filePath);\n return {\n path: this.toRelativePath(filePath),\n size: fileStat.size,\n updatedAt: fileStat.mtime ? fileStat.mtime.toISOString() : null,\n } satisfies StorageFileMetadata;\n })\n );\n if (!pattern) {\n return entries;\n }\n return entries.filter((entry) => entry.path.includes(pattern));\n }\n\n async deleteFile(pathValue: string): Promise<void> {\n await rm(this.resolvePath(pathValue), { force: true });\n }\n\n async exists(pathValue: string): Promise<boolean> {\n try {\n await stat(this.resolvePath(pathValue));\n return true;\n } catch {\n return false;\n }\n }\n\n async mkdir(pathValue: string): Promise<void> {\n await mkdir(this.resolvePath(pathValue), { recursive: true });\n }\n}\n","/**\n * MCP Server Configuration\n * \n * Centralized configuration management for the MCP server.\n * Uses workspace roots to discover and load Protokoll configuration.\n * \n * This eliminates the need for each tool to navigate up the directory tree\n * to find configuration. Instead, configuration is loaded once at the\n * workspace level and shared across all tools.\n */\n\nimport * as Context from '@/context';\nimport type { ProtokollContextInstance } from '@/context';\nimport type { McpRoot } from './types';\nimport { fileUriToPath } from './roots';\nimport { resolve } from 'node:path';\nimport { access } from 'node:fs/promises';\nimport * as Cardigantime from '@utilarium/cardigantime';\nimport Logging from '@fjell/logging';\nimport { DEFAULT_STORAGE_CONFIG, type StorageConfig } from './storage/types';\nimport { createGcsStorageProvider } from './storage/gcsProvider';\nimport { FilesystemStorageProvider, type FileStorageProvider } from './storage/fileProviders';\nimport { parseGcsUri } from './storage/gcsUri';\n\nconst DEFAULT_CONFIG_FILE = 'protokoll-config.yaml';\nconst logger = Logging.getLogger('@redaksjon/protokoll-mcp').get('server-config');\nconst cardigantimeLogger = {\n debug: (message: string, ...args: unknown[]) => {\n logger.debug('config.discovery.debug', { message, args });\n },\n info: (message: string, ...args: unknown[]) => {\n logger.info('config.discovery.info', { message, args });\n },\n warn: (message: string, ...args: unknown[]) => {\n logger.warning('config.discovery.warn', { message, args });\n },\n error: (message: string, ...args: unknown[]) => {\n logger.error('config.discovery.error', { message, args });\n },\n verbose: (message: string, ...args: unknown[]) => {\n logger.debug('config.discovery.verbose', { message, args });\n },\n silly: () => {\n // intentionally suppressed\n },\n};\nconst cardigantime = Cardigantime.create({\n defaults: {\n configDirectory: '.',\n configFile: DEFAULT_CONFIG_FILE,\n isRequired: false,\n // Tell CardiganTime to resolve these path fields relative to the config file's directory\n // Note: contextDirectories must be in BOTH pathFields AND resolvePathArray - \n // pathFields determines which fields are processed, resolvePathArray determines\n // if array elements should be resolved individually\n pathResolution: {\n pathFields: ['inputDirectory', 'outputDirectory', 'processedDirectory', 'contextDirectories', 'storage.gcs.credentialsFile'],\n resolvePathArray: ['contextDirectories'],\n },\n },\n configShape: {},\n features: ['config', 'hierarchical'],\n logger: cardigantimeLogger,\n});\n\nasync function readConfigFromDirectory(directory: string): Promise<Record<string, unknown>> {\n const previousCwd = process.cwd();\n try {\n process.chdir(directory);\n const discoveredConfig = await cardigantime.read({});\n return mergeConfigWithEnv(discoveredConfig);\n } finally {\n process.chdir(previousCwd);\n }\n}\n\nfunction parseBooleanEnv(value: string | undefined): boolean | undefined {\n if (!value) return undefined;\n const normalized = value.trim().toLowerCase();\n if (normalized === 'true') return true;\n if (normalized === 'false') return false;\n return undefined;\n}\n\nfunction parseCsvEnv(value: string | undefined): string[] | undefined {\n if (!value) return undefined;\n const parsed = value\n .split(',')\n .map(part => part.trim())\n .filter(Boolean);\n return parsed.length > 0 ? parsed : undefined;\n}\n\nfunction readEnvString(name: string): string | undefined {\n return readString(process.env[name]);\n}\n\nfunction mergeNestedObjects(\n base: Record<string, unknown>,\n overrides: Record<string, unknown>,\n): Record<string, unknown> {\n const merged = { ...base };\n for (const [key, value] of Object.entries(overrides)) {\n if (value === undefined) continue;\n const existing = merged[key];\n if (isObjectRecord(existing) && isObjectRecord(value)) {\n merged[key] = mergeNestedObjects(existing, value);\n continue;\n }\n merged[key] = value;\n }\n return merged;\n}\n\nfunction buildEnvStorageConfig(): Record<string, unknown> | undefined {\n const configuredBackend = readEnvString('PROTOKOLL_STORAGE_BACKEND');\n const gcs = {\n projectId: readEnvString('PROTOKOLL_STORAGE_GCS_PROJECT_ID'),\n inputUri: readEnvString('PROTOKOLL_STORAGE_GCS_INPUT_URI'),\n outputUri: readEnvString('PROTOKOLL_STORAGE_GCS_OUTPUT_URI'),\n contextUri: readEnvString('PROTOKOLL_STORAGE_GCS_CONTEXT_URI'),\n inputBucket: readEnvString('PROTOKOLL_STORAGE_GCS_INPUT_BUCKET'),\n inputPrefix: readEnvString('PROTOKOLL_STORAGE_GCS_INPUT_PREFIX'),\n outputBucket: readEnvString('PROTOKOLL_STORAGE_GCS_OUTPUT_BUCKET'),\n outputPrefix: readEnvString('PROTOKOLL_STORAGE_GCS_OUTPUT_PREFIX'),\n contextBucket: readEnvString('PROTOKOLL_STORAGE_GCS_CONTEXT_BUCKET'),\n contextPrefix: readEnvString('PROTOKOLL_STORAGE_GCS_CONTEXT_PREFIX'),\n credentialsFile: readEnvString('PROTOKOLL_STORAGE_GCS_CREDENTIALS_FILE'),\n };\n const hasGcsValue = Object.values(gcs).some(value => value !== undefined);\n const backend = configuredBackend ?? (hasGcsValue ? 'gcs' : undefined);\n if (!backend) return undefined;\n\n const storage: Record<string, unknown> = {};\n if (backend) storage.backend = backend;\n if (hasGcsValue) storage.gcs = gcs;\n return storage;\n}\n\nfunction mergeConfigWithEnv(config: Record<string, unknown>): Record<string, unknown> {\n const envOverrides: Record<string, unknown> = {\n inputDirectory: readEnvString('PROTOKOLL_INPUT_DIRECTORY'),\n outputDirectory: readEnvString('PROTOKOLL_OUTPUT_DIRECTORY'),\n processedDirectory: readEnvString('PROTOKOLL_PROCESSED_DIRECTORY'),\n contextDirectories: parseCsvEnv(process.env.PROTOKOLL_CONTEXT_DIRECTORIES),\n model: readEnvString('PROTOKOLL_MODEL'),\n classifyModel: readEnvString('PROTOKOLL_CLASSIFY_MODEL'),\n composeModel: readEnvString('PROTOKOLL_COMPOSE_MODEL'),\n transcriptionModel: readEnvString('PROTOKOLL_TRANSCRIPTION_MODEL'),\n debug: parseBooleanEnv(process.env.PROTOKOLL_DEBUG),\n verbose: parseBooleanEnv(process.env.PROTOKOLL_VERBOSE),\n storage: buildEnvStorageConfig(),\n };\n return mergeNestedObjects(config, envOverrides);\n}\n\n// ============================================================================\n// Server Configuration State\n// ============================================================================\n\n/**\n * Server mode:\n * - \"remote\": Server is pre-configured with workspace directories (HTTP server).\n * Tools should NOT accept directory parameters - they're already set.\n * - \"local\": Server runs in local mode (stdio). Tools accept directory parameters\n * and perform their own discovery.\n */\nexport type ServerMode = 'remote' | 'local';\n\ninterface ServerConfig {\n mode: ServerMode;\n context: ProtokollContextInstance | null;\n workspaceRoot: string | null;\n inputDirectory: string | null;\n outputDirectory: string | null;\n processedDirectory: string | null;\n inputStorage: FileStorageProvider | null;\n outputStorage: FileStorageProvider | null;\n storageConfig: StorageConfig;\n configFilePath: string | null;\n configFile: Record<string, unknown> | null;\n initialized: boolean;\n}\n\nlet serverConfig: ServerConfig = {\n mode: 'local',\n context: null,\n workspaceRoot: null,\n inputDirectory: null,\n outputDirectory: null,\n processedDirectory: null,\n inputStorage: null,\n outputStorage: null,\n storageConfig: DEFAULT_STORAGE_CONFIG,\n configFilePath: null,\n configFile: null,\n initialized: false,\n};\n\nfunction isObjectRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null;\n}\n\nfunction readString(value: unknown): string | undefined {\n return typeof value === 'string' && value.trim().length > 0 ? value.trim() : undefined;\n}\n\nfunction buildGcsUri(bucket: string, prefix?: string): string {\n const trimmedBucket = bucket.trim();\n const normalizedPrefix = (prefix ?? '')\n .replace(/^\\/+/, '')\n .replace(/\\/+/g, '/')\n .replace(/\\/+$/, '');\n if (!normalizedPrefix) {\n return `gs://${trimmedBucket}`;\n }\n return `gs://${trimmedBucket}/${normalizedPrefix}`;\n}\n\nfunction resolveGcsUri(rawUri: string | undefined, bucket: string | undefined, prefix: string | undefined): string {\n if (bucket) {\n return buildGcsUri(bucket, prefix);\n }\n return rawUri ?? '';\n}\n\nfunction resolveGcsUris(gcs: NonNullable<StorageConfig['gcs']>): {\n inputUri: string;\n outputUri: string;\n contextUri: string;\n} {\n return {\n inputUri: resolveGcsUri(gcs.inputUri, gcs.inputBucket, gcs.inputPrefix),\n outputUri: resolveGcsUri(gcs.outputUri, gcs.outputBucket, gcs.outputPrefix),\n contextUri: resolveGcsUri(gcs.contextUri, gcs.contextBucket, gcs.contextPrefix),\n };\n}\n\nfunction parseStorageConfig(configFile: Record<string, unknown> | null): StorageConfig {\n if (!configFile) {\n return DEFAULT_STORAGE_CONFIG;\n }\n\n const rawStorage = configFile.storage;\n if (!isObjectRecord(rawStorage)) {\n return DEFAULT_STORAGE_CONFIG;\n }\n\n const backend = rawStorage.backend === 'gcs' ? 'gcs' : 'filesystem';\n if (backend !== 'gcs') {\n return DEFAULT_STORAGE_CONFIG;\n }\n\n const rawGcs = isObjectRecord(rawStorage.gcs) ? rawStorage.gcs : {};\n const projectId = readString(rawGcs.projectId);\n const inputUri = readString(rawGcs.inputUri);\n const outputUri = readString(rawGcs.outputUri);\n const contextUri = readString(rawGcs.contextUri);\n const inputBucket = readString(rawGcs.inputBucket);\n const inputPrefix = readString(rawGcs.inputPrefix);\n const outputBucket = readString(rawGcs.outputBucket);\n const outputPrefix = readString(rawGcs.outputPrefix);\n const contextBucket = readString(rawGcs.contextBucket);\n const contextPrefix = readString(rawGcs.contextPrefix);\n const credentialsFile = readString(rawGcs.credentialsFile);\n\n return {\n backend: 'gcs',\n gcs: {\n projectId,\n inputUri,\n outputUri,\n contextUri,\n inputBucket,\n inputPrefix,\n outputBucket,\n outputPrefix,\n contextBucket,\n contextPrefix,\n credentialsFile,\n },\n };\n}\n\nfunction resolveCredentialsFilePath(\n credentialsFile: string | undefined,\n configDir: string,\n): string | undefined {\n if (!credentialsFile || credentialsFile.trim().length === 0) {\n return undefined;\n }\n return resolve(configDir, credentialsFile);\n}\n\nasync function validateGcsStorageConfig(storageConfig: StorageConfig, configDir: string): Promise<string | undefined> {\n if (storageConfig.backend !== 'gcs') {\n return undefined;\n }\n\n if (!storageConfig.gcs) {\n throw new Error('storage.backend is set to gcs, but storage.gcs is missing.');\n }\n\n const startedAt = Date.now();\n const { inputUri, outputUri, contextUri } = resolveGcsUris(storageConfig.gcs);\n logger.debug('storage.gcs.validate.start', {\n configDir,\n inputUri,\n outputUri,\n contextUri,\n projectId: storageConfig.gcs.projectId ?? null,\n hasCredentialsFile: Boolean(storageConfig.gcs.credentialsFile),\n });\n if (!inputUri || !outputUri || !contextUri) {\n throw new Error(\n 'GCS config is incomplete. Provide either storage.gcs.{inputUri,outputUri,contextUri} or storage.gcs.{inputBucket,inputPrefix,outputBucket,outputPrefix,contextBucket,contextPrefix}.'\n );\n }\n\n parseGcsUri(inputUri);\n parseGcsUri(outputUri);\n parseGcsUri(contextUri);\n\n const credentialsFile = resolveCredentialsFilePath(storageConfig.gcs.credentialsFile, configDir);\n if (credentialsFile) {\n try {\n await access(credentialsFile);\n } catch {\n throw new Error(`GCS credentials file is not readable: ${credentialsFile}`);\n }\n }\n\n logger.info('storage.gcs.validate.complete', {\n inputUri,\n outputUri,\n contextUri,\n projectId: storageConfig.gcs.projectId ?? null,\n credentialsFile: credentialsFile ?? null,\n elapsedMs: Date.now() - startedAt,\n });\n\n return credentialsFile;\n}\n\nasync function createStorageProviders(\n storageConfig: StorageConfig,\n inputDirectory: string,\n outputDirectory: string,\n configDir: string,\n): Promise<{ inputStorage: FileStorageProvider; outputStorage: FileStorageProvider }> {\n if (storageConfig.backend === 'filesystem') {\n return {\n inputStorage: new FilesystemStorageProvider(inputDirectory),\n outputStorage: new FilesystemStorageProvider(outputDirectory),\n };\n }\n\n if (!storageConfig.gcs) {\n throw new Error('storage.backend is set to gcs, but storage.gcs is missing.');\n }\n\n const startedAt = Date.now();\n const { inputUri, outputUri } = resolveGcsUris(storageConfig.gcs);\n logger.debug('storage.providers.gcs.start', {\n inputUri,\n outputUri,\n projectId: storageConfig.gcs.projectId ?? null,\n });\n const credentialsFile = await validateGcsStorageConfig(storageConfig, configDir);\n const inputStorage = createGcsStorageProvider(inputUri, credentialsFile, storageConfig.gcs.projectId);\n const outputStorage = createGcsStorageProvider(outputUri, credentialsFile, storageConfig.gcs.projectId);\n await inputStorage.verifyBucketAccess();\n await outputStorage.verifyBucketAccess();\n logger.info('storage.providers.gcs.complete', {\n inputUri,\n outputUri,\n projectId: storageConfig.gcs.projectId ?? null,\n elapsedMs: Date.now() - startedAt,\n });\n\n return {\n inputStorage,\n outputStorage,\n };\n}\n\n// ============================================================================\n// Initialization\n// ============================================================================\n\n/**\n * Initialize server configuration from workspace roots\n * Should be called once when the server starts or when roots change\n * \n * @param roots - Workspace roots (for remote mode)\n * @param mode - Server mode: 'remote' (pre-configured) or 'local' (dynamic discovery)\n */\nexport async function initializeServerConfig(roots: McpRoot[], mode: ServerMode = 'local'): Promise<void> {\n // Find the first workspace root\n const workspaceRoot = roots.length > 0 ? fileUriToPath(roots[0].uri) : null;\n \n if (!workspaceRoot) {\n // No workspace root available - use cwd as fallback\n serverConfig = {\n mode,\n context: null,\n workspaceRoot: process.cwd(),\n inputDirectory: resolve(process.cwd(), './recordings'),\n outputDirectory: resolve(process.cwd(), './notes'),\n processedDirectory: resolve(process.cwd(), './processed'),\n inputStorage: new FilesystemStorageProvider(resolve(process.cwd(), './recordings')),\n outputStorage: new FilesystemStorageProvider(resolve(process.cwd(), './notes')),\n storageConfig: DEFAULT_STORAGE_CONFIG,\n configFilePath: null,\n configFile: null,\n initialized: true,\n };\n return;\n }\n\n try {\n // CardiganTime resolves path fields (inputDirectory, outputDirectory, etc.)\n // relative to the config file's directory automatically via pathResolution config\n const configFile = await readConfigFromDirectory(workspaceRoot);\n const resolvedConfigDirs = (configFile as any).resolvedConfigDirs as unknown;\n const configFilePath = Array.isArray(resolvedConfigDirs) && resolvedConfigDirs.length > 0\n ? resolve(resolvedConfigDirs[0], DEFAULT_CONFIG_FILE)\n : null;\n \n // For defaults (when no config value), use config directory if available\n const configDir = Array.isArray(resolvedConfigDirs) && resolvedConfigDirs.length > 0\n ? resolvedConfigDirs[0]\n : workspaceRoot;\n\n // contextDirectories are resolved by CardiganTime via resolvePathArray config\n const resolvedContextDirs = configFile.contextDirectories as string[] | undefined;\n const contextCreateOptions: Context.CreateOptions = {\n startingDir: workspaceRoot,\n contextDirectories: resolvedContextDirs,\n };\n\n const storageConfig = parseStorageConfig(configFile as Record<string, unknown>);\n const credentialsFile = await validateGcsStorageConfig(storageConfig, configDir);\n if (storageConfig.backend === 'gcs' && storageConfig.gcs) {\n if (storageConfig.gcs.projectId) {\n process.env.GOOGLE_CLOUD_PROJECT = storageConfig.gcs.projectId;\n }\n const { contextUri } = resolveGcsUris(storageConfig.gcs);\n const parsedContextUri = parseGcsUri(contextUri);\n contextCreateOptions.gcs = {\n bucketName: parsedContextUri.bucket,\n basePath: parsedContextUri.prefix,\n credentialsFile,\n };\n delete contextCreateOptions.contextDirectories;\n }\n\n // Load context from workspace root, using explicit contextDirectories if provided\n const context = await Context.create(contextCreateOptions);\n\n const contextConfig = context.getConfig();\n const mergedConfig = {\n ...contextConfig,\n ...configFile,\n } as Record<string, unknown>;\n const inputDirectory = (mergedConfig.inputDirectory as string) || resolve(configDir, './recordings');\n const outputDirectory = (mergedConfig.outputDirectory as string) || resolve(configDir, './notes');\n const { inputStorage, outputStorage } = await createStorageProviders(storageConfig, inputDirectory, outputDirectory, configDir);\n \n serverConfig = {\n mode,\n context,\n workspaceRoot,\n // CardiganTime already resolved these paths; just provide defaults if not set\n inputDirectory,\n outputDirectory,\n processedDirectory: (mergedConfig.processedDirectory as string) || resolve(configDir, './processed'),\n inputStorage,\n outputStorage,\n storageConfig,\n configFilePath,\n configFile: configFile ?? null,\n initialized: true,\n };\n } catch {\n // Context not available - use defaults relative to workspace\n const configFile = await readConfigFromDirectory(workspaceRoot);\n const resolvedConfigDirs = (configFile as any).resolvedConfigDirs as unknown;\n const configFilePath = Array.isArray(resolvedConfigDirs) && resolvedConfigDirs.length > 0\n ? resolve(resolvedConfigDirs[0], DEFAULT_CONFIG_FILE)\n : null;\n \n // For defaults (when no config value), use config directory if available\n const configDir = Array.isArray(resolvedConfigDirs) && resolvedConfigDirs.length > 0\n ? resolvedConfigDirs[0]\n : workspaceRoot;\n \n const mergedConfig = (configFile ?? {}) as Record<string, unknown>;\n const storageConfig = parseStorageConfig(configFile as Record<string, unknown>);\n const inputDirectory = (mergedConfig.inputDirectory as string) || resolve(configDir, './recordings');\n const outputDirectory = (mergedConfig.outputDirectory as string) || resolve(configDir, './notes');\n const { inputStorage, outputStorage } = await createStorageProviders(storageConfig, inputDirectory, outputDirectory, configDir);\n\n serverConfig = {\n mode,\n context: null,\n workspaceRoot,\n // CardiganTime already resolved these paths; just provide defaults if not set\n inputDirectory,\n outputDirectory,\n processedDirectory: (mergedConfig.processedDirectory as string) || resolve(configDir, './processed'),\n inputStorage,\n outputStorage,\n storageConfig,\n configFilePath,\n configFile: configFile ?? null,\n initialized: true,\n };\n }\n}\n\n/**\n * Reload server configuration (call when roots change)\n */\nexport async function reloadServerConfig(roots: McpRoot[], mode: ServerMode = 'local'): Promise<void> {\n await initializeServerConfig(roots, mode);\n}\n\n/**\n * Clear server configuration\n */\nexport function clearServerConfig(): void {\n serverConfig = {\n mode: 'local',\n context: null,\n workspaceRoot: null,\n inputDirectory: null,\n outputDirectory: null,\n processedDirectory: null,\n inputStorage: null,\n outputStorage: null,\n storageConfig: DEFAULT_STORAGE_CONFIG,\n configFilePath: null,\n configFile: null,\n initialized: false,\n };\n}\n\n// ============================================================================\n// Accessors\n// ============================================================================\n\n/**\n * Get the server configuration\n * Throws if not initialized\n */\nexport function getServerConfig(): {\n mode: ServerMode;\n context: ProtokollContextInstance | null;\n workspaceRoot: string;\n inputDirectory: string;\n outputDirectory: string;\n processedDirectory: string | null;\n storageConfig: StorageConfig;\n configFilePath: string | null;\n configFile: Record<string, unknown> | null;\n initialized: boolean;\n } {\n if (!serverConfig.initialized) {\n throw new Error('Server configuration not initialized. Call initializeServerConfig() first.');\n }\n \n return {\n mode: serverConfig.mode,\n context: serverConfig.context,\n workspaceRoot: serverConfig.workspaceRoot!,\n inputDirectory: serverConfig.inputDirectory!,\n outputDirectory: serverConfig.outputDirectory!,\n processedDirectory: serverConfig.processedDirectory,\n storageConfig: serverConfig.storageConfig,\n configFilePath: serverConfig.configFilePath,\n configFile: serverConfig.configFile,\n initialized: serverConfig.initialized,\n };\n}\n\n/**\n * Get the context instance\n */\nexport function getContext(): ProtokollContextInstance | null {\n return serverConfig.context;\n}\n\n/**\n * Get the workspace root\n */\nexport function getWorkspaceRoot(): string | null {\n return serverConfig.workspaceRoot;\n}\n\n/**\n * Get the input directory (for audio files)\n * Always returns a string, never null\n */\nexport function getInputDirectory(): string {\n if (!serverConfig.initialized || !serverConfig.inputDirectory) {\n return resolve(process.cwd(), './recordings');\n }\n return serverConfig.inputDirectory!;\n}\n\n/**\n * Get the output directory (for transcripts)\n * Always returns a string, never null\n */\nexport function getOutputDirectory(): string {\n if (!serverConfig.initialized || !serverConfig.outputDirectory) {\n return resolve(process.cwd(), './notes');\n }\n return serverConfig.outputDirectory!;\n}\n\n/**\n * Get the processed directory (for processed audio)\n * Returns null if not configured\n */\nexport function getProcessedDirectory(): string | null {\n if (!serverConfig.initialized) {\n return null;\n }\n return serverConfig.processedDirectory;\n}\n\n/**\n * Get the normalized storage config.\n * Defaults to filesystem mode when storage config is not present.\n */\nexport function getStorageConfig(): StorageConfig {\n return serverConfig.storageConfig;\n}\n\n/**\n * Get the input storage provider.\n * Defaults to filesystem storage rooted at ./recordings if uninitialized.\n */\nexport function getInputStorage(): FileStorageProvider {\n if (!serverConfig.initialized || !serverConfig.inputStorage) {\n return new FilesystemStorageProvider(resolve(process.cwd(), './recordings'));\n }\n return serverConfig.inputStorage;\n}\n\n/**\n * Get the output storage provider.\n * Defaults to filesystem storage rooted at ./notes if uninitialized.\n */\nexport function getOutputStorage(): FileStorageProvider {\n if (!serverConfig.initialized || !serverConfig.outputStorage) {\n return new FilesystemStorageProvider(resolve(process.cwd(), './notes'));\n }\n return serverConfig.outputStorage;\n}\n\n/**\n * Check if server configuration is initialized\n */\nexport function isInitialized(): boolean {\n return serverConfig.initialized;\n}\n\n/**\n * Get the server mode\n * Returns 'local' if not initialized\n */\nexport function getServerMode(): ServerMode {\n return serverConfig.mode;\n}\n\n/**\n * Check if server is running in remote mode (pre-configured workspace)\n */\nexport function isRemoteMode(): boolean {\n return serverConfig.mode === 'remote';\n}\n\n","/**\n * Resource Definitions\n * \n * Defines all resource templates and direct resources for the MCP server.\n */\n\nimport type { McpResource, McpResourceTemplate } from '../types';\n\n/**\n * Direct resources that can be listed\n * These are populated dynamically based on context\n */\nexport const directResources: McpResource[] = [\n // Will be populated dynamically based on context\n];\n\n/**\n * Resource templates for parameterized access\n */\nexport const resourceTemplates: McpResourceTemplate[] = [\n {\n uriTemplate: 'protokoll://transcript/{path}',\n name: 'Transcript',\n description: 'A processed transcript file',\n mimeType: 'text/markdown',\n },\n {\n uriTemplate: 'protokoll://entity/{type}/{id}',\n name: 'Context Entity',\n description: 'A context entity (person, project, term, company)',\n mimeType: 'application/yaml',\n },\n {\n uriTemplate: 'protokoll://config',\n name: 'Configuration',\n description: 'Protokoll configuration for a directory',\n mimeType: 'application/json',\n },\n {\n uriTemplate: 'protokoll://transcripts?directory={directory}&projectId={projectId}&limit={limit}&offset={offset}',\n name: 'Transcripts List',\n description: 'List of transcripts in a directory. Filter by projectId (UUID) to show only transcripts for that project.',\n mimeType: 'application/json',\n },\n {\n uriTemplate: 'protokoll://entities/{type}',\n name: 'Entities List',\n description: 'List of entities of a given type',\n mimeType: 'application/json',\n },\n {\n uriTemplate: 'protokoll://audio/inbound?directory={directory}',\n name: 'Inbound Audio Files',\n description: 'List of audio files waiting to be processed',\n mimeType: 'application/json',\n },\n {\n uriTemplate: 'protokoll://audio/processed?directory={directory}',\n name: 'Processed Audio Files',\n description: 'List of audio files that have been processed',\n mimeType: 'application/json',\n },\n];\n","/**\n * Resource Discovery\n * \n * Dynamically discovers available resources based on context.\n */\n\nimport type { McpResource } from '../types';\nimport { \n buildConfigUri, \n buildAudioInboundUri, \n buildAudioProcessedUri,\n buildEntitiesListUri,\n buildTranscriptsListUri,\n} from '../uri';\nimport * as Context from '@/context';\nimport * as ServerConfig from '../serverConfig';\nimport { isAbsolute, resolve } from 'node:path';\n\nfunction isServerConfigInitialized(): boolean {\n try {\n return typeof (ServerConfig as any).isInitialized === 'function' &&\n (ServerConfig as any).isInitialized();\n } catch {\n return false;\n }\n}\n\nfunction getServerContext() {\n try {\n return typeof (ServerConfig as any).getContext === 'function'\n ? (ServerConfig as any).getContext()\n : null;\n } catch {\n return null;\n }\n}\n\nfunction getServerConfigFile(): { contextDirectories?: string[] } | null {\n try {\n return typeof (ServerConfig as any).getServerConfig === 'function'\n ? ((ServerConfig as any).getServerConfig().configFile as { contextDirectories?: string[] } | null)\n : null;\n } catch {\n return null;\n }\n}\n\nfunction getWorkspaceRoot(): string | null {\n try {\n return typeof (ServerConfig as any).getWorkspaceRoot === 'function'\n ? (ServerConfig as any).getWorkspaceRoot()\n : null;\n } catch {\n return null;\n }\n}\n\n/**\n * Get dynamic resources based on current context\n */\nexport async function getDynamicResources(contextDirectory?: string): Promise<McpResource[]> {\n const resources: McpResource[] = [];\n \n try {\n let context;\n const serverConfigReady = isServerConfigInitialized();\n if (serverConfigReady) {\n const serverContext = getServerContext();\n if (serverContext?.hasContext()) {\n context = serverContext;\n } else {\n const configFile = getServerConfigFile();\n const rawDirs = configFile?.contextDirectories;\n const workspaceRoot = getWorkspaceRoot();\n const effectiveDir = contextDirectory || workspaceRoot || process.cwd();\n const contextDirs = rawDirs && rawDirs.length > 0\n ? rawDirs.map(d => (isAbsolute(d) ? d : resolve(effectiveDir, d)))\n : undefined;\n context = await Context.create({\n startingDir: effectiveDir,\n contextDirectories: contextDirs,\n });\n }\n } else {\n context = await Context.create({\n startingDir: contextDirectory || process.cwd(),\n });\n }\n\n if (!context.hasContext()) {\n return resources;\n }\n\n const config = context.getConfig();\n const dirs = context.getDiscoveredDirs();\n const configPath = dirs[0]?.path;\n\n // Add config resource\n if (configPath) {\n resources.push({\n uri: buildConfigUri(configPath),\n name: 'Current Configuration',\n description: `Protokoll configuration at ${configPath}`,\n mimeType: 'application/json',\n });\n }\n\n // Add inbound audio resource\n const inputDirectory = (config.inputDirectory as string) || './recordings';\n resources.push({\n uri: buildAudioInboundUri(inputDirectory),\n name: 'Inbound Audio Files',\n description: `Audio files waiting to be processed in ${inputDirectory}`,\n mimeType: 'application/json',\n });\n\n // Add processed audio resource\n const processedDirectory = (config.processedDirectory as string);\n if (processedDirectory) {\n resources.push({\n uri: buildAudioProcessedUri(processedDirectory),\n name: 'Processed Audio Files',\n description: `Audio files that have been processed in ${processedDirectory}`,\n mimeType: 'application/json',\n });\n }\n\n // Add entity list resources\n const entityCounts = {\n projects: context.getAllProjects().length,\n people: context.getAllPeople().length,\n terms: context.getAllTerms().length,\n companies: context.getAllCompanies().length,\n };\n\n if (entityCounts.projects > 0) {\n resources.push({\n uri: buildEntitiesListUri('project'),\n name: 'All Projects',\n description: `${entityCounts.projects} project(s) in context`,\n mimeType: 'application/json',\n });\n }\n\n if (entityCounts.people > 0) {\n resources.push({\n uri: buildEntitiesListUri('person'),\n name: 'All People',\n description: `${entityCounts.people} person/people in context`,\n mimeType: 'application/json',\n });\n }\n\n if (entityCounts.terms > 0) {\n resources.push({\n uri: buildEntitiesListUri('term'),\n name: 'All Terms',\n description: `${entityCounts.terms} term(s) in context`,\n mimeType: 'application/json',\n });\n }\n\n if (entityCounts.companies > 0) {\n resources.push({\n uri: buildEntitiesListUri('company'),\n name: 'All Companies',\n description: `${entityCounts.companies} company/companies in context`,\n mimeType: 'application/json',\n });\n }\n\n // Add output directory transcript list\n const outputDirectory = (config.outputDirectory as string) || '~/notes';\n resources.push({\n uri: buildTranscriptsListUri({ directory: outputDirectory, limit: 10 }),\n name: 'Recent Transcripts',\n description: `10 most recent transcripts in ${outputDirectory}`,\n mimeType: 'application/json',\n });\n\n } catch {\n // Context not available, return empty\n }\n\n return resources;\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; ","import Logging from '@fjell/logging';\nimport * as yaml from 'js-yaml';\nimport { createGcsStorageProvider } from '../storage/gcsProvider';\nimport type { StorageFileMetadata } from '../storage/fileProviders';\nimport * as ServerConfig from '../serverConfig';\n\nconst logger = Logging.getLogger('@redaksjon/protokoll-mcp').get('entity-index');\nconst INDEX_SCHEMA_VERSION = 1;\nconst INDEX_PATH = '.protokoll/entities-index-v1.json';\n\nexport type IndexedEntityType = 'person' | 'project' | 'term' | 'company' | 'ignored';\n\nconst ENTITY_DIRECTORY: Record<IndexedEntityType, string> = {\n person: 'people',\n project: 'projects',\n term: 'terms',\n company: 'companies',\n ignored: 'ignored',\n};\n\ninterface ContextGcsConfig {\n uri: string;\n projectId?: string;\n credentialsFile?: string;\n}\n\ninterface EntityIndexEntry {\n entityType: IndexedEntityType;\n path: string;\n id: string;\n name: string;\n slug?: string;\n payload: Record<string, unknown>;\n sourceGeneration?: string;\n sourceUpdatedAt: string | null;\n sourceSize: number;\n sourceEtag?: string;\n hydratedAt: string;\n}\n\ninterface PersistedEntityIndex {\n version: number;\n builtAt: string;\n byType: Record<IndexedEntityType, Record<string, EntityIndexEntry>>;\n}\n\nfunction normalizePath(pathValue: string): string {\n return pathValue.replace(/^\\/+/, '').replace(/\\\\/g, '/');\n}\n\nfunction metadataVersionKey(metadata: StorageFileMetadata): string {\n return [\n metadata.generation || '',\n metadata.updatedAt || '',\n String(metadata.size || 0),\n metadata.etag || '',\n ].join('|');\n}\n\nfunction isYamlPath(pathValue: string): boolean {\n const normalized = normalizePath(pathValue).toLowerCase();\n return normalized.endsWith('.yaml') || normalized.endsWith('.yml');\n}\n\nasync function listFilesWithMetadataCompat(\n provider: { listFiles: (prefix: string, pattern?: string) => Promise<string[]>; listFilesWithMetadata?: (prefix: string, pattern?: string) => Promise<StorageFileMetadata[]>; },\n prefix: string,\n pattern?: string,\n): Promise<StorageFileMetadata[]> {\n if (typeof provider.listFilesWithMetadata === 'function') {\n return provider.listFilesWithMetadata(prefix, pattern);\n }\n const listed = await provider.listFiles(prefix, pattern);\n return listed.map((pathValue) => ({\n path: pathValue,\n size: 1,\n updatedAt: null,\n }));\n}\n\nfunction getContextGcsConfig(): ContextGcsConfig | null {\n let storageConfig: ReturnType<typeof ServerConfig.getStorageConfig>;\n try {\n storageConfig = ServerConfig.getStorageConfig();\n } catch {\n return null;\n }\n if (storageConfig.backend !== 'gcs' || !storageConfig.gcs) {\n return null;\n }\n\n const gcs = storageConfig.gcs;\n const contextUri = gcs.contextUri\n || (gcs.contextBucket\n ? `gs://${gcs.contextBucket}/${(gcs.contextPrefix || '').replace(/^\\/+|\\/+$/g, '')}`\n : undefined);\n if (!contextUri) {\n return null;\n }\n return {\n uri: contextUri,\n projectId: gcs.projectId,\n credentialsFile: gcs.credentialsFile,\n };\n}\n\nclass EntityIndexService {\n private readonly byType = new Map<IndexedEntityType, Map<string, EntityIndexEntry>>();\n private readonly dirtyTypes = new Set<IndexedEntityType>();\n private sidecarLoaded = false;\n private persistInFlight = false;\n private persistRequested = false;\n private lastRefreshAtByType = new Map<IndexedEntityType, number>();\n private readonly refreshTtlMs = 5_000;\n\n constructor(private readonly contextGcs: ContextGcsConfig) {\n this.byType.set('person', new Map());\n this.byType.set('project', new Map());\n this.byType.set('term', new Map());\n this.byType.set('company', new Map());\n this.byType.set('ignored', new Map());\n }\n\n markDirty(entityType?: IndexedEntityType): void {\n if (entityType) {\n this.dirtyTypes.add(entityType);\n return;\n }\n this.dirtyTypes.add('person');\n this.dirtyTypes.add('project');\n this.dirtyTypes.add('term');\n this.dirtyTypes.add('company');\n this.dirtyTypes.add('ignored');\n }\n\n async list(entityType: IndexedEntityType): Promise<Array<Record<string, unknown>>> {\n await this.refreshTypeIfNeeded(entityType);\n const entries = this.byType.get(entityType) || new Map();\n return Array.from(entries.values()).map((entry) => entry.payload);\n }\n\n async find(entityType: IndexedEntityType, entityId: string): Promise<Record<string, unknown> | null> {\n await this.refreshTypeIfNeeded(entityType);\n const normalized = entityId.trim().toLowerCase();\n const prefix = normalized.match(/^([a-f0-9]{8})/)?.[1];\n const entries = this.byType.get(entityType) || new Map();\n\n for (const entry of entries.values()) {\n const idLower = entry.id.toLowerCase();\n const slugLower = (entry.slug || '').toLowerCase();\n if (idLower === normalized || slugLower === normalized) {\n return entry.payload;\n }\n if (normalized && (idLower.startsWith(normalized) || normalized.startsWith(idLower))) {\n return entry.payload;\n }\n if (prefix && idLower.startsWith(prefix)) {\n return entry.payload;\n }\n }\n return null;\n }\n\n private async refreshTypeIfNeeded(entityType: IndexedEntityType): Promise<void> {\n if (!this.sidecarLoaded) {\n await this.loadSidecar();\n }\n\n const now = Date.now();\n const needsRefresh = this.dirtyTypes.has(entityType)\n || (this.byType.get(entityType)?.size || 0) === 0\n || now - (this.lastRefreshAtByType.get(entityType) || 0) > this.refreshTtlMs;\n if (!needsRefresh) {\n return;\n }\n\n const startedAt = Date.now();\n const provider = createGcsStorageProvider(\n this.contextGcs.uri,\n this.contextGcs.credentialsFile,\n this.contextGcs.projectId,\n );\n const directory = ENTITY_DIRECTORY[entityType];\n const listed = await listFilesWithMetadataCompat(provider as any, `${directory}/`);\n const yamlEntries = listed\n .map((metadata) => ({ ...metadata, path: normalizePath(metadata.path) }))\n .filter((metadata) => isYamlPath(metadata.path));\n const byPath = new Map(yamlEntries.map((metadata) => [metadata.path, metadata]));\n const existing = this.byType.get(entityType) || new Map<string, EntityIndexEntry>();\n let changedCount = 0;\n let cacheHitCount = 0;\n let removedCount = 0;\n let hydrateSuccess = 0;\n let hydrateFailed = 0;\n\n for (const [pathValue] of existing.entries()) {\n if (!byPath.has(pathValue)) {\n existing.delete(pathValue);\n removedCount++;\n }\n }\n\n for (const metadata of yamlEntries) {\n const cached = existing.get(metadata.path);\n const sameVersion = cached\n ? [\n cached.sourceGeneration || '',\n cached.sourceUpdatedAt || '',\n String(cached.sourceSize || 0),\n cached.sourceEtag || '',\n ].join('|') === metadataVersionKey(metadata)\n : false;\n\n if (sameVersion && !this.dirtyTypes.has(entityType)) {\n cacheHitCount++;\n continue;\n }\n\n changedCount++;\n try {\n const raw = await provider.readFile(metadata.path);\n const parsed = yaml.load(raw.toString('utf8'));\n if (!parsed || typeof parsed !== 'object') {\n hydrateFailed++;\n continue;\n }\n const payload = parsed as Record<string, unknown>;\n const id = typeof payload.id === 'string' ? payload.id : '';\n const name = typeof payload.name === 'string' ? payload.name : '';\n if (!id || !name) {\n hydrateFailed++;\n continue;\n }\n const slug = typeof payload.slug === 'string' ? payload.slug : undefined;\n existing.set(metadata.path, {\n entityType,\n path: metadata.path,\n id,\n name,\n slug,\n payload,\n sourceGeneration: metadata.generation,\n sourceUpdatedAt: metadata.updatedAt || null,\n sourceSize: Number(metadata.size || 0),\n sourceEtag: metadata.etag,\n hydratedAt: new Date().toISOString(),\n });\n hydrateSuccess++;\n } catch (error) {\n hydrateFailed++;\n logger.warning('entities.index.hydrate.failed', {\n entityType,\n path: metadata.path,\n error: error instanceof Error ? error.message : String(error),\n });\n }\n }\n\n this.byType.set(entityType, existing);\n this.lastRefreshAtByType.set(entityType, Date.now());\n this.dirtyTypes.delete(entityType);\n this.schedulePersist();\n\n logger.info('entities.index.refresh.complete', {\n entityType,\n listed: listed.length,\n yamlCandidates: yamlEntries.length,\n cacheHitCount,\n changedCount,\n removedCount,\n hydrateSuccess,\n hydrateFailed,\n indexedEntries: existing.size,\n elapsedMs: Date.now() - startedAt,\n });\n }\n\n private async loadSidecar(): Promise<void> {\n this.sidecarLoaded = true;\n try {\n const provider = createGcsStorageProvider(\n this.contextGcs.uri,\n this.contextGcs.credentialsFile,\n this.contextGcs.projectId,\n );\n if (!(await provider.exists(INDEX_PATH))) {\n return;\n }\n const raw = await provider.readFile(INDEX_PATH);\n const parsed = JSON.parse(raw.toString('utf8')) as Partial<PersistedEntityIndex>;\n if (parsed.version !== INDEX_SCHEMA_VERSION || !parsed.byType || typeof parsed.byType !== 'object') {\n logger.warning('entities.index.sidecar.invalid_schema', {\n indexPath: INDEX_PATH,\n version: parsed.version ?? null,\n });\n return;\n }\n for (const type of Object.keys(ENTITY_DIRECTORY) as IndexedEntityType[]) {\n const forType = parsed.byType[type];\n if (!forType || typeof forType !== 'object') {\n continue;\n }\n const map = this.byType.get(type) || new Map<string, EntityIndexEntry>();\n for (const [pathValue, entry] of Object.entries(forType)) {\n if (!entry || typeof entry !== 'object') {\n continue;\n }\n map.set(pathValue, {\n ...entry,\n entityType: type,\n path: normalizePath(entry.path || pathValue),\n id: String(entry.id || ''),\n name: String(entry.name || ''),\n payload: (entry.payload || {}) as Record<string, unknown>,\n sourceUpdatedAt: entry.sourceUpdatedAt || null,\n sourceSize: Number(entry.sourceSize || 0),\n hydratedAt: entry.hydratedAt || new Date(0).toISOString(),\n });\n }\n this.byType.set(type, map);\n }\n logger.info('entities.index.sidecar.loaded', {\n indexPath: INDEX_PATH,\n person: this.byType.get('person')?.size || 0,\n project: this.byType.get('project')?.size || 0,\n term: this.byType.get('term')?.size || 0,\n company: this.byType.get('company')?.size || 0,\n ignored: this.byType.get('ignored')?.size || 0,\n });\n } catch (error) {\n logger.warning('entities.index.sidecar.load_failed', {\n indexPath: INDEX_PATH,\n error: error instanceof Error ? error.message : String(error),\n });\n }\n }\n\n private schedulePersist(): void {\n this.persistRequested = true;\n if (this.persistInFlight) {\n return;\n }\n void this.persistLoop();\n }\n\n private async persistLoop(): Promise<void> {\n this.persistInFlight = true;\n try {\n while (this.persistRequested) {\n this.persistRequested = false;\n const provider = createGcsStorageProvider(\n this.contextGcs.uri,\n this.contextGcs.credentialsFile,\n this.contextGcs.projectId,\n );\n const payload: PersistedEntityIndex = {\n version: INDEX_SCHEMA_VERSION,\n builtAt: new Date().toISOString(),\n byType: {\n person: Object.fromEntries(this.byType.get('person')?.entries() || []),\n project: Object.fromEntries(this.byType.get('project')?.entries() || []),\n term: Object.fromEntries(this.byType.get('term')?.entries() || []),\n company: Object.fromEntries(this.byType.get('company')?.entries() || []),\n ignored: Object.fromEntries(this.byType.get('ignored')?.entries() || []),\n },\n };\n try {\n await provider.writeFile(INDEX_PATH, JSON.stringify(payload));\n } catch (error) {\n logger.warning('entities.index.sidecar.save_failed', {\n indexPath: INDEX_PATH,\n error: error instanceof Error ? error.message : String(error),\n });\n }\n }\n } finally {\n this.persistInFlight = false;\n }\n }\n}\n\nconst servicesByKey = new Map<string, EntityIndexService>();\n\nfunction getOrCreateService(contextGcs: ContextGcsConfig): EntityIndexService {\n const key = `${contextGcs.uri}|${contextGcs.projectId || ''}|${contextGcs.credentialsFile || ''}`;\n const existing = servicesByKey.get(key);\n if (existing) {\n return existing;\n }\n const created = new EntityIndexService(contextGcs);\n servicesByKey.set(key, created);\n return created;\n}\n\nexport async function listContextEntitiesFromGcs(entityType: IndexedEntityType): Promise<Array<Record<string, unknown>>> {\n const contextGcs = getContextGcsConfig();\n if (!contextGcs) {\n return [];\n }\n const service = getOrCreateService(contextGcs);\n return service.list(entityType);\n}\n\nexport async function findContextEntityInGcs(\n entityType: IndexedEntityType,\n entityId: string,\n): Promise<Record<string, unknown> | null> {\n const contextGcs = getContextGcsConfig();\n if (!contextGcs) {\n return null;\n }\n const service = getOrCreateService(contextGcs);\n return service.find(entityType, entityId);\n}\n\nexport function markContextEntityIndexDirty(entityType?: IndexedEntityType): void {\n const contextGcs = getContextGcsConfig();\n if (!contextGcs) {\n return;\n }\n const service = getOrCreateService(contextGcs);\n service.markDirty(entityType);\n}\n"," \n/**\n * Shared types, constants, and utilities for MCP tools\n */\nimport { stat, readdir } from 'node:fs/promises';\nimport { resolve, relative, isAbsolute, join } from 'node:path';\nimport { Media, Util as Storage, Transcript } from '@redaksjon/protokoll-engine';\nimport { getLogger } from '@/logging';\n\n// Import transcript utilities\nconst transcriptExists = Transcript.transcriptExists;\nconst ensurePklExtension = Transcript.ensurePklExtension;\n\n/**\n * Check if input looks like a UUID (8+ hex chars)\n * Inlined to avoid import issues\n */\nfunction isUuidInput(input: string): boolean {\n const normalized = input.trim();\n if (\n normalized.includes('/') ||\n normalized.includes('\\\\') ||\n normalized.includes('.') ||\n normalized.startsWith('protokoll://')\n ) {\n return false;\n }\n // Full UUID or UUID-style hex prefix without path separators.\n return /^[a-f0-9]{8,}$/i.test(normalized);\n}\n\n/**\n * Find transcript by UUID\n * Delegates to protokoll-engine\n */\nasync function findTranscriptByUuid(uuid: string, searchDirectories: string[]): Promise<string | null> {\n return Transcript.findTranscriptByUuid(uuid, searchDirectories);\n}\nimport * as Context from '@/context';\nimport type { ProtokollContextInstance } from '@/context';\nimport type { Person, Project, Term, Company, IgnoredTerm, Entity } from '@/context/types';\nimport { parseUri, isProtokolUri } from '../uri';\nimport { parseGcsUri } from '../storage/gcsUri';\nimport { listContextEntitiesFromGcs } from '../resources/entityIndexService';\n\n// ============================================================================\n// Shared Utilities\n// ============================================================================\n\nexport const logger = getLogger();\nexport const media = Media.create(logger);\nexport const storage = Storage.create({ log: logger.debug.bind(logger) });\n\n// ============================================================================\n// Types\n// ============================================================================\n\nexport interface ProcessingResult {\n outputPath: string;\n enhancedText: string;\n rawTranscript: string;\n routedProject?: string;\n routingConfidence: number;\n processingTime: number;\n toolsUsed: string[];\n correctionsApplied: number;\n}\n\nexport interface DiscoveredConfig {\n path: string;\n projectCount: number;\n peopleCount: number;\n termsCount: number;\n companiesCount: number;\n outputDirectory?: string;\n model?: string;\n}\n\nexport interface ProjectSuggestion {\n projectId: string;\n projectName: string;\n confidence: number;\n reason: string;\n destination?: string;\n}\n\n// ============================================================================\n// Helper Functions\n// ============================================================================\n\n/**\n * Helper for async file existence check\n */\nexport async function fileExists(path: string): Promise<boolean> {\n try {\n await stat(path);\n return true;\n } catch {\n return false;\n }\n}\n\n/**\n * Get a configured directory from server configuration\n * Uses workspace-level configuration instead of navigating up the directory tree\n */\nexport async function getConfiguredDirectory(\n key: 'inputDirectory' | 'outputDirectory' | 'processedDirectory',\n _contextDirectory?: string // Kept for backward compatibility but not used\n): Promise<string> {\n // Import here to avoid circular dependencies\n const ServerConfig = await import('../serverConfig');\n \n switch (key) {\n case 'inputDirectory':\n return ServerConfig.getInputDirectory();\n case 'outputDirectory':\n return ServerConfig.getOutputDirectory();\n case 'processedDirectory':\n return ServerConfig.getProcessedDirectory() || resolve(process.cwd(), './processed');\n }\n}\n\n/**\n * Get context directories from server configuration\n * Returns the contextDirectories array from protokoll-config.yaml if available\n */\nexport async function getContextDirectories(): Promise<string[] | undefined> {\n // Import here to avoid circular dependencies\n const ServerConfig = await import('../serverConfig');\n \n const config = ServerConfig.getServerConfig();\n return config.configFile?.contextDirectories as string[] | undefined;\n}\n\n/**\n * Create a context instance for tool handlers.\n * Uses contextDirectories from server config (protokoll-config.yaml) when available,\n * matching the behavior of entity resource handlers.\n * Falls back to standard .protokoll discovery from the given directory.\n */\nexport async function createToolContext(contextDirectory?: string): Promise<ProtokollContextInstance> {\n const resolveByIdentifier = <T extends { id: string; slug?: string; name: string }>(\n entities: T[],\n identifier: string | null | undefined,\n ): T | undefined => {\n const normalized = typeof identifier === 'string' ? identifier.trim().toLowerCase() : '';\n if (!normalized) return undefined;\n const uuidPrefix = normalized.match(/^([a-f0-9]{8})/)?.[1];\n for (const entity of entities) {\n const idLower = entity.id.toLowerCase();\n const slugLower = entity.slug?.toLowerCase();\n const nameSlug = entity.name\n .toLowerCase()\n .trim()\n .replace(/[^a-z0-9]+/g, '-')\n .replace(/-+/g, '-')\n .replace(/^-|-$/g, '');\n if (idLower === normalized || slugLower === normalized || nameSlug === normalized) {\n return entity;\n }\n if (idLower.startsWith(normalized) || normalized.startsWith(idLower)) {\n return entity;\n }\n if (uuidPrefix && idLower.startsWith(uuidPrefix)) {\n return entity;\n }\n }\n return undefined;\n };\n\n const buildGcsFallbackContext = async (\n baseContext?: ProtokollContextInstance,\n ): Promise<ProtokollContextInstance> => {\n const people = (await listContextEntitiesFromGcs('person')) as Person[];\n const projects = (await listContextEntitiesFromGcs('project')) as Project[];\n const terms = (await listContextEntitiesFromGcs('term')) as Term[];\n const companies = (await listContextEntitiesFromGcs('company')) as Company[];\n const ignored = (await listContextEntitiesFromGcs('ignored')) as IgnoredTerm[];\n\n logger.info('tool.context.gcs_entity_index_fallback.loaded', {\n projectCount: projects.length,\n peopleCount: people.length,\n termCount: terms.length,\n companyCount: companies.length,\n ignoredCount: ignored.length,\n });\n\n const searchAcross = [...people, ...projects, ...terms, ...companies, ...ignored] as Entity[];\n const contextDirs = baseContext?.getContextDirs?.() || ['gcs://context'];\n\n const fallbackContext = {\n load: async () => {\n if (baseContext?.load) {\n await baseContext.load();\n }\n },\n reload: async () => {\n if (baseContext?.reload) {\n await baseContext.reload();\n }\n },\n getDiscoveredDirs: () => [],\n getConfig: () => (baseContext?.getConfig?.() || {}),\n getContextDirs: () => contextDirs,\n getPerson: (id: string) => resolveByIdentifier(people, id),\n getProject: (id: string) => resolveByIdentifier(projects, id),\n getCompany: (id: string) => resolveByIdentifier(companies, id),\n getTerm: (id: string) => resolveByIdentifier(terms, id),\n getIgnored: (id: string) => resolveByIdentifier(ignored, id),\n getAllPeople: () => people,\n getAllProjects: () => projects,\n getAllCompanies: () => companies,\n getAllTerms: () => terms,\n getAllIgnored: () => ignored,\n isIgnored: (term: string) => {\n const normalized = term.toLowerCase().trim();\n return ignored.some((entry) =>\n entry.name.toLowerCase() === normalized || entry.id.toLowerCase() === normalized\n );\n },\n search: (query: string) => {\n const q = query.toLowerCase().trim();\n if (!q) return [];\n return searchAcross.filter((entity: any) => {\n const byName = typeof entity.name === 'string' && entity.name.toLowerCase().includes(q);\n const bySoundsLike = Array.isArray(entity.sounds_like)\n && entity.sounds_like.some((s: string) => typeof s === 'string' && s.toLowerCase().includes(q));\n return byName || bySoundsLike;\n });\n },\n findBySoundsLike: (phonetic: string) => {\n const key = phonetic.toLowerCase().trim();\n if (!key) return undefined;\n return searchAcross.find((entity: any) => Array.isArray(entity.sounds_like)\n && entity.sounds_like.some((s: string) => typeof s === 'string' && s.toLowerCase() === key));\n },\n searchWithContext: (query: string) => {\n const q = query.toLowerCase().trim();\n if (!q) return [];\n return searchAcross.filter((entity) => entity.name.toLowerCase().includes(q));\n },\n getRelatedProjects: () => [],\n saveEntity: async (entity: Entity, allowUpdate?: boolean) => {\n if (!baseContext?.saveEntity) {\n throw new Error('GCS fallback context cannot persist entities');\n }\n return baseContext.saveEntity(entity, allowUpdate);\n },\n deleteEntity: async (entity: Entity) => {\n if (!baseContext?.deleteEntity) {\n return false;\n }\n return baseContext.deleteEntity(entity);\n },\n getEntityFilePath: (entity: Entity) => baseContext?.getEntityFilePath?.(entity),\n hasContext: () => searchAcross.length > 0,\n getSmartAssistanceConfig: () => ({\n enabled: false,\n phoneticModel: '',\n analysisModel: '',\n soundsLikeOnAdd: false,\n triggerPhrasesOnAdd: false,\n promptForSource: false,\n termsEnabled: false,\n termSoundsLikeOnAdd: false,\n termDescriptionOnAdd: false,\n termTopicsOnAdd: false,\n termProjectSuggestions: false,\n timeout: 0,\n }),\n };\n\n return fallbackContext as unknown as ProtokollContextInstance;\n };\n\n const ServerConfig = await import('../serverConfig');\n const serverContext = ServerConfig.getContext();\n const storageConfig = ServerConfig.getStorageConfig();\n if (serverContext?.hasContext()) {\n const projectCount = serverContext.getAllProjects().length;\n const peopleCount = serverContext.getAllPeople().length;\n const termCount = serverContext.getAllTerms().length;\n const companyCount = serverContext.getAllCompanies().length;\n const totalEntities = projectCount + peopleCount + termCount + companyCount;\n\n if (storageConfig.backend === 'gcs') {\n // In some remote/GCS runs the preloaded server context can be partially\n // hydrated (for example only a handful of people). Cross-check against\n // the indexed GCS view and prefer it when the cached context is clearly\n // incomplete so sounds_like replacement remains comprehensive.\n try {\n const [indexedPeople, indexedProjects, indexedTerms, indexedCompanies] = await Promise.all([\n listContextEntitiesFromGcs('person') as Promise<Person[]>,\n listContextEntitiesFromGcs('project') as Promise<Project[]>,\n listContextEntitiesFromGcs('term') as Promise<Term[]>,\n listContextEntitiesFromGcs('company') as Promise<Company[]>,\n ]);\n const indexedTotal = indexedPeople.length\n + indexedProjects.length\n + indexedTerms.length\n + indexedCompanies.length;\n if (indexedTotal > totalEntities) {\n logger.warn('tool.context.server_context_partial_using_entity_index_fallback', {\n serverProjectCount: projectCount,\n serverPeopleCount: peopleCount,\n serverTermCount: termCount,\n serverCompanyCount: companyCount,\n indexedProjectCount: indexedProjects.length,\n indexedPeopleCount: indexedPeople.length,\n indexedTermCount: indexedTerms.length,\n indexedCompanyCount: indexedCompanies.length,\n serverContextDirs: serverContext.getContextDirs(),\n });\n return buildGcsFallbackContext(serverContext);\n }\n } catch (error) {\n logger.warn('tool.context.server_context_index_crosscheck_failed', {\n error: error instanceof Error ? error.message : String(error),\n serverProjectCount: projectCount,\n serverPeopleCount: peopleCount,\n serverTermCount: termCount,\n serverCompanyCount: companyCount,\n });\n }\n }\n\n // For filesystem (or fully hydrated GCS) keep the preloaded server context.\n if (totalEntities > 0 || storageConfig.backend !== 'gcs') {\n return serverContext;\n }\n\n logger.warn('tool.context.empty_server_context_reloading', {\n backend: storageConfig.backend,\n projectCount,\n peopleCount,\n termCount,\n companyCount,\n contextDirs: serverContext.getContextDirs(),\n });\n }\n\n const configFile = ServerConfig.isInitialized()\n ? ServerConfig.getServerConfig().configFile as { contextDirectories?: string[] } | null\n : null;\n const rawDirs = configFile?.contextDirectories;\n const effectiveDir = contextDirectory\n || (ServerConfig.isInitialized() ? ServerConfig.getWorkspaceRoot() : null)\n || process.cwd();\n const contextDirs = rawDirs && rawDirs.length > 0\n ? rawDirs.map((d: string) => (isAbsolute(d) ? d : resolve(effectiveDir, d)))\n : undefined;\n\n if (storageConfig.backend === 'gcs' && storageConfig.gcs) {\n const contextUri = storageConfig.gcs.contextUri\n || (storageConfig.gcs.contextBucket\n ? `gs://${storageConfig.gcs.contextBucket}/${(storageConfig.gcs.contextPrefix || '').replace(/^\\/+|\\/+$/g, '')}`\n : undefined);\n if (!contextUri) {\n throw new Error('GCS storage is enabled but context URI/bucket configuration is missing.');\n }\n const parsedContextUri = parseGcsUri(contextUri);\n const gcsContext = await Context.create({\n startingDir: effectiveDir,\n gcs: {\n bucketName: parsedContextUri.bucket,\n basePath: parsedContextUri.prefix,\n projectId: storageConfig.gcs.projectId,\n credentialsFile: storageConfig.gcs.credentialsFile,\n },\n });\n\n const gcsEntityCount = gcsContext.getAllProjects().length\n + gcsContext.getAllPeople().length\n + gcsContext.getAllTerms().length\n + gcsContext.getAllCompanies().length;\n if (gcsEntityCount > 0) {\n return gcsContext;\n }\n\n logger.warn('tool.context.gcs_context_empty_using_entity_index_fallback', {\n bucket: parsedContextUri.bucket,\n prefix: parsedContextUri.prefix,\n });\n return buildGcsFallbackContext(gcsContext);\n }\n\n return Context.create({\n startingDir: effectiveDir,\n contextDirectories: contextDirs,\n });\n}\n\n/**\n * Validate that contextDirectory parameter is not provided in remote mode\n * In remote mode, the server is pre-configured with workspace directories\n * and tools should not accept directory parameters.\n * \n * @param contextDirectory - The contextDirectory parameter from tool args\n * @throws Error if contextDirectory is provided in remote mode\n */\nexport async function validateNotRemoteMode(contextDirectory?: string): Promise<void> {\n if (!contextDirectory) {\n return; // No directory parameter provided, OK\n }\n \n // Import here to avoid circular dependencies\n const ServerConfig = await import('../serverConfig');\n \n if (ServerConfig.isRemoteMode()) {\n throw new Error(\n 'Directory parameters are not accepted in remote mode. ' +\n 'This server is pre-configured with workspace directories from protokoll-config.yaml. ' +\n 'Use the protokoll_info tool to check server configuration.'\n );\n }\n}\n\n/**\n * Validate that a resolved path stays within a base directory\n * This prevents path traversal attacks using ../ sequences\n * \n * @param resolvedPath - The resolved absolute path to validate\n * @param baseDirectory - The base directory that paths must stay within\n * @throws Error if the path escapes the base directory\n */\nexport function validatePathWithinDirectory(\n resolvedPath: string,\n baseDirectory: string\n): void {\n // Normalize both paths to handle any ../ sequences\n const normalizedTarget = resolve(resolvedPath);\n const normalizedBase = resolve(baseDirectory);\n \n // Ensure base directory ends with separator for proper prefix matching\n const basePath = normalizedBase.endsWith('/') ? normalizedBase : normalizedBase + '/';\n \n // Check if the target path is within the base directory\n // Must either be exactly the base dir, or start with base dir + separator\n if (normalizedTarget !== normalizedBase && !normalizedTarget.startsWith(basePath)) {\n throw new Error(\n `Security error: Path \"${resolvedPath}\" is outside the allowed directory \"${baseDirectory}\". ` +\n `Path traversal is not allowed.`\n );\n }\n}\n\n/**\n * Async version of validatePathWithinDirectory that gets the output directory from config\n * \n * @param resolvedPath - The resolved absolute path to validate\n * @param contextDirectory - Optional context directory for config lookup\n * @throws Error if the path escapes the output directory\n */\nexport async function validatePathWithinOutputDirectory(\n resolvedPath: string,\n contextDirectory?: string\n): Promise<void> {\n const outputDirectory = await getConfiguredDirectory('outputDirectory', contextDirectory);\n validatePathWithinDirectory(resolvedPath, outputDirectory);\n}\n\n/**\n * Convert an absolute file path to a relative path (relative to output directory)\n * This ensures no absolute paths are exposed to HTTP MCP clients\n * \n * @param absolutePath - The absolute file path to convert\n * @param baseDirectory - The base directory to make relative to (default: output directory)\n * @returns Relative path, or the original path if it's already relative\n */\nexport async function sanitizePath(\n absolutePath: string,\n baseDirectory?: string\n): Promise<string> {\n // Guard against undefined/null/empty values\n if (!absolutePath || typeof absolutePath !== 'string') {\n // Return empty string for invalid paths to prevent errors downstream\n return absolutePath || '';\n }\n \n // If it's already a relative path (doesn't start with /), return as-is\n if (!absolutePath.startsWith('/') && !absolutePath.match(/^[A-Za-z]:/)) {\n return absolutePath;\n }\n \n // Get the base directory (output directory by default)\n const base = baseDirectory || await getConfiguredDirectory('outputDirectory');\n \n // Convert to relative path\n try {\n const relativePath = relative(base, absolutePath);\n // If relative() returns an absolute path (when paths are on different drives on Windows),\n // return just the filename as a fallback\n if (relativePath.startsWith('/') || relativePath.match(/^[A-Za-z]:/)) {\n // Extract just the filename\n const parts = absolutePath.split(/[/\\\\]/);\n return parts[parts.length - 1] || absolutePath;\n }\n return relativePath;\n } catch {\n // If conversion fails, return just the filename\n const parts = absolutePath.split(/[/\\\\]/);\n return parts[parts.length - 1] || absolutePath;\n }\n}\n\n/**\n * Slugify text for IDs and filenames\n */\nexport function slugify(text: string): string {\n return text\n .toLowerCase()\n .replace(/[^a-z0-9]+/g, '-')\n .replace(/--+/g, '-')\n .replace(/^-|-$/g, '');\n}\n\n/**\n * Get audio file metadata (creation time and hash)\n */\nexport async function getAudioMetadata(audioFile: string): Promise<{ creationTime: Date; hash: string }> {\n // Get creation time from audio file\n let creationTime = await media.getAudioCreationTime(audioFile);\n if (!creationTime) {\n creationTime = new Date();\n }\n\n // Calculate hash of the file\n const hash = (await storage.hashFile(audioFile, 100)).substring(0, 8);\n\n return { creationTime, hash };\n}\n\n/**\n * Format entity for response\n */\nexport function formatEntity(entity: Entity): Record<string, unknown> {\n const result: Record<string, unknown> = {\n id: entity.id,\n name: entity.name,\n type: entity.type,\n };\n\n if (entity.type === 'person') {\n const person = entity as Person;\n if (person.firstName) result.firstName = person.firstName;\n if (person.lastName) result.lastName = person.lastName;\n if (person.company) result.company = person.company;\n if (person.role) result.role = person.role;\n if (person.sounds_like) result.sounds_like = person.sounds_like;\n if (person.context) result.context = person.context;\n } else if (entity.type === 'project') {\n const project = entity as Project;\n if (project.description) result.description = project.description;\n if (project.classification) result.classification = project.classification;\n if (project.routing) result.routing = project.routing;\n if (project.sounds_like) result.sounds_like = project.sounds_like;\n result.active = project.active !== false;\n } else if (entity.type === 'term') {\n const term = entity as Term;\n if (term.expansion) result.expansion = term.expansion;\n if (term.domain) result.domain = term.domain;\n if (term.description) result.description = term.description;\n if (term.sounds_like) result.sounds_like = term.sounds_like;\n if (term.topics) result.topics = term.topics;\n if (term.projects) result.projects = term.projects;\n } else if (entity.type === 'company') {\n const company = entity as Company;\n if (company.fullName) result.fullName = company.fullName;\n if (company.industry) result.industry = company.industry;\n if (company.sounds_like) result.sounds_like = company.sounds_like;\n } else if (entity.type === 'ignored') {\n const ignored = entity as IgnoredTerm;\n if (ignored.reason) result.reason = ignored.reason;\n if (ignored.ignoredAt) result.ignoredAt = ignored.ignoredAt;\n }\n\n return result;\n}\n\n/**\n * Helper to merge arrays: handles replace, add, and remove operations\n */\nexport function mergeArray(\n existing: string[] | undefined,\n replace: string[] | undefined,\n add: string[] | undefined,\n remove: string[] | undefined\n): string[] | undefined {\n // If replace is provided, use it as the base\n if (replace !== undefined) {\n let result = [...replace];\n if (add) {\n result = [...result, ...add.filter(v => !result.includes(v))];\n }\n if (remove) {\n result = result.filter(v => !remove.includes(v));\n }\n return result.length > 0 ? result : undefined;\n }\n\n // Otherwise work with existing\n let result = existing ? [...existing] : [];\n if (add) {\n result = [...result, ...add.filter(v => !result.includes(v))];\n }\n if (remove) {\n result = result.filter(v => !remove.includes(v));\n }\n\n // Return undefined if empty (to remove the field from YAML)\n return result.length > 0 ? result : (existing ? undefined : existing);\n}\n\n/**\n * Resolve a transcript URI, path, or UUID to an absolute file path\n * \n * Accepts:\n * - UUID or UUID prefix: \"a1b2c3d4\" or \"a1b2c3d4-5e6f-7890-abcd-ef1234567890\"\n * - Protokoll URI: protokoll://transcript/2026/2/12-1606-meeting (preferred)\n * - Relative path: 2026/2/12-1606-meeting or 2026/2/12-1606-meeting.pkl\n * - Absolute path: /full/path/to/transcript.pkl (must be within output directory)\n * \n * Returns absolute path for internal file operations\n */\nexport async function resolveTranscriptPath(\n uriOrPathOrUuid: string,\n contextDirectory?: string\n): Promise<string> {\n if (!uriOrPathOrUuid || typeof uriOrPathOrUuid !== 'string') {\n throw new Error('Transcript reference is required and must be a non-empty string');\n }\n \n const outputDirectory = await getConfiguredDirectory('outputDirectory', contextDirectory);\n const ServerConfig = await import('../serverConfig');\n const outputStorage = ServerConfig.getOutputStorage();\n if (outputStorage.name === 'gcs') {\n throw new Error(\n 'resolveTranscriptPath does not support GCS-backed transcripts. ' +\n 'Use storage-aware transcript resolution in the tool handler.'\n );\n }\n \n // Check if input is a UUID\n if (isUuidInput(uriOrPathOrUuid)) {\n const foundPath = await findTranscriptByUuid(uriOrPathOrUuid, [outputDirectory]);\n if (!foundPath) {\n throw new Error(`Transcript not found for UUID: ${uriOrPathOrUuid}`);\n }\n return foundPath;\n }\n \n let relativePath: string;\n \n // Check if input is a Protokoll URI\n if (isProtokolUri(uriOrPathOrUuid)) {\n const sanitizedUri = uriOrPathOrUuid.split('#')[0].split('?')[0];\n const parsed = parseUri(sanitizedUri);\n if (parsed.resourceType !== 'transcript') {\n throw new Error(`Invalid URI: expected transcript URI, got ${parsed.resourceType}`);\n }\n // Extract the transcript path from the URI (without extension)\n // Type assertion is safe because we checked resourceType === 'transcript'\n relativePath = String((parsed as any).transcriptPath || '').replace(/^(\\.\\.\\/)+/, '');\n } else {\n // Handle as a file path (relative or absolute)\n if (isAbsolute(uriOrPathOrUuid)) {\n const normalizedAbsolute = resolve(uriOrPathOrUuid);\n const normalizedOutputDir = resolve(outputDirectory);\n \n if (normalizedAbsolute.startsWith(normalizedOutputDir + '/') || normalizedAbsolute === normalizedOutputDir) {\n // Convert absolute path to relative\n relativePath = normalizedAbsolute.substring(normalizedOutputDir.length + 1);\n } else {\n throw new Error(`Path must be within output directory: ${outputDirectory}`);\n }\n } else {\n // Relative path - normalize it\n relativePath = uriOrPathOrUuid.replace(/^[/\\\\]+/, '').replace(/\\\\/g, '/');\n }\n }\n \n // Remove .pkl extension if present (we'll add it back)\n relativePath = relativePath.replace(/\\.pkl$/i, '');\n \n // Resolve to absolute path\n const resolvedPath = resolve(outputDirectory, relativePath);\n validatePathWithinDirectory(resolvedPath, outputDirectory);\n \n // Ensure .pkl extension and check if file exists\n const pklPath = ensurePklExtension(resolvedPath);\n const existsResult = await transcriptExists(pklPath);\n if (!existsResult.exists || !existsResult.path) {\n // Fallback for slug-only references (e.g. \"meeting-with-bret-nuussen-ssp\"):\n // search recursively under outputDirectory for a matching filename.\n if (!relativePath.includes('/')) {\n const candidateFilename = ensurePklExtension(relativePath).split('/').pop() || ensurePklExtension(relativePath);\n const matches: string[] = [];\n\n const walk = async (dir: string): Promise<void> => {\n const entries = await readdir(dir, { withFileTypes: true });\n for (const entry of entries) {\n const entryPath = join(dir, entry.name);\n if (entry.isDirectory()) {\n await walk(entryPath);\n continue;\n }\n if (entry.isFile() && entry.name === candidateFilename) {\n matches.push(entryPath);\n }\n }\n };\n\n await walk(outputDirectory);\n\n if (matches.length === 1) {\n return matches[0];\n }\n if (matches.length > 1) {\n throw new Error(\n `Ambiguous transcript reference \"${uriOrPathOrUuid}\": ${matches.length} matches found. ` +\n 'Use full transcript URI or relative path with date folders.'\n );\n }\n }\n\n throw new Error(`Transcript not found: ${uriOrPathOrUuid}`);\n }\n \n return existsResult.path;\n}\n","import { basename } from 'node:path';\nimport { tmpdir } from 'node:os';\nimport * as fs from 'node:fs/promises';\nimport Logging from '@fjell/logging';\nimport { PklTranscript } from '@redaksjon/protokoll-format';\nimport { Transcript } from '@redaksjon/protokoll-engine';\nimport type { FileStorageProvider, StorageFileMetadata } from '../storage/fileProviders';\n\nconst logger = Logging.getLogger('@redaksjon/protokoll-mcp').get('transcript-index');\nconst INDEX_SCHEMA_VERSION = 1;\nconst DEFAULT_INDEX_PATH = '.protokoll/transcripts-index-v1.json';\nconst { readTranscriptContent } = Transcript;\n\ntype TranscriptListEntry = {\n path: string;\n filename: string;\n date: string;\n time?: string;\n title: string;\n status?: string;\n openTasksCount: number;\n contentSize: number;\n entities: unknown;\n hasRawTranscript: boolean;\n};\n\ninterface TranscriptIndexEntry {\n path: string;\n filename: string;\n date: string;\n time?: string;\n title: string;\n status?: string;\n openTasksCount: number;\n contentSize: number;\n entities: unknown;\n hasRawTranscript: boolean;\n projectId?: string;\n project?: string;\n sourceSize: number;\n sourceUpdatedAt: string | null;\n sourceGeneration?: string;\n sourceEtag?: string;\n hydratedAt: string;\n}\n\ninterface PersistedTranscriptIndex {\n version: number;\n builtAt: string;\n entries: Record<string, TranscriptIndexEntry>;\n}\n\ninterface TranscriptHydrationFailure {\n version: string;\n reason: string;\n}\n\nfunction normalizePath(pathValue: string): string {\n return pathValue.replace(/^\\/+/, '').replace(/\\\\/g, '/');\n}\n\nfunction normalizeDateOnly(value: string | undefined): string | undefined {\n if (!value) {\n return undefined;\n }\n const trimmed = value.trim();\n if (!trimmed) {\n return undefined;\n }\n return trimmed.includes('T') ? trimmed.slice(0, 10) : trimmed;\n}\n\nfunction asOptionalString(value: unknown): string | undefined {\n return typeof value === 'string' ? value : undefined;\n}\n\nfunction passesDateFilter(date: string | undefined, startDate?: string, endDate?: string): boolean {\n const normalized = normalizeDateOnly(date);\n if (!normalized) {\n return !startDate && !endDate;\n }\n if (startDate && normalized < startDate) {\n return false;\n }\n if (endDate && normalized > endDate) {\n return false;\n }\n return true;\n}\n\nfunction metadataVersionKey(metadata: StorageFileMetadata): string {\n // Keep this key stable across provider/client variations.\n // `updatedAt + size` is consistently available for both GCS and filesystem providers.\n const stableUpdatedAt = metadata.updatedAt || '';\n const stableSize = String(Number(metadata.size || 0));\n return [\n stableUpdatedAt,\n stableSize,\n ].join('|');\n}\n\nfunction entryVersionKey(entry: TranscriptIndexEntry): string {\n return [\n entry.sourceUpdatedAt || '',\n String(Number(entry.sourceSize || 0)),\n ].join('|');\n}\n\nasync function listFilesWithMetadataCompat(\n outputStorage: FileStorageProvider,\n prefix: string,\n pattern?: string,\n): Promise<StorageFileMetadata[]> {\n const withMetadata = (outputStorage as {\n listFilesWithMetadata?: (prefix: string, pattern?: string) => Promise<StorageFileMetadata[]>;\n }).listFilesWithMetadata;\n if (typeof withMetadata === 'function') {\n return withMetadata.call(outputStorage, prefix, pattern);\n }\n const listFiles = (outputStorage as {\n listFiles?: (prefix: string, pattern?: string) => Promise<string[]>;\n }).listFiles;\n if (typeof listFiles !== 'function') {\n return [];\n }\n const listed = await listFiles.call(outputStorage, prefix, pattern);\n return listed.map((pathValue) => ({\n path: pathValue,\n size: 1,\n updatedAt: null,\n }));\n}\n\nasync function withTempPklFile<T>(contents: Buffer, action: (tempPath: string) => Promise<T>): Promise<T> {\n const tempPath = `${tmpdir()}/protokoll-mcp-index-${Date.now()}-${Math.random().toString(36).slice(2)}.pkl`;\n await fs.writeFile(tempPath, contents);\n try {\n return await action(tempPath);\n } finally {\n await fs.rm(tempPath, { force: true });\n }\n}\n\nfunction isTranscriptCandidate(pathValue: string): boolean {\n const normalized = normalizePath(pathValue).toLowerCase();\n return normalized.endsWith('.pkl')\n && !normalized.startsWith('uploads/')\n && !normalized.startsWith('.intermediate/')\n && !normalized.includes('/uploads/')\n && !normalized.includes('/.intermediate/');\n}\n\nexport interface TranscriptIndexListOptions {\n startDate?: string;\n endDate?: string;\n projectId?: string;\n projectName?: string;\n limit: number;\n offset: number;\n}\n\nexport interface TranscriptIndexListResponse {\n transcripts: TranscriptListEntry[];\n total: number;\n hasMore: boolean;\n limit: number;\n offset: number;\n}\n\nclass TranscriptIndexService {\n private readonly entries = new Map<string, TranscriptIndexEntry>();\n private readonly dirtyPaths = new Set<string>();\n private loadedFromSidecar = false;\n private forceRebuild = false;\n private persistInFlight = false;\n private persistRequested = false;\n private refreshInFlight: Promise<void> | null = null;\n private lastRefreshAt = 0;\n private readonly hydrationFailures = new Map<string, TranscriptHydrationFailure>();\n\n constructor(\n private readonly outputStorage: FileStorageProvider,\n private readonly outputDirectory: string,\n private readonly indexPath: string = DEFAULT_INDEX_PATH,\n private readonly refreshTtlMs: number = 5_000,\n private readonly maxCachedEntries: number = 50_000,\n private readonly sidecarEnabled: boolean = true,\n ) {}\n\n markDirty(pathValue: string): void {\n const normalized = normalizePath(pathValue);\n if (!normalized) {\n return;\n }\n this.dirtyPaths.add(normalized);\n if (normalized.endsWith('.pkl')) {\n this.dirtyPaths.add(normalized.slice(0, -4));\n } else {\n this.dirtyPaths.add(`${normalized}.pkl`);\n }\n }\n\n invalidateAll(): void {\n this.forceRebuild = true;\n this.dirtyPaths.clear();\n }\n\n async listTranscripts(options: TranscriptIndexListOptions): Promise<TranscriptIndexListResponse> {\n const startedAt = Date.now();\n await this.refreshIndexIfNeeded();\n\n const { startDate, endDate, projectId, projectName, limit, offset } = options;\n const filtered = Array.from(this.entries.values())\n .filter((entry) => {\n if (projectId) {\n const projectMatches = entry.projectId === projectId\n || (projectName ? entry.project === projectName : entry.project === projectId);\n if (!projectMatches) {\n return false;\n }\n }\n return passesDateFilter(entry.date, startDate, endDate);\n })\n .sort((a, b) => {\n const dateCompare = (b.date || '').localeCompare(a.date || '');\n if (dateCompare !== 0) {\n return dateCompare;\n }\n const timeCompare = (b.time || '').localeCompare(a.time || '');\n if (timeCompare !== 0) {\n return timeCompare;\n }\n return b.filename.localeCompare(a.filename);\n });\n\n const page = filtered.slice(offset, offset + limit).map((entry) => ({\n path: entry.path,\n filename: entry.filename,\n date: entry.date || '1970-01-01',\n time: entry.time,\n title: entry.title,\n status: entry.status,\n openTasksCount: entry.openTasksCount,\n contentSize: entry.contentSize,\n entities: entry.entities,\n hasRawTranscript: entry.hasRawTranscript,\n }));\n\n logger.info('transcripts.index.list.complete', {\n totalIndexed: this.entries.size,\n totalAfterFilters: filtered.length,\n returned: page.length,\n hasMore: offset + limit < filtered.length,\n elapsedMs: Date.now() - startedAt,\n });\n\n return {\n transcripts: page,\n total: filtered.length,\n hasMore: offset + limit < filtered.length,\n limit,\n offset,\n };\n }\n\n private async refreshIndexIfNeeded(): Promise<void> {\n if (!this.loadedFromSidecar) {\n await this.loadSidecar();\n }\n\n const now = Date.now();\n const needsRefresh = this.forceRebuild\n || this.dirtyPaths.size > 0\n || this.entries.size === 0\n || now - this.lastRefreshAt > this.refreshTtlMs;\n if (!needsRefresh) {\n logger.debug('transcripts.index.refresh.skipped', {\n reason: 'ttl_cache_hit',\n cachedEntries: this.entries.size,\n dirtyPaths: this.dirtyPaths.size,\n });\n return;\n }\n\n await this.refreshIndexOnce();\n this.lastRefreshAt = Date.now();\n }\n\n private async refreshIndexOnce(): Promise<void> {\n if (this.refreshInFlight) {\n await this.refreshInFlight;\n return;\n }\n this.refreshInFlight = this.refreshIndex().finally(() => {\n this.refreshInFlight = null;\n });\n await this.refreshInFlight;\n }\n\n private async refreshIndex(): Promise<void> {\n const refreshStartedAt = Date.now();\n const listed = await listFilesWithMetadataCompat(this.outputStorage, '');\n const candidates = listed\n .map((metadata) => ({ ...metadata, path: normalizePath(metadata.path) }))\n .filter((metadata) => isTranscriptCandidate(metadata.path));\n\n const byPath = new Map(candidates.map((metadata) => [metadata.path, metadata]));\n const dirtyAtStart = new Set(this.dirtyPaths);\n\n let cacheHits = 0;\n let changedCount = 0;\n let hydrateSuccess = 0;\n let hydrateFailed = 0;\n let removedCount = 0;\n\n if (this.forceRebuild) {\n changedCount = candidates.length;\n this.entries.clear();\n } else {\n for (const metadata of candidates) {\n const cached = this.entries.get(metadata.path);\n const dirty = dirtyAtStart.has(metadata.path);\n if (!cached || dirty) {\n changedCount++;\n continue;\n }\n const cachedVersion = entryVersionKey(cached);\n if (cachedVersion === metadataVersionKey(metadata)) {\n cacheHits++;\n } else {\n changedCount++;\n }\n }\n }\n\n for (const [pathValue, cached] of this.entries.entries()) {\n if (!byPath.has(pathValue)) {\n this.entries.delete(pathValue);\n this.hydrationFailures.delete(pathValue);\n removedCount++;\n } else if (cached && this.forceRebuild) {\n this.entries.delete(pathValue);\n }\n }\n\n for (const metadata of candidates) {\n const dirty = dirtyAtStart.has(metadata.path);\n const cached = this.entries.get(metadata.path);\n const sameVersion = cached\n ? entryVersionKey(cached) === metadataVersionKey(metadata)\n : false;\n if (!this.forceRebuild && !dirty && sameVersion) {\n continue;\n }\n\n const metadataVersion = metadataVersionKey(metadata);\n const previousFailure = this.hydrationFailures.get(metadata.path);\n if (!this.forceRebuild && !dirty && previousFailure && previousFailure.version === metadataVersion) {\n hydrateFailed++;\n continue;\n }\n\n const hydrated = await this.hydrateEntry(metadata);\n if (!hydrated) {\n hydrateFailed++;\n continue;\n }\n hydrateSuccess++;\n this.hydrationFailures.delete(metadata.path);\n this.entries.set(metadata.path, hydrated);\n }\n\n if (this.entries.size > this.maxCachedEntries) {\n const overflow = this.entries.size - this.maxCachedEntries;\n const sorted = Array.from(this.entries.values())\n .sort((a, b) => (a.hydratedAt || '').localeCompare(b.hydratedAt || ''))\n .slice(0, overflow);\n for (const entry of sorted) {\n this.entries.delete(entry.path);\n }\n logger.warning('transcripts.index.cache.evicted', {\n overflow,\n maxCachedEntries: this.maxCachedEntries,\n totalAfterEvict: this.entries.size,\n });\n }\n\n this.forceRebuild = false;\n this.dirtyPaths.clear();\n this.schedulePersist();\n\n logger.info('transcripts.index.refresh.complete', {\n outputDirectory: this.outputDirectory,\n listedObjects: listed.length,\n transcriptCandidates: candidates.length,\n cacheHits,\n changedCount,\n hydrateSuccess,\n hydrateFailed,\n removedCount,\n indexedEntries: this.entries.size,\n elapsedMs: Date.now() - refreshStartedAt,\n });\n }\n\n private async hydrateEntry(metadata: StorageFileMetadata): Promise<TranscriptIndexEntry | null> {\n const version = metadataVersionKey(metadata);\n if (Number(metadata.size || 0) <= 0) {\n this.hydrationFailures.set(metadata.path, {\n version,\n reason: 'empty_file',\n });\n logger.info('transcripts.index.hydrate.skipped', {\n path: metadata.path,\n reason: 'empty_file',\n });\n return null;\n }\n\n try {\n const buffer = await this.outputStorage.readFile(metadata.path);\n return await withTempPklFile(buffer, async (tempPath) => {\n const { content, metadata: transcriptMetadata, title } = await readTranscriptContent(tempPath);\n const pklTranscript = PklTranscript.open(tempPath, { readOnly: true });\n let hasRawTranscript = false;\n try {\n hasRawTranscript = Boolean(pklTranscript.hasRawTranscript);\n } finally {\n pklTranscript.close();\n }\n\n const date = normalizeDateOnly(asOptionalString(transcriptMetadata.date));\n const tasks = Array.isArray(transcriptMetadata.tasks) ? transcriptMetadata.tasks : [];\n const openTasksCount = tasks.filter((task: unknown) => {\n if (!task || typeof task !== 'object') {\n return true;\n }\n return (task as { status?: unknown }).status !== 'completed';\n }).length;\n\n return {\n path: metadata.path,\n filename: basename(metadata.path),\n date: date || '1970-01-01',\n time: asOptionalString(transcriptMetadata.time),\n title: title || metadata.path.replace(/\\.pkl$/i, '').split('/').pop() || 'Untitled',\n status: asOptionalString(transcriptMetadata.status),\n openTasksCount,\n contentSize: content.length,\n entities: transcriptMetadata.entities,\n hasRawTranscript,\n projectId: asOptionalString(transcriptMetadata.projectId),\n project: asOptionalString(transcriptMetadata.project),\n sourceSize: Number(metadata.size || 0),\n sourceUpdatedAt: metadata.updatedAt || null,\n sourceGeneration: metadata.generation,\n sourceEtag: metadata.etag,\n hydratedAt: new Date().toISOString(),\n } satisfies TranscriptIndexEntry;\n });\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n const isLegacyMetadataError = message.includes('no such table: metadata');\n this.hydrationFailures.set(metadata.path, {\n version,\n reason: isLegacyMetadataError ? 'legacy_missing_metadata_table' : message,\n });\n\n const logMethod = isLegacyMetadataError ? logger.info.bind(logger) : logger.warning.bind(logger);\n logMethod('transcripts.index.hydrate.failed', {\n path: metadata.path,\n error: message,\n classification: isLegacyMetadataError ? 'legacy_unsupported_transcript' : 'hydrate_error',\n });\n return null;\n }\n }\n\n async findPathsByFilename(targetFilenames: Set<string>): Promise<string[]> {\n await this.refreshIndexIfNeeded();\n const matches: string[] = [];\n for (const [entryPath, entry] of this.entries) {\n const entryFilename = entry.filename || entryPath.split('/').pop() || '';\n if (targetFilenames.has(entryFilename)) {\n matches.push(entryPath);\n }\n }\n return matches;\n }\n\n private async loadSidecar(): Promise<void> {\n this.loadedFromSidecar = true;\n if (!this.sidecarEnabled) {\n return;\n }\n try {\n if (!(await this.outputStorage.exists(this.indexPath))) {\n return;\n }\n const raw = await this.outputStorage.readFile(this.indexPath);\n const parsed = JSON.parse(raw.toString('utf8')) as Partial<PersistedTranscriptIndex>;\n if (parsed.version !== INDEX_SCHEMA_VERSION || !parsed.entries || typeof parsed.entries !== 'object') {\n logger.warning('transcripts.index.sidecar.invalid_schema', {\n indexPath: this.indexPath,\n version: parsed.version ?? null,\n });\n return;\n }\n for (const [pathValue, entry] of Object.entries(parsed.entries)) {\n if (entry && typeof entry === 'object' && isTranscriptCandidate(pathValue)) {\n this.entries.set(pathValue, {\n ...entry,\n path: normalizePath(entry.path || pathValue),\n filename: entry.filename || basename(pathValue),\n date: entry.date || '1970-01-01',\n openTasksCount: Number(entry.openTasksCount || 0),\n contentSize: Number(entry.contentSize || 0),\n sourceSize: Number(entry.sourceSize || 0),\n sourceUpdatedAt: entry.sourceUpdatedAt || null,\n hydratedAt: entry.hydratedAt || new Date(0).toISOString(),\n });\n }\n }\n logger.info('transcripts.index.sidecar.loaded', {\n indexPath: this.indexPath,\n loadedEntries: this.entries.size,\n });\n } catch (error) {\n logger.warning('transcripts.index.sidecar.load_failed', {\n indexPath: this.indexPath,\n error: error instanceof Error ? error.message : String(error),\n });\n }\n }\n\n private schedulePersist(): void {\n if (!this.sidecarEnabled) {\n return;\n }\n this.persistRequested = true;\n if (this.persistInFlight) {\n return;\n }\n void this.persistLoop();\n }\n\n private async persistLoop(): Promise<void> {\n this.persistInFlight = true;\n try {\n while (this.persistRequested) {\n this.persistRequested = false;\n const payload: PersistedTranscriptIndex = {\n version: INDEX_SCHEMA_VERSION,\n builtAt: new Date().toISOString(),\n entries: Object.fromEntries(this.entries.entries()),\n };\n try {\n await this.outputStorage.writeFile(this.indexPath, JSON.stringify(payload));\n logger.debug('transcripts.index.sidecar.saved', {\n indexPath: this.indexPath,\n entryCount: this.entries.size,\n });\n } catch (error) {\n logger.warning('transcripts.index.sidecar.save_failed', {\n indexPath: this.indexPath,\n error: error instanceof Error ? error.message : String(error),\n });\n }\n }\n } finally {\n this.persistInFlight = false;\n }\n }\n}\n\nconst serviceInstances = new Map<string, TranscriptIndexService>();\nconst serviceInstancesByProvider = new WeakMap<FileStorageProvider, TranscriptIndexService>();\n\nfunction getServiceForStorage(outputStorage: FileStorageProvider, outputDirectory: string): TranscriptIndexService {\n if (outputStorage.cacheKey) {\n const existing = serviceInstances.get(outputStorage.cacheKey);\n if (existing) {\n return existing;\n }\n const created = new TranscriptIndexService(outputStorage, outputDirectory, DEFAULT_INDEX_PATH, 5_000, 50_000, true);\n serviceInstances.set(outputStorage.cacheKey, created);\n return created;\n }\n\n const existingForProvider = serviceInstancesByProvider.get(outputStorage);\n if (existingForProvider) {\n return existingForProvider;\n }\n\n const created = new TranscriptIndexService(outputStorage, outputDirectory, DEFAULT_INDEX_PATH, 5_000, 50_000, false);\n serviceInstancesByProvider.set(outputStorage, created);\n return created;\n}\n\nexport async function listTranscriptsViaIndex(args: {\n outputStorage: FileStorageProvider;\n outputDirectory: string;\n startDate?: string;\n endDate?: string;\n projectId?: string;\n projectName?: string;\n limit: number;\n offset: number;\n}): Promise<TranscriptIndexListResponse> {\n const service = getServiceForStorage(args.outputStorage, args.outputDirectory);\n return service.listTranscripts({\n startDate: args.startDate,\n endDate: args.endDate,\n projectId: args.projectId,\n projectName: args.projectName,\n limit: args.limit,\n offset: args.offset,\n });\n}\n\nexport function markTranscriptIndexDirtyForStorage(\n outputStorage: FileStorageProvider | null | undefined,\n outputDirectory: string,\n pathValue: string,\n): void {\n if (!outputStorage) {\n return;\n }\n const service = getServiceForStorage(outputStorage, outputDirectory);\n service.markDirty(pathValue);\n}\n\nexport function invalidateTranscriptIndexForStorage(\n outputStorage: FileStorageProvider | null | undefined,\n outputDirectory: string,\n): void {\n if (!outputStorage) {\n return;\n }\n const service = getServiceForStorage(outputStorage, outputDirectory);\n service.invalidateAll();\n}\n\nexport async function resolveTranscriptPathByFilename(\n outputStorage: FileStorageProvider,\n outputDirectory: string,\n targetFilenames: Set<string>,\n): Promise<string[]> {\n const service = getServiceForStorage(outputStorage, outputDirectory);\n const indexedMatches = await service.findPathsByFilename(targetFilenames);\n if (indexedMatches.length > 0) {\n return indexedMatches;\n }\n\n const listed = await listFilesWithMetadataCompat(outputStorage, '', '.pkl');\n return listed\n .map((entry) => normalizePath(entry.path))\n .filter((entryPath) => targetFilenames.has(entryPath.split('/').pop() || ''));\n}\n","/**\n * Transcript Resources\n * \n * Handles reading individual transcripts and listing transcripts.\n */\n\nimport type { McpResourceContents } from '../types';\nimport { buildTranscriptUri, buildTranscriptsListUri } from '../uri';\nimport { resolve, relative, basename } from 'node:path';\nimport { tmpdir } from 'node:os';\nimport * as fs from 'node:fs/promises';\nimport Logging from '@fjell/logging';\nimport { Transcript } from '@redaksjon/protokoll-engine';\nimport { PklTranscript } from '@redaksjon/protokoll-format';\nimport * as ServerConfig from '../serverConfig';\nimport { sanitizePath } from '../tools/shared';\nimport type { FileStorageProvider } from '../storage/fileProviders';\nimport { listTranscriptsViaIndex } from './transcriptIndexService';\n\nconst { resolveTranscriptPath, readTranscriptContent, stripTranscriptExtension } = Transcript;\nconst { listTranscripts } = Transcript;\nconst logger = Logging.getLogger('@redaksjon/protokoll-mcp').get('transcript-resources');\n\nfunction parseStoredSummaries(raw: string): Array<{\n id: string;\n title: string;\n audience: string;\n guidance: string;\n stylePreset: string;\n styleLabel: string;\n content: string;\n generatedAt: string;\n}> {\n try {\n const parsed = JSON.parse(raw) as unknown;\n if (!Array.isArray(parsed)) {\n return [];\n }\n return parsed\n .map((item) => {\n if (!item || typeof item !== 'object') {\n return null;\n }\n const record = item as Record<string, unknown>;\n const id = String(record.id || '').trim();\n const content = String(record.content || '').trim();\n if (!id || !content) {\n return null;\n }\n return {\n id,\n title: String(record.title || '').trim(),\n audience: String(record.audience || '').trim(),\n guidance: String(record.guidance || '').trim(),\n stylePreset: String(record.stylePreset || 'detailed').trim() || 'detailed',\n styleLabel: String(record.styleLabel || 'Detailed summary').trim() || 'Detailed summary',\n content,\n generatedAt: String(record.generatedAt || '').trim() || new Date().toISOString(),\n };\n })\n .filter((summary): summary is {\n id: string;\n title: string;\n audience: string;\n guidance: string;\n stylePreset: string;\n styleLabel: string;\n content: string;\n generatedAt: string;\n } => summary !== null)\n .sort((a, b) => b.generatedAt.localeCompare(a.generatedAt));\n } catch {\n return [];\n }\n}\n\n/**\n * Read a single transcript resource\n * \n * transcriptPath can be:\n * - A path without extension (e.g., \"2026/1/29-2027-meeting\") - will resolve to .pkl\n * - A path with extension (e.g., \"2026/1/29-2027-meeting.pkl\") - will use that specific file\n */\nexport async function readTranscriptResource(transcriptPath: string): Promise<McpResourceContents> {\n // Guard against undefined/null paths\n if (!transcriptPath || typeof transcriptPath !== 'string') {\n throw new Error(`Invalid transcript path: ${transcriptPath}`);\n }\n \n // Get the configured output directory\n const outputDirectory = ServerConfig.getOutputDirectory();\n const outputStorage = ServerConfig.getOutputStorage();\n\n if (outputStorage.name === 'gcs') {\n const gcsResult = await readTranscriptResourceFromStorage(transcriptPath, outputStorage, outputDirectory);\n if (gcsResult) {\n return gcsResult;\n }\n }\n \n // Resolve the transcript path - handles extension resolution\n // If it's already absolute, use it directly (for backwards compatibility)\n const basePath = transcriptPath.startsWith('/')\n ? transcriptPath\n : resolve(outputDirectory, transcriptPath);\n\n // Resolve to actual .pkl file\n const resolved = await resolveTranscriptPath(basePath);\n \n if (!resolved.exists || !resolved.path) {\n throw new Error(`Transcript not found: ${basePath}`);\n }\n\n try {\n // Read content and metadata using PKL utilities\n const { content, metadata, title } = await readTranscriptContent(resolved.path);\n \n // Get raw transcript if available\n const pklTranscript = PklTranscript.open(resolved.path, { readOnly: true });\n let rawTranscript = undefined;\n let summaries: Array<{\n id: string;\n title: string;\n audience: string;\n guidance: string;\n stylePreset: string;\n styleLabel: string;\n content: string;\n generatedAt: string;\n }> = [];\n try {\n if (pklTranscript.hasRawTranscript) {\n const rawData = pklTranscript.rawTranscript;\n if (rawData) {\n rawTranscript = {\n text: rawData.text,\n model: rawData.model,\n duration: rawData.duration,\n transcribedAt: rawData.transcribedAt,\n };\n }\n }\n\n const historyArtifact = pklTranscript.getArtifact('summary_history');\n summaries = parseStoredSummaries(historyArtifact?.data?.toString('utf8') || '[]');\n } finally {\n pklTranscript.close();\n }\n \n // Build the URI without extension (extension-agnostic identifier)\n const relativePath = resolved.path.startsWith('/')\n ? relative(outputDirectory, resolved.path)\n : transcriptPath;\n \n // Strip extension from the URI - the identifier should be extension-agnostic\n const identifierPath = stripTranscriptExtension(relativePath);\n \n // Return structured JSON response - clients should NOT parse this\n // All metadata is provided directly for display\n const structuredResponse = {\n uri: buildTranscriptUri(identifierPath),\n path: identifierPath,\n title: title || identifierPath.split('/').pop() || 'Untitled',\n metadata: {\n date: metadata.date,\n time: metadata.time,\n project: metadata.project,\n projectId: metadata.projectId,\n status: metadata.status,\n tags: metadata.tags || [],\n duration: metadata.duration,\n entities: metadata.entities || {},\n tasks: metadata.tasks || [],\n comments: metadata.comments || [],\n history: metadata.history || [],\n routing: metadata.destination ? {\n destination: metadata.destination,\n confidence: metadata.confidence,\n } : undefined,\n },\n content: content,\n rawTranscript: rawTranscript,\n summaries,\n };\n \n return {\n uri: buildTranscriptUri(identifierPath),\n mimeType: 'application/json',\n text: JSON.stringify(structuredResponse),\n };\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code === 'ENOENT') {\n throw new Error(`Transcript not found: ${resolved.path}`);\n }\n throw error;\n }\n}\n\nasync function withTempPklFile<T>(contents: Buffer, action: (tempPath: string) => Promise<T>): Promise<T> {\n const tempPath = `${tmpdir()}/protokoll-mcp-${Date.now()}-${Math.random().toString(36).slice(2)}.pkl`;\n await fs.writeFile(tempPath, contents);\n try {\n return await action(tempPath);\n } finally {\n await fs.rm(tempPath, { force: true });\n }\n}\n\nasync function resolveStorageTranscriptPath(\n transcriptPath: string,\n outputStorage: FileStorageProvider,\n): Promise<string | null> {\n const candidates = new Set<string>();\n const normalizedInput = transcriptPath.replace(/^\\/+/, '').replace(/\\\\/g, '/');\n if (normalizedInput.length > 0) {\n candidates.add(normalizedInput);\n }\n if (!normalizedInput.toLowerCase().endsWith('.pkl')) {\n candidates.add(`${normalizedInput}.pkl`);\n }\n\n for (const candidate of candidates) {\n if (await outputStorage.exists(candidate)) {\n return candidate;\n }\n }\n\n return null;\n}\n\nasync function readTranscriptResourceFromStorage(\n transcriptPath: string,\n outputStorage: FileStorageProvider,\n outputDirectory: string,\n): Promise<McpResourceContents | null> {\n const storagePath = await resolveStorageTranscriptPath(transcriptPath, outputStorage);\n if (!storagePath) {\n return null;\n }\n\n const contents = await outputStorage.readFile(storagePath);\n return withTempPklFile(contents, async (tempPath) => {\n const { content, metadata, title } = await readTranscriptContent(tempPath);\n const pklTranscript = PklTranscript.open(tempPath, { readOnly: true });\n let rawTranscript = undefined;\n let summaries: Array<{\n id: string;\n title: string;\n audience: string;\n guidance: string;\n stylePreset: string;\n styleLabel: string;\n content: string;\n generatedAt: string;\n }> = [];\n try {\n if (pklTranscript.hasRawTranscript) {\n const rawData = pklTranscript.rawTranscript;\n if (rawData) {\n rawTranscript = {\n text: rawData.text,\n model: rawData.model,\n duration: rawData.duration,\n transcribedAt: rawData.transcribedAt,\n };\n }\n }\n\n const historyArtifact = pklTranscript.getArtifact('summary_history');\n summaries = parseStoredSummaries(historyArtifact?.data?.toString('utf8') || '[]');\n } finally {\n pklTranscript.close();\n }\n\n const safeRelativePath = await sanitizePath(storagePath, outputDirectory);\n const identifierPath = stripTranscriptExtension(safeRelativePath);\n const structuredResponse = {\n uri: buildTranscriptUri(identifierPath),\n path: identifierPath,\n title: title || basename(identifierPath) || 'Untitled',\n metadata: {\n date: metadata.date,\n time: metadata.time,\n project: metadata.project,\n projectId: metadata.projectId,\n status: metadata.status,\n tags: metadata.tags || [],\n duration: metadata.duration,\n entities: metadata.entities || {},\n tasks: metadata.tasks || [],\n comments: metadata.comments || [],\n history: metadata.history || [],\n routing: metadata.destination ? {\n destination: metadata.destination,\n confidence: metadata.confidence,\n } : undefined,\n },\n content,\n rawTranscript,\n summaries,\n };\n\n return {\n uri: buildTranscriptUri(identifierPath),\n mimeType: 'application/json',\n text: JSON.stringify(structuredResponse),\n };\n });\n}\n\nasync function listTranscriptsFromStorage(options: {\n outputStorage: FileStorageProvider;\n outputDirectory: string;\n startDate?: string;\n endDate?: string;\n projectId?: string;\n projectName?: string;\n limit: number;\n offset: number;\n}) {\n const startedAt = Date.now();\n const { outputStorage, outputDirectory, startDate, endDate, projectId, projectName, limit, offset } = options;\n\n logger.info('transcripts.storage.list.start', {\n directory: outputDirectory,\n storageBackend: outputStorage.name,\n limit,\n offset,\n startDate: startDate ?? null,\n endDate: endDate ?? null,\n projectId: projectId ?? null,\n projectName: projectName ?? null,\n });\n\n const hasListSupport = typeof (outputStorage as { listFiles?: unknown }).listFiles === 'function'\n || typeof (outputStorage as { listFilesWithMetadata?: unknown }).listFilesWithMetadata === 'function';\n if (!hasListSupport) {\n return listTranscripts({\n directory: outputDirectory,\n startDate,\n endDate,\n limit,\n offset,\n projectId,\n });\n }\n\n const result = await listTranscriptsViaIndex({\n outputStorage,\n outputDirectory,\n startDate,\n endDate,\n projectId,\n projectName,\n limit,\n offset,\n });\n logger.info('transcripts.storage.list.complete', {\n storageBackend: outputStorage.name,\n totalAfterFilters: result.total,\n returned: result.transcripts.length,\n hasMore: result.hasMore,\n elapsedMs: Date.now() - startedAt,\n });\n return result;\n}\n\n/**\n * Read a list of transcripts with filtering\n */\nexport async function readTranscriptsListResource(options: {\n directory?: string;\n startDate?: string;\n endDate?: string;\n limit?: number;\n offset?: number;\n projectId?: string;\n}): Promise<McpResourceContents> {\n const { startDate, endDate, limit = 50, offset = 0, projectId } = options;\n \n // Get the configured output directory to use as fallback\n const outputDirectory = ServerConfig.getOutputDirectory();\n const outputStorage = ServerConfig.getOutputStorage();\n \n // Use provided directory or fall back to configured outputDirectory\n const directory = options.directory || outputDirectory;\n\n // Resolve projectId to project name for fallback filtering (transcripts may have project name but not projectId)\n let projectName: string | undefined;\n if (projectId && ServerConfig.isInitialized()) {\n const context = ServerConfig.getContext();\n if (context) {\n const project = context.getProject(projectId);\n if (project) {\n projectName = project.name;\n } else {\n // projectId isn't a known UUID — treat it as a project name\n projectName = projectId;\n }\n }\n }\n\n logger.info('transcripts.list.request', {\n directory,\n directorySource: options.directory ? 'request' : 'config',\n projectId: projectId ?? null,\n startDate: startDate ?? null,\n endDate: endDate ?? null,\n limit,\n offset,\n storageBackend: outputStorage.name,\n });\n\n const result = await listTranscriptsFromStorage({\n outputStorage,\n outputDirectory,\n startDate,\n endDate,\n projectId,\n projectName,\n limit,\n offset,\n });\n\n logger.info('transcripts.list.response', {\n directory,\n total: result.total,\n returned: result.transcripts.length,\n hasMore: result.hasMore,\n limit,\n offset,\n });\n\n // Convert to resource format with URIs\n // Convert absolute paths to relative paths (relative to outputDirectory)\n // Use sanitizePath to ensure no absolute paths are exposed\n // Strip file extensions from URIs - identifiers should be extension-agnostic\n const transcriptsWithUris = await Promise.all(\n result.transcripts.map(async (t) => {\n // Convert absolute path to relative path\n // Guard against undefined path - use filename as fallback\n const relativePath = await sanitizePath(t.path || t.filename || '', outputDirectory);\n \n // Strip extension from the identifier - URIs should be extension-agnostic\n const identifierPath = stripTranscriptExtension(relativePath);\n \n return {\n uri: buildTranscriptUri(identifierPath),\n path: identifierPath, // Use extension-less path as the identifier\n filename: t.filename,\n date: t.date,\n time: t.time,\n title: t.title,\n status: t.status,\n openTasksCount: t.openTasksCount,\n contentSize: t.contentSize,\n entities: t.entities,\n hasRawTranscript: t.hasRawTranscript,\n };\n })\n );\n\n const responseData = {\n directory,\n transcripts: transcriptsWithUris,\n pagination: {\n total: result.total,\n limit: result.limit,\n offset: result.offset,\n hasMore: result.hasMore ?? (result.offset + result.limit < result.total),\n nextOffset: result.hasMore ? result.offset + result.limit : null,\n },\n filters: {\n startDate,\n endDate,\n projectId,\n },\n };\n\n // Build URI with the actual directory used (may be fallback from config)\n return {\n uri: buildTranscriptsListUri({\n directory,\n startDate,\n endDate,\n limit,\n offset,\n projectId,\n }),\n mimeType: 'application/json',\n text: JSON.stringify(responseData, null, 2),\n };\n}\n","/**\n * Client / list APIs sometimes surface composite ids (e.g. \"default-server:<uuid>\" or\n * \"<profile-id>:<uuid>\") while context storage keys entities by the bare UUID in YAML.\n * These helpers normalize ids for lookup and deduplication.\n */\n\nconst UUID_RE = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;\n\n/**\n * If id is \"anything:<uuid>\" where the part after the first colon is a full UUID,\n * return that UUID; otherwise return the trimmed original string.\n */\nexport function resolveCanonicalEntityId(id: string): string {\n const t = id.trim();\n const colon = t.indexOf(':');\n if (colon === -1) {\n return t;\n }\n const rest = t.slice(colon + 1).trim();\n if (UUID_RE.test(rest)) {\n return rest;\n }\n return t;\n}\n\n/** Try raw id first, then canonical (stripped) form when they differ. */\nexport function entityIdLookupOrder(id: string): string[] {\n const t = id.trim();\n const canon = resolveCanonicalEntityId(t);\n return canon === t ? [t] : [t, canon];\n}\n","/**\n * Entity Resources\n * \n * Handles reading individual entities and listing entities by type.\n */\n\nimport type { McpResourceContents } from '../types';\nimport { buildEntityUri, buildEntitiesListUri } from '../uri';\nimport * as Context from '@/context';\nimport type { ContextInstance } from '@/context';\nimport * as ServerConfig from '../serverConfig';\nimport { createToolContext } from '../tools/shared';\nimport * as yaml from 'js-yaml';\nimport { resolve, isAbsolute } from 'node:path';\nimport Logging from '@fjell/logging';\nimport { findContextEntityInGcs, listContextEntitiesFromGcs } from './entityIndexService';\nimport { entityIdLookupOrder } from '../util/scopedEntityId';\n\ntype EntityType = 'person' | 'project' | 'term' | 'company' | 'ignored';\nconst logger = Logging.getLogger('@redaksjon/protokoll-mcp').get('entity-resources');\n\n/** YAML keys that may hold large plan lists — omitted from entity resources; use protokoll_list_project_plans. */\nconst PROJECT_PLAN_ARRAY_KEYS = ['related_plans', 'plans', 'riotplan_plans'] as const;\n\nfunction stripProjectPlanArraysForResource(entity: unknown): Record<string, unknown> {\n const base =\n entity && typeof entity === 'object' && !Array.isArray(entity)\n ? { ...(entity as Record<string, unknown>) }\n : {};\n let totalRows = 0;\n for (const k of PROJECT_PLAN_ARRAY_KEYS) {\n const v = base[k];\n if (Array.isArray(v)) {\n totalRows += v.length;\n }\n }\n for (const k of PROJECT_PLAN_ARRAY_KEYS) {\n const v = base[k];\n if (Array.isArray(v) && v.length > 0) {\n delete base[k];\n }\n }\n if (totalRows > 0) {\n base.related_plans_total = totalRows;\n }\n return base;\n}\n\nconst ENTITY_DIRECTORY: Record<EntityType, string> = {\n person: 'people',\n project: 'projects',\n term: 'terms',\n company: 'companies',\n ignored: 'ignored',\n};\n\n/**\n * Read a single entity resource.\n * Always creates a fresh context to ensure we read the latest data from disk,\n * since entity edit tools write directly to disk with their own context instances.\n */\nexport async function readEntityResource(\n entityType: string,\n entityId: string,\n contextDirectory?: string\n): Promise<McpResourceContents> {\n if ((entityType as EntityType) in ENTITY_DIRECTORY && ServerConfig.isInitialized()) {\n const storageConfig = ServerConfig.getStorageConfig();\n if (storageConfig.backend === 'gcs') {\n for (const tryId of entityIdLookupOrder(entityId)) {\n const gcsEntity = await findContextEntityInGcs(entityType as EntityType, tryId);\n if (gcsEntity) {\n const idForUri =\n typeof (gcsEntity as { id?: unknown }).id === 'string'\n ? String((gcsEntity as { id: string }).id).trim()\n : tryId;\n const toDump =\n entityType === 'project'\n ? stripProjectPlanArraysForResource(gcsEntity)\n : gcsEntity;\n const yamlContent = yaml.dump(toDump);\n return {\n uri: buildEntityUri(entityType as any, idForUri),\n mimeType: 'application/yaml',\n text: yamlContent,\n };\n }\n }\n }\n }\n\n const effectiveDir = contextDirectory || ServerConfig.getWorkspaceRoot() || process.cwd();\n logger.info('entity.read.lookup', {\n entityType,\n entityId,\n effectiveDir,\n });\n const context = await createToolContext(contextDirectory);\n try {\n await context.reload();\n } catch (error) {\n logger.debug('entity.read.context_reload_failed', {\n entityType,\n entityId,\n error: error instanceof Error ? error.message : String(error),\n });\n }\n\n if (!context.hasContext()) {\n const searchDir = contextDirectory || process.cwd();\n logger.warning('entity.read.missing_context', {\n entityType,\n entityId,\n searchDir,\n });\n throw new Error(`No Protokoll context found. Expected .protokoll/ or context dirs in ${searchDir}`);\n }\n\n const lookupEntityById = (\n candidate: ContextInstance,\n forId: string,\n ): ReturnType<ContextInstance['getPerson']> | ReturnType<ContextInstance['getProject']> | ReturnType<ContextInstance['getTerm']> | ReturnType<ContextInstance['getCompany']> | ReturnType<ContextInstance['getIgnored']> => {\n switch (entityType) {\n case 'person':\n return candidate.getPerson(forId);\n case 'project':\n return candidate.getProject(forId);\n case 'term':\n return candidate.getTerm(forId);\n case 'company':\n return candidate.getCompany(forId);\n case 'ignored':\n return candidate.getIgnored(forId);\n default:\n throw new Error(`Unknown entity type: ${entityType}`);\n }\n };\n\n const serverContext = ServerConfig.isInitialized() ? ServerConfig.getContext() : undefined;\n if (serverContext?.hasContext() && serverContext !== context) {\n try {\n await serverContext.reload();\n } catch (error) {\n logger.debug('entity.read.server_context_reload_failed', {\n entityType,\n entityId,\n error: error instanceof Error ? error.message : String(error),\n });\n }\n }\n\n let entity:\n | ReturnType<ContextInstance['getPerson']>\n | ReturnType<ContextInstance['getProject']>\n | ReturnType<ContextInstance['getTerm']>\n | ReturnType<ContextInstance['getCompany']>\n | ReturnType<ContextInstance['getIgnored']>\n | undefined;\n\n for (const tryId of entityIdLookupOrder(entityId)) {\n entity = lookupEntityById(context, tryId);\n if (entity) {\n break;\n }\n if (serverContext?.hasContext() && serverContext !== context) {\n entity = lookupEntityById(serverContext, tryId);\n if (entity) {\n logger.info('entity.read.server_context_fallback_hit', {\n entityType,\n entityId,\n tryId,\n });\n break;\n }\n }\n }\n\n if (!entity) {\n // Debug: list available IDs for this type to help diagnose \"not found\"\n const allIds =\n entityType === 'person' ? context.getAllPeople().map(p => p.id)\n : entityType === 'project' ? context.getAllProjects().map(p => p.id)\n : entityType === 'term' ? context.getAllTerms().map(t => t.id)\n : entityType === 'company' ? context.getAllCompanies().map(c => c.id)\n : entityType === 'ignored' ? context.getAllIgnored().map(i => i.id)\n : [];\n logger.warning('entity.read.not_found', {\n entityType,\n entityId,\n availableCount: allIds.length,\n });\n throw new Error(`${entityType} \"${entityId}\" not found`);\n }\n\n const canonicalId = entity.id;\n\n logger.info('entity.read.found', {\n entityType,\n entityId,\n canonicalId: canonicalId !== entityId ? canonicalId : undefined,\n });\n\n // Convert to YAML for readability (strip heavy plan arrays from project resources)\n const payload = entityType === 'project' ? stripProjectPlanArraysForResource(entity) : entity;\n const yamlContent = yaml.dump(payload);\n\n return {\n uri: buildEntityUri(entityType as any, canonicalId),\n mimeType: 'application/yaml',\n text: yamlContent,\n };\n}\n\n/**\n * Read a list of entities by type\n */\nexport async function readEntitiesListResource(\n entityType: string,\n contextDirectory?: string\n): Promise<McpResourceContents> {\n if ((entityType as EntityType) in ENTITY_DIRECTORY && ServerConfig.isInitialized()) {\n const storageConfig = ServerConfig.getStorageConfig();\n if (storageConfig.backend === 'gcs') {\n const entitiesFromGcs = await listContextEntitiesFromGcs(entityType as EntityType);\n const entities = entitiesFromGcs.map((entity) => {\n const id = String(entity.id || '');\n const name = String(entity.name || '');\n return {\n uri: buildEntityUri(entityType as any, id),\n id,\n name,\n ...entity,\n };\n });\n\n const responseData = {\n entityType,\n count: entities.length,\n entities,\n };\n\n return {\n uri: buildEntitiesListUri(entityType as any),\n mimeType: 'application/json',\n text: JSON.stringify(responseData, null, 2),\n };\n }\n }\n\n // Use server's pre-initialized context when available (HTTP/remote mode with protokoll-config.yaml)\n let context: ContextInstance;\n if (ServerConfig.isInitialized()) {\n const serverContext = ServerConfig.getContext();\n if (serverContext?.hasContext()) {\n context = serverContext;\n } else {\n const configFile = ServerConfig.getServerConfig().configFile as { contextDirectories?: string[] } | null;\n const rawDirs = configFile?.contextDirectories;\n const effectiveDir = contextDirectory || ServerConfig.getWorkspaceRoot() || process.cwd();\n const contextDirs = rawDirs && rawDirs.length > 0\n ? rawDirs.map(d => (isAbsolute(d) ? d : resolve(effectiveDir, d)))\n : undefined;\n context = await Context.create({\n startingDir: effectiveDir,\n contextDirectories: contextDirs,\n });\n }\n } else {\n context = await Context.create({\n startingDir: contextDirectory || process.cwd(),\n });\n }\n\n if (!context.hasContext()) {\n throw new Error('No Protokoll context found');\n }\n\n let entities: Array<{ id: string; name: string; [key: string]: unknown }>;\n \n switch (entityType) {\n case 'person':\n entities = context.getAllPeople().map(p => ({\n uri: buildEntityUri('person', p.id),\n id: p.id,\n name: p.name,\n company: p.company,\n role: p.role,\n }));\n break;\n case 'project':\n entities = context.getAllProjects().map(p => ({\n uri: buildEntityUri('project', p.id),\n id: p.id,\n name: p.name,\n active: p.active !== false,\n destination: p.routing?.destination,\n }));\n break;\n case 'term':\n entities = context.getAllTerms().map(t => ({\n uri: buildEntityUri('term', t.id),\n id: t.id,\n name: t.name,\n expansion: t.expansion,\n domain: t.domain,\n }));\n break;\n case 'company':\n entities = context.getAllCompanies().map(c => ({\n uri: buildEntityUri('company', c.id),\n id: c.id,\n name: c.name,\n fullName: c.fullName,\n industry: c.industry,\n }));\n break;\n case 'ignored':\n entities = context.getAllIgnored().map(i => ({\n uri: buildEntityUri('ignored', i.id),\n id: i.id,\n name: i.name,\n reason: i.reason,\n }));\n break;\n default:\n throw new Error(`Unknown entity type: ${entityType}`);\n }\n\n const responseData = {\n entityType,\n count: entities.length,\n entities,\n };\n\n return {\n uri: buildEntitiesListUri(entityType as any),\n mimeType: 'application/json',\n text: JSON.stringify(responseData, null, 2),\n };\n}\n","/**\n * Audio Resources\n * \n * Handles listing audio files (inbound and processed).\n */\n\nimport type { McpResourceContents } from '../types';\nimport { buildAudioInboundUri, buildAudioProcessedUri } from '../uri';\nimport { readdir, stat } from 'node:fs/promises';\nimport { resolve, join, extname } from 'node:path';\nimport * as Context from '@/context';\nimport { DEFAULT_AUDIO_EXTENSIONS } from '@/constants';\nimport * as ServerConfig from '../serverConfig';\n\nfunction isServerConfigInitialized(): boolean {\n try {\n return typeof (ServerConfig as any).isInitialized === 'function' &&\n (ServerConfig as any).isInitialized();\n } catch {\n return false;\n }\n}\n\n/**\n * List audio files in a directory\n */\nasync function listAudioFiles(directory: string): Promise<Array<{\n filename: string;\n path: string;\n size: number;\n modified: string;\n extension: string;\n}>> {\n const dirPath = resolve(directory);\n \n try {\n const entries = await readdir(dirPath, { withFileTypes: true });\n const audioFiles = [];\n \n for (const entry of entries) {\n if (entry.isFile()) {\n const ext = extname(entry.name).toLowerCase().substring(1);\n if (DEFAULT_AUDIO_EXTENSIONS.includes(ext)) {\n const filePath = join(dirPath, entry.name);\n const stats = await stat(filePath);\n \n audioFiles.push({\n filename: entry.name,\n path: filePath,\n size: stats.size,\n modified: stats.mtime.toISOString(),\n extension: ext,\n });\n }\n }\n }\n \n // Sort by modification time, newest first\n audioFiles.sort((a, b) => \n new Date(b.modified).getTime() - new Date(a.modified).getTime()\n );\n \n return audioFiles;\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code === 'ENOENT') {\n return [];\n }\n throw error;\n }\n}\n\n/**\n * Format bytes to human-readable string\n */\nfunction formatBytes(bytes: number): string {\n if (bytes === 0) return '0 B';\n \n const k = 1024;\n const sizes = ['B', 'KB', 'MB', 'GB'];\n const i = Math.floor(Math.log(bytes) / Math.log(k));\n \n return `${(bytes / Math.pow(k, i)).toFixed(2)} ${sizes[i]}`;\n}\n\n/**\n * Read inbound audio files resource\n */\nexport async function readAudioInboundResource(\n directory?: string\n): Promise<McpResourceContents> {\n const serverConfigReady = isServerConfigInitialized();\n\n let inputDirectory = directory;\n if (!inputDirectory) {\n if (serverConfigReady && typeof (ServerConfig as any).getInputDirectory === 'function') {\n inputDirectory = (ServerConfig as any).getInputDirectory();\n } else {\n const context = await Context.create({\n startingDir: process.cwd(),\n });\n if (!context.hasContext()) {\n throw new Error('No Protokoll context found');\n }\n const config = context.getConfig();\n inputDirectory = (config.inputDirectory as string) || './recordings';\n }\n } else if (!serverConfigReady) {\n // Preserve local-mode behavior: explicit directories still require context discovery.\n const context = await Context.create({\n startingDir: directory,\n });\n if (!context.hasContext()) {\n throw new Error('No Protokoll context found');\n }\n }\n if (!inputDirectory) {\n throw new Error('Input directory is not configured');\n }\n const audioFiles = await listAudioFiles(inputDirectory);\n \n const responseData = {\n directory: resolve(inputDirectory),\n count: audioFiles.length,\n totalSize: audioFiles.reduce((sum, f) => sum + f.size, 0),\n files: audioFiles.map(f => ({\n filename: f.filename,\n path: f.path,\n size: f.size,\n sizeHuman: formatBytes(f.size),\n modified: f.modified,\n extension: f.extension,\n })),\n supportedExtensions: DEFAULT_AUDIO_EXTENSIONS,\n };\n\n return {\n uri: buildAudioInboundUri(inputDirectory),\n mimeType: 'application/json',\n text: JSON.stringify(responseData, null, 2),\n };\n}\n\n/**\n * Read processed audio files resource\n */\nexport async function readAudioProcessedResource(\n directory?: string\n): Promise<McpResourceContents> {\n const serverConfigReady = isServerConfigInitialized();\n\n let processedDirectory = directory;\n if (!processedDirectory) {\n if (serverConfigReady && typeof (ServerConfig as any).getProcessedDirectory === 'function') {\n processedDirectory = (ServerConfig as any).getProcessedDirectory() || './processed';\n } else {\n const context = await Context.create({\n startingDir: process.cwd(),\n });\n if (!context.hasContext()) {\n throw new Error('No Protokoll context found');\n }\n const config = context.getConfig();\n processedDirectory = (config.processedDirectory as string) || './processed';\n }\n } else if (!serverConfigReady) {\n // Preserve local-mode behavior: explicit directories still require context discovery.\n const context = await Context.create({\n startingDir: directory,\n });\n if (!context.hasContext()) {\n throw new Error('No Protokoll context found');\n }\n }\n if (!processedDirectory) {\n throw new Error('Processed directory is not configured');\n }\n const audioFiles = await listAudioFiles(processedDirectory);\n \n const responseData = {\n directory: resolve(processedDirectory),\n count: audioFiles.length,\n totalSize: audioFiles.reduce((sum, f) => sum + f.size, 0),\n files: audioFiles.map(f => ({\n filename: f.filename,\n path: f.path,\n size: f.size,\n sizeHuman: formatBytes(f.size),\n modified: f.modified,\n extension: f.extension,\n })),\n supportedExtensions: DEFAULT_AUDIO_EXTENSIONS,\n };\n\n return {\n uri: buildAudioProcessedUri(processedDirectory),\n mimeType: 'application/json',\n text: JSON.stringify(responseData, null, 2),\n };\n}\n","/**\n * Configuration Resource\n * \n * Handles reading Protokoll configuration.\n */\n\nimport type { McpResourceContents } from '../types';\nimport { buildConfigUri, buildEntitiesListUri } from '../uri';\nimport * as Context from '@/context';\nimport * as ServerConfig from '../serverConfig';\nimport { isAbsolute, resolve } from 'node:path';\n\nfunction isServerConfigInitialized(): boolean {\n try {\n return typeof (ServerConfig as any).isInitialized === 'function' &&\n (ServerConfig as any).isInitialized();\n } catch {\n return false;\n }\n}\n\nfunction getServerContext() {\n try {\n return typeof (ServerConfig as any).getContext === 'function'\n ? (ServerConfig as any).getContext()\n : null;\n } catch {\n return null;\n }\n}\n\nfunction getServerConfigFile(): { contextDirectories?: string[] } | null {\n try {\n return typeof (ServerConfig as any).getServerConfig === 'function'\n ? ((ServerConfig as any).getServerConfig().configFile as { contextDirectories?: string[] } | null)\n : null;\n } catch {\n return null;\n }\n}\n\nfunction getWorkspaceRoot(): string | null {\n try {\n return typeof (ServerConfig as any).getWorkspaceRoot === 'function'\n ? (ServerConfig as any).getWorkspaceRoot()\n : null;\n } catch {\n return null;\n }\n}\n\n/**\n * Read configuration resource\n */\nexport async function readConfigResource(\n configPath?: string\n): Promise<McpResourceContents> {\n let startDir = configPath || process.cwd();\n let context;\n const serverConfigReady = isServerConfigInitialized();\n if (serverConfigReady) {\n const serverContext = getServerContext();\n if (serverContext?.hasContext()) {\n context = serverContext;\n startDir = getWorkspaceRoot() || startDir;\n } else {\n const configFile = getServerConfigFile();\n const rawDirs = configFile?.contextDirectories;\n const workspaceRoot = getWorkspaceRoot();\n const effectiveDir = configPath || workspaceRoot || process.cwd();\n const contextDirs = rawDirs && rawDirs.length > 0\n ? rawDirs.map(d => (isAbsolute(d) ? d : resolve(effectiveDir, d)))\n : undefined;\n startDir = effectiveDir;\n context = await Context.create({\n startingDir: effectiveDir,\n contextDirectories: contextDirs,\n });\n }\n } else {\n context = await Context.create({\n startingDir: startDir,\n });\n }\n\n if (!context.hasContext()) {\n throw new Error(`No Protokoll context found at or above: ${startDir}`);\n }\n\n const dirs = context.getDiscoveredDirs();\n const config = context.getConfig();\n\n const configData = {\n hasContext: true,\n discoveredDirectories: dirs.map((d: { path: string; level: number }) => ({\n path: d.path,\n level: d.level,\n isPrimary: d.level === 0,\n })),\n entityCounts: {\n projects: context.getAllProjects().length,\n people: context.getAllPeople().length,\n terms: context.getAllTerms().length,\n companies: context.getAllCompanies().length,\n ignored: context.getAllIgnored().length,\n },\n config: {\n outputDirectory: config.outputDirectory,\n outputStructure: config.outputStructure,\n model: config.model,\n smartAssistance: context.getSmartAssistanceConfig(),\n },\n // Include URIs for easy navigation\n resourceUris: {\n projects: buildEntitiesListUri('project'),\n people: buildEntitiesListUri('person'),\n terms: buildEntitiesListUri('term'),\n companies: buildEntitiesListUri('company'),\n },\n };\n\n return {\n uri: buildConfigUri(configPath),\n mimeType: 'application/json',\n text: JSON.stringify(configData, null, 2),\n };\n}\n","/**\n * MCP Resources - Exports all resource definitions and handlers\n */\n\nimport type {\n McpResource,\n McpResourceTemplate,\n McpResourceContents,\n TranscriptUri,\n EntityUri,\n ConfigUri,\n TranscriptsListUri,\n EntitiesListUri,\n AudioInboundUri,\n AudioProcessedUri,\n} from '../types';\nimport { parseUri } from '../uri';\nimport * as ServerConfig from '../serverConfig';\nimport Logging from '@fjell/logging';\n\n// Re-export all resource modules\nexport * from './definitions';\nexport * from './discovery';\nexport * from './transcriptResources';\nexport * from './entityResources';\nexport * from './audioResources';\nexport * from './configResource';\n\n// Import for use in handlers\nimport { directResources, resourceTemplates } from './definitions';\nimport { getDynamicResources } from './discovery';\nimport { readTranscriptResource, readTranscriptsListResource } from './transcriptResources';\nimport { readEntityResource, readEntitiesListResource } from './entityResources';\nimport { readAudioInboundResource, readAudioProcessedResource } from './audioResources';\nimport { readConfigResource } from './configResource';\nconst logger = Logging.getLogger('@redaksjon/protokoll-mcp').get('resources');\n\n// ============================================================================\n// Main Handler Functions\n// ============================================================================\n\n/**\n * Handle resources/list request\n */\nexport async function handleListResources(contextDirectory?: string): Promise<{\n resources: McpResource[];\n resourceTemplates?: McpResourceTemplate[];\n}> {\n // Get dynamic resources from context if available\n const dynamicResources = await getDynamicResources(contextDirectory);\n \n return {\n resources: [...directResources, ...dynamicResources],\n resourceTemplates,\n };\n}\n\n/**\n * Handle resources/read request\n */\nexport async function handleReadResource(uri: string): Promise<McpResourceContents> {\n const parsed = parseUri(uri);\n\n if (parsed.resourceType === 'entity') {\n const entityUri = parsed as EntityUri;\n logger.info('resource.read.entity.request', {\n entityType: entityUri.entityType,\n entityId: entityUri.entityId,\n });\n }\n\n switch (parsed.resourceType) {\n case 'transcript':\n return readTranscriptResource((parsed as TranscriptUri).transcriptPath);\n case 'entity': {\n const entityUri = parsed as EntityUri;\n // Use server's workspace root when in remote mode (HTTP server)\n const contextDir = ServerConfig.isInitialized() ? ServerConfig.getWorkspaceRoot() ?? undefined : undefined;\n return readEntityResource(entityUri.entityType, entityUri.entityId, contextDir ?? undefined);\n }\n case 'config':\n return readConfigResource((parsed as ConfigUri).configPath);\n case 'transcripts-list': {\n const listUri = parsed as TranscriptsListUri;\n return readTranscriptsListResource({\n directory: listUri.directory,\n startDate: listUri.startDate,\n endDate: listUri.endDate,\n limit: listUri.limit,\n offset: listUri.offset,\n projectId: listUri.projectId,\n });\n }\n case 'entities-list': {\n const listUri = parsed as EntitiesListUri;\n const contextDir = ServerConfig.isInitialized() ? ServerConfig.getWorkspaceRoot() ?? undefined : undefined;\n return readEntitiesListResource(listUri.entityType, contextDir ?? undefined);\n }\n case 'audio-inbound':\n return readAudioInboundResource((parsed as AudioInboundUri).directory);\n case 'audio-processed':\n return readAudioProcessedResource((parsed as AudioProcessedUri).directory);\n default:\n throw new Error(`Unknown resource type: ${parsed.resourceType}`);\n }\n}\n","/**\n * MCP Prompt Handlers\n *\n * Provides workflow templates via MCP prompts.\n * Prompts are loaded from external markdown files in this directory.\n */\n\n// eslint-disable-next-line no-restricted-imports\nimport { readFileSync } from 'node:fs';\nimport { resolve, dirname, isAbsolute } from 'node:path';\nimport { stat } from 'node:fs/promises';\nimport { fileURLToPath } from 'node:url';\nimport type { McpPrompt, McpPromptMessage } from '../types';\nimport * as Context from '@/context';\nimport { buildConfigUri, buildEntitiesListUri } from '../uri';\nimport * as ServerConfig from '../serverConfig';\n\nconst __filename = fileURLToPath(import.meta.url);\nconst __dirname = dirname(__filename);\n\n/**\n * Helper to resolve the prompts directory path\n */\nfunction getPromptsDir(): string {\n const isBundled = __dirname.includes('/dist') || __dirname.endsWith('dist') ||\n __filename.includes('dist/mcp-server.js') || __filename.includes('dist\\\\mcp-server.js');\n\n if (isBundled) {\n // When bundled, __dirname points to dist/mcp, prompts are in dist/mcp/prompts\n return resolve(__dirname, 'prompts');\n }\n // In source, __dirname already points to src/mcp/prompts\n return __dirname;\n}\n\n/**\n * Helper to load a prompt template from a markdown file\n */\nfunction loadTemplate(name: string): string {\n const promptsDir = getPromptsDir();\n const path = resolve(promptsDir, `${name}.md`);\n try {\n return readFileSync(path, 'utf-8').trim();\n } catch (error) {\n const isBundled = __dirname.includes('/dist');\n const debugInfo = [\n `Failed to load prompt template \"${name}\"`,\n `Attempted path: ${path}`,\n `Prompts directory: ${promptsDir}`,\n `Current __dirname: ${__dirname}`,\n `Current __filename: ${__filename}`,\n `Environment: ${isBundled ? 'bundled (dist)' : 'source (src)'}`,\n `Error: ${error}`,\n ].join('\\n ');\n throw new Error(debugInfo);\n }\n}\n\n/**\n * Helper to replace placeholders in a template\n */\nfunction fillTemplate(template: string, args: Record<string, string>): string {\n return template.replace(/\\${(\\w+)}/g, (_, key) => {\n return args[key] || '';\n });\n}\n\nasync function createPromptContext(startingDir: string) {\n const serverConfigReady = (() => {\n try {\n return typeof (ServerConfig as any).isInitialized === 'function' &&\n (ServerConfig as any).isInitialized();\n } catch {\n return false;\n }\n })();\n if (serverConfigReady) {\n const serverContext = (() => {\n try {\n return typeof (ServerConfig as any).getContext === 'function'\n ? (ServerConfig as any).getContext()\n : null;\n } catch {\n return null;\n }\n })();\n if (serverContext?.hasContext()) {\n return serverContext;\n }\n\n const configFile = (() => {\n try {\n return typeof (ServerConfig as any).getServerConfig === 'function'\n ? ((ServerConfig as any).getServerConfig().configFile as { contextDirectories?: string[] } | null)\n : null;\n } catch {\n return null;\n }\n })();\n const rawDirs = configFile?.contextDirectories;\n const workspaceRoot = (() => {\n try {\n return typeof (ServerConfig as any).getWorkspaceRoot === 'function'\n ? (ServerConfig as any).getWorkspaceRoot()\n : null;\n } catch {\n return null;\n }\n })();\n const effectiveDir = workspaceRoot || startingDir;\n const contextDirs = rawDirs && rawDirs.length > 0\n ? rawDirs.map(d => (isAbsolute(d) ? d : resolve(effectiveDir, d)))\n : undefined;\n return Context.create({\n startingDir: effectiveDir,\n contextDirectories: contextDirs,\n });\n }\n\n return Context.create({\n startingDir,\n });\n}\n\n/**\n * Get all available prompts\n */\nexport function getPrompts(): McpPrompt[] {\n return [\n {\n name: 'how_to_use_protokoll',\n description: 'Essential instructions for AI assistants on how to properly interact with Protokoll. ' +\n 'READ THIS FIRST before working with transcripts. Explains which tools to use and which to avoid.',\n arguments: [],\n },\n {\n name: 'transcribe_with_context',\n description: 'Intelligently transcribe audio with context discovery and project routing. ' +\n 'Guides you through finding the right configuration and confirms before processing.',\n arguments: [\n {\n name: 'audioFile',\n description: 'Absolute path to the audio file to transcribe',\n required: true,\n },\n {\n name: 'skipDiscovery',\n description: 'Skip context discovery if you already know the configuration',\n required: false,\n },\n ],\n },\n {\n name: 'setup_project',\n description: 'Create a new project with smart assistance for generating metadata. ' +\n 'Analyzes source content to suggest sounds_like, trigger phrases, topics, and description.',\n arguments: [\n {\n name: 'projectName',\n description: 'Name of the project to create',\n required: true,\n },\n {\n name: 'sourceUrl',\n description: 'URL or file path to analyze for metadata suggestions',\n required: false,\n },\n {\n name: 'destination',\n description: 'Output directory for transcripts',\n required: false,\n },\n ],\n },\n {\n name: 'review_transcript',\n description: 'Analyze a transcript and suggest corrections based on context. ' +\n 'Identifies potential name/term errors and offers to apply fixes. ' +\n 'IMPORTANT: This prompt instructs the AI to use ONLY Protokoll MCP tools, never direct file editing.',\n arguments: [\n {\n name: 'transcriptPath',\n description: 'Path to the transcript to review',\n required: true,\n },\n {\n name: 'focusArea',\n description: 'What to focus on: names, terms, technical, or all (defaults to \"all\")',\n required: false,\n },\n ],\n },\n {\n name: 'identify_tasks_from_transcript',\n description: 'Identify task candidates from a transcript with a review-first flow. ' +\n 'Instructs the assistant to identify first, present candidates with none preselected, ' +\n 'and only create tasks after explicit user approval.',\n arguments: [\n {\n name: 'transcriptPath',\n description: 'Path or URI to the transcript to analyze',\n required: true,\n },\n {\n name: 'maxCandidates',\n description: 'Optional maximum number of task candidates to identify (default: 25)',\n required: false,\n },\n {\n name: 'includeTagSuggestions',\n description: 'Optional flag to include suggested tags (default: true)',\n required: false,\n },\n ],\n },\n {\n name: 'summarize_transcript',\n description: 'Create an audience-aware transcript summary with privacy guardrails and style presets.',\n arguments: [\n {\n name: 'transcriptPath',\n description: 'Path to the transcript to summarize',\n required: true,\n },\n {\n name: 'audience',\n description: 'Target audience for the summary (e.g. internal team, external attendee)',\n required: true,\n },\n {\n name: 'stylePreset',\n description: 'Summary style: quick_bullets, detailed, attendee_facing (default: detailed)',\n required: false,\n },\n {\n name: 'guidance',\n description: 'Additional instructions (especially privacy/sensitivity constraints)',\n required: false,\n },\n {\n name: 'summaryTitle',\n description: 'Optional title to use for the summary output',\n required: false,\n },\n ],\n },\n {\n name: 'enrich_entity',\n description: 'Add or update an entity with smart assistance for generating metadata.',\n arguments: [\n {\n name: 'entityType',\n description: 'Type: person, project, term, or company',\n required: true,\n },\n {\n name: 'entityName',\n description: 'Name of the entity',\n required: true,\n },\n {\n name: 'sourceUrl',\n description: 'URL or file path to analyze for metadata',\n required: false,\n },\n ],\n },\n {\n name: 'batch_transcription',\n description: 'Set up and execute batch transcription for a directory of audio files.',\n arguments: [\n {\n name: 'directory',\n description: 'Directory containing audio files',\n required: true,\n },\n {\n name: 'extensions',\n description: 'Comma-separated file extensions (default: m4a,mp3,wav,webm)',\n required: false,\n },\n ],\n },\n {\n name: 'find_and_analyze',\n description: 'Search for transcripts and analyze their content.',\n arguments: [\n {\n name: 'directory',\n description: 'Directory to search',\n required: true,\n },\n {\n name: 'query',\n description: 'Search query',\n required: false,\n },\n {\n name: 'startDate',\n description: 'Filter from date (YYYY-MM-DD)',\n required: false,\n },\n {\n name: 'endDate',\n description: 'Filter to date (YYYY-MM-DD)',\n required: false,\n },\n ],\n },\n {\n name: 'edit_entity',\n description: 'Edit an existing entity (person, term, or project) with manual modifications. ' +\n 'Unlike update tools that regenerate from sources, this allows direct edits like ' +\n 'adding specific sounds_like variants, changing fields, or modifying array properties.',\n arguments: [\n {\n name: 'entityType',\n description: 'Type of entity to edit: person, term, or project',\n required: true,\n },\n {\n name: 'entityId',\n description: 'ID of the entity to edit',\n required: true,\n },\n {\n name: 'modification',\n description: 'What to modify (e.g., \"add sounds_like variant\", \"change domain\", \"add topics\")',\n required: false,\n },\n ],\n },\n ];\n}\n\n/**\n * Get a prompt by name\n */\nexport async function getPrompt(\n name: string,\n args: Record<string, string>\n): Promise<McpPromptMessage[]> {\n // Validate prompt exists\n const prompts = getPrompts();\n const prompt = prompts.find(p => p.name === name);\n\n if (!prompt) {\n throw new Error(`Unknown prompt: ${name}`);\n }\n\n // Validate required arguments\n for (const arg of prompt.arguments || []) {\n if (arg.required && !args[arg.name]) {\n throw new Error(`Missing required argument: ${arg.name}`);\n }\n }\n\n // Generate messages based on prompt type\n switch (name) {\n case 'how_to_use_protokoll':\n return generateHowToUseProtokolPrompt(args);\n case 'transcribe_with_context':\n return generateTranscribePrompt(args);\n case 'setup_project':\n return generateSetupProjectPrompt(args);\n case 'review_transcript':\n return generateReviewTranscriptPrompt(args);\n case 'identify_tasks_from_transcript':\n return generateIdentifyTasksFromTranscriptPrompt(args);\n case 'summarize_transcript':\n return generateSummarizeTranscriptPrompt(args);\n case 'enrich_entity':\n return generateEnrichEntityPrompt(args);\n case 'batch_transcription':\n return generateBatchTranscriptionPrompt(args);\n case 'find_and_analyze':\n return generateFindAndAnalyzePrompt(args);\n case 'edit_entity':\n return generateEditEntityPrompt(args);\n default:\n throw new Error(`Prompt handler not implemented: ${name}`);\n }\n}\n\n// ============================================================================\n// Prompt Generators\n// ============================================================================\n\nasync function generateHowToUseProtokolPrompt(\n _args: Record<string, string>\n): Promise<McpPromptMessage[]> {\n const template = loadTemplate('how_to_use_protokoll');\n\n return [\n {\n role: 'user',\n content: {\n type: 'text',\n text: template,\n },\n },\n ];\n}\n\nasync function generateTranscribePrompt(\n args: Record<string, string>\n): Promise<McpPromptMessage[]> {\n const audioFile = args.audioFile;\n const skipDiscovery = args.skipDiscovery === 'true';\n\n if (!audioFile) {\n throw new Error('audioFile is required');\n }\n\n let discoverySection = '';\n\n if (skipDiscovery) {\n discoverySection = `I'll transcribe ${audioFile} using the current context configuration.\\n\\nWould you like me to start the transcription?`;\n } else {\n // Perform basic context discovery\n const audioPath = resolve(audioFile);\n\n try {\n await stat(audioPath);\n\n const context = await createPromptContext(dirname(audioPath));\n\n if (context.hasContext()) {\n const dirs = context.getDiscoveredDirs();\n const projects = context.getAllProjects().filter((p: { active?: boolean }) => p.active !== false);\n\n discoverySection = `## Context Discovery\\n\\n` +\n `**Configuration:** ${dirs[0]?.path}\\n` +\n `**Projects:** ${projects.length} active\\n` +\n `**Context URI:** ${buildConfigUri(dirs[0]?.path)}\\n` +\n `**Projects URI:** ${buildEntitiesListUri('project')}\\n\\n` +\n `Ready to transcribe with context-aware enhancement.`;\n } else {\n discoverySection = `## No Context Found\\n\\nProcessing without context (basic transcription only).`;\n }\n } catch {\n discoverySection = `## File Check Failed\\n\\nUnable to access: ${audioFile}`;\n }\n }\n\n const template = loadTemplate('transcribe_with_context');\n const content = fillTemplate(template, { audioFile, discoverySection });\n\n return [\n {\n role: 'user',\n content: {\n type: 'text',\n text: content,\n },\n },\n ];\n}\n\nasync function generateSetupProjectPrompt(\n args: Record<string, string>\n): Promise<McpPromptMessage[]> {\n const projectName = args.projectName;\n\n if (!projectName) {\n throw new Error('projectName is required');\n }\n\n const sourceUrlLine = args.sourceUrl\n ? `\\n - sourceUrl: \"${args.sourceUrl}\" (for metadata analysis)`\n : '';\n const destinationLine = args.destination\n ? `\\n - destination: \"${args.destination}\"`\n : '';\n\n const template = loadTemplate('setup_project');\n const content = fillTemplate(template, {\n projectName,\n sourceUrlLine,\n destinationLine\n });\n\n return [\n {\n role: 'user',\n content: {\n type: 'text',\n text: content,\n },\n },\n ];\n}\n\nasync function generateReviewTranscriptPrompt(\n args: Record<string, string>\n): Promise<McpPromptMessage[]> {\n const transcriptPath = args.transcriptPath;\n\n if (!transcriptPath) {\n throw new Error('transcriptPath is required');\n }\n\n const focusArea = args.focusArea || 'all';\n const focusText = focusArea === 'all' ? 'All corrections' : focusArea;\n\n const template = loadTemplate('review_transcript');\n const content = fillTemplate(template, {\n transcriptPath,\n focusArea: focusText\n });\n\n return [\n {\n role: 'user',\n content: {\n type: 'text',\n text: content,\n },\n },\n ];\n}\n\nasync function generateIdentifyTasksFromTranscriptPrompt(\n args: Record<string, string>\n): Promise<McpPromptMessage[]> {\n const transcriptPath = args.transcriptPath;\n if (!transcriptPath) {\n throw new Error('transcriptPath is required');\n }\n\n const maxCandidates = args.maxCandidates?.trim() || '25';\n const includeTagSuggestions = args.includeTagSuggestions?.trim() || 'true';\n\n const template = loadTemplate('identify_tasks_from_transcript');\n const content = fillTemplate(template, {\n transcriptPath,\n maxCandidates,\n includeTagSuggestions,\n });\n\n return [\n {\n role: 'user',\n content: {\n type: 'text',\n text: content,\n },\n },\n ];\n}\n\nasync function generateSummarizeTranscriptPrompt(\n args: Record<string, string>\n): Promise<McpPromptMessage[]> {\n const transcriptPath = args.transcriptPath;\n const audience = args.audience;\n\n if (!transcriptPath) {\n throw new Error('transcriptPath is required');\n }\n if (!audience) {\n throw new Error('audience is required');\n }\n\n const presetMap: Record<string, { label: string; instructions: string }> = {\n quick_bullets: {\n label: 'Quick paragraph + bullet points',\n instructions: 'Write one concise paragraph followed by 4-8 bullets covering decisions, actions, and risks.',\n },\n detailed: {\n label: 'Detailed summary',\n instructions: 'Write a structured summary with context, key discussion points, decisions, open questions, and next steps.',\n },\n attendee_facing: {\n label: 'Attendee-facing summary',\n instructions: 'Write a professional external-facing summary suitable for attendees; avoid private/internal reflections unless explicitly approved.',\n },\n };\n const presetKey = (args.stylePreset || 'detailed').trim();\n const selectedPreset = presetMap[presetKey] ?? presetMap.detailed;\n\n const summaryTitleLine = args.summaryTitle?.trim()\n ? `- Target title: \"${args.summaryTitle.trim()}\"`\n : '- Target title: (auto-generate from transcript title and date)';\n const guidanceBlock = args.guidance?.trim()\n ? args.guidance.trim()\n : 'No extra guidance provided.';\n\n const template = loadTemplate('summarize_transcript');\n const content = fillTemplate(template, {\n transcriptPath,\n audience: audience.trim(),\n styleLabel: selectedPreset.label,\n styleInstructions: selectedPreset.instructions,\n summaryTitleLine,\n guidanceBlock,\n });\n\n return [\n {\n role: 'user',\n content: {\n type: 'text',\n text: content,\n },\n },\n ];\n}\n\nasync function generateEnrichEntityPrompt(\n args: Record<string, string>\n): Promise<McpPromptMessage[]> {\n const template = loadTemplate('enrich_entity');\n const content = fillTemplate(template, args);\n\n return [\n {\n role: 'user',\n content: {\n type: 'text',\n text: content,\n },\n },\n ];\n}\n\nasync function generateBatchTranscriptionPrompt(\n args: Record<string, string>\n): Promise<McpPromptMessage[]> {\n const template = loadTemplate('batch_transcription');\n const content = fillTemplate(template, args);\n\n return [\n {\n role: 'user',\n content: {\n type: 'text',\n text: content,\n },\n },\n ];\n}\n\nasync function generateFindAndAnalyzePrompt(\n args: Record<string, string>\n): Promise<McpPromptMessage[]> {\n const template = loadTemplate('find_and_analyze');\n const content = fillTemplate(template, args);\n\n return [\n {\n role: 'user',\n content: {\n type: 'text',\n text: content,\n },\n },\n ];\n}\n\nasync function generateEditEntityPrompt(\n args: Record<string, string>\n): Promise<McpPromptMessage[]> {\n const entityType = args.entityType;\n const entityId = args.entityId;\n const modification = args.modification || '';\n\n if (!entityType || !entityId) {\n throw new Error('entityType and entityId are required');\n }\n\n const userMessage = modification\n ? `I want to edit the ${entityType} \"${entityId}\": ${modification}`\n : `I want to edit the ${entityType} \"${entityId}\"`;\n\n let entityGuidance = '';\n\n // Provide guidance based on entity type\n if (entityType === 'person') {\n entityGuidance = `**Available modifications for people:**\\n` +\n `- \\`name\\`, \\`firstName\\`, \\`lastName\\` - Update name fields\\n` +\n `- \\`company\\`, \\`role\\`, \\`context\\` - Update association info\\n` +\n `- \\`sounds_like\\` - Replace all phonetic variants\\n` +\n `- \\`add_sounds_like\\` - Add new phonetic variants\\n` +\n `- \\`remove_sounds_like\\` - Remove specific variants\\n\\n` +\n `**To proceed:**\\n` +\n `1. First, call \\`protokoll_get_entity\\` to see current values:\\n` +\n ` - entityType: \"person\"\\n` +\n ` - entityId: \"${entityId}\"\\n\\n` +\n `2. Then call \\`protokoll_edit_person\\` with the changes:\\n` +\n ` - id: \"${entityId}\"\\n` +\n ` - [your modifications]\\n`;\n } else if (entityType === 'term') {\n entityGuidance = `**Available modifications for terms:**\\n` +\n `- \\`expansion\\`, \\`domain\\`, \\`description\\` - Update basic fields\\n` +\n `- \\`sounds_like\\` - Replace all phonetic variants\\n` +\n `- \\`add_sounds_like\\` - Add new phonetic variants\\n` +\n `- \\`remove_sounds_like\\` - Remove specific variants\\n` +\n `- \\`topics\\` / \\`add_topics\\` / \\`remove_topics\\` - Modify topic keywords\\n` +\n `- \\`projects\\` / \\`add_projects\\` / \\`remove_projects\\` - Modify project associations\\n\\n` +\n `**To proceed:**\\n` +\n `1. First, call \\`protokoll_get_entity\\` to see current values:\\n` +\n ` - entityType: \"term\"\\n` +\n ` - entityId: \"${entityId}\"\\n\\n` +\n `2. Then call \\`protokoll_edit_term\\` with the changes:\\n` +\n ` - id: \"${entityId}\"\\n` +\n ` - [your modifications]\\n`;\n } else if (entityType === 'project') {\n entityGuidance = `**Available modifications for projects:**\\n` +\n `- \\`name\\`, \\`description\\` - Update basic info\\n` +\n `- \\`destination\\`, \\`structure\\` - Update routing\\n` +\n `- \\`contextType\\`, \\`active\\` - Update classification\\n` +\n `- \\`sounds_like\\` / \\`add_sounds_like\\` / \\`remove_sounds_like\\` - Phonetic variants\\n` +\n `- \\`topics\\` / \\`add_topics\\` / \\`remove_topics\\` - Topic keywords\\n` +\n `- \\`explicit_phrases\\` / \\`add_explicit_phrases\\` / \\`remove_explicit_phrases\\` - Trigger phrases\\n\\n` +\n `**To proceed:**\\n` +\n `1. First, call \\`protokoll_get_entity\\` to see current values:\\n` +\n ` - entityType: \"project\"\\n` +\n ` - entityId: \"${entityId}\"\\n\\n` +\n `2. Then call \\`protokoll_edit_project\\` with the changes:\\n` +\n ` - id: \"${entityId}\"\\n` +\n ` - [your modifications]\\n`;\n } else {\n entityGuidance = `**Note:** Entity type \"${entityType}\" does not support direct editing.\\n` +\n `Supported types: person, term, project\\n`;\n }\n\n const modificationNote = modification\n ? `\\n**Requested modification:** \"${modification}\"\\nWould you like me to retrieve the current entity and apply this change?`\n : '';\n\n const template = loadTemplate('edit_entity');\n const content = fillTemplate(template, {\n userMessage,\n entityType,\n entityId,\n entityGuidance,\n modificationNote\n });\n\n return [\n {\n role: 'user',\n content: {\n type: 'text',\n text: content,\n },\n },\n ];\n}\n\n// ============================================================================\n// MCP Protocol Handlers\n// ============================================================================\n\n/**\n * Export prompts list for testing and handler\n */\nexport const prompts = getPrompts();\n\n/**\n * Handle ListPrompts request\n */\nexport function handleListPrompts() {\n return { prompts };\n}\n\n/**\n * Handle GetPrompt request\n */\nexport async function handleGetPrompt(name: string, args: Record<string, string>) {\n const messages = await getPrompt(name, args);\n return { messages };\n}\n","/**\n * Discovery Tools - Configuration discovery and project suggestion\n */\n// eslint-disable-next-line import/extensions\nimport type { Tool } from '@modelcontextprotocol/sdk/types.js';\nimport { resolve, dirname } from 'node:path';\nimport { stat } from 'node:fs/promises';\nimport * as Context from '@/context';\nimport { fileExists, sanitizePath, type DiscoveredConfig, type ProjectSuggestion } from './shared';\n\n// ============================================================================\n// Helper Functions\n// ============================================================================\n\n/**\n * Walk up the directory tree from a starting path to find .protokoll directories\n */\nexport async function findProtokolkConfigs(startPath: string, maxLevels: number = 10): Promise<string[]> {\n const configs: string[] = [];\n let currentPath = resolve(startPath);\n let levels = 0;\n\n while (levels < maxLevels) {\n const protokollPath = resolve(currentPath, '.protokoll');\n if (await fileExists(protokollPath)) {\n configs.push(protokollPath);\n }\n\n const parentPath = dirname(currentPath);\n if (parentPath === currentPath) break; // Reached root\n currentPath = parentPath;\n levels++;\n }\n\n return configs;\n}\n\n/**\n * Get information about a .protokoll configuration\n */\nexport async function getConfigInfo(protokollPath: string): Promise<DiscoveredConfig> {\n const context = await Context.create({ startingDir: dirname(protokollPath) });\n const config = context.getConfig();\n\n return {\n path: protokollPath,\n projectCount: context.getAllProjects().length,\n peopleCount: context.getAllPeople().length,\n termsCount: context.getAllTerms().length,\n companiesCount: context.getAllCompanies().length,\n outputDirectory: config.outputDirectory as string | undefined,\n model: config.model as string | undefined,\n };\n}\n\n/**\n * Suggest which project an audio file might belong to based on its location\n */\nexport async function suggestProjectsForFile(audioFile: string): Promise<{\n configs: DiscoveredConfig[];\n suggestions: ProjectSuggestion[];\n needsUserInput: boolean;\n message: string;\n}> {\n const audioPath = resolve(audioFile);\n const audioDir = dirname(audioPath);\n\n // Find all .protokoll configs in the hierarchy\n const configPaths = await findProtokolkConfigs(audioDir);\n\n if (configPaths.length === 0) {\n return {\n configs: [],\n suggestions: [],\n needsUserInput: true,\n message: `No .protokoll configuration found for ${audioFile}. ` +\n 'You can either: (1) Create a .protokoll directory with project configuration, ' +\n 'or (2) Specify a contextDirectory when calling protokoll_process_audio.',\n };\n }\n\n // Get info about each config\n const configs: DiscoveredConfig[] = [];\n const allSuggestions: ProjectSuggestion[] = [];\n\n for (const configPath of configPaths) {\n const info = await getConfigInfo(configPath);\n configs.push(info);\n\n // Get context to check projects\n const context = await Context.create({ startingDir: dirname(configPath) });\n const projects = context.getAllProjects().filter(p => p.active !== false);\n\n for (const project of projects) {\n // Check if the audio file's path matches any project's destination\n const destination = project.routing?.destination;\n if (destination) {\n const expandedDest = destination.startsWith('~')\n ? destination.replace('~', process.env.HOME || '')\n : destination;\n\n if (audioDir.includes(expandedDest) || expandedDest.includes(audioDir)) {\n allSuggestions.push({\n projectId: project.id,\n projectName: project.name,\n confidence: 0.9,\n reason: `Audio file is in or near project destination: ${destination}`,\n destination,\n });\n }\n }\n\n // Check if project has associated directories/paths\n if (project.classification?.explicit_phrases) {\n // Check if any phrases match the directory name\n const dirName = audioDir.split('/').pop() || '';\n for (const phrase of project.classification.explicit_phrases) {\n if (dirName.toLowerCase().includes(phrase.toLowerCase())) {\n allSuggestions.push({\n projectId: project.id,\n projectName: project.name,\n confidence: 0.7,\n reason: `Directory name matches project phrase: \"${phrase}\"`,\n destination: project.routing?.destination,\n });\n }\n }\n }\n }\n }\n\n // Deduplicate and sort suggestions by confidence\n const uniqueSuggestions = allSuggestions\n .filter((s, i, arr) => arr.findIndex(x => x.projectId === s.projectId) === i)\n .sort((a, b) => b.confidence - a.confidence);\n\n if (uniqueSuggestions.length === 0) {\n return {\n configs,\n suggestions: [],\n needsUserInput: configs[0].projectCount > 0,\n message: configs[0].projectCount > 0\n ? `Found ${configs[0].projectCount} projects but couldn't automatically determine which one this file belongs to. ` +\n 'Please specify the project or let me list them for you.'\n : 'Configuration found but no projects defined. Transcripts will use default routing.',\n };\n }\n\n if (uniqueSuggestions.length === 1 && uniqueSuggestions[0].confidence >= 0.8) {\n return {\n configs,\n suggestions: uniqueSuggestions,\n needsUserInput: false,\n message: `Detected project: ${uniqueSuggestions[0].projectName} (${uniqueSuggestions[0].reason})`,\n };\n }\n\n return {\n configs,\n suggestions: uniqueSuggestions,\n needsUserInput: true,\n message: `Found ${uniqueSuggestions.length} possible projects. Please confirm which project this file belongs to.`,\n };\n}\n\n// ============================================================================\n// Tool Definitions\n// ============================================================================\n\nexport const discoverConfigTool: Tool = {\n name: 'protokoll_discover_config',\n description:\n 'Discover Protokoll configurations for a given file or directory. ' +\n 'Walks up the directory tree to find .protokoll directories and returns information about each, ' +\n 'including project counts, people, terms, and output settings. ' +\n 'ALWAYS call this first when asked to transcribe a file to understand the available context. ' +\n 'This helps determine which project configuration to use.',\n inputSchema: {\n type: 'object',\n properties: {\n path: {\n type: 'string',\n description: 'Path to a file or directory to search from (searches up the tree)',\n },\n },\n required: ['path'],\n },\n};\n\nexport const suggestProjectTool: Tool = {\n name: 'protokoll_suggest_project',\n description:\n 'Suggest which project(s) an audio file might belong to based on its location. ' +\n 'Analyzes the file path against configured projects to determine the best match. ' +\n 'Returns suggestions with confidence levels and reasons. ' +\n 'If multiple projects match or no clear match is found, the response indicates that user input is needed.',\n inputSchema: {\n type: 'object',\n properties: {\n audioFile: {\n type: 'string',\n description: 'Path to the audio file to analyze',\n },\n },\n required: ['audioFile'],\n },\n};\n\n// ============================================================================\n// Tool Handlers\n// ============================================================================\n\nexport async function handleDiscoverConfig(args: { path: string }) {\n const searchPath = resolve(args.path);\n\n // Check if path exists\n if (!await fileExists(searchPath)) {\n throw new Error(`Path not found: ${searchPath}`);\n }\n\n // Determine if it's a file or directory\n const pathStat = await stat(searchPath);\n const startDir = pathStat.isDirectory() ? searchPath : dirname(searchPath);\n\n // Find all .protokoll configs\n const configPaths = await findProtokolkConfigs(startDir);\n\n // Get workspace root for path sanitization\n const ServerConfig = await import('../serverConfig');\n const workspaceRoot = ServerConfig.getWorkspaceRoot() || process.cwd();\n\n if (configPaths.length === 0) {\n // Sanitize searchedFrom path\n const sanitizedSearchedFrom = await sanitizePath(startDir, workspaceRoot);\n return {\n found: false,\n searchedFrom: sanitizedSearchedFrom,\n configs: [],\n message: 'No .protokoll configuration found in the directory hierarchy. ' +\n 'To use Protokoll, create a .protokoll directory with your context files (people, projects, terms).',\n suggestion: 'Run \"protokoll --init-config\" in your project directory to create initial configuration.',\n };\n }\n\n // Get info about each config and sanitize paths\n const configs: DiscoveredConfig[] = [];\n for (const configPath of configPaths) {\n const info = await getConfigInfo(configPath);\n // Sanitize the path in the config info\n const sanitizedPath = await sanitizePath(info.path, workspaceRoot);\n configs.push({\n ...info,\n path: sanitizedPath,\n });\n }\n\n // Primary config is the one closest to the search path\n const primaryConfig = configs[0];\n\n // Sanitize searchedFrom and primaryConfig paths\n const sanitizedSearchedFrom = await sanitizePath(startDir, workspaceRoot);\n\n return {\n found: true,\n searchedFrom: sanitizedSearchedFrom,\n primaryConfig: primaryConfig.path,\n configs,\n summary: {\n totalProjects: configs.reduce((sum, c) => sum + c.projectCount, 0),\n totalPeople: configs.reduce((sum, c) => sum + c.peopleCount, 0),\n totalTerms: configs.reduce((sum, c) => sum + c.termsCount, 0),\n totalCompanies: configs.reduce((sum, c) => sum + c.companiesCount, 0),\n },\n message: configs.length === 1\n ? `Found Protokoll configuration at ${primaryConfig.path}`\n : `Found ${configs.length} Protokoll configurations (using nearest: ${primaryConfig.path})`,\n };\n}\n\nexport async function handleSuggestProject(args: { audioFile: string }) {\n const audioFile = resolve(args.audioFile);\n\n if (!await fileExists(audioFile)) {\n throw new Error(`Audio file not found: ${audioFile}`);\n }\n\n const result = await suggestProjectsForFile(audioFile);\n\n return {\n audioFile,\n ...result,\n instructions: result.needsUserInput\n ? 'Please specify which project this file belongs to, or let me list available projects.'\n : 'Ready to process with the detected project configuration.',\n };\n}\n","/**\n * Audio Processing Tools - Process audio files through transcription pipeline\n */\n// eslint-disable-next-line import/extensions\nimport type { Tool } from '@modelcontextprotocol/sdk/types.js';\nimport { resolve, join, basename } from 'node:path';\nimport { mkdir, writeFile } from 'node:fs/promises';\nimport { tmpdir } from 'node:os';\nimport { glob } from 'glob';\nimport { Pipeline } from '@redaksjon/protokoll-engine';\nimport {\n DEFAULT_AUDIO_EXTENSIONS,\n DEFAULT_OUTPUT_STRUCTURE,\n DEFAULT_OUTPUT_FILENAME_OPTIONS,\n DEFAULT_MAX_AUDIO_SIZE,\n DEFAULT_INTERMEDIATE_DIRECTORY,\n DEFAULT_MODEL,\n DEFAULT_TRANSCRIPTION_MODEL,\n DEFAULT_REASONING_LEVEL,\n DEFAULT_TEMP_DIRECTORY,\n} from '@/constants';\nimport { fileExists, getAudioMetadata, getConfiguredDirectory, sanitizePath, type ProcessingResult } from './shared';\n\n// ============================================================================\n// Helper Functions\n// ============================================================================\n\n/**\n * Find an audio file by filename or partial filename\n * Searches in the workspace's configured input directory\n */\nasync function findAudioFile(\n filenameOrPath: string\n): Promise<string> {\n // If it's already an absolute path that exists, use it\n if (filenameOrPath.startsWith('/') && await fileExists(filenameOrPath)) {\n return filenameOrPath;\n }\n\n const ServerConfig = await import('../serverConfig');\n const inputStorage = ServerConfig.getInputStorage();\n\n // Get the input directory from workspace config\n const inputDirectory = await getConfiguredDirectory('inputDirectory');\n \n // Search for the audio file\n const entries = await inputStorage.listFiles('.');\n const matches: string[] = [];\n \n for (const entry of entries) {\n const filename = basename(entry);\n const ext = filename.split('.').pop()?.toLowerCase();\n \n // Check if it's an audio file\n if (ext && DEFAULT_AUDIO_EXTENSIONS.includes(ext)) {\n // Check if filename matches\n if (filename === filenameOrPath || \n filename.includes(filenameOrPath) ||\n basename(filename, `.${ext}`) === filenameOrPath) {\n matches.push(entry);\n }\n }\n }\n\n if (matches.length === 0) {\n throw new Error(\n `No audio file found matching \"${filenameOrPath}\" in ${inputDirectory}. ` +\n `Try using the protokoll://audio/inbound resource to see available audio files.`\n );\n }\n\n if (matches.length === 1) {\n const matchedPath = matches[0];\n if (inputStorage.name === 'filesystem') {\n return join(inputDirectory, matchedPath);\n }\n const contents = await inputStorage.readFile(matchedPath);\n const tempRoot = join(tmpdir(), 'protokoll-gcs-input');\n await mkdir(tempRoot, { recursive: true });\n const tempPath = join(\n tempRoot,\n `${Date.now()}-${Math.random().toString(36).slice(2)}-${basename(matchedPath)}`\n );\n await writeFile(tempPath, contents);\n return tempPath;\n }\n\n // Multiple matches\n const matchNames = matches.map((m) => basename(m)).join(', ');\n throw new Error(\n `Multiple audio files match \"${filenameOrPath}\": ${matchNames}. ` +\n `Please be more specific.`\n );\n}\n\n// ============================================================================\n// Tool Definitions\n// ============================================================================\n\nexport const processAudioTool: Tool = {\n name: 'protokoll_process_audio',\n description:\n 'Process an audio file through Protokoll\\'s intelligent transcription pipeline. ' +\n 'You can provide either an absolute path OR just a filename/partial filename. ' +\n 'If you provide a filename, it will search in the workspace\\'s configured input directory. ' +\n 'This tool uses workspace-level configuration automatically - no need to specify directories. ' +\n 'Transcribes audio using Whisper, then enhances it with context-aware processing ' +\n 'that corrects names, terms, and routes the output to the appropriate project folder. ' +\n 'Returns the enhanced transcript text and output file path.',\n inputSchema: {\n type: 'object',\n properties: {\n audioFile: {\n type: 'string',\n description: \n 'Filename, partial filename, or absolute path to the audio file. ' +\n 'Examples: \"recording.m4a\", \"2026-01-29\", \"/full/path/to/audio.m4a\"',\n },\n projectId: {\n type: 'string',\n description: 'Specific project ID to use for routing (helpful when multiple projects exist)',\n },\n outputDirectory: {\n type: 'string',\n description: 'Override the workspace output directory',\n },\n model: {\n type: 'string',\n description: 'LLM model for enhancement (default: gpt-5.2)',\n },\n transcriptionModel: {\n type: 'string',\n description: 'Transcription model (default: whisper-1)',\n },\n },\n required: ['audioFile'],\n },\n};\n\nexport const batchProcessTool: Tool = {\n name: 'protokoll_batch_process',\n description:\n 'Process multiple audio files in a directory. ' +\n 'If no directory is specified, uses the workspace\\'s configured input directory. ' +\n 'This tool uses workspace-level configuration automatically - no need to specify directories. ' +\n 'Finds all audio files matching the configured extensions and processes them sequentially. ' +\n 'Returns a summary of all processed files with their output paths.',\n inputSchema: {\n type: 'object',\n properties: {\n inputDirectory: {\n type: 'string',\n description: \n 'Optional: Directory containing audio files. ' +\n 'If not specified, uses the workspace input directory.',\n },\n extensions: {\n type: 'array',\n items: { type: 'string' },\n description: 'Audio file extensions to process (default: [\".m4a\", \".mp3\", \".wav\", \".webm\"])',\n },\n outputDirectory: {\n type: 'string',\n description: 'Override the workspace output directory',\n },\n },\n required: [],\n },\n};\n\n// ============================================================================\n// Tool Handlers\n// ============================================================================\n\nexport async function handleProcessAudio(args: {\n audioFile: string;\n projectId?: string;\n outputDirectory?: string;\n model?: string;\n transcriptionModel?: string;\n}): Promise<ProcessingResult> {\n // Import server config\n const ServerConfig = await import('../serverConfig');\n \n // Find the audio file (handles both paths and filenames)\n const audioFile = await findAudioFile(args.audioFile);\n\n // Get workspace configuration\n const config = ServerConfig.getServerConfig();\n const context = config.context;\n \n if (!context) {\n throw new Error('Protokoll context not available. Ensure .protokoll directory exists in workspace.');\n }\n\n // Get configuration from context\n const contextConfig = context.getConfig();\n const outputDirectory = args.outputDirectory || config.outputDirectory;\n const outputStructure = (contextConfig.outputStructure as string) || DEFAULT_OUTPUT_STRUCTURE;\n const outputFilenameOptions = (contextConfig.outputFilenameOptions as string[]) || DEFAULT_OUTPUT_FILENAME_OPTIONS;\n const processedDirectory = config.processedDirectory ?? undefined;\n\n // Get audio file metadata (creation time and hash)\n const { creationTime, hash } = await getAudioMetadata(audioFile);\n\n // Get weight model service for pipeline integration\n const { getWeightModelService, updateTranscriptInWeightModel } = await import('../services/weightModel');\n const weightModelService = getWeightModelService();\n\n // Create pipeline\n const pipeline = await Pipeline.create({\n model: args.model || DEFAULT_MODEL,\n transcriptionModel: args.transcriptionModel || DEFAULT_TRANSCRIPTION_MODEL,\n reasoningLevel: DEFAULT_REASONING_LEVEL,\n interactive: false, // MCP is non-interactive\n selfReflection: false,\n silent: true,\n debug: false,\n dryRun: false,\n contextDirectory: config.workspaceRoot || undefined,\n intermediateDir: DEFAULT_INTERMEDIATE_DIRECTORY,\n keepIntermediates: false,\n outputDirectory,\n outputStructure,\n outputFilenameOptions,\n processedDirectory: processedDirectory || undefined,\n maxAudioSize: DEFAULT_MAX_AUDIO_SIZE,\n tempDirectory: DEFAULT_TEMP_DIRECTORY,\n weightModelProvider: weightModelService?.provider,\n onTranscriptEntitiesUpdated: (uuid: string, entityIds: string[], projectId?: string) => {\n updateTranscriptInWeightModel(uuid, entityIds, projectId);\n },\n });\n\n // Process through pipeline\n const result = await pipeline.process({\n audioFile,\n creation: creationTime,\n hash,\n });\n\n // Sanitize outputPath to ensure no absolute paths are exposed\n const sanitizedOutputPath = await sanitizePath(result.outputPath, outputDirectory);\n\n return {\n outputPath: sanitizedOutputPath,\n enhancedText: result.enhancedText,\n rawTranscript: result.rawTranscript,\n routedProject: result.routedProject ?? undefined,\n routingConfidence: result.routingConfidence,\n processingTime: result.processingTime,\n toolsUsed: result.toolsUsed,\n correctionsApplied: result.correctionsApplied,\n };\n}\n\nexport async function handleBatchProcess(args: {\n inputDirectory?: string;\n extensions?: string[];\n outputDirectory?: string;\n}): Promise<{ processed: ProcessingResult[]; errors: { file: string; error: string }[] }> {\n // Get directory from args or workspace config\n const inputDir = args.inputDirectory \n ? resolve(args.inputDirectory)\n : await getConfiguredDirectory('inputDirectory');\n \n const extensions = args.extensions || ['.m4a', '.mp3', '.wav', '.webm'];\n\n if (!await fileExists(inputDir)) {\n throw new Error(`Input directory not found: ${inputDir}`);\n }\n\n const patterns = extensions.map(ext => `**/*${ext}`);\n const files = await glob(patterns, { cwd: inputDir, nodir: true, absolute: true });\n\n if (files.length === 0) {\n return { processed: [], errors: [] };\n }\n\n const processed: ProcessingResult[] = [];\n const errors: { file: string; error: string }[] = [];\n\n for (const file of files) {\n try {\n const result = await handleProcessAudio({\n audioFile: file,\n outputDirectory: args.outputDirectory,\n });\n processed.push(result);\n } catch (error) {\n // Sanitize file path in error to ensure no absolute paths are exposed\n const sanitizedFile = await sanitizePath(file, inputDir);\n errors.push({\n file: sanitizedFile,\n error: error instanceof Error ? error.message : String(error),\n });\n }\n }\n\n return { processed, errors };\n}\n","/**\n * Context Management Tools - View and search context entities\n */\n// eslint-disable-next-line import/extensions\nimport type { Tool } from '@modelcontextprotocol/sdk/types.js';\nimport type { ContextInstance } from '@/context';\nimport type { Company, Entity, EntityType, Person, Project, Term } from '@/context/types';\nimport { formatEntity, createToolContext } from './shared';\nimport { listContextEntitiesFromGcs } from '../resources/entityIndexService';\nimport { resolveCanonicalEntityId } from '../util/scopedEntityId';\nimport { \n findPersonResilient, \n findCompanyResilient, \n findTermResilient, \n findProjectResilient,\n findIgnoredResilient \n} from '@redaksjon/protokoll-engine';\n\n/**\n * Get the context instance from ServerConfig, or create a new one if not available\n */\nasync function getContextInstance(contextDirectory?: string): Promise<ContextInstance> {\n // Import here to avoid circular dependencies\n const ServerConfig = await import('../serverConfig');\n \n // Validate that contextDirectory is not provided in remote mode\n if (contextDirectory && ServerConfig.isRemoteMode()) {\n throw new Error(\n 'contextDirectory parameter is not accepted in remote mode. ' +\n 'This server is pre-configured with workspace directories from protokoll-config.yaml. ' +\n 'Use the protokoll_info tool to check server configuration.'\n );\n }\n \n // If server has an initialized context, use it\n const serverContext = ServerConfig.getContext();\n if (serverContext?.hasContext()) {\n return serverContext;\n }\n \n // Fallback: create context using server config's contextDirectories\n return createToolContext(contextDirectory);\n}\n\nfunction normalizeProjectId(value: string | null | undefined): string {\n if (typeof value !== 'string') {\n return '';\n }\n return resolveCanonicalEntityId(value).trim().toLowerCase();\n}\n\nfunction createAllowedProjectSet(allowedProjectIds?: string[]): Set<string> {\n return new Set(\n (allowedProjectIds || [])\n .map((projectId) => normalizeProjectId(projectId))\n .filter((projectId) => projectId.length > 0)\n );\n}\n\nfunction isProjectInScope(projectId: string | null | undefined, allowedProjectIds: Set<string>): boolean {\n const normalized = normalizeProjectId(projectId);\n return normalized.length > 0 && allowedProjectIds.has(normalized);\n}\n\nfunction hasScopedProjectReference(projectIds: string[] | undefined, allowedProjectIds: Set<string>): boolean {\n return (projectIds || []).some((projectId) => isProjectInScope(projectId, allowedProjectIds));\n}\n\n/** Collapse duplicate rows that share the same canonical UUID (e.g. \"uuid\" vs \"server:uuid\"). */\nfunction dedupeByCanonicalEntityId<T extends { id: string }>(items: T[]): T[] {\n const groups = new Map<string, T[]>();\n for (const item of items) {\n const key = resolveCanonicalEntityId(item.id).toLowerCase();\n const arr = groups.get(key) ?? [];\n arr.push(item);\n groups.set(key, arr);\n }\n const out: T[] = [];\n for (const group of groups.values()) {\n if (group.length === 1) {\n out.push(group[0]);\n continue;\n }\n const preferred =\n group.find((r) => r.id === resolveCanonicalEntityId(r.id)) ?? group[0];\n out.push(preferred);\n }\n return out;\n}\n\nasync function loadProjects(context: ContextInstance): Promise<Project[]> {\n const projects = context.getAllProjects() as Project[];\n if (projects.length > 0) {\n return projects;\n }\n\n const gcsProjects = await listContextEntitiesFromGcs('project');\n return gcsProjects\n .map((project) => ({\n id: String(project.id || ''),\n name: String(project.name || ''),\n type: 'project' as const,\n active: project.active !== false,\n routing: typeof project.routing === 'object' && project.routing !== null\n ? project.routing as Record<string, unknown>\n : undefined,\n classification: typeof project.classification === 'object' && project.classification !== null\n ? project.classification as Record<string, unknown>\n : undefined,\n }))\n .filter((project) => project.id.length > 0 && project.name.length > 0)\n .map((project) => ({\n ...project,\n routing: {\n destination: project.routing?.destination as string | undefined,\n structure: project.routing?.structure as string | undefined,\n },\n classification: {\n context_type: project.classification?.context_type as string | undefined,\n explicit_phrases: project.classification?.explicit_phrases as string[] | undefined,\n associated_people: project.classification?.associated_people as string[] | undefined,\n associated_companies: project.classification?.associated_companies as string[] | undefined,\n },\n })) as Project[];\n}\n\nasync function loadPeople(context: ContextInstance): Promise<Person[]> {\n const people = context.getAllPeople() as Person[];\n if (people.length > 0) {\n return people;\n }\n\n const gcsPeople = await listContextEntitiesFromGcs('person');\n return gcsPeople\n .map((person) => ({\n id: String(person.id || ''),\n name: String(person.name || ''),\n type: 'person' as const,\n company: typeof person.company === 'string' ? person.company : undefined,\n role: typeof person.role === 'string' ? person.role : undefined,\n sounds_like: Array.isArray(person.sounds_like) ? person.sounds_like as string[] : undefined,\n }))\n .filter((person) => person.id.length > 0 && person.name.length > 0) as Person[];\n}\n\nasync function loadTerms(context: ContextInstance): Promise<Term[]> {\n const terms = context.getAllTerms() as Term[];\n if (terms.length > 0) {\n return terms;\n }\n\n const gcsTerms = await listContextEntitiesFromGcs('term');\n return gcsTerms\n .map((term) => ({\n id: String(term.id || ''),\n name: String(term.name || ''),\n type: 'term' as const,\n expansion: typeof term.expansion === 'string' ? term.expansion : undefined,\n domain: typeof term.domain === 'string' ? term.domain : undefined,\n sounds_like: Array.isArray(term.sounds_like) ? term.sounds_like as string[] : undefined,\n projects: Array.isArray(term.projects) ? term.projects.filter((value): value is string => typeof value === 'string') : undefined,\n }))\n .filter((term) => term.id.length > 0 && term.name.length > 0) as Term[];\n}\n\nasync function loadCompanies(context: ContextInstance): Promise<Company[]> {\n const companies = context.getAllCompanies() as Company[];\n if (companies.length > 0) {\n return companies;\n }\n\n const gcsCompanies = await listContextEntitiesFromGcs('company');\n return gcsCompanies\n .map((company) => ({\n id: String(company.id || ''),\n name: String(company.name || ''),\n type: 'company' as const,\n fullName: typeof company.fullName === 'string' ? company.fullName : undefined,\n industry: typeof company.industry === 'string' ? company.industry : undefined,\n sounds_like: Array.isArray(company.sounds_like) ? company.sounds_like as string[] : undefined,\n }))\n .filter((company) => company.id.length > 0 && company.name.length > 0) as Company[];\n}\n\ninterface ProjectScopeState {\n allowedProjectIds: Set<string>;\n projects: Project[];\n associatedPeople: Set<string>;\n associatedCompanies: Set<string>;\n}\n\nasync function buildProjectScopeState(\n context: ContextInstance,\n allowedProjectIds?: string[],\n): Promise<ProjectScopeState | null> {\n const allowedProjectSet = createAllowedProjectSet(allowedProjectIds);\n if (allowedProjectSet.size === 0) {\n return null;\n }\n\n const projects = (await loadProjects(context)).filter((project) => isProjectInScope(project.id, allowedProjectSet));\n const associatedPeople = new Set<string>();\n const associatedCompanies = new Set<string>();\n\n for (const project of projects) {\n for (const personId of project.classification?.associated_people || []) {\n associatedPeople.add(personId);\n }\n for (const companyId of project.classification?.associated_companies || []) {\n associatedCompanies.add(companyId);\n }\n }\n\n return {\n allowedProjectIds: allowedProjectSet,\n projects,\n associatedPeople,\n associatedCompanies,\n };\n}\n\nfunction isEntityVisibleInProjectScope(entity: Entity, scope: ProjectScopeState): boolean {\n switch (entity.type) {\n case 'project':\n return isProjectInScope(entity.id, scope.allowedProjectIds);\n case 'person':\n return scope.associatedPeople.has(entity.id);\n case 'company':\n return scope.associatedCompanies.has(entity.id);\n case 'term':\n return hasScopedProjectReference((entity as Term).projects, scope.allowedProjectIds);\n default:\n return false;\n }\n}\n\n// ============================================================================\n// Tool Definitions\n// ============================================================================\n\nexport const contextStatusTool: Tool = {\n name: 'protokoll_context_status',\n description:\n 'Get the status of the Protokoll context system. ' +\n 'Shows discovered .protokoll directories, entity counts, and configuration status. ' +\n 'Use this to understand what context is available for transcription enhancement.',\n inputSchema: {\n type: 'object',\n properties: {\n contextDirectory: {\n type: 'string',\n description: 'Path to start searching for .protokoll directories (default: cwd)',\n },\n },\n required: [],\n },\n};\n\nexport const listProjectsTool: Tool = {\n name: 'protokoll_list_projects',\n description:\n 'List all projects configured in the context. ' +\n 'Projects define routing rules for where transcripts should be saved ' +\n 'and what classification signals trigger them.',\n inputSchema: {\n type: 'object',\n properties: {\n contextDirectory: {\n type: 'string',\n description: 'Path to the .protokoll context directory',\n },\n includeInactive: {\n type: 'boolean',\n description: 'Include inactive projects (default: false)',\n },\n limit: {\n type: 'number',\n description: 'Maximum number of results to return (default: 50)',\n },\n offset: {\n type: 'number',\n description: 'Number of results to skip for pagination (default: 0)',\n },\n search: {\n type: 'string',\n description: 'Filter by name/ID substring match (case-insensitive)',\n },\n },\n required: [],\n },\n};\n\nexport const listPeopleTool: Tool = {\n name: 'protokoll_list_people',\n description:\n 'List all people configured in the context. ' +\n 'People entries help Protokoll recognize and correctly spell names that ' +\n 'Whisper might mishear (using sounds_like phonetic variants).',\n inputSchema: {\n type: 'object',\n properties: {\n contextDirectory: {\n type: 'string',\n description: 'Path to the .protokoll context directory',\n },\n limit: {\n type: 'number',\n description: 'Maximum number of results to return (default: 50)',\n },\n offset: {\n type: 'number',\n description: 'Number of results to skip for pagination (default: 0)',\n },\n search: {\n type: 'string',\n description: 'Filter by name/ID substring match (case-insensitive)',\n },\n },\n required: [],\n },\n};\n\nexport const listTermsTool: Tool = {\n name: 'protokoll_list_terms',\n description:\n 'List all technical terms and abbreviations in the context. ' +\n 'Terms help Protokoll correctly transcribe domain-specific vocabulary.',\n inputSchema: {\n type: 'object',\n properties: {\n contextDirectory: {\n type: 'string',\n description: 'Path to the .protokoll context directory',\n },\n limit: {\n type: 'number',\n description: 'Maximum number of results to return (default: 50)',\n },\n offset: {\n type: 'number',\n description: 'Number of results to skip for pagination (default: 0)',\n },\n search: {\n type: 'string',\n description: 'Filter by name/ID substring match (case-insensitive)',\n },\n },\n required: [],\n },\n};\n\nexport const listCompaniesTool: Tool = {\n name: 'protokoll_list_companies',\n description:\n 'List all companies configured in the context. ' +\n 'Company entries help recognize organization names in transcripts.',\n inputSchema: {\n type: 'object',\n properties: {\n contextDirectory: {\n type: 'string',\n description: 'Path to the .protokoll context directory',\n },\n limit: {\n type: 'number',\n description: 'Maximum number of results to return (default: 50)',\n },\n offset: {\n type: 'number',\n description: 'Number of results to skip for pagination (default: 0)',\n },\n search: {\n type: 'string',\n description: 'Filter by name/ID substring match (case-insensitive)',\n },\n },\n required: [],\n },\n};\n\nexport const searchContextTool: Tool = {\n name: 'protokoll_search_context',\n description:\n 'Search across all context entity types (projects, people, terms, companies). ' +\n 'Returns matching entities with their type and key details.',\n inputSchema: {\n type: 'object',\n properties: {\n query: {\n type: 'string',\n description: 'Search query to match against entity names, IDs, and sounds_like variants',\n },\n contextDirectory: {\n type: 'string',\n description: 'Path to the .protokoll context directory',\n },\n limit: {\n type: 'number',\n description: 'Maximum number of results to return (default: 50)',\n },\n offset: {\n type: 'number',\n description: 'Number of results to skip for pagination (default: 0)',\n },\n },\n required: ['query'],\n },\n};\n\nexport const getEntityTool: Tool = {\n name: 'protokoll_get_entity',\n description:\n 'Get detailed information about a specific context entity. ' +\n 'Returns the full YAML configuration including sounds_like variants, routing, etc.',\n inputSchema: {\n type: 'object',\n properties: {\n entityType: {\n type: 'string',\n enum: ['project', 'person', 'term', 'company', 'ignored'],\n description: 'Type of entity to retrieve',\n },\n entityId: {\n type: 'string',\n description: 'ID of the entity to retrieve',\n },\n contextDirectory: {\n type: 'string',\n description: 'Path to the .protokoll context directory',\n },\n },\n required: ['entityType', 'entityId'],\n },\n};\n\nexport const predictEntitiesTool: Tool = {\n name: 'protokoll_predict_entities',\n description:\n 'Predict likely entities based on transcript context using weight model. ' +\n 'Returns ranked entity suggestions based on co-occurrence patterns and project affinity. ' +\n 'Useful for intelligent entity correction suggestions.',\n inputSchema: {\n type: 'object',\n properties: {\n transcriptPath: {\n type: 'string',\n description: 'Path to the transcript file',\n },\n maxPredictions: {\n type: 'number',\n description: 'Maximum number of predictions to return (default: 10)',\n minimum: 1,\n maximum: 50,\n },\n minScore: {\n type: 'number', \n description: 'Minimum prediction score (default: 1)',\n minimum: 0,\n },\n contextDirectory: {\n type: 'string',\n description: 'Path to the .protokoll context directory',\n },\n },\n required: ['transcriptPath'],\n },\n};\n\n// ============================================================================\n// Tool Handlers\n// ============================================================================\n\nexport async function handleContextStatus(args: { contextDirectory?: string; allowedProjectIds?: string[] }) {\n const context = await getContextInstance(args.contextDirectory);\n const scope = await buildProjectScopeState(context, args.allowedProjectIds);\n\n const dirs = context.getDiscoveredDirs();\n const config = context.getConfig();\n const projects = scope?.projects ?? await loadProjects(context);\n const people = scope\n ? (await loadPeople(context)).filter((person) => scope.associatedPeople.has(person.id))\n : await loadPeople(context);\n const terms = scope\n ? (await loadTerms(context)).filter((term) => hasScopedProjectReference(term.projects, scope.allowedProjectIds))\n : await loadTerms(context);\n const companies = scope\n ? (await loadCompanies(context)).filter((company) => scope.associatedCompanies.has(company.id))\n : await loadCompanies(context);\n\n return {\n hasContext: context.hasContext(),\n discoveredDirectories: dirs.map(d => ({\n path: d.path,\n level: d.level,\n isPrimary: d.level === 0,\n })),\n entityCounts: {\n projects: projects.length,\n people: people.length,\n terms: terms.length,\n companies: companies.length,\n ignored: scope ? 0 : context.getAllIgnored().length,\n },\n config: {\n outputDirectory: config.outputDirectory,\n outputStructure: config.outputStructure,\n model: config.model,\n },\n };\n}\n\nexport async function handleListProjects(args: { \n contextDirectory?: string; \n includeInactive?: boolean;\n limit?: number;\n offset?: number;\n search?: string;\n allowedProjectIds?: string[];\n}) {\n const context = await getContextInstance(args.contextDirectory);\n const scope = await buildProjectScopeState(context, args.allowedProjectIds);\n let projects = dedupeByCanonicalEntityId(scope?.projects ?? await loadProjects(context));\n if (!args.includeInactive) {\n projects = projects.filter(p => p.active !== false);\n }\n\n // Apply search filter\n if (args.search) {\n const searchLower = args.search.toLowerCase();\n projects = projects.filter(p => \n p.name.toLowerCase().includes(searchLower) ||\n p.id.toLowerCase().includes(searchLower)\n );\n }\n\n const total = projects.length;\n const limit = args.limit ?? 50;\n const offset = args.offset ?? 0;\n\n // Apply pagination\n const paginatedProjects = projects.slice(offset, offset + limit);\n\n return {\n total,\n limit,\n offset,\n count: paginatedProjects.length,\n projects: paginatedProjects.map(p => ({\n id: resolveCanonicalEntityId(p.id),\n name: p.name,\n active: p.active !== false,\n destination: p.routing?.destination,\n structure: p.routing?.structure,\n contextType: p.classification?.context_type,\n triggerPhrases: p.classification?.explicit_phrases,\n })),\n };\n}\n\nexport async function handleListPeople(args: { \n contextDirectory?: string;\n limit?: number;\n offset?: number;\n search?: string;\n allowedProjectIds?: string[];\n}) {\n const context = await getContextInstance(args.contextDirectory);\n const scope = await buildProjectScopeState(context, args.allowedProjectIds);\n let people = dedupeByCanonicalEntityId(await loadPeople(context));\n if (scope) {\n people = people.filter((person) => scope.associatedPeople.has(person.id));\n }\n\n // Apply search filter\n if (args.search) {\n const searchLower = args.search.toLowerCase();\n people = people.filter(p => \n p.name.toLowerCase().includes(searchLower) ||\n p.id.toLowerCase().includes(searchLower) ||\n p.sounds_like?.some(s => s.toLowerCase().includes(searchLower))\n );\n }\n\n const total = people.length;\n const limit = args.limit ?? 50;\n const offset = args.offset ?? 0;\n\n // Apply pagination\n const paginatedPeople = people.slice(offset, offset + limit);\n\n return {\n total,\n limit,\n offset,\n count: paginatedPeople.length,\n people: paginatedPeople.map(p => ({\n id: resolveCanonicalEntityId(p.id),\n name: p.name,\n company: p.company,\n role: p.role,\n sounds_like: p.sounds_like,\n })),\n };\n}\n\nexport async function handleListTerms(args: { \n contextDirectory?: string;\n limit?: number;\n offset?: number;\n search?: string;\n allowedProjectIds?: string[];\n}) {\n const context = await getContextInstance(args.contextDirectory);\n const scope = await buildProjectScopeState(context, args.allowedProjectIds);\n let terms = dedupeByCanonicalEntityId(await loadTerms(context));\n if (scope) {\n terms = terms.filter((term) => hasScopedProjectReference(term.projects, scope.allowedProjectIds));\n }\n\n // Apply search filter\n if (args.search) {\n const searchLower = args.search.toLowerCase();\n terms = terms.filter(t => \n t.name.toLowerCase().includes(searchLower) ||\n t.id.toLowerCase().includes(searchLower) ||\n t.sounds_like?.some(s => s.toLowerCase().includes(searchLower))\n );\n }\n\n const total = terms.length;\n const limit = args.limit ?? 50;\n const offset = args.offset ?? 0;\n\n // Apply pagination\n const paginatedTerms = terms.slice(offset, offset + limit);\n\n return {\n total,\n limit,\n offset,\n count: paginatedTerms.length,\n terms: paginatedTerms.map(t => ({\n id: resolveCanonicalEntityId(t.id),\n name: t.name,\n expansion: t.expansion,\n domain: t.domain,\n sounds_like: t.sounds_like,\n })),\n };\n}\n\nexport async function handleListCompanies(args: { \n contextDirectory?: string;\n limit?: number;\n offset?: number;\n search?: string;\n allowedProjectIds?: string[];\n}) {\n const context = await getContextInstance(args.contextDirectory);\n const scope = await buildProjectScopeState(context, args.allowedProjectIds);\n let companies = dedupeByCanonicalEntityId(await loadCompanies(context));\n if (scope) {\n companies = companies.filter((company) => scope.associatedCompanies.has(company.id));\n }\n\n // Apply search filter\n if (args.search) {\n const searchLower = args.search.toLowerCase();\n companies = companies.filter(c => \n c.name.toLowerCase().includes(searchLower) ||\n c.id.toLowerCase().includes(searchLower) ||\n c.sounds_like?.some(s => s.toLowerCase().includes(searchLower))\n );\n }\n\n const total = companies.length;\n const limit = args.limit ?? 50;\n const offset = args.offset ?? 0;\n\n // Apply pagination\n const paginatedCompanies = companies.slice(offset, offset + limit);\n\n return {\n total,\n limit,\n offset,\n count: paginatedCompanies.length,\n companies: paginatedCompanies.map(c => ({\n id: resolveCanonicalEntityId(c.id),\n name: c.name,\n fullName: c.fullName,\n industry: c.industry,\n sounds_like: c.sounds_like,\n })),\n };\n}\n\nexport async function handleSearchContext(args: { \n query: string; \n contextDirectory?: string;\n limit?: number;\n offset?: number;\n allowedProjectIds?: string[];\n}) {\n const context = await getContextInstance(args.contextDirectory);\n const scope = await buildProjectScopeState(context, args.allowedProjectIds);\n const results = scope\n ? context.search(args.query).filter((entity) => isEntityVisibleInProjectScope(entity, scope))\n : context.search(args.query);\n\n const total = results.length;\n const limit = args.limit ?? 50;\n const offset = args.offset ?? 0;\n\n // Apply pagination\n const paginatedResults = results.slice(offset, offset + limit);\n\n return {\n query: args.query,\n total,\n limit,\n offset,\n count: paginatedResults.length,\n results: paginatedResults.map(formatEntity),\n };\n}\n\nexport async function handleGetEntity(args: {\n entityType: EntityType;\n entityId: string;\n contextDirectory?: string;\n allowedProjectIds?: string[];\n}) {\n const context = await getContextInstance(args.contextDirectory);\n const scope = await buildProjectScopeState(context, args.allowedProjectIds);\n\n const entityId = resolveCanonicalEntityId(args.entityId.trim());\n\n let entity: Entity;\n switch (args.entityType) {\n case 'project':\n entity = findProjectResilient(context, entityId);\n break;\n case 'person':\n entity = findPersonResilient(context, entityId);\n break;\n case 'term':\n entity = findTermResilient(context, entityId);\n break;\n case 'company':\n entity = findCompanyResilient(context, entityId);\n break;\n case 'ignored':\n entity = findIgnoredResilient(context, entityId);\n break;\n default:\n throw new Error(`Unknown entity type: ${args.entityType}`);\n }\n\n if (scope && !isEntityVisibleInProjectScope(entity, scope)) {\n throw new Error(`Project-scoped key cannot access ${args.entityType} \"${entityId}\".`);\n }\n\n const filePath = context.getEntityFilePath(entity);\n\n return {\n ...formatEntity(entity),\n filePath,\n };\n}\n\nexport async function handlePredictEntities(args: {\n transcriptPath: string;\n maxPredictions?: number;\n minScore?: number;\n contextDirectory?: string;\n}) {\n // Import transcript utilities\n const { resolveTranscriptPath } = await import('./shared');\n const { Transcript: TranscriptUtils } = await import('@redaksjon/protokoll-engine');\n const { ensurePklExtension } = TranscriptUtils;\n const { PklTranscript } = await import('@redaksjon/protokoll-format');\n \n const absolutePath = await resolveTranscriptPath(args.transcriptPath, args.contextDirectory);\n const pklPath = ensurePklExtension(absolutePath);\n \n const transcript = PklTranscript.open(pklPath, { readOnly: true });\n const projectId = transcript.metadata.project;\n const entities = transcript.metadata.entities || {};\n \n // Extract entity IDs from transcript metadata\n const knownEntityIds = [\n ...(entities.people || []).map(e => e.id),\n ...(entities.projects || []).map(e => e.id), \n ...(entities.terms || []).map(e => e.id),\n ...(entities.companies || []).map(e => e.id)\n ];\n \n transcript.close();\n \n const { getWeightModelService } = await import('../services/weightModel');\n const service = getWeightModelService();\n \n if (!service?.isReady || !service.provider) {\n return { success: true, predictions: [] };\n }\n \n const predictions = service.provider.predictLikelyEntities({\n knownEntityIds,\n projectId,\n maxPredictions: args.maxPredictions || 10,\n minScore: args.minScore ?? 1\n });\n \n return { success: true, predictions };\n}\n\n// --- Project plan summaries (Riotplan / extended project YAML) ----------------------------\n\nconst PROJECT_PLAN_ARRAY_KEYS = ['related_plans', 'plans', 'riotplan_plans'] as const;\n\nfunction humanizePlanSlug(slug: string): string {\n const trimmed = slug.trim();\n const withoutPrefix = trimmed.replace(/^[0-9a-f]{8}-/i, '');\n const words = withoutPrefix.split(/[-_/]+/).filter(Boolean);\n if (words.length === 0) {\n return trimmed;\n }\n return words\n .map((w) => w.charAt(0).toUpperCase() + w.slice(1).toLowerCase())\n .join(' ');\n}\n\nfunction pickString(obj: Record<string, unknown>, keys: string[]): string {\n for (const k of keys) {\n const v = obj[k];\n if (typeof v === 'string' && v.trim().length > 0) {\n return v.trim();\n }\n }\n return '';\n}\n\nfunction pickCreatedMs(obj: Record<string, unknown>): number {\n const raw = pickString(obj, ['createdAt', 'created_at', 'created', 'date', 'startedAt', 'started_at']);\n if (!raw) {\n return NaN;\n }\n const t = Date.parse(raw);\n return Number.isNaN(t) ? NaN : t;\n}\n\nfunction normalizePlanRow(raw: unknown, index: number): {\n id: string;\n title: string;\n stage: string;\n createdAt: string | null;\n createdMs: number;\n} {\n if (typeof raw === 'string') {\n const id = raw.trim();\n return {\n id: id || `row-${index}`,\n title: humanizePlanSlug(id),\n stage: '',\n createdAt: null,\n createdMs: NaN,\n };\n }\n if (raw && typeof raw === 'object' && !Array.isArray(raw)) {\n const o = raw as Record<string, unknown>;\n const id =\n pickString(o, ['id', 'planId', 'plan_id', 'folder', 'slug', 'path', 'name']) || `row-${index}`;\n const explicitTitle = pickString(o, ['title', 'label', 'displayName', 'planTitle', 'summary']);\n const title =\n explicitTitle.length > 0\n ? explicitTitle\n : humanizePlanSlug(\n pickString(o, ['folder', 'slug', 'path', 'id', 'planId', 'plan_id']) || id,\n );\n const stage = pickString(o, ['stage', 'status', 'state', 'phase', 'category']);\n const createdRaw = pickString(o, ['createdAt', 'created_at', 'created', 'date', 'startedAt']);\n const createdMs = pickCreatedMs(o);\n return {\n id,\n title,\n stage,\n createdAt: createdRaw || null,\n createdMs,\n };\n }\n return {\n id: `row-${index}`,\n title: '',\n stage: '',\n createdAt: null,\n createdMs: NaN,\n };\n}\n\nfunction collectPlanRowsFromProjectRecord(record: Record<string, unknown>): unknown[] {\n const rows: unknown[] = [];\n for (const k of PROJECT_PLAN_ARRAY_KEYS) {\n const v = record[k];\n if (Array.isArray(v)) {\n rows.push(...v);\n }\n }\n return rows;\n}\n\nexport const listProjectPlansTool: Tool = {\n name: 'protokoll_list_project_plans',\n description:\n 'List plans associated with a project entity (from related_plans / plans / riotplan_plans on the project YAML). ' +\n 'Supports limit/offset pagination. Used by clients instead of embedding full plan lists in the project resource.',\n inputSchema: {\n type: 'object',\n properties: {\n projectId: {\n type: 'string',\n description: 'Project entity UUID',\n },\n limit: {\n type: 'number',\n description: 'Page size (default 25, max 100)',\n },\n offset: {\n type: 'number',\n description: 'Number of plans to skip (default 0)',\n },\n contextDirectory: {\n type: 'string',\n description: 'Path to the .protokoll context directory',\n },\n },\n required: ['projectId'],\n },\n};\n\nexport async function handleListProjectPlans(args: {\n projectId: string;\n limit?: number;\n offset?: number;\n contextDirectory?: string;\n allowedProjectIds?: string[];\n}) {\n const context = await getContextInstance(args.contextDirectory);\n const scope = await buildProjectScopeState(context, args.allowedProjectIds);\n\n const projectId = resolveCanonicalEntityId(args.projectId.trim());\n const entity = findProjectResilient(context, projectId);\n if (scope && !isEntityVisibleInProjectScope(entity, scope)) {\n throw new Error(`Project-scoped key cannot access project \"${projectId}\".`);\n }\n\n const record = entity as unknown as Record<string, unknown>;\n const allRows = collectPlanRowsFromProjectRecord(record);\n const normalized = allRows.map((r, i) => normalizePlanRow(r, i));\n normalized.sort((a, b) => {\n const da = Number.isNaN(a.createdMs) ? -Infinity : a.createdMs;\n const db = Number.isNaN(b.createdMs) ? -Infinity : b.createdMs;\n if (db !== da) {\n return db - da;\n }\n return a.title.localeCompare(b.title, undefined, { sensitivity: 'base' });\n });\n\n const limit = Math.min(100, Math.max(1, args.limit ?? 25));\n const offset = Math.max(0, args.offset ?? 0);\n const page = normalized.slice(offset, offset + limit);\n const plans = page.map((p) => ({\n id: p.id,\n title: p.title,\n stage: p.stage,\n createdAt: p.createdAt,\n }));\n\n return {\n total: normalized.length,\n limit,\n offset,\n count: plans.length,\n plans,\n };\n}\n","/* eslint-disable import/extensions */\n/**\n * Entity Tools - Create, update, delete, and manage context entities\n */\n \nimport { randomUUID } from 'crypto';\nimport type { Tool } from '@modelcontextprotocol/sdk/types.js';\nimport type { Person, Project, Term, Company, Entity, EntityRelationship } from '@/context/types';\nimport { \n findPersonResilient, \n findTermResilient, \n findCompanyResilient, \n findProjectResilient,\n findIgnoredResilient \n} from '@redaksjon/protokoll-engine';\n \nimport { formatEntity, slugify, mergeArray, createToolContext } from './shared.js';\nimport { markContextEntityIndexDirty } from '../resources/entityIndexService';\n\n/**\n * Check if a string is a valid UUID\n */\nfunction isValidUUID(str: string): boolean {\n const uuidRegex = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;\n return uuidRegex.test(str);\n}\n\nfunction resolveCanonicalEntityId(providedId: string | undefined): string {\n if (providedId === undefined) {\n return randomUUID();\n }\n const normalized = providedId.trim();\n if (!normalized) {\n return randomUUID();\n }\n if (!isValidUUID(normalized)) {\n throw new Error(`Invalid id \"${providedId}\". Entity IDs must be UUIDs.`);\n }\n return normalized;\n}\n\nasync function assertContextAvailableForEntityEdit(context: { hasContext(): boolean }): Promise<void> {\n if (context.hasContext()) {\n return;\n }\n\n const ServerConfig = await import('../serverConfig');\n if (ServerConfig.getStorageConfig().backend === 'gcs') {\n return;\n }\n\n throw new Error('No .protokoll directory found. Initialize context first.');\n}\n\nasync function markEntityIndexDirtyIfGcs(entityType?: 'person' | 'project' | 'term' | 'company' | 'ignored'): Promise<void> {\n const ServerConfig = await import('../serverConfig');\n if (ServerConfig.getStorageConfig().backend !== 'gcs') {\n return;\n }\n markContextEntityIndexDirty(entityType);\n}\n\n// ============================================================================\n// Tool Definitions\n// ============================================================================\n\nexport const addPersonTool: Tool = {\n name: 'protokoll_add_person',\n description:\n 'Add a new person to the context. ' +\n 'People entries help Protokoll recognize names that Whisper mishears. ' +\n 'Include sounds_like variants for phonetic matching.',\n inputSchema: {\n type: 'object',\n properties: {\n name: {\n type: 'string',\n description: 'Full name of the person',\n },\n id: {\n type: 'string',\n description: 'Unique ID (default: slugified name)',\n },\n firstName: {\n type: 'string',\n description: 'First name',\n },\n lastName: {\n type: 'string',\n description: 'Last name',\n },\n company: {\n type: 'string',\n description: 'Company ID this person is associated with',\n },\n role: {\n type: 'string',\n description: 'Role or job title',\n },\n sounds_like: {\n type: 'array',\n items: { type: 'string' },\n description: 'Phonetic variants (how Whisper might mishear the name)',\n },\n context: {\n type: 'string',\n description: 'Additional context about this person',\n },\n contextDirectory: {\n type: 'string',\n description: 'Path to the .protokoll context directory',\n },\n },\n required: ['name'],\n },\n};\n\nexport const editPersonTool: Tool = {\n name: 'protokoll_edit_person',\n description:\n 'Edit an existing person with manual modifications. ' +\n 'Allows direct edits: adding specific sounds_like variants, changing company, role, etc. ' +\n 'For the sounds_like array, use add_sounds_like to append or remove_sounds_like to delete specific values, ' +\n 'or use sounds_like to replace the entire array.',\n inputSchema: {\n type: 'object',\n properties: {\n id: {\n type: 'string',\n description: 'Person ID to edit',\n },\n name: {\n type: 'string',\n description: 'Update the display name',\n },\n firstName: {\n type: 'string',\n description: 'Set the first name',\n },\n lastName: {\n type: 'string',\n description: 'Set the last name',\n },\n company: {\n type: 'string',\n description: 'Set the company ID this person is associated with',\n },\n role: {\n type: 'string',\n description: 'Set the role or job title',\n },\n context: {\n type: 'string',\n description: 'Set additional context about this person',\n },\n sounds_like: {\n type: 'array',\n items: { type: 'string' },\n description: 'Replace all sounds_like variants with this array',\n },\n add_sounds_like: {\n type: 'array',\n items: { type: 'string' },\n description: 'Add these sounds_like variants to existing ones',\n },\n remove_sounds_like: {\n type: 'array',\n items: { type: 'string' },\n description: 'Remove these sounds_like variants',\n },\n contextDirectory: {\n type: 'string',\n description: 'Path to the .protokoll context directory',\n },\n },\n required: ['id'],\n },\n};\n\nexport const addProjectTool: Tool = {\n name: 'protokoll_add_project',\n description:\n 'Add a new project to the context with optional smart assistance for generating metadata. ' +\n 'Projects define where transcripts should be routed based on classification signals. ' +\n 'Smart assistance auto-generates sounds_like (phonetic variants for transcription correction) and ' +\n 'explicit_phrases (content-matching trigger phrases for classification). ' +\n 'Provide a source URL or file path to also generate topics and description from content analysis.',\n inputSchema: {\n type: 'object',\n properties: {\n name: {\n type: 'string',\n description: 'Project name (required)',\n },\n id: {\n type: 'string',\n description: 'Unique ID (default: slugified name)',\n },\n source: {\n type: 'string',\n description: 'URL or file path to analyze for generating topics, description, sounds_like, and explicit_phrases (optional)',\n },\n destination: {\n type: 'string',\n description: 'Output directory for this project\\'s transcripts',\n },\n structure: {\n type: 'string',\n enum: ['none', 'year', 'month', 'day'],\n description: 'Directory structure (default: month)',\n },\n contextType: {\n type: 'string',\n enum: ['work', 'personal', 'mixed'],\n description: 'Context type for classification (default: work)',\n },\n explicit_phrases: {\n type: 'array',\n items: { type: 'string' },\n description: 'Content-matching trigger phrases for classification (auto-generated if smart assistance enabled)',\n },\n sounds_like: {\n type: 'array',\n items: { type: 'string' },\n description: 'Phonetic variants of project NAME for transcription correction (auto-generated if smart assistance enabled)',\n },\n topics: {\n type: 'array',\n items: { type: 'string' },\n description: 'Topic keywords for classification (auto-generated from source if provided)',\n },\n description: {\n type: 'string',\n description: 'Project description (auto-generated from source if provided)',\n },\n useSmartAssist: {\n type: 'boolean',\n description: 'Enable smart assistance for auto-generating metadata (default: true if configured)',\n },\n contextDirectory: {\n type: 'string',\n description: 'Path to the .protokoll context directory',\n },\n },\n required: ['name'],\n },\n};\n\nexport const editProjectTool: Tool = {\n name: 'protokoll_edit_project',\n description:\n 'Edit an existing project with manual modifications. Unlike protokoll_update_project (which regenerates from a source), ' +\n 'this allows direct edits: adding specific sounds_like variants, changing routing, modifying classification, managing relationships, etc. ' +\n 'For array fields (sounds_like, urls, topics, explicit_phrases, associated_people, associated_companies, children, siblings, related_terms), ' +\n 'use add_* to append or remove_* to delete specific values, or use the base field name to replace the entire array.',\n inputSchema: {\n type: 'object',\n properties: {\n id: {\n type: 'string',\n description: 'Project ID to edit',\n },\n name: {\n type: 'string',\n description: 'Update the project name',\n },\n description: {\n type: 'string',\n description: 'Set the project description',\n },\n destination: {\n type: 'string',\n description: 'Set the output directory for transcripts',\n },\n structure: {\n type: 'string',\n enum: ['none', 'year', 'month', 'day'],\n description: 'Set the directory structure',\n },\n contextType: {\n type: 'string',\n enum: ['work', 'personal', 'mixed'],\n description: 'Set the context type for classification',\n },\n active: {\n type: 'boolean',\n description: 'Set whether the project is active',\n },\n sounds_like: {\n type: 'array',\n items: { type: 'string' },\n description: 'Replace all sounds_like variants with this array',\n },\n add_sounds_like: {\n type: 'array',\n items: { type: 'string' },\n description: 'Add these sounds_like variants to existing ones',\n },\n remove_sounds_like: {\n type: 'array',\n items: { type: 'string' },\n description: 'Remove these sounds_like variants',\n },\n urls: {\n type: 'array',\n items: { type: 'string' },\n description: 'Replace all project URLs with this list (e.g. org homepage, documentation)',\n },\n add_urls: {\n type: 'array',\n items: { type: 'string' },\n description: 'Append these URLs to the project urls list',\n },\n remove_urls: {\n type: 'array',\n items: { type: 'string' },\n description: 'Remove these URLs from the project urls list',\n },\n topics: {\n type: 'array',\n items: { type: 'string' },\n description: 'Replace all classification topics with this array',\n },\n add_topics: {\n type: 'array',\n items: { type: 'string' },\n description: 'Add these topics to existing ones',\n },\n remove_topics: {\n type: 'array',\n items: { type: 'string' },\n description: 'Remove these topics',\n },\n explicit_phrases: {\n type: 'array',\n items: { type: 'string' },\n description: 'Replace all explicit trigger phrases with this array',\n },\n add_explicit_phrases: {\n type: 'array',\n items: { type: 'string' },\n description: 'Add these explicit trigger phrases',\n },\n remove_explicit_phrases: {\n type: 'array',\n items: { type: 'string' },\n description: 'Remove these explicit trigger phrases',\n },\n associated_people: {\n type: 'array',\n items: { type: 'string' },\n description: 'Replace all associated people (person IDs) with this array',\n },\n add_associated_people: {\n type: 'array',\n items: { type: 'string' },\n description: 'Add these person IDs to associated people',\n },\n remove_associated_people: {\n type: 'array',\n items: { type: 'string' },\n description: 'Remove these person IDs from associated people',\n },\n associated_companies: {\n type: 'array',\n items: { type: 'string' },\n description: 'Replace all associated companies (company IDs) with this array',\n },\n add_associated_companies: {\n type: 'array',\n items: { type: 'string' },\n description: 'Add these company IDs to associated companies',\n },\n remove_associated_companies: {\n type: 'array',\n items: { type: 'string' },\n description: 'Remove these company IDs from associated companies',\n },\n parent: {\n type: 'string',\n description: 'Set parent project ID (for project relationships)',\n },\n add_children: {\n type: 'array',\n items: { type: 'string' },\n description: 'Add these project IDs as children',\n },\n remove_children: {\n type: 'array',\n items: { type: 'string' },\n description: 'Remove these project IDs from children',\n },\n add_siblings: {\n type: 'array',\n items: { type: 'string' },\n description: 'Add these project IDs as siblings',\n },\n remove_siblings: {\n type: 'array',\n items: { type: 'string' },\n description: 'Remove these project IDs from siblings',\n },\n add_related_terms: {\n type: 'array',\n items: { type: 'string' },\n description: 'Add these term IDs as related terms (for project relationships)',\n },\n remove_related_terms: {\n type: 'array',\n items: { type: 'string' },\n description: 'Remove these term IDs from related terms',\n },\n contextDirectory: {\n type: 'string',\n description: 'Path to the .protokoll context directory',\n },\n },\n required: ['id'],\n },\n};\n\nexport const updateProjectTool: Tool = {\n name: 'protokoll_update_project',\n description:\n 'Update an existing project by regenerating metadata from a source URL or file. ' +\n 'Fetches content and uses LLM to regenerate sounds_like, explicit_phrases, topics, and description.',\n inputSchema: {\n type: 'object',\n properties: {\n id: {\n type: 'string',\n description: 'Project ID to update',\n },\n source: {\n type: 'string',\n description: 'URL or file path to analyze for regenerating metadata',\n },\n name: {\n type: 'string',\n description: 'Update project name (optional)',\n },\n contextDirectory: {\n type: 'string',\n description: 'Path to the .protokoll context directory',\n },\n },\n required: ['id', 'source'],\n },\n};\n\nexport const addTermTool: Tool = {\n name: 'protokoll_add_term',\n description:\n 'Add a new technical term or abbreviation to the context. ' +\n 'Terms help Protokoll correctly transcribe domain-specific vocabulary and enable topic-based routing. ' +\n 'Include sounds_like variants for phonetic matching, description for clarity, and topics for classification.',\n inputSchema: {\n type: 'object',\n properties: {\n term: {\n type: 'string',\n description: 'The term or abbreviation',\n },\n id: {\n type: 'string',\n description: 'Unique ID (default: slugified term)',\n },\n expansion: {\n type: 'string',\n description: 'Full expansion if this is an acronym',\n },\n domain: {\n type: 'string',\n description: 'Domain or field (e.g., devops, engineering, security, finance)',\n },\n description: {\n type: 'string',\n description: 'Clear explanation of what the term means',\n },\n sounds_like: {\n type: 'array',\n items: { type: 'string' },\n description: 'Phonetic variants (how Whisper might mishear the term)',\n },\n topics: {\n type: 'array',\n items: { type: 'string' },\n description: 'Related topic keywords for classification (e.g., containers, orchestration, devops)',\n },\n projects: {\n type: 'array',\n items: { type: 'string' },\n description: 'Associated project IDs where this term is relevant',\n },\n contextDirectory: {\n type: 'string',\n description: 'Path to the .protokoll context directory',\n },\n },\n required: ['term'],\n },\n};\n\nexport const editTermTool: Tool = {\n name: 'protokoll_edit_term',\n description:\n 'Edit an existing term with manual modifications. Unlike protokoll_update_term (which regenerates from a source), ' +\n 'this allows direct edits: adding specific sounds_like variants, changing description, modifying topics, etc. ' +\n 'For array fields (sounds_like, topics, projects), use add_* to append or remove_* to delete specific values, ' +\n 'or use the base field name to replace the entire array.',\n inputSchema: {\n type: 'object',\n properties: {\n id: {\n type: 'string',\n description: 'Term ID to edit',\n },\n name: {\n type: 'string',\n description: 'Update the display name',\n },\n expansion: {\n type: 'string',\n description: 'Set the expansion (full form if acronym)',\n },\n domain: {\n type: 'string',\n description: 'Set the domain (e.g., devops, engineering)',\n },\n description: {\n type: 'string',\n description: 'Set the description',\n },\n sounds_like: {\n type: 'array',\n items: { type: 'string' },\n description: 'Replace all sounds_like variants with this array',\n },\n add_sounds_like: {\n type: 'array',\n items: { type: 'string' },\n description: 'Add these sounds_like variants to existing ones',\n },\n remove_sounds_like: {\n type: 'array',\n items: { type: 'string' },\n description: 'Remove these sounds_like variants',\n },\n topics: {\n type: 'array',\n items: { type: 'string' },\n description: 'Replace all topics with this array',\n },\n add_topics: {\n type: 'array',\n items: { type: 'string' },\n description: 'Add these topics to existing ones',\n },\n remove_topics: {\n type: 'array',\n items: { type: 'string' },\n description: 'Remove these topics',\n },\n projects: {\n type: 'array',\n items: { type: 'string' },\n description: 'Replace all project associations with this array',\n },\n add_projects: {\n type: 'array',\n items: { type: 'string' },\n description: 'Add these project associations',\n },\n remove_projects: {\n type: 'array',\n items: { type: 'string' },\n description: 'Remove these project associations',\n },\n contextDirectory: {\n type: 'string',\n description: 'Path to the .protokoll context directory',\n },\n },\n required: ['id'],\n },\n};\n\nexport const updateTermTool: Tool = {\n name: 'protokoll_update_term',\n description:\n 'Update an existing term by regenerating metadata from a source URL or file. ' +\n 'Fetches content and uses LLM to regenerate description, topics, domain, and sounds_like.',\n inputSchema: {\n type: 'object',\n properties: {\n id: {\n type: 'string',\n description: 'Term ID to update',\n },\n source: {\n type: 'string',\n description: 'URL or file path to analyze for regenerating metadata',\n },\n expansion: {\n type: 'string',\n description: 'Update expansion (optional)',\n },\n contextDirectory: {\n type: 'string',\n description: 'Path to the .protokoll context directory',\n },\n },\n required: ['id', 'source'],\n },\n};\n\nexport const mergeTermsTool: Tool = {\n name: 'protokoll_merge_terms',\n description:\n 'Merge two duplicate terms into one. Combines metadata (sounds_like, topics, projects) and deletes the source term.',\n inputSchema: {\n type: 'object',\n properties: {\n sourceId: {\n type: 'string',\n description: 'ID of the term to merge from (will be deleted)',\n },\n targetId: {\n type: 'string',\n description: 'ID of the term to merge into (will be kept and updated)',\n },\n contextDirectory: {\n type: 'string',\n description: 'Path to the .protokoll context directory',\n },\n },\n required: ['sourceId', 'targetId'],\n },\n};\n\nexport const addCompanyTool: Tool = {\n name: 'protokoll_add_company',\n description:\n 'Add a new company to the context. ' +\n 'Company entries help recognize organization names in transcripts.',\n inputSchema: {\n type: 'object',\n properties: {\n name: {\n type: 'string',\n description: 'Company name',\n },\n id: {\n type: 'string',\n description: 'Unique ID (default: slugified name)',\n },\n fullName: {\n type: 'string',\n description: 'Full legal name',\n },\n industry: {\n type: 'string',\n description: 'Industry or sector',\n },\n sounds_like: {\n type: 'array',\n items: { type: 'string' },\n description: 'Phonetic variants',\n },\n contextDirectory: {\n type: 'string',\n description: 'Path to the .protokoll context directory',\n },\n },\n required: ['name'],\n },\n};\n\nexport const editCompanyTool: Tool = {\n name: 'protokoll_edit_company',\n description:\n 'Edit an existing company with manual modifications. ' +\n 'Can update company details and manage sounds_like variants.',\n inputSchema: {\n type: 'object',\n properties: {\n id: {\n type: 'string',\n description: 'Company ID to edit',\n },\n name: {\n type: 'string',\n description: 'Update company name',\n },\n fullName: {\n type: 'string',\n description: 'Set full legal name',\n },\n industry: {\n type: 'string',\n description: 'Set industry',\n },\n sounds_like: {\n type: 'array',\n items: { type: 'string' },\n description: 'Replace entire sounds_like array',\n },\n add_sounds_like: {\n type: 'array',\n items: { type: 'string' },\n description: 'Add sounds_like variants',\n },\n remove_sounds_like: {\n type: 'array',\n items: { type: 'string' },\n description: 'Remove sounds_like variants',\n },\n contextDirectory: {\n type: 'string',\n description: 'Path to the .protokoll context directory',\n },\n },\n required: ['id'],\n },\n};\n\nexport const deleteEntityTool: Tool = {\n name: 'protokoll_delete_entity',\n description:\n 'Delete an entity from the context. ' +\n 'Removes the entity\\'s YAML file from the context directory.',\n inputSchema: {\n type: 'object',\n properties: {\n entityType: {\n type: 'string',\n enum: ['project', 'person', 'term', 'company', 'ignored'],\n description: 'Type of entity to delete',\n },\n entityId: {\n type: 'string',\n description: 'ID of the entity to delete',\n },\n contextDirectory: {\n type: 'string',\n description: 'Path to the .protokoll context directory',\n },\n },\n required: ['entityType', 'entityId'],\n },\n};\n\n// ============================================================================\n// Tool Handlers\n// ============================================================================\n\nexport async function handleAddPerson(args: {\n name: string;\n id?: string;\n firstName?: string;\n lastName?: string;\n company?: string;\n role?: string;\n sounds_like?: string[];\n context?: string;\n contextDirectory?: string;\n}) {\n const context = await createToolContext(args.contextDirectory);\n\n if (!context.hasContext()) {\n throw new Error('No .protokoll directory found. Initialize context first.');\n }\n\n const id = resolveCanonicalEntityId(args.id);\n const slug = slugify(args.name);\n\n if (context.getPerson(id)) {\n throw new Error(`Person with ID \"${id}\" already exists`);\n }\n\n const person: Person = {\n id,\n slug,\n name: args.name,\n type: 'person',\n ...(args.firstName && { firstName: args.firstName }),\n ...(args.lastName && { lastName: args.lastName }),\n ...(args.company && { company: args.company }),\n ...(args.role && { role: args.role }),\n ...(args.sounds_like && { sounds_like: args.sounds_like }),\n ...(args.context && { context: args.context }),\n };\n\n await context.saveEntity(person);\n await markEntityIndexDirtyIfGcs('person');\n\n return {\n success: true,\n message: `Person \"${args.name}\" added successfully`,\n entity: formatEntity(person),\n };\n}\n\nexport async function handleEditPerson(args: {\n id: string;\n name?: string;\n firstName?: string;\n lastName?: string;\n company?: string;\n role?: string;\n context?: string;\n sounds_like?: string[];\n add_sounds_like?: string[];\n remove_sounds_like?: string[];\n contextDirectory?: string;\n}) {\n const context = await createToolContext(args.contextDirectory);\n await assertContextAvailableForEntityEdit(context);\n\n const existingPerson = findPersonResilient(context, args.id);\n\n const updatedSoundsLike = mergeArray(\n existingPerson.sounds_like,\n args.sounds_like,\n args.add_sounds_like,\n args.remove_sounds_like\n );\n\n // Build updated person\n const updatedPerson: Person = {\n ...existingPerson,\n ...(args.name !== undefined && { name: args.name }),\n ...(args.firstName !== undefined && { firstName: args.firstName }),\n ...(args.lastName !== undefined && { lastName: args.lastName }),\n ...(args.company !== undefined && { company: args.company }),\n ...(args.role !== undefined && { role: args.role }),\n ...(args.context !== undefined && { context: args.context }),\n updatedAt: new Date(),\n };\n\n // Handle sounds_like array\n if (updatedSoundsLike !== undefined) {\n updatedPerson.sounds_like = updatedSoundsLike;\n } else if (existingPerson.sounds_like && (args.sounds_like !== undefined || args.remove_sounds_like)) {\n delete updatedPerson.sounds_like;\n }\n\n await context.saveEntity(updatedPerson, true);\n await markEntityIndexDirtyIfGcs('person');\n\n // Build summary of changes\n const changes: string[] = [];\n if (args.name !== undefined) changes.push(`name: \"${args.name}\"`);\n if (args.firstName !== undefined) changes.push(`firstName: \"${args.firstName}\"`);\n if (args.lastName !== undefined) changes.push(`lastName: \"${args.lastName}\"`);\n if (args.company !== undefined) changes.push(`company: \"${args.company}\"`);\n if (args.role !== undefined) changes.push(`role: \"${args.role}\"`);\n if (args.context !== undefined) changes.push(`context updated`);\n if (args.sounds_like !== undefined) changes.push(`sounds_like replaced with ${args.sounds_like.length} items`);\n if (args.add_sounds_like?.length) changes.push(`added ${args.add_sounds_like.length} sounds_like variants`);\n if (args.remove_sounds_like?.length) changes.push(`removed ${args.remove_sounds_like.length} sounds_like variants`);\n\n return {\n success: true,\n message: `Updated person \"${existingPerson.name}\"`,\n changes,\n person: formatEntity(updatedPerson),\n };\n}\n\nexport async function handleAddProject(args: {\n name: string;\n id?: string;\n source?: string;\n destination?: string;\n structure?: 'none' | 'year' | 'month' | 'day';\n contextType?: 'work' | 'personal' | 'mixed';\n explicit_phrases?: string[];\n sounds_like?: string[];\n topics?: string[];\n description?: string;\n useSmartAssist?: boolean;\n contextDirectory?: string;\n}) {\n const context = await createToolContext(args.contextDirectory);\n\n if (!context.hasContext()) {\n throw new Error('No .protokoll directory found. Initialize context first.');\n }\n\n const id = resolveCanonicalEntityId(args.id);\n const slug = slugify(args.name);\n\n if (context.getProject(id)) {\n throw new Error(`Project with ID \"${id}\" already exists`);\n }\n\n // Smart assistance integration\n const smartConfig = context.getSmartAssistanceConfig();\n const useSmartAssist = args.useSmartAssist !== false && smartConfig.enabled;\n\n const soundsLike = args.sounds_like || [];\n const triggerPhrases = args.explicit_phrases || [];\n const topics = args.topics || [];\n const description = args.description;\n const suggestedName: string | undefined = undefined;\n\n if (useSmartAssist) {\n // ProjectAssist temporarily unavailable - needs extraction from CLI\n throw new Error('Smart assistance temporarily unavailable');\n \n /* Unreachable code - commented out until ProjectAssist is re-implemented\n // const assist = ProjectAssist.create(smartConfig);\n\n // Analyze source if provided\n if (args.source) {\n const suggestions = await assist.analyzeSource(args.source, args.name);\n\n // Only use suggestions for fields not explicitly provided (undefined, not just empty)\n if (args.sounds_like === undefined) {\n soundsLike = suggestions.soundsLike;\n }\n if (args.explicit_phrases === undefined) {\n triggerPhrases = suggestions.triggerPhrases;\n }\n if (args.topics === undefined && suggestions.topics) {\n topics = suggestions.topics;\n }\n if (!args.description && suggestions.description) {\n description = suggestions.description;\n }\n if (suggestions.name) {\n suggestedName = suggestions.name;\n }\n } else {\n // Generate sounds_like and trigger phrases from name even without source\n if (args.sounds_like === undefined) {\n soundsLike = await assist.generateSoundsLike(args.name);\n }\n if (args.explicit_phrases === undefined) {\n triggerPhrases = await assist.generateTriggerPhrases(args.name);\n }\n }\n */\n }\n\n const project: Project = {\n id,\n slug,\n name: args.name,\n type: 'project',\n classification: {\n context_type: args.contextType || 'work',\n explicit_phrases: triggerPhrases,\n ...(topics.length && { topics }),\n },\n routing: {\n ...(args.destination && { destination: args.destination }),\n structure: args.structure || 'month',\n filename_options: ['date', 'time', 'subject'],\n },\n // Include sounds_like if explicitly provided (even if empty) or if generated\n ...((args.sounds_like !== undefined || soundsLike.length) && { sounds_like: soundsLike }),\n ...(description && { description }),\n active: true,\n };\n\n await context.saveEntity(project);\n await markEntityIndexDirtyIfGcs('project');\n\n return {\n success: true,\n message: `Project \"${args.name}\" added successfully`,\n entity: formatEntity(project),\n smartAssistUsed: useSmartAssist,\n ...(suggestedName ? { suggestedName } : {}),\n generated: {\n soundsLike,\n triggerPhrases,\n topics,\n description,\n },\n };\n}\n\nexport async function handleEditProject(args: {\n id: string;\n name?: string;\n description?: string;\n destination?: string;\n structure?: 'none' | 'year' | 'month' | 'day';\n contextType?: 'work' | 'personal' | 'mixed';\n active?: boolean;\n sounds_like?: string[];\n add_sounds_like?: string[];\n remove_sounds_like?: string[];\n topics?: string[];\n add_topics?: string[];\n remove_topics?: string[];\n explicit_phrases?: string[];\n add_explicit_phrases?: string[];\n remove_explicit_phrases?: string[];\n associated_people?: string[];\n add_associated_people?: string[];\n remove_associated_people?: string[];\n associated_companies?: string[];\n add_associated_companies?: string[];\n remove_associated_companies?: string[];\n parent?: string;\n add_children?: string[];\n remove_children?: string[];\n add_siblings?: string[];\n remove_siblings?: string[];\n add_related_terms?: string[];\n remove_related_terms?: string[];\n urls?: string[];\n add_urls?: string[];\n remove_urls?: string[];\n contextDirectory?: string;\n}) {\n const context = await createToolContext(args.contextDirectory);\n await assertContextAvailableForEntityEdit(context);\n\n const existingProject = findProjectResilient(context, args.id);\n const existingProjectUrls = (existingProject as { urls?: string[] }).urls;\n\n const updatedSoundsLike = mergeArray(\n existingProject.sounds_like,\n args.sounds_like,\n args.add_sounds_like,\n args.remove_sounds_like\n );\n\n const updatedUrls = mergeArray(\n existingProjectUrls,\n args.urls,\n args.add_urls,\n args.remove_urls\n );\n\n const updatedTopics = mergeArray(\n existingProject.classification?.topics,\n args.topics,\n args.add_topics,\n args.remove_topics\n );\n\n const updatedExplicitPhrases = mergeArray(\n existingProject.classification?.explicit_phrases,\n args.explicit_phrases,\n args.add_explicit_phrases,\n args.remove_explicit_phrases\n );\n\n const updatedAssociatedPeople = mergeArray(\n existingProject.classification?.associated_people,\n args.associated_people,\n args.add_associated_people,\n args.remove_associated_people\n );\n\n const updatedAssociatedCompanies = mergeArray(\n existingProject.classification?.associated_companies,\n args.associated_companies,\n args.add_associated_companies,\n args.remove_associated_companies\n );\n\n // Handle relationships\n // Helper functions for relationships\n const createEntityUri = (type: string, id: string): string => `redaksjon://${type}/${id}`;\n const getIdFromUri = (uri: string): string | null => {\n const match = uri.match(/^redaksjon:\\/\\/[^/]+\\/(.+)$/);\n return match ? match[1] : null;\n };\n const getEntityIdsByRelationshipType = (relationships: EntityRelationship[] | undefined, relationshipType: string): string[] => {\n if (!relationships) return [];\n return relationships\n .filter(r => r.relationship === relationshipType)\n .map(r => getIdFromUri(r.uri))\n .filter((id): id is string => id !== null);\n };\n const setRelationships = (relationships: EntityRelationship[] | undefined, type: string, entityType: string, entityIds: string[]): EntityRelationship[] => {\n const rels = relationships || [];\n const filtered = rels.filter(r => r.relationship !== type);\n const newRels = entityIds.map(id => ({ uri: createEntityUri(entityType, id), relationship: type }));\n return [...filtered, ...newRels];\n };\n const addRelationship = (relationships: EntityRelationship[] | undefined, type: string, entityType: string, entityId: string): EntityRelationship[] => {\n const rels = relationships || [];\n const uri = createEntityUri(entityType, entityId);\n const filtered = rels.filter(r => !(r.relationship === type && r.uri === uri));\n return [...filtered, { uri, relationship: type }];\n };\n\n const existingChildren = getEntityIdsByRelationshipType(existingProject.relationships, 'child');\n const updatedChildren = mergeArray(\n existingChildren,\n undefined,\n args.add_children,\n args.remove_children\n );\n\n const existingSiblings = getEntityIdsByRelationshipType(existingProject.relationships, 'sibling');\n const updatedSiblings = mergeArray(\n existingSiblings,\n undefined,\n args.add_siblings,\n args.remove_siblings\n );\n\n const existingRelatedTerms = getEntityIdsByRelationshipType(existingProject.relationships, 'related_term');\n const updatedRelatedTerms = mergeArray(\n existingRelatedTerms,\n undefined,\n args.add_related_terms,\n args.remove_related_terms\n );\n\n // Build updated project\n const updatedProject: Project = {\n ...existingProject,\n ...(args.name !== undefined && { name: args.name }),\n ...(args.description !== undefined && { description: args.description }),\n ...(args.active !== undefined && { active: args.active }),\n classification: {\n ...existingProject.classification,\n ...(args.contextType !== undefined && { context_type: args.contextType }),\n },\n routing: {\n ...existingProject.routing,\n ...(args.destination !== undefined && { destination: args.destination }),\n ...(args.structure !== undefined && { structure: args.structure }),\n },\n updatedAt: new Date(),\n };\n\n // Handle sounds_like at project level\n if (updatedSoundsLike !== undefined) {\n updatedProject.sounds_like = updatedSoundsLike;\n } else if (existingProject.sounds_like && (args.sounds_like !== undefined || args.remove_sounds_like)) {\n delete updatedProject.sounds_like;\n }\n\n if (updatedUrls !== undefined) {\n (updatedProject as { urls?: string[] }).urls = updatedUrls;\n } else if (existingProjectUrls && (args.urls !== undefined || args.remove_urls)) {\n delete (updatedProject as { urls?: string[] }).urls;\n }\n\n // Handle classification arrays\n if (updatedTopics !== undefined) {\n updatedProject.classification.topics = updatedTopics;\n } else if (existingProject.classification?.topics && (args.topics !== undefined || args.remove_topics)) {\n delete updatedProject.classification.topics;\n }\n\n if (updatedExplicitPhrases !== undefined) {\n updatedProject.classification.explicit_phrases = updatedExplicitPhrases;\n } else if (existingProject.classification?.explicit_phrases && (args.explicit_phrases !== undefined || args.remove_explicit_phrases)) {\n delete updatedProject.classification.explicit_phrases;\n }\n\n if (updatedAssociatedPeople !== undefined) {\n updatedProject.classification.associated_people = updatedAssociatedPeople;\n } else if (existingProject.classification?.associated_people && (args.associated_people !== undefined || args.remove_associated_people)) {\n delete updatedProject.classification.associated_people;\n }\n\n if (updatedAssociatedCompanies !== undefined) {\n updatedProject.classification.associated_companies = updatedAssociatedCompanies;\n } else if (existingProject.classification?.associated_companies && (args.associated_companies !== undefined || args.remove_associated_companies)) {\n delete updatedProject.classification.associated_companies;\n }\n\n // Handle relationships\n let relationships: EntityRelationship[] = existingProject.relationships ? [...existingProject.relationships] : [];\n \n if (args.parent !== undefined) {\n relationships = addRelationship(relationships, 'parent', 'project', args.parent);\n }\n \n if (updatedChildren !== undefined && updatedChildren !== existingChildren) {\n relationships = setRelationships(relationships, 'child', 'project', updatedChildren);\n }\n \n if (updatedSiblings !== undefined && updatedSiblings !== existingSiblings) {\n relationships = setRelationships(relationships, 'sibling', 'project', updatedSiblings);\n }\n \n if (updatedRelatedTerms !== undefined && updatedRelatedTerms !== existingRelatedTerms) {\n relationships = setRelationships(relationships, 'related_term', 'term', updatedRelatedTerms);\n }\n \n if (args.parent !== undefined || updatedChildren !== undefined || updatedSiblings !== undefined || updatedRelatedTerms !== undefined) {\n updatedProject.relationships = relationships.length > 0 ? relationships : undefined;\n }\n\n await context.saveEntity(updatedProject, true);\n await markEntityIndexDirtyIfGcs('project');\n\n // Build summary of changes\n const changes: string[] = [];\n if (args.name !== undefined) changes.push(`name: \"${args.name}\"`);\n if (args.description !== undefined) changes.push(`description updated`);\n if (args.destination !== undefined) changes.push(`destination: \"${args.destination}\"`);\n if (args.structure !== undefined) changes.push(`structure: \"${args.structure}\"`);\n if (args.contextType !== undefined) changes.push(`context_type: \"${args.contextType}\"`);\n if (args.active !== undefined) changes.push(`active: ${args.active}`);\n if (args.sounds_like !== undefined) changes.push(`sounds_like replaced with ${args.sounds_like.length} items`);\n if (args.add_sounds_like?.length) changes.push(`added ${args.add_sounds_like.length} sounds_like variants`);\n if (args.remove_sounds_like?.length) changes.push(`removed ${args.remove_sounds_like.length} sounds_like variants`);\n if (args.urls !== undefined) changes.push(`urls replaced with ${args.urls.length} items`);\n if (args.add_urls?.length) changes.push(`added ${args.add_urls.length} urls`);\n if (args.remove_urls?.length) changes.push(`removed ${args.remove_urls.length} urls`);\n if (args.topics !== undefined) changes.push(`topics replaced with ${args.topics.length} items`);\n if (args.add_topics?.length) changes.push(`added ${args.add_topics.length} topics`);\n if (args.remove_topics?.length) changes.push(`removed ${args.remove_topics.length} topics`);\n if (args.explicit_phrases !== undefined) changes.push(`explicit_phrases replaced with ${args.explicit_phrases.length} items`);\n if (args.add_explicit_phrases?.length) changes.push(`added ${args.add_explicit_phrases.length} explicit phrases`);\n if (args.remove_explicit_phrases?.length) changes.push(`removed ${args.remove_explicit_phrases.length} explicit phrases`);\n if (args.associated_people !== undefined) changes.push(`associated_people replaced with ${args.associated_people.length} items`);\n if (args.add_associated_people?.length) changes.push(`added ${args.add_associated_people.length} associated people`);\n if (args.remove_associated_people?.length) changes.push(`removed ${args.remove_associated_people.length} associated people`);\n if (args.associated_companies !== undefined) changes.push(`associated_companies replaced with ${args.associated_companies.length} items`);\n if (args.add_associated_companies?.length) changes.push(`added ${args.add_associated_companies.length} associated companies`);\n if (args.remove_associated_companies?.length) changes.push(`removed ${args.remove_associated_companies.length} associated companies`);\n if (args.parent !== undefined) changes.push(`parent: \"${args.parent}\"`);\n if (args.add_children?.length) changes.push(`added ${args.add_children.length} children`);\n if (args.remove_children?.length) changes.push(`removed ${args.remove_children.length} children`);\n if (args.add_siblings?.length) changes.push(`added ${args.add_siblings.length} siblings`);\n if (args.remove_siblings?.length) changes.push(`removed ${args.remove_siblings.length} siblings`);\n if (args.add_related_terms?.length) changes.push(`added ${args.add_related_terms.length} related terms`);\n if (args.remove_related_terms?.length) changes.push(`removed ${args.remove_related_terms.length} related terms`);\n\n return {\n success: true,\n message: `Updated project \"${existingProject.name}\"`,\n changes,\n project: formatEntity(updatedProject),\n };\n}\n\nexport async function handleUpdateProject(args: {\n id: string;\n source: string;\n name?: string;\n contextDirectory?: string;\n}) {\n const context = await createToolContext(args.contextDirectory);\n\n if (!context.hasContext()) {\n throw new Error('No .protokoll directory found. Initialize context first.');\n }\n\n // Verify project exists\n findProjectResilient(context, args.id);\n\n const smartConfig = context.getSmartAssistanceConfig();\n if (!smartConfig.enabled) {\n throw new Error('Smart assistance is disabled in configuration.');\n }\n\n // ProjectAssist temporarily unavailable - needs extraction from CLI\n throw new Error('Smart assistance temporarily unavailable');\n \n /* Unreachable code - commented out until ProjectAssist is re-implemented\n // const assist = ProjectAssist.create(smartConfig);\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n const projectName = args.name || existingProject.name;\n\n // Analyze source for new metadata\n const suggestions = await assist.analyzeSource(args.source, projectName);\n\n // Update project with regenerated metadata\n const updatedProject: Project = {\n ...existingProject,\n ...(args.name && { name: args.name }),\n ...(suggestions.description && { description: suggestions.description }),\n ...(suggestions.soundsLike.length > 0 && { sounds_like: suggestions.soundsLike }),\n classification: {\n ...existingProject.classification,\n ...(suggestions.triggerPhrases.length > 0 && { explicit_phrases: suggestions.triggerPhrases }),\n ...(suggestions.topics && suggestions.topics.length > 0 && { topics: suggestions.topics }),\n },\n updatedAt: new Date(),\n };\n\n await context.saveEntity(updatedProject, true);\n\n return {\n success: true,\n message: `Updated project \"${existingProject.name}\" from source`,\n project: formatEntity(updatedProject),\n generated: {\n soundsLike: suggestions.soundsLike,\n triggerPhrases: suggestions.triggerPhrases,\n topics: suggestions.topics,\n description: suggestions.description,\n },\n };\n */\n}\n\nexport async function handleAddTerm(args: {\n term: string;\n id?: string;\n expansion?: string;\n domain?: string;\n description?: string;\n sounds_like?: string[];\n topics?: string[];\n projects?: string[];\n contextDirectory?: string;\n}) {\n const context = await createToolContext(args.contextDirectory);\n\n if (!context.hasContext()) {\n throw new Error('No .protokoll directory found. Initialize context first.');\n }\n\n const id = resolveCanonicalEntityId(args.id);\n const slug = slugify(args.term);\n\n if (context.getTerm(id)) {\n throw new Error(`Term with ID \"${id}\" already exists`);\n }\n\n const term: Term = {\n id,\n slug,\n name: args.term,\n type: 'term',\n ...(args.expansion && { expansion: args.expansion }),\n ...(args.domain && { domain: args.domain }),\n ...(args.description && { description: args.description }),\n ...(args.sounds_like && { sounds_like: args.sounds_like }),\n ...(args.topics && { topics: args.topics }),\n ...(args.projects && { projects: args.projects }),\n };\n\n await context.saveEntity(term);\n await markEntityIndexDirtyIfGcs('term');\n\n return {\n success: true,\n message: `Term \"${args.term}\" added successfully`,\n entity: formatEntity(term),\n };\n}\n\nexport async function handleEditTerm(args: {\n id: string;\n name?: string;\n expansion?: string;\n domain?: string;\n description?: string;\n sounds_like?: string[];\n add_sounds_like?: string[];\n remove_sounds_like?: string[];\n topics?: string[];\n add_topics?: string[];\n remove_topics?: string[];\n projects?: string[];\n add_projects?: string[];\n remove_projects?: string[];\n contextDirectory?: string;\n}) {\n const context = await createToolContext(args.contextDirectory);\n await assertContextAvailableForEntityEdit(context);\n\n const existingTerm = findTermResilient(context, args.id) || context.getTerm(args.id);\n if (!existingTerm) {\n throw new Error(`Term \"${args.id}\" not found`);\n }\n\n const updatedSoundsLike = mergeArray(\n existingTerm.sounds_like,\n args.sounds_like,\n args.add_sounds_like,\n args.remove_sounds_like\n );\n\n const updatedTopics = mergeArray(\n existingTerm.topics,\n args.topics,\n args.add_topics,\n args.remove_topics\n );\n\n const updatedProjects = mergeArray(\n existingTerm.projects,\n args.projects,\n args.add_projects,\n args.remove_projects\n );\n\n // Build updated term\n const updatedTerm: Term = {\n ...existingTerm,\n ...(args.name !== undefined && { name: args.name }),\n ...(args.expansion !== undefined && { expansion: args.expansion }),\n ...(args.domain !== undefined && { domain: args.domain }),\n ...(args.description !== undefined && { description: args.description }),\n updatedAt: new Date(),\n };\n\n // Handle array fields - only set if they have values\n if (updatedSoundsLike !== undefined) {\n updatedTerm.sounds_like = updatedSoundsLike;\n } else if (existingTerm.sounds_like && (args.sounds_like !== undefined || args.remove_sounds_like)) {\n delete updatedTerm.sounds_like;\n }\n\n if (updatedTopics !== undefined) {\n updatedTerm.topics = updatedTopics;\n } else if (existingTerm.topics && (args.topics !== undefined || args.remove_topics)) {\n delete updatedTerm.topics;\n }\n\n if (updatedProjects !== undefined) {\n updatedTerm.projects = updatedProjects;\n } else if (existingTerm.projects && (args.projects !== undefined || args.remove_projects)) {\n delete updatedTerm.projects;\n }\n\n await context.saveEntity(updatedTerm, true);\n await markEntityIndexDirtyIfGcs('term');\n\n // Build summary of changes\n const changes: string[] = [];\n if (args.name !== undefined) changes.push(`name: \"${args.name}\"`);\n if (args.expansion !== undefined) changes.push(`expansion: \"${args.expansion}\"`);\n if (args.domain !== undefined) changes.push(`domain: \"${args.domain}\"`);\n if (args.description !== undefined) changes.push(`description updated`);\n if (args.sounds_like !== undefined) changes.push(`sounds_like replaced with ${args.sounds_like.length} items`);\n if (args.add_sounds_like?.length) changes.push(`added ${args.add_sounds_like.length} sounds_like variants`);\n if (args.remove_sounds_like?.length) changes.push(`removed ${args.remove_sounds_like.length} sounds_like variants`);\n if (args.topics !== undefined) changes.push(`topics replaced with ${args.topics.length} items`);\n if (args.add_topics?.length) changes.push(`added ${args.add_topics.length} topics`);\n if (args.remove_topics?.length) changes.push(`removed ${args.remove_topics.length} topics`);\n if (args.projects !== undefined) changes.push(`projects replaced with ${args.projects.length} items`);\n if (args.add_projects?.length) changes.push(`added ${args.add_projects.length} project associations`);\n if (args.remove_projects?.length) changes.push(`removed ${args.remove_projects.length} project associations`);\n\n return {\n success: true,\n message: `Updated term \"${existingTerm.name}\"`,\n changes,\n term: formatEntity(updatedTerm),\n };\n}\n\nexport async function handleUpdateTerm(args: {\n id: string;\n source: string;\n expansion?: string;\n contextDirectory?: string;\n}) {\n const context = await createToolContext(args.contextDirectory);\n\n if (!context.hasContext()) {\n throw new Error('No .protokoll directory found. Initialize context first.');\n }\n\n // Verify term exists\n findTermResilient(context, args.id);\n\n const smartConfig = context.getSmartAssistanceConfig();\n if (!smartConfig.enabled || smartConfig.termsEnabled === false) {\n throw new Error('Term smart assistance is disabled in configuration.');\n }\n\n // ContentFetcher, TermAssist, TermContext temporarily unavailable\n throw new Error('Term assistance temporarily unavailable - business logic needs extraction from CLI');\n \n /* Unreachable code - commented out until modules are re-implemented\n // Fetch content from source\n const ContentFetcher = await import('@/cli/content-fetcher');\n const contentFetcher = ContentFetcher.create();\n const fetchResult = await contentFetcher.fetch(args.source);\n\n if (!fetchResult.success) {\n throw new Error(`Failed to fetch source: ${fetchResult.error}`);\n }\n\n // Gather context and generate suggestions\n const TermAssist = await import('@/cli/term-assist');\n const TermContext = await import('@/cli/term-context');\n\n const termAssist = TermAssist.create(smartConfig);\n const termContextHelper = TermContext.create(context);\n\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n const internalContext = termContextHelper.gatherInternalContext(\n existingTerm.name,\n args.expansion || existingTerm.expansion\n );\n\n const analysisContext = TermContext.buildAnalysisContext(\n existingTerm.name,\n args.expansion || existingTerm.expansion,\n fetchResult,\n internalContext\n );\n\n const suggestions = await termAssist.generateAll(existingTerm.name, analysisContext);\n\n // Update term with regenerated metadata\n const updatedTerm: Term = {\n ...existingTerm,\n ...(args.expansion && { expansion: args.expansion }),\n ...(suggestions.description && { description: suggestions.description }),\n ...(suggestions.domain && { domain: suggestions.domain }),\n ...(suggestions.soundsLike.length > 0 && { sounds_like: suggestions.soundsLike }),\n ...(suggestions.topics.length > 0 && { topics: suggestions.topics }),\n updatedAt: new Date(),\n };\n\n // Suggest projects based on topics\n let suggestedProjects: string[] = [];\n if (suggestions.topics.length > 0) {\n const projects = termContextHelper.findProjectsByTopic(suggestions.topics);\n suggestedProjects = projects.map((p: any) => p.id);\n }\n\n await context.saveEntity(updatedTerm, true);\n\n return {\n success: true,\n message: `Updated term \"${existingTerm.name}\" from source`,\n term: formatEntity(updatedTerm),\n generated: {\n soundsLike: suggestions.soundsLike,\n description: suggestions.description,\n topics: suggestions.topics,\n domain: suggestions.domain,\n suggestedProjects,\n },\n };\n */\n}\n\n/* c8 ignore start */\nexport async function handleMergeTerms(args: {\n sourceId: string;\n targetId: string;\n contextDirectory?: string;\n}) {\n const context = await createToolContext(args.contextDirectory);\n\n if (!context.hasContext()) {\n throw new Error('No .protokoll directory found. Initialize context first.');\n }\n\n const sourceTerm = findTermResilient(context, args.sourceId);\n const targetTerm = findTermResilient(context, args.targetId);\n\n // Merge metadata\n const mergedTerm: Term = {\n ...targetTerm,\n sounds_like: [\n ...(targetTerm.sounds_like || []),\n ...(sourceTerm.sounds_like || []),\n ].filter((v, i, arr) => arr.indexOf(v) === i),\n topics: [\n ...(targetTerm.topics || []),\n ...(sourceTerm.topics || []),\n ].filter((v, i, arr) => arr.indexOf(v) === i),\n projects: [\n ...(targetTerm.projects || []),\n ...(sourceTerm.projects || []),\n ].filter((v, i, arr) => arr.indexOf(v) === i),\n description: targetTerm.description || sourceTerm.description,\n domain: targetTerm.domain || sourceTerm.domain,\n expansion: targetTerm.expansion || sourceTerm.expansion,\n updatedAt: new Date(),\n };\n\n // Remove empty arrays\n if (mergedTerm.sounds_like && mergedTerm.sounds_like.length === 0) {\n delete mergedTerm.sounds_like;\n }\n if (mergedTerm.topics && mergedTerm.topics.length === 0) {\n delete mergedTerm.topics;\n }\n if (mergedTerm.projects && mergedTerm.projects.length === 0) {\n delete mergedTerm.projects;\n }\n\n // Save merged term and delete source\n await context.saveEntity(mergedTerm);\n await context.deleteEntity(sourceTerm);\n await markEntityIndexDirtyIfGcs('term');\n\n return {\n success: true,\n message: `Merged \"${sourceTerm.name}\" into \"${targetTerm.name}\"`,\n mergedTerm: formatEntity(mergedTerm),\n deletedTerm: args.sourceId,\n };\n}\n/* c8 ignore stop */\n\nexport async function handleAddCompany(args: {\n name: string;\n id?: string;\n fullName?: string;\n industry?: string;\n sounds_like?: string[];\n contextDirectory?: string;\n}) {\n const context = await createToolContext(args.contextDirectory);\n\n if (!context.hasContext()) {\n throw new Error('No .protokoll directory found. Initialize context first.');\n }\n\n const id = resolveCanonicalEntityId(args.id);\n const slug = slugify(args.name);\n\n if (context.getCompany(id)) {\n throw new Error(`Company with ID \"${id}\" already exists`);\n }\n\n const company: Company = {\n id,\n slug,\n name: args.name,\n type: 'company',\n ...(args.fullName && { fullName: args.fullName }),\n ...(args.industry && { industry: args.industry }),\n ...(args.sounds_like && { sounds_like: args.sounds_like }),\n };\n\n await context.saveEntity(company);\n await markEntityIndexDirtyIfGcs('company');\n\n return {\n success: true,\n message: `Company \"${args.name}\" added successfully`,\n entity: formatEntity(company),\n };\n}\n\nexport async function handleEditCompany(args: {\n id: string;\n name?: string;\n fullName?: string;\n industry?: string;\n sounds_like?: string[];\n add_sounds_like?: string[];\n remove_sounds_like?: string[];\n contextDirectory?: string;\n}) {\n const context = await createToolContext(args.contextDirectory);\n await assertContextAvailableForEntityEdit(context);\n\n const existingCompany = findCompanyResilient(context, args.id);\n\n const updatedSoundsLike = mergeArray(\n existingCompany.sounds_like,\n args.sounds_like,\n args.add_sounds_like,\n args.remove_sounds_like\n );\n\n // Build updated company\n const updatedCompany: Company = {\n ...existingCompany,\n ...(args.name !== undefined && { name: args.name }),\n ...(args.fullName !== undefined && { fullName: args.fullName }),\n ...(args.industry !== undefined && { industry: args.industry }),\n updatedAt: new Date(),\n };\n\n // Handle sounds_like array\n if (updatedSoundsLike !== undefined) {\n updatedCompany.sounds_like = updatedSoundsLike;\n } else if (existingCompany.sounds_like && (args.sounds_like !== undefined || args.remove_sounds_like)) {\n delete updatedCompany.sounds_like;\n }\n\n await context.saveEntity(updatedCompany, true);\n await markEntityIndexDirtyIfGcs('company');\n\n // Build summary of changes\n const changes: string[] = [];\n if (args.name !== undefined) changes.push(`name: \"${args.name}\"`);\n if (args.fullName !== undefined) changes.push(`fullName: \"${args.fullName}\"`);\n if (args.industry !== undefined) changes.push(`industry: \"${args.industry}\"`);\n if (args.sounds_like !== undefined) changes.push(`sounds_like replaced with ${args.sounds_like.length} items`);\n if (args.add_sounds_like?.length) changes.push(`added ${args.add_sounds_like.length} sounds_like variants`);\n if (args.remove_sounds_like?.length) changes.push(`removed ${args.remove_sounds_like.length} sounds_like variants`);\n\n return {\n success: true,\n message: `Updated company \"${existingCompany.name}\"`,\n changes,\n company: formatEntity(updatedCompany),\n };\n}\n\nexport async function handleDeleteEntity(args: { entityType: string; entityId: string; contextDirectory?: string }) {\n const context = await createToolContext(args.contextDirectory);\n\n let entity: Entity;\n switch (args.entityType) {\n case 'project':\n entity = findProjectResilient(context, args.entityId);\n break;\n case 'person':\n entity = findPersonResilient(context, args.entityId);\n break;\n case 'term':\n entity = findTermResilient(context, args.entityId);\n break;\n case 'company':\n entity = findCompanyResilient(context, args.entityId);\n break;\n case 'ignored':\n entity = findIgnoredResilient(context, args.entityId);\n break;\n default:\n throw new Error(`Unknown entity type: ${args.entityType}`);\n }\n\n const deleted = await context.deleteEntity(entity);\n if (deleted) {\n await markEntityIndexDirtyIfGcs(args.entityType as 'person' | 'project' | 'term' | 'company' | 'ignored');\n }\n\n if (!deleted) {\n throw new Error(`Failed to delete ${args.entityType} \"${args.entityId}\"`);\n }\n\n return {\n success: true,\n message: `${args.entityType} \"${args.entityId}\" deleted successfully`,\n };\n}\n","/* eslint-disable import/extensions */\n/**\n * Smart Assistance Tools - Generate metadata suggestions for entities\n */\n \nimport type { Tool } from '@modelcontextprotocol/sdk/types.js';\nimport { createToolContext } from './shared';\n\n// ============================================================================\n// Tool Definitions\n// ============================================================================\n\nexport const suggestProjectMetadataTool: Tool = {\n name: 'protokoll_suggest_project_metadata',\n description:\n 'Generate project metadata suggestions without creating the project. ' +\n 'Returns sounds_like (phonetic variants for transcription), explicit_phrases (content-matching trigger phrases), ' +\n 'topics and description from source content. Useful for interactive workflows where ' +\n 'AI assistant presents suggestions for user review before creating the project.',\n inputSchema: {\n type: 'object',\n properties: {\n name: {\n type: 'string',\n description: 'Project name for generating sounds_like and trigger phrases',\n },\n source: {\n type: 'string',\n description: 'URL or file path to analyze for topics, description, and suggested name',\n },\n contextDirectory: {\n type: 'string',\n description: 'Path to the .protokoll context directory',\n },\n },\n },\n};\n\nexport const suggestTermMetadataTool: Tool = {\n name: 'protokoll_suggest_term_metadata',\n description:\n 'Generate term metadata suggestions without creating the term. ' +\n 'Returns sounds_like (phonetic variants), description, topics, domain, and suggested projects. ' +\n 'Useful for interactive workflows where AI assistant presents suggestions for user review before creating the term.',\n inputSchema: {\n type: 'object',\n properties: {\n term: {\n type: 'string',\n description: 'Term name for generating metadata',\n },\n source: {\n type: 'string',\n description: 'URL or file path to analyze for richer suggestions (optional)',\n },\n expansion: {\n type: 'string',\n description: 'Full expansion if acronym (helps with analysis)',\n },\n contextDirectory: {\n type: 'string',\n description: 'Path to the .protokoll context directory',\n },\n },\n required: ['term'],\n },\n};\n\n// ============================================================================\n// Tool Handlers\n// ============================================================================\n\nexport async function handleSuggestProjectMetadata(args: {\n name?: string;\n source?: string;\n contextDirectory?: string;\n}) {\n const context = await createToolContext(args.contextDirectory);\n\n const smartConfig = context.getSmartAssistanceConfig();\n\n if (!smartConfig.enabled) {\n throw new Error('Smart assistance is disabled in configuration.');\n }\n\n // ProjectAssist moved to separate module - needs to be re-implemented\n throw new Error('Project assistance temporarily unavailable - business logic needs extraction from CLI');\n \n /* Unreachable code - commented out until ProjectAssist is re-implemented\n // const assist = ProjectAssist.create(smartConfig);\n\n const result: {\n soundsLike?: string[];\n triggerPhrases?: string[];\n topics?: string[];\n description?: string;\n suggestedName?: string;\n } = {};\n\n // Generate sounds_like and trigger phrases if name provided\n if (args.name) {\n // Generate in parallel for efficiency\n const [soundsLike, triggerPhrases] = await Promise.all([\n assist.generateSoundsLike(args.name),\n assist.generateTriggerPhrases(args.name),\n ]);\n result.soundsLike = soundsLike;\n result.triggerPhrases = triggerPhrases;\n }\n\n // Analyze source if provided\n if (args.source) {\n const suggestions = await assist.analyzeSource(args.source, args.name);\n\n if (!args.name && suggestions.name) {\n result.suggestedName = suggestions.name;\n result.soundsLike = suggestions.soundsLike;\n result.triggerPhrases = suggestions.triggerPhrases;\n }\n result.topics = suggestions.topics;\n result.description = suggestions.description;\n }\n\n return {\n success: true,\n data: result,\n };\n */\n}\n\nexport async function handleSuggestTermMetadata(args: {\n term: string;\n source?: string;\n expansion?: string;\n contextDirectory?: string;\n}) {\n const context = await createToolContext(args.contextDirectory);\n\n const smartConfig = context.getSmartAssistanceConfig();\n\n if (!smartConfig.enabled || smartConfig.termsEnabled === false) {\n throw new Error('Term smart assistance is disabled in configuration.');\n }\n\n // TermAssist, TermContext, ContentFetcher moved to separate modules - need re-implementation\n throw new Error('Term assistance temporarily unavailable - business logic needs extraction from CLI');\n \n /* Unreachable code - commented out until TermAssist is re-implemented\n // const termAssist = TermAssist.create(smartConfig);\n // const termContextHelper = TermContext.create(context);\n // const contentFetcher = ContentFetcher.create();\n\n // Gather internal context\n const internalContext = termContextHelper.gatherInternalContext(args.term, args.expansion);\n\n // Fetch external content if source provided\n let fetchResult: ContentFetcher.FetchResult | undefined;\n if (args.source) {\n fetchResult = await contentFetcher.fetch(args.source);\n }\n\n // Build analysis context\n const analysisContext = TermContext.buildAnalysisContext(\n args.term,\n args.expansion,\n fetchResult,\n internalContext\n );\n\n // Generate suggestions\n const suggestions = await termAssist.generateAll(args.term, analysisContext);\n\n // Find related projects based on generated topics\n let suggestedProjects: string[] = [];\n if (suggestions.topics && suggestions.topics.length > 0) {\n const projects = termContextHelper.findProjectsByTopic(suggestions.topics);\n suggestedProjects = projects.map((p: any) => p.id);\n }\n\n return {\n success: true,\n data: {\n soundsLike: suggestions.soundsLike,\n description: suggestions.description,\n topics: suggestions.topics,\n domain: suggestions.domain,\n suggestedProjects,\n },\n };\n */\n}\n","/* eslint-disable import/extensions */\n/**\n * Transcript Tools - Read, list, edit, combine, and provide feedback on transcripts\n */\n \nimport type { Tool } from '@modelcontextprotocol/sdk/types.js';\nimport { resolve, dirname } from 'node:path';\nimport { mkdir, mkdtemp, rm, readFile, writeFile } from 'node:fs/promises';\nimport { tmpdir } from 'node:os';\nimport { randomUUID } from 'node:crypto';\nimport Logging from '@fjell/logging';\nimport { Agentic, Phases, Reasoning, Routing, Transcript } from '@redaksjon/protokoll-engine';\nimport { DEFAULT_MODEL, MAX_CONTENT_LENGTH } from '@/constants';\nimport { markTranscriptIndexDirtyForStorage, resolveTranscriptPathByFilename } from '../resources/transcriptIndexService';\nimport type { FileStorageProvider } from '../storage/fileProviders';\nimport { markContextEntityIndexDirty, findContextEntityInGcs } from '../resources/entityIndexService';\n\nimport { createToolContext, fileExists, getConfiguredDirectory, getContextDirectories, sanitizePath, validatePathWithinDirectory, validatePathWithinOutputDirectory, validateNotRemoteMode, resolveTranscriptPath } from './shared.js';\nimport * as Metadata from '@redaksjon/protokoll-engine';\nimport { Transcript as TranscriptUtils } from '@redaksjon/protokoll-engine';\nconst { ensurePklExtension, transcriptExists } = TranscriptUtils;\nimport { \n PklTranscript, \n readTranscript as readTranscriptFromStorage,\n listTranscripts as listTranscriptsFromStorage,\n type TranscriptMetadata,\n} from '@redaksjon/protokoll-format';\n\nconst logger = Logging.getLogger('@redaksjon/protokoll-mcp').get('transcript-tools');\n\n// ============================================================================\n// Helper Functions\n// ============================================================================\n\ntype CandidateConfidence = 'high' | 'medium' | 'low';\n\ninterface TaskCandidate {\n id: string;\n taskText: string;\n confidence: number;\n confidenceBucket: CandidateConfidence;\n rationale: string;\n sourceExcerpt: string;\n suggestedDueDate: string | null;\n suggestedProject: { id: string | null; name: string | null };\n suggestedEntities: Array<{ id: string; name: string; type: 'person' | 'project' | 'term' | 'company' }>;\n suggestedTags: string[];\n}\n\ninterface SummaryStylePreset {\n label: string;\n instructions: string;\n}\n\ninterface StoredSummary {\n id: string;\n title: string;\n audience: string;\n guidance: string;\n stylePreset: string;\n styleLabel: string;\n content: string;\n generatedAt: string;\n}\n\ninterface TranscriptCommentInput {\n id: string;\n text: string;\n createdAt: string;\n updatedAt?: string;\n}\n\ntype TranscriptMetadataWithComments = TranscriptMetadata & {\n comments?: TranscriptCommentInput[];\n};\n\nfunction normalizeTranscriptComments(comments: unknown): TranscriptCommentInput[] {\n if (!Array.isArray(comments)) {\n return [];\n }\n\n return comments\n .filter((entry) => !!entry && typeof entry === 'object')\n .map((entry) => {\n const candidate = entry as Record<string, unknown>;\n const id = typeof candidate.id === 'string' ? candidate.id.trim() : '';\n const text = typeof candidate.text === 'string' ? candidate.text.trim() : '';\n const createdAt = typeof candidate.createdAt === 'string' ? candidate.createdAt.trim() : '';\n const updatedAt = typeof candidate.updatedAt === 'string' ? candidate.updatedAt.trim() : undefined;\n return { id, text, createdAt, updatedAt };\n })\n .filter((entry) => entry.id.length > 0 && entry.text.length > 0 && entry.createdAt.length > 0)\n .sort((a, b) => a.createdAt.localeCompare(b.createdAt));\n}\n\nfunction toStoragePathCandidates(transcriptPath: string): string[] {\n const normalizedInput = transcriptPath.trim();\n if (!normalizedInput) {\n return [];\n }\n\n let normalized = normalizedInput;\n if (normalized.startsWith('protokoll://transcript/')) {\n const rawPath = normalized\n .replace('protokoll://transcript/', '')\n .split('?')[0]\n .split('#')[0] || '';\n try {\n normalized = decodeURIComponent(rawPath);\n } catch {\n // Fall back to the undecoded path for malformed or partially encoded URIs.\n normalized = rawPath;\n }\n }\n\n normalized = normalized\n .replace(/^\\/+/, '')\n .replace(/\\\\/g, '/')\n .replace(/^(\\.\\.\\/)+/, '');\n if (!normalized) {\n return [];\n }\n\n const withoutExt = normalized.replace(/\\.pkl$/i, '');\n const candidates = new Set<string>([\n withoutExt,\n `${withoutExt}.pkl`,\n ]);\n return Array.from(candidates);\n}\n\nasync function resolveStorageTranscriptPath(\n transcriptPath: string,\n outputStorage: FileStorageProvider,\n): Promise<string | null> {\n const candidates = toStoragePathCandidates(transcriptPath);\n for (const candidate of candidates) {\n if (await outputStorage.exists(candidate)) {\n return candidate;\n }\n }\n\n const normalizedRef = transcriptPath.startsWith('protokoll://transcript/')\n ? transcriptPath.replace('protokoll://transcript/', '').split('?')[0].split('#')[0]\n : transcriptPath;\n const isBasenameOnly = !normalizedRef.replace(/^\\/+/, '').replace(/\\\\/g, '/').includes('/');\n if (!isBasenameOnly) {\n return null;\n }\n\n const basenameCandidates = new Set(\n candidates.map((candidate) => candidate.split('/').pop() || candidate)\n );\n\n const ServerConfig = await import('../serverConfig');\n const outputDirectory = ServerConfig.getOutputDirectory();\n const matches = await resolveTranscriptPathByFilename(\n outputStorage,\n outputDirectory,\n basenameCandidates,\n );\n if (matches.length === 1) {\n return matches[0];\n }\n if (matches.length > 1) {\n throw new Error(\n `Ambiguous transcript reference \"${transcriptPath}\": ${matches.length} matches found. ` +\n 'Use full transcript URI or relative path with date folders.'\n );\n }\n return null;\n}\n\nasync function getProjectLookupContext(contextDirectory?: string) {\n return createToolContext(contextDirectory);\n}\n\nexport const transcriptResolutionTestHelpers = {\n toStoragePathCandidates,\n resolveStorageTranscriptPath,\n};\n\ninterface ToolTranscriptAccess {\n pklPath: string;\n outputDirectory: string;\n storagePath?: string;\n isGcs: boolean;\n finalize: (persistChanges: boolean) => Promise<void>;\n}\n\nasync function openToolTranscript(\n transcriptPath: string,\n contextDirectory: string | undefined,\n): Promise<ToolTranscriptAccess> {\n const ServerConfig = await import('../serverConfig');\n const outputStorage = ServerConfig.getOutputStorage();\n const outputDirectory = await getConfiguredDirectory('outputDirectory', contextDirectory);\n\n if (outputStorage.name !== 'gcs') {\n const absolutePath = await resolveTranscriptPath(transcriptPath, contextDirectory);\n const pklPath = ensurePklExtension(absolutePath);\n return {\n pklPath,\n outputDirectory,\n isGcs: false,\n finalize: async () => {},\n };\n }\n\n if (/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i.test(transcriptPath.trim())) {\n throw new Error(\n 'UUID transcript references are not supported in GCS mode yet. ' +\n 'Use a transcript URI (protokoll://transcript/...) or relative path.'\n );\n }\n\n const storagePath = await resolveStorageTranscriptPath(transcriptPath, outputStorage);\n if (!storagePath) {\n throw new Error(`Transcript not found: ${transcriptPath}`);\n }\n\n const tmpRoot = await mkdtemp(`${tmpdir()}/protokoll-mcp-transcript-`);\n const pklPath = resolve(tmpRoot, 'transcript.pkl');\n const source = await outputStorage.readFile(storagePath);\n await writeFile(pklPath, source);\n\n return {\n pklPath,\n outputDirectory,\n storagePath,\n isGcs: true,\n finalize: async (persistChanges: boolean) => {\n try {\n if (persistChanges) {\n const updated = await readFile(pklPath);\n await outputStorage.writeFile(storagePath, updated);\n markTranscriptIndexDirtyForStorage(outputStorage, outputDirectory, storagePath);\n }\n } finally {\n await rm(tmpRoot, { recursive: true, force: true });\n }\n },\n };\n}\n\nfunction parseStoredSummaries(raw: string): StoredSummary[] {\n try {\n const parsed = JSON.parse(raw) as unknown;\n if (!Array.isArray(parsed)) {\n return [];\n }\n return parsed\n .map((item) => {\n if (!item || typeof item !== 'object') {\n return null;\n }\n const record = item as Record<string, unknown>;\n const id = String(record.id || '').trim();\n const content = String(record.content || '').trim();\n if (!id || !content) {\n return null;\n }\n return {\n id,\n title: String(record.title || '').trim(),\n audience: String(record.audience || '').trim(),\n guidance: String(record.guidance || '').trim(),\n stylePreset: String(record.stylePreset || 'detailed').trim() || 'detailed',\n styleLabel: String(record.styleLabel || 'Detailed summary').trim() || 'Detailed summary',\n content,\n generatedAt: String(record.generatedAt || '').trim() || new Date().toISOString(),\n } satisfies StoredSummary;\n })\n .filter((summary): summary is StoredSummary => summary !== null)\n .sort((a, b) => b.generatedAt.localeCompare(a.generatedAt));\n } catch {\n return [];\n }\n}\n\nconst SUMMARY_STYLE_PRESETS: Record<string, SummaryStylePreset> = {\n quick_bullets: {\n label: 'Quick paragraph + bullet points',\n instructions: 'Write one concise paragraph followed by 4-8 bullets covering decisions, actions, and risks.',\n },\n detailed: {\n label: 'Detailed summary',\n instructions: 'Write a structured summary with context, key discussion points, decisions, open questions, and next steps.',\n },\n attendee_facing: {\n label: 'Attendee-facing summary',\n instructions: 'Write a professional external-facing summary suitable for attendees; avoid private/internal reflections unless explicitly approved.',\n },\n};\n\nfunction splitIntoCandidateSentences(content: string): string[] {\n return content\n .split(/\\n+|(?<=[.!?])\\s+/g)\n .map((sentence) => sentence.trim())\n .filter((sentence) => sentence.length >= 8);\n}\n\nfunction normalizeTaskText(sentence: string): string {\n const normalized = sentence\n .replace(/^(?:i need to|we need to|i should|we should|let'?s|remember to|todo:|action item:)\\s+/i, '')\n .replace(/\\s+/g, ' ')\n .trim();\n return normalized.charAt(0).toUpperCase() + normalized.slice(1);\n}\n\nfunction inferDueDate(sentence: string): string | null {\n const lower = sentence.toLowerCase();\n if (lower.includes('today')) {\n return 'today';\n }\n if (lower.includes('tomorrow')) {\n return 'tomorrow';\n }\n if (lower.includes('next week')) {\n return 'next week';\n }\n if (lower.includes('this week')) {\n return 'this week';\n }\n if (lower.includes('by friday')) {\n return 'by friday';\n }\n return null;\n}\n\nfunction extractHashtagTags(sentence: string): string[] {\n const matches = sentence.match(/#[a-z0-9_-]+/gi) || [];\n return Array.from(new Set(matches.map((tag) => tag.slice(1).toLowerCase())));\n}\n\nfunction toConfidenceBucket(score: number): CandidateConfidence {\n if (score >= 0.75) {\n return 'high';\n }\n if (score >= 0.5) {\n return 'medium';\n }\n return 'low';\n}\n\nfunction scoreTaskCandidate(sentence: string): { score: number; rationale: string } | null {\n const explicitActionPattern = /\\b(i need to|we need to|i should|we should|let'?s|remember to|todo|action item|i will|i'll|must)\\b/i;\n const inferredIntentPattern = /\\b(follow up|check|review|investigate|confirm|decide|plan|schedule|reach out|send|draft|prepare|update|fix|create|write|call|email|look into|figure out)\\b/i;\n\n let score = 0;\n const rationaleParts: string[] = [];\n\n if (explicitActionPattern.test(sentence)) {\n score += 0.55;\n rationaleParts.push('explicit action language');\n }\n\n if (inferredIntentPattern.test(sentence)) {\n score += 0.35;\n rationaleParts.push('inferred follow-up intent');\n }\n\n if (inferDueDate(sentence)) {\n score += 0.1;\n rationaleParts.push('time cue detected');\n }\n\n if (score < 0.3) {\n return null;\n }\n\n return {\n score: Math.min(1, Number(score.toFixed(2))),\n rationale: rationaleParts.join('; '),\n };\n}\n\nfunction getSuggestedEntities(\n entities: NonNullable<TranscriptMetadata['entities']> | undefined\n): Array<{ id: string; name: string; type: 'person' | 'project' | 'term' | 'company' }> {\n if (!entities) {\n return [];\n }\n\n const people = (entities.people || []).map((entity) => ({ ...entity, type: 'person' as const }));\n const projects = (entities.projects || []).map((entity) => ({ ...entity, type: 'project' as const }));\n const terms = (entities.terms || []).map((entity) => ({ ...entity, type: 'term' as const }));\n const companies = (entities.companies || []).map((entity) => ({ ...entity, type: 'company' as const }));\n return [...people, ...projects, ...terms, ...companies];\n}\n\n// ============================================================================\n// Tool Definitions\n// ============================================================================\n\nexport const readTranscriptTool: Tool = {\n name: 'protokoll_read_transcript',\n description:\n 'Read a transcript file and parse its metadata and content. ' +\n 'Path is relative to the configured output directory. ' +\n 'Returns structured data including title, metadata, routing info, and content.',\n inputSchema: {\n type: 'object',\n properties: {\n transcriptPath: {\n type: 'string',\n description: \n 'Transcript URI (preferred) or relative path from output directory. ' +\n 'URI format: \"protokoll://transcript/2026/2/12-1606-meeting\" (no file extension). ' +\n 'Path format: \"2026/2/12-1606-meeting\" or \"2026/2/12-1606-meeting.pkl\"',\n },\n contextDirectory: {\n type: 'string',\n description: 'Optional: Path to the .protokoll context directory',\n },\n },\n required: ['transcriptPath'],\n },\n};\n\nexport const listTranscriptsTool: Tool = {\n name: 'protokoll_list_transcripts',\n description:\n 'List transcripts with pagination, filtering, and search. ' +\n 'If no directory is specified, uses the configured output directory. ' +\n 'Returns transcript metadata including date, time, title, and file path. ' +\n 'Supports sorting by date (default), filename, or title. ' +\n 'Can filter by date range and search within transcript content.',\n inputSchema: {\n type: 'object',\n properties: {\n directory: {\n type: 'string',\n description: \n 'Optional: Directory to search for transcripts (searches recursively). ' +\n 'If not specified, uses the configured output directory.',\n },\n limit: {\n type: 'number',\n description: 'Maximum number of results to return (default: 50)',\n default: 50,\n },\n offset: {\n type: 'number',\n description: 'Number of results to skip for pagination (default: 0)',\n default: 0,\n },\n sortBy: {\n type: 'string',\n enum: ['date', 'filename', 'title'],\n description: 'Field to sort by (default: date)',\n default: 'date',\n },\n startDate: {\n type: 'string',\n description: 'Filter transcripts from this date onwards (YYYY-MM-DD format)',\n },\n endDate: {\n type: 'string',\n description: 'Filter transcripts up to this date (YYYY-MM-DD format)',\n },\n search: {\n type: 'string',\n description: 'Search for transcripts containing this text (searches filename and content)',\n },\n entityId: {\n type: 'string',\n description: 'Filter to transcripts that reference this entity ID',\n },\n entityType: {\n type: 'string',\n enum: ['person', 'project', 'term', 'company'],\n description: 'Entity type to filter by (used with entityId to narrow search)',\n },\n contextDirectory: {\n type: 'string',\n description: 'Optional: Path to the .protokoll context directory',\n },\n },\n required: [],\n },\n};\n\nexport const identifyTasksFromTranscriptTool: Tool = {\n name: 'protokoll_identify_tasks_from_transcript',\n description:\n 'Identify task candidates from transcript or note content without creating tasks. ' +\n 'Returns structured candidates with confidence buckets, rationale, and metadata suggestions ' +\n 'so users can review and choose which tasks to create.',\n inputSchema: {\n type: 'object',\n properties: {\n transcriptPath: {\n type: 'string',\n description:\n 'Transcript URI (preferred) or relative path from output directory. ' +\n 'URI format: \"protokoll://transcript/2026/2/12-1606-meeting\" (no file extension). ' +\n 'Path format: \"2026/2/12-1606-meeting\" or \"2026/2/12-1606-meeting.pkl\"',\n },\n maxCandidates: {\n type: 'number',\n description: 'Maximum number of candidates to return (default: 25, max: 50)',\n default: 25,\n },\n includeTagSuggestions: {\n type: 'boolean',\n description: 'Whether to include suggested tags based on transcript metadata and hashtags (default: true)',\n default: true,\n },\n contextDirectory: {\n type: 'string',\n description: 'Optional: Path to the .protokoll context directory',\n },\n },\n required: ['transcriptPath'],\n },\n};\n\nexport const editTranscriptTool: Tool = {\n name: 'protokoll_edit_transcript',\n description:\n 'Edit an existing transcript\\'s title, project assignment, tags, and/or status. ' +\n 'Path is relative to the configured output directory. ' +\n 'IMPORTANT: When you change the title, this tool RENAMES THE FILE to match the new title (slugified). ' +\n 'Always use this tool instead of directly editing transcript files when changing titles. ' +\n 'Changing the project will update metadata and may move the file to a new location ' +\n 'based on the project\\'s routing configuration.',\n inputSchema: {\n type: 'object',\n properties: {\n transcriptPath: {\n type: 'string',\n description: \n 'Transcript URI (preferred) or relative path from output directory. ' +\n 'URI format: \"protokoll://transcript/2026/2/12-1606-meeting\" (no file extension). ' +\n 'Path format: \"2026/2/12-1606-meeting\" or \"2026/2/12-1606-meeting.pkl\"',\n },\n title: {\n type: 'string',\n description: 'New title for the transcript. This will RENAME the file to match the slugified title.',\n },\n projectId: {\n type: 'string',\n description: 'New project ID to assign',\n },\n tagsToAdd: {\n type: 'array',\n items: { type: 'string' },\n description: 'Tags to add to the transcript (will be deduplicated with existing tags)',\n },\n tagsToRemove: {\n type: 'array',\n items: { type: 'string' },\n description: 'Tags to remove from the transcript',\n },\n comments: {\n type: 'array',\n description: 'Replace transcript comments metadata with this full list.',\n items: {\n type: 'object',\n properties: {\n id: { type: 'string' },\n text: { type: 'string' },\n createdAt: { type: 'string', description: 'ISO-8601 timestamp' },\n updatedAt: { type: 'string', description: 'ISO-8601 timestamp (optional)' },\n },\n required: ['id', 'text', 'createdAt'],\n },\n },\n status: {\n type: 'string',\n enum: ['initial', 'enhanced', 'reviewed', 'in_progress', 'closed', 'archived'],\n description: 'New lifecycle status. Status transitions are recorded in history.',\n },\n contextDirectory: {\n type: 'string',\n description: 'Optional: Path to the .protokoll context directory',\n },\n },\n required: ['transcriptPath'],\n },\n};\n\nexport const summarizeTranscriptTool: Tool = {\n name: 'protokoll_summarize_transcript',\n description:\n 'Generate an audience-aware summary for a transcript using privacy/sensitivity guardrails. ' +\n 'Returns markdown summary text and does not modify transcript content.',\n inputSchema: {\n type: 'object',\n properties: {\n transcriptPath: {\n type: 'string',\n description:\n 'Transcript URI (preferred) or relative path from output directory. ' +\n 'URI format: \"protokoll://transcript/2026/2/12-1606-meeting\" (no file extension). ' +\n 'Path format: \"2026/2/12-1606-meeting\" or \"2026/2/12-1606-meeting.pkl\"',\n },\n audience: {\n type: 'string',\n description: 'Optional audience label (e.g. internal team, project attendees, external partner)',\n },\n stylePreset: {\n type: 'string',\n enum: ['quick_bullets', 'detailed', 'attendee_facing'],\n description: 'Summary style preset (default: detailed)',\n default: 'detailed',\n },\n guidance: {\n type: 'string',\n description: 'Optional extra instructions, especially for privacy/sensitivity constraints',\n },\n summaryTitle: {\n type: 'string',\n description: 'Optional title to use in the generated summary',\n },\n model: {\n type: 'string',\n description: `LLM model for summary generation (default: ${DEFAULT_MODEL})`,\n },\n contextDirectory: {\n type: 'string',\n description: 'Optional: Path to the .protokoll context directory',\n },\n },\n required: ['transcriptPath'],\n },\n};\n\nexport const deleteTranscriptSummaryTool: Tool = {\n name: 'protokoll_delete_transcript_summary',\n description:\n 'Delete a previously generated summary from transcript artifact storage by summary ID. ' +\n 'Path is relative to the configured output directory.',\n inputSchema: {\n type: 'object',\n properties: {\n transcriptPath: {\n type: 'string',\n description:\n 'Transcript URI (preferred) or relative path from output directory. ' +\n 'URI format: \"protokoll://transcript/2026/2/12-1606-meeting\" (no file extension). ' +\n 'Path format: \"2026/2/12-1606-meeting\" or \"2026/2/12-1606-meeting.pkl\"',\n },\n summaryId: {\n type: 'string',\n description: 'Summary ID to remove (for example: \"summary-174...\" )',\n },\n contextDirectory: {\n type: 'string',\n description: 'Optional: Path to the .protokoll context directory',\n },\n },\n required: ['transcriptPath', 'summaryId'],\n },\n};\n\nexport const changeTranscriptDateTool: Tool = {\n name: 'protokoll_change_transcript_date',\n description:\n 'Change the date of an existing transcript. ' +\n 'This will move the transcript file to a new location based on the new date and the project\\'s routing configuration. ' +\n 'The file will be moved to the appropriate YYYY/MM/ directory structure. ' +\n 'Path is relative to the configured output directory. ' +\n 'WARNING: This may remove the transcript from the current view if it moves to a different date folder.',\n inputSchema: {\n type: 'object',\n properties: {\n transcriptPath: {\n type: 'string',\n description: \n 'Transcript URI (preferred) or relative path from output directory. ' +\n 'URI format: \"protokoll://transcript/2026/2/12-1606-meeting\" (no file extension). ' +\n 'Path format: \"2026/2/12-1606-meeting\" or \"2026/2/12-1606-meeting.pkl\"',\n },\n newDate: {\n type: 'string',\n description: \n 'New date for the transcript in ISO 8601 format (YYYY-MM-DD or full ISO datetime). ' +\n 'Examples: \"2026-01-15\", \"2026-01-15T10:30:00Z\"',\n },\n contextDirectory: {\n type: 'string',\n description: 'Optional: Path to the .protokoll context directory',\n },\n },\n required: ['transcriptPath', 'newDate'],\n },\n};\n\nexport const combineTranscriptsTool: Tool = {\n name: 'protokoll_combine_transcripts',\n description:\n 'Combine multiple transcripts into a single document. ' +\n 'Paths are relative to the configured output directory. ' +\n 'Source files are automatically deleted after combining. ' +\n 'Metadata from the first transcript is preserved, and content is organized into sections.',\n inputSchema: {\n type: 'object',\n properties: {\n transcriptPaths: {\n type: 'array',\n items: { type: 'string' },\n description: \n 'Array of relative paths from the output directory. ' +\n 'Examples: [\"meeting-1.pkl\", \"meeting-2.pkl\"] or [\"2026/2/01-1325.pkl\", \"2026/2/01-1400.pkl\"]',\n },\n title: {\n type: 'string',\n description: 'Title for the combined transcript',\n },\n projectId: {\n type: 'string',\n description: 'Project ID to assign to the combined transcript',\n },\n contextDirectory: {\n type: 'string',\n description: 'Optional: Path to the .protokoll context directory',\n },\n },\n required: ['transcriptPaths'],\n },\n};\n\nexport const provideFeedbackTool: Tool = {\n name: 'protokoll_provide_feedback',\n description:\n 'Provide natural language feedback to correct a transcript. ' +\n 'Path is relative to the configured output directory. ' +\n 'The feedback is processed by an agentic model that can: ' +\n '- Fix spelling and term errors ' +\n '- Add new terms, people, or companies to context ' +\n '- Change project assignment ' +\n '- Update the title ' +\n 'Example: \"YB should be Wibey\" or \"San Jay Grouper is actually Sanjay Gupta\"',\n inputSchema: {\n type: 'object',\n properties: {\n transcriptPath: {\n type: 'string',\n description: \n 'Transcript URI (preferred) or relative path from output directory. ' +\n 'URI format: \"protokoll://transcript/2026/2/12-1606-meeting\" (no file extension). ' +\n 'Path format: \"2026/2/12-1606-meeting\" or \"2026/2/12-1606-meeting.pkl\"',\n },\n feedback: {\n type: 'string',\n description: 'Natural language feedback describing corrections needed',\n },\n model: {\n type: 'string',\n description: 'LLM model for processing feedback (default: gpt-5.2)',\n },\n contextDirectory: {\n type: 'string',\n description: 'Optional: Path to the .protokoll context directory',\n },\n },\n required: ['transcriptPath', 'feedback'],\n },\n};\n\nexport const enhanceTranscriptTool: Tool = {\n name: 'protokoll_enhance_transcript',\n description:\n 'Enhance an existing transcript using the same post-transcription pipeline flow ' +\n '(simple-replace + agentic tool-based enhancement) used after Whisper completes. ' +\n 'Reads from originalText when provided, otherwise uses raw transcript text if available, ' +\n 'falling back to current transcript content. Writes enhanced content and updates metadata/status.',\n inputSchema: {\n type: 'object',\n properties: {\n transcriptPath: {\n type: 'string',\n description:\n 'Transcript URI (preferred) or relative path from output directory. ' +\n 'URI format: \"protokoll://transcript/2026/2/12-1606-meeting\" (no file extension). ' +\n 'Path format: \"2026/2/12-1606-meeting\" or \"2026/2/12-1606-meeting.pkl\"',\n },\n originalText: {\n type: 'string',\n description:\n 'Optional explicit source text to enhance (usually the Original tab text). ' +\n 'If omitted, tool uses raw transcript text when present, else current content.',\n },\n model: {\n type: 'string',\n description: `LLM model for enhancement (default: ${DEFAULT_MODEL})`,\n },\n contextDirectory: {\n type: 'string',\n description: 'Optional: Path to the .protokoll context directory',\n },\n },\n required: ['transcriptPath'],\n },\n};\n\nexport const updateTranscriptContentTool: Tool = {\n name: 'protokoll_update_transcript_content',\n description:\n 'Update the content section of a transcript file while preserving all metadata. ' +\n 'Path is relative to the configured output directory. ' +\n 'This tool replaces only the content between the --- delimiters, keeping all metadata intact. ' +\n 'IMPORTANT: The content parameter should contain ONLY the transcript body text (the text after the --- delimiter), ' +\n 'NOT the full transcript file with headers and metadata. If the full transcript is provided, ' +\n 'the tool will automatically extract only the content section to prevent duplication.',\n inputSchema: {\n type: 'object',\n properties: {\n transcriptPath: {\n type: 'string',\n description: \n 'Transcript URI (preferred) or relative path from output directory. ' +\n 'URI format: \"protokoll://transcript/2026/2/12-1606-meeting\" (no file extension). ' +\n 'Path format: \"2026/2/12-1606-meeting\" or \"2026/2/12-1606-meeting.pkl\"',\n },\n content: {\n type: 'string',\n description: \n 'New content to replace the transcript body. ' +\n 'Should contain ONLY the body text (content after the --- delimiter). ' +\n 'If the full transcript is provided, the tool will extract only the content section automatically.',\n },\n contentTarget: {\n type: 'string',\n enum: ['enhanced', 'original'],\n description:\n 'Which content stream to update. ' +\n '\"enhanced\" updates transcript content (default). ' +\n '\"original\" updates raw transcript text only and never modifies enhanced content.',\n },\n contextDirectory: {\n type: 'string',\n description: 'Optional: Path to the .protokoll context directory',\n },\n },\n required: ['transcriptPath', 'content'],\n },\n};\n\nexport const updateTranscriptEntityReferencesTool: Tool = {\n name: 'protokoll_update_transcript_entity_references',\n description:\n 'Update the Entity References section of a transcript file while preserving all other content. ' +\n 'Path is relative to the configured output directory. ' +\n 'This tool replaces only the Entity References section at the end of the transcript, ' +\n 'preserving the title, metadata, and body content.',\n inputSchema: {\n type: 'object',\n properties: {\n transcriptPath: {\n type: 'string',\n description: \n 'Transcript URI (preferred) or relative path from output directory. ' +\n 'URI format: \"protokoll://transcript/2026/2/12-1606-meeting\" (no file extension). ' +\n 'Path format: \"2026/2/12-1606-meeting\" or \"2026/2/12-1606-meeting.pkl\"',\n },\n entities: {\n type: 'object',\n description: 'Entity references to update',\n properties: {\n people: {\n type: 'array',\n items: {\n type: 'object',\n properties: {\n id: { type: 'string', description: 'Entity ID (slugified identifier)' },\n name: { type: 'string', description: 'Display name' },\n },\n required: ['id', 'name'],\n },\n },\n projects: {\n type: 'array',\n items: {\n type: 'object',\n properties: {\n id: { type: 'string', description: 'Entity ID (slugified identifier)' },\n name: { type: 'string', description: 'Display name' },\n },\n required: ['id', 'name'],\n },\n },\n terms: {\n type: 'array',\n items: {\n type: 'object',\n properties: {\n id: { type: 'string', description: 'Entity ID (slugified identifier)' },\n name: { type: 'string', description: 'Display name' },\n },\n required: ['id', 'name'],\n },\n },\n companies: {\n type: 'array',\n items: {\n type: 'object',\n properties: {\n id: { type: 'string', description: 'Entity ID (slugified identifier)' },\n name: { type: 'string', description: 'Display name' },\n },\n required: ['id', 'name'],\n },\n },\n },\n },\n contextDirectory: {\n type: 'string',\n description: 'Optional: Path to the .protokoll context directory',\n },\n },\n required: ['transcriptPath', 'entities'],\n },\n};\n\nexport const createNoteTool: Tool = {\n name: 'protokoll_create_note',\n description:\n 'Create a new note/transcript file in the configured output directory. ' +\n 'The file will be created with proper metadata formatting and placed in a date-based directory structure (YYYY/MM/). ' +\n 'Returns the relative path to the created file.',\n inputSchema: {\n type: 'object',\n properties: {\n title: {\n type: 'string',\n description: 'Title for the note/transcript',\n },\n content: {\n type: 'string',\n description: 'Content/body text for the note (optional, can be empty)',\n default: '',\n },\n projectId: {\n type: 'string',\n description: 'Optional: Project ID to assign to the note',\n },\n tags: {\n type: 'array',\n items: { type: 'string' },\n description: 'Optional: Tags to add to the note',\n },\n date: {\n type: 'string',\n description: 'Optional: Date for the note (ISO 8601 format, e.g., \"2026-02-02\"). Defaults to current date.',\n },\n contextDirectory: {\n type: 'string',\n description: 'Optional: Path to the .protokoll context directory',\n },\n },\n required: ['title'],\n },\n};\n\nexport const getEnhancementLogTool: Tool = {\n name: 'protokoll_get_enhancement_log',\n description:\n 'Get the enhancement log for a transcript. ' +\n 'Returns a timestamped audit trail of enhancement pipeline steps (transcribe, enhance, simple-replace phases). ' +\n 'Shows what happened during processing: entities found, corrections applied, tools called, etc.',\n inputSchema: {\n type: 'object',\n properties: {\n transcriptPath: {\n type: 'string',\n description: \n 'Transcript URI (preferred) or relative path from output directory. ' +\n 'URI format: \"protokoll://transcript/2026/2/12-1606-meeting\" (no file extension). ' +\n 'Path format: \"2026/2/12-1606-meeting\" or \"2026/2/12-1606-meeting.pkl\"',\n },\n phase: {\n type: 'string',\n enum: ['transcribe', 'enhance', 'simple-replace'],\n description: 'Optional: Filter to a specific phase',\n },\n limit: {\n type: 'number',\n description: 'Maximum number of entries to return (default: 100)',\n },\n offset: {\n type: 'number',\n description: 'Number of entries to skip for pagination (default: 0)',\n },\n contextDirectory: {\n type: 'string',\n description: 'Optional: Path to the .protokoll context directory',\n },\n },\n required: ['transcriptPath'],\n },\n};\n\nexport const correctToEntityTool: Tool = {\n name: 'protokoll_correct_to_entity',\n description:\n 'Correct misheard text in transcript by mapping to existing or new entity. ' +\n 'Atomically updates transcript content, adds misspelling to entity sounds_like array, ' +\n 'updates entity references, and logs the correction to enhancement_log. ' +\n 'This is the primary mechanism for training the transcription system. ' +\n 'Context directory is resolved from server configuration.',\n inputSchema: {\n type: 'object',\n properties: {\n transcriptPath: {\n type: 'string',\n description:\n 'Transcript URI (preferred) or relative path from output directory. ' +\n 'URI format: \"protokoll://transcript/2026/2/12-1606-meeting\" (no file extension). ' +\n 'Path format: \"2026/2/12-1606-meeting\" or \"2026/2/12-1606-meeting.pkl\"',\n },\n selectedText: {\n type: 'string',\n description: 'The misheard text to correct',\n },\n entityType: {\n type: 'string',\n enum: ['person', 'project', 'term', 'company'],\n description: 'Type of entity',\n },\n entityId: {\n type: 'string',\n description: 'ID of existing entity (for map-to-existing flow)',\n },\n entityName: {\n type: 'string',\n description: 'Name of new entity to create (for create-new flow)',\n },\n firstName: {\n type: 'string',\n description: 'First name (person entities only)',\n },\n lastName: {\n type: 'string',\n description: 'Last name (person entities only)',\n },\n description: {\n type: 'string',\n description: 'Description/context for the new entity',\n },\n projectId: {\n type: 'string',\n description: 'Associated project ID (person entities only)',\n },\n contextDirectory: {\n type: 'string',\n description: 'Optional: Path to the .protokoll context directory',\n },\n },\n required: ['transcriptPath', 'selectedText', 'entityType'],\n },\n};\n\nexport const rejectCorrectionTool: Tool = {\n name: 'protokoll_reject_correction',\n description:\n 'Reject a previously applied enhancement correction and undo its text replacement in the transcript. ' +\n 'Also logs the rejection in enhancement_log for auditability.',\n inputSchema: {\n type: 'object',\n properties: {\n transcriptPath: {\n type: 'string',\n description:\n 'Transcript URI (preferred) or relative path from output directory. ' +\n 'URI format: \"protokoll://transcript/2026/2/12-1606-meeting\" (no file extension). ' +\n 'Path format: \"2026/2/12-1606-meeting\" or \"2026/2/12-1606-meeting.pkl\"',\n },\n correctionEntryId: {\n type: 'number',\n description: 'Enhancement log entry id for the correction_applied event to reject',\n },\n contextDirectory: {\n type: 'string',\n description: 'Optional: Path to the .protokoll context directory',\n },\n },\n required: ['transcriptPath', 'correctionEntryId'],\n },\n};\n\n// ============================================================================\n// Tool Handlers\n// ============================================================================\n\nexport async function handleReadTranscript(args: { \n transcriptPath: string;\n contextDirectory?: string;\n}) {\n const access = await openToolTranscript(args.transcriptPath, args.contextDirectory);\n let summaries: StoredSummary[] = [];\n let transcriptData: Awaited<ReturnType<typeof readTranscriptFromStorage>>;\n try {\n // Use protokoll-format storage API directly - returns structured JSON\n transcriptData = await readTranscriptFromStorage(access.pklPath);\n\n const transcriptHandle = PklTranscript.open(access.pklPath, { readOnly: true });\n try {\n const historyArtifact = transcriptHandle.getArtifact('summary_history');\n const rawHistory = historyArtifact?.data?.toString('utf8') || '[]';\n summaries = parseStoredSummaries(rawHistory);\n } finally {\n transcriptHandle.close();\n }\n } finally {\n await access.finalize(false);\n }\n\n // Convert to relative path for response\n const relativePath = access.storagePath\n ? await sanitizePath(access.storagePath, access.outputDirectory)\n : await sanitizePath(access.pklPath, access.outputDirectory);\n\n // Return complete structured JSON for client display\n // Clients should NOT need to parse this - all data is ready to display\n return {\n filePath: relativePath,\n title: transcriptData.metadata.title || '',\n metadata: {\n date: transcriptData.metadata.date?.toISOString() || null,\n recordingTime: transcriptData.metadata.recordingTime || null,\n duration: transcriptData.metadata.duration || null,\n project: transcriptData.metadata.project || null,\n projectId: transcriptData.metadata.projectId || null,\n tags: transcriptData.metadata.tags || [],\n status: transcriptData.metadata.status || 'initial',\n confidence: transcriptData.metadata.confidence || null,\n routing: transcriptData.metadata.routing || null,\n history: transcriptData.metadata.history || [],\n tasks: transcriptData.metadata.tasks || [],\n comments: (transcriptData.metadata as TranscriptMetadataWithComments).comments || [],\n entities: transcriptData.metadata.entities || {},\n },\n content: transcriptData.content,\n hasRawTranscript: transcriptData.hasRawTranscript,\n contentLength: transcriptData.content.length,\n summaries,\n };\n}\n\nexport async function handleListTranscripts(args: {\n directory?: string;\n limit?: number;\n offset?: number;\n sortBy?: 'date' | 'filename' | 'title';\n startDate?: string;\n endDate?: string;\n search?: string;\n entityId?: string;\n entityType?: 'person' | 'project' | 'term' | 'company';\n contextDirectory?: string;\n}) {\n const ServerConfig = await import('../serverConfig');\n const outputStorage = ServerConfig.getOutputStorage();\n\n // Get directory from args or config\n const directory = args.directory \n ? resolve(args.directory)\n : await getConfiguredDirectory('outputDirectory', args.contextDirectory);\n\n if (outputStorage.name !== 'gcs' && !await fileExists(directory)) {\n throw new Error(`Directory not found: ${directory}`);\n }\n\n // Use protokoll-format storage API directly\n const result = await listTranscriptsFromStorage({\n directory,\n limit: args.limit ?? 50,\n offset: args.offset ?? 0,\n sortBy: args.sortBy ?? 'date',\n startDate: args.startDate,\n endDate: args.endDate,\n search: args.search,\n entityId: args.entityId,\n entityType: args.entityType,\n });\n\n // Convert all paths to relative paths from output directory\n const outputDirectory = await getConfiguredDirectory('outputDirectory', args.contextDirectory);\n const relativeTranscripts = await Promise.all(\n result.transcripts.map(async (t) => ({\n path: await sanitizePath(t.filePath, outputDirectory),\n relativePath: t.relativePath,\n title: t.title,\n date: t.date?.toISOString() || null,\n project: t.project || null,\n tags: t.tags,\n status: t.status,\n duration: t.duration || null,\n contentPreview: t.contentPreview,\n }))\n );\n\n return {\n directory: await sanitizePath(directory, outputDirectory) || '.',\n transcripts: relativeTranscripts,\n pagination: {\n total: result.total,\n limit: args.limit ?? 50,\n offset: args.offset ?? 0,\n hasMore: result.hasMore,\n nextOffset: result.hasMore ? (args.offset ?? 0) + (args.limit ?? 50) : null,\n },\n filters: {\n sortBy: args.sortBy ?? 'date',\n startDate: args.startDate,\n endDate: args.endDate,\n search: args.search,\n entityId: args.entityId,\n entityType: args.entityType,\n },\n };\n}\n\nexport async function handleIdentifyTasksFromTranscript(args: {\n transcriptPath: string;\n maxCandidates?: number;\n includeTagSuggestions?: boolean;\n contextDirectory?: string;\n}) {\n const access = await openToolTranscript(args.transcriptPath, args.contextDirectory);\n let transcriptData: Awaited<ReturnType<typeof readTranscriptFromStorage>>;\n try {\n transcriptData = await readTranscriptFromStorage(access.pklPath);\n } finally {\n await access.finalize(false);\n }\n\n const content = transcriptData.content?.trim() || '';\n if (!content) {\n return {\n transcriptPath: args.transcriptPath,\n candidates: [] as TaskCandidate[],\n totalCandidates: 0,\n message: 'Transcript content is empty; no task candidates identified.',\n };\n }\n\n const limit = Math.max(1, Math.min(50, args.maxCandidates ?? 25));\n const includeTagSuggestions = args.includeTagSuggestions !== false;\n const existingTags = transcriptData.metadata.tags || [];\n const suggestedEntities = getSuggestedEntities(transcriptData.metadata.entities);\n const suggestedProject = {\n id: transcriptData.metadata.projectId || null,\n name: transcriptData.metadata.project || null,\n };\n\n const candidates = splitIntoCandidateSentences(content)\n .map((sentence, index) => {\n const scored = scoreTaskCandidate(sentence);\n if (!scored) {\n return null;\n }\n\n const sentenceTags = includeTagSuggestions ? extractHashtagTags(sentence) : [];\n const mergedTags = includeTagSuggestions\n ? Array.from(new Set([...existingTags.map((tag) => tag.toLowerCase()), ...sentenceTags]))\n : [];\n\n const candidate: TaskCandidate = {\n id: `candidate-${index + 1}`,\n taskText: normalizeTaskText(sentence),\n confidence: scored.score,\n confidenceBucket: toConfidenceBucket(scored.score),\n rationale: scored.rationale,\n sourceExcerpt: sentence,\n suggestedDueDate: inferDueDate(sentence),\n suggestedProject,\n suggestedEntities,\n suggestedTags: mergedTags,\n };\n\n return candidate;\n })\n .filter((candidate): candidate is TaskCandidate => candidate !== null)\n .sort((a, b) => b.confidence - a.confidence)\n .slice(0, limit);\n\n return {\n transcriptPath: args.transcriptPath,\n candidates,\n totalCandidates: candidates.length,\n message: candidates.length > 0\n ? `Identified ${candidates.length} task candidate(s).`\n : 'No likely task candidates found in transcript content.',\n };\n}\n\nexport async function handleSummarizeTranscript(args: {\n transcriptPath: string;\n audience?: string;\n stylePreset?: 'quick_bullets' | 'detailed' | 'attendee_facing' | string;\n guidance?: string;\n summaryTitle?: string;\n model?: string;\n contextDirectory?: string;\n}) {\n const startedAt = Date.now();\n const logSummary = (message: string, data: Record<string, unknown>) => {\n process.stdout.write(`Protokoll: [SUMMARY] ${message} ${JSON.stringify(data)}\\n`);\n };\n\n logSummary('Tool call received', {\n transcriptPath: args.transcriptPath,\n audience: args.audience,\n stylePreset: args.stylePreset || 'detailed',\n hasGuidance: !!args.guidance?.trim(),\n hasSummaryTitle: !!args.summaryTitle?.trim(),\n model: args.model || DEFAULT_MODEL,\n });\n\n const access = await openToolTranscript(args.transcriptPath, args.contextDirectory);\n const absolutePath = access.pklPath;\n let persistSummaryHistory = false;\n try {\n logSummary('Resolved transcript path', {\n transcriptPath: args.transcriptPath,\n absolutePath,\n });\n\n const transcriptData = await readTranscriptFromStorage(absolutePath);\n\n const transcriptContent = (transcriptData.content || '').trim();\n if (!transcriptContent) {\n logSummary('Transcript content empty, cannot summarize', {\n transcriptPath: args.transcriptPath,\n absolutePath,\n });\n throw new Error('Transcript content is empty; cannot generate summary.');\n }\n\n const audience = (args.audience || '').trim() || 'General audience';\n\n const stylePreset = (args.stylePreset || 'detailed').trim();\n const selectedStyle = SUMMARY_STYLE_PRESETS[stylePreset] || SUMMARY_STYLE_PRESETS.detailed;\n const guidance = (args.guidance || '').trim();\n const model = args.model || DEFAULT_MODEL;\n\n const transcriptTitle = transcriptData.metadata.title || 'Untitled transcript';\n const transcriptDate = transcriptData.metadata.date instanceof Date\n ? transcriptData.metadata.date.toISOString().slice(0, 10)\n : 'unknown date';\n const preferredTitle = (args.summaryTitle || '').trim();\n\n const boundedContent = transcriptContent.length > MAX_CONTENT_LENGTH\n ? `${transcriptContent.slice(0, MAX_CONTENT_LENGTH)}\\n\\n[...transcript truncated for summarization input length...]`\n : transcriptContent;\n const truncated = transcriptContent.length > MAX_CONTENT_LENGTH;\n logSummary('Prepared summary input', {\n transcriptTitle,\n transcriptDate,\n transcriptLength: transcriptContent.length,\n boundedLength: boundedContent.length,\n truncated,\n stylePreset,\n });\n\n const reasoning = Reasoning.create({\n model,\n reasoningLevel: 'medium',\n });\n\n const prompt = [\n 'Create an audience-aware summary for the transcript below.',\n '',\n `Transcript title: ${transcriptTitle}`,\n `Transcript date: ${transcriptDate}`,\n `Audience: ${audience}`,\n `Style preset: ${selectedStyle.label}`,\n preferredTitle ? `Preferred summary title: ${preferredTitle}` : 'Preferred summary title: (generate one)',\n '',\n 'Style instructions:',\n selectedStyle.instructions,\n '',\n 'Privacy and sensitivity guardrails:',\n '- Treat transcript content as potentially sensitive by default.',\n '- Exclude private internal reflections, personal judgments, or sensitive notes not appropriate for the audience.',\n '- If unsure whether a detail is audience-appropriate, exclude it or generalize safely.',\n '- Prefer factual and neutral language over speculative interpretation.',\n '',\n 'Additional guidance:',\n guidance || 'No extra guidance provided.',\n '',\n 'Required output shape:',\n '1) Title',\n '2) Summary body matching the selected style preset',\n '3) Optional \"Redactions / Exclusions\" section listing what was intentionally omitted for audience safety',\n '',\n 'Transcript:',\n boundedContent,\n ].join('\\n');\n\n const result = await reasoning.complete({\n prompt,\n systemPrompt: 'You are an expert meeting summarizer. Return markdown only.',\n });\n logSummary('Reasoning call completed', {\n transcriptPath: args.transcriptPath,\n model: result.model || model,\n durationMs: result.duration ?? null,\n finishReason: result.finishReason ?? null,\n });\n\n const summary = (result.content || '').trim();\n if (!summary) {\n logSummary('Empty summary response', {\n transcriptPath: args.transcriptPath,\n model: result.model || model,\n });\n throw new Error('No summary text generated.');\n }\n\n logSummary('Summary generated successfully', {\n transcriptPath: args.transcriptPath,\n summaryLength: summary.length,\n elapsedMs: Date.now() - startedAt,\n });\n\n const generatedAt = new Date().toISOString();\n const summaryId = `summary-${Date.now()}-${randomUUID().slice(0, 8)}`;\n const stylePresetKey = SUMMARY_STYLE_PRESETS[stylePreset] ? stylePreset : 'detailed';\n const storedSummary: StoredSummary = {\n id: summaryId,\n title: preferredTitle || `${transcriptTitle} Summary`,\n audience,\n guidance,\n stylePreset: stylePresetKey,\n styleLabel: selectedStyle.label,\n content: summary,\n generatedAt,\n };\n const transcriptHandle = PklTranscript.open(absolutePath, { readOnly: false });\n try {\n const existingHistory = transcriptHandle.getArtifact('summary_history');\n const existingSummaries = parseStoredSummaries(existingHistory?.data?.toString('utf8') || '[]');\n const nextSummaries = [storedSummary, ...existingSummaries.filter((entry) => entry.id !== summaryId)];\n\n transcriptHandle.addArtifact(\n 'summary_history',\n Buffer.from(JSON.stringify(nextSummaries), 'utf8'),\n {\n version: 1,\n count: nextSummaries.length,\n updatedAt: generatedAt,\n model: result.model || model,\n }\n );\n } finally {\n transcriptHandle.close();\n }\n persistSummaryHistory = true;\n logSummary('Summary persisted to transcript artifact storage', {\n transcriptPath: args.transcriptPath,\n summaryId,\n generatedAt,\n });\n\n return {\n summary,\n audience,\n stylePreset: stylePresetKey,\n model: result.model || model,\n summaryId,\n generatedAt,\n };\n } finally {\n await access.finalize(persistSummaryHistory);\n }\n}\n\nexport async function handleDeleteTranscriptSummary(args: {\n transcriptPath: string;\n summaryId: string;\n contextDirectory?: string;\n}) {\n const summaryId = (args.summaryId || '').trim();\n if (!summaryId) {\n throw new Error('summaryId is required');\n }\n\n const access = await openToolTranscript(args.transcriptPath, args.contextDirectory);\n const transcriptHandle = PklTranscript.open(access.pklPath, { readOnly: false });\n try {\n const historyArtifact = transcriptHandle.getArtifact('summary_history');\n const existingSummaries = parseStoredSummaries(historyArtifact?.data?.toString('utf8') || '[]');\n const remainingSummaries = existingSummaries.filter((entry) => entry.id !== summaryId);\n\n if (remainingSummaries.length === existingSummaries.length) {\n throw new Error(`Summary not found: ${summaryId}`);\n }\n\n transcriptHandle.addArtifact(\n 'summary_history',\n Buffer.from(JSON.stringify(remainingSummaries), 'utf8'),\n {\n version: 1,\n count: remainingSummaries.length,\n updatedAt: new Date().toISOString(),\n deletedSummaryId: summaryId,\n }\n );\n\n return {\n success: true,\n summaryId,\n remaining: remainingSummaries.length,\n };\n } finally {\n transcriptHandle.close();\n await access.finalize(true);\n }\n}\n\nexport async function handleEditTranscript(args: {\n transcriptPath: string;\n title?: string;\n projectId?: string;\n tagsToAdd?: string[];\n tagsToRemove?: string[];\n comments?: TranscriptCommentInput[];\n status?: string;\n contextDirectory?: string;\n}) {\n // Validate that contextDirectory is not provided in remote mode\n await validateNotRemoteMode(args.contextDirectory);\n \n // Get the output directory first to ensure consistent validation\n const outputDirectory = await getConfiguredDirectory('outputDirectory', args.contextDirectory);\n \n const ServerConfig = await import('../serverConfig');\n const outputStorage = ServerConfig.getOutputStorage();\n const serverContext = ServerConfig.getContext();\n\n if (outputStorage.name === 'gcs') {\n const access = await openToolTranscript(args.transcriptPath, args.contextDirectory);\n const resolvedStoragePath = access.storagePath || access.pklPath;\n let persistChanges = false;\n\n let statusChanged = false;\n let previousStatus: string | undefined;\n const changes: string[] = [];\n try {\n const transcript = PklTranscript.open(access.pklPath, { readOnly: false });\n try {\n const metadataUpdates: Partial<TranscriptMetadataWithComments> = {};\n\n if (args.title) {\n metadataUpdates.title = args.title.trim();\n changes.push('title updated');\n }\n if (args.projectId) {\n const context = await getProjectLookupContext(args.contextDirectory);\n const project = await context.getProject(args.projectId);\n let resolvedId: string;\n let resolvedName: string;\n if (project) {\n resolvedId = project.id;\n resolvedName = project.name;\n } else {\n const gcsEntity = await findContextEntityInGcs('project', args.projectId);\n if (gcsEntity && typeof gcsEntity.id === 'string' && typeof gcsEntity.name === 'string') {\n resolvedId = gcsEntity.id;\n resolvedName = gcsEntity.name;\n } else {\n throw new Error(`Project not found: ${args.projectId}`);\n }\n }\n\n metadataUpdates.projectId = resolvedId;\n metadataUpdates.project = resolvedName;\n\n const existingEntities = transcript.metadata.entities || {\n people: [],\n projects: [],\n terms: [],\n companies: [],\n };\n metadataUpdates.entities = {\n people: existingEntities.people || [],\n projects: [{\n id: resolvedId,\n name: resolvedName,\n type: 'project',\n }],\n terms: existingEntities.terms || [],\n companies: existingEntities.companies || [],\n };\n\n changes.push('project changed');\n }\n if (args.tagsToAdd || args.tagsToRemove) {\n const currentTags = transcript.metadata.tags || [];\n let nextTags = [...currentTags];\n if (args.tagsToAdd?.length) {\n for (const tag of args.tagsToAdd) {\n if (!nextTags.includes(tag)) {\n nextTags.push(tag);\n }\n }\n changes.push(`${args.tagsToAdd.length} tag(s) added`);\n }\n if (args.tagsToRemove?.length) {\n nextTags = nextTags.filter(tag => !args.tagsToRemove!.includes(tag));\n changes.push(`${args.tagsToRemove.length} tag(s) removed`);\n }\n metadataUpdates.tags = nextTags;\n }\n\n if (args.status) {\n previousStatus = transcript.metadata.status || 'reviewed';\n if (previousStatus !== args.status) {\n metadataUpdates.status = args.status as Metadata.TranscriptStatus;\n statusChanged = true;\n changes.push(`status: ${previousStatus} → ${args.status}`);\n } else {\n changes.push(`status unchanged (already ${args.status})`);\n }\n }\n if (args.comments) {\n metadataUpdates.comments = normalizeTranscriptComments(args.comments);\n changes.push(`comments updated (${metadataUpdates.comments.length})`);\n }\n\n if (Object.keys(metadataUpdates).length > 0) {\n transcript.updateMetadata(metadataUpdates as Partial<TranscriptMetadata>);\n }\n } finally {\n transcript.close();\n }\n persistChanges = true;\n\n return {\n success: true,\n originalPath: await sanitizePath(resolvedStoragePath, outputDirectory),\n outputPath: await sanitizePath(resolvedStoragePath, outputDirectory),\n renamed: false,\n statusChanged,\n message: changes.length > 0 ? `Transcript updated: ${changes.join(', ')}` : 'No changes made',\n };\n } finally {\n await access.finalize(persistChanges);\n }\n }\n\n // Find the transcript (returns absolute path for file operations)\n const absolutePath = await resolveTranscriptPath(args.transcriptPath, args.contextDirectory);\n\n // Validate status if provided\n if (args.status && !Metadata.isValidStatus(args.status)) {\n throw new Error(\n `Invalid status \"${args.status}\". ` +\n `Valid statuses are: ${Metadata.VALID_STATUSES.join(', ')}`\n );\n }\n\n if (!args.title && !args.projectId && !args.tagsToAdd && !args.tagsToRemove && !args.comments && !args.status) {\n throw new Error('Must specify at least one of: title, projectId, tagsToAdd, tagsToRemove, comments, or status');\n }\n\n let finalOutputPath = absolutePath;\n let wasRenamed = false;\n \n // Handle title/project/tags changes via existing editTranscript function\n // The editTranscript function handles PKL files directly\n if (args.title || args.projectId || args.tagsToAdd || args.tagsToRemove) {\n // Resolve context directories from the running server context (preferred)\n // or fall back to protokoll-config.yaml. The engine's editTranscript creates\n // a fresh Context.create() — it needs explicit contextDirectories so it can\n // find entities without walking up from the transcript's deep output path.\n let contextDirectories = await getContextDirectories();\n if ((!contextDirectories || contextDirectories.length === 0) && serverContext?.hasContext()) {\n contextDirectories = serverContext.getContextDirs();\n }\n\n const result = await Transcript.editTranscript(absolutePath, {\n title: args.title,\n projectId: args.projectId,\n tagsToAdd: args.tagsToAdd,\n tagsToRemove: args.tagsToRemove,\n contextDirectory: args.contextDirectory,\n contextDirectories,\n });\n\n // Validate that the output path stays within the output directory\n validatePathWithinDirectory(result.outputPath, outputDirectory);\n\n // editTranscript handles file operations internally for PKL files\n if (result.outputPath !== absolutePath) {\n wasRenamed = true;\n }\n \n finalOutputPath = result.outputPath;\n }\n\n // Handle status change using PklTranscript\n let statusChanged = false;\n let previousStatus: string | undefined;\n \n if (args.status) {\n const pklPath = ensurePklExtension(finalOutputPath);\n const transcript = PklTranscript.open(pklPath, { readOnly: false });\n try {\n previousStatus = transcript.metadata.status || 'reviewed';\n \n if (previousStatus !== args.status) {\n transcript.updateMetadata({ status: args.status as Metadata.TranscriptStatus });\n statusChanged = true;\n logger.info('transcript.status.update.complete', {\n transcriptPath: args.transcriptPath,\n previousStatus,\n nextStatus: args.status,\n });\n }\n } finally {\n transcript.close();\n }\n }\n\n if (args.comments) {\n const pklPath = ensurePklExtension(finalOutputPath);\n const transcript = PklTranscript.open(pklPath, { readOnly: false });\n try {\n transcript.updateMetadata({ comments: normalizeTranscriptComments(args.comments) } as Partial<TranscriptMetadata>);\n } finally {\n transcript.close();\n }\n }\n\n // Convert to relative paths for response\n const relativeOriginalPath = await sanitizePath(absolutePath || '', outputDirectory);\n const relativeOutputPath = await sanitizePath(finalOutputPath || '', outputDirectory);\n\n // Build message\n const changes: string[] = [];\n if (wasRenamed) changes.push(`moved to ${relativeOutputPath}`);\n if (args.title) changes.push(`title updated`);\n if (args.projectId) changes.push(`project changed`);\n if (args.tagsToAdd?.length) changes.push(`${args.tagsToAdd.length} tag(s) added`);\n if (args.tagsToRemove?.length) changes.push(`${args.tagsToRemove.length} tag(s) removed`);\n if (args.comments) changes.push(`comments updated (${normalizeTranscriptComments(args.comments).length})`);\n if (statusChanged) changes.push(`status: ${previousStatus} → ${args.status}`);\n if (!statusChanged && args.status) changes.push(`status unchanged (already ${args.status})`);\n\n return {\n success: true,\n originalPath: relativeOriginalPath,\n outputPath: relativeOutputPath,\n renamed: wasRenamed,\n statusChanged,\n message: changes.length > 0 ? `Transcript updated: ${changes.join(', ')}` : 'No changes made',\n };\n}\n\nexport async function handleChangeTranscriptDate(args: {\n transcriptPath: string;\n newDate: string;\n contextDirectory?: string;\n}) {\n const fsPromises = await import('node:fs/promises');\n const path = await import('node:path');\n \n // Parse the new date\n const newDate = new Date(args.newDate);\n if (isNaN(newDate.getTime())) {\n throw new Error(`Invalid date format: ${args.newDate}. Use ISO 8601 format (e.g., \"2026-01-15\" or \"2026-01-15T10:30:00Z\")`);\n }\n\n const access = await openToolTranscript(args.transcriptPath, args.contextDirectory);\n if (access.isGcs) {\n const transcript = PklTranscript.open(access.pklPath, { readOnly: false });\n try {\n transcript.updateMetadata({ date: newDate });\n } finally {\n transcript.close();\n await access.finalize(true);\n }\n\n const relativePath = access.storagePath\n ? await sanitizePath(access.storagePath, access.outputDirectory)\n : await sanitizePath(access.pklPath, access.outputDirectory);\n\n return {\n success: true,\n originalPath: relativePath,\n outputPath: relativePath,\n moved: false,\n message: 'Transcript date updated (GCS mode keeps the same object path).',\n };\n }\n\n // Get the output directory\n const outputDirectory = await getConfiguredDirectory('outputDirectory', args.contextDirectory);\n \n // Local mode: use already-resolved PKL path\n const absolutePath = access.pklPath;\n \n // Determine the new directory structure based on the date\n // Use YYYY/M structure (month-level organization, no zero-padding to match router convention)\n // Use UTC methods to avoid timezone issues with date-only strings\n const year = newDate.getUTCFullYear();\n const month = (newDate.getUTCMonth() + 1).toString(); // No zero-padding (e.g., \"8\" not \"08\")\n const newDirPath = path.join(outputDirectory, String(year), month);\n \n // Get the filename from the original path\n const filename = path.basename(absolutePath);\n const newAbsolutePath = path.join(newDirPath, filename);\n \n // Check if the file would move to a different location\n if (absolutePath === newAbsolutePath) {\n // Still update the date in metadata even if not moving\n const pklPath = ensurePklExtension(absolutePath);\n const transcript = PklTranscript.open(pklPath, { readOnly: false });\n try {\n transcript.updateMetadata({ date: newDate });\n } finally {\n transcript.close();\n }\n \n return {\n success: true,\n originalPath: await sanitizePath(pklPath, outputDirectory),\n outputPath: await sanitizePath(pklPath, outputDirectory),\n moved: false,\n message: 'Transcript date updated. No move needed (already in correct directory).',\n };\n }\n \n // Validate that the new path stays within the output directory\n validatePathWithinDirectory(newAbsolutePath, outputDirectory);\n \n // Create the new directory if it doesn't exist\n await mkdir(newDirPath, { recursive: true });\n \n // Check if a file already exists at the destination\n const destExists = await transcriptExists(newAbsolutePath);\n if (destExists.exists) {\n throw new Error(\n `A file already exists at the destination: ${await sanitizePath(destExists.path || newAbsolutePath, outputDirectory)}. ` +\n `Please rename the transcript first or choose a different date.`\n );\n }\n \n // Ensure we're working with PKL files\n const pklPath = ensurePklExtension(absolutePath);\n const newPklPath = ensurePklExtension(newAbsolutePath);\n \n // Update the date in metadata\n const transcript = PklTranscript.open(pklPath, { readOnly: false });\n try {\n transcript.updateMetadata({ date: newDate });\n } finally {\n transcript.close();\n }\n \n // Move the file to the new location\n await fsPromises.rename(pklPath, newPklPath);\n \n // Also move any associated WAL/SHM files if they exist\n const walPath = pklPath + '-wal';\n const shmPath = pklPath + '-shm';\n try {\n await fsPromises.rename(walPath, newPklPath + '-wal');\n } catch { /* ignore if doesn't exist */ }\n try {\n await fsPromises.rename(shmPath, newPklPath + '-shm');\n } catch { /* ignore if doesn't exist */ }\n \n // Convert to relative paths for response\n const relativeOriginalPath = await sanitizePath(pklPath, outputDirectory);\n const relativeOutputPath = await sanitizePath(newPklPath, outputDirectory);\n \n return {\n success: true,\n originalPath: relativeOriginalPath,\n outputPath: relativeOutputPath,\n moved: true,\n message: `Transcript moved from ${relativeOriginalPath} to ${relativeOutputPath}`,\n };\n}\n\nexport async function handleCombineTranscripts(args: {\n transcriptPaths: string[];\n title?: string;\n projectId?: string;\n contextDirectory?: string;\n}) {\n // Validate that contextDirectory is not provided in remote mode\n await validateNotRemoteMode(args.contextDirectory);\n\n const ServerConfig = await import('../serverConfig');\n const outputStorage = ServerConfig.getOutputStorage();\n if (outputStorage.name === 'gcs') {\n throw new Error(\n 'Combining transcripts is not yet supported in GCS mode. ' +\n 'Please run this operation against a filesystem-backed workspace.'\n );\n }\n \n if (args.transcriptPaths.length < 2) {\n throw new Error('At least 2 transcript files are required');\n }\n\n // Find all transcripts (returns absolute paths for file operations)\n const absolutePaths: string[] = [];\n for (const relativePath of args.transcriptPaths) {\n const absolute = await resolveTranscriptPath(relativePath, args.contextDirectory);\n absolutePaths.push(absolute);\n }\n\n // Resolve context directories from server config (preferred) and\n // fall back to active server context directories when available.\n const serverContext = ServerConfig.getContext();\n let contextDirectories = await getContextDirectories();\n if ((!contextDirectories || contextDirectories.length === 0) && serverContext?.hasContext()) {\n contextDirectories = serverContext.getContextDirs();\n }\n \n const result = await Transcript.combineTranscripts(absolutePaths, {\n title: args.title,\n projectId: args.projectId,\n contextDirectory: args.contextDirectory,\n contextDirectories,\n });\n\n // Validate that the output path stays within the output directory\n // This prevents project routing from writing files outside the allowed directory\n await validatePathWithinOutputDirectory(result.outputPath, args.contextDirectory);\n\n // The combineTranscripts function in operations.ts now creates the PKL file directly\n // No additional validation or writing needed here - the file is already saved\n\n // Delete source files\n const fsPromises = await import('node:fs/promises');\n const deletedFiles: string[] = [];\n for (const sourcePath of absolutePaths) {\n try {\n await fsPromises.unlink(sourcePath);\n deletedFiles.push(sourcePath);\n } catch {\n // Ignore deletion errors\n }\n }\n\n // Convert to relative paths for response\n const outputDirectory = await getConfiguredDirectory('outputDirectory', args.contextDirectory);\n const relativeOutputPath = await sanitizePath(result.outputPath || '', outputDirectory);\n const relativeSourceFiles = await Promise.all(\n absolutePaths.map(p => sanitizePath(p || '', outputDirectory))\n );\n const relativeDeletedFiles = await Promise.all(\n deletedFiles.map(p => sanitizePath(p || '', outputDirectory))\n );\n\n return {\n success: true,\n outputPath: relativeOutputPath,\n sourceFiles: relativeSourceFiles,\n deletedFiles: relativeDeletedFiles,\n message: `Combined ${absolutePaths.length} transcripts into: ${relativeOutputPath}`,\n };\n}\n\nexport async function handleUpdateTranscriptContent(args: {\n transcriptPath: string;\n content: string;\n contentTarget?: 'enhanced' | 'original' | string;\n contextDirectory?: string;\n}) {\n const updateRawTranscript = String(args.contentTarget || 'enhanced') === 'original';\n const access = await openToolTranscript(args.transcriptPath, args.contextDirectory);\n try {\n const transcript = PklTranscript.open(access.pklPath, { readOnly: false });\n try {\n if (updateRawTranscript) {\n const raw = transcript.hasRawTranscript ? transcript.rawTranscript : undefined;\n transcript.addArtifact(\n 'raw_transcript',\n Buffer.from(args.content, 'utf8'),\n {\n model: raw?.model,\n duration: raw?.duration,\n transcribedAt: raw?.transcribedAt,\n updatedAt: new Date().toISOString(),\n updatedBy: 'protokoll_update_transcript_content',\n }\n );\n } else {\n // Update the content - PklTranscript handles history tracking automatically\n transcript.updateContent(args.content);\n }\n } finally {\n transcript.close();\n }\n\n const relativePath = access.storagePath\n ? await sanitizePath(access.storagePath, access.outputDirectory)\n : await sanitizePath(access.pklPath, access.outputDirectory);\n\n return {\n success: true,\n filePath: relativePath,\n updatedTarget: updateRawTranscript ? 'original' : 'enhanced',\n message: updateRawTranscript\n ? 'Original transcript text updated successfully'\n : 'Transcript content updated successfully',\n };\n } finally {\n await access.finalize(true);\n }\n}\n\nexport async function handleUpdateTranscriptEntityReferences(args: {\n transcriptPath: string;\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 contextDirectory?: string;\n}) {\n const access = await openToolTranscript(args.transcriptPath, args.contextDirectory);\n const absolutePath = access.pklPath;\n try {\n\n // Validate and sanitize entity IDs\n const validateEntityId = (id: string, name: string, type: string): string => {\n if (!id || typeof id !== 'string') {\n throw new Error(`Invalid entity ID for ${type} \"${name}\": ID must be a non-empty string`);\n }\n \n // Check for common JSON parsing errors\n if (id.includes('},') || id.includes('{') || id.includes('}') || id.includes(',')) {\n throw new Error(\n `Invalid entity ID \"${id}\" for ${type} \"${name}\". ` +\n `Entity IDs should be UUIDs or slugified identifiers (e.g., \"a1b2c3d4-...\", \"jack-smith\"), ` +\n `not JSON syntax. Please provide a valid ID.`\n );\n }\n \n // Accept UUID format\n const uuidRegex = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;\n if (uuidRegex.test(id)) {\n return id.trim();\n }\n \n // Accept slug format for backward compatibility\n const slugRegex = /^[a-z0-9_-]+$/i;\n if (slugRegex.test(id)) {\n return id.trim();\n }\n \n throw new Error(\n `Invalid entity ID \"${id}\" for ${type} \"${name}\". ` +\n `Entity IDs should be UUIDs or slugified identifiers (letters, numbers, hyphens, underscores).`\n );\n };\n\n // Convert incoming entities to EntityReference format with validation\n const entityReferences: Metadata.EntityReference[] = [];\n \n if (args.entities.people) {\n entityReferences.push(...args.entities.people.map(e => ({\n id: validateEntityId(e.id, e.name, 'person'),\n name: e.name.trim(),\n type: 'person' as const,\n })));\n }\n \n if (args.entities.projects) {\n entityReferences.push(...args.entities.projects.map(e => ({\n id: validateEntityId(e.id, e.name, 'project'),\n name: e.name.trim(),\n type: 'project' as const,\n })));\n }\n \n if (args.entities.terms) {\n entityReferences.push(...args.entities.terms.map(e => ({\n id: validateEntityId(e.id, e.name, 'term'),\n name: e.name.trim(),\n type: 'term' as const,\n })));\n }\n \n if (args.entities.companies) {\n entityReferences.push(...args.entities.companies.map(e => ({\n id: validateEntityId(e.id, e.name, 'company'),\n name: e.name.trim(),\n type: 'company' as const,\n })));\n }\n\n // Group by type\n const entities: NonNullable<Metadata.TranscriptMetadata['entities']> = {\n people: entityReferences.filter(e => e.type === 'person'),\n projects: entityReferences.filter(e => e.type === 'project'),\n terms: entityReferences.filter(e => e.type === 'term'),\n companies: entityReferences.filter(e => e.type === 'company'),\n };\n\n // Ensure we're working with a PKL file\n const pklPath = ensurePklExtension(absolutePath);\n \n const transcript = PklTranscript.open(pklPath, { readOnly: false });\n const transcriptUuid = transcript.metadata.id;\n const projectId = transcript.metadata.project;\n try {\n // Update entities in metadata\n transcript.updateMetadata({ entities });\n } finally {\n transcript.close();\n }\n\n // Update weight model incrementally\n const { updateTranscriptInWeightModel } = await import('../services/weightModel');\n const allEntityIds = entityReferences.map(e => e.id);\n updateTranscriptInWeightModel(transcriptUuid, allEntityIds, projectId);\n\n // Convert to relative path for response\n const relativePath = access.storagePath\n ? await sanitizePath(access.storagePath, access.outputDirectory)\n : await sanitizePath(pklPath, access.outputDirectory);\n\n return {\n success: true,\n filePath: relativePath,\n message: 'Transcript entity references updated successfully',\n };\n } finally {\n await access.finalize(true);\n }\n}\n\nexport async function handleProvideFeedback(args: {\n transcriptPath: string;\n feedback: string;\n model?: string;\n contextDirectory?: string;\n}) {\n const access = await openToolTranscript(args.transcriptPath, args.contextDirectory);\n const absolutePath = access.pklPath;\n\n // Ensure we're working with a PKL file\n const pklPath = ensurePklExtension(absolutePath);\n \n const transcript = PklTranscript.open(pklPath, { readOnly: false });\n try {\n const transcriptContent = transcript.content;\n const context = await createToolContext(args.contextDirectory);\n const reasoning = Reasoning.create({ model: args.model || DEFAULT_MODEL });\n\n // Create a feedback context\n const feedbackCtx: Transcript.FeedbackContext = {\n transcriptPath: pklPath,\n transcriptContent,\n originalContent: transcriptContent,\n context,\n changes: [],\n verbose: false,\n dryRun: true, // Set to dry run so we can apply changes ourselves\n };\n\n await Transcript.processFeedback(args.feedback, feedbackCtx, reasoning);\n\n // Apply content changes to the PKL file\n if (feedbackCtx.changes.length > 0) {\n // Update content if it changed\n if (feedbackCtx.transcriptContent !== transcriptContent) {\n transcript.updateContent(feedbackCtx.transcriptContent);\n }\n \n // Handle title changes\n const titleChange = feedbackCtx.changes.find(c => c.type === 'title_changed');\n if (titleChange && titleChange.details.new_title) {\n transcript.updateMetadata({ title: titleChange.details.new_title as string });\n }\n \n // Handle project changes\n const projectChange = feedbackCtx.changes.find(c => c.type === 'project_changed');\n if (projectChange && projectChange.details.project_id) {\n transcript.updateMetadata({ \n projectId: projectChange.details.project_id as string,\n project: projectChange.details.project_name as string | undefined,\n });\n }\n }\n\n // Convert to relative path for response\n const outputDirectory = await getConfiguredDirectory('outputDirectory', args.contextDirectory);\n const relativeOutputPath = await sanitizePath(pklPath, outputDirectory);\n\n return {\n success: true,\n changesApplied: feedbackCtx.changes.length,\n changes: feedbackCtx.changes.map(c => ({\n type: c.type,\n description: c.description,\n })),\n outputPath: relativeOutputPath,\n moved: false,\n };\n } finally {\n transcript.close();\n await access.finalize(true);\n }\n}\n\nexport async function handleEnhanceTranscript(args: {\n transcriptPath: string;\n originalText?: string;\n model?: string;\n contextDirectory?: string;\n}) {\n const access = await openToolTranscript(args.transcriptPath, args.contextDirectory);\n const pklPath = access.pklPath;\n const requestId = randomUUID();\n\n const transcript = PklTranscript.open(pklPath, { readOnly: false });\n\n let tempDir: string | null = null;\n\n try {\n const explicitOriginal = (args.originalText || '').trim();\n const rawOriginal = (transcript.rawTranscript?.text || '').trim();\n const currentContent = (transcript.content || '').trim();\n const sourceText = explicitOriginal || rawOriginal || currentContent;\n\n if (!sourceText) {\n throw new Error('No source text available to enhance. Save or provide Original content first.');\n }\n\n const model = args.model || DEFAULT_MODEL;\n const reasoningLevel = 'low' as const;\n const maxIterations = 20;\n const startedAt = Date.now();\n let toolCallCount = 0;\n logger.info('transcript.enhance.start', {\n requestId,\n transcriptPath: args.transcriptPath,\n model,\n sourceLength: sourceText.length,\n hasExplicitOriginal: explicitOriginal.length > 0,\n hasRawTranscript: rawOriginal.length > 0,\n contextDirectory: args.contextDirectory ?? null,\n });\n\n // Build context and routing similar to the standard pipeline.\n const context = await createToolContext(args.contextDirectory);\n const projectCount = context.getAllProjects().length;\n const peopleCount = context.getAllPeople().length;\n const termCount = context.getAllTerms().length;\n const companyCount = context.getAllCompanies().length;\n logger.info('transcript.enhance.context.loaded', {\n requestId,\n transcriptPath: args.transcriptPath,\n projectCount,\n peopleCount,\n termCount,\n companyCount,\n });\n const outputDirectory = await getConfiguredDirectory('outputDirectory', args.contextDirectory);\n const defaultStructure = 'month' as const;\n const defaultFilenameOptions = ['date', 'time', 'subject'] as const;\n const routingProjects: Routing.ProjectRoute[] = context.getAllProjects()\n .filter(project => project.active !== false)\n .map(project => ({\n projectId: project.id,\n destination: {\n path: project.routing?.destination || outputDirectory,\n structure: project.routing?.structure || defaultStructure,\n filename_options: project.routing?.filename_options || [...defaultFilenameOptions],\n createDirectories: true,\n },\n classification: project.classification,\n active: project.active,\n auto_tags: project.routing?.auto_tags,\n }));\n const routing = Routing.create({\n default: {\n path: outputDirectory,\n structure: defaultStructure,\n filename_options: [...defaultFilenameOptions],\n createDirectories: true,\n },\n projects: routingProjects,\n conflict_resolution: 'primary',\n }, context);\n\n const fallbackDate = transcript.metadata.date instanceof Date\n ? transcript.metadata.date\n : new Date();\n const fallbackHash = transcript.metadata.audioHash || transcript.metadata.id || '';\n const routingContext: Routing.RoutingContext = {\n transcriptText: sourceText,\n audioDate: fallbackDate,\n sourceFile: pklPath,\n hash: fallbackHash,\n };\n const routeResult = routing.route(routingContext);\n const projectForReplace = routeResult.projectId || transcript.metadata.projectId || transcript.metadata.project;\n\n transcript.enhancementLog.logStep(new Date(), 'enhance', 'enhancement_start', {\n model,\n reasoningLevel,\n maxIterations,\n transcriptPath: args.transcriptPath,\n hasExplicitOriginal: explicitOriginal.length > 0,\n source: explicitOriginal ? 'explicit_original_text' : (rawOriginal ? 'raw_transcript' : 'enhanced_content_fallback'),\n routedProject: routeResult.projectId || null,\n routedConfidence: routeResult.confidence,\n sourceLength: sourceText.length,\n });\n\n // Run simple-replace with the same engine phase used by audio processing.\n tempDir = await mkdtemp(resolve(tmpdir(), 'protokoll-enhance-'));\n const simpleReplace = Phases.createSimpleReplacePhase({ debug: false }, context);\n const simpleReplaceResult = await simpleReplace.replace(\n sourceText,\n {\n project: projectForReplace || undefined,\n confidence: routeResult.confidence,\n },\n tempDir,\n transcript.metadata.id || 'manual-enhancement'\n );\n logger.info('transcript.enhance.simple_replace.complete', {\n requestId,\n transcriptPath: args.transcriptPath,\n replacements: simpleReplaceResult.stats.totalReplacements,\n tier1Replacements: simpleReplaceResult.stats.tier1Replacements,\n tier2Replacements: simpleReplaceResult.stats.tier2Replacements,\n processingTimeMs: simpleReplaceResult.stats.processingTimeMs,\n });\n\n if (simpleReplaceResult.stats.totalReplacements > 0) {\n transcript.enhancementLog.logStep(new Date(), 'simple-replace', 'phase_complete', {\n totalReplacements: simpleReplaceResult.stats.totalReplacements,\n tier1Replacements: simpleReplaceResult.stats.tier1Replacements,\n tier2Replacements: simpleReplaceResult.stats.tier2Replacements,\n projectContext: simpleReplaceResult.stats.projectContext,\n processingTimeMs: simpleReplaceResult.stats.processingTimeMs,\n });\n for (const mapping of simpleReplaceResult.stats.appliedMappings) {\n transcript.enhancementLog.logStep(new Date(), 'simple-replace', 'correction_applied', {\n original: mapping.soundsLike,\n replacement: mapping.correctText,\n tier: mapping.tier,\n occurrences: mapping.occurrences,\n entityId: mapping.entityId,\n entityType: mapping.entityType,\n });\n }\n }\n\n const preIdentifiedEntities: Agentic.ToolContext['preIdentifiedEntities'] = {\n people: new Set<string>(),\n projects: new Set<string>(),\n terms: new Set<string>(),\n companies: new Set<string>(),\n };\n for (const mapping of simpleReplaceResult.stats.appliedMappings) {\n if (!mapping.entityId || !mapping.entityType) {\n continue;\n }\n if (mapping.entityType === 'person') {\n preIdentifiedEntities.people.add(mapping.entityId);\n } else if (mapping.entityType === 'project') {\n preIdentifiedEntities.projects.add(mapping.entityId);\n } else if (mapping.entityType === 'term') {\n preIdentifiedEntities.terms.add(mapping.entityId);\n }\n }\n\n logger.info('transcript.enhance.agentic.start', {\n requestId,\n transcriptPath: args.transcriptPath,\n routedProject: routeResult.projectId || null,\n routedConfidence: routeResult.confidence,\n preIdentifiedPeople: preIdentifiedEntities.people.size,\n preIdentifiedProjects: preIdentifiedEntities.projects.size,\n preIdentifiedTerms: preIdentifiedEntities.terms.size,\n sourceLength: simpleReplaceResult.text.length,\n });\n\n // Run agentic enhancement exactly like pipeline enhancement stage.\n const reasoning = Reasoning.create({ model, reasoningLevel });\n const toolContext: Agentic.ToolContext & {\n modelConfiguration?: { model: string; reasoningLevel?: string };\n onModelCallStart?: (entry: {\n callIndex: number;\n phase: string;\n request: Record<string, unknown>;\n timestamp: Date;\n }) => void;\n onModelCallComplete?: (entry: {\n callIndex: number;\n phase: string;\n durationMs: number;\n response: Record<string, unknown>;\n timestamp: Date;\n }) => void;\n } = {\n transcriptText: simpleReplaceResult.text,\n audioDate: fallbackDate,\n sourceFile: pklPath,\n contextInstance: context,\n routingInstance: routing,\n interactiveMode: false,\n preIdentifiedEntities,\n modelConfiguration: {\n model,\n reasoningLevel,\n },\n onToolCallStart: (tool, input) => {\n toolCallCount++;\n logger.info('transcript.enhance.agentic.tool_start', {\n requestId,\n transcriptPath: args.transcriptPath,\n callIndex: toolCallCount,\n tool,\n input,\n });\n transcript.enhancementLog.logStep(new Date(), 'enhance', 'tool_start', {\n callIndex: toolCallCount,\n tool,\n input,\n });\n },\n onToolCallComplete: (entry) => {\n logger.info('transcript.enhance.agentic.tool_complete', {\n requestId,\n transcriptPath: args.transcriptPath,\n tool: entry.tool,\n durationMs: entry.durationMs,\n success: entry.success,\n });\n transcript.enhancementLog.logStep(entry.timestamp, 'enhance', 'tool_complete', {\n tool: entry.tool,\n input: entry.input,\n output: entry.output,\n durationMs: entry.durationMs,\n success: entry.success,\n });\n },\n onModelCallStart: (entry) => {\n logger.info('transcript.enhance.agentic.model_call_start', {\n requestId,\n transcriptPath: args.transcriptPath,\n callIndex: entry.callIndex,\n phase: entry.phase,\n });\n transcript.enhancementLog.logStep(entry.timestamp, 'enhance', 'model_call_start', {\n callIndex: entry.callIndex,\n phase: entry.phase,\n request: entry.request,\n });\n },\n onModelCallComplete: (entry: {\n callIndex: number;\n phase: string;\n durationMs: number;\n response: Record<string, unknown>;\n timestamp: Date;\n }) => {\n logger.info('transcript.enhance.agentic.model_call_complete', {\n requestId,\n transcriptPath: args.transcriptPath,\n callIndex: entry.callIndex,\n phase: entry.phase,\n durationMs: entry.durationMs,\n });\n transcript.enhancementLog.logStep(entry.timestamp, 'enhance', 'model_call_complete', {\n callIndex: entry.callIndex,\n phase: entry.phase,\n durationMs: entry.durationMs,\n response: entry.response,\n });\n },\n };\n const executor = Agentic.create(reasoning, toolContext);\n\n const agenticResult = await executor.process(simpleReplaceResult.text);\n const enhancedText = (agenticResult.enhancedText || '').trim() || sourceText;\n const enhancementSucceeded = enhancedText.length > 50 && enhancedText !== sourceText;\n const finalStatus = enhancementSucceeded ? 'enhanced' : (transcript.metadata.status || 'initial');\n logger.info('transcript.enhance.agentic.complete', {\n requestId,\n transcriptPath: args.transcriptPath,\n toolsUsed: agenticResult.toolsUsed,\n iterations: agenticResult.iterations,\n totalToolCalls: toolCallCount,\n changed: enhancedText !== sourceText,\n enhancedLength: enhancedText.length,\n elapsedMs: Date.now() - startedAt,\n });\n\n const referenced = agenticResult.state.referencedEntities;\n const entities = {\n people: [] as Metadata.EntityReference[],\n projects: [] as Metadata.EntityReference[],\n terms: [] as Metadata.EntityReference[],\n companies: [] as Metadata.EntityReference[],\n };\n for (const personId of referenced.people) {\n const person = context.getPerson(personId);\n if (person) {\n entities.people.push({ id: person.id, name: person.name, type: 'person' });\n }\n }\n for (const projectId of referenced.projects) {\n const project = context.getProject(projectId);\n if (project) {\n entities.projects.push({ id: project.id, name: project.name, type: 'project' });\n } else {\n const gcsEntity = await findContextEntityInGcs('project', projectId);\n if (gcsEntity && typeof gcsEntity.id === 'string' && typeof gcsEntity.name === 'string') {\n entities.projects.push({ id: gcsEntity.id, name: gcsEntity.name, type: 'project' });\n }\n }\n }\n for (const termId of referenced.terms) {\n const term = context.getTerm(termId);\n if (term) {\n entities.terms.push({ id: term.id, name: term.name, type: 'term' });\n }\n }\n for (const companyId of referenced.companies) {\n const company = context.getCompany(companyId);\n if (company) {\n entities.companies.push({ id: company.id, name: company.name, type: 'company' });\n }\n }\n const hasEntities = entities.people.length > 0\n || entities.projects.length > 0\n || entities.terms.length > 0\n || entities.companies.length > 0;\n\n const decidedProjectId = agenticResult.state.routeDecision?.projectId || routeResult.projectId || undefined;\n let decidedProjectName: string | undefined;\n if (decidedProjectId) {\n const decidedProject = context.getProject(decidedProjectId);\n if (decidedProject) {\n decidedProjectName = decidedProject.name;\n } else {\n const gcsEntity = await findContextEntityInGcs('project', decidedProjectId);\n if (gcsEntity && typeof gcsEntity.name === 'string') {\n decidedProjectName = gcsEntity.name;\n }\n }\n }\n const decidedConfidence = agenticResult.state.routeDecision?.confidence ?? routeResult.confidence;\n\n transcript.updateContent(enhancedText);\n transcript.updateMetadata({\n status: finalStatus as TranscriptMetadata['status'],\n projectId: decidedProjectId || transcript.metadata.projectId,\n project: decidedProjectName || transcript.metadata.project,\n confidence: typeof decidedConfidence === 'number' ? decidedConfidence : transcript.metadata.confidence,\n entities: hasEntities ? entities : transcript.metadata.entities,\n });\n\n transcript.enhancementLog.logStep(new Date(), 'enhance', 'enhancement_complete', {\n status: finalStatus,\n model,\n reasoningLevel,\n maxIterations,\n toolsUsed: agenticResult.toolsUsed,\n totalToolCalls: toolCallCount,\n iterations: agenticResult.iterations,\n processingTimeMs: Date.now() - startedAt,\n });\n logger.info('transcript.enhance.complete', {\n requestId,\n transcriptPath: args.transcriptPath,\n status: finalStatus,\n projectId: decidedProjectId || null,\n totalToolCalls: toolCallCount,\n changed: enhancedText !== sourceText,\n processingTimeMs: Date.now() - startedAt,\n });\n\n return {\n success: true,\n transcriptPath: args.transcriptPath,\n status: finalStatus,\n projectId: decidedProjectId || null,\n projectName: decidedProjectName || null,\n toolsUsed: agenticResult.toolsUsed,\n totalToolCalls: toolCallCount,\n iterations: agenticResult.iterations,\n processingTimeMs: Date.now() - startedAt,\n sourceLength: sourceText.length,\n enhancedLength: enhancedText.length,\n changed: enhancedText !== sourceText,\n };\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n transcript.enhancementLog.logStep(new Date(), 'enhance', 'enhancement_failed', {\n transcriptPath: args.transcriptPath,\n model: args.model || DEFAULT_MODEL,\n reasoningLevel: 'medium',\n maxIterations: 20,\n error: message,\n });\n // Always emit a terminal completion event so clients waiting on\n // enhancement_complete can reliably exit \"in progress\" state.\n transcript.enhancementLog.logStep(new Date(), 'enhance', 'enhancement_complete', {\n status: 'error',\n failed: true,\n transcriptPath: args.transcriptPath,\n model: args.model || DEFAULT_MODEL,\n reasoningLevel: 'medium',\n maxIterations: 20,\n error: message,\n });\n logger.error('transcript.enhance.failed', {\n requestId,\n transcriptPath: args.transcriptPath,\n error: message,\n stack: error instanceof Error ? error.stack : undefined,\n });\n throw error;\n } finally {\n if (tempDir) {\n await rm(tempDir, { recursive: true, force: true });\n }\n transcript.close();\n await access.finalize(true);\n }\n}\n\nexport async function handleCreateNote(args: {\n title: string;\n content?: string;\n projectId?: string;\n tags?: string[];\n date?: string;\n contextDirectory?: string;\n}) {\n const ServerConfig = await import('../serverConfig');\n const outputStorage = ServerConfig.getOutputStorage();\n\n // Get the output directory\n const outputDirectory = await getConfiguredDirectory('outputDirectory', args.contextDirectory);\n \n // Parse the date or use current date\n const noteDate = args.date ? new Date(args.date) : new Date();\n const year = noteDate.getFullYear();\n const month = String(noteDate.getMonth() + 1).padStart(2, '0');\n const day = String(noteDate.getDate()).padStart(2, '0');\n const hours = String(noteDate.getHours()).padStart(2, '0');\n const minutes = String(noteDate.getMinutes()).padStart(2, '0');\n const timestamp = String(noteDate.getTime());\n \n // Create a slug from the title for the filename\n const titleSlug = args.title\n .toLowerCase()\n .replace(/[^a-z0-9]+/g, '-')\n .replace(/^-+|-+$/g, '')\n .substring(0, 50); // Limit length\n \n // Use .pkl extension for PKL format\n const filename = `${day}-${hours}${minutes}-${timestamp.substring(0, 14)}-${titleSlug}.pkl`;\n const relativePath = `${year}/${month}/${filename}`;\n const absolutePath = resolve(outputDirectory, relativePath);\n \n // Validate that the path stays within the output directory\n if (outputStorage.name !== 'gcs') {\n validatePathWithinDirectory(absolutePath, outputDirectory);\n }\n \n // Build metadata\n let projectName: string | undefined;\n \n // If projectId is provided, try to get project name from context\n if (args.projectId) {\n try {\n const context = await getProjectLookupContext(args.contextDirectory);\n const project = await context.getProject(args.projectId);\n if (project) {\n projectName = project.name;\n } else {\n const gcsEntity = await findContextEntityInGcs('project', args.projectId);\n if (gcsEntity && typeof gcsEntity.name === 'string') {\n projectName = gcsEntity.name;\n }\n }\n } catch {\n // Ignore errors - project name is optional\n }\n }\n \n // Build entities\n const entities = {\n people: [] as Metadata.EntityReference[],\n projects: args.projectId && projectName ? [{\n id: args.projectId,\n name: projectName,\n type: 'project' as const,\n }] : [] as Metadata.EntityReference[],\n terms: [] as Metadata.EntityReference[],\n companies: [] as Metadata.EntityReference[],\n };\n \n // Build PKL metadata\n const pklMetadata = {\n id: '', // Will be auto-generated by PklTranscript.create()\n title: args.title,\n date: noteDate,\n projectId: args.projectId,\n project: projectName,\n tags: args.tags || [],\n entities,\n status: 'reviewed' as const, // Default status for new notes\n };\n \n if (outputStorage.name === 'gcs') {\n const tmpRoot = await mkdtemp(`${tmpdir()}/protokoll-mcp-note-`);\n const tmpPklPath = resolve(tmpRoot, filename);\n try {\n const transcript = PklTranscript.create(tmpPklPath, pklMetadata);\n try {\n if (args.content) {\n transcript.updateContent(args.content);\n }\n } finally {\n transcript.close();\n }\n\n const created = await readFile(tmpPklPath);\n await outputStorage.writeFile(relativePath, created);\n markTranscriptIndexDirtyForStorage(outputStorage, outputDirectory, relativePath);\n } finally {\n await rm(tmpRoot, { recursive: true, force: true });\n }\n\n return {\n success: true,\n filePath: await sanitizePath(relativePath, outputDirectory),\n filename: filename,\n message: `Note \"${args.title}\" created successfully`,\n };\n }\n \n // Create directory if it doesn't exist\n await mkdir(dirname(absolutePath), { recursive: true });\n \n // Create PKL transcript\n const transcript = PklTranscript.create(absolutePath, pklMetadata);\n try {\n if (args.content) {\n transcript.updateContent(args.content);\n }\n } finally {\n transcript.close();\n }\n \n // Convert to relative path for response\n const relativeOutputPath = await sanitizePath(absolutePath, outputDirectory);\n \n return {\n success: true,\n filePath: relativeOutputPath,\n filename: filename,\n message: `Note \"${args.title}\" created successfully`,\n };\n}\n\nexport async function handleGetEnhancementLog(args: {\n transcriptPath: string;\n phase?: 'transcribe' | 'enhance' | 'simple-replace';\n limit?: number;\n offset?: number;\n contextDirectory?: string;\n}) {\n const access = await openToolTranscript(args.transcriptPath, args.contextDirectory);\n try {\n const transcript = PklTranscript.open(access.pklPath, { readOnly: true });\n try {\n // Get enhancement log with optional phase filter\n const allEntries = transcript.getEnhancementLog(args.phase ? { phase: args.phase } : undefined);\n\n // Apply pagination\n const limit = args.limit ?? 100;\n const offset = args.offset ?? 0;\n const total = allEntries.length;\n const entries = allEntries.slice(offset, offset + limit);\n\n // Convert entries to serializable format\n const serializedEntries = entries.map((entry: any) => ({\n id: entry.id,\n timestamp: entry.timestamp.toISOString(),\n phase: entry.phase,\n action: entry.action,\n details: entry.details,\n entities: entry.entities,\n }));\n\n return {\n entries: serializedEntries,\n total,\n limit,\n offset,\n hasMore: offset + limit < total,\n };\n } finally {\n transcript.close();\n }\n } finally {\n await access.finalize(false);\n }\n}\n\n/**\n * Apply text corrections using regex replacement\n */\nfunction applyCorrections(\n transcriptText: string,\n corrections: Map<string, string>\n): string {\n let correctedText = transcriptText;\n \n for (const [original, corrected] of corrections) {\n if (original !== corrected && corrected.trim() !== '') {\n // Replace all instances of the original with the corrected version\n const regex = new RegExp(original.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&'), 'gi');\n correctedText = correctedText.replace(regex, corrected);\n }\n }\n \n return correctedText;\n}\n\nfunction countOccurrencesCaseInsensitive(text: string, target: string): number {\n if (!target.trim()) {\n return 0;\n }\n const regex = new RegExp(target.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&'), 'gi');\n const matches = text.match(regex);\n return matches ? matches.length : 0;\n}\n\nexport async function handleRejectCorrection(args: {\n transcriptPath: string;\n correctionEntryId: number;\n contextDirectory?: string;\n}) {\n if (!Number.isInteger(args.correctionEntryId) || args.correctionEntryId < 1) {\n throw new Error('correctionEntryId must be a positive integer');\n }\n\n const access = await openToolTranscript(args.transcriptPath, args.contextDirectory);\n const transcript = PklTranscript.open(access.pklPath, { readOnly: false });\n\n try {\n const allEntries = transcript.getEnhancementLog();\n const correctionEntry = allEntries.find((entry) => entry.id === args.correctionEntryId);\n\n if (!correctionEntry) {\n throw new Error(`Correction entry not found: ${args.correctionEntryId}`);\n }\n if (correctionEntry.action !== 'correction_applied') {\n throw new Error(`Entry ${args.correctionEntryId} is not a correction_applied action`);\n }\n\n const details = (correctionEntry.details || {}) as Record<string, unknown>;\n const original = String(details.original || '').trim();\n const replacement = String(details.replacement || '').trim();\n if (!original || !replacement) {\n throw new Error(`Correction entry ${args.correctionEntryId} is missing original/replacement details`);\n }\n\n const alreadyRejected = allEntries.some((entry) => {\n if (entry.action !== 'correction_rejected') {\n return false;\n }\n const rejectDetails = (entry.details || {}) as Record<string, unknown>;\n return Number(rejectDetails.correctionEntryId) === args.correctionEntryId;\n });\n if (alreadyRejected) {\n return {\n success: true,\n alreadyRejected: true,\n correctionEntryId: args.correctionEntryId,\n original,\n replacement,\n revertedOccurrences: 0,\n message: `Correction #${args.correctionEntryId} is already rejected`,\n };\n }\n\n const originalContent = transcript.content || '';\n const beforeCount = countOccurrencesCaseInsensitive(originalContent, replacement);\n const revertedContent = applyCorrections(\n originalContent,\n new Map([[replacement, original]])\n );\n const afterCount = countOccurrencesCaseInsensitive(revertedContent, replacement);\n const revertedOccurrences = Math.max(0, beforeCount - afterCount);\n const rejectionPhase = correctionEntry.phase === 'transcribe'\n || correctionEntry.phase === 'enhance'\n || correctionEntry.phase === 'simple-replace'\n ? correctionEntry.phase\n : 'simple-replace';\n\n transcript.updateContent(revertedContent);\n transcript.enhancementLog.logStep(\n new Date(),\n rejectionPhase,\n 'correction_rejected',\n {\n correctionEntryId: args.correctionEntryId,\n original,\n replacement,\n revertedOccurrences,\n sourceTimestamp: correctionEntry.timestamp.toISOString(),\n }\n );\n\n return {\n success: true,\n correctionEntryId: args.correctionEntryId,\n original,\n replacement,\n revertedOccurrences,\n message: `Rejected correction #${args.correctionEntryId} and restored \"${replacement}\" to \"${original}\"`,\n };\n } finally {\n transcript.close();\n await access.finalize(true);\n }\n}\n\nexport async function handleCorrectToEntity(args: {\n transcriptPath: string;\n selectedText: string;\n entityType: 'person' | 'project' | 'term' | 'company';\n entityId?: string;\n entityName?: string;\n firstName?: string;\n lastName?: string;\n description?: string;\n projectId?: string;\n contextDirectory?: string;\n}) {\n const { randomUUID } = await import('node:crypto');\n const { slugify } = await import('./shared.js');\n const ServerConfig = await import('../serverConfig');\n \n const context = ServerConfig.getContext();\n if (!context) {\n throw new Error('Server context not initialized. Check server configuration.');\n }\n \n const access = await openToolTranscript(args.transcriptPath, args.contextDirectory);\n const pklPath = access.pklPath;\n \n try {\n let finalEntityId: string;\n let finalEntityName: string;\n let isNewEntity = false;\n \n // Step 1: Create or look up entity using the server's pre-initialized context\n if (args.entityName) {\n const id = randomUUID();\n const slug = slugify(args.entityName);\n \n const entityBase = {\n id,\n slug,\n name: args.entityName,\n };\n \n let newEntity: any;\n switch (args.entityType) {\n case 'person':\n newEntity = {\n ...entityBase,\n type: 'person' as const,\n ...(args.firstName && { firstName: args.firstName }),\n ...(args.lastName && { lastName: args.lastName }),\n ...(args.description && { context: args.description }),\n };\n break;\n case 'project':\n newEntity = { ...entityBase, type: 'project' as const };\n break;\n case 'term':\n newEntity = { ...entityBase, type: 'term' as const };\n break;\n case 'company':\n newEntity = { ...entityBase, type: 'company' as const };\n break;\n }\n \n await context.saveEntity(newEntity);\n markContextEntityIndexDirty(args.entityType);\n finalEntityId = id;\n finalEntityName = args.entityName;\n isNewEntity = true;\n } else if (args.entityId) {\n finalEntityId = args.entityId;\n const { findPersonResilient, findProjectResilient, findTermResilient, findCompanyResilient } = await import('@redaksjon/protokoll-engine');\n let entity: any;\n switch (args.entityType) {\n case 'person': entity = findPersonResilient(context, finalEntityId); break;\n case 'project': entity = findProjectResilient(context, finalEntityId); break;\n case 'term': entity = findTermResilient(context, finalEntityId); break;\n case 'company': entity = findCompanyResilient(context, finalEntityId); break;\n }\n finalEntityName = entity.name;\n } else {\n throw new Error('Either entityId or entityName must be provided');\n }\n \n // Step 2: Update sounds_like on the entity (before opening transcript to avoid interleaving)\n if (args.selectedText.toLowerCase() !== finalEntityName.toLowerCase()) {\n const existingEntity = (() => {\n switch (args.entityType) {\n case 'person': return context.getPerson(finalEntityId);\n case 'project': return context.getProject(finalEntityId);\n case 'term': return context.getTerm(finalEntityId);\n case 'company': return context.getCompany(finalEntityId);\n }\n })();\n \n if (existingEntity) {\n const soundsLike = (existingEntity as any).sounds_like || [];\n if (!soundsLike.includes(args.selectedText)) {\n await context.saveEntity(\n { ...existingEntity, sounds_like: [...soundsLike, args.selectedText] },\n true\n );\n markContextEntityIndexDirty(args.entityType);\n }\n }\n }\n \n // Step 3: All transcript operations in one block with guaranteed close\n const transcript = PklTranscript.open(pklPath, { readOnly: false });\n let transcriptId: string;\n let transcriptProject: string | undefined;\n let allEntityIds: string[];\n \n try {\n // Replace text in content\n const originalContent = transcript.content;\n const corrections = new Map([[args.selectedText, finalEntityName]]);\n const correctedContent = applyCorrections(originalContent, corrections);\n transcript.updateContent(correctedContent);\n \n // Build a fresh entities object (same pattern as handleUpdateTranscriptEntityReferences)\n const existing = transcript.metadata.entities;\n const newEntityRef: Metadata.EntityReference = { id: finalEntityId, name: finalEntityName, type: args.entityType };\n \n const addIfMissing = (arr: Metadata.EntityReference[] | undefined, ref: Metadata.EntityReference): Metadata.EntityReference[] => {\n const list = arr ? [...arr] : [];\n if (!list.some(e => e.id === ref.id)) {\n list.push(ref);\n }\n return list;\n };\n \n const updatedEntities = {\n people: args.entityType === 'person' ? addIfMissing(existing?.people, newEntityRef) : [...(existing?.people || [])],\n projects: args.entityType === 'project' ? addIfMissing(existing?.projects, newEntityRef) : [...(existing?.projects || [])],\n terms: args.entityType === 'term' ? addIfMissing(existing?.terms, newEntityRef) : [...(existing?.terms || [])],\n companies: args.entityType === 'company' ? addIfMissing(existing?.companies, newEntityRef) : [...(existing?.companies || [])],\n };\n \n transcript.updateMetadata({ entities: updatedEntities });\n \n // Log to enhancement_log\n try {\n transcript.enhancementLog.logStep(\n new Date(),\n 'enhance',\n 'correction_applied',\n {\n original: args.selectedText,\n replacement: finalEntityName,\n entityId: finalEntityId,\n entityType: args.entityType,\n isNewEntity\n },\n [{ id: finalEntityId, name: finalEntityName, type: args.entityType }]\n );\n } catch {\n // Enhancement log is not critical\n }\n \n // Capture metadata before closing\n transcriptId = transcript.metadata.id;\n transcriptProject = transcript.metadata.project;\n allEntityIds = [\n ...updatedEntities.people.map(e => e.id),\n ...updatedEntities.projects.map(e => e.id),\n ...updatedEntities.terms.map(e => e.id),\n ...updatedEntities.companies.map(e => e.id),\n ];\n } finally {\n transcript.close();\n }\n \n // Step 4: Trigger weight model update (best-effort, after transcript is closed)\n try {\n const { updateTranscriptInWeightModel } = await import('../services/weightModel');\n updateTranscriptInWeightModel(transcriptId, allEntityIds, transcriptProject);\n } catch {\n // Weight model update is best-effort\n }\n \n return {\n success: true,\n message: `Corrected \"${args.selectedText}\" to \"${finalEntityName}\"`,\n correction: { original: args.selectedText, replacement: finalEntityName },\n entity: { id: finalEntityId, name: finalEntityName, type: args.entityType },\n isNewEntity\n };\n } finally {\n await access.finalize(true);\n }\n}\n","/**\n * System Tools - Version and system information\n */\n\n// eslint-disable-next-line import/extensions\nimport type { Tool } from '@modelcontextprotocol/sdk/types.js';\nimport { VERSION, PROGRAM_NAME } from '@/constants';\nimport * as ServerConfig from '../serverConfig';\n\n// ============================================================================\n// Tool Definitions\n// ============================================================================\n\nexport const getVersionTool: Tool = {\n name: 'protokoll_get_version',\n description: 'Get the current version of Protokoll including git information and system details. ' +\n 'Useful for diagnosing if you are using the latest version.',\n inputSchema: {\n type: 'object',\n properties: {},\n required: [],\n },\n};\n\nexport const getInfoTool: Tool = {\n name: 'protokoll_info',\n description: \n 'Get server configuration information including mode (local/remote) and workspace directories. ' +\n 'IMPORTANT: Check this tool first to understand if the server is running in:\\n' +\n '- \"remote\" mode: Server is pre-configured with workspace directories. Directory parameters are NOT accepted and will cause errors.\\n' +\n '- \"local\" mode: Server performs dynamic discovery. Directory parameters are optional and accepted.\\n\\n' +\n 'Use this to determine whether you need to provide contextDirectory parameters to other tools.',\n inputSchema: {\n type: 'object',\n properties: {},\n required: [],\n },\n};\n\n// ============================================================================\n// Handlers\n// ============================================================================\n\nexport interface GetVersionResult {\n version: string;\n programName: string;\n fullVersion: string;\n}\n\nexport async function handleGetVersion(): Promise<GetVersionResult> {\n return {\n version: VERSION,\n programName: PROGRAM_NAME,\n fullVersion: `${PROGRAM_NAME} ${VERSION}`,\n };\n}\n\nexport interface GetInfoResult {\n mode: 'local' | 'remote';\n modeDescription: string;\n acceptsDirectoryParameters: boolean;\n workspaceRoot: string | null;\n inputDirectory: string | null;\n outputDirectory: string | null;\n processedDirectory: string | null;\n contextDirectories: string[] | null;\n configFilePath: string | null;\n}\n\nexport async function handleGetInfo(): Promise<GetInfoResult> {\n const mode = ServerConfig.getServerMode();\n const isRemote = mode === 'remote';\n \n let config;\n try {\n config = ServerConfig.getServerConfig();\n } catch {\n // Not initialized - return minimal info\n return {\n mode: 'local',\n modeDescription: 'Server is running in local mode with dynamic discovery',\n acceptsDirectoryParameters: true,\n workspaceRoot: null,\n inputDirectory: null,\n outputDirectory: null,\n processedDirectory: null,\n contextDirectories: null,\n configFilePath: null,\n };\n }\n \n return {\n mode,\n modeDescription: isRemote\n ? 'Server is running in remote mode with pre-configured workspace directories'\n : 'Server is running in local mode with dynamic discovery',\n acceptsDirectoryParameters: !isRemote,\n workspaceRoot: config.workspaceRoot,\n inputDirectory: config.inputDirectory,\n outputDirectory: config.outputDirectory,\n processedDirectory: config.processedDirectory,\n contextDirectories: config.configFile?.contextDirectories as string[] | null,\n configFilePath: config.configFilePath,\n };\n}\n","/* eslint-disable import/extensions */\n/**\n * Relationship Tools - Manage entity relationships\n */\n\nimport type { Tool } from '@modelcontextprotocol/sdk/types.js';\nimport type { Entity } from '@/context/types';\nimport type { ContextInstance } from '@/context';\nimport { parseEntityUri, createRelationship, type EntityRelationship } from '@redaksjon/context';\nimport { \n findPersonResilient, \n findCompanyResilient, \n findTermResilient, \n findProjectResilient \n} from '@redaksjon/protokoll-engine';\nimport { createToolContext } from './shared.js';\n\n// ============================================================================\n// Type Extensions\n// ============================================================================\n\n/**\n * Entity with relationships field\n */\ntype EntityWithRelationships = Entity & { relationships?: EntityRelationship[] };\n\n// ============================================================================\n// Helper Functions\n// ============================================================================\n\n/**\n * Get an entity by type and ID from context\n */\nfunction getEntityByType(\n context: ContextInstance,\n entityType: string,\n entityId: string\n): Entity | undefined {\n switch (entityType) {\n case 'person':\n return findPersonResilient(context, entityId);\n case 'company':\n return findCompanyResilient(context, entityId);\n case 'term':\n return findTermResilient(context, entityId);\n case 'project':\n return findProjectResilient(context, entityId);\n default:\n return undefined;\n }\n}\n\n// ============================================================================\n// Tool Definitions\n// ============================================================================\n\nexport const addRelationshipTool: Tool = {\n name: 'protokoll_add_relationship',\n description:\n 'Add a relationship between two entities. ' +\n 'Relationships use URIs (redaksjon://{type}/{id}) to reference entities. ' +\n 'Common relationship types: works_at, manages, reports_to, used_in, part_of, expert_in, etc.',\n inputSchema: {\n type: 'object',\n properties: {\n entityType: {\n type: 'string',\n enum: ['person', 'company', 'term', 'project'],\n description: 'Type of the source entity',\n },\n entityId: {\n type: 'string',\n description: 'ID of the source entity',\n },\n targetType: {\n type: 'string',\n enum: ['person', 'company', 'term', 'project'],\n description: 'Type of the target entity',\n },\n targetId: {\n type: 'string',\n description: 'ID of the target entity',\n },\n relationship: {\n type: 'string',\n description: 'Type of relationship (e.g., works_at, manages, used_in, part_of)',\n },\n notes: {\n type: 'string',\n description: 'Optional notes about this relationship',\n },\n metadata: {\n type: 'object',\n description: 'Optional metadata (key-value pairs)',\n },\n contextDirectory: {\n type: 'string',\n description: 'Path to the .protokoll context directory',\n },\n },\n required: ['entityType', 'entityId', 'targetType', 'targetId', 'relationship'],\n },\n};\n\nexport const removeRelationshipTool: Tool = {\n name: 'protokoll_remove_relationship',\n description:\n 'Remove a specific relationship from an entity. ' +\n 'Identifies the relationship by target URI and relationship type.',\n inputSchema: {\n type: 'object',\n properties: {\n entityType: {\n type: 'string',\n enum: ['person', 'company', 'term', 'project'],\n description: 'Type of the source entity',\n },\n entityId: {\n type: 'string',\n description: 'ID of the source entity',\n },\n targetUri: {\n type: 'string',\n description: 'URI of the target entity (redaksjon://{type}/{id})',\n },\n relationship: {\n type: 'string',\n description: 'Type of relationship to remove',\n },\n contextDirectory: {\n type: 'string',\n description: 'Path to the .protokoll context directory',\n },\n },\n required: ['entityType', 'entityId', 'targetUri', 'relationship'],\n },\n};\n\nexport const listRelationshipsTool: Tool = {\n name: 'protokoll_list_relationships',\n description:\n 'List all relationships for an entity. ' +\n 'Returns the relationships array with URIs, types, notes, and metadata.',\n inputSchema: {\n type: 'object',\n properties: {\n entityType: {\n type: 'string',\n enum: ['person', 'company', 'term', 'project'],\n description: 'Type of the entity',\n },\n entityId: {\n type: 'string',\n description: 'ID of the entity',\n },\n relationshipType: {\n type: 'string',\n description: 'Optional: filter by relationship type',\n },\n contextDirectory: {\n type: 'string',\n description: 'Path to the .protokoll context directory',\n },\n },\n required: ['entityType', 'entityId'],\n },\n};\n\nexport const findRelatedEntitiesTool: Tool = {\n name: 'protokoll_find_related_entities',\n description:\n 'Find all entities related to a given entity. ' +\n 'Can filter by relationship type and target entity type.',\n inputSchema: {\n type: 'object',\n properties: {\n entityType: {\n type: 'string',\n enum: ['person', 'company', 'term', 'project'],\n description: 'Type of the source entity',\n },\n entityId: {\n type: 'string',\n description: 'ID of the source entity',\n },\n relationshipType: {\n type: 'string',\n description: 'Optional: filter by relationship type (e.g., works_at, manages)',\n },\n targetType: {\n type: 'string',\n enum: ['person', 'company', 'term', 'project'],\n description: 'Optional: filter by target entity type',\n },\n contextDirectory: {\n type: 'string',\n description: 'Path to the .protokoll context directory',\n },\n },\n required: ['entityType', 'entityId'],\n },\n};\n\n// ============================================================================\n// Handlers\n// ============================================================================\n\nexport async function handleAddRelationship(args: {\n entityType: string;\n entityId: string;\n targetType: string;\n targetId: string;\n relationship: string;\n notes?: string;\n metadata?: Record<string, unknown>;\n contextDirectory?: string;\n}): Promise<{ success: boolean; message: string; relationship: EntityRelationship }> {\n const { entityType, entityId, targetType, targetId, relationship, notes, metadata, contextDirectory } = args;\n\n // Get context\n const contextInstance = await createToolContext(contextDirectory);\n\n // Get the entity\n const entity = getEntityByType(contextInstance, entityType, entityId);\n if (!entity) {\n throw new Error(`Entity not found: ${entityType}/${entityId}`);\n }\n\n // Verify target entity exists\n const targetEntity = getEntityByType(contextInstance, targetType, targetId);\n if (!targetEntity) {\n throw new Error(`Target entity not found: ${targetType}/${targetId}`);\n }\n\n // Create the relationship\n const newRelationship = createRelationship(targetType, targetId, relationship, notes, metadata);\n\n // Prevent duplicate (same uri + relationship type)\n const existingRelationships = (entity as EntityWithRelationships).relationships || [];\n const alreadyExists = existingRelationships.some(\n (r: EntityRelationship) => r.uri === newRelationship.uri && r.relationship === relationship\n );\n if (alreadyExists) {\n throw new Error(`Relationship already exists: ${relationship} to ${newRelationship.uri}`);\n }\n\n // Add to entity's relationships array\n const updatedEntity = {\n ...entity,\n relationships: [...existingRelationships, newRelationship],\n };\n\n // Save the entity (allowUpdate = true since entity already exists)\n await contextInstance.saveEntity(updatedEntity as Entity, true);\n\n return {\n success: true,\n message: `Added ${relationship} relationship from ${entityType}/${entityId} to ${targetType}/${targetId}`,\n relationship: newRelationship,\n };\n}\n\nexport async function handleRemoveRelationship(args: {\n entityType: string;\n entityId: string;\n targetUri: string;\n relationship: string;\n contextDirectory?: string;\n}): Promise<{ success: boolean; message: string }> {\n const { entityType, entityId, targetUri, relationship, contextDirectory } = args;\n\n // Get context\n const contextInstance = await createToolContext(contextDirectory);\n\n // Get the entity\n const entity = getEntityByType(contextInstance, entityType, entityId);\n if (!entity) {\n throw new Error(`Entity not found: ${entityType}/${entityId}`);\n }\n\n // Filter out the relationship\n const relationships = (entity as EntityWithRelationships).relationships || [];\n const filteredRelationships = relationships.filter(\n (r: EntityRelationship) => !(r.uri === targetUri && r.relationship === relationship)\n );\n\n if (filteredRelationships.length === relationships.length) {\n throw new Error(`Relationship not found: ${relationship} to ${targetUri}`);\n }\n\n // Update entity\n const updatedEntity = {\n ...entity,\n relationships: filteredRelationships,\n };\n\n // Save the entity (allowUpdate = true since entity already exists)\n await contextInstance.saveEntity(updatedEntity as Entity, true);\n\n return {\n success: true,\n message: `Removed ${relationship} relationship to ${targetUri}`,\n };\n}\n\nexport async function handleListRelationships(args: {\n entityType: string;\n entityId: string;\n relationshipType?: string;\n contextDirectory?: string;\n}): Promise<{ entityId: string; entityType: string; relationships: EntityRelationship[] }> {\n const { entityType, entityId, relationshipType, contextDirectory } = args;\n\n // Get context\n const contextInstance = await createToolContext(contextDirectory);\n\n // Get the entity\n const entity = getEntityByType(contextInstance, entityType, entityId);\n if (!entity) {\n throw new Error(`Entity not found: ${entityType}/${entityId}`);\n }\n\n // Get relationships\n let relationships = (entity as EntityWithRelationships).relationships || [];\n\n // Filter by relationship type if specified\n if (relationshipType) {\n relationships = relationships.filter((r: EntityRelationship) => r.relationship === relationshipType);\n }\n\n return {\n entityId,\n entityType,\n relationships,\n };\n}\n\nexport async function handleFindRelatedEntities(args: {\n entityType: string;\n entityId: string;\n relationshipType?: string;\n targetType?: string;\n contextDirectory?: string;\n}): Promise<{\n entityId: string;\n entityType: string;\n relatedEntities: Array<{\n relationship: string;\n targetType: string;\n targetId: string;\n targetName: string;\n notes?: string;\n }>;\n}> {\n const { entityType, entityId, relationshipType, targetType, contextDirectory } = args;\n\n // Get context\n const contextInstance = await createToolContext(contextDirectory);\n\n // Get the entity\n const entity = getEntityByType(contextInstance, entityType, entityId);\n if (!entity) {\n throw new Error(`Entity not found: ${entityType}/${entityId}`);\n }\n\n // Get relationships\n let relationships = (entity as EntityWithRelationships).relationships || [];\n\n // Filter by relationship type if specified\n if (relationshipType) {\n relationships = relationships.filter((r: EntityRelationship) => r.relationship === relationshipType);\n }\n\n // Parse URIs and fetch target entities\n const relatedEntities = relationships\n .map((rel: EntityRelationship) => {\n const parsed = parseEntityUri(rel.uri);\n if (!parsed) return null;\n\n // Filter by target type if specified\n if (targetType && parsed.type !== targetType) return null;\n\n // Get the target entity\n const targetEntity = getEntityByType(contextInstance, parsed.type, parsed.id);\n\n if (!targetEntity) return null;\n\n return {\n relationship: rel.relationship,\n targetType: parsed.type,\n targetId: parsed.id,\n targetName: targetEntity.name,\n notes: rel.notes,\n };\n })\n .filter((item): item is NonNullable<typeof item> => item !== null);\n\n return {\n entityId,\n entityType,\n relatedEntities,\n };\n}\n","/* eslint-disable import/extensions */\n/**\n * Content Tools - Manage entity content (URLs, text, documents, etc.)\n */\n\nimport type { Tool } from '@modelcontextprotocol/sdk/types.js';\nimport type { Entity } from '@/context/types';\nimport type { ContextInstance } from '@/context';\nimport { \n findPersonResilient, \n findCompanyResilient, \n findTermResilient, \n findProjectResilient \n} from '@redaksjon/protokoll-engine';\nimport {\n createUrlContent,\n createTextContent,\n createMarkdownContent,\n createCodeContent,\n createDocumentContent,\n type EntityContentItem,\n} from '@redaksjon/context';\nimport { createToolContext } from './shared.js';\n\n// ============================================================================\n// Type Extensions\n// ============================================================================\n\n/**\n * Entity with content field\n */\ntype EntityWithContent = Entity & { content?: EntityContentItem[] };\n\n// ============================================================================\n// Helper Functions\n// ============================================================================\n\n/**\n * Get an entity by type and ID from context\n */\nfunction getEntityByType(\n context: ContextInstance,\n entityType: string,\n entityId: string\n): Entity | undefined {\n switch (entityType) {\n case 'person':\n return findPersonResilient(context, entityId);\n case 'company':\n return findCompanyResilient(context, entityId);\n case 'term':\n return findTermResilient(context, entityId);\n case 'project':\n return findProjectResilient(context, entityId);\n default:\n return undefined;\n }\n}\n\n// ============================================================================\n// Tool Definitions\n// ============================================================================\n\nexport const addContentTool: Tool = {\n name: 'protokoll_add_content',\n description:\n 'Add content to an entity (URL, text, markdown, code, document, etc.). ' +\n 'Content items have a type, title, content string, and optional metadata. ' +\n 'Common types: url, text, markdown, html, code, document, image, video.',\n inputSchema: {\n type: 'object',\n properties: {\n entityType: {\n type: 'string',\n enum: ['person', 'company', 'term', 'project'],\n description: 'Type of the entity',\n },\n entityId: {\n type: 'string',\n description: 'ID of the entity',\n },\n type: {\n type: 'string',\n description: 'Content type (url, text, markdown, html, code, document, image, video, etc.)',\n },\n content: {\n type: 'string',\n description: 'The actual content (URL, text, markdown, code, file path, etc.)',\n },\n title: {\n type: 'string',\n description: 'Title or label for this content',\n },\n mimeType: {\n type: 'string',\n description: 'Optional MIME type (text/plain, text/markdown, application/pdf, etc.)',\n },\n source: {\n type: 'string',\n description: 'Optional source or origin of this content',\n },\n notes: {\n type: 'string',\n description: 'Optional notes about this content',\n },\n metadata: {\n type: 'object',\n description: 'Optional metadata (key-value pairs)',\n },\n contextDirectory: {\n type: 'string',\n description: 'Path to the .protokoll context directory',\n },\n },\n required: ['entityType', 'entityId', 'type', 'content'],\n },\n};\n\nexport const removeContentTool: Tool = {\n name: 'protokoll_remove_content',\n description:\n 'Remove a specific content item from an entity. ' +\n 'Identifies the content by title or by index in the content array.',\n inputSchema: {\n type: 'object',\n properties: {\n entityType: {\n type: 'string',\n enum: ['person', 'company', 'term', 'project'],\n description: 'Type of the entity',\n },\n entityId: {\n type: 'string',\n description: 'ID of the entity',\n },\n title: {\n type: 'string',\n description: 'Title of the content item to remove',\n },\n index: {\n type: 'number',\n description: 'Index of the content item to remove (0-based)',\n },\n contextDirectory: {\n type: 'string',\n description: 'Path to the .protokoll context directory',\n },\n },\n required: ['entityType', 'entityId'],\n },\n};\n\nexport const listContentTool: Tool = {\n name: 'protokoll_list_content',\n description:\n 'List all content items for an entity. ' +\n 'Returns the content array with types, titles, and metadata. ' +\n 'Can filter by content type.',\n inputSchema: {\n type: 'object',\n properties: {\n entityType: {\n type: 'string',\n enum: ['person', 'company', 'term', 'project'],\n description: 'Type of the entity',\n },\n entityId: {\n type: 'string',\n description: 'ID of the entity',\n },\n contentType: {\n type: 'string',\n description: 'Optional: filter by content type (url, text, markdown, etc.)',\n },\n contextDirectory: {\n type: 'string',\n description: 'Path to the .protokoll context directory',\n },\n },\n required: ['entityType', 'entityId'],\n },\n};\n\nexport const getContentTool: Tool = {\n name: 'protokoll_get_content',\n description:\n 'Get a specific content item from an entity. ' +\n 'Returns the full content including the content string.',\n inputSchema: {\n type: 'object',\n properties: {\n entityType: {\n type: 'string',\n enum: ['person', 'company', 'term', 'project'],\n description: 'Type of the entity',\n },\n entityId: {\n type: 'string',\n description: 'ID of the entity',\n },\n title: {\n type: 'string',\n description: 'Title of the content item',\n },\n index: {\n type: 'number',\n description: 'Index of the content item (0-based)',\n },\n contextDirectory: {\n type: 'string',\n description: 'Path to the .protokoll context directory',\n },\n },\n required: ['entityType', 'entityId'],\n },\n};\n\n// ============================================================================\n// Handlers\n// ============================================================================\n\nexport async function handleAddContent(args: {\n entityType: string;\n entityId: string;\n type: string;\n content: string;\n title?: string;\n mimeType?: string;\n source?: string;\n notes?: string;\n metadata?: Record<string, unknown>;\n contextDirectory?: string;\n}): Promise<{ success: boolean; message: string; contentItem: EntityContentItem }> {\n const { entityType, entityId, type, content, title, mimeType, source, notes, metadata, contextDirectory } = args;\n\n // Get context\n const contextInstance = await createToolContext(contextDirectory);\n\n // Get the entity\n const entity = getEntityByType(contextInstance, entityType, entityId);\n if (!entity) {\n throw new Error(`Entity not found: ${entityType}/${entityId}`);\n }\n\n // Create the content item based on type\n let contentItem: EntityContentItem;\n \n switch (type) {\n case 'url':\n contentItem = createUrlContent(content, title, source, notes);\n break;\n case 'text':\n contentItem = createTextContent(content, title, source, notes);\n break;\n case 'markdown':\n contentItem = createMarkdownContent(content, title, source, notes);\n break;\n case 'code':\n contentItem = createCodeContent(\n content,\n metadata?.language as string || 'text',\n title,\n source,\n notes\n );\n break;\n case 'document':\n contentItem = createDocumentContent(content, title, mimeType, notes);\n break;\n default:\n // Generic content item\n contentItem = {\n type,\n title,\n content,\n mimeType,\n source,\n timestamp: new Date().toISOString(),\n notes,\n metadata,\n };\n }\n\n // Add to entity's content array\n const updatedEntity = {\n ...entity,\n content: [...((entity as EntityWithContent).content || []), contentItem],\n };\n\n // Save the entity\n await contextInstance.saveEntity(updatedEntity as Entity);\n\n return {\n success: true,\n message: `Added ${type} content to ${entityType}/${entityId}`,\n contentItem,\n };\n}\n\nexport async function handleRemoveContent(args: {\n entityType: string;\n entityId: string;\n title?: string;\n index?: number;\n contextDirectory?: string;\n}): Promise<{ success: boolean; message: string }> {\n const { entityType, entityId, title, index, contextDirectory } = args;\n\n if (title === undefined && index === undefined) {\n throw new Error('Either title or index must be provided');\n }\n\n // Get context\n const contextInstance = await createToolContext(contextDirectory);\n\n // Get the entity\n const entity = getEntityByType(contextInstance, entityType, entityId);\n if (!entity) {\n throw new Error(`Entity not found: ${entityType}/${entityId}`);\n }\n\n const content = (entity as EntityWithContent).content || [];\n\n // Find and remove the content item\n let filteredContent: EntityContentItem[];\n let removedTitle: string;\n\n if (index !== undefined) {\n if (index < 0 || index >= content.length) {\n throw new Error(`Invalid index: ${index}. Content array has ${content.length} items.`);\n }\n removedTitle = content[index].title || `item at index ${index}`;\n filteredContent = content.filter((_: EntityContentItem, i: number) => i !== index);\n } else {\n const foundIndex = content.findIndex((c: EntityContentItem) => c.title === title);\n if (foundIndex === -1) {\n throw new Error(`Content item not found with title: ${title}`);\n }\n removedTitle = title!;\n filteredContent = content.filter((c: EntityContentItem) => c.title !== title);\n }\n\n // Update entity\n const updatedEntity = {\n ...entity,\n content: filteredContent,\n };\n\n // Save the entity\n await contextInstance.saveEntity(updatedEntity as Entity);\n\n return {\n success: true,\n message: `Removed content \"${removedTitle}\" from ${entityType}/${entityId}`,\n };\n}\n\nexport async function handleListContent(args: {\n entityType: string;\n entityId: string;\n contentType?: string;\n contextDirectory?: string;\n}): Promise<{\n entityId: string;\n entityType: string;\n content: Array<{\n index: number;\n type: string;\n title?: string;\n mimeType?: string;\n source?: string;\n timestamp?: string;\n hasNotes: boolean;\n contentLength: number;\n }>;\n}> {\n const { entityType, entityId, contentType, contextDirectory } = args;\n\n // Get context\n const contextInstance = await createToolContext(contextDirectory);\n\n // Get the entity\n const entity = getEntityByType(contextInstance, entityType, entityId);\n if (!entity) {\n throw new Error(`Entity not found: ${entityType}/${entityId}`);\n }\n\n // Get content\n let content = (entity as EntityWithContent).content || [];\n\n // Filter by content type if specified\n if (contentType) {\n content = content.filter((c: EntityContentItem) => c.type === contentType);\n }\n\n // Return summary (without full content strings for brevity)\n const contentSummary = content.map((item: EntityContentItem, index: number) => ({\n index,\n type: item.type,\n title: item.title,\n mimeType: item.mimeType,\n source: item.source,\n timestamp: item.timestamp,\n hasNotes: !!item.notes,\n contentLength: item.content.length,\n }));\n\n return {\n entityId,\n entityType,\n content: contentSummary,\n };\n}\n\nexport async function handleGetContent(args: {\n entityType: string;\n entityId: string;\n title?: string;\n index?: number;\n contextDirectory?: string;\n}): Promise<{ entityId: string; entityType: string; contentItem: EntityContentItem }> {\n const { entityType, entityId, title, index, contextDirectory } = args;\n\n if (title === undefined && index === undefined) {\n throw new Error('Either title or index must be provided');\n }\n\n // Get context\n const contextInstance = await createToolContext(contextDirectory);\n\n // Get the entity\n const entity = getEntityByType(contextInstance, entityType, entityId);\n if (!entity) {\n throw new Error(`Entity not found: ${entityType}/${entityId}`);\n }\n\n const content = (entity as EntityWithContent).content || [];\n\n // Find the content item\n let contentItem: EntityContentItem | undefined;\n\n if (index !== undefined) {\n if (index < 0 || index >= content.length) {\n throw new Error(`Invalid index: ${index}. Content array has ${content.length} items.`);\n }\n contentItem = content[index];\n } else {\n contentItem = content.find((c: EntityContentItem) => c.title === title);\n if (!contentItem) {\n throw new Error(`Content item not found with title: ${title}`);\n }\n }\n\n return {\n entityId,\n entityType,\n contentItem: contentItem!,\n };\n}\n","/**\n * Status and Task Tools - MCP tools for managing transcript lifecycle status and tasks\n * \n * PKL-only implementation - all transcripts are stored in PKL format.\n */\n// eslint-disable-next-line import/extensions\nimport type { Tool } from '@modelcontextprotocol/sdk/types.js';\nimport { \n isValidStatus as isEngineValidStatus,\n VALID_STATUSES as ENGINE_VALID_STATUSES,\n} from '@redaksjon/protokoll-engine';\nimport { getConfiguredDirectory, sanitizePath, resolveTranscriptPath } from './shared';\nimport { PklTranscript } from '@redaksjon/protokoll-format';\nimport type { Task as PklTask, TranscriptStatus } from '@redaksjon/protokoll-format';\n\n// ============================================================================\n// Helper Functions\n// ============================================================================\n\n// Keep MCP surface forward-compatible when protokoll depends on an engine\n// version that does not yet include a newly introduced status.\ntype SupportedStatus = TranscriptStatus | 'deleted';\n\nconst engineStatuses = ENGINE_VALID_STATUSES as readonly string[];\nconst VALID_STATUSES: SupportedStatus[] = engineStatuses.includes('deleted')\n ? [...ENGINE_VALID_STATUSES] as SupportedStatus[]\n : [...ENGINE_VALID_STATUSES, 'deleted'];\n\nconst isValidStatus = (status: string): status is SupportedStatus =>\n isEngineValidStatus(status) || status === 'deleted';\n\n// ============================================================================\n// Tool Definitions\n// ============================================================================\n\nexport const setStatusTool: Tool = {\n name: 'protokoll_set_status',\n description:\n 'Change the lifecycle status of a transcript. ' +\n 'Valid statuses: initial, enhanced, reviewed, in_progress, closed, archived, deleted. ' +\n 'Status transitions are recorded in history with timestamps. ' +\n 'Use this to track transcript progress through your workflow.',\n inputSchema: {\n type: 'object',\n properties: {\n transcriptPath: {\n type: 'string',\n description:\n 'Transcript URI (preferred) or relative path from output directory. ' +\n 'URI format: \"protokoll://transcript/2026/2/12-1606-meeting\" (no file extension). ' +\n 'Path format: \"2026/2/12-1606-meeting\" or \"2026/2/12-1606-meeting.pkl\"',\n },\n status: {\n type: 'string',\n enum: VALID_STATUSES,\n description:\n 'New status to set. ' +\n 'initial/enhanced: Pipeline states. ' +\n 'reviewed: User has reviewed. ' +\n 'in_progress: Has tasks to complete. ' +\n 'closed: All work done. ' +\n 'archived: Long-term storage. ' +\n 'deleted: Soft-delete marker (not physically removed).',\n },\n contextDirectory: {\n type: 'string',\n description: 'Optional: Path to the .protokoll context directory',\n },\n },\n required: ['transcriptPath', 'status'],\n },\n};\n\nexport const createTaskTool: Tool = {\n name: 'protokoll_create_task',\n description:\n 'Add a new task to a transcript. Tasks are follow-up actions to complete. ' +\n 'Returns the generated task ID for later reference.',\n inputSchema: {\n type: 'object',\n properties: {\n transcriptPath: {\n type: 'string',\n description:\n 'Transcript URI (preferred) or relative path from output directory. ' +\n 'URI format: \"protokoll://transcript/2026/2/12-1606-meeting\" (no file extension). ' +\n 'Path format: \"2026/2/12-1606-meeting\" or \"2026/2/12-1606-meeting.pkl\"',\n },\n description: {\n type: 'string',\n description: 'Description of the task (1-2 sentences)',\n },\n contextDirectory: {\n type: 'string',\n description: 'Optional: Path to the .protokoll context directory',\n },\n },\n required: ['transcriptPath', 'description'],\n },\n};\n\nexport const completeTaskTool: Tool = {\n name: 'protokoll_complete_task',\n description: 'Mark a task as done. Sets the completed timestamp.',\n inputSchema: {\n type: 'object',\n properties: {\n transcriptPath: {\n type: 'string',\n description:\n 'Transcript URI (preferred) or relative path from output directory. ' +\n 'URI format: \"protokoll://transcript/2026/2/12-1606-meeting\" (no file extension). ' +\n 'Path format: \"2026/2/12-1606-meeting\" or \"2026/2/12-1606-meeting.pkl\"',\n },\n taskId: {\n type: 'string',\n description: 'ID of the task to complete (e.g., \"task-1234567890-abc123\")',\n },\n contextDirectory: {\n type: 'string',\n description: 'Optional: Path to the .protokoll context directory',\n },\n },\n required: ['transcriptPath', 'taskId'],\n },\n};\n\nexport const deleteTaskTool: Tool = {\n name: 'protokoll_delete_task',\n description: 'Remove a task from a transcript permanently.',\n inputSchema: {\n type: 'object',\n properties: {\n transcriptPath: {\n type: 'string',\n description:\n 'Transcript URI (preferred) or relative path from output directory. ' +\n 'URI format: \"protokoll://transcript/2026/2/12-1606-meeting\" (no file extension). ' +\n 'Path format: \"2026/2/12-1606-meeting\" or \"2026/2/12-1606-meeting.pkl\"',\n },\n taskId: {\n type: 'string',\n description: 'ID of the task to delete (e.g., \"task-1234567890-abc123\")',\n },\n contextDirectory: {\n type: 'string',\n description: 'Optional: Path to the .protokoll context directory',\n },\n },\n required: ['transcriptPath', 'taskId'],\n },\n};\n\n// ============================================================================\n// Tool Handlers\n// ============================================================================\n\nexport async function handleSetStatus(args: {\n transcriptPath: string;\n status: string;\n contextDirectory?: string;\n}) {\n // Validate status\n if (!isValidStatus(args.status)) {\n throw new Error(\n `Invalid status \"${args.status}\". ` +\n `Valid statuses are: ${VALID_STATUSES.join(', ')}`\n );\n }\n \n const newStatus = args.status as SupportedStatus;\n \n // Find the transcript\n const absolutePath = await resolveTranscriptPath(args.transcriptPath, args.contextDirectory);\n \n const transcript = PklTranscript.open(absolutePath, { readOnly: false });\n try {\n const oldStatus = transcript.metadata.status || 'reviewed';\n \n // Check if status is actually changing\n if (oldStatus === newStatus) {\n const outputDirectory = await getConfiguredDirectory('outputDirectory', args.contextDirectory);\n const relativePath = await sanitizePath(absolutePath, outputDirectory);\n \n return {\n success: true,\n filePath: relativePath,\n previousStatus: oldStatus,\n newStatus: newStatus,\n changed: false,\n message: `Status is already '${newStatus}'`,\n };\n }\n \n // Update status\n transcript.updateMetadata({ status: newStatus } as any);\n \n const outputDirectory = await getConfiguredDirectory('outputDirectory', args.contextDirectory);\n const relativePath = await sanitizePath(absolutePath, outputDirectory);\n \n return {\n success: true,\n filePath: relativePath,\n previousStatus: oldStatus,\n newStatus: newStatus,\n changed: true,\n message: `Status changed from '${oldStatus}' to '${newStatus}'`,\n };\n } finally {\n transcript.close();\n }\n}\n\n// ============================================================================\n// Task Handlers\n// ============================================================================\n\nexport async function handleCreateTask(args: {\n transcriptPath: string;\n description: string;\n contextDirectory?: string;\n}) {\n if (!args.description || typeof args.description !== 'string' || args.description.trim() === '') {\n throw new Error('Task description is required and must be a non-empty string');\n }\n \n // Find the transcript\n const absolutePath = await resolveTranscriptPath(args.transcriptPath, args.contextDirectory);\n \n const transcript = PklTranscript.open(absolutePath, { readOnly: false });\n try {\n // Create a new task\n const taskId = `task-${Date.now()}`;\n const newTask: PklTask = {\n id: taskId,\n description: args.description.trim(),\n status: 'open',\n created: new Date(),\n };\n \n // Get existing tasks and add the new one\n const existingTasks = transcript.metadata.tasks || [];\n transcript.updateMetadata({ tasks: [...existingTasks, newTask] });\n \n const outputDirectory = await getConfiguredDirectory('outputDirectory', args.contextDirectory);\n const relativePath = await sanitizePath(absolutePath, outputDirectory);\n \n return {\n success: true,\n filePath: relativePath,\n task: {\n id: newTask.id,\n description: newTask.description,\n status: newTask.status,\n created: newTask.created.toISOString(),\n },\n message: `Task created: ${newTask.id}`,\n };\n } finally {\n transcript.close();\n }\n}\n\nexport async function handleCompleteTask(args: {\n transcriptPath: string;\n taskId: string;\n contextDirectory?: string;\n}) {\n if (!args.taskId || typeof args.taskId !== 'string') {\n throw new Error('Task ID is required');\n }\n \n // Find the transcript\n const absolutePath = await resolveTranscriptPath(args.transcriptPath, args.contextDirectory);\n \n const transcript = PklTranscript.open(absolutePath, { readOnly: false });\n try {\n // Find the task\n const tasks = transcript.metadata.tasks || [];\n const task = tasks.find(t => t.id === args.taskId);\n if (!task) {\n throw new Error(`Task not found: ${args.taskId}`);\n }\n \n // Update the task to done\n const updatedTasks = tasks.map(t => \n t.id === args.taskId \n ? { ...t, status: 'done' as const, completed: new Date() }\n : t\n );\n transcript.updateMetadata({ tasks: updatedTasks });\n \n const outputDirectory = await getConfiguredDirectory('outputDirectory', args.contextDirectory);\n const relativePath = await sanitizePath(absolutePath, outputDirectory);\n \n return {\n success: true,\n filePath: relativePath,\n taskId: args.taskId,\n description: task.description,\n message: `Task completed: ${args.taskId}`,\n };\n } finally {\n transcript.close();\n }\n}\n\nexport async function handleDeleteTask(args: {\n transcriptPath: string;\n taskId: string;\n contextDirectory?: string;\n}) {\n if (!args.taskId || typeof args.taskId !== 'string') {\n throw new Error('Task ID is required');\n }\n \n // Find the transcript\n const absolutePath = await resolveTranscriptPath(args.transcriptPath, args.contextDirectory);\n \n const transcript = PklTranscript.open(absolutePath, { readOnly: false });\n try {\n // Find the task before deleting\n const tasks = transcript.metadata.tasks || [];\n const task = tasks.find(t => t.id === args.taskId);\n if (!task) {\n throw new Error(`Task not found: ${args.taskId}`);\n }\n \n // Remove the task\n const updatedTasks = tasks.filter(t => t.id !== args.taskId);\n transcript.updateMetadata({ tasks: updatedTasks });\n \n const outputDirectory = await getConfiguredDirectory('outputDirectory', args.contextDirectory);\n const relativePath = await sanitizePath(absolutePath, outputDirectory);\n \n return {\n success: true,\n filePath: relativePath,\n taskId: args.taskId,\n description: task.description,\n message: `Task deleted: ${args.taskId}`,\n };\n } finally {\n transcript.close();\n }\n}\n\n// Export all tools from this module\nexport const statusTools: Tool[] = [\n setStatusTool,\n createTaskTool,\n completeTaskTool,\n deleteTaskTool,\n];\n","/**\n * Queue Management Tools\n * \n * MCP tools for monitoring and managing the audio upload transcription queue.\n * Provides visibility into pending uploads, processing status, and recent completions.\n */\n\n// eslint-disable-next-line import/extensions\nimport type { Tool } from '@modelcontextprotocol/sdk/types.js';\nimport { PklTranscript } from '@redaksjon/protokoll-format';\nimport type { TranscriptMetadata } from '@redaksjon/protokoll-format';\nimport { Transcript } from '@redaksjon/protokoll-engine';\nimport Logging from '@fjell/logging';\nimport * as fs from 'node:fs/promises';\nimport { join } from 'node:path';\nimport { tmpdir } from 'node:os';\nimport type { FileStorageProvider, StorageFileMetadata } from '../storage/fileProviders';\n\nconst { \n findUploadedTranscripts,\n findTranscribingTranscripts,\n resetTranscriptToUploaded,\n findTranscriptByUuid,\n} = Transcript;\nimport { getOutputDirectory, getOutputStorage } from '../serverConfig';\nimport { sanitizePath } from './shared';\nimport { unlink } from 'node:fs/promises';\nimport type { TranscriptionWorker } from '../worker/transcription-worker';\n\n// Worker instance will be set by server\nlet workerInstance: TranscriptionWorker | null = null;\nconst logger = Logging.getLogger('@redaksjon/protokoll-mcp').get('queue-tools');\n\nexport function setWorkerInstance(worker: TranscriptionWorker | null): void {\n workerInstance = worker;\n}\n\n// ============================================================================\n// Tool Definitions\n// ============================================================================\n\nexport const queueStatusTool: Tool = {\n name: 'protokoll_queue_status',\n description: 'Get current upload queue status - pending transcriptions, processing, and recent completions. Shows what audio files are waiting to be transcribed and which are currently being processed.',\n inputSchema: {\n type: 'object',\n properties: {},\n },\n};\n\nexport const getTranscriptByUuidTool: Tool = {\n name: 'protokoll_get_transcript_by_uuid',\n description: 'Get transcript metadata and status by UUID. Accepts either full UUID or 8-character prefix. Useful for checking upload status after receiving UUID from upload endpoint.',\n inputSchema: {\n type: 'object',\n properties: {\n uuid: {\n type: 'string',\n description: 'UUID or 8-character UUID prefix',\n },\n includeContent: {\n type: 'boolean',\n description: 'Include transcript content (default: false). Only works for transcripts in initial/enhanced/reviewed status.',\n },\n },\n required: ['uuid'],\n },\n};\n\nexport const retryTranscriptionTool: Tool = {\n name: 'protokoll_retry_transcription',\n description: 'Retry a failed transcription by resetting status from error to uploaded. The transcript will be re-queued for processing.',\n inputSchema: {\n type: 'object',\n properties: {\n uuid: {\n type: 'string',\n description: 'UUID of transcript to retry',\n },\n },\n required: ['uuid'],\n },\n};\n\nexport const cancelTranscriptionTool: Tool = {\n name: 'protokoll_cancel_transcription',\n description: 'Cancel a pending or processing transcription. Optionally delete the PKL file.',\n inputSchema: {\n type: 'object',\n properties: {\n uuid: {\n type: 'string',\n description: 'UUID of transcript to cancel',\n },\n deleteFile: {\n type: 'boolean',\n description: 'Also delete the PKL file (default: false)',\n },\n },\n required: ['uuid'],\n },\n};\n\nexport const workerStatusTool: Tool = {\n name: 'protokoll_worker_status',\n description: 'Get background transcription worker status and statistics. Shows if worker is running, current task, total processed, and uptime.',\n inputSchema: {\n type: 'object',\n properties: {},\n },\n};\n\nexport const restartWorkerTool: Tool = {\n name: 'protokoll_restart_worker',\n description: 'Restart the background transcription worker. Useful if worker is stuck or needs to reload configuration.',\n inputSchema: {\n type: 'object',\n properties: {},\n },\n};\n\n// ============================================================================\n// Helper Functions\n// ============================================================================\n\n/**\n * Get transcribing start time from metadata history\n */\nfunction getTranscribingStartTime(metadata: TranscriptMetadata): string {\n if (!metadata.history || metadata.history.length === 0) {\n return metadata.date?.toISOString() || '';\n }\n \n // Find the most recent transition to 'transcribing' status\n const transcribingTransition = metadata.history\n .filter(h => h.to === 'transcribing')\n .sort((a, b) => b.at.getTime() - a.at.getTime())[0];\n \n return transcribingTransition?.at.toISOString() || metadata.date?.toISOString() || '';\n}\n\n/**\n * Get completion time from metadata\n */\nfunction getCompletionTime(metadata: TranscriptMetadata): string {\n if (!metadata.history || metadata.history.length === 0) {\n return '';\n }\n \n // Find the most recent status transition\n const lastTransition = metadata.history\n .sort((a, b) => b.at.getTime() - a.at.getTime())[0];\n \n return lastTransition?.at.toISOString() || '';\n}\n\nfunction isQueueCandidatePath(pathValue: string): boolean {\n const normalized = pathValue.replace(/^\\/+/, '').replace(/\\\\/g, '/');\n if (!normalized.toLowerCase().endsWith('.pkl')) {\n return false;\n }\n if (normalized.startsWith('uploads/') || normalized.includes('/uploads/')) {\n return false;\n }\n if (normalized.startsWith('.intermediate/') || normalized.includes('/.intermediate/')) {\n return false;\n }\n return true;\n}\n\n/**\n * Upload placeholder transcripts use a root-level `*-upload.pkl` naming convention.\n */\nfunction isUploadPlaceholderPath(pathValue: string): boolean {\n const normalized = pathValue.replace(/^\\/+/, '').replace(/\\\\/g, '/').toLowerCase();\n if (!normalized.endsWith('-upload.pkl')) {\n return false;\n }\n return !normalized.includes('/');\n}\n\nasync function listFilesWithMetadataCompat(\n provider: FileStorageProvider,\n prefix: string,\n pattern?: string,\n): Promise<StorageFileMetadata[]> {\n const withMetadata = (provider as {\n listFilesWithMetadata?: (prefix: string, pattern?: string) => Promise<StorageFileMetadata[]>;\n }).listFilesWithMetadata;\n if (typeof withMetadata === 'function') {\n return withMetadata.call(provider, prefix, pattern);\n }\n const listed = await provider.listFiles(prefix, pattern);\n return listed.map((pathValue) => ({\n path: pathValue,\n size: 1,\n updatedAt: null,\n }));\n}\n\nasync function materializeTranscriptFromStorage(\n outputStorage: FileStorageProvider,\n transcriptPath: string,\n): Promise<string> {\n const fileName = transcriptPath.split('/').pop() || 'transcript.pkl';\n const tempPath = join(\n tmpdir(),\n `protokoll-queue-pkl-${Date.now()}-${Math.random().toString(36).slice(2)}-${fileName}`,\n );\n const contents = await outputStorage.readFile(transcriptPath);\n await fs.writeFile(tempPath, contents);\n return tempPath;\n}\n\nasync function findQueueTranscriptsFromStorage(\n outputStorage: FileStorageProvider,\n): Promise<{\n uploaded: Array<{ uuid: string; metadata: TranscriptMetadata }>;\n transcribing: Array<{ uuid: string; metadata: TranscriptMetadata }>;\n}> {\n const files = await listFilesWithMetadataCompat(outputStorage, '', '-upload.pkl');\n const candidates = files\n .map((metadata) => ({ ...metadata, path: metadata.path.replace(/^\\/+/, '').replace(/\\\\/g, '/') }))\n .filter((metadata) => isQueueCandidatePath(metadata.path))\n .filter((metadata) => isUploadPlaceholderPath(metadata.path));\n\n const uploaded: Array<{ uuid: string; metadata: TranscriptMetadata }> = [];\n const transcribing: Array<{ uuid: string; metadata: TranscriptMetadata }> = [];\n\n for (const metadata of candidates) {\n let tempPath: string | null = null;\n try {\n tempPath = await materializeTranscriptFromStorage(outputStorage, metadata.path);\n const transcript = PklTranscript.open(tempPath, { readOnly: true });\n const transcriptMetadata = transcript.metadata;\n await transcript.close();\n\n if (transcriptMetadata.status === 'uploaded') {\n uploaded.push({ uuid: transcriptMetadata.id, metadata: transcriptMetadata });\n } else if (transcriptMetadata.status === 'transcribing') {\n transcribing.push({ uuid: transcriptMetadata.id, metadata: transcriptMetadata });\n }\n } catch {\n // Ignore unreadable queue placeholders.\n } finally {\n if (tempPath) {\n await fs.rm(tempPath, { force: true });\n }\n }\n }\n\n const sortByDateAsc = (a: { metadata: TranscriptMetadata }, b: { metadata: TranscriptMetadata }): number => {\n const aTime = a.metadata.date?.getTime() || 0;\n const bTime = b.metadata.date?.getTime() || 0;\n return aTime - bTime;\n };\n\n return {\n uploaded: uploaded.sort(sortByDateAsc),\n transcribing: transcribing.sort(sortByDateAsc),\n };\n}\n\n/**\n * Find recent transcripts (completed in last 24 hours)\n */\nasync function findRecentTranscripts(\n searchDirectories: string[],\n limit: number\n): Promise<Array<{ uuid: string; filePath: string; metadata: TranscriptMetadata }>> {\n const results: Array<{ uuid: string; filePath: string; metadata: TranscriptMetadata }> = [];\n const oneDayAgo = new Date(Date.now() - 24 * 60 * 60 * 1000);\n \n // Import glob here to avoid issues\n const { glob } = await import('glob');\n \n for (const dir of searchDirectories) {\n const files = await glob('????????-*.pkl', { cwd: dir, absolute: true });\n \n for (const file of files) {\n try {\n const transcript = PklTranscript.open(file, { readOnly: true });\n const metadata = transcript.metadata;\n \n // Include if completed recently (status changed in last 24h)\n const recentlyCompleted = metadata.history?.some(h => \n h.at >= oneDayAgo && \n ['initial', 'enhanced', 'reviewed', 'error'].includes(h.to)\n );\n \n if (recentlyCompleted) {\n results.push({ \n uuid: metadata.id, \n filePath: file, \n metadata \n });\n }\n \n await transcript.close();\n } catch (error) {\n // Skip files that can't be opened\n logger.warning('queue.recent.skip_unreadable_transcript', {\n file,\n error: error instanceof Error ? error.message : String(error),\n });\n }\n }\n }\n \n // Sort by most recent first\n results.sort((a, b) => {\n const aTime = a.metadata.history?.[a.metadata.history.length - 1]?.at.getTime() || 0;\n const bTime = b.metadata.history?.[b.metadata.history.length - 1]?.at.getTime() || 0;\n return bTime - aTime;\n });\n \n return results.slice(0, limit);\n}\n\n// ============================================================================\n// Tool Handlers\n// ============================================================================\n\n/**\n * Get current queue status\n */\nexport async function handleQueueStatus(): Promise<{\n pending: Array<{ uuid: string; filename: string; uploadedAt: string }>;\n processing: Array<{ uuid: string; filename: string; startedAt: string }>;\n recent: Array<{ uuid: string; filename: string; completedAt: string; status: string }>;\n totalPending: number;\n}> {\n const outputDir = getOutputDirectory();\n const outputStorage = getOutputStorage();\n let uploaded: Array<{ uuid: string; metadata: TranscriptMetadata }> = [];\n let transcribing: Array<{ uuid: string; metadata: TranscriptMetadata }> = [];\n\n if (outputStorage.name === 'gcs') {\n const storageQueue = await findQueueTranscriptsFromStorage(outputStorage);\n uploaded = storageQueue.uploaded;\n transcribing = storageQueue.transcribing;\n } else {\n uploaded = await findUploadedTranscripts([outputDir]);\n transcribing = await findTranscribingTranscripts([outputDir]);\n }\n\n const recent = await findRecentTranscripts([outputDir], 10);\n \n return {\n pending: uploaded.map(t => ({\n uuid: t.uuid,\n filename: t.metadata.audioFile || 'unknown',\n uploadedAt: t.metadata.date?.toISOString() || '',\n })),\n processing: transcribing.map(t => ({\n uuid: t.uuid,\n filename: t.metadata.audioFile || 'unknown',\n startedAt: getTranscribingStartTime(t.metadata),\n })),\n recent: recent.map(t => ({\n uuid: t.uuid,\n filename: t.metadata.audioFile || t.metadata.title || 'unknown',\n completedAt: getCompletionTime(t.metadata),\n status: t.metadata.status || 'unknown',\n })),\n totalPending: uploaded.length,\n };\n}\n\n/**\n * Get transcript by UUID\n */\nexport async function handleGetTranscriptByUuid(args: {\n uuid: string;\n includeContent?: boolean;\n}): Promise<{\n found: boolean;\n uuid?: string;\n filePath?: string;\n metadata?: TranscriptMetadata;\n content?: string;\n error?: string;\n}> {\n try {\n const outputDir = getOutputDirectory();\n const filePath = await findTranscriptByUuid(args.uuid, [outputDir]);\n \n if (!filePath) {\n return { found: false, error: `No transcript found for UUID: ${args.uuid}` };\n }\n \n const transcript = PklTranscript.open(filePath, { readOnly: true });\n const metadata = transcript.metadata;\n \n const result: {\n found: boolean;\n uuid?: string;\n filePath?: string;\n metadata?: TranscriptMetadata;\n content?: string;\n } = {\n found: true,\n uuid: metadata.id,\n filePath: await sanitizePath(filePath, outputDir),\n metadata,\n };\n \n if (args.includeContent && ['initial', 'enhanced', 'reviewed'].includes(metadata.status || '')) {\n result.content = transcript.content || '';\n }\n \n await transcript.close();\n return result;\n } catch (error) {\n return { found: false, error: error instanceof Error ? error.message : String(error) };\n }\n}\n\n/**\n * Retry a failed transcription\n */\nexport async function handleRetryTranscription(args: {\n uuid: string;\n}): Promise<{\n success: boolean;\n message: string;\n error?: string;\n}> {\n try {\n const outputDir = getOutputDirectory();\n const filePath = await findTranscriptByUuid(args.uuid, [outputDir]);\n \n if (!filePath) {\n return { \n success: false, \n message: '',\n error: `No transcript found for UUID: ${args.uuid}` \n };\n }\n \n // Check current status\n const transcript = PklTranscript.open(filePath, { readOnly: true });\n const metadata = transcript.metadata;\n await transcript.close();\n \n if (metadata.status !== 'error') {\n return {\n success: false,\n message: '',\n error: `Transcript is not in error status (current: ${metadata.status})`,\n };\n }\n \n // Reset to uploaded\n await resetTranscriptToUploaded(filePath);\n \n return {\n success: true,\n message: `Transcript ${args.uuid} reset to uploaded status and re-queued`,\n };\n } catch (error) {\n return { \n success: false, \n message: '',\n error: error instanceof Error ? error.message : String(error) \n };\n }\n}\n\n/**\n * Cancel a transcription\n */\nexport async function handleCancelTranscription(args: {\n uuid: string;\n deleteFile?: boolean;\n}): Promise<{\n success: boolean;\n message: string;\n error?: string;\n}> {\n try {\n const outputDir = getOutputDirectory();\n const filePath = await findTranscriptByUuid(args.uuid, [outputDir]);\n \n if (!filePath) {\n return { \n success: false, \n message: '',\n error: `No transcript found for UUID: ${args.uuid}` \n };\n }\n \n // Check current status\n const transcript = PklTranscript.open(filePath, { readOnly: true });\n const metadata = transcript.metadata;\n await transcript.close();\n \n if (!['uploaded', 'transcribing'].includes(metadata.status || '')) {\n return {\n success: false,\n message: '',\n error: `Cannot cancel transcript in ${metadata.status} status. Only uploaded/transcribing can be cancelled.`,\n };\n }\n \n if (args.deleteFile) {\n // Delete the file\n await unlink(filePath);\n return {\n success: true,\n message: `Transcript ${args.uuid} cancelled and file deleted`,\n };\n } else {\n // Just mark as error\n const transcriptToUpdate = PklTranscript.open(filePath);\n transcriptToUpdate.updateMetadata({ \n status: 'error',\n errorDetails: 'Cancelled by user',\n });\n await transcriptToUpdate.close();\n \n return {\n success: true,\n message: `Transcript ${args.uuid} cancelled (marked as error)`,\n };\n }\n } catch (error) {\n return { \n success: false, \n message: '',\n error: error instanceof Error ? error.message : String(error) \n };\n }\n}\n\n/**\n * Get worker status\n */\nexport async function handleWorkerStatus(): Promise<{\n isRunning: boolean;\n currentTask?: string;\n totalProcessed: number;\n lastProcessed?: string;\n uptime: number;\n}> {\n if (!workerInstance) {\n return {\n isRunning: false,\n totalProcessed: 0,\n uptime: 0,\n };\n }\n\n return {\n isRunning: workerInstance.isActive(),\n currentTask: workerInstance.getCurrentTask(),\n totalProcessed: workerInstance.getProcessedCount(),\n lastProcessed: workerInstance.getLastProcessedTime(),\n uptime: workerInstance.getUptime(),\n };\n}\n\n/**\n * Restart worker\n */\nexport async function handleRestartWorker(): Promise<{\n success: boolean;\n message: string;\n error?: string;\n}> {\n if (!workerInstance) {\n return {\n success: false,\n message: '',\n error: 'Worker not initialized',\n };\n }\n\n try {\n await workerInstance.stop();\n await workerInstance.start();\n return {\n success: true,\n message: 'Worker restarted successfully',\n };\n } catch (error) {\n return {\n success: false,\n message: '',\n error: error instanceof Error ? error.message : String(error),\n };\n }\n}\n","/**\n * MCP Tools - Exports all tool definitions and handlers\n */\n\n// eslint-disable-next-line import/extensions\nimport type { Tool } from '@modelcontextprotocol/sdk/types.js';\n\nimport * as DiscoveryTools from './discoveryTools';\nimport * as AudioTools from './audioTools';\nimport * as ContextTools from './contextTools';\nimport * as EntityTools from './entityTools';\nimport * as AssistTools from './assistTools';\nimport * as TranscriptTools from './transcriptTools';\nimport * as SystemTools from './systemTools';\nimport * as RelationshipTools from './relationshipTools';\nimport * as ContentTools from './contentTools';\nimport * as StatusTools from './statusTools';\nimport * as QueueTools from './queueTools';\n\n// Re-export all handlers for testing\nexport * from './discoveryTools';\nexport * from './audioTools';\nexport * from './contextTools';\nexport * from './entityTools';\nexport * from './assistTools';\nexport * from './transcriptTools';\nexport * from './systemTools';\nexport * from './relationshipTools';\nexport * from './contentTools';\nexport * from './statusTools';\nexport * from './queueTools';\nexport * from './shared';\n\n// ============================================================================\n// All Tools\n// ============================================================================\n\nexport const tools: Tool[] = [\n // System Information\n SystemTools.getVersionTool,\n SystemTools.getInfoTool,\n\n // Discovery & Configuration\n DiscoveryTools.discoverConfigTool,\n DiscoveryTools.suggestProjectTool,\n\n // Audio Processing\n AudioTools.processAudioTool,\n AudioTools.batchProcessTool,\n\n // Context Management\n ContextTools.contextStatusTool,\n ContextTools.listProjectsTool,\n ContextTools.listProjectPlansTool,\n ContextTools.listPeopleTool,\n ContextTools.listTermsTool,\n ContextTools.listCompaniesTool,\n ContextTools.searchContextTool,\n ContextTools.getEntityTool,\n ContextTools.predictEntitiesTool,\n\n // Entity CRUD\n EntityTools.addPersonTool,\n EntityTools.editPersonTool,\n EntityTools.addProjectTool,\n EntityTools.editProjectTool,\n EntityTools.updateProjectTool,\n EntityTools.addTermTool,\n EntityTools.editTermTool,\n EntityTools.updateTermTool,\n EntityTools.mergeTermsTool,\n EntityTools.addCompanyTool,\n EntityTools.editCompanyTool,\n EntityTools.deleteEntityTool,\n\n // Relationship Management\n RelationshipTools.addRelationshipTool,\n RelationshipTools.removeRelationshipTool,\n RelationshipTools.listRelationshipsTool,\n RelationshipTools.findRelatedEntitiesTool,\n\n // Content Management\n ContentTools.addContentTool,\n ContentTools.removeContentTool,\n ContentTools.listContentTool,\n ContentTools.getContentTool,\n\n // Smart Assistance\n AssistTools.suggestProjectMetadataTool,\n AssistTools.suggestTermMetadataTool,\n\n // Transcript Operations\n TranscriptTools.readTranscriptTool,\n TranscriptTools.listTranscriptsTool,\n TranscriptTools.identifyTasksFromTranscriptTool,\n TranscriptTools.summarizeTranscriptTool,\n TranscriptTools.deleteTranscriptSummaryTool,\n TranscriptTools.editTranscriptTool,\n TranscriptTools.changeTranscriptDateTool,\n TranscriptTools.combineTranscriptsTool,\n TranscriptTools.provideFeedbackTool,\n TranscriptTools.enhanceTranscriptTool,\n TranscriptTools.updateTranscriptContentTool,\n TranscriptTools.updateTranscriptEntityReferencesTool,\n TranscriptTools.createNoteTool,\n TranscriptTools.getEnhancementLogTool,\n TranscriptTools.correctToEntityTool,\n TranscriptTools.rejectCorrectionTool,\n\n // Lifecycle Status & Tasks\n StatusTools.setStatusTool,\n StatusTools.createTaskTool,\n StatusTools.completeTaskTool,\n StatusTools.deleteTaskTool,\n\n // Queue Management\n QueueTools.queueStatusTool,\n QueueTools.getTranscriptByUuidTool,\n QueueTools.retryTranscriptionTool,\n QueueTools.cancelTranscriptionTool,\n QueueTools.workerStatusTool,\n QueueTools.restartWorkerTool,\n];\n\n// ============================================================================\n// Tool Handler Router\n// ============================================================================\n\nexport async function handleToolCall(name: string, args: unknown): Promise<unknown> {\n switch (name) {\n // System Information\n case 'protokoll_get_version':\n return SystemTools.handleGetVersion();\n case 'protokoll_info':\n return SystemTools.handleGetInfo();\n\n // Discovery & Configuration\n case 'protokoll_discover_config':\n return DiscoveryTools.handleDiscoverConfig(args as Parameters<typeof DiscoveryTools.handleDiscoverConfig>[0]);\n case 'protokoll_suggest_project':\n return DiscoveryTools.handleSuggestProject(args as Parameters<typeof DiscoveryTools.handleSuggestProject>[0]);\n\n // Audio Processing\n case 'protokoll_process_audio':\n return AudioTools.handleProcessAudio(args as Parameters<typeof AudioTools.handleProcessAudio>[0]);\n case 'protokoll_batch_process':\n return AudioTools.handleBatchProcess(args as Parameters<typeof AudioTools.handleBatchProcess>[0]);\n\n // Context Management\n case 'protokoll_context_status':\n return ContextTools.handleContextStatus(args as Parameters<typeof ContextTools.handleContextStatus>[0]);\n case 'protokoll_list_projects':\n return ContextTools.handleListProjects(args as Parameters<typeof ContextTools.handleListProjects>[0]);\n case 'protokoll_list_project_plans':\n return ContextTools.handleListProjectPlans(\n args as Parameters<typeof ContextTools.handleListProjectPlans>[0],\n );\n case 'protokoll_list_people':\n return ContextTools.handleListPeople(args as Parameters<typeof ContextTools.handleListPeople>[0]);\n case 'protokoll_list_terms':\n return ContextTools.handleListTerms(args as Parameters<typeof ContextTools.handleListTerms>[0]);\n case 'protokoll_list_companies':\n return ContextTools.handleListCompanies(args as Parameters<typeof ContextTools.handleListCompanies>[0]);\n case 'protokoll_search_context':\n return ContextTools.handleSearchContext(args as Parameters<typeof ContextTools.handleSearchContext>[0]);\n case 'protokoll_get_entity':\n return ContextTools.handleGetEntity(args as Parameters<typeof ContextTools.handleGetEntity>[0]);\n case 'protokoll_predict_entities':\n return ContextTools.handlePredictEntities(args as Parameters<typeof ContextTools.handlePredictEntities>[0]);\n\n // Entity CRUD\n case 'protokoll_add_person':\n return EntityTools.handleAddPerson(args as Parameters<typeof EntityTools.handleAddPerson>[0]);\n case 'protokoll_edit_person':\n return EntityTools.handleEditPerson(args as Parameters<typeof EntityTools.handleEditPerson>[0]);\n case 'protokoll_add_project':\n return EntityTools.handleAddProject(args as Parameters<typeof EntityTools.handleAddProject>[0]);\n case 'protokoll_edit_project':\n return EntityTools.handleEditProject(args as Parameters<typeof EntityTools.handleEditProject>[0]);\n case 'protokoll_update_project':\n return EntityTools.handleUpdateProject(args as Parameters<typeof EntityTools.handleUpdateProject>[0]);\n case 'protokoll_add_term':\n return EntityTools.handleAddTerm(args as Parameters<typeof EntityTools.handleAddTerm>[0]);\n case 'protokoll_edit_term':\n return EntityTools.handleEditTerm(args as Parameters<typeof EntityTools.handleEditTerm>[0]);\n case 'protokoll_update_term':\n return EntityTools.handleUpdateTerm(args as Parameters<typeof EntityTools.handleUpdateTerm>[0]);\n case 'protokoll_merge_terms':\n return EntityTools.handleMergeTerms(args as Parameters<typeof EntityTools.handleMergeTerms>[0]);\n case 'protokoll_add_company':\n return EntityTools.handleAddCompany(args as Parameters<typeof EntityTools.handleAddCompany>[0]);\n case 'protokoll_edit_company':\n return EntityTools.handleEditCompany(args as Parameters<typeof EntityTools.handleEditCompany>[0]);\n case 'protokoll_delete_entity':\n return EntityTools.handleDeleteEntity(args as Parameters<typeof EntityTools.handleDeleteEntity>[0]);\n\n // Smart Assistance\n case 'protokoll_suggest_project_metadata':\n return AssistTools.handleSuggestProjectMetadata(args as Parameters<typeof AssistTools.handleSuggestProjectMetadata>[0]);\n case 'protokoll_suggest_term_metadata':\n return AssistTools.handleSuggestTermMetadata(args as Parameters<typeof AssistTools.handleSuggestTermMetadata>[0]);\n\n // Relationship Management\n case 'protokoll_add_relationship':\n return RelationshipTools.handleAddRelationship(args as Parameters<typeof RelationshipTools.handleAddRelationship>[0]);\n case 'protokoll_remove_relationship':\n return RelationshipTools.handleRemoveRelationship(args as Parameters<typeof RelationshipTools.handleRemoveRelationship>[0]);\n case 'protokoll_list_relationships':\n return RelationshipTools.handleListRelationships(args as Parameters<typeof RelationshipTools.handleListRelationships>[0]);\n case 'protokoll_find_related_entities':\n return RelationshipTools.handleFindRelatedEntities(args as Parameters<typeof RelationshipTools.handleFindRelatedEntities>[0]);\n\n // Content Management\n case 'protokoll_add_content':\n return ContentTools.handleAddContent(args as Parameters<typeof ContentTools.handleAddContent>[0]);\n case 'protokoll_remove_content':\n return ContentTools.handleRemoveContent(args as Parameters<typeof ContentTools.handleRemoveContent>[0]);\n case 'protokoll_list_content':\n return ContentTools.handleListContent(args as Parameters<typeof ContentTools.handleListContent>[0]);\n case 'protokoll_get_content':\n return ContentTools.handleGetContent(args as Parameters<typeof ContentTools.handleGetContent>[0]);\n\n // Transcript Operations\n case 'protokoll_read_transcript':\n return TranscriptTools.handleReadTranscript(args as Parameters<typeof TranscriptTools.handleReadTranscript>[0]);\n case 'protokoll_list_transcripts':\n return TranscriptTools.handleListTranscripts(args as Parameters<typeof TranscriptTools.handleListTranscripts>[0]);\n case 'protokoll_identify_tasks_from_transcript':\n return TranscriptTools.handleIdentifyTasksFromTranscript(args as Parameters<typeof TranscriptTools.handleIdentifyTasksFromTranscript>[0]);\n case 'protokoll_summarize_transcript':\n return TranscriptTools.handleSummarizeTranscript(args as Parameters<typeof TranscriptTools.handleSummarizeTranscript>[0]);\n case 'protokoll_delete_transcript_summary':\n return TranscriptTools.handleDeleteTranscriptSummary(args as Parameters<typeof TranscriptTools.handleDeleteTranscriptSummary>[0]);\n case 'protokoll_edit_transcript':\n return TranscriptTools.handleEditTranscript(args as Parameters<typeof TranscriptTools.handleEditTranscript>[0]);\n case 'protokoll_change_transcript_date':\n return TranscriptTools.handleChangeTranscriptDate(args as Parameters<typeof TranscriptTools.handleChangeTranscriptDate>[0]);\n case 'protokoll_combine_transcripts':\n return TranscriptTools.handleCombineTranscripts(args as Parameters<typeof TranscriptTools.handleCombineTranscripts>[0]);\n case 'protokoll_provide_feedback':\n return TranscriptTools.handleProvideFeedback(args as Parameters<typeof TranscriptTools.handleProvideFeedback>[0]);\n case 'protokoll_enhance_transcript':\n return TranscriptTools.handleEnhanceTranscript(args as Parameters<typeof TranscriptTools.handleEnhanceTranscript>[0]);\n case 'protokoll_update_transcript_content':\n return TranscriptTools.handleUpdateTranscriptContent(args as Parameters<typeof TranscriptTools.handleUpdateTranscriptContent>[0]);\n case 'protokoll_update_transcript_entity_references':\n return TranscriptTools.handleUpdateTranscriptEntityReferences(args as Parameters<typeof TranscriptTools.handleUpdateTranscriptEntityReferences>[0]);\n case 'protokoll_create_note':\n return TranscriptTools.handleCreateNote(args as Parameters<typeof TranscriptTools.handleCreateNote>[0]);\n case 'protokoll_get_enhancement_log':\n return TranscriptTools.handleGetEnhancementLog(args as Parameters<typeof TranscriptTools.handleGetEnhancementLog>[0]);\n case 'protokoll_correct_to_entity':\n return TranscriptTools.handleCorrectToEntity(args as Parameters<typeof TranscriptTools.handleCorrectToEntity>[0]);\n case 'protokoll_reject_correction':\n return TranscriptTools.handleRejectCorrection(args as Parameters<typeof TranscriptTools.handleRejectCorrection>[0]);\n\n // Lifecycle Status & Tasks\n case 'protokoll_set_status':\n return StatusTools.handleSetStatus(args as Parameters<typeof StatusTools.handleSetStatus>[0]);\n case 'protokoll_create_task':\n return StatusTools.handleCreateTask(args as Parameters<typeof StatusTools.handleCreateTask>[0]);\n case 'protokoll_complete_task':\n return StatusTools.handleCompleteTask(args as Parameters<typeof StatusTools.handleCompleteTask>[0]);\n case 'protokoll_delete_task':\n return StatusTools.handleDeleteTask(args as Parameters<typeof StatusTools.handleDeleteTask>[0]);\n\n // Queue Management\n case 'protokoll_queue_status':\n return QueueTools.handleQueueStatus();\n case 'protokoll_get_transcript_by_uuid':\n return QueueTools.handleGetTranscriptByUuid(args as Parameters<typeof QueueTools.handleGetTranscriptByUuid>[0]);\n case 'protokoll_retry_transcription':\n return QueueTools.handleRetryTranscription(args as Parameters<typeof QueueTools.handleRetryTranscription>[0]);\n case 'protokoll_cancel_transcription':\n return QueueTools.handleCancelTranscription(args as Parameters<typeof QueueTools.handleCancelTranscription>[0]);\n case 'protokoll_worker_status':\n return QueueTools.handleWorkerStatus();\n case 'protokoll_restart_worker':\n return QueueTools.handleRestartWorker();\n\n default:\n throw new Error(`Unknown tool: ${name}`);\n }\n}\n","/**\n * Shared Configuration Discovery\n * \n * Uses CardiganTime to discover protokoll-config.yaml files hierarchically,\n * matching the behavior of protokoll-cli. This module is shared between\n * the stdio server (server.ts) and HTTP server (server-hono.ts).\n */\n\nimport * as Cardigantime from '@utilarium/cardigantime';\nimport type { Logger } from '@utilarium/cardigantime';\nimport { resolve, dirname, basename } from 'node:path';\nimport Logging from '@fjell/logging';\n\nexport const DEFAULT_CONFIG_FILE = 'protokoll-config.yaml';\nconst logger = Logging.getLogger('@redaksjon/protokoll-mcp').get('config-discovery');\n\n/**\n * Check if debug mode is enabled via environment or will be via config\n */\nfunction isDebugEnabled(): boolean {\n return process.env.PROTOKOLL_DEBUG === 'true' || process.env.DEBUG === 'true';\n}\n\n/**\n * Create a quiet logger that only outputs when debug is enabled\n * and formats messages in a cleaner way\n */\nexport function createQuietLogger(): Logger {\n const debugEnabled = isDebugEnabled();\n \n const noop = () => { /* intentionally empty */ };\n \n return {\n debug: noop, // Suppress verbose debug messages\n info: noop, // Suppress info messages during discovery\n warn: (message: string, ...args: unknown[]) => {\n // eslint-disable-next-line no-console\n console.error(`[config:warn] ${message}`);\n logger.warning('cardigantime.warn', { message, args });\n },\n error: (message: string, ...args: unknown[]) => {\n // eslint-disable-next-line no-console\n console.error(`[config:error] ${message}`);\n logger.error('cardigantime.error', { message, args });\n },\n verbose: debugEnabled\n ? (message: string, ...args: unknown[]) => {\n // eslint-disable-next-line no-console\n console.error(`[config] ${message}`);\n logger.debug('cardigantime.debug', { message, args });\n }\n : noop,\n silly: noop,\n };\n}\n\n/**\n * Parse a CLI argument value from argv\n */\nexport function getArgValue(argv: string[], flag: string): string | undefined {\n const idx = argv.indexOf(flag);\n if (idx === -1) return undefined;\n const value = argv[idx + 1];\n if (!value || value.startsWith('-')) return undefined;\n return value;\n}\n\n/**\n * Read configuration from a directory using CardiganTime\n */\nexport async function readCardigantimeConfigFromDirectory(\n directory: string,\n configFile: string,\n features: Array<'config' | 'hierarchical'>\n): Promise<Record<string, unknown>> {\n const cardigantime = Cardigantime.create({\n defaults: {\n configDirectory: '.',\n configFile,\n isRequired: false,\n // Tell CardiganTime to resolve these path fields relative to the config file's directory\n // Note: contextDirectories must be in BOTH pathFields AND resolvePathArray - \n // pathFields determines which fields are processed, resolvePathArray determines\n // if array elements should be resolved individually\n pathResolution: {\n pathFields: ['inputDirectory', 'outputDirectory', 'processedDirectory', 'contextDirectories'],\n resolvePathArray: ['contextDirectories'],\n },\n },\n configShape: {},\n features,\n logger: createQuietLogger(),\n });\n\n const previousCwd = process.cwd();\n try {\n process.chdir(directory);\n return await cardigantime.read({});\n } finally {\n process.chdir(previousCwd);\n }\n}\n\n/**\n * Load configuration using CardiganTime from the workspace root\n * This respects environment variables and hierarchical config files\n */\nexport async function loadCardigantimeConfig(): Promise<Record<string, unknown>> {\n const workspaceRoot = process.env.WORKSPACE_ROOT || process.cwd();\n return await readCardigantimeConfigFromDirectory(workspaceRoot, DEFAULT_CONFIG_FILE, ['config', 'hierarchical']);\n}\n\n/**\n * Initialize working directory and WORKSPACE_ROOT from CLI args and config discovery.\n * \n * Supports:\n * - `--cwd <dir>` to change working directory\n * - `-c <path>` or `--config <path>` to specify config file (matching protokoll-cli)\n * - `PROTOKOLL_CONFIG` environment variable\n * - Hierarchical discovery of protokoll-config.yaml up the directory tree\n */\nexport async function initializeWorkingDirectoryFromArgsAndConfig(): Promise<void> {\n const argv = process.argv.slice(2);\n const cwdArg = getArgValue(argv, '--cwd');\n // Support both -c and --config (matching protokoll-cli)\n const configArg = getArgValue(argv, '-c') || getArgValue(argv, '--config') || process.env.PROTOKOLL_CONFIG;\n\n if (cwdArg) {\n process.chdir(resolve(cwdArg));\n }\n\n // Use CardiganTime (like protokoll-cli) to locate protokoll-config.yaml up the tree.\n // If an explicit config file path is provided, use only that file.\n if (configArg) {\n const configPath = resolve(configArg);\n const configDir = dirname(configPath);\n const configFile = basename(configPath);\n\n // Expose for downstream code; also makes it easier to debug.\n process.env.PROTOKOLL_CONFIG = configPath;\n process.env.WORKSPACE_ROOT = configDir;\n\n // Ensure it's readable early (and preserves CardiganTime semantics).\n await readCardigantimeConfigFromDirectory(configDir, configFile, ['config']);\n return;\n }\n\n const discoveryStart = process.env.WORKSPACE_ROOT || process.cwd();\n const config = await readCardigantimeConfigFromDirectory(\n discoveryStart,\n DEFAULT_CONFIG_FILE,\n ['config', 'hierarchical']\n );\n\n const resolvedConfigDirs = (config as any).resolvedConfigDirs;\n if (Array.isArray(resolvedConfigDirs) && resolvedConfigDirs.length > 0) {\n process.env.WORKSPACE_ROOT = resolvedConfigDirs[0];\n } else {\n process.env.WORKSPACE_ROOT = discoveryStart;\n }\n}\n","import { access } from 'node:fs/promises';\nimport { dirname, join } from 'node:path';\nimport { fileURLToPath, pathToFileURL } from 'node:url';\nimport Logging from '@fjell/logging';\n\nconst logger = Logging.getLogger('@redaksjon/protokoll-mcp').get('engine-logging');\nlet configured = false;\nlet stdioBridgeInstalled = false;\n\nfunction coerceMessage(args: unknown[]): string {\n return args\n .map((value) => {\n if (typeof value === 'string') {\n return value;\n }\n if (value instanceof Error) {\n return value.message;\n }\n try {\n return JSON.stringify(value);\n } catch {\n return String(value);\n }\n })\n .join(' ')\n .trim();\n}\n\nfunction stripAnsi(input: string): string {\n return input.split(String.fromCharCode(27)).join('');\n}\n\nfunction installStdIoBridge(): void {\n if (stdioBridgeInstalled) {\n return;\n }\n stdioBridgeInstalled = true;\n\n const engineLog = Logging.getLogger('@redaksjon/protokoll-mcp').get('engine');\n const originalStdoutWrite = process.stdout.write.bind(process.stdout);\n const originalStderrWrite = process.stderr.write.bind(process.stderr);\n\n let inBridgeWrite = false;\n let stdoutBuffer = '';\n let stderrBuffer = '';\n\n const flushBuffer = (\n buffer: string,\n writeOriginal: (chunk: string) => void,\n ): string => {\n let working = buffer;\n while (true) {\n const newlineIndex = working.indexOf('\\n');\n if (newlineIndex < 0) {\n break;\n }\n const line = working.slice(0, newlineIndex).replace(/\\r$/, '');\n working = working.slice(newlineIndex + 1);\n\n const normalized = stripAnsi(line).trim();\n const match = normalized.match(/^(info|debug|warn|warning|error):\\s*(.*)$/i);\n if (match) {\n const rawLevel = match[1].toLowerCase();\n const message = match[2] || '';\n inBridgeWrite = true;\n try {\n if (rawLevel === 'error') {\n engineLog.error('engine.message', { message });\n } else if (rawLevel === 'warn' || rawLevel === 'warning') {\n engineLog.warning('engine.message', { message });\n } else if (rawLevel === 'debug') {\n engineLog.debug('engine.message', { message });\n } else {\n engineLog.info('engine.message', { message });\n }\n } finally {\n inBridgeWrite = false;\n }\n continue;\n }\n\n writeOriginal(`${line}\\n`);\n }\n return working;\n };\n\n (process.stdout.write as unknown) = ((chunk: any, encoding?: BufferEncoding, cb?: (error?: Error | null) => void) => {\n if (inBridgeWrite) {\n return originalStdoutWrite(chunk, encoding as any, cb as any);\n }\n const text = typeof chunk === 'string' ? chunk : chunk?.toString(encoding || 'utf8');\n if (!text) {\n return originalStdoutWrite(chunk, encoding as any, cb as any);\n }\n stdoutBuffer += text;\n stdoutBuffer = flushBuffer(stdoutBuffer, (value) => {\n originalStdoutWrite(value);\n });\n if (typeof cb === 'function') cb(null);\n return true;\n }) as typeof process.stdout.write;\n\n (process.stderr.write as unknown) = ((chunk: any, encoding?: BufferEncoding, cb?: (error?: Error | null) => void) => {\n if (inBridgeWrite) {\n return originalStderrWrite(chunk, encoding as any, cb as any);\n }\n const text = typeof chunk === 'string' ? chunk : chunk?.toString(encoding || 'utf8');\n if (!text) {\n return originalStderrWrite(chunk, encoding as any, cb as any);\n }\n stderrBuffer += text;\n stderrBuffer = flushBuffer(stderrBuffer, (value) => {\n originalStderrWrite(value);\n });\n if (typeof cb === 'function') cb(null);\n return true;\n }) as typeof process.stderr.write;\n\n logger.info('bridge.stdio_installed');\n}\n\n/**\n * Route @redaksjon/protokoll-engine's internal winston logger through fjell/logging.\n * This prevents raw `info: ...` console lines and keeps a single structured log format.\n */\nexport async function configureEngineLoggingBridge(): Promise<void> {\n if (configured) {\n return;\n }\n\n installStdIoBridge();\n\n try {\n const candidates = new Set<string>();\n try {\n const resolvedEntryUrl = import.meta.resolve('@redaksjon/protokoll-engine');\n const resolvedEntryPath = fileURLToPath(resolvedEntryUrl);\n candidates.add(join(dirname(resolvedEntryPath), 'index47.js'));\n } catch {\n // fall through to additional discovery strategies\n }\n candidates.add(join(process.cwd(), 'node_modules', '@redaksjon', 'protokoll-engine', 'dist', 'index47.js'));\n\n let engineLoggerModulePath: string | null = null;\n for (const candidate of candidates) {\n try {\n await access(candidate);\n engineLoggerModulePath = candidate;\n break;\n } catch {\n // keep scanning candidates\n }\n }\n if (!engineLoggerModulePath) {\n logger.warning('bridge.unavailable', { reason: 'logger_module_not_found' });\n configured = true;\n return;\n }\n\n const engineLoggerModule = await import(pathToFileURL(engineLoggerModulePath).href) as {\n getLogger?: () => Record<string, any>;\n };\n\n const engineLogger = engineLoggerModule.getLogger?.();\n if (!engineLogger) {\n logger.warning('bridge.unavailable', { reason: 'missing_getLogger' });\n configured = true;\n return;\n }\n\n if (engineLogger.__protokollBridgeInstalled === true) {\n configured = true;\n return;\n }\n\n const engineLog = Logging.getLogger('@redaksjon/protokoll-mcp').get('engine');\n engineLogger.info = (...args: unknown[]) => {\n engineLog.info('engine.message', { message: coerceMessage(args) });\n };\n engineLogger.debug = (...args: unknown[]) => {\n engineLog.debug('engine.message', { message: coerceMessage(args) });\n };\n engineLogger.warn = (...args: unknown[]) => {\n engineLog.warning('engine.message', { message: coerceMessage(args) });\n };\n engineLogger.error = (...args: unknown[]) => {\n engineLog.error('engine.message', { message: coerceMessage(args) });\n };\n\n engineLogger.__protokollBridgeInstalled = true;\n configured = true;\n logger.info('bridge.installed');\n } catch (error) {\n configured = true;\n logger.warning('bridge.install_failed', {\n error: error instanceof Error ? error.message : String(error),\n });\n }\n}\n"],"names":["createContext","logger","normalizePath","DEFAULT_CONFIG_FILE","Context.create","getWorkspaceRoot","isServerConfigInitialized","ServerConfig.isInitialized","getServerContext","ServerConfig.getContext","getServerConfigFile","ServerConfig.getServerConfig","ServerConfig.getWorkspaceRoot","level","INDEX_SCHEMA_VERSION","ENTITY_DIRECTORY","metadataVersionKey","listFilesWithMetadataCompat","ServerConfig.getStorageConfig","transcriptExists","ensurePklExtension","findTranscriptByUuid","Storage","contextDirs","result","resolveTranscriptPath","readTranscriptContent","withTempPklFile","created","parseStoredSummaries","ServerConfig.getOutputDirectory","ServerConfig.getOutputStorage","resolveStorageTranscriptPath","resolveCanonicalEntityId","PROJECT_PLAN_ARRAY_KEYS","yamlContent","entities","responseData","ServerConfig.getInputDirectory","ServerConfig.getProcessedDirectory","__filename","__dirname","prompts","sanitizedSearchedFrom","relationships","TranscriptUtils","pklPath","readTranscriptFromStorage","listTranscriptsFromStorage","randomUUID","statusChanged","previousStatus","changes","transcript","ServerConfig.getServerMode","getEntityByType","parseEntityUri","ENGINE_VALID_STATUSES","isEngineValidStatus","outputDirectory","relativePath","SystemTools.getVersionTool","SystemTools.getInfoTool","DiscoveryTools.discoverConfigTool","DiscoveryTools.suggestProjectTool","AudioTools.processAudioTool","AudioTools.batchProcessTool","ContextTools.contextStatusTool","ContextTools.listProjectsTool","ContextTools.listProjectPlansTool","ContextTools.listPeopleTool","ContextTools.listTermsTool","ContextTools.listCompaniesTool","ContextTools.searchContextTool","ContextTools.getEntityTool","ContextTools.predictEntitiesTool","EntityTools.addPersonTool","EntityTools.editPersonTool","EntityTools.addProjectTool","EntityTools.editProjectTool","EntityTools.updateProjectTool","EntityTools.addTermTool","EntityTools.editTermTool","EntityTools.updateTermTool","EntityTools.mergeTermsTool","EntityTools.addCompanyTool","EntityTools.editCompanyTool","EntityTools.deleteEntityTool","RelationshipTools.addRelationshipTool","RelationshipTools.removeRelationshipTool","RelationshipTools.listRelationshipsTool","RelationshipTools.findRelatedEntitiesTool","ContentTools.addContentTool","ContentTools.removeContentTool","ContentTools.listContentTool","ContentTools.getContentTool","AssistTools.suggestProjectMetadataTool","AssistTools.suggestTermMetadataTool","TranscriptTools.readTranscriptTool","TranscriptTools.listTranscriptsTool","TranscriptTools.identifyTasksFromTranscriptTool","TranscriptTools.summarizeTranscriptTool","TranscriptTools.deleteTranscriptSummaryTool","TranscriptTools.editTranscriptTool","TranscriptTools.changeTranscriptDateTool","TranscriptTools.combineTranscriptsTool","TranscriptTools.provideFeedbackTool","TranscriptTools.enhanceTranscriptTool","TranscriptTools.updateTranscriptContentTool","TranscriptTools.updateTranscriptEntityReferencesTool","TranscriptTools.createNoteTool","TranscriptTools.getEnhancementLogTool","TranscriptTools.correctToEntityTool","TranscriptTools.rejectCorrectionTool","StatusTools.setStatusTool","StatusTools.createTaskTool","StatusTools.completeTaskTool","StatusTools.deleteTaskTool","QueueTools.queueStatusTool","QueueTools.getTranscriptByUuidTool","QueueTools.retryTranscriptionTool","QueueTools.cancelTranscriptionTool","QueueTools.workerStatusTool","QueueTools.restartWorkerTool","SystemTools.handleGetVersion","SystemTools.handleGetInfo","DiscoveryTools.handleDiscoverConfig","DiscoveryTools.handleSuggestProject","AudioTools.handleProcessAudio","AudioTools.handleBatchProcess","ContextTools.handleContextStatus","ContextTools.handleListProjects","ContextTools.handleListProjectPlans","ContextTools.handleListPeople","ContextTools.handleListTerms","ContextTools.handleListCompanies","ContextTools.handleSearchContext","ContextTools.handleGetEntity","ContextTools.handlePredictEntities","EntityTools.handleAddPerson","EntityTools.handleEditPerson","EntityTools.handleAddProject","EntityTools.handleEditProject","EntityTools.handleUpdateProject","EntityTools.handleAddTerm","EntityTools.handleEditTerm","EntityTools.handleUpdateTerm","EntityTools.handleMergeTerms","EntityTools.handleAddCompany","EntityTools.handleEditCompany","EntityTools.handleDeleteEntity","AssistTools.handleSuggestProjectMetadata","AssistTools.handleSuggestTermMetadata","RelationshipTools.handleAddRelationship","RelationshipTools.handleRemoveRelationship","RelationshipTools.handleListRelationships","RelationshipTools.handleFindRelatedEntities","ContentTools.handleAddContent","ContentTools.handleRemoveContent","ContentTools.handleListContent","ContentTools.handleGetContent","TranscriptTools.handleReadTranscript","TranscriptTools.handleListTranscripts","TranscriptTools.handleIdentifyTasksFromTranscript","TranscriptTools.handleSummarizeTranscript","TranscriptTools.handleDeleteTranscriptSummary","TranscriptTools.handleEditTranscript","TranscriptTools.handleChangeTranscriptDate","TranscriptTools.handleCombineTranscripts","TranscriptTools.handleProvideFeedback","TranscriptTools.handleEnhanceTranscript","TranscriptTools.handleUpdateTranscriptContent","TranscriptTools.handleUpdateTranscriptEntityReferences","TranscriptTools.handleCreateNote","TranscriptTools.handleGetEnhancementLog","TranscriptTools.handleCorrectToEntity","TranscriptTools.handleRejectCorrection","StatusTools.handleSetStatus","StatusTools.handleCreateTask","StatusTools.handleCompleteTask","StatusTools.handleDeleteTask","QueueTools.handleQueueStatus","QueueTools.handleGetTranscriptByUuid","QueueTools.handleRetryTranscription","QueueTools.handleCancelTranscription","QueueTools.handleWorkerStatus","QueueTools.handleRestartWorker"],"mappings":"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"}
1
+ {"version":3,"file":"engineLogging.js","sources":["../src/mcp/uri.ts","../src/constants.ts","../src/context/index.ts","../src/mcp/roots.ts","../src/mcp/storage/types.ts","../src/mcp/storage/gcsUri.ts","../src/mcp/storage/gcsProvider.ts","../src/mcp/storage/fileProviders.ts","../src/mcp/serverConfig.ts","../src/mcp/resources/definitions.ts","../src/mcp/resources/discovery.ts","../src/logging.ts","../src/mcp/resources/entityIndexService.ts","../src/mcp/tools/shared.ts","../src/mcp/resources/transcriptIndexService.ts","../src/mcp/resources/transcriptResources.ts","../src/mcp/util/scopedEntityId.ts","../src/mcp/resources/entityResources.ts","../src/mcp/resources/audioResources.ts","../src/mcp/resources/configResource.ts","../src/mcp/resources/index.ts","../src/mcp/prompts/index.ts","../src/mcp/tools/discoveryTools.ts","../src/mcp/tools/audioTools.ts","../src/mcp/tools/contextTools.ts","../src/mcp/tools/entityTools.ts","../src/mcp/tools/assistTools.ts","../src/mcp/tools/transcriptTools.ts","../src/mcp/tools/systemTools.ts","../src/mcp/tools/relationshipTools.ts","../src/mcp/tools/contentTools.ts","../src/mcp/tools/statusTools.ts","../src/mcp/tools/queueTools.ts","../src/mcp/tools/index.ts","../src/mcp/configDiscovery.ts","../src/mcp/engineLogging.ts"],"sourcesContent":["/**\n * URI Parser for Protokoll MCP Resources\n * \n * Handles parsing and construction of protokoll:// URIs.\n * \n * URI Schemes:\n * - protokoll://transcript/{path}\n * - protokoll://entity/{type}/{id}\n * - protokoll://config/{path}\n * - protokoll://transcripts?directory={dir}&startDate={date}&...\n * - protokoll://entities/{type}\n */\n\nimport type {\n ParsedResourceUri,\n TranscriptUri,\n EntityUri,\n ConfigUri,\n TranscriptsListUri,\n EntitiesListUri,\n AudioInboundUri,\n AudioProcessedUri,\n ResourceType,\n} from './types';\n\nconst SCHEME = 'protokoll';\n\n/**\n * Parse a protokoll:// URI into its components\n */\nexport function parseUri(uri: string): ParsedResourceUri {\n if (!uri.startsWith(`${SCHEME}://`)) {\n throw new Error(`Invalid URI scheme: ${uri}. Expected protokoll://`);\n }\n\n const withoutScheme = uri.substring(`${SCHEME}://`.length);\n const [pathPart, queryPart] = withoutScheme.split('?');\n const segments = pathPart.split('/').filter(s => s.length > 0);\n\n if (segments.length === 0) {\n throw new Error(`Invalid URI: ${uri}. No resource type specified.`);\n }\n\n const firstSegment = segments[0];\n const params = parseQueryParams(queryPart);\n\n switch (firstSegment) {\n case 'transcript':\n return parseTranscriptUri(uri, segments, params);\n case 'entity':\n return parseEntityUri(uri, segments, params);\n case 'config':\n return parseConfigUri(uri, segments, params);\n case 'transcripts':\n case 'transcripts-list':\n return parseTranscriptsListUri(uri, segments, params);\n case 'entities':\n case 'entities-list':\n return parseEntitiesListUri(uri, segments, params);\n case 'audio':\n return parseAudioUri(uri, segments, params);\n default:\n throw new Error(`Unknown resource type: ${firstSegment}`);\n }\n}\n\nfunction parseQueryParams(queryPart?: string): Record<string, string> {\n if (!queryPart) return {};\n \n const params: Record<string, string> = {};\n const pairs = queryPart.split('&');\n \n for (const pair of pairs) {\n const [key, value] = pair.split('=');\n if (key && value !== undefined) {\n params[decodeURIComponent(key)] = decodeURIComponent(value);\n }\n }\n \n return params;\n}\n\nfunction parseTranscriptUri(\n uri: string,\n segments: string[],\n params: Record<string, string>\n): TranscriptUri {\n // protokoll://transcript/path/to/file\n // Note: URIs should NOT include file extensions (.md or .pkl)\n // The server resolves the actual file format automatically\n // \n // Handle both relative and absolute paths\n // If URI has double slash after transcript, it's an absolute path\n const withoutScheme = uri.substring(`${SCHEME}://`.length);\n const [pathPart] = withoutScheme.split('?');\n \n // Check if path starts with transcript/ followed by / (absolute path)\n const transcriptPrefix = 'transcript/';\n let transcriptPath: string;\n \n if (pathPart.startsWith(transcriptPrefix)) {\n // Extract everything after \"transcript/\"\n const afterPrefix = pathPart.substring(transcriptPrefix.length);\n // If it starts with /, it's an absolute path - preserve it\n if (afterPrefix.startsWith('/')) {\n transcriptPath = afterPrefix;\n } else {\n // Relative path - use segments\n transcriptPath = segments.slice(1).join('/');\n }\n } else {\n // Fallback to segments method\n transcriptPath = segments.slice(1).join('/');\n }\n \n if (!transcriptPath) {\n throw new Error(`Invalid transcript URI: ${uri}. No path specified.`);\n }\n\n // Decode the path - the server will resolve the actual file format\n const decodedPath = decodeURIComponent(transcriptPath);\n\n return {\n scheme: SCHEME,\n resourceType: 'transcript',\n path: transcriptPath,\n params,\n transcriptPath: decodedPath,\n };\n}\n\nfunction parseEntityUri(\n uri: string,\n segments: string[],\n params: Record<string, string>\n): EntityUri {\n // protokoll://entity/{type}/{id}\n if (segments.length < 3) {\n throw new Error(`Invalid entity URI: ${uri}. Expected protokoll://entity/{type}/{id}`);\n }\n\n const entityType = segments[1] as EntityUri['entityType'];\n const entityId = segments.slice(2).join('/');\n\n const validTypes = ['person', 'project', 'term', 'company', 'ignored'];\n if (!validTypes.includes(entityType)) {\n throw new Error(`Invalid entity type: ${entityType}. Expected one of: ${validTypes.join(', ')}`);\n }\n\n return {\n scheme: SCHEME,\n resourceType: 'entity',\n path: `${entityType}/${entityId}`,\n params,\n entityType,\n entityId: decodeURIComponent(entityId),\n };\n}\n\nfunction parseConfigUri(\n uri: string,\n segments: string[],\n params: Record<string, string>\n): ConfigUri {\n // protokoll://config/{path}\n const configPath = segments.slice(1).join('/');\n\n return {\n scheme: SCHEME,\n resourceType: 'config',\n path: configPath || '',\n params,\n configPath: configPath ? decodeURIComponent(configPath) : '',\n };\n}\n\nfunction parseTranscriptsListUri(\n uri: string,\n segments: string[],\n params: Record<string, string>\n): TranscriptsListUri {\n // protokoll://transcripts?directory={dir}&startDate={date}&projectId={id}&limit=&offset=...\n const directory = params.directory || '';\n\n const limitRaw = params.limit ? parseInt(params.limit, 10) : NaN;\n const offsetRaw = params.offset ? parseInt(params.offset, 10) : NaN;\n\n return {\n scheme: SCHEME,\n resourceType: 'transcripts-list',\n path: segments.slice(1).join('/'),\n params,\n directory,\n startDate: params.startDate,\n endDate: params.endDate,\n limit: Number.isFinite(limitRaw) && limitRaw > 0 ? limitRaw : undefined,\n offset: Number.isFinite(offsetRaw) && offsetRaw >= 0 ? offsetRaw : undefined,\n projectId: params.projectId,\n };\n}\n\nfunction parseEntitiesListUri(\n uri: string,\n segments: string[],\n params: Record<string, string>\n): EntitiesListUri {\n // protokoll://entities/{type}\n const entityType = (segments[1] || params.type || 'project') as EntitiesListUri['entityType'];\n\n return {\n scheme: SCHEME,\n resourceType: 'entities-list',\n path: entityType,\n params,\n entityType,\n };\n}\n\nfunction parseAudioUri(\n uri: string,\n segments: string[],\n params: Record<string, string>\n): AudioInboundUri | AudioProcessedUri {\n // protokoll://audio/inbound?directory={dir}\n // protokoll://audio/processed?directory={dir}\n const audioType = segments[1];\n \n if (audioType === 'inbound') {\n return {\n scheme: SCHEME,\n resourceType: 'audio-inbound',\n path: 'audio/inbound',\n params,\n directory: params.directory,\n };\n } else if (audioType === 'processed') {\n return {\n scheme: SCHEME,\n resourceType: 'audio-processed',\n path: 'audio/processed',\n params,\n directory: params.directory,\n };\n }\n \n throw new Error(`Invalid audio URI: ${uri}. Expected protokoll://audio/inbound or protokoll://audio/processed`);\n}\n\n// ============================================================================\n// URI Builders\n// ============================================================================\n\n/**\n * Build a transcript resource URI\n * \n * @param transcriptPath The transcript identifier (should NOT include file extension)\n * e.g., \"2026/1/29-1234-meeting\" not \"2026/1/29-1234-meeting.pkl\"\n * The server resolves the actual file format automatically\n */\nexport function buildTranscriptUri(transcriptPath: string): string {\n const encoded = encodeURIComponent(transcriptPath).replace(/%2F/g, '/');\n return `${SCHEME}://transcript/${encoded}`;\n}\n\n/**\n * Build an entity resource URI\n */\nexport function buildEntityUri(\n entityType: 'person' | 'project' | 'term' | 'company' | 'ignored',\n entityId: string\n): string {\n return `${SCHEME}://entity/${entityType}/${encodeURIComponent(entityId)}`;\n}\n\n/**\n * Build a config resource URI\n */\nexport function buildConfigUri(configPath?: string): string {\n if (configPath) {\n return `${SCHEME}://config/${encodeURIComponent(configPath)}`;\n }\n return `${SCHEME}://config`;\n}\n\n/**\n * Build a transcripts list URI\n */\nexport function buildTranscriptsListUri(options: {\n directory?: string;\n startDate?: string;\n endDate?: string;\n limit?: number;\n offset?: number;\n projectId?: string;\n}): string {\n const params = new URLSearchParams();\n if (options.directory) params.set('directory', options.directory);\n if (options.startDate) params.set('startDate', options.startDate);\n if (options.endDate) params.set('endDate', options.endDate);\n if (options.limit !== undefined) params.set('limit', String(options.limit));\n if (options.offset !== undefined) params.set('offset', String(options.offset));\n if (options.projectId) params.set('projectId', options.projectId);\n \n const queryString = params.toString();\n return queryString ? `${SCHEME}://transcripts?${queryString}` : `${SCHEME}://transcripts`;\n}\n\n/**\n * Build an entities list URI\n */\nexport function buildEntitiesListUri(\n entityType: 'person' | 'project' | 'term' | 'company' | 'ignored'\n): string {\n return `${SCHEME}://entities/${entityType}`;\n}\n\n/**\n * Build an inbound audio list URI\n */\nexport function buildAudioInboundUri(directory?: string): string {\n if (directory) {\n return `${SCHEME}://audio/inbound?directory=${encodeURIComponent(directory)}`;\n }\n return `${SCHEME}://audio/inbound`;\n}\n\n/**\n * Build a processed audio list URI\n */\nexport function buildAudioProcessedUri(directory?: string): string {\n if (directory) {\n return `${SCHEME}://audio/processed?directory=${encodeURIComponent(directory)}`;\n }\n return `${SCHEME}://audio/processed`;\n}\n\n/**\n * Check if a string is a valid Protokoll URI\n */\nexport function isProtokolUri(uri: string): boolean {\n return uri.startsWith(`${SCHEME}://`);\n}\n\n/**\n * Get the resource type from a URI without full parsing\n */\nexport function getResourceType(uri: string): ResourceType | null {\n if (!isProtokolUri(uri)) return null;\n \n const withoutScheme = uri.substring(`${SCHEME}://`.length);\n const segments = withoutScheme.split('/');\n const firstSegment = segments[0].split('?')[0];\n \n if (firstSegment === 'transcripts') return 'transcripts-list';\n if (firstSegment === 'entities') return 'entities-list';\n if (firstSegment === 'audio') {\n const secondSegment = segments[1]?.split('?')[0];\n if (secondSegment === 'inbound') return 'audio-inbound';\n if (secondSegment === 'processed') return 'audio-processed';\n }\n \n return firstSegment as ResourceType;\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 - Protokoll Adapter\n * \n * This module provides protokoll-specific extensions on top of @redaksjon/context runtime.\n * Most functionality is now provided by @redaksjon/context; this module adds:\n * - Smart assistance configuration (LLM model selection, feature flags)\n * - Protokoll-specific defaults\n */\n\nimport { \n create as createContext,\n type ContextInstance as BaseContextInstance,\n type CreateOptions as BaseCreateOptions,\n} from '@redaksjon/context';\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';\nimport type { SmartAssistanceConfig } from './types';\n\n// Re-export base types\nexport type { BaseContextInstance as ContextInstance };\n\n// Extend base create options with optional GCS configuration.\nexport interface CreateOptions extends BaseCreateOptions {\n gcs?: {\n bucketName: string;\n basePath: string;\n projectId?: string;\n credentialsFile?: string;\n };\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 * Extended ContextInstance with protokoll-specific methods\n */\nexport interface ProtokollContextInstance extends BaseContextInstance {\n getSmartAssistanceConfig(): SmartAssistanceConfig;\n}\n\n/**\n * Create a new context instance with protokoll-specific extensions\n */\nexport const create = async (options: CreateOptions = {}): Promise<ProtokollContextInstance> => {\n const baseInstance = await createContext(options as BaseCreateOptions);\n\n const resolveEntityByIdentifier = <T extends { id: string; slug?: string }>(\n identifier: string | null | undefined,\n directLookup: (id: string) => T | undefined,\n listAll: () => T[],\n ): T | undefined => {\n if (typeof identifier !== 'string') {\n return undefined;\n }\n const normalized = identifier.trim();\n if (!normalized) {\n return undefined;\n }\n\n const direct = directLookup(normalized);\n if (direct) {\n return direct;\n }\n\n const normalizedLower = normalized.toLowerCase();\n const uuidPrefix = normalizedLower.match(/^([a-f0-9]{8})/)?.[1];\n\n for (const entity of listAll()) {\n const entityId = entity.id.toLowerCase();\n const entitySlug = entity.slug?.toLowerCase();\n\n if (entityId === normalizedLower) {\n return entity;\n }\n if (entitySlug && entitySlug === normalizedLower) {\n return entity;\n }\n if (entityId.startsWith(normalizedLower) || normalizedLower.startsWith(entityId)) {\n return entity;\n }\n if (uuidPrefix && entityId.startsWith(uuidPrefix)) {\n return entity;\n }\n }\n\n return undefined;\n };\n \n return {\n ...baseInstance,\n getPerson: (id: string) => resolveEntityByIdentifier(id, baseInstance.getPerson, baseInstance.getAllPeople),\n getProject: (id: string) => resolveEntityByIdentifier(id, baseInstance.getProject, baseInstance.getAllProjects),\n getCompany: (id: string) => resolveEntityByIdentifier(id, baseInstance.getCompany, baseInstance.getAllCompanies),\n getTerm: (id: string) => resolveEntityByIdentifier(id, baseInstance.getTerm, baseInstance.getAllTerms),\n getIgnored: (id: string) => resolveEntityByIdentifier(id, baseInstance.getIgnored, baseInstance.getAllIgnored),\n getSmartAssistanceConfig: () => getSmartAssistanceConfig(baseInstance.getConfig()),\n };\n};\n\n// Re-export types from @redaksjon/context\nexport * from '@redaksjon/context';\n\n// Re-export protokoll-specific types\nexport * from './types';\n\n// Re-export discovery utilities (now from @redaksjon/context)\nexport { discoverConfigDirectories, loadHierarchicalConfig, deepMerge } from '@redaksjon/context';\n","/**\n * MCP Roots Module\n * \n * Enables the server to discover filesystem boundaries exposed by the client.\n * Roots define where the server is allowed to operate.\n * \n * Key behaviors:\n * - Server requests roots via roots/list\n * - Client may notify of changes via notifications/roots/list_changed\n * - All root URIs are file:// URIs\n */\n\nimport type { McpRoot } from './types';\n\n// Cached roots from the client\nlet cachedRoots: McpRoot[] | null = null;\n// eslint-disable-next-line @typescript-eslint/no-unused-vars\nlet rootsListChangedSupported = false;\n\n/**\n * Check if the client supports roots\n */\nexport function clientSupportsRoots(clientCapabilities: unknown): {\n supported: boolean;\n listChangedSupported: boolean;\n} {\n const caps = clientCapabilities as Record<string, unknown> | undefined;\n const roots = caps?.roots as Record<string, unknown> | undefined;\n \n if (!roots) {\n return { supported: false, listChangedSupported: false };\n }\n\n return {\n supported: true,\n listChangedSupported: roots.listChanged === true,\n };\n}\n\n/**\n * Store client capabilities for roots\n */\nexport function initializeRoots(clientCapabilities: unknown): void {\n const { listChangedSupported } = clientSupportsRoots(clientCapabilities);\n rootsListChangedSupported = listChangedSupported;\n cachedRoots = null; // Clear cache on init\n}\n\n/**\n * Cache roots received from the client\n */\nexport function setRoots(roots: McpRoot[]): void {\n cachedRoots = roots;\n}\n\n/**\n * Clear cached roots (call when roots/list_changed notification received)\n */\nexport function clearRootsCache(): void {\n cachedRoots = null;\n}\n\n/**\n * Get cached roots (returns null if not yet fetched)\n */\nexport function getCachedRoots(): McpRoot[] | null {\n return cachedRoots;\n}\n\n/**\n * Check if a path is within any of the roots\n */\nexport function isPathWithinRoots(path: string, roots: McpRoot[]): boolean {\n const normalizedPath = normalizePath(path);\n \n for (const root of roots) {\n const rootPath = fileUriToPath(root.uri);\n if (rootPath && normalizedPath.startsWith(normalizePath(rootPath))) {\n return true;\n }\n }\n \n return false;\n}\n\n/**\n * Find which root a path belongs to\n */\nexport function findRootForPath(path: string, roots: McpRoot[]): McpRoot | null {\n const normalizedPath = normalizePath(path);\n \n // Find the most specific (longest) matching root\n let bestMatch: McpRoot | null = null;\n let bestMatchLength = 0;\n \n for (const root of roots) {\n const rootPath = fileUriToPath(root.uri);\n if (rootPath) {\n const normalizedRoot = normalizePath(rootPath);\n if (normalizedPath.startsWith(normalizedRoot) && normalizedRoot.length > bestMatchLength) {\n bestMatch = root;\n bestMatchLength = normalizedRoot.length;\n }\n }\n }\n \n return bestMatch;\n}\n\n/**\n * Convert a file:// URI to a filesystem path\n */\nexport function fileUriToPath(uri: string): string | null {\n if (!uri.startsWith('file://')) {\n return null;\n }\n \n try {\n const url = new URL(uri);\n return decodeURIComponent(url.pathname);\n } catch {\n return null;\n }\n}\n\n/**\n * Convert a filesystem path to a file:// URI\n */\nexport function pathToFileUri(path: string): string {\n // Normalize path separators\n const normalized = path.replace(/\\\\/g, '/');\n \n // Ensure path starts with /\n const withLeadingSlash = normalized.startsWith('/') ? normalized : `/${normalized}`;\n \n return `file://${encodeURIComponent(withLeadingSlash).replace(/%2F/g, '/')}`;\n}\n\n/**\n * Normalize a path for comparison\n */\nfunction normalizePath(path: string): string {\n // Remove trailing slashes, normalize separators\n return path.replace(/\\\\/g, '/').replace(/\\/+$/, '');\n}\n\n/**\n * Get human-readable root names for display\n */\nexport function getRootDisplayNames(roots: McpRoot[]): string[] {\n return roots.map(root => root.name || fileUriToPath(root.uri) || root.uri);\n}\n\n/**\n * Validate that all provided paths are within roots\n * Returns paths that are NOT within roots\n */\nexport function validatePathsAgainstRoots(paths: string[], roots: McpRoot[]): string[] {\n return paths.filter(path => !isPathWithinRoots(path, roots));\n}\n","export interface GcsStorageConfig {\n /**\n * Optional explicit GCP project id.\n * When set, this should take precedence over ambient environment values.\n */\n projectId?: string;\n\n /**\n * Legacy URI-based config (still supported for backwards compatibility).\n */\n inputUri?: string;\n outputUri?: string;\n contextUri?: string;\n\n /**\n * RiotPlan-style split config.\n */\n inputBucket?: string;\n inputPrefix?: string;\n outputBucket?: string;\n outputPrefix?: string;\n contextBucket?: string;\n contextPrefix?: string;\n\n credentialsFile?: string;\n}\n\nexport interface StorageConfig {\n backend: 'filesystem' | 'gcs';\n gcs?: GcsStorageConfig;\n}\n\nexport const DEFAULT_STORAGE_CONFIG: StorageConfig = {\n backend: 'filesystem',\n};\n","export interface ParsedGcsUri {\n bucket: string;\n prefix: string;\n}\n\nfunction normalizePrefix(value: string): string {\n return value.replace(/^\\/+/, '').replace(/\\/+/g, '/').replace(/\\/+$/, '');\n}\n\nexport function parseGcsUri(uri: string): ParsedGcsUri {\n if (typeof uri !== 'string' || uri.trim().length === 0) {\n throw new Error('GCS URI must be a non-empty string.');\n }\n\n const trimmed = uri.trim();\n if (!trimmed.startsWith('gs://')) {\n throw new Error(`Invalid GCS URI \"${uri}\": must start with \"gs://\".`);\n }\n\n const withoutScheme = trimmed.slice('gs://'.length);\n if (withoutScheme.length === 0) {\n throw new Error(`Invalid GCS URI \"${uri}\": missing bucket name.`);\n }\n\n const slashIndex = withoutScheme.indexOf('/');\n const bucket = (slashIndex === -1 ? withoutScheme : withoutScheme.slice(0, slashIndex)).trim();\n if (bucket.length === 0) {\n throw new Error(`Invalid GCS URI \"${uri}\": missing bucket name.`);\n }\n\n const rawPrefix = slashIndex === -1 ? '' : withoutScheme.slice(slashIndex + 1);\n const prefix = normalizePrefix(rawPrefix);\n\n return { bucket, prefix };\n}\n","import { Storage } from '@google-cloud/storage';\nimport Logging from '@fjell/logging';\nimport { parseGcsUri } from './gcsUri';\nimport type { FileStorageProvider, StorageFileMetadata } from './fileProviders';\n\nconst logger = Logging.getLogger('@redaksjon/protokoll-mcp').get('gcs-storage');\n\nfunction normalizePath(value: string): string {\n return value.replace(/^\\/+/, '').replace(/\\\\/g, '/');\n}\n\nfunction joinObjectPath(basePrefix: string, objectPath: string): string {\n const normalizedBase = basePrefix.replace(/^\\/+|\\/+$/g, '');\n const normalizedObjectPath = normalizePath(objectPath);\n if (!normalizedBase) {\n return normalizedObjectPath;\n }\n if (!normalizedObjectPath) {\n return normalizedBase;\n }\n return `${normalizedBase}/${normalizedObjectPath}`;\n}\n\nexport class GcsStorageProvider implements FileStorageProvider {\n readonly name = 'gcs' as const;\n readonly cacheKey: string;\n\n constructor(\n private readonly storage: Storage,\n private readonly bucketName: string,\n private readonly basePrefix: string,\n ) {\n this.cacheKey = `gcs:${this.bucketName}/${this.basePrefix.replace(/^\\/+|\\/+$/g, '')}`;\n }\n\n private objectPath(pathValue: string): string {\n return joinObjectPath(this.basePrefix, pathValue);\n }\n\n async readFile(pathValue: string): Promise<Buffer> {\n const startedAt = Date.now();\n const objectPath = this.objectPath(pathValue);\n logger.debug('gcs.read.start', {\n bucket: this.bucketName,\n basePrefix: this.basePrefix,\n path: pathValue,\n objectPath,\n });\n const [contents] = await this.storage.bucket(this.bucketName).file(objectPath).download();\n logger.info('gcs.read.complete', {\n bucket: this.bucketName,\n objectPath,\n bytes: contents.length,\n elapsedMs: Date.now() - startedAt,\n });\n return contents;\n }\n\n async writeFile(pathValue: string, data: Buffer | string): Promise<void> {\n const startedAt = Date.now();\n const objectPath = this.objectPath(pathValue);\n const bytes = typeof data === 'string' ? Buffer.byteLength(data) : data.length;\n logger.debug('gcs.write.start', {\n bucket: this.bucketName,\n basePrefix: this.basePrefix,\n path: pathValue,\n objectPath,\n bytes,\n });\n await this.storage.bucket(this.bucketName).file(objectPath).save(data);\n logger.info('gcs.write.complete', {\n bucket: this.bucketName,\n objectPath,\n bytes,\n elapsedMs: Date.now() - startedAt,\n });\n }\n\n async listFiles(prefix: string, pattern?: string): Promise<string[]> {\n const withMetadata = await this.listFilesWithMetadata(prefix, pattern);\n return withMetadata.map((entry) => entry.path);\n }\n\n async listFilesWithMetadata(prefix: string, pattern?: string): Promise<StorageFileMetadata[]> {\n const startedAt = Date.now();\n const fullPrefix = this.objectPath(prefix);\n logger.debug('gcs.list.start', {\n bucket: this.bucketName,\n basePrefix: this.basePrefix,\n prefix,\n fullPrefix,\n pattern: pattern ?? null,\n });\n const [files] = await this.storage.bucket(this.bucketName).getFiles({ prefix: fullPrefix });\n const normalizedBase = this.basePrefix.replace(/^\\/+|\\/+$/g, '');\n const relativeEntries = files\n .map((fileRef) => ({\n fileName: fileRef.name,\n metadata: fileRef.metadata || {},\n }))\n .filter(({ fileName }) => !fileName.endsWith('/'))\n .map(({ fileName, metadata }) => {\n if (!normalizedBase) {\n return {\n path: fileName,\n size: Number(metadata.size || 0),\n updatedAt: (metadata.updated as string | undefined) || null,\n etag: metadata.etag as string | undefined,\n generation: metadata.generation as string | undefined,\n } satisfies StorageFileMetadata;\n }\n const prefixWithSlash = `${normalizedBase}/`;\n if (fileName.startsWith(prefixWithSlash)) {\n return {\n path: fileName.slice(prefixWithSlash.length),\n size: Number(metadata.size || 0),\n updatedAt: (metadata.updated as string | undefined) || null,\n etag: metadata.etag as string | undefined,\n generation: metadata.generation as string | undefined,\n } satisfies StorageFileMetadata;\n }\n return {\n path: fileName,\n size: Number(metadata.size || 0),\n updatedAt: (metadata.updated as string | undefined) || null,\n etag: metadata.etag as string | undefined,\n generation: metadata.generation as string | undefined,\n } satisfies StorageFileMetadata;\n });\n if (!pattern) {\n logger.debug('gcs.list.complete', {\n bucket: this.bucketName,\n fullPrefix,\n matchedCount: relativeEntries.length,\n elapsedMs: Date.now() - startedAt,\n });\n return relativeEntries;\n }\n const filtered = relativeEntries.filter((entry) => entry.path.includes(pattern));\n logger.debug('gcs.list.complete', {\n bucket: this.bucketName,\n fullPrefix,\n pattern,\n matchedCount: filtered.length,\n elapsedMs: Date.now() - startedAt,\n });\n return filtered;\n }\n\n async deleteFile(pathValue: string): Promise<void> {\n const startedAt = Date.now();\n const objectPath = this.objectPath(pathValue);\n logger.debug('gcs.delete.start', {\n bucket: this.bucketName,\n basePrefix: this.basePrefix,\n path: pathValue,\n objectPath,\n });\n await this.storage.bucket(this.bucketName).file(objectPath).delete({ ignoreNotFound: true });\n logger.info('gcs.delete.complete', {\n bucket: this.bucketName,\n objectPath,\n elapsedMs: Date.now() - startedAt,\n });\n }\n\n async exists(pathValue: string): Promise<boolean> {\n const startedAt = Date.now();\n const objectPath = this.objectPath(pathValue);\n logger.debug('gcs.exists.start', {\n bucket: this.bucketName,\n basePrefix: this.basePrefix,\n path: pathValue,\n objectPath,\n });\n const [exists] = await this.storage.bucket(this.bucketName).file(objectPath).exists();\n logger.info('gcs.exists.complete', {\n bucket: this.bucketName,\n objectPath,\n exists,\n elapsedMs: Date.now() - startedAt,\n });\n return exists;\n }\n\n async mkdir(_pathValue: string): Promise<void> {\n // No-op: GCS uses object prefixes instead of directories.\n }\n\n async verifyBucketAccess(): Promise<void> {\n const startedAt = Date.now();\n logger.debug('gcs.verify_bucket_access.start', {\n bucket: this.bucketName,\n basePrefix: this.basePrefix,\n });\n await this.storage.bucket(this.bucketName).getMetadata();\n logger.info('gcs.verify_bucket_access.complete', {\n bucket: this.bucketName,\n elapsedMs: Date.now() - startedAt,\n });\n }\n}\n\nexport function createGcsStorageProvider(uri: string, credentialsFile?: string, projectId?: string): GcsStorageProvider {\n const startedAt = Date.now();\n const { bucket, prefix } = parseGcsUri(uri);\n logger.debug('gcs.provider.create.start', {\n uri,\n bucket,\n prefix,\n hasCredentialsFile: Boolean(credentialsFile),\n hasProjectId: Boolean(projectId),\n });\n const storage = credentialsFile\n ? new Storage({ keyFilename: credentialsFile, projectId })\n : new Storage({ projectId });\n logger.info('gcs.provider.create.complete', {\n bucket,\n prefix,\n hasCredentialsFile: Boolean(credentialsFile),\n hasProjectId: Boolean(projectId),\n elapsedMs: Date.now() - startedAt,\n });\n return new GcsStorageProvider(storage, bucket, prefix);\n}\n","import { mkdir, readdir, readFile, rm, stat, writeFile } from 'node:fs/promises';\nimport { dirname, isAbsolute, join, relative, resolve } from 'node:path';\n\nexport interface StorageFileMetadata {\n path: string;\n size: number;\n updatedAt: string | null;\n etag?: string;\n generation?: string;\n}\n\nexport interface FileStorageProvider {\n readonly name: 'filesystem' | 'gcs';\n readonly cacheKey?: string;\n readFile(path: string): Promise<Buffer>;\n writeFile(path: string, data: Buffer | string): Promise<void>;\n listFiles(prefix: string, pattern?: string): Promise<string[]>;\n listFilesWithMetadata(prefix: string, pattern?: string): Promise<StorageFileMetadata[]>;\n deleteFile(path: string): Promise<void>;\n exists(path: string): Promise<boolean>;\n mkdir(path: string): Promise<void>;\n}\n\nasync function walkFilesRecursive(directory: string): Promise<string[]> {\n const entries = await readdir(directory, { withFileTypes: true });\n const files: string[] = [];\n\n for (const entry of entries) {\n const absolutePath = join(directory, entry.name);\n if (entry.isDirectory()) {\n files.push(...await walkFilesRecursive(absolutePath));\n } else if (entry.isFile()) {\n files.push(absolutePath);\n }\n }\n\n return files;\n}\n\nexport class FilesystemStorageProvider implements FileStorageProvider {\n readonly name = 'filesystem' as const;\n readonly cacheKey: string;\n\n constructor(private readonly baseDirectory: string) {\n this.cacheKey = `fs:${resolve(baseDirectory)}`;\n }\n\n private resolvePath(pathValue: string): string {\n if (isAbsolute(pathValue)) {\n return pathValue;\n }\n return resolve(this.baseDirectory, pathValue);\n }\n\n private toRelativePath(pathValue: string): string {\n return relative(this.baseDirectory, pathValue);\n }\n\n async readFile(pathValue: string): Promise<Buffer> {\n return readFile(this.resolvePath(pathValue));\n }\n\n async writeFile(pathValue: string, data: Buffer | string): Promise<void> {\n const resolvedPath = this.resolvePath(pathValue);\n await mkdir(dirname(resolvedPath), { recursive: true });\n await writeFile(resolvedPath, data);\n }\n\n async listFiles(prefix: string, pattern?: string): Promise<string[]> {\n const withMetadata = await this.listFilesWithMetadata(prefix, pattern);\n return withMetadata.map((entry) => entry.path);\n }\n\n async listFilesWithMetadata(prefix: string, pattern?: string): Promise<StorageFileMetadata[]> {\n const prefixPath = this.resolvePath(prefix || '.');\n let allFiles: string[] = [];\n try {\n allFiles = await walkFilesRecursive(prefixPath);\n } catch (error) {\n const code = (error as NodeJS.ErrnoException).code;\n if (code === 'ENOENT') {\n return [];\n }\n throw error;\n }\n const entries = await Promise.all(\n allFiles.map(async (filePath) => {\n const fileStat = await stat(filePath);\n return {\n path: this.toRelativePath(filePath),\n size: fileStat.size,\n updatedAt: fileStat.mtime ? fileStat.mtime.toISOString() : null,\n } satisfies StorageFileMetadata;\n })\n );\n if (!pattern) {\n return entries;\n }\n return entries.filter((entry) => entry.path.includes(pattern));\n }\n\n async deleteFile(pathValue: string): Promise<void> {\n await rm(this.resolvePath(pathValue), { force: true });\n }\n\n async exists(pathValue: string): Promise<boolean> {\n try {\n await stat(this.resolvePath(pathValue));\n return true;\n } catch {\n return false;\n }\n }\n\n async mkdir(pathValue: string): Promise<void> {\n await mkdir(this.resolvePath(pathValue), { recursive: true });\n }\n}\n","/**\n * MCP Server Configuration\n * \n * Centralized configuration management for the MCP server.\n * Uses workspace roots to discover and load Protokoll configuration.\n * \n * This eliminates the need for each tool to navigate up the directory tree\n * to find configuration. Instead, configuration is loaded once at the\n * workspace level and shared across all tools.\n */\n\nimport * as Context from '@/context';\nimport type { ProtokollContextInstance } from '@/context';\nimport type { McpRoot } from './types';\nimport { fileUriToPath } from './roots';\nimport { resolve } from 'node:path';\nimport { access } from 'node:fs/promises';\nimport * as Cardigantime from '@utilarium/cardigantime';\nimport Logging from '@fjell/logging';\nimport { DEFAULT_STORAGE_CONFIG, type StorageConfig } from './storage/types';\nimport { createGcsStorageProvider } from './storage/gcsProvider';\nimport { FilesystemStorageProvider, type FileStorageProvider } from './storage/fileProviders';\nimport { parseGcsUri } from './storage/gcsUri';\n\nconst DEFAULT_CONFIG_FILE = 'protokoll-config.yaml';\nconst logger = Logging.getLogger('@redaksjon/protokoll-mcp').get('server-config');\nconst cardigantimeLogger = {\n debug: (message: string, ...args: unknown[]) => {\n logger.debug('config.discovery.debug', { message, args });\n },\n info: (message: string, ...args: unknown[]) => {\n logger.info('config.discovery.info', { message, args });\n },\n warn: (message: string, ...args: unknown[]) => {\n logger.warning('config.discovery.warn', { message, args });\n },\n error: (message: string, ...args: unknown[]) => {\n logger.error('config.discovery.error', { message, args });\n },\n verbose: (message: string, ...args: unknown[]) => {\n logger.debug('config.discovery.verbose', { message, args });\n },\n silly: () => {\n // intentionally suppressed\n },\n};\nconst cardigantime = Cardigantime.create({\n defaults: {\n configDirectory: '.',\n configFile: DEFAULT_CONFIG_FILE,\n isRequired: false,\n // Tell CardiganTime to resolve these path fields relative to the config file's directory\n // Note: contextDirectories must be in BOTH pathFields AND resolvePathArray - \n // pathFields determines which fields are processed, resolvePathArray determines\n // if array elements should be resolved individually\n pathResolution: {\n pathFields: ['inputDirectory', 'outputDirectory', 'processedDirectory', 'contextDirectories', 'storage.gcs.credentialsFile'],\n resolvePathArray: ['contextDirectories'],\n },\n },\n configShape: {},\n features: ['config', 'hierarchical'],\n logger: cardigantimeLogger,\n});\n\nasync function readConfigFromDirectory(directory: string): Promise<Record<string, unknown>> {\n const previousCwd = process.cwd();\n try {\n process.chdir(directory);\n const discoveredConfig = await cardigantime.read({});\n return mergeConfigWithEnv(discoveredConfig);\n } finally {\n process.chdir(previousCwd);\n }\n}\n\nfunction parseBooleanEnv(value: string | undefined): boolean | undefined {\n if (!value) return undefined;\n const normalized = value.trim().toLowerCase();\n if (normalized === 'true') return true;\n if (normalized === 'false') return false;\n return undefined;\n}\n\nfunction parseCsvEnv(value: string | undefined): string[] | undefined {\n if (!value) return undefined;\n const parsed = value\n .split(',')\n .map(part => part.trim())\n .filter(Boolean);\n return parsed.length > 0 ? parsed : undefined;\n}\n\nfunction readEnvString(name: string): string | undefined {\n return readString(process.env[name]);\n}\n\nfunction mergeNestedObjects(\n base: Record<string, unknown>,\n overrides: Record<string, unknown>,\n): Record<string, unknown> {\n const merged = { ...base };\n for (const [key, value] of Object.entries(overrides)) {\n if (value === undefined) continue;\n const existing = merged[key];\n if (isObjectRecord(existing) && isObjectRecord(value)) {\n merged[key] = mergeNestedObjects(existing, value);\n continue;\n }\n merged[key] = value;\n }\n return merged;\n}\n\nfunction buildEnvStorageConfig(): Record<string, unknown> | undefined {\n const configuredBackend = readEnvString('PROTOKOLL_STORAGE_BACKEND');\n const gcs = {\n projectId: readEnvString('PROTOKOLL_STORAGE_GCS_PROJECT_ID'),\n inputUri: readEnvString('PROTOKOLL_STORAGE_GCS_INPUT_URI'),\n outputUri: readEnvString('PROTOKOLL_STORAGE_GCS_OUTPUT_URI'),\n contextUri: readEnvString('PROTOKOLL_STORAGE_GCS_CONTEXT_URI'),\n inputBucket: readEnvString('PROTOKOLL_STORAGE_GCS_INPUT_BUCKET'),\n inputPrefix: readEnvString('PROTOKOLL_STORAGE_GCS_INPUT_PREFIX'),\n outputBucket: readEnvString('PROTOKOLL_STORAGE_GCS_OUTPUT_BUCKET'),\n outputPrefix: readEnvString('PROTOKOLL_STORAGE_GCS_OUTPUT_PREFIX'),\n contextBucket: readEnvString('PROTOKOLL_STORAGE_GCS_CONTEXT_BUCKET'),\n contextPrefix: readEnvString('PROTOKOLL_STORAGE_GCS_CONTEXT_PREFIX'),\n credentialsFile: readEnvString('PROTOKOLL_STORAGE_GCS_CREDENTIALS_FILE'),\n };\n const hasGcsValue = Object.values(gcs).some(value => value !== undefined);\n const backend = configuredBackend ?? (hasGcsValue ? 'gcs' : undefined);\n if (!backend) return undefined;\n\n const storage: Record<string, unknown> = {};\n if (backend) storage.backend = backend;\n if (hasGcsValue) storage.gcs = gcs;\n return storage;\n}\n\nfunction mergeConfigWithEnv(config: Record<string, unknown>): Record<string, unknown> {\n const envOverrides: Record<string, unknown> = {\n inputDirectory: readEnvString('PROTOKOLL_INPUT_DIRECTORY'),\n outputDirectory: readEnvString('PROTOKOLL_OUTPUT_DIRECTORY'),\n processedDirectory: readEnvString('PROTOKOLL_PROCESSED_DIRECTORY'),\n contextDirectories: parseCsvEnv(process.env.PROTOKOLL_CONTEXT_DIRECTORIES),\n model: readEnvString('PROTOKOLL_MODEL'),\n classifyModel: readEnvString('PROTOKOLL_CLASSIFY_MODEL'),\n composeModel: readEnvString('PROTOKOLL_COMPOSE_MODEL'),\n transcriptionModel: readEnvString('PROTOKOLL_TRANSCRIPTION_MODEL'),\n debug: parseBooleanEnv(process.env.PROTOKOLL_DEBUG),\n verbose: parseBooleanEnv(process.env.PROTOKOLL_VERBOSE),\n storage: buildEnvStorageConfig(),\n };\n return mergeNestedObjects(config, envOverrides);\n}\n\n// ============================================================================\n// Server Configuration State\n// ============================================================================\n\n/**\n * Server mode:\n * - \"remote\": Server is pre-configured with workspace directories (HTTP server).\n * Tools should NOT accept directory parameters - they're already set.\n * - \"local\": Server runs in local mode (stdio). Tools accept directory parameters\n * and perform their own discovery.\n */\nexport type ServerMode = 'remote' | 'local';\n\ninterface ServerConfig {\n mode: ServerMode;\n context: ProtokollContextInstance | null;\n workspaceRoot: string | null;\n inputDirectory: string | null;\n outputDirectory: string | null;\n processedDirectory: string | null;\n inputStorage: FileStorageProvider | null;\n outputStorage: FileStorageProvider | null;\n storageConfig: StorageConfig;\n configFilePath: string | null;\n configFile: Record<string, unknown> | null;\n initialized: boolean;\n}\n\nlet serverConfig: ServerConfig = {\n mode: 'local',\n context: null,\n workspaceRoot: null,\n inputDirectory: null,\n outputDirectory: null,\n processedDirectory: null,\n inputStorage: null,\n outputStorage: null,\n storageConfig: DEFAULT_STORAGE_CONFIG,\n configFilePath: null,\n configFile: null,\n initialized: false,\n};\n\nfunction isObjectRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null;\n}\n\nfunction readString(value: unknown): string | undefined {\n return typeof value === 'string' && value.trim().length > 0 ? value.trim() : undefined;\n}\n\nfunction buildGcsUri(bucket: string, prefix?: string): string {\n const trimmedBucket = bucket.trim();\n const normalizedPrefix = (prefix ?? '')\n .replace(/^\\/+/, '')\n .replace(/\\/+/g, '/')\n .replace(/\\/+$/, '');\n if (!normalizedPrefix) {\n return `gs://${trimmedBucket}`;\n }\n return `gs://${trimmedBucket}/${normalizedPrefix}`;\n}\n\nfunction resolveGcsUri(rawUri: string | undefined, bucket: string | undefined, prefix: string | undefined): string {\n if (bucket) {\n return buildGcsUri(bucket, prefix);\n }\n return rawUri ?? '';\n}\n\nfunction resolveGcsUris(gcs: NonNullable<StorageConfig['gcs']>): {\n inputUri: string;\n outputUri: string;\n contextUri: string;\n} {\n return {\n inputUri: resolveGcsUri(gcs.inputUri, gcs.inputBucket, gcs.inputPrefix),\n outputUri: resolveGcsUri(gcs.outputUri, gcs.outputBucket, gcs.outputPrefix),\n contextUri: resolveGcsUri(gcs.contextUri, gcs.contextBucket, gcs.contextPrefix),\n };\n}\n\nfunction parseStorageConfig(configFile: Record<string, unknown> | null): StorageConfig {\n if (!configFile) {\n return DEFAULT_STORAGE_CONFIG;\n }\n\n const rawStorage = configFile.storage;\n if (!isObjectRecord(rawStorage)) {\n return DEFAULT_STORAGE_CONFIG;\n }\n\n const backend = rawStorage.backend === 'gcs' ? 'gcs' : 'filesystem';\n if (backend !== 'gcs') {\n return DEFAULT_STORAGE_CONFIG;\n }\n\n const rawGcs = isObjectRecord(rawStorage.gcs) ? rawStorage.gcs : {};\n const projectId = readString(rawGcs.projectId);\n const inputUri = readString(rawGcs.inputUri);\n const outputUri = readString(rawGcs.outputUri);\n const contextUri = readString(rawGcs.contextUri);\n const inputBucket = readString(rawGcs.inputBucket);\n const inputPrefix = readString(rawGcs.inputPrefix);\n const outputBucket = readString(rawGcs.outputBucket);\n const outputPrefix = readString(rawGcs.outputPrefix);\n const contextBucket = readString(rawGcs.contextBucket);\n const contextPrefix = readString(rawGcs.contextPrefix);\n const credentialsFile = readString(rawGcs.credentialsFile);\n\n return {\n backend: 'gcs',\n gcs: {\n projectId,\n inputUri,\n outputUri,\n contextUri,\n inputBucket,\n inputPrefix,\n outputBucket,\n outputPrefix,\n contextBucket,\n contextPrefix,\n credentialsFile,\n },\n };\n}\n\nfunction resolveCredentialsFilePath(\n credentialsFile: string | undefined,\n configDir: string,\n): string | undefined {\n if (!credentialsFile || credentialsFile.trim().length === 0) {\n return undefined;\n }\n return resolve(configDir, credentialsFile);\n}\n\nasync function validateGcsStorageConfig(storageConfig: StorageConfig, configDir: string): Promise<string | undefined> {\n if (storageConfig.backend !== 'gcs') {\n return undefined;\n }\n\n if (!storageConfig.gcs) {\n throw new Error('storage.backend is set to gcs, but storage.gcs is missing.');\n }\n\n const startedAt = Date.now();\n const { inputUri, outputUri, contextUri } = resolveGcsUris(storageConfig.gcs);\n logger.debug('storage.gcs.validate.start', {\n configDir,\n inputUri,\n outputUri,\n contextUri,\n projectId: storageConfig.gcs.projectId ?? null,\n hasCredentialsFile: Boolean(storageConfig.gcs.credentialsFile),\n });\n if (!inputUri || !outputUri || !contextUri) {\n throw new Error(\n 'GCS config is incomplete. Provide either storage.gcs.{inputUri,outputUri,contextUri} or storage.gcs.{inputBucket,inputPrefix,outputBucket,outputPrefix,contextBucket,contextPrefix}.'\n );\n }\n\n parseGcsUri(inputUri);\n parseGcsUri(outputUri);\n parseGcsUri(contextUri);\n\n const credentialsFile = resolveCredentialsFilePath(storageConfig.gcs.credentialsFile, configDir);\n if (credentialsFile) {\n try {\n await access(credentialsFile);\n } catch {\n throw new Error(`GCS credentials file is not readable: ${credentialsFile}`);\n }\n }\n\n logger.info('storage.gcs.validate.complete', {\n inputUri,\n outputUri,\n contextUri,\n projectId: storageConfig.gcs.projectId ?? null,\n credentialsFile: credentialsFile ?? null,\n elapsedMs: Date.now() - startedAt,\n });\n\n return credentialsFile;\n}\n\nasync function createStorageProviders(\n storageConfig: StorageConfig,\n inputDirectory: string,\n outputDirectory: string,\n configDir: string,\n): Promise<{ inputStorage: FileStorageProvider; outputStorage: FileStorageProvider }> {\n if (storageConfig.backend === 'filesystem') {\n return {\n inputStorage: new FilesystemStorageProvider(inputDirectory),\n outputStorage: new FilesystemStorageProvider(outputDirectory),\n };\n }\n\n if (!storageConfig.gcs) {\n throw new Error('storage.backend is set to gcs, but storage.gcs is missing.');\n }\n\n const startedAt = Date.now();\n const { inputUri, outputUri } = resolveGcsUris(storageConfig.gcs);\n logger.debug('storage.providers.gcs.start', {\n inputUri,\n outputUri,\n projectId: storageConfig.gcs.projectId ?? null,\n });\n const credentialsFile = await validateGcsStorageConfig(storageConfig, configDir);\n const inputStorage = createGcsStorageProvider(inputUri, credentialsFile, storageConfig.gcs.projectId);\n const outputStorage = createGcsStorageProvider(outputUri, credentialsFile, storageConfig.gcs.projectId);\n await inputStorage.verifyBucketAccess();\n await outputStorage.verifyBucketAccess();\n logger.info('storage.providers.gcs.complete', {\n inputUri,\n outputUri,\n projectId: storageConfig.gcs.projectId ?? null,\n elapsedMs: Date.now() - startedAt,\n });\n\n return {\n inputStorage,\n outputStorage,\n };\n}\n\n// ============================================================================\n// Initialization\n// ============================================================================\n\n/**\n * Initialize server configuration from workspace roots\n * Should be called once when the server starts or when roots change\n * \n * @param roots - Workspace roots (for remote mode)\n * @param mode - Server mode: 'remote' (pre-configured) or 'local' (dynamic discovery)\n */\nexport async function initializeServerConfig(roots: McpRoot[], mode: ServerMode = 'local'): Promise<void> {\n // Find the first workspace root\n const workspaceRoot = roots.length > 0 ? fileUriToPath(roots[0].uri) : null;\n \n if (!workspaceRoot) {\n // No workspace root available - use cwd as fallback\n serverConfig = {\n mode,\n context: null,\n workspaceRoot: process.cwd(),\n inputDirectory: resolve(process.cwd(), './recordings'),\n outputDirectory: resolve(process.cwd(), './notes'),\n processedDirectory: resolve(process.cwd(), './processed'),\n inputStorage: new FilesystemStorageProvider(resolve(process.cwd(), './recordings')),\n outputStorage: new FilesystemStorageProvider(resolve(process.cwd(), './notes')),\n storageConfig: DEFAULT_STORAGE_CONFIG,\n configFilePath: null,\n configFile: null,\n initialized: true,\n };\n return;\n }\n\n try {\n // CardiganTime resolves path fields (inputDirectory, outputDirectory, etc.)\n // relative to the config file's directory automatically via pathResolution config\n const configFile = await readConfigFromDirectory(workspaceRoot);\n const resolvedConfigDirs = (configFile as any).resolvedConfigDirs as unknown;\n const configFilePath = Array.isArray(resolvedConfigDirs) && resolvedConfigDirs.length > 0\n ? resolve(resolvedConfigDirs[0], DEFAULT_CONFIG_FILE)\n : null;\n \n // For defaults (when no config value), use config directory if available\n const configDir = Array.isArray(resolvedConfigDirs) && resolvedConfigDirs.length > 0\n ? resolvedConfigDirs[0]\n : workspaceRoot;\n\n // contextDirectories are resolved by CardiganTime via resolvePathArray config\n const resolvedContextDirs = configFile.contextDirectories as string[] | undefined;\n const contextCreateOptions: Context.CreateOptions = {\n startingDir: workspaceRoot,\n contextDirectories: resolvedContextDirs,\n };\n\n const storageConfig = parseStorageConfig(configFile as Record<string, unknown>);\n const credentialsFile = await validateGcsStorageConfig(storageConfig, configDir);\n if (storageConfig.backend === 'gcs' && storageConfig.gcs) {\n if (storageConfig.gcs.projectId) {\n process.env.GOOGLE_CLOUD_PROJECT = storageConfig.gcs.projectId;\n }\n const { contextUri } = resolveGcsUris(storageConfig.gcs);\n const parsedContextUri = parseGcsUri(contextUri);\n contextCreateOptions.gcs = {\n bucketName: parsedContextUri.bucket,\n basePath: parsedContextUri.prefix,\n credentialsFile,\n };\n delete contextCreateOptions.contextDirectories;\n }\n\n // Load context from workspace root, using explicit contextDirectories if provided\n const context = await Context.create(contextCreateOptions);\n\n const contextConfig = context.getConfig();\n const mergedConfig = {\n ...contextConfig,\n ...configFile,\n } as Record<string, unknown>;\n const inputDirectory = (mergedConfig.inputDirectory as string) || resolve(configDir, './recordings');\n const outputDirectory = (mergedConfig.outputDirectory as string) || resolve(configDir, './notes');\n const { inputStorage, outputStorage } = await createStorageProviders(storageConfig, inputDirectory, outputDirectory, configDir);\n \n serverConfig = {\n mode,\n context,\n workspaceRoot,\n // CardiganTime already resolved these paths; just provide defaults if not set\n inputDirectory,\n outputDirectory,\n processedDirectory: (mergedConfig.processedDirectory as string) || resolve(configDir, './processed'),\n inputStorage,\n outputStorage,\n storageConfig,\n configFilePath,\n configFile: configFile ?? null,\n initialized: true,\n };\n } catch {\n // Context not available - use defaults relative to workspace\n const configFile = await readConfigFromDirectory(workspaceRoot);\n const resolvedConfigDirs = (configFile as any).resolvedConfigDirs as unknown;\n const configFilePath = Array.isArray(resolvedConfigDirs) && resolvedConfigDirs.length > 0\n ? resolve(resolvedConfigDirs[0], DEFAULT_CONFIG_FILE)\n : null;\n \n // For defaults (when no config value), use config directory if available\n const configDir = Array.isArray(resolvedConfigDirs) && resolvedConfigDirs.length > 0\n ? resolvedConfigDirs[0]\n : workspaceRoot;\n \n const mergedConfig = (configFile ?? {}) as Record<string, unknown>;\n const storageConfig = parseStorageConfig(configFile as Record<string, unknown>);\n const inputDirectory = (mergedConfig.inputDirectory as string) || resolve(configDir, './recordings');\n const outputDirectory = (mergedConfig.outputDirectory as string) || resolve(configDir, './notes');\n const { inputStorage, outputStorage } = await createStorageProviders(storageConfig, inputDirectory, outputDirectory, configDir);\n\n serverConfig = {\n mode,\n context: null,\n workspaceRoot,\n // CardiganTime already resolved these paths; just provide defaults if not set\n inputDirectory,\n outputDirectory,\n processedDirectory: (mergedConfig.processedDirectory as string) || resolve(configDir, './processed'),\n inputStorage,\n outputStorage,\n storageConfig,\n configFilePath,\n configFile: configFile ?? null,\n initialized: true,\n };\n }\n}\n\n/**\n * Reload server configuration (call when roots change)\n */\nexport async function reloadServerConfig(roots: McpRoot[], mode: ServerMode = 'local'): Promise<void> {\n await initializeServerConfig(roots, mode);\n}\n\n/**\n * Clear server configuration\n */\nexport function clearServerConfig(): void {\n serverConfig = {\n mode: 'local',\n context: null,\n workspaceRoot: null,\n inputDirectory: null,\n outputDirectory: null,\n processedDirectory: null,\n inputStorage: null,\n outputStorage: null,\n storageConfig: DEFAULT_STORAGE_CONFIG,\n configFilePath: null,\n configFile: null,\n initialized: false,\n };\n}\n\n// ============================================================================\n// Accessors\n// ============================================================================\n\n/**\n * Get the server configuration\n * Throws if not initialized\n */\nexport function getServerConfig(): {\n mode: ServerMode;\n context: ProtokollContextInstance | null;\n workspaceRoot: string;\n inputDirectory: string;\n outputDirectory: string;\n processedDirectory: string | null;\n storageConfig: StorageConfig;\n configFilePath: string | null;\n configFile: Record<string, unknown> | null;\n initialized: boolean;\n } {\n if (!serverConfig.initialized) {\n throw new Error('Server configuration not initialized. Call initializeServerConfig() first.');\n }\n \n return {\n mode: serverConfig.mode,\n context: serverConfig.context,\n workspaceRoot: serverConfig.workspaceRoot!,\n inputDirectory: serverConfig.inputDirectory!,\n outputDirectory: serverConfig.outputDirectory!,\n processedDirectory: serverConfig.processedDirectory,\n storageConfig: serverConfig.storageConfig,\n configFilePath: serverConfig.configFilePath,\n configFile: serverConfig.configFile,\n initialized: serverConfig.initialized,\n };\n}\n\n/**\n * Get the context instance\n */\nexport function getContext(): ProtokollContextInstance | null {\n return serverConfig.context;\n}\n\n/**\n * Get the workspace root\n */\nexport function getWorkspaceRoot(): string | null {\n return serverConfig.workspaceRoot;\n}\n\n/**\n * Get the input directory (for audio files)\n * Always returns a string, never null\n */\nexport function getInputDirectory(): string {\n if (!serverConfig.initialized || !serverConfig.inputDirectory) {\n return resolve(process.cwd(), './recordings');\n }\n return serverConfig.inputDirectory!;\n}\n\n/**\n * Get the output directory (for transcripts)\n * Always returns a string, never null\n */\nexport function getOutputDirectory(): string {\n if (!serverConfig.initialized || !serverConfig.outputDirectory) {\n return resolve(process.cwd(), './notes');\n }\n return serverConfig.outputDirectory!;\n}\n\n/**\n * Get the processed directory (for processed audio)\n * Returns null if not configured\n */\nexport function getProcessedDirectory(): string | null {\n if (!serverConfig.initialized) {\n return null;\n }\n return serverConfig.processedDirectory;\n}\n\n/**\n * Get the normalized storage config.\n * Defaults to filesystem mode when storage config is not present.\n */\nexport function getStorageConfig(): StorageConfig {\n return serverConfig.storageConfig;\n}\n\n/**\n * Get the input storage provider.\n * Defaults to filesystem storage rooted at ./recordings if uninitialized.\n */\nexport function getInputStorage(): FileStorageProvider {\n if (!serverConfig.initialized || !serverConfig.inputStorage) {\n return new FilesystemStorageProvider(resolve(process.cwd(), './recordings'));\n }\n return serverConfig.inputStorage;\n}\n\n/**\n * Get the output storage provider.\n * Defaults to filesystem storage rooted at ./notes if uninitialized.\n */\nexport function getOutputStorage(): FileStorageProvider {\n if (!serverConfig.initialized || !serverConfig.outputStorage) {\n return new FilesystemStorageProvider(resolve(process.cwd(), './notes'));\n }\n return serverConfig.outputStorage;\n}\n\n/**\n * Check if server configuration is initialized\n */\nexport function isInitialized(): boolean {\n return serverConfig.initialized;\n}\n\n/**\n * Get the server mode\n * Returns 'local' if not initialized\n */\nexport function getServerMode(): ServerMode {\n return serverConfig.mode;\n}\n\n/**\n * Check if server is running in remote mode (pre-configured workspace)\n */\nexport function isRemoteMode(): boolean {\n return serverConfig.mode === 'remote';\n}\n\n","/**\n * Resource Definitions\n * \n * Defines all resource templates and direct resources for the MCP server.\n */\n\nimport type { McpResource, McpResourceTemplate } from '../types';\n\n/**\n * Direct resources that can be listed\n * These are populated dynamically based on context\n */\nexport const directResources: McpResource[] = [\n // Will be populated dynamically based on context\n];\n\n/**\n * Resource templates for parameterized access\n */\nexport const resourceTemplates: McpResourceTemplate[] = [\n {\n uriTemplate: 'protokoll://transcript/{path}',\n name: 'Transcript',\n description: 'A processed transcript file',\n mimeType: 'text/markdown',\n },\n {\n uriTemplate: 'protokoll://entity/{type}/{id}',\n name: 'Context Entity',\n description: 'A context entity (person, project, term, company)',\n mimeType: 'application/yaml',\n },\n {\n uriTemplate: 'protokoll://config',\n name: 'Configuration',\n description: 'Protokoll configuration for a directory',\n mimeType: 'application/json',\n },\n {\n uriTemplate: 'protokoll://transcripts?directory={directory}&projectId={projectId}&limit={limit}&offset={offset}',\n name: 'Transcripts List',\n description: 'List of transcripts in a directory. Filter by projectId (UUID) to show only transcripts for that project.',\n mimeType: 'application/json',\n },\n {\n uriTemplate: 'protokoll://entities/{type}',\n name: 'Entities List',\n description: 'List of entities of a given type',\n mimeType: 'application/json',\n },\n {\n uriTemplate: 'protokoll://audio/inbound?directory={directory}',\n name: 'Inbound Audio Files',\n description: 'List of audio files waiting to be processed',\n mimeType: 'application/json',\n },\n {\n uriTemplate: 'protokoll://audio/processed?directory={directory}',\n name: 'Processed Audio Files',\n description: 'List of audio files that have been processed',\n mimeType: 'application/json',\n },\n];\n","/**\n * Resource Discovery\n * \n * Dynamically discovers available resources based on context.\n */\n\nimport type { McpResource } from '../types';\nimport { \n buildConfigUri, \n buildAudioInboundUri, \n buildAudioProcessedUri,\n buildEntitiesListUri,\n buildTranscriptsListUri,\n} from '../uri';\nimport * as Context from '@/context';\nimport * as ServerConfig from '../serverConfig';\nimport { isAbsolute, resolve } from 'node:path';\n\nfunction isServerConfigInitialized(): boolean {\n try {\n return typeof (ServerConfig as any).isInitialized === 'function' &&\n (ServerConfig as any).isInitialized();\n } catch {\n return false;\n }\n}\n\nfunction getServerContext() {\n try {\n return typeof (ServerConfig as any).getContext === 'function'\n ? (ServerConfig as any).getContext()\n : null;\n } catch {\n return null;\n }\n}\n\nfunction getServerConfigFile(): { contextDirectories?: string[] } | null {\n try {\n return typeof (ServerConfig as any).getServerConfig === 'function'\n ? ((ServerConfig as any).getServerConfig().configFile as { contextDirectories?: string[] } | null)\n : null;\n } catch {\n return null;\n }\n}\n\nfunction getWorkspaceRoot(): string | null {\n try {\n return typeof (ServerConfig as any).getWorkspaceRoot === 'function'\n ? (ServerConfig as any).getWorkspaceRoot()\n : null;\n } catch {\n return null;\n }\n}\n\n/**\n * Get dynamic resources based on current context\n */\nexport async function getDynamicResources(contextDirectory?: string): Promise<McpResource[]> {\n const resources: McpResource[] = [];\n \n try {\n let context;\n const serverConfigReady = isServerConfigInitialized();\n if (serverConfigReady) {\n const serverContext = getServerContext();\n if (serverContext?.hasContext()) {\n context = serverContext;\n } else {\n const configFile = getServerConfigFile();\n const rawDirs = configFile?.contextDirectories;\n const workspaceRoot = getWorkspaceRoot();\n const effectiveDir = contextDirectory || workspaceRoot || process.cwd();\n const contextDirs = rawDirs && rawDirs.length > 0\n ? rawDirs.map(d => (isAbsolute(d) ? d : resolve(effectiveDir, d)))\n : undefined;\n context = await Context.create({\n startingDir: effectiveDir,\n contextDirectories: contextDirs,\n });\n }\n } else {\n context = await Context.create({\n startingDir: contextDirectory || process.cwd(),\n });\n }\n\n if (!context.hasContext()) {\n return resources;\n }\n\n const config = context.getConfig();\n const dirs = context.getDiscoveredDirs();\n const configPath = dirs[0]?.path;\n\n // Add config resource\n if (configPath) {\n resources.push({\n uri: buildConfigUri(configPath),\n name: 'Current Configuration',\n description: `Protokoll configuration at ${configPath}`,\n mimeType: 'application/json',\n });\n }\n\n // Add inbound audio resource\n const inputDirectory = (config.inputDirectory as string) || './recordings';\n resources.push({\n uri: buildAudioInboundUri(inputDirectory),\n name: 'Inbound Audio Files',\n description: `Audio files waiting to be processed in ${inputDirectory}`,\n mimeType: 'application/json',\n });\n\n // Add processed audio resource\n const processedDirectory = (config.processedDirectory as string);\n if (processedDirectory) {\n resources.push({\n uri: buildAudioProcessedUri(processedDirectory),\n name: 'Processed Audio Files',\n description: `Audio files that have been processed in ${processedDirectory}`,\n mimeType: 'application/json',\n });\n }\n\n // Add entity list resources\n const entityCounts = {\n projects: context.getAllProjects().length,\n people: context.getAllPeople().length,\n terms: context.getAllTerms().length,\n companies: context.getAllCompanies().length,\n };\n\n if (entityCounts.projects > 0) {\n resources.push({\n uri: buildEntitiesListUri('project'),\n name: 'All Projects',\n description: `${entityCounts.projects} project(s) in context`,\n mimeType: 'application/json',\n });\n }\n\n if (entityCounts.people > 0) {\n resources.push({\n uri: buildEntitiesListUri('person'),\n name: 'All People',\n description: `${entityCounts.people} person/people in context`,\n mimeType: 'application/json',\n });\n }\n\n if (entityCounts.terms > 0) {\n resources.push({\n uri: buildEntitiesListUri('term'),\n name: 'All Terms',\n description: `${entityCounts.terms} term(s) in context`,\n mimeType: 'application/json',\n });\n }\n\n if (entityCounts.companies > 0) {\n resources.push({\n uri: buildEntitiesListUri('company'),\n name: 'All Companies',\n description: `${entityCounts.companies} company/companies in context`,\n mimeType: 'application/json',\n });\n }\n\n // Add output directory transcript list\n const outputDirectory = (config.outputDirectory as string) || '~/notes';\n resources.push({\n uri: buildTranscriptsListUri({ directory: outputDirectory, limit: 10 }),\n name: 'Recent Transcripts',\n description: `10 most recent transcripts in ${outputDirectory}`,\n mimeType: 'application/json',\n });\n\n } catch {\n // Context not available, return empty\n }\n\n return resources;\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; ","import Logging from '@fjell/logging';\nimport * as yaml from 'js-yaml';\nimport { createGcsStorageProvider } from '../storage/gcsProvider';\nimport type { StorageFileMetadata } from '../storage/fileProviders';\nimport * as ServerConfig from '../serverConfig';\n\nconst logger = Logging.getLogger('@redaksjon/protokoll-mcp').get('entity-index');\nconst INDEX_SCHEMA_VERSION = 1;\nconst INDEX_PATH = '.protokoll/entities-index-v1.json';\n\nexport type IndexedEntityType = 'person' | 'project' | 'term' | 'company' | 'ignored';\n\nconst ENTITY_DIRECTORY: Record<IndexedEntityType, string> = {\n person: 'people',\n project: 'projects',\n term: 'terms',\n company: 'companies',\n ignored: 'ignored',\n};\n\ninterface ContextGcsConfig {\n uri: string;\n projectId?: string;\n credentialsFile?: string;\n}\n\ninterface EntityIndexEntry {\n entityType: IndexedEntityType;\n path: string;\n id: string;\n name: string;\n slug?: string;\n payload: Record<string, unknown>;\n sourceGeneration?: string;\n sourceUpdatedAt: string | null;\n sourceSize: number;\n sourceEtag?: string;\n hydratedAt: string;\n}\n\ninterface PersistedEntityIndex {\n version: number;\n builtAt: string;\n byType: Record<IndexedEntityType, Record<string, EntityIndexEntry>>;\n}\n\nfunction normalizePath(pathValue: string): string {\n return pathValue.replace(/^\\/+/, '').replace(/\\\\/g, '/');\n}\n\nfunction metadataVersionKey(metadata: StorageFileMetadata): string {\n return [\n metadata.generation || '',\n metadata.updatedAt || '',\n String(metadata.size || 0),\n metadata.etag || '',\n ].join('|');\n}\n\nfunction isYamlPath(pathValue: string): boolean {\n const normalized = normalizePath(pathValue).toLowerCase();\n return normalized.endsWith('.yaml') || normalized.endsWith('.yml');\n}\n\nasync function listFilesWithMetadataCompat(\n provider: { listFiles: (prefix: string, pattern?: string) => Promise<string[]>; listFilesWithMetadata?: (prefix: string, pattern?: string) => Promise<StorageFileMetadata[]>; },\n prefix: string,\n pattern?: string,\n): Promise<StorageFileMetadata[]> {\n if (typeof provider.listFilesWithMetadata === 'function') {\n return provider.listFilesWithMetadata(prefix, pattern);\n }\n const listed = await provider.listFiles(prefix, pattern);\n return listed.map((pathValue) => ({\n path: pathValue,\n size: 1,\n updatedAt: null,\n }));\n}\n\nfunction getContextGcsConfig(): ContextGcsConfig | null {\n let storageConfig: ReturnType<typeof ServerConfig.getStorageConfig>;\n try {\n storageConfig = ServerConfig.getStorageConfig();\n } catch {\n return null;\n }\n if (storageConfig.backend !== 'gcs' || !storageConfig.gcs) {\n return null;\n }\n\n const gcs = storageConfig.gcs;\n const contextUri = gcs.contextUri\n || (gcs.contextBucket\n ? `gs://${gcs.contextBucket}/${(gcs.contextPrefix || '').replace(/^\\/+|\\/+$/g, '')}`\n : undefined);\n if (!contextUri) {\n return null;\n }\n return {\n uri: contextUri,\n projectId: gcs.projectId,\n credentialsFile: gcs.credentialsFile,\n };\n}\n\nclass EntityIndexService {\n private readonly byType = new Map<IndexedEntityType, Map<string, EntityIndexEntry>>();\n private readonly dirtyTypes = new Set<IndexedEntityType>();\n private sidecarLoaded = false;\n private persistInFlight = false;\n private persistRequested = false;\n private lastRefreshAtByType = new Map<IndexedEntityType, number>();\n private readonly refreshTtlMs = 5_000;\n\n constructor(private readonly contextGcs: ContextGcsConfig) {\n this.byType.set('person', new Map());\n this.byType.set('project', new Map());\n this.byType.set('term', new Map());\n this.byType.set('company', new Map());\n this.byType.set('ignored', new Map());\n }\n\n markDirty(entityType?: IndexedEntityType): void {\n if (entityType) {\n this.dirtyTypes.add(entityType);\n return;\n }\n this.dirtyTypes.add('person');\n this.dirtyTypes.add('project');\n this.dirtyTypes.add('term');\n this.dirtyTypes.add('company');\n this.dirtyTypes.add('ignored');\n }\n\n async list(entityType: IndexedEntityType): Promise<Array<Record<string, unknown>>> {\n await this.refreshTypeIfNeeded(entityType);\n const entries = this.byType.get(entityType) || new Map();\n return Array.from(entries.values()).map((entry) => entry.payload);\n }\n\n async find(entityType: IndexedEntityType, entityId: string): Promise<Record<string, unknown> | null> {\n await this.refreshTypeIfNeeded(entityType);\n const normalized = entityId.trim().toLowerCase();\n const prefix = normalized.match(/^([a-f0-9]{8})/)?.[1];\n const entries = this.byType.get(entityType) || new Map();\n\n for (const entry of entries.values()) {\n const idLower = entry.id.toLowerCase();\n const slugLower = (entry.slug || '').toLowerCase();\n if (idLower === normalized || slugLower === normalized) {\n return entry.payload;\n }\n if (normalized && (idLower.startsWith(normalized) || normalized.startsWith(idLower))) {\n return entry.payload;\n }\n if (prefix && idLower.startsWith(prefix)) {\n return entry.payload;\n }\n }\n return null;\n }\n\n private async refreshTypeIfNeeded(entityType: IndexedEntityType): Promise<void> {\n if (!this.sidecarLoaded) {\n await this.loadSidecar();\n }\n\n const now = Date.now();\n const needsRefresh = this.dirtyTypes.has(entityType)\n || (this.byType.get(entityType)?.size || 0) === 0\n || now - (this.lastRefreshAtByType.get(entityType) || 0) > this.refreshTtlMs;\n if (!needsRefresh) {\n return;\n }\n\n const startedAt = Date.now();\n const provider = createGcsStorageProvider(\n this.contextGcs.uri,\n this.contextGcs.credentialsFile,\n this.contextGcs.projectId,\n );\n const directory = ENTITY_DIRECTORY[entityType];\n const listed = await listFilesWithMetadataCompat(provider as any, `${directory}/`);\n const yamlEntries = listed\n .map((metadata) => ({ ...metadata, path: normalizePath(metadata.path) }))\n .filter((metadata) => isYamlPath(metadata.path));\n const byPath = new Map(yamlEntries.map((metadata) => [metadata.path, metadata]));\n const existing = this.byType.get(entityType) || new Map<string, EntityIndexEntry>();\n let changedCount = 0;\n let cacheHitCount = 0;\n let removedCount = 0;\n let hydrateSuccess = 0;\n let hydrateFailed = 0;\n\n for (const [pathValue] of existing.entries()) {\n if (!byPath.has(pathValue)) {\n existing.delete(pathValue);\n removedCount++;\n }\n }\n\n for (const metadata of yamlEntries) {\n const cached = existing.get(metadata.path);\n const sameVersion = cached\n ? [\n cached.sourceGeneration || '',\n cached.sourceUpdatedAt || '',\n String(cached.sourceSize || 0),\n cached.sourceEtag || '',\n ].join('|') === metadataVersionKey(metadata)\n : false;\n\n if (sameVersion && !this.dirtyTypes.has(entityType)) {\n cacheHitCount++;\n continue;\n }\n\n changedCount++;\n try {\n const raw = await provider.readFile(metadata.path);\n const parsed = yaml.load(raw.toString('utf8'));\n if (!parsed || typeof parsed !== 'object') {\n hydrateFailed++;\n continue;\n }\n const payload = parsed as Record<string, unknown>;\n const id = typeof payload.id === 'string' ? payload.id : '';\n const name = typeof payload.name === 'string' ? payload.name : '';\n if (!id || !name) {\n hydrateFailed++;\n continue;\n }\n const slug = typeof payload.slug === 'string' ? payload.slug : undefined;\n existing.set(metadata.path, {\n entityType,\n path: metadata.path,\n id,\n name,\n slug,\n payload,\n sourceGeneration: metadata.generation,\n sourceUpdatedAt: metadata.updatedAt || null,\n sourceSize: Number(metadata.size || 0),\n sourceEtag: metadata.etag,\n hydratedAt: new Date().toISOString(),\n });\n hydrateSuccess++;\n } catch (error) {\n hydrateFailed++;\n logger.warning('entities.index.hydrate.failed', {\n entityType,\n path: metadata.path,\n error: error instanceof Error ? error.message : String(error),\n });\n }\n }\n\n this.byType.set(entityType, existing);\n this.lastRefreshAtByType.set(entityType, Date.now());\n this.dirtyTypes.delete(entityType);\n this.schedulePersist();\n\n logger.info('entities.index.refresh.complete', {\n entityType,\n listed: listed.length,\n yamlCandidates: yamlEntries.length,\n cacheHitCount,\n changedCount,\n removedCount,\n hydrateSuccess,\n hydrateFailed,\n indexedEntries: existing.size,\n elapsedMs: Date.now() - startedAt,\n });\n }\n\n private async loadSidecar(): Promise<void> {\n this.sidecarLoaded = true;\n try {\n const provider = createGcsStorageProvider(\n this.contextGcs.uri,\n this.contextGcs.credentialsFile,\n this.contextGcs.projectId,\n );\n if (!(await provider.exists(INDEX_PATH))) {\n return;\n }\n const raw = await provider.readFile(INDEX_PATH);\n const parsed = JSON.parse(raw.toString('utf8')) as Partial<PersistedEntityIndex>;\n if (parsed.version !== INDEX_SCHEMA_VERSION || !parsed.byType || typeof parsed.byType !== 'object') {\n logger.warning('entities.index.sidecar.invalid_schema', {\n indexPath: INDEX_PATH,\n version: parsed.version ?? null,\n });\n return;\n }\n for (const type of Object.keys(ENTITY_DIRECTORY) as IndexedEntityType[]) {\n const forType = parsed.byType[type];\n if (!forType || typeof forType !== 'object') {\n continue;\n }\n const map = this.byType.get(type) || new Map<string, EntityIndexEntry>();\n for (const [pathValue, entry] of Object.entries(forType)) {\n if (!entry || typeof entry !== 'object') {\n continue;\n }\n map.set(pathValue, {\n ...entry,\n entityType: type,\n path: normalizePath(entry.path || pathValue),\n id: String(entry.id || ''),\n name: String(entry.name || ''),\n payload: (entry.payload || {}) as Record<string, unknown>,\n sourceUpdatedAt: entry.sourceUpdatedAt || null,\n sourceSize: Number(entry.sourceSize || 0),\n hydratedAt: entry.hydratedAt || new Date(0).toISOString(),\n });\n }\n this.byType.set(type, map);\n }\n logger.info('entities.index.sidecar.loaded', {\n indexPath: INDEX_PATH,\n person: this.byType.get('person')?.size || 0,\n project: this.byType.get('project')?.size || 0,\n term: this.byType.get('term')?.size || 0,\n company: this.byType.get('company')?.size || 0,\n ignored: this.byType.get('ignored')?.size || 0,\n });\n } catch (error) {\n logger.warning('entities.index.sidecar.load_failed', {\n indexPath: INDEX_PATH,\n error: error instanceof Error ? error.message : String(error),\n });\n }\n }\n\n private schedulePersist(): void {\n this.persistRequested = true;\n if (this.persistInFlight) {\n return;\n }\n void this.persistLoop();\n }\n\n private async persistLoop(): Promise<void> {\n this.persistInFlight = true;\n try {\n while (this.persistRequested) {\n this.persistRequested = false;\n const provider = createGcsStorageProvider(\n this.contextGcs.uri,\n this.contextGcs.credentialsFile,\n this.contextGcs.projectId,\n );\n const payload: PersistedEntityIndex = {\n version: INDEX_SCHEMA_VERSION,\n builtAt: new Date().toISOString(),\n byType: {\n person: Object.fromEntries(this.byType.get('person')?.entries() || []),\n project: Object.fromEntries(this.byType.get('project')?.entries() || []),\n term: Object.fromEntries(this.byType.get('term')?.entries() || []),\n company: Object.fromEntries(this.byType.get('company')?.entries() || []),\n ignored: Object.fromEntries(this.byType.get('ignored')?.entries() || []),\n },\n };\n try {\n await provider.writeFile(INDEX_PATH, JSON.stringify(payload));\n } catch (error) {\n logger.warning('entities.index.sidecar.save_failed', {\n indexPath: INDEX_PATH,\n error: error instanceof Error ? error.message : String(error),\n });\n }\n }\n } finally {\n this.persistInFlight = false;\n }\n }\n}\n\nconst servicesByKey = new Map<string, EntityIndexService>();\n\nfunction getOrCreateService(contextGcs: ContextGcsConfig): EntityIndexService {\n const key = `${contextGcs.uri}|${contextGcs.projectId || ''}|${contextGcs.credentialsFile || ''}`;\n const existing = servicesByKey.get(key);\n if (existing) {\n return existing;\n }\n const created = new EntityIndexService(contextGcs);\n servicesByKey.set(key, created);\n return created;\n}\n\nexport async function listContextEntitiesFromGcs(entityType: IndexedEntityType): Promise<Array<Record<string, unknown>>> {\n const contextGcs = getContextGcsConfig();\n if (!contextGcs) {\n return [];\n }\n const service = getOrCreateService(contextGcs);\n return service.list(entityType);\n}\n\nexport async function findContextEntityInGcs(\n entityType: IndexedEntityType,\n entityId: string,\n): Promise<Record<string, unknown> | null> {\n const contextGcs = getContextGcsConfig();\n if (!contextGcs) {\n return null;\n }\n const service = getOrCreateService(contextGcs);\n return service.find(entityType, entityId);\n}\n\nexport function markContextEntityIndexDirty(entityType?: IndexedEntityType): void {\n const contextGcs = getContextGcsConfig();\n if (!contextGcs) {\n return;\n }\n const service = getOrCreateService(contextGcs);\n service.markDirty(entityType);\n}\n"," \n/**\n * Shared types, constants, and utilities for MCP tools\n */\nimport { stat, readdir } from 'node:fs/promises';\nimport { resolve, relative, isAbsolute, join } from 'node:path';\nimport { Media, Util as Storage, Transcript } from '@redaksjon/protokoll-engine';\nimport { getLogger } from '@/logging';\n\n// Import transcript utilities\nconst transcriptExists = Transcript.transcriptExists;\nconst ensurePklExtension = Transcript.ensurePklExtension;\n\n/**\n * Check if input looks like a UUID (8+ hex chars)\n * Inlined to avoid import issues\n */\nfunction isUuidInput(input: string): boolean {\n const normalized = input.trim();\n if (\n normalized.includes('/') ||\n normalized.includes('\\\\') ||\n normalized.includes('.') ||\n normalized.startsWith('protokoll://')\n ) {\n return false;\n }\n // Full UUID or UUID-style hex prefix without path separators.\n return /^[a-f0-9]{8,}$/i.test(normalized);\n}\n\n/**\n * Find transcript by UUID\n * Delegates to protokoll-engine\n */\nasync function findTranscriptByUuid(uuid: string, searchDirectories: string[]): Promise<string | null> {\n return Transcript.findTranscriptByUuid(uuid, searchDirectories);\n}\nimport * as Context from '@/context';\nimport type { ProtokollContextInstance } from '@/context';\nimport type { Person, Project, Term, Company, IgnoredTerm, Entity } from '@/context/types';\nimport { parseUri, isProtokolUri } from '../uri';\nimport { parseGcsUri } from '../storage/gcsUri';\nimport { listContextEntitiesFromGcs } from '../resources/entityIndexService';\n\n// ============================================================================\n// Shared Utilities\n// ============================================================================\n\nexport const logger = getLogger();\nexport const media = Media.create(logger);\nexport const storage = Storage.create({ log: logger.debug.bind(logger) });\n\n// ============================================================================\n// Types\n// ============================================================================\n\nexport interface ProcessingResult {\n outputPath: string;\n enhancedText: string;\n rawTranscript: string;\n routedProject?: string;\n routingConfidence: number;\n processingTime: number;\n toolsUsed: string[];\n correctionsApplied: number;\n}\n\nexport interface DiscoveredConfig {\n path: string;\n projectCount: number;\n peopleCount: number;\n termsCount: number;\n companiesCount: number;\n outputDirectory?: string;\n model?: string;\n}\n\nexport interface ProjectSuggestion {\n projectId: string;\n projectName: string;\n confidence: number;\n reason: string;\n destination?: string;\n}\n\n// ============================================================================\n// Helper Functions\n// ============================================================================\n\n/**\n * Helper for async file existence check\n */\nexport async function fileExists(path: string): Promise<boolean> {\n try {\n await stat(path);\n return true;\n } catch {\n return false;\n }\n}\n\n/**\n * Get a configured directory from server configuration\n * Uses workspace-level configuration instead of navigating up the directory tree\n */\nexport async function getConfiguredDirectory(\n key: 'inputDirectory' | 'outputDirectory' | 'processedDirectory',\n _contextDirectory?: string // Kept for backward compatibility but not used\n): Promise<string> {\n // Import here to avoid circular dependencies\n const ServerConfig = await import('../serverConfig');\n \n switch (key) {\n case 'inputDirectory':\n return ServerConfig.getInputDirectory();\n case 'outputDirectory':\n return ServerConfig.getOutputDirectory();\n case 'processedDirectory':\n return ServerConfig.getProcessedDirectory() || resolve(process.cwd(), './processed');\n }\n}\n\n/**\n * Get context directories from server configuration\n * Returns the contextDirectories array from protokoll-config.yaml if available\n */\nexport async function getContextDirectories(): Promise<string[] | undefined> {\n // Import here to avoid circular dependencies\n const ServerConfig = await import('../serverConfig');\n \n const config = ServerConfig.getServerConfig();\n return config.configFile?.contextDirectories as string[] | undefined;\n}\n\n/**\n * Create a context instance for tool handlers.\n * Uses contextDirectories from server config (protokoll-config.yaml) when available,\n * matching the behavior of entity resource handlers.\n * Falls back to standard .protokoll discovery from the given directory.\n */\nexport async function createToolContext(contextDirectory?: string): Promise<ProtokollContextInstance> {\n const resolveByIdentifier = <T extends { id: string; slug?: string; name: string }>(\n entities: T[],\n identifier: string | null | undefined,\n ): T | undefined => {\n const normalized = typeof identifier === 'string' ? identifier.trim().toLowerCase() : '';\n if (!normalized) return undefined;\n const uuidPrefix = normalized.match(/^([a-f0-9]{8})/)?.[1];\n for (const entity of entities) {\n const idLower = entity.id.toLowerCase();\n const slugLower = entity.slug?.toLowerCase();\n const nameSlug = entity.name\n .toLowerCase()\n .trim()\n .replace(/[^a-z0-9]+/g, '-')\n .replace(/-+/g, '-')\n .replace(/^-|-$/g, '');\n if (idLower === normalized || slugLower === normalized || nameSlug === normalized) {\n return entity;\n }\n if (idLower.startsWith(normalized) || normalized.startsWith(idLower)) {\n return entity;\n }\n if (uuidPrefix && idLower.startsWith(uuidPrefix)) {\n return entity;\n }\n }\n return undefined;\n };\n\n const buildGcsFallbackContext = async (\n baseContext?: ProtokollContextInstance,\n ): Promise<ProtokollContextInstance> => {\n const people = (await listContextEntitiesFromGcs('person')) as Person[];\n const projects = (await listContextEntitiesFromGcs('project')) as Project[];\n const terms = (await listContextEntitiesFromGcs('term')) as Term[];\n const companies = (await listContextEntitiesFromGcs('company')) as Company[];\n const ignored = (await listContextEntitiesFromGcs('ignored')) as IgnoredTerm[];\n\n logger.info('tool.context.gcs_entity_index_fallback.loaded', {\n projectCount: projects.length,\n peopleCount: people.length,\n termCount: terms.length,\n companyCount: companies.length,\n ignoredCount: ignored.length,\n });\n\n const searchAcross = [...people, ...projects, ...terms, ...companies, ...ignored] as Entity[];\n const contextDirs = baseContext?.getContextDirs?.() || ['gcs://context'];\n\n const fallbackContext = {\n load: async () => {\n if (baseContext?.load) {\n await baseContext.load();\n }\n },\n reload: async () => {\n if (baseContext?.reload) {\n await baseContext.reload();\n }\n },\n getDiscoveredDirs: () => [],\n getConfig: () => (baseContext?.getConfig?.() || {}),\n getContextDirs: () => contextDirs,\n getPerson: (id: string) => resolveByIdentifier(people, id),\n getProject: (id: string) => resolveByIdentifier(projects, id),\n getCompany: (id: string) => resolveByIdentifier(companies, id),\n getTerm: (id: string) => resolveByIdentifier(terms, id),\n getIgnored: (id: string) => resolveByIdentifier(ignored, id),\n getAllPeople: () => people,\n getAllProjects: () => projects,\n getAllCompanies: () => companies,\n getAllTerms: () => terms,\n getAllIgnored: () => ignored,\n isIgnored: (term: string) => {\n const normalized = term.toLowerCase().trim();\n return ignored.some((entry) =>\n entry.name.toLowerCase() === normalized || entry.id.toLowerCase() === normalized\n );\n },\n search: (query: string) => {\n const q = query.toLowerCase().trim();\n if (!q) return [];\n return searchAcross.filter((entity: any) => {\n const byName = typeof entity.name === 'string' && entity.name.toLowerCase().includes(q);\n const bySoundsLike = Array.isArray(entity.sounds_like)\n && entity.sounds_like.some((s: string) => typeof s === 'string' && s.toLowerCase().includes(q));\n return byName || bySoundsLike;\n });\n },\n findBySoundsLike: (phonetic: string) => {\n const key = phonetic.toLowerCase().trim();\n if (!key) return undefined;\n return searchAcross.find((entity: any) => Array.isArray(entity.sounds_like)\n && entity.sounds_like.some((s: string) => typeof s === 'string' && s.toLowerCase() === key));\n },\n searchWithContext: (query: string) => {\n const q = query.toLowerCase().trim();\n if (!q) return [];\n return searchAcross.filter((entity) => entity.name.toLowerCase().includes(q));\n },\n getRelatedProjects: () => [],\n saveEntity: async (entity: Entity, allowUpdate?: boolean) => {\n if (!baseContext?.saveEntity) {\n throw new Error('GCS fallback context cannot persist entities');\n }\n return baseContext.saveEntity(entity, allowUpdate);\n },\n deleteEntity: async (entity: Entity) => {\n if (!baseContext?.deleteEntity) {\n return false;\n }\n return baseContext.deleteEntity(entity);\n },\n getEntityFilePath: (entity: Entity) => baseContext?.getEntityFilePath?.(entity),\n hasContext: () => searchAcross.length > 0,\n getSmartAssistanceConfig: () => ({\n enabled: false,\n phoneticModel: '',\n analysisModel: '',\n soundsLikeOnAdd: false,\n triggerPhrasesOnAdd: false,\n promptForSource: false,\n termsEnabled: false,\n termSoundsLikeOnAdd: false,\n termDescriptionOnAdd: false,\n termTopicsOnAdd: false,\n termProjectSuggestions: false,\n timeout: 0,\n }),\n };\n\n return fallbackContext as unknown as ProtokollContextInstance;\n };\n\n const ServerConfig = await import('../serverConfig');\n const serverContext = ServerConfig.getContext();\n const storageConfig = ServerConfig.getStorageConfig();\n if (serverContext?.hasContext()) {\n const projectCount = serverContext.getAllProjects().length;\n const peopleCount = serverContext.getAllPeople().length;\n const termCount = serverContext.getAllTerms().length;\n const companyCount = serverContext.getAllCompanies().length;\n const totalEntities = projectCount + peopleCount + termCount + companyCount;\n\n if (storageConfig.backend === 'gcs') {\n // In some remote/GCS runs the preloaded server context can be partially\n // hydrated (for example only a handful of people). Cross-check against\n // the indexed GCS view and prefer it when the cached context is clearly\n // incomplete so sounds_like replacement remains comprehensive.\n try {\n const [indexedPeople, indexedProjects, indexedTerms, indexedCompanies] = await Promise.all([\n listContextEntitiesFromGcs('person') as Promise<Person[]>,\n listContextEntitiesFromGcs('project') as Promise<Project[]>,\n listContextEntitiesFromGcs('term') as Promise<Term[]>,\n listContextEntitiesFromGcs('company') as Promise<Company[]>,\n ]);\n const indexedTotal = indexedPeople.length\n + indexedProjects.length\n + indexedTerms.length\n + indexedCompanies.length;\n if (indexedTotal > totalEntities) {\n logger.warn('tool.context.server_context_partial_using_entity_index_fallback', {\n serverProjectCount: projectCount,\n serverPeopleCount: peopleCount,\n serverTermCount: termCount,\n serverCompanyCount: companyCount,\n indexedProjectCount: indexedProjects.length,\n indexedPeopleCount: indexedPeople.length,\n indexedTermCount: indexedTerms.length,\n indexedCompanyCount: indexedCompanies.length,\n serverContextDirs: serverContext.getContextDirs(),\n });\n return buildGcsFallbackContext(serverContext);\n }\n } catch (error) {\n logger.warn('tool.context.server_context_index_crosscheck_failed', {\n error: error instanceof Error ? error.message : String(error),\n serverProjectCount: projectCount,\n serverPeopleCount: peopleCount,\n serverTermCount: termCount,\n serverCompanyCount: companyCount,\n });\n }\n }\n\n // For filesystem (or fully hydrated GCS) keep the preloaded server context.\n if (totalEntities > 0 || storageConfig.backend !== 'gcs') {\n return serverContext;\n }\n\n logger.warn('tool.context.empty_server_context_reloading', {\n backend: storageConfig.backend,\n projectCount,\n peopleCount,\n termCount,\n companyCount,\n contextDirs: serverContext.getContextDirs(),\n });\n }\n\n const configFile = ServerConfig.isInitialized()\n ? ServerConfig.getServerConfig().configFile as { contextDirectories?: string[] } | null\n : null;\n const rawDirs = configFile?.contextDirectories;\n const effectiveDir = contextDirectory\n || (ServerConfig.isInitialized() ? ServerConfig.getWorkspaceRoot() : null)\n || process.cwd();\n const contextDirs = rawDirs && rawDirs.length > 0\n ? rawDirs.map((d: string) => (isAbsolute(d) ? d : resolve(effectiveDir, d)))\n : undefined;\n\n if (storageConfig.backend === 'gcs' && storageConfig.gcs) {\n const contextUri = storageConfig.gcs.contextUri\n || (storageConfig.gcs.contextBucket\n ? `gs://${storageConfig.gcs.contextBucket}/${(storageConfig.gcs.contextPrefix || '').replace(/^\\/+|\\/+$/g, '')}`\n : undefined);\n if (!contextUri) {\n throw new Error('GCS storage is enabled but context URI/bucket configuration is missing.');\n }\n const parsedContextUri = parseGcsUri(contextUri);\n const gcsContext = await Context.create({\n startingDir: effectiveDir,\n gcs: {\n bucketName: parsedContextUri.bucket,\n basePath: parsedContextUri.prefix,\n projectId: storageConfig.gcs.projectId,\n credentialsFile: storageConfig.gcs.credentialsFile,\n },\n });\n\n const gcsEntityCount = gcsContext.getAllProjects().length\n + gcsContext.getAllPeople().length\n + gcsContext.getAllTerms().length\n + gcsContext.getAllCompanies().length;\n if (gcsEntityCount > 0) {\n return gcsContext;\n }\n\n logger.warn('tool.context.gcs_context_empty_using_entity_index_fallback', {\n bucket: parsedContextUri.bucket,\n prefix: parsedContextUri.prefix,\n });\n return buildGcsFallbackContext(gcsContext);\n }\n\n return Context.create({\n startingDir: effectiveDir,\n contextDirectories: contextDirs,\n });\n}\n\n/**\n * Validate that contextDirectory parameter is not provided in remote mode\n * In remote mode, the server is pre-configured with workspace directories\n * and tools should not accept directory parameters.\n * \n * @param contextDirectory - The contextDirectory parameter from tool args\n * @throws Error if contextDirectory is provided in remote mode\n */\nexport async function validateNotRemoteMode(contextDirectory?: string): Promise<void> {\n if (!contextDirectory) {\n return; // No directory parameter provided, OK\n }\n \n // Import here to avoid circular dependencies\n const ServerConfig = await import('../serverConfig');\n \n if (ServerConfig.isRemoteMode()) {\n throw new Error(\n 'Directory parameters are not accepted in remote mode. ' +\n 'This server is pre-configured with workspace directories from protokoll-config.yaml. ' +\n 'Use the protokoll_info tool to check server configuration.'\n );\n }\n}\n\n/**\n * Validate that a resolved path stays within a base directory\n * This prevents path traversal attacks using ../ sequences\n * \n * @param resolvedPath - The resolved absolute path to validate\n * @param baseDirectory - The base directory that paths must stay within\n * @throws Error if the path escapes the base directory\n */\nexport function validatePathWithinDirectory(\n resolvedPath: string,\n baseDirectory: string\n): void {\n // Normalize both paths to handle any ../ sequences\n const normalizedTarget = resolve(resolvedPath);\n const normalizedBase = resolve(baseDirectory);\n \n // Ensure base directory ends with separator for proper prefix matching\n const basePath = normalizedBase.endsWith('/') ? normalizedBase : normalizedBase + '/';\n \n // Check if the target path is within the base directory\n // Must either be exactly the base dir, or start with base dir + separator\n if (normalizedTarget !== normalizedBase && !normalizedTarget.startsWith(basePath)) {\n throw new Error(\n `Security error: Path \"${resolvedPath}\" is outside the allowed directory \"${baseDirectory}\". ` +\n `Path traversal is not allowed.`\n );\n }\n}\n\n/**\n * Async version of validatePathWithinDirectory that gets the output directory from config\n * \n * @param resolvedPath - The resolved absolute path to validate\n * @param contextDirectory - Optional context directory for config lookup\n * @throws Error if the path escapes the output directory\n */\nexport async function validatePathWithinOutputDirectory(\n resolvedPath: string,\n contextDirectory?: string\n): Promise<void> {\n const outputDirectory = await getConfiguredDirectory('outputDirectory', contextDirectory);\n validatePathWithinDirectory(resolvedPath, outputDirectory);\n}\n\n/**\n * Convert an absolute file path to a relative path (relative to output directory)\n * This ensures no absolute paths are exposed to HTTP MCP clients\n * \n * @param absolutePath - The absolute file path to convert\n * @param baseDirectory - The base directory to make relative to (default: output directory)\n * @returns Relative path, or the original path if it's already relative\n */\nexport async function sanitizePath(\n absolutePath: string,\n baseDirectory?: string\n): Promise<string> {\n // Guard against undefined/null/empty values\n if (!absolutePath || typeof absolutePath !== 'string') {\n // Return empty string for invalid paths to prevent errors downstream\n return absolutePath || '';\n }\n \n // If it's already a relative path (doesn't start with /), return as-is\n if (!absolutePath.startsWith('/') && !absolutePath.match(/^[A-Za-z]:/)) {\n return absolutePath;\n }\n \n // Get the base directory (output directory by default)\n const base = baseDirectory || await getConfiguredDirectory('outputDirectory');\n \n // Convert to relative path\n try {\n const relativePath = relative(base, absolutePath);\n // If relative() returns an absolute path (when paths are on different drives on Windows),\n // return just the filename as a fallback\n if (relativePath.startsWith('/') || relativePath.match(/^[A-Za-z]:/)) {\n // Extract just the filename\n const parts = absolutePath.split(/[/\\\\]/);\n return parts[parts.length - 1] || absolutePath;\n }\n return relativePath;\n } catch {\n // If conversion fails, return just the filename\n const parts = absolutePath.split(/[/\\\\]/);\n return parts[parts.length - 1] || absolutePath;\n }\n}\n\n/**\n * Slugify text for IDs and filenames\n */\nexport function slugify(text: string): string {\n return text\n .toLowerCase()\n .replace(/[^a-z0-9]+/g, '-')\n .replace(/--+/g, '-')\n .replace(/^-|-$/g, '');\n}\n\n/**\n * Get audio file metadata (creation time and hash)\n */\nexport async function getAudioMetadata(audioFile: string): Promise<{ creationTime: Date; hash: string }> {\n // Get creation time from audio file\n let creationTime = await media.getAudioCreationTime(audioFile);\n if (!creationTime) {\n creationTime = new Date();\n }\n\n // Calculate hash of the file\n const hash = (await storage.hashFile(audioFile, 100)).substring(0, 8);\n\n return { creationTime, hash };\n}\n\n/**\n * Format entity for response\n */\nexport function formatEntity(entity: Entity): Record<string, unknown> {\n const result: Record<string, unknown> = {\n id: entity.id,\n name: entity.name,\n type: entity.type,\n };\n\n if (entity.type === 'person') {\n const person = entity as Person;\n if (person.firstName) result.firstName = person.firstName;\n if (person.lastName) result.lastName = person.lastName;\n if (person.company) result.company = person.company;\n if (person.role) result.role = person.role;\n if (person.sounds_like) result.sounds_like = person.sounds_like;\n if (person.context) result.context = person.context;\n } else if (entity.type === 'project') {\n const project = entity as Project;\n if (project.description) result.description = project.description;\n if (project.classification) result.classification = project.classification;\n if (project.routing) result.routing = project.routing;\n if (project.sounds_like) result.sounds_like = project.sounds_like;\n result.active = project.active !== false;\n } else if (entity.type === 'term') {\n const term = entity as Term;\n if (term.expansion) result.expansion = term.expansion;\n if (term.domain) result.domain = term.domain;\n if (term.description) result.description = term.description;\n if (term.sounds_like) result.sounds_like = term.sounds_like;\n if (term.topics) result.topics = term.topics;\n if (term.projects) result.projects = term.projects;\n } else if (entity.type === 'company') {\n const company = entity as Company;\n if (company.fullName) result.fullName = company.fullName;\n if (company.industry) result.industry = company.industry;\n if (company.sounds_like) result.sounds_like = company.sounds_like;\n } else if (entity.type === 'ignored') {\n const ignored = entity as IgnoredTerm;\n if (ignored.reason) result.reason = ignored.reason;\n if (ignored.ignoredAt) result.ignoredAt = ignored.ignoredAt;\n }\n\n return result;\n}\n\n/**\n * Helper to merge arrays: handles replace, add, and remove operations\n */\nexport function mergeArray(\n existing: string[] | undefined,\n replace: string[] | undefined,\n add: string[] | undefined,\n remove: string[] | undefined\n): string[] | undefined {\n // If replace is provided, use it as the base\n if (replace !== undefined) {\n let result = [...replace];\n if (add) {\n result = [...result, ...add.filter(v => !result.includes(v))];\n }\n if (remove) {\n result = result.filter(v => !remove.includes(v));\n }\n return result.length > 0 ? result : undefined;\n }\n\n // Otherwise work with existing\n let result = existing ? [...existing] : [];\n if (add) {\n result = [...result, ...add.filter(v => !result.includes(v))];\n }\n if (remove) {\n result = result.filter(v => !remove.includes(v));\n }\n\n // Return undefined if empty (to remove the field from YAML)\n return result.length > 0 ? result : (existing ? undefined : existing);\n}\n\n/**\n * Resolve a transcript URI, path, or UUID to an absolute file path\n * \n * Accepts:\n * - UUID or UUID prefix: \"a1b2c3d4\" or \"a1b2c3d4-5e6f-7890-abcd-ef1234567890\"\n * - Protokoll URI: protokoll://transcript/2026/2/12-1606-meeting (preferred)\n * - Relative path: 2026/2/12-1606-meeting or 2026/2/12-1606-meeting.pkl\n * - Absolute path: /full/path/to/transcript.pkl (must be within output directory)\n * \n * Returns absolute path for internal file operations\n */\nexport async function resolveTranscriptPath(\n uriOrPathOrUuid: string,\n contextDirectory?: string\n): Promise<string> {\n if (!uriOrPathOrUuid || typeof uriOrPathOrUuid !== 'string') {\n throw new Error('Transcript reference is required and must be a non-empty string');\n }\n \n const outputDirectory = await getConfiguredDirectory('outputDirectory', contextDirectory);\n const ServerConfig = await import('../serverConfig');\n const outputStorage = ServerConfig.getOutputStorage();\n if (outputStorage.name === 'gcs') {\n throw new Error(\n 'resolveTranscriptPath does not support GCS-backed transcripts. ' +\n 'Use storage-aware transcript resolution in the tool handler.'\n );\n }\n \n // Check if input is a UUID\n if (isUuidInput(uriOrPathOrUuid)) {\n const foundPath = await findTranscriptByUuid(uriOrPathOrUuid, [outputDirectory]);\n if (!foundPath) {\n throw new Error(`Transcript not found for UUID: ${uriOrPathOrUuid}`);\n }\n return foundPath;\n }\n \n let relativePath: string;\n \n // Check if input is a Protokoll URI\n if (isProtokolUri(uriOrPathOrUuid)) {\n const sanitizedUri = uriOrPathOrUuid.split('#')[0].split('?')[0];\n const parsed = parseUri(sanitizedUri);\n if (parsed.resourceType !== 'transcript') {\n throw new Error(`Invalid URI: expected transcript URI, got ${parsed.resourceType}`);\n }\n // Extract the transcript path from the URI (without extension)\n // Type assertion is safe because we checked resourceType === 'transcript'\n relativePath = String((parsed as any).transcriptPath || '').replace(/^(\\.\\.\\/)+/, '');\n } else {\n // Handle as a file path (relative or absolute)\n if (isAbsolute(uriOrPathOrUuid)) {\n const normalizedAbsolute = resolve(uriOrPathOrUuid);\n const normalizedOutputDir = resolve(outputDirectory);\n \n if (normalizedAbsolute.startsWith(normalizedOutputDir + '/') || normalizedAbsolute === normalizedOutputDir) {\n // Convert absolute path to relative\n relativePath = normalizedAbsolute.substring(normalizedOutputDir.length + 1);\n } else {\n throw new Error(`Path must be within output directory: ${outputDirectory}`);\n }\n } else {\n // Relative path - normalize it\n relativePath = uriOrPathOrUuid.replace(/^[/\\\\]+/, '').replace(/\\\\/g, '/');\n }\n }\n \n // Remove .pkl extension if present (we'll add it back)\n relativePath = relativePath.replace(/\\.pkl$/i, '');\n \n // Resolve to absolute path\n const resolvedPath = resolve(outputDirectory, relativePath);\n validatePathWithinDirectory(resolvedPath, outputDirectory);\n \n // Ensure .pkl extension and check if file exists\n const pklPath = ensurePklExtension(resolvedPath);\n const existsResult = await transcriptExists(pklPath);\n if (!existsResult.exists || !existsResult.path) {\n // Fallback for slug-only references (e.g. \"meeting-with-bret-nuussen-ssp\"):\n // search recursively under outputDirectory for a matching filename.\n if (!relativePath.includes('/')) {\n const candidateFilename = ensurePklExtension(relativePath).split('/').pop() || ensurePklExtension(relativePath);\n const matches: string[] = [];\n\n const walk = async (dir: string): Promise<void> => {\n const entries = await readdir(dir, { withFileTypes: true });\n for (const entry of entries) {\n const entryPath = join(dir, entry.name);\n if (entry.isDirectory()) {\n await walk(entryPath);\n continue;\n }\n if (entry.isFile() && entry.name === candidateFilename) {\n matches.push(entryPath);\n }\n }\n };\n\n await walk(outputDirectory);\n\n if (matches.length === 1) {\n return matches[0];\n }\n if (matches.length > 1) {\n throw new Error(\n `Ambiguous transcript reference \"${uriOrPathOrUuid}\": ${matches.length} matches found. ` +\n 'Use full transcript URI or relative path with date folders.'\n );\n }\n }\n\n throw new Error(`Transcript not found: ${uriOrPathOrUuid}`);\n }\n \n return existsResult.path;\n}\n","import { basename } from 'node:path';\nimport { tmpdir } from 'node:os';\nimport * as fs from 'node:fs/promises';\nimport Logging from '@fjell/logging';\nimport { PklTranscript } from '@redaksjon/protokoll-format';\nimport { Transcript } from '@redaksjon/protokoll-engine';\nimport type { FileStorageProvider, StorageFileMetadata } from '../storage/fileProviders';\n\nconst logger = Logging.getLogger('@redaksjon/protokoll-mcp').get('transcript-index');\nconst INDEX_SCHEMA_VERSION = 1;\nconst DEFAULT_INDEX_PATH = '.protokoll/transcripts-index-v1.json';\nconst { readTranscriptContent } = Transcript;\n\ntype TranscriptListEntry = {\n path: string;\n filename: string;\n date: string;\n time?: string;\n title: string;\n status?: string;\n openTasksCount: number;\n contentSize: number;\n entities: unknown;\n hasRawTranscript: boolean;\n};\n\ninterface TranscriptIndexEntry {\n path: string;\n filename: string;\n date: string;\n time?: string;\n title: string;\n status?: string;\n openTasksCount: number;\n contentSize: number;\n entities: unknown;\n hasRawTranscript: boolean;\n projectId?: string;\n project?: string;\n sourceSize: number;\n sourceUpdatedAt: string | null;\n sourceGeneration?: string;\n sourceEtag?: string;\n hydratedAt: string;\n}\n\ninterface PersistedTranscriptIndex {\n version: number;\n builtAt: string;\n entries: Record<string, TranscriptIndexEntry>;\n}\n\ninterface TranscriptHydrationFailure {\n version: string;\n reason: string;\n}\n\nfunction normalizePath(pathValue: string): string {\n return pathValue.replace(/^\\/+/, '').replace(/\\\\/g, '/');\n}\n\nfunction normalizeDateOnly(value: string | undefined): string | undefined {\n if (!value) {\n return undefined;\n }\n const trimmed = value.trim();\n if (!trimmed) {\n return undefined;\n }\n return trimmed.includes('T') ? trimmed.slice(0, 10) : trimmed;\n}\n\nfunction asOptionalString(value: unknown): string | undefined {\n return typeof value === 'string' ? value : undefined;\n}\n\nfunction passesDateFilter(date: string | undefined, startDate?: string, endDate?: string): boolean {\n const normalized = normalizeDateOnly(date);\n if (!normalized) {\n return !startDate && !endDate;\n }\n if (startDate && normalized < startDate) {\n return false;\n }\n if (endDate && normalized > endDate) {\n return false;\n }\n return true;\n}\n\nfunction metadataVersionKey(metadata: StorageFileMetadata): string {\n // Keep this key stable across provider/client variations.\n // `updatedAt + size` is consistently available for both GCS and filesystem providers.\n const stableUpdatedAt = metadata.updatedAt || '';\n const stableSize = String(Number(metadata.size || 0));\n return [\n stableUpdatedAt,\n stableSize,\n ].join('|');\n}\n\nfunction entryVersionKey(entry: TranscriptIndexEntry): string {\n return [\n entry.sourceUpdatedAt || '',\n String(Number(entry.sourceSize || 0)),\n ].join('|');\n}\n\nasync function listFilesWithMetadataCompat(\n outputStorage: FileStorageProvider,\n prefix: string,\n pattern?: string,\n): Promise<StorageFileMetadata[]> {\n const withMetadata = (outputStorage as {\n listFilesWithMetadata?: (prefix: string, pattern?: string) => Promise<StorageFileMetadata[]>;\n }).listFilesWithMetadata;\n if (typeof withMetadata === 'function') {\n return withMetadata.call(outputStorage, prefix, pattern);\n }\n const listFiles = (outputStorage as {\n listFiles?: (prefix: string, pattern?: string) => Promise<string[]>;\n }).listFiles;\n if (typeof listFiles !== 'function') {\n return [];\n }\n const listed = await listFiles.call(outputStorage, prefix, pattern);\n return listed.map((pathValue) => ({\n path: pathValue,\n size: 1,\n updatedAt: null,\n }));\n}\n\nasync function withTempPklFile<T>(contents: Buffer, action: (tempPath: string) => Promise<T>): Promise<T> {\n const tempPath = `${tmpdir()}/protokoll-mcp-index-${Date.now()}-${Math.random().toString(36).slice(2)}.pkl`;\n await fs.writeFile(tempPath, contents);\n try {\n return await action(tempPath);\n } finally {\n await fs.rm(tempPath, { force: true });\n }\n}\n\nfunction isTranscriptCandidate(pathValue: string): boolean {\n const normalized = normalizePath(pathValue).toLowerCase();\n return normalized.endsWith('.pkl')\n && !normalized.startsWith('uploads/')\n && !normalized.startsWith('.intermediate/')\n && !normalized.includes('/uploads/')\n && !normalized.includes('/.intermediate/');\n}\n\nexport interface TranscriptIndexListOptions {\n startDate?: string;\n endDate?: string;\n projectId?: string;\n projectName?: string;\n limit: number;\n offset: number;\n}\n\nexport interface TranscriptIndexListResponse {\n transcripts: TranscriptListEntry[];\n total: number;\n hasMore: boolean;\n limit: number;\n offset: number;\n}\n\nclass TranscriptIndexService {\n private readonly entries = new Map<string, TranscriptIndexEntry>();\n private readonly dirtyPaths = new Set<string>();\n private loadedFromSidecar = false;\n private forceRebuild = false;\n private persistInFlight = false;\n private persistRequested = false;\n private refreshInFlight: Promise<void> | null = null;\n private lastRefreshAt = 0;\n private readonly hydrationFailures = new Map<string, TranscriptHydrationFailure>();\n\n constructor(\n private readonly outputStorage: FileStorageProvider,\n private readonly outputDirectory: string,\n private readonly indexPath: string = DEFAULT_INDEX_PATH,\n private readonly refreshTtlMs: number = 5_000,\n private readonly maxCachedEntries: number = 50_000,\n private readonly sidecarEnabled: boolean = true,\n ) {}\n\n markDirty(pathValue: string): void {\n const normalized = normalizePath(pathValue);\n if (!normalized) {\n return;\n }\n this.dirtyPaths.add(normalized);\n if (normalized.endsWith('.pkl')) {\n this.dirtyPaths.add(normalized.slice(0, -4));\n } else {\n this.dirtyPaths.add(`${normalized}.pkl`);\n }\n }\n\n invalidateAll(): void {\n this.forceRebuild = true;\n this.dirtyPaths.clear();\n }\n\n async listTranscripts(options: TranscriptIndexListOptions): Promise<TranscriptIndexListResponse> {\n const startedAt = Date.now();\n await this.refreshIndexIfNeeded();\n\n const { startDate, endDate, projectId, projectName, limit, offset } = options;\n const filtered = Array.from(this.entries.values())\n .filter((entry) => {\n if (projectId) {\n const projectMatches = entry.projectId === projectId\n || (projectName ? entry.project === projectName : entry.project === projectId);\n if (!projectMatches) {\n return false;\n }\n }\n return passesDateFilter(entry.date, startDate, endDate);\n })\n .sort((a, b) => {\n const dateCompare = (b.date || '').localeCompare(a.date || '');\n if (dateCompare !== 0) {\n return dateCompare;\n }\n const timeCompare = (b.time || '').localeCompare(a.time || '');\n if (timeCompare !== 0) {\n return timeCompare;\n }\n return b.filename.localeCompare(a.filename);\n });\n\n const page = filtered.slice(offset, offset + limit).map((entry) => ({\n path: entry.path,\n filename: entry.filename,\n date: entry.date || '1970-01-01',\n time: entry.time,\n title: entry.title,\n status: entry.status,\n openTasksCount: entry.openTasksCount,\n contentSize: entry.contentSize,\n entities: entry.entities,\n hasRawTranscript: entry.hasRawTranscript,\n }));\n\n logger.info('transcripts.index.list.complete', {\n totalIndexed: this.entries.size,\n totalAfterFilters: filtered.length,\n returned: page.length,\n hasMore: offset + limit < filtered.length,\n elapsedMs: Date.now() - startedAt,\n });\n\n return {\n transcripts: page,\n total: filtered.length,\n hasMore: offset + limit < filtered.length,\n limit,\n offset,\n };\n }\n\n private async refreshIndexIfNeeded(): Promise<void> {\n if (!this.loadedFromSidecar) {\n await this.loadSidecar();\n }\n\n const now = Date.now();\n const needsRefresh = this.forceRebuild\n || this.dirtyPaths.size > 0\n || this.entries.size === 0\n || now - this.lastRefreshAt > this.refreshTtlMs;\n if (!needsRefresh) {\n logger.debug('transcripts.index.refresh.skipped', {\n reason: 'ttl_cache_hit',\n cachedEntries: this.entries.size,\n dirtyPaths: this.dirtyPaths.size,\n });\n return;\n }\n\n await this.refreshIndexOnce();\n this.lastRefreshAt = Date.now();\n }\n\n private async refreshIndexOnce(): Promise<void> {\n if (this.refreshInFlight) {\n await this.refreshInFlight;\n return;\n }\n this.refreshInFlight = this.refreshIndex().finally(() => {\n this.refreshInFlight = null;\n });\n await this.refreshInFlight;\n }\n\n private async refreshIndex(): Promise<void> {\n const refreshStartedAt = Date.now();\n const listed = await listFilesWithMetadataCompat(this.outputStorage, '');\n const candidates = listed\n .map((metadata) => ({ ...metadata, path: normalizePath(metadata.path) }))\n .filter((metadata) => isTranscriptCandidate(metadata.path));\n\n const byPath = new Map(candidates.map((metadata) => [metadata.path, metadata]));\n const dirtyAtStart = new Set(this.dirtyPaths);\n\n let cacheHits = 0;\n let changedCount = 0;\n let hydrateSuccess = 0;\n let hydrateFailed = 0;\n let removedCount = 0;\n\n if (this.forceRebuild) {\n changedCount = candidates.length;\n this.entries.clear();\n } else {\n for (const metadata of candidates) {\n const cached = this.entries.get(metadata.path);\n const dirty = dirtyAtStart.has(metadata.path);\n if (!cached || dirty) {\n changedCount++;\n continue;\n }\n const cachedVersion = entryVersionKey(cached);\n if (cachedVersion === metadataVersionKey(metadata)) {\n cacheHits++;\n } else {\n changedCount++;\n }\n }\n }\n\n for (const [pathValue, cached] of this.entries.entries()) {\n if (!byPath.has(pathValue)) {\n this.entries.delete(pathValue);\n this.hydrationFailures.delete(pathValue);\n removedCount++;\n } else if (cached && this.forceRebuild) {\n this.entries.delete(pathValue);\n }\n }\n\n for (const metadata of candidates) {\n const dirty = dirtyAtStart.has(metadata.path);\n const cached = this.entries.get(metadata.path);\n const sameVersion = cached\n ? entryVersionKey(cached) === metadataVersionKey(metadata)\n : false;\n if (!this.forceRebuild && !dirty && sameVersion) {\n continue;\n }\n\n const metadataVersion = metadataVersionKey(metadata);\n const previousFailure = this.hydrationFailures.get(metadata.path);\n if (!this.forceRebuild && !dirty && previousFailure && previousFailure.version === metadataVersion) {\n hydrateFailed++;\n continue;\n }\n\n const hydrated = await this.hydrateEntry(metadata);\n if (!hydrated) {\n hydrateFailed++;\n continue;\n }\n hydrateSuccess++;\n this.hydrationFailures.delete(metadata.path);\n this.entries.set(metadata.path, hydrated);\n }\n\n if (this.entries.size > this.maxCachedEntries) {\n const overflow = this.entries.size - this.maxCachedEntries;\n const sorted = Array.from(this.entries.values())\n .sort((a, b) => (a.hydratedAt || '').localeCompare(b.hydratedAt || ''))\n .slice(0, overflow);\n for (const entry of sorted) {\n this.entries.delete(entry.path);\n }\n logger.warning('transcripts.index.cache.evicted', {\n overflow,\n maxCachedEntries: this.maxCachedEntries,\n totalAfterEvict: this.entries.size,\n });\n }\n\n this.forceRebuild = false;\n this.dirtyPaths.clear();\n this.schedulePersist();\n\n logger.info('transcripts.index.refresh.complete', {\n outputDirectory: this.outputDirectory,\n listedObjects: listed.length,\n transcriptCandidates: candidates.length,\n cacheHits,\n changedCount,\n hydrateSuccess,\n hydrateFailed,\n removedCount,\n indexedEntries: this.entries.size,\n elapsedMs: Date.now() - refreshStartedAt,\n });\n }\n\n private async hydrateEntry(metadata: StorageFileMetadata): Promise<TranscriptIndexEntry | null> {\n const version = metadataVersionKey(metadata);\n if (Number(metadata.size || 0) <= 0) {\n this.hydrationFailures.set(metadata.path, {\n version,\n reason: 'empty_file',\n });\n logger.info('transcripts.index.hydrate.skipped', {\n path: metadata.path,\n reason: 'empty_file',\n });\n return null;\n }\n\n try {\n const buffer = await this.outputStorage.readFile(metadata.path);\n return await withTempPklFile(buffer, async (tempPath) => {\n const { content, metadata: transcriptMetadata, title } = await readTranscriptContent(tempPath);\n const pklTranscript = PklTranscript.open(tempPath, { readOnly: true });\n let hasRawTranscript = false;\n try {\n hasRawTranscript = Boolean(pklTranscript.hasRawTranscript);\n } finally {\n pklTranscript.close();\n }\n\n const date = normalizeDateOnly(asOptionalString(transcriptMetadata.date));\n const tasks = Array.isArray(transcriptMetadata.tasks) ? transcriptMetadata.tasks : [];\n const openTasksCount = tasks.filter((task: unknown) => {\n if (!task || typeof task !== 'object') {\n return true;\n }\n return (task as { status?: unknown }).status !== 'completed';\n }).length;\n\n return {\n path: metadata.path,\n filename: basename(metadata.path),\n date: date || '1970-01-01',\n time: asOptionalString(transcriptMetadata.time),\n title: title || metadata.path.replace(/\\.pkl$/i, '').split('/').pop() || 'Untitled',\n status: asOptionalString(transcriptMetadata.status),\n openTasksCount,\n contentSize: content.length,\n entities: transcriptMetadata.entities,\n hasRawTranscript,\n projectId: asOptionalString(transcriptMetadata.projectId),\n project: asOptionalString(transcriptMetadata.project),\n sourceSize: Number(metadata.size || 0),\n sourceUpdatedAt: metadata.updatedAt || null,\n sourceGeneration: metadata.generation,\n sourceEtag: metadata.etag,\n hydratedAt: new Date().toISOString(),\n } satisfies TranscriptIndexEntry;\n });\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n const isLegacyMetadataError = message.includes('no such table: metadata');\n this.hydrationFailures.set(metadata.path, {\n version,\n reason: isLegacyMetadataError ? 'legacy_missing_metadata_table' : message,\n });\n\n const logMethod = isLegacyMetadataError ? logger.info.bind(logger) : logger.warning.bind(logger);\n logMethod('transcripts.index.hydrate.failed', {\n path: metadata.path,\n error: message,\n classification: isLegacyMetadataError ? 'legacy_unsupported_transcript' : 'hydrate_error',\n });\n return null;\n }\n }\n\n async findPathsByFilename(targetFilenames: Set<string>): Promise<string[]> {\n await this.refreshIndexIfNeeded();\n const matches: string[] = [];\n for (const [entryPath, entry] of this.entries) {\n const entryFilename = entry.filename || entryPath.split('/').pop() || '';\n if (targetFilenames.has(entryFilename)) {\n matches.push(entryPath);\n }\n }\n return matches;\n }\n\n private async loadSidecar(): Promise<void> {\n this.loadedFromSidecar = true;\n if (!this.sidecarEnabled) {\n return;\n }\n try {\n if (!(await this.outputStorage.exists(this.indexPath))) {\n return;\n }\n const raw = await this.outputStorage.readFile(this.indexPath);\n const parsed = JSON.parse(raw.toString('utf8')) as Partial<PersistedTranscriptIndex>;\n if (parsed.version !== INDEX_SCHEMA_VERSION || !parsed.entries || typeof parsed.entries !== 'object') {\n logger.warning('transcripts.index.sidecar.invalid_schema', {\n indexPath: this.indexPath,\n version: parsed.version ?? null,\n });\n return;\n }\n for (const [pathValue, entry] of Object.entries(parsed.entries)) {\n if (entry && typeof entry === 'object' && isTranscriptCandidate(pathValue)) {\n this.entries.set(pathValue, {\n ...entry,\n path: normalizePath(entry.path || pathValue),\n filename: entry.filename || basename(pathValue),\n date: entry.date || '1970-01-01',\n openTasksCount: Number(entry.openTasksCount || 0),\n contentSize: Number(entry.contentSize || 0),\n sourceSize: Number(entry.sourceSize || 0),\n sourceUpdatedAt: entry.sourceUpdatedAt || null,\n hydratedAt: entry.hydratedAt || new Date(0).toISOString(),\n });\n }\n }\n logger.info('transcripts.index.sidecar.loaded', {\n indexPath: this.indexPath,\n loadedEntries: this.entries.size,\n });\n } catch (error) {\n logger.warning('transcripts.index.sidecar.load_failed', {\n indexPath: this.indexPath,\n error: error instanceof Error ? error.message : String(error),\n });\n }\n }\n\n private schedulePersist(): void {\n if (!this.sidecarEnabled) {\n return;\n }\n this.persistRequested = true;\n if (this.persistInFlight) {\n return;\n }\n void this.persistLoop();\n }\n\n private async persistLoop(): Promise<void> {\n this.persistInFlight = true;\n try {\n while (this.persistRequested) {\n this.persistRequested = false;\n const payload: PersistedTranscriptIndex = {\n version: INDEX_SCHEMA_VERSION,\n builtAt: new Date().toISOString(),\n entries: Object.fromEntries(this.entries.entries()),\n };\n try {\n await this.outputStorage.writeFile(this.indexPath, JSON.stringify(payload));\n logger.debug('transcripts.index.sidecar.saved', {\n indexPath: this.indexPath,\n entryCount: this.entries.size,\n });\n } catch (error) {\n logger.warning('transcripts.index.sidecar.save_failed', {\n indexPath: this.indexPath,\n error: error instanceof Error ? error.message : String(error),\n });\n }\n }\n } finally {\n this.persistInFlight = false;\n }\n }\n}\n\nconst serviceInstances = new Map<string, TranscriptIndexService>();\nconst serviceInstancesByProvider = new WeakMap<FileStorageProvider, TranscriptIndexService>();\n\nfunction getServiceForStorage(outputStorage: FileStorageProvider, outputDirectory: string): TranscriptIndexService {\n if (outputStorage.cacheKey) {\n const existing = serviceInstances.get(outputStorage.cacheKey);\n if (existing) {\n return existing;\n }\n const created = new TranscriptIndexService(outputStorage, outputDirectory, DEFAULT_INDEX_PATH, 5_000, 50_000, true);\n serviceInstances.set(outputStorage.cacheKey, created);\n return created;\n }\n\n const existingForProvider = serviceInstancesByProvider.get(outputStorage);\n if (existingForProvider) {\n return existingForProvider;\n }\n\n const created = new TranscriptIndexService(outputStorage, outputDirectory, DEFAULT_INDEX_PATH, 5_000, 50_000, false);\n serviceInstancesByProvider.set(outputStorage, created);\n return created;\n}\n\nexport async function listTranscriptsViaIndex(args: {\n outputStorage: FileStorageProvider;\n outputDirectory: string;\n startDate?: string;\n endDate?: string;\n projectId?: string;\n projectName?: string;\n limit: number;\n offset: number;\n}): Promise<TranscriptIndexListResponse> {\n const service = getServiceForStorage(args.outputStorage, args.outputDirectory);\n return service.listTranscripts({\n startDate: args.startDate,\n endDate: args.endDate,\n projectId: args.projectId,\n projectName: args.projectName,\n limit: args.limit,\n offset: args.offset,\n });\n}\n\nexport function markTranscriptIndexDirtyForStorage(\n outputStorage: FileStorageProvider | null | undefined,\n outputDirectory: string,\n pathValue: string,\n): void {\n if (!outputStorage) {\n return;\n }\n const service = getServiceForStorage(outputStorage, outputDirectory);\n service.markDirty(pathValue);\n}\n\nexport function invalidateTranscriptIndexForStorage(\n outputStorage: FileStorageProvider | null | undefined,\n outputDirectory: string,\n): void {\n if (!outputStorage) {\n return;\n }\n const service = getServiceForStorage(outputStorage, outputDirectory);\n service.invalidateAll();\n}\n\nexport async function resolveTranscriptPathByFilename(\n outputStorage: FileStorageProvider,\n outputDirectory: string,\n targetFilenames: Set<string>,\n): Promise<string[]> {\n const service = getServiceForStorage(outputStorage, outputDirectory);\n const indexedMatches = await service.findPathsByFilename(targetFilenames);\n if (indexedMatches.length > 0) {\n return indexedMatches;\n }\n\n const listed = await listFilesWithMetadataCompat(outputStorage, '', '.pkl');\n return listed\n .map((entry) => normalizePath(entry.path))\n .filter((entryPath) => targetFilenames.has(entryPath.split('/').pop() || ''));\n}\n","/**\n * Transcript Resources\n * \n * Handles reading individual transcripts and listing transcripts.\n */\n\nimport type { McpResourceContents } from '../types';\nimport { buildTranscriptUri, buildTranscriptsListUri } from '../uri';\nimport { resolve, relative, basename } from 'node:path';\nimport { tmpdir } from 'node:os';\nimport * as fs from 'node:fs/promises';\nimport Logging from '@fjell/logging';\nimport { Transcript } from '@redaksjon/protokoll-engine';\nimport { PklTranscript } from '@redaksjon/protokoll-format';\nimport * as ServerConfig from '../serverConfig';\nimport { sanitizePath } from '../tools/shared';\nimport type { FileStorageProvider } from '../storage/fileProviders';\nimport { listTranscriptsViaIndex } from './transcriptIndexService';\n\nconst { resolveTranscriptPath, readTranscriptContent, stripTranscriptExtension } = Transcript;\nconst { listTranscripts } = Transcript;\nconst logger = Logging.getLogger('@redaksjon/protokoll-mcp').get('transcript-resources');\n\nfunction parseStoredSummaries(raw: string): Array<{\n id: string;\n title: string;\n audience: string;\n guidance: string;\n stylePreset: string;\n styleLabel: string;\n content: string;\n generatedAt: string;\n}> {\n try {\n const parsed = JSON.parse(raw) as unknown;\n if (!Array.isArray(parsed)) {\n return [];\n }\n return parsed\n .map((item) => {\n if (!item || typeof item !== 'object') {\n return null;\n }\n const record = item as Record<string, unknown>;\n const id = String(record.id || '').trim();\n const content = String(record.content || '').trim();\n if (!id || !content) {\n return null;\n }\n return {\n id,\n title: String(record.title || '').trim(),\n audience: String(record.audience || '').trim(),\n guidance: String(record.guidance || '').trim(),\n stylePreset: String(record.stylePreset || 'detailed').trim() || 'detailed',\n styleLabel: String(record.styleLabel || 'Detailed summary').trim() || 'Detailed summary',\n content,\n generatedAt: String(record.generatedAt || '').trim() || new Date().toISOString(),\n };\n })\n .filter((summary): summary is {\n id: string;\n title: string;\n audience: string;\n guidance: string;\n stylePreset: string;\n styleLabel: string;\n content: string;\n generatedAt: string;\n } => summary !== null)\n .sort((a, b) => b.generatedAt.localeCompare(a.generatedAt));\n } catch {\n return [];\n }\n}\n\n/**\n * Read a single transcript resource\n * \n * transcriptPath can be:\n * - A path without extension (e.g., \"2026/1/29-2027-meeting\") - will resolve to .pkl\n * - A path with extension (e.g., \"2026/1/29-2027-meeting.pkl\") - will use that specific file\n */\nexport async function readTranscriptResource(transcriptPath: string): Promise<McpResourceContents> {\n // Guard against undefined/null paths\n if (!transcriptPath || typeof transcriptPath !== 'string') {\n throw new Error(`Invalid transcript path: ${transcriptPath}`);\n }\n \n // Get the configured output directory\n const outputDirectory = ServerConfig.getOutputDirectory();\n const outputStorage = ServerConfig.getOutputStorage();\n\n if (outputStorage.name === 'gcs') {\n const gcsResult = await readTranscriptResourceFromStorage(transcriptPath, outputStorage, outputDirectory);\n if (gcsResult) {\n return gcsResult;\n }\n }\n \n // Resolve the transcript path - handles extension resolution\n // If it's already absolute, use it directly (for backwards compatibility)\n const basePath = transcriptPath.startsWith('/')\n ? transcriptPath\n : resolve(outputDirectory, transcriptPath);\n\n // Resolve to actual .pkl file\n const resolved = await resolveTranscriptPath(basePath);\n \n if (!resolved.exists || !resolved.path) {\n throw new Error(`Transcript not found: ${basePath}`);\n }\n\n try {\n // Read content and metadata using PKL utilities\n const { content, metadata, title } = await readTranscriptContent(resolved.path);\n \n // Get raw transcript if available\n const pklTranscript = PklTranscript.open(resolved.path, { readOnly: true });\n let rawTranscript = undefined;\n let summaries: Array<{\n id: string;\n title: string;\n audience: string;\n guidance: string;\n stylePreset: string;\n styleLabel: string;\n content: string;\n generatedAt: string;\n }> = [];\n try {\n if (pklTranscript.hasRawTranscript) {\n const rawData = pklTranscript.rawTranscript;\n if (rawData) {\n rawTranscript = {\n text: rawData.text,\n model: rawData.model,\n duration: rawData.duration,\n transcribedAt: rawData.transcribedAt,\n };\n }\n }\n\n const historyArtifact = pklTranscript.getArtifact('summary_history');\n summaries = parseStoredSummaries(historyArtifact?.data?.toString('utf8') || '[]');\n } finally {\n pklTranscript.close();\n }\n \n // Build the URI without extension (extension-agnostic identifier)\n const relativePath = resolved.path.startsWith('/')\n ? relative(outputDirectory, resolved.path)\n : transcriptPath;\n \n // Strip extension from the URI - the identifier should be extension-agnostic\n const identifierPath = stripTranscriptExtension(relativePath);\n \n // Return structured JSON response - clients should NOT parse this\n // All metadata is provided directly for display\n const structuredResponse = {\n uri: buildTranscriptUri(identifierPath),\n path: identifierPath,\n title: title || identifierPath.split('/').pop() || 'Untitled',\n metadata: {\n date: metadata.date,\n time: metadata.time,\n project: metadata.project,\n projectId: metadata.projectId,\n status: metadata.status,\n tags: metadata.tags || [],\n duration: metadata.duration,\n entities: metadata.entities || {},\n tasks: metadata.tasks || [],\n comments: metadata.comments || [],\n history: metadata.history || [],\n routing: metadata.destination ? {\n destination: metadata.destination,\n confidence: metadata.confidence,\n } : undefined,\n },\n content: content,\n rawTranscript: rawTranscript,\n summaries,\n };\n \n return {\n uri: buildTranscriptUri(identifierPath),\n mimeType: 'application/json',\n text: JSON.stringify(structuredResponse),\n };\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code === 'ENOENT') {\n throw new Error(`Transcript not found: ${resolved.path}`);\n }\n throw error;\n }\n}\n\nasync function withTempPklFile<T>(contents: Buffer, action: (tempPath: string) => Promise<T>): Promise<T> {\n const tempPath = `${tmpdir()}/protokoll-mcp-${Date.now()}-${Math.random().toString(36).slice(2)}.pkl`;\n await fs.writeFile(tempPath, contents);\n try {\n return await action(tempPath);\n } finally {\n await fs.rm(tempPath, { force: true });\n }\n}\n\nasync function resolveStorageTranscriptPath(\n transcriptPath: string,\n outputStorage: FileStorageProvider,\n): Promise<string | null> {\n const candidates = new Set<string>();\n const normalizedInput = transcriptPath.replace(/^\\/+/, '').replace(/\\\\/g, '/');\n if (normalizedInput.length > 0) {\n candidates.add(normalizedInput);\n }\n if (!normalizedInput.toLowerCase().endsWith('.pkl')) {\n candidates.add(`${normalizedInput}.pkl`);\n }\n\n for (const candidate of candidates) {\n if (await outputStorage.exists(candidate)) {\n return candidate;\n }\n }\n\n return null;\n}\n\nasync function readTranscriptResourceFromStorage(\n transcriptPath: string,\n outputStorage: FileStorageProvider,\n outputDirectory: string,\n): Promise<McpResourceContents | null> {\n const storagePath = await resolveStorageTranscriptPath(transcriptPath, outputStorage);\n if (!storagePath) {\n return null;\n }\n\n const contents = await outputStorage.readFile(storagePath);\n return withTempPklFile(contents, async (tempPath) => {\n const { content, metadata, title } = await readTranscriptContent(tempPath);\n const pklTranscript = PklTranscript.open(tempPath, { readOnly: true });\n let rawTranscript = undefined;\n let summaries: Array<{\n id: string;\n title: string;\n audience: string;\n guidance: string;\n stylePreset: string;\n styleLabel: string;\n content: string;\n generatedAt: string;\n }> = [];\n try {\n if (pklTranscript.hasRawTranscript) {\n const rawData = pklTranscript.rawTranscript;\n if (rawData) {\n rawTranscript = {\n text: rawData.text,\n model: rawData.model,\n duration: rawData.duration,\n transcribedAt: rawData.transcribedAt,\n };\n }\n }\n\n const historyArtifact = pklTranscript.getArtifact('summary_history');\n summaries = parseStoredSummaries(historyArtifact?.data?.toString('utf8') || '[]');\n } finally {\n pklTranscript.close();\n }\n\n const safeRelativePath = await sanitizePath(storagePath, outputDirectory);\n const identifierPath = stripTranscriptExtension(safeRelativePath);\n const structuredResponse = {\n uri: buildTranscriptUri(identifierPath),\n path: identifierPath,\n title: title || basename(identifierPath) || 'Untitled',\n metadata: {\n date: metadata.date,\n time: metadata.time,\n project: metadata.project,\n projectId: metadata.projectId,\n status: metadata.status,\n tags: metadata.tags || [],\n duration: metadata.duration,\n entities: metadata.entities || {},\n tasks: metadata.tasks || [],\n comments: metadata.comments || [],\n history: metadata.history || [],\n routing: metadata.destination ? {\n destination: metadata.destination,\n confidence: metadata.confidence,\n } : undefined,\n },\n content,\n rawTranscript,\n summaries,\n };\n\n return {\n uri: buildTranscriptUri(identifierPath),\n mimeType: 'application/json',\n text: JSON.stringify(structuredResponse),\n };\n });\n}\n\nasync function listTranscriptsFromStorage(options: {\n outputStorage: FileStorageProvider;\n outputDirectory: string;\n startDate?: string;\n endDate?: string;\n projectId?: string;\n projectName?: string;\n limit: number;\n offset: number;\n}) {\n const startedAt = Date.now();\n const { outputStorage, outputDirectory, startDate, endDate, projectId, projectName, limit, offset } = options;\n\n logger.info('transcripts.storage.list.start', {\n directory: outputDirectory,\n storageBackend: outputStorage.name,\n limit,\n offset,\n startDate: startDate ?? null,\n endDate: endDate ?? null,\n projectId: projectId ?? null,\n projectName: projectName ?? null,\n });\n\n const hasListSupport = typeof (outputStorage as { listFiles?: unknown }).listFiles === 'function'\n || typeof (outputStorage as { listFilesWithMetadata?: unknown }).listFilesWithMetadata === 'function';\n if (!hasListSupport) {\n return listTranscripts({\n directory: outputDirectory,\n startDate,\n endDate,\n limit,\n offset,\n projectId,\n });\n }\n\n const result = await listTranscriptsViaIndex({\n outputStorage,\n outputDirectory,\n startDate,\n endDate,\n projectId,\n projectName,\n limit,\n offset,\n });\n logger.info('transcripts.storage.list.complete', {\n storageBackend: outputStorage.name,\n totalAfterFilters: result.total,\n returned: result.transcripts.length,\n hasMore: result.hasMore,\n elapsedMs: Date.now() - startedAt,\n });\n return result;\n}\n\n/**\n * Read a list of transcripts with filtering\n */\nexport async function readTranscriptsListResource(options: {\n directory?: string;\n startDate?: string;\n endDate?: string;\n limit?: number;\n offset?: number;\n projectId?: string;\n}): Promise<McpResourceContents> {\n const { startDate, endDate, limit = 50, offset = 0, projectId } = options;\n \n // Get the configured output directory to use as fallback\n const outputDirectory = ServerConfig.getOutputDirectory();\n const outputStorage = ServerConfig.getOutputStorage();\n \n // Use provided directory or fall back to configured outputDirectory\n const directory = options.directory || outputDirectory;\n\n // Resolve projectId to project name for fallback filtering (transcripts may have project name but not projectId)\n let projectName: string | undefined;\n if (projectId && ServerConfig.isInitialized()) {\n const context = ServerConfig.getContext();\n if (context) {\n const project = context.getProject(projectId);\n if (project) {\n projectName = project.name;\n } else {\n // projectId isn't a known UUID — treat it as a project name\n projectName = projectId;\n }\n }\n }\n\n logger.info('transcripts.list.request', {\n directory,\n directorySource: options.directory ? 'request' : 'config',\n projectId: projectId ?? null,\n startDate: startDate ?? null,\n endDate: endDate ?? null,\n limit,\n offset,\n storageBackend: outputStorage.name,\n });\n\n const result = await listTranscriptsFromStorage({\n outputStorage,\n outputDirectory,\n startDate,\n endDate,\n projectId,\n projectName,\n limit,\n offset,\n });\n\n logger.info('transcripts.list.response', {\n directory,\n total: result.total,\n returned: result.transcripts.length,\n hasMore: result.hasMore,\n limit,\n offset,\n });\n\n // Convert to resource format with URIs\n // Convert absolute paths to relative paths (relative to outputDirectory)\n // Use sanitizePath to ensure no absolute paths are exposed\n // Strip file extensions from URIs - identifiers should be extension-agnostic\n const transcriptsWithUris = await Promise.all(\n result.transcripts.map(async (t) => {\n // Convert absolute path to relative path\n // Guard against undefined path - use filename as fallback\n const relativePath = await sanitizePath(t.path || t.filename || '', outputDirectory);\n \n // Strip extension from the identifier - URIs should be extension-agnostic\n const identifierPath = stripTranscriptExtension(relativePath);\n \n return {\n uri: buildTranscriptUri(identifierPath),\n path: identifierPath, // Use extension-less path as the identifier\n filename: t.filename,\n date: t.date,\n time: t.time,\n title: t.title,\n status: t.status,\n openTasksCount: t.openTasksCount,\n contentSize: t.contentSize,\n entities: t.entities,\n hasRawTranscript: t.hasRawTranscript,\n };\n })\n );\n\n const responseData = {\n directory,\n transcripts: transcriptsWithUris,\n pagination: {\n total: result.total,\n limit: result.limit,\n offset: result.offset,\n hasMore: result.hasMore ?? (result.offset + result.limit < result.total),\n nextOffset: result.hasMore ? result.offset + result.limit : null,\n },\n filters: {\n startDate,\n endDate,\n projectId,\n },\n };\n\n // Build URI with the actual directory used (may be fallback from config)\n return {\n uri: buildTranscriptsListUri({\n directory,\n startDate,\n endDate,\n limit,\n offset,\n projectId,\n }),\n mimeType: 'application/json',\n text: JSON.stringify(responseData, null, 2),\n };\n}\n","/**\n * Client / list APIs sometimes surface composite ids (e.g. \"default-server:<uuid>\" or\n * \"<profile-id>:<uuid>\") while context storage keys entities by the bare UUID in YAML.\n * These helpers normalize ids for lookup and deduplication.\n */\n\nconst UUID_RE = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;\n\n/**\n * If id is \"anything:<uuid>\" where the part after the first colon is a full UUID,\n * return that UUID; otherwise return the trimmed original string.\n */\nexport function resolveCanonicalEntityId(id: string): string {\n const t = id.trim();\n const colon = t.indexOf(':');\n if (colon === -1) {\n return t;\n }\n const rest = t.slice(colon + 1).trim();\n if (UUID_RE.test(rest)) {\n return rest;\n }\n return t;\n}\n\n/** Try raw id first, then canonical (stripped) form when they differ. */\nexport function entityIdLookupOrder(id: string): string[] {\n const t = id.trim();\n const canon = resolveCanonicalEntityId(t);\n return canon === t ? [t] : [t, canon];\n}\n","/**\n * Entity Resources\n * \n * Handles reading individual entities and listing entities by type.\n */\n\nimport type { McpResourceContents } from '../types';\nimport { buildEntityUri, buildEntitiesListUri } from '../uri';\nimport * as Context from '@/context';\nimport type { ContextInstance } from '@/context';\nimport * as ServerConfig from '../serverConfig';\nimport { createToolContext } from '../tools/shared';\nimport * as yaml from 'js-yaml';\nimport { resolve, isAbsolute } from 'node:path';\nimport Logging from '@fjell/logging';\nimport { findContextEntityInGcs, listContextEntitiesFromGcs } from './entityIndexService';\nimport { entityIdLookupOrder } from '../util/scopedEntityId';\n\ntype EntityType = 'person' | 'project' | 'term' | 'company' | 'ignored';\nconst logger = Logging.getLogger('@redaksjon/protokoll-mcp').get('entity-resources');\n\n/** YAML keys that may hold large plan lists — omitted from entity resources; use protokoll_list_project_plans. */\nconst PROJECT_PLAN_ARRAY_KEYS = ['related_plans', 'plans', 'riotplan_plans'] as const;\n\nfunction stripProjectPlanArraysForResource(entity: unknown): Record<string, unknown> {\n const base =\n entity && typeof entity === 'object' && !Array.isArray(entity)\n ? { ...(entity as Record<string, unknown>) }\n : {};\n let totalRows = 0;\n for (const k of PROJECT_PLAN_ARRAY_KEYS) {\n const v = base[k];\n if (Array.isArray(v)) {\n totalRows += v.length;\n }\n }\n for (const k of PROJECT_PLAN_ARRAY_KEYS) {\n const v = base[k];\n if (Array.isArray(v) && v.length > 0) {\n delete base[k];\n }\n }\n if (totalRows > 0) {\n base.related_plans_total = totalRows;\n }\n return base;\n}\n\nconst ENTITY_DIRECTORY: Record<EntityType, string> = {\n person: 'people',\n project: 'projects',\n term: 'terms',\n company: 'companies',\n ignored: 'ignored',\n};\n\n/**\n * Read a single entity resource.\n * Always creates a fresh context to ensure we read the latest data from disk,\n * since entity edit tools write directly to disk with their own context instances.\n */\nexport async function readEntityResource(\n entityType: string,\n entityId: string,\n contextDirectory?: string\n): Promise<McpResourceContents> {\n if ((entityType as EntityType) in ENTITY_DIRECTORY && ServerConfig.isInitialized()) {\n const storageConfig = ServerConfig.getStorageConfig();\n if (storageConfig.backend === 'gcs') {\n for (const tryId of entityIdLookupOrder(entityId)) {\n const gcsEntity = await findContextEntityInGcs(entityType as EntityType, tryId);\n if (gcsEntity) {\n const idForUri =\n typeof (gcsEntity as { id?: unknown }).id === 'string'\n ? String((gcsEntity as { id: string }).id).trim()\n : tryId;\n const toDump =\n entityType === 'project'\n ? stripProjectPlanArraysForResource(gcsEntity)\n : gcsEntity;\n const yamlContent = yaml.dump(toDump);\n return {\n uri: buildEntityUri(entityType as any, idForUri),\n mimeType: 'application/yaml',\n text: yamlContent,\n };\n }\n }\n }\n }\n\n const effectiveDir = contextDirectory || ServerConfig.getWorkspaceRoot() || process.cwd();\n logger.info('entity.read.lookup', {\n entityType,\n entityId,\n effectiveDir,\n });\n const context = await createToolContext(contextDirectory);\n try {\n await context.reload();\n } catch (error) {\n logger.debug('entity.read.context_reload_failed', {\n entityType,\n entityId,\n error: error instanceof Error ? error.message : String(error),\n });\n }\n\n if (!context.hasContext()) {\n const searchDir = contextDirectory || process.cwd();\n logger.warning('entity.read.missing_context', {\n entityType,\n entityId,\n searchDir,\n });\n throw new Error(`No Protokoll context found. Expected .protokoll/ or context dirs in ${searchDir}`);\n }\n\n const lookupEntityById = (\n candidate: ContextInstance,\n forId: string,\n ): ReturnType<ContextInstance['getPerson']> | ReturnType<ContextInstance['getProject']> | ReturnType<ContextInstance['getTerm']> | ReturnType<ContextInstance['getCompany']> | ReturnType<ContextInstance['getIgnored']> => {\n switch (entityType) {\n case 'person':\n return candidate.getPerson(forId);\n case 'project':\n return candidate.getProject(forId);\n case 'term':\n return candidate.getTerm(forId);\n case 'company':\n return candidate.getCompany(forId);\n case 'ignored':\n return candidate.getIgnored(forId);\n default:\n throw new Error(`Unknown entity type: ${entityType}`);\n }\n };\n\n const serverContext = ServerConfig.isInitialized() ? ServerConfig.getContext() : undefined;\n if (serverContext?.hasContext() && serverContext !== context) {\n try {\n await serverContext.reload();\n } catch (error) {\n logger.debug('entity.read.server_context_reload_failed', {\n entityType,\n entityId,\n error: error instanceof Error ? error.message : String(error),\n });\n }\n }\n\n let entity:\n | ReturnType<ContextInstance['getPerson']>\n | ReturnType<ContextInstance['getProject']>\n | ReturnType<ContextInstance['getTerm']>\n | ReturnType<ContextInstance['getCompany']>\n | ReturnType<ContextInstance['getIgnored']>\n | undefined;\n\n for (const tryId of entityIdLookupOrder(entityId)) {\n entity = lookupEntityById(context, tryId);\n if (entity) {\n break;\n }\n if (serverContext?.hasContext() && serverContext !== context) {\n entity = lookupEntityById(serverContext, tryId);\n if (entity) {\n logger.info('entity.read.server_context_fallback_hit', {\n entityType,\n entityId,\n tryId,\n });\n break;\n }\n }\n }\n\n if (!entity) {\n // Debug: list available IDs for this type to help diagnose \"not found\"\n const allIds =\n entityType === 'person' ? context.getAllPeople().map(p => p.id)\n : entityType === 'project' ? context.getAllProjects().map(p => p.id)\n : entityType === 'term' ? context.getAllTerms().map(t => t.id)\n : entityType === 'company' ? context.getAllCompanies().map(c => c.id)\n : entityType === 'ignored' ? context.getAllIgnored().map(i => i.id)\n : [];\n logger.warning('entity.read.not_found', {\n entityType,\n entityId,\n availableCount: allIds.length,\n });\n throw new Error(`${entityType} \"${entityId}\" not found`);\n }\n\n const canonicalId = entity.id;\n\n logger.info('entity.read.found', {\n entityType,\n entityId,\n canonicalId: canonicalId !== entityId ? canonicalId : undefined,\n });\n\n // Convert to YAML for readability (strip heavy plan arrays from project resources)\n const payload = entityType === 'project' ? stripProjectPlanArraysForResource(entity) : entity;\n const yamlContent = yaml.dump(payload);\n\n return {\n uri: buildEntityUri(entityType as any, canonicalId),\n mimeType: 'application/yaml',\n text: yamlContent,\n };\n}\n\n/**\n * Read a list of entities by type\n */\nexport async function readEntitiesListResource(\n entityType: string,\n contextDirectory?: string\n): Promise<McpResourceContents> {\n if ((entityType as EntityType) in ENTITY_DIRECTORY && ServerConfig.isInitialized()) {\n const storageConfig = ServerConfig.getStorageConfig();\n if (storageConfig.backend === 'gcs') {\n const entitiesFromGcs = await listContextEntitiesFromGcs(entityType as EntityType);\n const entities = entitiesFromGcs.map((entity) => {\n const id = String(entity.id || '');\n const name = String(entity.name || '');\n return {\n uri: buildEntityUri(entityType as any, id),\n id,\n name,\n ...entity,\n };\n });\n\n const responseData = {\n entityType,\n count: entities.length,\n entities,\n };\n\n return {\n uri: buildEntitiesListUri(entityType as any),\n mimeType: 'application/json',\n text: JSON.stringify(responseData, null, 2),\n };\n }\n }\n\n // Use server's pre-initialized context when available (HTTP/remote mode with protokoll-config.yaml)\n let context: ContextInstance;\n if (ServerConfig.isInitialized()) {\n const serverContext = ServerConfig.getContext();\n if (serverContext?.hasContext()) {\n context = serverContext;\n } else {\n const configFile = ServerConfig.getServerConfig().configFile as { contextDirectories?: string[] } | null;\n const rawDirs = configFile?.contextDirectories;\n const effectiveDir = contextDirectory || ServerConfig.getWorkspaceRoot() || process.cwd();\n const contextDirs = rawDirs && rawDirs.length > 0\n ? rawDirs.map(d => (isAbsolute(d) ? d : resolve(effectiveDir, d)))\n : undefined;\n context = await Context.create({\n startingDir: effectiveDir,\n contextDirectories: contextDirs,\n });\n }\n } else {\n context = await Context.create({\n startingDir: contextDirectory || process.cwd(),\n });\n }\n\n if (!context.hasContext()) {\n throw new Error('No Protokoll context found');\n }\n\n let entities: Array<{ id: string; name: string; [key: string]: unknown }>;\n \n switch (entityType) {\n case 'person':\n entities = context.getAllPeople().map(p => ({\n uri: buildEntityUri('person', p.id),\n id: p.id,\n name: p.name,\n company: p.company,\n role: p.role,\n }));\n break;\n case 'project':\n entities = context.getAllProjects().map(p => ({\n uri: buildEntityUri('project', p.id),\n id: p.id,\n name: p.name,\n active: p.active !== false,\n destination: p.routing?.destination,\n }));\n break;\n case 'term':\n entities = context.getAllTerms().map(t => ({\n uri: buildEntityUri('term', t.id),\n id: t.id,\n name: t.name,\n expansion: t.expansion,\n domain: t.domain,\n }));\n break;\n case 'company':\n entities = context.getAllCompanies().map(c => ({\n uri: buildEntityUri('company', c.id),\n id: c.id,\n name: c.name,\n fullName: c.fullName,\n industry: c.industry,\n }));\n break;\n case 'ignored':\n entities = context.getAllIgnored().map(i => ({\n uri: buildEntityUri('ignored', i.id),\n id: i.id,\n name: i.name,\n reason: i.reason,\n }));\n break;\n default:\n throw new Error(`Unknown entity type: ${entityType}`);\n }\n\n const responseData = {\n entityType,\n count: entities.length,\n entities,\n };\n\n return {\n uri: buildEntitiesListUri(entityType as any),\n mimeType: 'application/json',\n text: JSON.stringify(responseData, null, 2),\n };\n}\n","/**\n * Audio Resources\n * \n * Handles listing audio files (inbound and processed).\n */\n\nimport type { McpResourceContents } from '../types';\nimport { buildAudioInboundUri, buildAudioProcessedUri } from '../uri';\nimport { readdir, stat } from 'node:fs/promises';\nimport { resolve, join, extname } from 'node:path';\nimport * as Context from '@/context';\nimport { DEFAULT_AUDIO_EXTENSIONS } from '@/constants';\nimport * as ServerConfig from '../serverConfig';\n\nfunction isServerConfigInitialized(): boolean {\n try {\n return typeof (ServerConfig as any).isInitialized === 'function' &&\n (ServerConfig as any).isInitialized();\n } catch {\n return false;\n }\n}\n\n/**\n * List audio files in a directory\n */\nasync function listAudioFiles(directory: string): Promise<Array<{\n filename: string;\n path: string;\n size: number;\n modified: string;\n extension: string;\n}>> {\n const dirPath = resolve(directory);\n \n try {\n const entries = await readdir(dirPath, { withFileTypes: true });\n const audioFiles = [];\n \n for (const entry of entries) {\n if (entry.isFile()) {\n const ext = extname(entry.name).toLowerCase().substring(1);\n if (DEFAULT_AUDIO_EXTENSIONS.includes(ext)) {\n const filePath = join(dirPath, entry.name);\n const stats = await stat(filePath);\n \n audioFiles.push({\n filename: entry.name,\n path: filePath,\n size: stats.size,\n modified: stats.mtime.toISOString(),\n extension: ext,\n });\n }\n }\n }\n \n // Sort by modification time, newest first\n audioFiles.sort((a, b) => \n new Date(b.modified).getTime() - new Date(a.modified).getTime()\n );\n \n return audioFiles;\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code === 'ENOENT') {\n return [];\n }\n throw error;\n }\n}\n\n/**\n * Format bytes to human-readable string\n */\nfunction formatBytes(bytes: number): string {\n if (bytes === 0) return '0 B';\n \n const k = 1024;\n const sizes = ['B', 'KB', 'MB', 'GB'];\n const i = Math.floor(Math.log(bytes) / Math.log(k));\n \n return `${(bytes / Math.pow(k, i)).toFixed(2)} ${sizes[i]}`;\n}\n\n/**\n * Read inbound audio files resource\n */\nexport async function readAudioInboundResource(\n directory?: string\n): Promise<McpResourceContents> {\n const serverConfigReady = isServerConfigInitialized();\n\n let inputDirectory = directory;\n if (!inputDirectory) {\n if (serverConfigReady && typeof (ServerConfig as any).getInputDirectory === 'function') {\n inputDirectory = (ServerConfig as any).getInputDirectory();\n } else {\n const context = await Context.create({\n startingDir: process.cwd(),\n });\n if (!context.hasContext()) {\n throw new Error('No Protokoll context found');\n }\n const config = context.getConfig();\n inputDirectory = (config.inputDirectory as string) || './recordings';\n }\n } else if (!serverConfigReady) {\n // Preserve local-mode behavior: explicit directories still require context discovery.\n const context = await Context.create({\n startingDir: directory,\n });\n if (!context.hasContext()) {\n throw new Error('No Protokoll context found');\n }\n }\n if (!inputDirectory) {\n throw new Error('Input directory is not configured');\n }\n const audioFiles = await listAudioFiles(inputDirectory);\n \n const responseData = {\n directory: resolve(inputDirectory),\n count: audioFiles.length,\n totalSize: audioFiles.reduce((sum, f) => sum + f.size, 0),\n files: audioFiles.map(f => ({\n filename: f.filename,\n path: f.path,\n size: f.size,\n sizeHuman: formatBytes(f.size),\n modified: f.modified,\n extension: f.extension,\n })),\n supportedExtensions: DEFAULT_AUDIO_EXTENSIONS,\n };\n\n return {\n uri: buildAudioInboundUri(inputDirectory),\n mimeType: 'application/json',\n text: JSON.stringify(responseData, null, 2),\n };\n}\n\n/**\n * Read processed audio files resource\n */\nexport async function readAudioProcessedResource(\n directory?: string\n): Promise<McpResourceContents> {\n const serverConfigReady = isServerConfigInitialized();\n\n let processedDirectory = directory;\n if (!processedDirectory) {\n if (serverConfigReady && typeof (ServerConfig as any).getProcessedDirectory === 'function') {\n processedDirectory = (ServerConfig as any).getProcessedDirectory() || './processed';\n } else {\n const context = await Context.create({\n startingDir: process.cwd(),\n });\n if (!context.hasContext()) {\n throw new Error('No Protokoll context found');\n }\n const config = context.getConfig();\n processedDirectory = (config.processedDirectory as string) || './processed';\n }\n } else if (!serverConfigReady) {\n // Preserve local-mode behavior: explicit directories still require context discovery.\n const context = await Context.create({\n startingDir: directory,\n });\n if (!context.hasContext()) {\n throw new Error('No Protokoll context found');\n }\n }\n if (!processedDirectory) {\n throw new Error('Processed directory is not configured');\n }\n const audioFiles = await listAudioFiles(processedDirectory);\n \n const responseData = {\n directory: resolve(processedDirectory),\n count: audioFiles.length,\n totalSize: audioFiles.reduce((sum, f) => sum + f.size, 0),\n files: audioFiles.map(f => ({\n filename: f.filename,\n path: f.path,\n size: f.size,\n sizeHuman: formatBytes(f.size),\n modified: f.modified,\n extension: f.extension,\n })),\n supportedExtensions: DEFAULT_AUDIO_EXTENSIONS,\n };\n\n return {\n uri: buildAudioProcessedUri(processedDirectory),\n mimeType: 'application/json',\n text: JSON.stringify(responseData, null, 2),\n };\n}\n","/**\n * Configuration Resource\n * \n * Handles reading Protokoll configuration.\n */\n\nimport type { McpResourceContents } from '../types';\nimport { buildConfigUri, buildEntitiesListUri } from '../uri';\nimport * as Context from '@/context';\nimport * as ServerConfig from '../serverConfig';\nimport { isAbsolute, resolve } from 'node:path';\n\nfunction isServerConfigInitialized(): boolean {\n try {\n return typeof (ServerConfig as any).isInitialized === 'function' &&\n (ServerConfig as any).isInitialized();\n } catch {\n return false;\n }\n}\n\nfunction getServerContext() {\n try {\n return typeof (ServerConfig as any).getContext === 'function'\n ? (ServerConfig as any).getContext()\n : null;\n } catch {\n return null;\n }\n}\n\nfunction getServerConfigFile(): { contextDirectories?: string[] } | null {\n try {\n return typeof (ServerConfig as any).getServerConfig === 'function'\n ? ((ServerConfig as any).getServerConfig().configFile as { contextDirectories?: string[] } | null)\n : null;\n } catch {\n return null;\n }\n}\n\nfunction getWorkspaceRoot(): string | null {\n try {\n return typeof (ServerConfig as any).getWorkspaceRoot === 'function'\n ? (ServerConfig as any).getWorkspaceRoot()\n : null;\n } catch {\n return null;\n }\n}\n\n/**\n * Read configuration resource\n */\nexport async function readConfigResource(\n configPath?: string\n): Promise<McpResourceContents> {\n let startDir = configPath || process.cwd();\n let context;\n const serverConfigReady = isServerConfigInitialized();\n if (serverConfigReady) {\n const serverContext = getServerContext();\n if (serverContext?.hasContext()) {\n context = serverContext;\n startDir = getWorkspaceRoot() || startDir;\n } else {\n const configFile = getServerConfigFile();\n const rawDirs = configFile?.contextDirectories;\n const workspaceRoot = getWorkspaceRoot();\n const effectiveDir = configPath || workspaceRoot || process.cwd();\n const contextDirs = rawDirs && rawDirs.length > 0\n ? rawDirs.map(d => (isAbsolute(d) ? d : resolve(effectiveDir, d)))\n : undefined;\n startDir = effectiveDir;\n context = await Context.create({\n startingDir: effectiveDir,\n contextDirectories: contextDirs,\n });\n }\n } else {\n context = await Context.create({\n startingDir: startDir,\n });\n }\n\n if (!context.hasContext()) {\n throw new Error(`No Protokoll context found at or above: ${startDir}`);\n }\n\n const dirs = context.getDiscoveredDirs();\n const config = context.getConfig();\n\n const configData = {\n hasContext: true,\n discoveredDirectories: dirs.map((d: { path: string; level: number }) => ({\n path: d.path,\n level: d.level,\n isPrimary: d.level === 0,\n })),\n entityCounts: {\n projects: context.getAllProjects().length,\n people: context.getAllPeople().length,\n terms: context.getAllTerms().length,\n companies: context.getAllCompanies().length,\n ignored: context.getAllIgnored().length,\n },\n config: {\n outputDirectory: config.outputDirectory,\n outputStructure: config.outputStructure,\n model: config.model,\n smartAssistance: context.getSmartAssistanceConfig(),\n },\n // Include URIs for easy navigation\n resourceUris: {\n projects: buildEntitiesListUri('project'),\n people: buildEntitiesListUri('person'),\n terms: buildEntitiesListUri('term'),\n companies: buildEntitiesListUri('company'),\n },\n };\n\n return {\n uri: buildConfigUri(configPath),\n mimeType: 'application/json',\n text: JSON.stringify(configData, null, 2),\n };\n}\n","/**\n * MCP Resources - Exports all resource definitions and handlers\n */\n\nimport type {\n McpResource,\n McpResourceTemplate,\n McpResourceContents,\n TranscriptUri,\n EntityUri,\n ConfigUri,\n TranscriptsListUri,\n EntitiesListUri,\n AudioInboundUri,\n AudioProcessedUri,\n} from '../types';\nimport { parseUri } from '../uri';\nimport * as ServerConfig from '../serverConfig';\nimport Logging from '@fjell/logging';\n\n// Re-export all resource modules\nexport * from './definitions';\nexport * from './discovery';\nexport * from './transcriptResources';\nexport * from './entityResources';\nexport * from './audioResources';\nexport * from './configResource';\n\n// Import for use in handlers\nimport { directResources, resourceTemplates } from './definitions';\nimport { getDynamicResources } from './discovery';\nimport { readTranscriptResource, readTranscriptsListResource } from './transcriptResources';\nimport { readEntityResource, readEntitiesListResource } from './entityResources';\nimport { readAudioInboundResource, readAudioProcessedResource } from './audioResources';\nimport { readConfigResource } from './configResource';\nconst logger = Logging.getLogger('@redaksjon/protokoll-mcp').get('resources');\n\n// ============================================================================\n// Main Handler Functions\n// ============================================================================\n\n/**\n * Handle resources/list request\n */\nexport async function handleListResources(contextDirectory?: string): Promise<{\n resources: McpResource[];\n resourceTemplates?: McpResourceTemplate[];\n}> {\n // Get dynamic resources from context if available\n const dynamicResources = await getDynamicResources(contextDirectory);\n \n return {\n resources: [...directResources, ...dynamicResources],\n resourceTemplates,\n };\n}\n\n/**\n * Handle resources/read request\n */\nexport async function handleReadResource(uri: string): Promise<McpResourceContents> {\n const parsed = parseUri(uri);\n\n if (parsed.resourceType === 'entity') {\n const entityUri = parsed as EntityUri;\n logger.info('resource.read.entity.request', {\n entityType: entityUri.entityType,\n entityId: entityUri.entityId,\n });\n }\n\n switch (parsed.resourceType) {\n case 'transcript':\n return readTranscriptResource((parsed as TranscriptUri).transcriptPath);\n case 'entity': {\n const entityUri = parsed as EntityUri;\n // Use server's workspace root when in remote mode (HTTP server)\n const contextDir = ServerConfig.isInitialized() ? ServerConfig.getWorkspaceRoot() ?? undefined : undefined;\n return readEntityResource(entityUri.entityType, entityUri.entityId, contextDir ?? undefined);\n }\n case 'config':\n return readConfigResource((parsed as ConfigUri).configPath);\n case 'transcripts-list': {\n const listUri = parsed as TranscriptsListUri;\n return readTranscriptsListResource({\n directory: listUri.directory,\n startDate: listUri.startDate,\n endDate: listUri.endDate,\n limit: listUri.limit,\n offset: listUri.offset,\n projectId: listUri.projectId,\n });\n }\n case 'entities-list': {\n const listUri = parsed as EntitiesListUri;\n const contextDir = ServerConfig.isInitialized() ? ServerConfig.getWorkspaceRoot() ?? undefined : undefined;\n return readEntitiesListResource(listUri.entityType, contextDir ?? undefined);\n }\n case 'audio-inbound':\n return readAudioInboundResource((parsed as AudioInboundUri).directory);\n case 'audio-processed':\n return readAudioProcessedResource((parsed as AudioProcessedUri).directory);\n default:\n throw new Error(`Unknown resource type: ${parsed.resourceType}`);\n }\n}\n","/**\n * MCP Prompt Handlers\n *\n * Provides workflow templates via MCP prompts.\n * Prompts are loaded from external markdown files in this directory.\n */\n\n// eslint-disable-next-line no-restricted-imports\nimport { readFileSync } from 'node:fs';\nimport { resolve, dirname, isAbsolute } from 'node:path';\nimport { stat } from 'node:fs/promises';\nimport { fileURLToPath } from 'node:url';\nimport type { McpPrompt, McpPromptMessage } from '../types';\nimport * as Context from '@/context';\nimport { buildConfigUri, buildEntitiesListUri } from '../uri';\nimport * as ServerConfig from '../serverConfig';\n\nconst __filename = fileURLToPath(import.meta.url);\nconst __dirname = dirname(__filename);\n\n/**\n * Helper to resolve the prompts directory path\n */\nfunction getPromptsDir(): string {\n const isBundled = __dirname.includes('/dist') || __dirname.endsWith('dist') ||\n __filename.includes('dist/mcp-server.js') || __filename.includes('dist\\\\mcp-server.js');\n\n if (isBundled) {\n // When bundled, __dirname points to dist/mcp, prompts are in dist/mcp/prompts\n return resolve(__dirname, 'prompts');\n }\n // In source, __dirname already points to src/mcp/prompts\n return __dirname;\n}\n\n/**\n * Helper to load a prompt template from a markdown file\n */\nfunction loadTemplate(name: string): string {\n const promptsDir = getPromptsDir();\n const path = resolve(promptsDir, `${name}.md`);\n try {\n return readFileSync(path, 'utf-8').trim();\n } catch (error) {\n const isBundled = __dirname.includes('/dist');\n const debugInfo = [\n `Failed to load prompt template \"${name}\"`,\n `Attempted path: ${path}`,\n `Prompts directory: ${promptsDir}`,\n `Current __dirname: ${__dirname}`,\n `Current __filename: ${__filename}`,\n `Environment: ${isBundled ? 'bundled (dist)' : 'source (src)'}`,\n `Error: ${error}`,\n ].join('\\n ');\n throw new Error(debugInfo);\n }\n}\n\n/**\n * Helper to replace placeholders in a template\n */\nfunction fillTemplate(template: string, args: Record<string, string>): string {\n return template.replace(/\\${(\\w+)}/g, (_, key) => {\n return args[key] || '';\n });\n}\n\nasync function createPromptContext(startingDir: string) {\n const serverConfigReady = (() => {\n try {\n return typeof (ServerConfig as any).isInitialized === 'function' &&\n (ServerConfig as any).isInitialized();\n } catch {\n return false;\n }\n })();\n if (serverConfigReady) {\n const serverContext = (() => {\n try {\n return typeof (ServerConfig as any).getContext === 'function'\n ? (ServerConfig as any).getContext()\n : null;\n } catch {\n return null;\n }\n })();\n if (serverContext?.hasContext()) {\n return serverContext;\n }\n\n const configFile = (() => {\n try {\n return typeof (ServerConfig as any).getServerConfig === 'function'\n ? ((ServerConfig as any).getServerConfig().configFile as { contextDirectories?: string[] } | null)\n : null;\n } catch {\n return null;\n }\n })();\n const rawDirs = configFile?.contextDirectories;\n const workspaceRoot = (() => {\n try {\n return typeof (ServerConfig as any).getWorkspaceRoot === 'function'\n ? (ServerConfig as any).getWorkspaceRoot()\n : null;\n } catch {\n return null;\n }\n })();\n const effectiveDir = workspaceRoot || startingDir;\n const contextDirs = rawDirs && rawDirs.length > 0\n ? rawDirs.map(d => (isAbsolute(d) ? d : resolve(effectiveDir, d)))\n : undefined;\n return Context.create({\n startingDir: effectiveDir,\n contextDirectories: contextDirs,\n });\n }\n\n return Context.create({\n startingDir,\n });\n}\n\n/**\n * Get all available prompts\n */\nexport function getPrompts(): McpPrompt[] {\n return [\n {\n name: 'how_to_use_protokoll',\n description: 'Essential instructions for AI assistants on how to properly interact with Protokoll. ' +\n 'READ THIS FIRST before working with transcripts. Explains which tools to use and which to avoid.',\n arguments: [],\n },\n {\n name: 'transcribe_with_context',\n description: 'Intelligently transcribe audio with context discovery and project routing. ' +\n 'Guides you through finding the right configuration and confirms before processing.',\n arguments: [\n {\n name: 'audioFile',\n description: 'Absolute path to the audio file to transcribe',\n required: true,\n },\n {\n name: 'skipDiscovery',\n description: 'Skip context discovery if you already know the configuration',\n required: false,\n },\n ],\n },\n {\n name: 'setup_project',\n description: 'Create a new project with smart assistance for generating metadata. ' +\n 'Analyzes source content to suggest sounds_like, trigger phrases, topics, and description.',\n arguments: [\n {\n name: 'projectName',\n description: 'Name of the project to create',\n required: true,\n },\n {\n name: 'sourceUrl',\n description: 'URL or file path to analyze for metadata suggestions',\n required: false,\n },\n {\n name: 'destination',\n description: 'Output directory for transcripts',\n required: false,\n },\n ],\n },\n {\n name: 'review_transcript',\n description: 'Analyze a transcript and suggest corrections based on context. ' +\n 'Identifies potential name/term errors and offers to apply fixes. ' +\n 'IMPORTANT: This prompt instructs the AI to use ONLY Protokoll MCP tools, never direct file editing.',\n arguments: [\n {\n name: 'transcriptPath',\n description: 'Path to the transcript to review',\n required: true,\n },\n {\n name: 'focusArea',\n description: 'What to focus on: names, terms, technical, or all (defaults to \"all\")',\n required: false,\n },\n ],\n },\n {\n name: 'identify_tasks_from_transcript',\n description: 'Identify task candidates from a transcript with a review-first flow. ' +\n 'Instructs the assistant to identify first, present candidates with none preselected, ' +\n 'and only create tasks after explicit user approval.',\n arguments: [\n {\n name: 'transcriptPath',\n description: 'Path or URI to the transcript to analyze',\n required: true,\n },\n {\n name: 'maxCandidates',\n description: 'Optional maximum number of task candidates to identify (default: 25)',\n required: false,\n },\n {\n name: 'includeTagSuggestions',\n description: 'Optional flag to include suggested tags (default: true)',\n required: false,\n },\n ],\n },\n {\n name: 'summarize_transcript',\n description: 'Create an audience-aware transcript summary with privacy guardrails and style presets.',\n arguments: [\n {\n name: 'transcriptPath',\n description: 'Path to the transcript to summarize',\n required: true,\n },\n {\n name: 'audience',\n description: 'Target audience for the summary (e.g. internal team, external attendee)',\n required: true,\n },\n {\n name: 'stylePreset',\n description: 'Summary style: quick_bullets, detailed, attendee_facing (default: detailed)',\n required: false,\n },\n {\n name: 'guidance',\n description: 'Additional instructions (especially privacy/sensitivity constraints)',\n required: false,\n },\n {\n name: 'summaryTitle',\n description: 'Optional title to use for the summary output',\n required: false,\n },\n ],\n },\n {\n name: 'enrich_entity',\n description: 'Add or update an entity with smart assistance for generating metadata.',\n arguments: [\n {\n name: 'entityType',\n description: 'Type: person, project, term, or company',\n required: true,\n },\n {\n name: 'entityName',\n description: 'Name of the entity',\n required: true,\n },\n {\n name: 'sourceUrl',\n description: 'URL or file path to analyze for metadata',\n required: false,\n },\n ],\n },\n {\n name: 'batch_transcription',\n description: 'Set up and execute batch transcription for a directory of audio files.',\n arguments: [\n {\n name: 'directory',\n description: 'Directory containing audio files',\n required: true,\n },\n {\n name: 'extensions',\n description: 'Comma-separated file extensions (default: m4a,mp3,wav,webm)',\n required: false,\n },\n ],\n },\n {\n name: 'find_and_analyze',\n description: 'Search for transcripts and analyze their content.',\n arguments: [\n {\n name: 'directory',\n description: 'Directory to search',\n required: true,\n },\n {\n name: 'query',\n description: 'Search query',\n required: false,\n },\n {\n name: 'startDate',\n description: 'Filter from date (YYYY-MM-DD)',\n required: false,\n },\n {\n name: 'endDate',\n description: 'Filter to date (YYYY-MM-DD)',\n required: false,\n },\n ],\n },\n {\n name: 'edit_entity',\n description: 'Edit an existing entity (person, term, or project) with manual modifications. ' +\n 'Unlike update tools that regenerate from sources, this allows direct edits like ' +\n 'adding specific sounds_like variants, changing fields, or modifying array properties.',\n arguments: [\n {\n name: 'entityType',\n description: 'Type of entity to edit: person, term, or project',\n required: true,\n },\n {\n name: 'entityId',\n description: 'ID of the entity to edit',\n required: true,\n },\n {\n name: 'modification',\n description: 'What to modify (e.g., \"add sounds_like variant\", \"change domain\", \"add topics\")',\n required: false,\n },\n ],\n },\n ];\n}\n\n/**\n * Get a prompt by name\n */\nexport async function getPrompt(\n name: string,\n args: Record<string, string>\n): Promise<McpPromptMessage[]> {\n // Validate prompt exists\n const prompts = getPrompts();\n const prompt = prompts.find(p => p.name === name);\n\n if (!prompt) {\n throw new Error(`Unknown prompt: ${name}`);\n }\n\n // Validate required arguments\n for (const arg of prompt.arguments || []) {\n if (arg.required && !args[arg.name]) {\n throw new Error(`Missing required argument: ${arg.name}`);\n }\n }\n\n // Generate messages based on prompt type\n switch (name) {\n case 'how_to_use_protokoll':\n return generateHowToUseProtokolPrompt(args);\n case 'transcribe_with_context':\n return generateTranscribePrompt(args);\n case 'setup_project':\n return generateSetupProjectPrompt(args);\n case 'review_transcript':\n return generateReviewTranscriptPrompt(args);\n case 'identify_tasks_from_transcript':\n return generateIdentifyTasksFromTranscriptPrompt(args);\n case 'summarize_transcript':\n return generateSummarizeTranscriptPrompt(args);\n case 'enrich_entity':\n return generateEnrichEntityPrompt(args);\n case 'batch_transcription':\n return generateBatchTranscriptionPrompt(args);\n case 'find_and_analyze':\n return generateFindAndAnalyzePrompt(args);\n case 'edit_entity':\n return generateEditEntityPrompt(args);\n default:\n throw new Error(`Prompt handler not implemented: ${name}`);\n }\n}\n\n// ============================================================================\n// Prompt Generators\n// ============================================================================\n\nasync function generateHowToUseProtokolPrompt(\n _args: Record<string, string>\n): Promise<McpPromptMessage[]> {\n const template = loadTemplate('how_to_use_protokoll');\n\n return [\n {\n role: 'user',\n content: {\n type: 'text',\n text: template,\n },\n },\n ];\n}\n\nasync function generateTranscribePrompt(\n args: Record<string, string>\n): Promise<McpPromptMessage[]> {\n const audioFile = args.audioFile;\n const skipDiscovery = args.skipDiscovery === 'true';\n\n if (!audioFile) {\n throw new Error('audioFile is required');\n }\n\n let discoverySection = '';\n\n if (skipDiscovery) {\n discoverySection = `I'll transcribe ${audioFile} using the current context configuration.\\n\\nWould you like me to start the transcription?`;\n } else {\n // Perform basic context discovery\n const audioPath = resolve(audioFile);\n\n try {\n await stat(audioPath);\n\n const context = await createPromptContext(dirname(audioPath));\n\n if (context.hasContext()) {\n const dirs = context.getDiscoveredDirs();\n const projects = context.getAllProjects().filter((p: { active?: boolean }) => p.active !== false);\n\n discoverySection = `## Context Discovery\\n\\n` +\n `**Configuration:** ${dirs[0]?.path}\\n` +\n `**Projects:** ${projects.length} active\\n` +\n `**Context URI:** ${buildConfigUri(dirs[0]?.path)}\\n` +\n `**Projects URI:** ${buildEntitiesListUri('project')}\\n\\n` +\n `Ready to transcribe with context-aware enhancement.`;\n } else {\n discoverySection = `## No Context Found\\n\\nProcessing without context (basic transcription only).`;\n }\n } catch {\n discoverySection = `## File Check Failed\\n\\nUnable to access: ${audioFile}`;\n }\n }\n\n const template = loadTemplate('transcribe_with_context');\n const content = fillTemplate(template, { audioFile, discoverySection });\n\n return [\n {\n role: 'user',\n content: {\n type: 'text',\n text: content,\n },\n },\n ];\n}\n\nasync function generateSetupProjectPrompt(\n args: Record<string, string>\n): Promise<McpPromptMessage[]> {\n const projectName = args.projectName;\n\n if (!projectName) {\n throw new Error('projectName is required');\n }\n\n const sourceUrlLine = args.sourceUrl\n ? `\\n - sourceUrl: \"${args.sourceUrl}\" (for metadata analysis)`\n : '';\n const destinationLine = args.destination\n ? `\\n - destination: \"${args.destination}\"`\n : '';\n\n const template = loadTemplate('setup_project');\n const content = fillTemplate(template, {\n projectName,\n sourceUrlLine,\n destinationLine\n });\n\n return [\n {\n role: 'user',\n content: {\n type: 'text',\n text: content,\n },\n },\n ];\n}\n\nasync function generateReviewTranscriptPrompt(\n args: Record<string, string>\n): Promise<McpPromptMessage[]> {\n const transcriptPath = args.transcriptPath;\n\n if (!transcriptPath) {\n throw new Error('transcriptPath is required');\n }\n\n const focusArea = args.focusArea || 'all';\n const focusText = focusArea === 'all' ? 'All corrections' : focusArea;\n\n const template = loadTemplate('review_transcript');\n const content = fillTemplate(template, {\n transcriptPath,\n focusArea: focusText\n });\n\n return [\n {\n role: 'user',\n content: {\n type: 'text',\n text: content,\n },\n },\n ];\n}\n\nasync function generateIdentifyTasksFromTranscriptPrompt(\n args: Record<string, string>\n): Promise<McpPromptMessage[]> {\n const transcriptPath = args.transcriptPath;\n if (!transcriptPath) {\n throw new Error('transcriptPath is required');\n }\n\n const maxCandidates = args.maxCandidates?.trim() || '25';\n const includeTagSuggestions = args.includeTagSuggestions?.trim() || 'true';\n\n const template = loadTemplate('identify_tasks_from_transcript');\n const content = fillTemplate(template, {\n transcriptPath,\n maxCandidates,\n includeTagSuggestions,\n });\n\n return [\n {\n role: 'user',\n content: {\n type: 'text',\n text: content,\n },\n },\n ];\n}\n\nasync function generateSummarizeTranscriptPrompt(\n args: Record<string, string>\n): Promise<McpPromptMessage[]> {\n const transcriptPath = args.transcriptPath;\n const audience = args.audience;\n\n if (!transcriptPath) {\n throw new Error('transcriptPath is required');\n }\n if (!audience) {\n throw new Error('audience is required');\n }\n\n const presetMap: Record<string, { label: string; instructions: string }> = {\n quick_bullets: {\n label: 'Quick paragraph + bullet points',\n instructions: 'Write one concise paragraph followed by 4-8 bullets covering decisions, actions, and risks.',\n },\n detailed: {\n label: 'Detailed summary',\n instructions: 'Write a structured summary with context, key discussion points, decisions, open questions, and next steps.',\n },\n attendee_facing: {\n label: 'Attendee-facing summary',\n instructions: 'Write a professional external-facing summary suitable for attendees; avoid private/internal reflections unless explicitly approved.',\n },\n };\n const presetKey = (args.stylePreset || 'detailed').trim();\n const selectedPreset = presetMap[presetKey] ?? presetMap.detailed;\n\n const summaryTitleLine = args.summaryTitle?.trim()\n ? `- Target title: \"${args.summaryTitle.trim()}\"`\n : '- Target title: (auto-generate from transcript title and date)';\n const guidanceBlock = args.guidance?.trim()\n ? args.guidance.trim()\n : 'No extra guidance provided.';\n\n const template = loadTemplate('summarize_transcript');\n const content = fillTemplate(template, {\n transcriptPath,\n audience: audience.trim(),\n styleLabel: selectedPreset.label,\n styleInstructions: selectedPreset.instructions,\n summaryTitleLine,\n guidanceBlock,\n });\n\n return [\n {\n role: 'user',\n content: {\n type: 'text',\n text: content,\n },\n },\n ];\n}\n\nasync function generateEnrichEntityPrompt(\n args: Record<string, string>\n): Promise<McpPromptMessage[]> {\n const template = loadTemplate('enrich_entity');\n const content = fillTemplate(template, args);\n\n return [\n {\n role: 'user',\n content: {\n type: 'text',\n text: content,\n },\n },\n ];\n}\n\nasync function generateBatchTranscriptionPrompt(\n args: Record<string, string>\n): Promise<McpPromptMessage[]> {\n const template = loadTemplate('batch_transcription');\n const content = fillTemplate(template, args);\n\n return [\n {\n role: 'user',\n content: {\n type: 'text',\n text: content,\n },\n },\n ];\n}\n\nasync function generateFindAndAnalyzePrompt(\n args: Record<string, string>\n): Promise<McpPromptMessage[]> {\n const template = loadTemplate('find_and_analyze');\n const content = fillTemplate(template, args);\n\n return [\n {\n role: 'user',\n content: {\n type: 'text',\n text: content,\n },\n },\n ];\n}\n\nasync function generateEditEntityPrompt(\n args: Record<string, string>\n): Promise<McpPromptMessage[]> {\n const entityType = args.entityType;\n const entityId = args.entityId;\n const modification = args.modification || '';\n\n if (!entityType || !entityId) {\n throw new Error('entityType and entityId are required');\n }\n\n const userMessage = modification\n ? `I want to edit the ${entityType} \"${entityId}\": ${modification}`\n : `I want to edit the ${entityType} \"${entityId}\"`;\n\n let entityGuidance = '';\n\n // Provide guidance based on entity type\n if (entityType === 'person') {\n entityGuidance = `**Available modifications for people:**\\n` +\n `- \\`name\\`, \\`firstName\\`, \\`lastName\\` - Update name fields\\n` +\n `- \\`company\\`, \\`role\\`, \\`context\\` - Update association info\\n` +\n `- \\`sounds_like\\` - Replace all phonetic variants\\n` +\n `- \\`add_sounds_like\\` - Add new phonetic variants\\n` +\n `- \\`remove_sounds_like\\` - Remove specific variants\\n\\n` +\n `**To proceed:**\\n` +\n `1. First, call \\`protokoll_get_entity\\` to see current values:\\n` +\n ` - entityType: \"person\"\\n` +\n ` - entityId: \"${entityId}\"\\n\\n` +\n `2. Then call \\`protokoll_edit_person\\` with the changes:\\n` +\n ` - id: \"${entityId}\"\\n` +\n ` - [your modifications]\\n`;\n } else if (entityType === 'term') {\n entityGuidance = `**Available modifications for terms:**\\n` +\n `- \\`expansion\\`, \\`domain\\`, \\`description\\` - Update basic fields\\n` +\n `- \\`sounds_like\\` - Replace all phonetic variants\\n` +\n `- \\`add_sounds_like\\` - Add new phonetic variants\\n` +\n `- \\`remove_sounds_like\\` - Remove specific variants\\n` +\n `- \\`topics\\` / \\`add_topics\\` / \\`remove_topics\\` - Modify topic keywords\\n` +\n `- \\`projects\\` / \\`add_projects\\` / \\`remove_projects\\` - Modify project associations\\n\\n` +\n `**To proceed:**\\n` +\n `1. First, call \\`protokoll_get_entity\\` to see current values:\\n` +\n ` - entityType: \"term\"\\n` +\n ` - entityId: \"${entityId}\"\\n\\n` +\n `2. Then call \\`protokoll_edit_term\\` with the changes:\\n` +\n ` - id: \"${entityId}\"\\n` +\n ` - [your modifications]\\n`;\n } else if (entityType === 'project') {\n entityGuidance = `**Available modifications for projects:**\\n` +\n `- \\`name\\`, \\`description\\` - Update basic info\\n` +\n `- \\`destination\\`, \\`structure\\` - Update routing\\n` +\n `- \\`contextType\\`, \\`active\\` - Update classification\\n` +\n `- \\`sounds_like\\` / \\`add_sounds_like\\` / \\`remove_sounds_like\\` - Phonetic variants\\n` +\n `- \\`topics\\` / \\`add_topics\\` / \\`remove_topics\\` - Topic keywords\\n` +\n `- \\`explicit_phrases\\` / \\`add_explicit_phrases\\` / \\`remove_explicit_phrases\\` - Trigger phrases\\n\\n` +\n `**To proceed:**\\n` +\n `1. First, call \\`protokoll_get_entity\\` to see current values:\\n` +\n ` - entityType: \"project\"\\n` +\n ` - entityId: \"${entityId}\"\\n\\n` +\n `2. Then call \\`protokoll_edit_project\\` with the changes:\\n` +\n ` - id: \"${entityId}\"\\n` +\n ` - [your modifications]\\n`;\n } else {\n entityGuidance = `**Note:** Entity type \"${entityType}\" does not support direct editing.\\n` +\n `Supported types: person, term, project\\n`;\n }\n\n const modificationNote = modification\n ? `\\n**Requested modification:** \"${modification}\"\\nWould you like me to retrieve the current entity and apply this change?`\n : '';\n\n const template = loadTemplate('edit_entity');\n const content = fillTemplate(template, {\n userMessage,\n entityType,\n entityId,\n entityGuidance,\n modificationNote\n });\n\n return [\n {\n role: 'user',\n content: {\n type: 'text',\n text: content,\n },\n },\n ];\n}\n\n// ============================================================================\n// MCP Protocol Handlers\n// ============================================================================\n\n/**\n * Export prompts list for testing and handler\n */\nexport const prompts = getPrompts();\n\n/**\n * Handle ListPrompts request\n */\nexport function handleListPrompts() {\n return { prompts };\n}\n\n/**\n * Handle GetPrompt request\n */\nexport async function handleGetPrompt(name: string, args: Record<string, string>) {\n const messages = await getPrompt(name, args);\n return { messages };\n}\n","/**\n * Discovery Tools - Configuration discovery and project suggestion\n */\n// eslint-disable-next-line import/extensions\nimport type { Tool } from '@modelcontextprotocol/sdk/types.js';\nimport { resolve, dirname } from 'node:path';\nimport { stat } from 'node:fs/promises';\nimport * as Context from '@/context';\nimport { fileExists, sanitizePath, type DiscoveredConfig, type ProjectSuggestion } from './shared';\n\n// ============================================================================\n// Helper Functions\n// ============================================================================\n\n/**\n * Walk up the directory tree from a starting path to find .protokoll directories\n */\nexport async function findProtokolkConfigs(startPath: string, maxLevels: number = 10): Promise<string[]> {\n const configs: string[] = [];\n let currentPath = resolve(startPath);\n let levels = 0;\n\n while (levels < maxLevels) {\n const protokollPath = resolve(currentPath, '.protokoll');\n if (await fileExists(protokollPath)) {\n configs.push(protokollPath);\n }\n\n const parentPath = dirname(currentPath);\n if (parentPath === currentPath) break; // Reached root\n currentPath = parentPath;\n levels++;\n }\n\n return configs;\n}\n\n/**\n * Get information about a .protokoll configuration\n */\nexport async function getConfigInfo(protokollPath: string): Promise<DiscoveredConfig> {\n const context = await Context.create({ startingDir: dirname(protokollPath) });\n const config = context.getConfig();\n\n return {\n path: protokollPath,\n projectCount: context.getAllProjects().length,\n peopleCount: context.getAllPeople().length,\n termsCount: context.getAllTerms().length,\n companiesCount: context.getAllCompanies().length,\n outputDirectory: config.outputDirectory as string | undefined,\n model: config.model as string | undefined,\n };\n}\n\n/**\n * Suggest which project an audio file might belong to based on its location\n */\nexport async function suggestProjectsForFile(audioFile: string): Promise<{\n configs: DiscoveredConfig[];\n suggestions: ProjectSuggestion[];\n needsUserInput: boolean;\n message: string;\n}> {\n const audioPath = resolve(audioFile);\n const audioDir = dirname(audioPath);\n\n // Find all .protokoll configs in the hierarchy\n const configPaths = await findProtokolkConfigs(audioDir);\n\n if (configPaths.length === 0) {\n return {\n configs: [],\n suggestions: [],\n needsUserInput: true,\n message: `No .protokoll configuration found for ${audioFile}. ` +\n 'You can either: (1) Create a .protokoll directory with project configuration, ' +\n 'or (2) Specify a contextDirectory when calling protokoll_process_audio.',\n };\n }\n\n // Get info about each config\n const configs: DiscoveredConfig[] = [];\n const allSuggestions: ProjectSuggestion[] = [];\n\n for (const configPath of configPaths) {\n const info = await getConfigInfo(configPath);\n configs.push(info);\n\n // Get context to check projects\n const context = await Context.create({ startingDir: dirname(configPath) });\n const projects = context.getAllProjects().filter(p => p.active !== false);\n\n for (const project of projects) {\n // Check if the audio file's path matches any project's destination\n const destination = project.routing?.destination;\n if (destination) {\n const expandedDest = destination.startsWith('~')\n ? destination.replace('~', process.env.HOME || '')\n : destination;\n\n if (audioDir.includes(expandedDest) || expandedDest.includes(audioDir)) {\n allSuggestions.push({\n projectId: project.id,\n projectName: project.name,\n confidence: 0.9,\n reason: `Audio file is in or near project destination: ${destination}`,\n destination,\n });\n }\n }\n\n // Check if project has associated directories/paths\n if (project.classification?.explicit_phrases) {\n // Check if any phrases match the directory name\n const dirName = audioDir.split('/').pop() || '';\n for (const phrase of project.classification.explicit_phrases) {\n if (dirName.toLowerCase().includes(phrase.toLowerCase())) {\n allSuggestions.push({\n projectId: project.id,\n projectName: project.name,\n confidence: 0.7,\n reason: `Directory name matches project phrase: \"${phrase}\"`,\n destination: project.routing?.destination,\n });\n }\n }\n }\n }\n }\n\n // Deduplicate and sort suggestions by confidence\n const uniqueSuggestions = allSuggestions\n .filter((s, i, arr) => arr.findIndex(x => x.projectId === s.projectId) === i)\n .sort((a, b) => b.confidence - a.confidence);\n\n if (uniqueSuggestions.length === 0) {\n return {\n configs,\n suggestions: [],\n needsUserInput: configs[0].projectCount > 0,\n message: configs[0].projectCount > 0\n ? `Found ${configs[0].projectCount} projects but couldn't automatically determine which one this file belongs to. ` +\n 'Please specify the project or let me list them for you.'\n : 'Configuration found but no projects defined. Transcripts will use default routing.',\n };\n }\n\n if (uniqueSuggestions.length === 1 && uniqueSuggestions[0].confidence >= 0.8) {\n return {\n configs,\n suggestions: uniqueSuggestions,\n needsUserInput: false,\n message: `Detected project: ${uniqueSuggestions[0].projectName} (${uniqueSuggestions[0].reason})`,\n };\n }\n\n return {\n configs,\n suggestions: uniqueSuggestions,\n needsUserInput: true,\n message: `Found ${uniqueSuggestions.length} possible projects. Please confirm which project this file belongs to.`,\n };\n}\n\n// ============================================================================\n// Tool Definitions\n// ============================================================================\n\nexport const discoverConfigTool: Tool = {\n name: 'protokoll_discover_config',\n description:\n 'Discover Protokoll configurations for a given file or directory. ' +\n 'Walks up the directory tree to find .protokoll directories and returns information about each, ' +\n 'including project counts, people, terms, and output settings. ' +\n 'ALWAYS call this first when asked to transcribe a file to understand the available context. ' +\n 'This helps determine which project configuration to use.',\n inputSchema: {\n type: 'object',\n properties: {\n path: {\n type: 'string',\n description: 'Path to a file or directory to search from (searches up the tree)',\n },\n },\n required: ['path'],\n },\n};\n\nexport const suggestProjectTool: Tool = {\n name: 'protokoll_suggest_project',\n description:\n 'Suggest which project(s) an audio file might belong to based on its location. ' +\n 'Analyzes the file path against configured projects to determine the best match. ' +\n 'Returns suggestions with confidence levels and reasons. ' +\n 'If multiple projects match or no clear match is found, the response indicates that user input is needed.',\n inputSchema: {\n type: 'object',\n properties: {\n audioFile: {\n type: 'string',\n description: 'Path to the audio file to analyze',\n },\n },\n required: ['audioFile'],\n },\n};\n\n// ============================================================================\n// Tool Handlers\n// ============================================================================\n\nexport async function handleDiscoverConfig(args: { path: string }) {\n const searchPath = resolve(args.path);\n\n // Check if path exists\n if (!await fileExists(searchPath)) {\n throw new Error(`Path not found: ${searchPath}`);\n }\n\n // Determine if it's a file or directory\n const pathStat = await stat(searchPath);\n const startDir = pathStat.isDirectory() ? searchPath : dirname(searchPath);\n\n // Find all .protokoll configs\n const configPaths = await findProtokolkConfigs(startDir);\n\n // Get workspace root for path sanitization\n const ServerConfig = await import('../serverConfig');\n const workspaceRoot = ServerConfig.getWorkspaceRoot() || process.cwd();\n\n if (configPaths.length === 0) {\n // Sanitize searchedFrom path\n const sanitizedSearchedFrom = await sanitizePath(startDir, workspaceRoot);\n return {\n found: false,\n searchedFrom: sanitizedSearchedFrom,\n configs: [],\n message: 'No .protokoll configuration found in the directory hierarchy. ' +\n 'To use Protokoll, create a .protokoll directory with your context files (people, projects, terms).',\n suggestion: 'Run \"protokoll --init-config\" in your project directory to create initial configuration.',\n };\n }\n\n // Get info about each config and sanitize paths\n const configs: DiscoveredConfig[] = [];\n for (const configPath of configPaths) {\n const info = await getConfigInfo(configPath);\n // Sanitize the path in the config info\n const sanitizedPath = await sanitizePath(info.path, workspaceRoot);\n configs.push({\n ...info,\n path: sanitizedPath,\n });\n }\n\n // Primary config is the one closest to the search path\n const primaryConfig = configs[0];\n\n // Sanitize searchedFrom and primaryConfig paths\n const sanitizedSearchedFrom = await sanitizePath(startDir, workspaceRoot);\n\n return {\n found: true,\n searchedFrom: sanitizedSearchedFrom,\n primaryConfig: primaryConfig.path,\n configs,\n summary: {\n totalProjects: configs.reduce((sum, c) => sum + c.projectCount, 0),\n totalPeople: configs.reduce((sum, c) => sum + c.peopleCount, 0),\n totalTerms: configs.reduce((sum, c) => sum + c.termsCount, 0),\n totalCompanies: configs.reduce((sum, c) => sum + c.companiesCount, 0),\n },\n message: configs.length === 1\n ? `Found Protokoll configuration at ${primaryConfig.path}`\n : `Found ${configs.length} Protokoll configurations (using nearest: ${primaryConfig.path})`,\n };\n}\n\nexport async function handleSuggestProject(args: { audioFile: string }) {\n const audioFile = resolve(args.audioFile);\n\n if (!await fileExists(audioFile)) {\n throw new Error(`Audio file not found: ${audioFile}`);\n }\n\n const result = await suggestProjectsForFile(audioFile);\n\n return {\n audioFile,\n ...result,\n instructions: result.needsUserInput\n ? 'Please specify which project this file belongs to, or let me list available projects.'\n : 'Ready to process with the detected project configuration.',\n };\n}\n","/**\n * Audio Processing Tools - Process audio files through transcription pipeline\n */\n// eslint-disable-next-line import/extensions\nimport type { Tool } from '@modelcontextprotocol/sdk/types.js';\nimport { resolve, join, basename } from 'node:path';\nimport { mkdir, writeFile } from 'node:fs/promises';\nimport { tmpdir } from 'node:os';\nimport { glob } from 'glob';\nimport { Pipeline } from '@redaksjon/protokoll-engine';\nimport {\n DEFAULT_AUDIO_EXTENSIONS,\n DEFAULT_OUTPUT_STRUCTURE,\n DEFAULT_OUTPUT_FILENAME_OPTIONS,\n DEFAULT_MAX_AUDIO_SIZE,\n DEFAULT_INTERMEDIATE_DIRECTORY,\n DEFAULT_MODEL,\n DEFAULT_TRANSCRIPTION_MODEL,\n DEFAULT_REASONING_LEVEL,\n DEFAULT_TEMP_DIRECTORY,\n} from '@/constants';\nimport { fileExists, getAudioMetadata, getConfiguredDirectory, sanitizePath, type ProcessingResult } from './shared';\n\n// ============================================================================\n// Helper Functions\n// ============================================================================\n\n/**\n * Find an audio file by filename or partial filename\n * Searches in the workspace's configured input directory\n */\nasync function findAudioFile(\n filenameOrPath: string\n): Promise<string> {\n // If it's already an absolute path that exists, use it\n if (filenameOrPath.startsWith('/') && await fileExists(filenameOrPath)) {\n return filenameOrPath;\n }\n\n const ServerConfig = await import('../serverConfig');\n const inputStorage = ServerConfig.getInputStorage();\n\n // Get the input directory from workspace config\n const inputDirectory = await getConfiguredDirectory('inputDirectory');\n \n // Search for the audio file\n const entries = await inputStorage.listFiles('.');\n const matches: string[] = [];\n \n for (const entry of entries) {\n const filename = basename(entry);\n const ext = filename.split('.').pop()?.toLowerCase();\n \n // Check if it's an audio file\n if (ext && DEFAULT_AUDIO_EXTENSIONS.includes(ext)) {\n // Check if filename matches\n if (filename === filenameOrPath || \n filename.includes(filenameOrPath) ||\n basename(filename, `.${ext}`) === filenameOrPath) {\n matches.push(entry);\n }\n }\n }\n\n if (matches.length === 0) {\n throw new Error(\n `No audio file found matching \"${filenameOrPath}\" in ${inputDirectory}. ` +\n `Try using the protokoll://audio/inbound resource to see available audio files.`\n );\n }\n\n if (matches.length === 1) {\n const matchedPath = matches[0];\n if (inputStorage.name === 'filesystem') {\n return join(inputDirectory, matchedPath);\n }\n const contents = await inputStorage.readFile(matchedPath);\n const tempRoot = join(tmpdir(), 'protokoll-gcs-input');\n await mkdir(tempRoot, { recursive: true });\n const tempPath = join(\n tempRoot,\n `${Date.now()}-${Math.random().toString(36).slice(2)}-${basename(matchedPath)}`\n );\n await writeFile(tempPath, contents);\n return tempPath;\n }\n\n // Multiple matches\n const matchNames = matches.map((m) => basename(m)).join(', ');\n throw new Error(\n `Multiple audio files match \"${filenameOrPath}\": ${matchNames}. ` +\n `Please be more specific.`\n );\n}\n\n// ============================================================================\n// Tool Definitions\n// ============================================================================\n\nexport const processAudioTool: Tool = {\n name: 'protokoll_process_audio',\n description:\n 'Process an audio file through Protokoll\\'s intelligent transcription pipeline. ' +\n 'You can provide either an absolute path OR just a filename/partial filename. ' +\n 'If you provide a filename, it will search in the workspace\\'s configured input directory. ' +\n 'This tool uses workspace-level configuration automatically - no need to specify directories. ' +\n 'Transcribes audio using Whisper, then enhances it with context-aware processing ' +\n 'that corrects names, terms, and routes the output to the appropriate project folder. ' +\n 'Returns the enhanced transcript text and output file path.',\n inputSchema: {\n type: 'object',\n properties: {\n audioFile: {\n type: 'string',\n description: \n 'Filename, partial filename, or absolute path to the audio file. ' +\n 'Examples: \"recording.m4a\", \"2026-01-29\", \"/full/path/to/audio.m4a\"',\n },\n projectId: {\n type: 'string',\n description: 'Specific project ID to use for routing (helpful when multiple projects exist)',\n },\n outputDirectory: {\n type: 'string',\n description: 'Override the workspace output directory',\n },\n model: {\n type: 'string',\n description: 'LLM model for enhancement (default: gpt-5.2)',\n },\n transcriptionModel: {\n type: 'string',\n description: 'Transcription model (default: whisper-1)',\n },\n },\n required: ['audioFile'],\n },\n};\n\nexport const batchProcessTool: Tool = {\n name: 'protokoll_batch_process',\n description:\n 'Process multiple audio files in a directory. ' +\n 'If no directory is specified, uses the workspace\\'s configured input directory. ' +\n 'This tool uses workspace-level configuration automatically - no need to specify directories. ' +\n 'Finds all audio files matching the configured extensions and processes them sequentially. ' +\n 'Returns a summary of all processed files with their output paths.',\n inputSchema: {\n type: 'object',\n properties: {\n inputDirectory: {\n type: 'string',\n description: \n 'Optional: Directory containing audio files. ' +\n 'If not specified, uses the workspace input directory.',\n },\n extensions: {\n type: 'array',\n items: { type: 'string' },\n description: 'Audio file extensions to process (default: [\".m4a\", \".mp3\", \".wav\", \".webm\"])',\n },\n outputDirectory: {\n type: 'string',\n description: 'Override the workspace output directory',\n },\n },\n required: [],\n },\n};\n\n// ============================================================================\n// Tool Handlers\n// ============================================================================\n\nexport async function handleProcessAudio(args: {\n audioFile: string;\n projectId?: string;\n outputDirectory?: string;\n model?: string;\n transcriptionModel?: string;\n}): Promise<ProcessingResult> {\n // Import server config\n const ServerConfig = await import('../serverConfig');\n \n // Find the audio file (handles both paths and filenames)\n const audioFile = await findAudioFile(args.audioFile);\n\n // Get workspace configuration\n const config = ServerConfig.getServerConfig();\n const context = config.context;\n \n if (!context) {\n throw new Error('Protokoll context not available. Ensure .protokoll directory exists in workspace.');\n }\n\n // Get configuration from context\n const contextConfig = context.getConfig();\n const outputDirectory = args.outputDirectory || config.outputDirectory;\n const outputStructure = (contextConfig.outputStructure as string) || DEFAULT_OUTPUT_STRUCTURE;\n const outputFilenameOptions = (contextConfig.outputFilenameOptions as string[]) || DEFAULT_OUTPUT_FILENAME_OPTIONS;\n const processedDirectory = config.processedDirectory ?? undefined;\n\n // Get audio file metadata (creation time and hash)\n const { creationTime, hash } = await getAudioMetadata(audioFile);\n\n // Get weight model service for pipeline integration\n const { getWeightModelService, updateTranscriptInWeightModel } = await import('../services/weightModel');\n const weightModelService = getWeightModelService();\n\n // Create pipeline\n const pipeline = await Pipeline.create({\n model: args.model || DEFAULT_MODEL,\n transcriptionModel: args.transcriptionModel || DEFAULT_TRANSCRIPTION_MODEL,\n reasoningLevel: DEFAULT_REASONING_LEVEL,\n interactive: false, // MCP is non-interactive\n selfReflection: false,\n silent: true,\n debug: false,\n dryRun: false,\n contextDirectory: config.workspaceRoot || undefined,\n intermediateDir: DEFAULT_INTERMEDIATE_DIRECTORY,\n keepIntermediates: false,\n outputDirectory,\n outputStructure,\n outputFilenameOptions,\n processedDirectory: processedDirectory || undefined,\n maxAudioSize: DEFAULT_MAX_AUDIO_SIZE,\n tempDirectory: DEFAULT_TEMP_DIRECTORY,\n weightModelProvider: weightModelService?.provider,\n onTranscriptEntitiesUpdated: (uuid: string, entityIds: string[], projectId?: string) => {\n updateTranscriptInWeightModel(uuid, entityIds, projectId);\n },\n });\n\n // Process through pipeline\n const result = await pipeline.process({\n audioFile,\n creation: creationTime,\n hash,\n });\n\n // Sanitize outputPath to ensure no absolute paths are exposed\n const sanitizedOutputPath = await sanitizePath(result.outputPath, outputDirectory);\n\n return {\n outputPath: sanitizedOutputPath,\n enhancedText: result.enhancedText,\n rawTranscript: result.rawTranscript,\n routedProject: result.routedProject ?? undefined,\n routingConfidence: result.routingConfidence,\n processingTime: result.processingTime,\n toolsUsed: result.toolsUsed,\n correctionsApplied: result.correctionsApplied,\n };\n}\n\nexport async function handleBatchProcess(args: {\n inputDirectory?: string;\n extensions?: string[];\n outputDirectory?: string;\n}): Promise<{ processed: ProcessingResult[]; errors: { file: string; error: string }[] }> {\n // Get directory from args or workspace config\n const inputDir = args.inputDirectory \n ? resolve(args.inputDirectory)\n : await getConfiguredDirectory('inputDirectory');\n \n const extensions = args.extensions || ['.m4a', '.mp3', '.wav', '.webm'];\n\n if (!await fileExists(inputDir)) {\n throw new Error(`Input directory not found: ${inputDir}`);\n }\n\n const patterns = extensions.map(ext => `**/*${ext}`);\n const files = await glob(patterns, { cwd: inputDir, nodir: true, absolute: true });\n\n if (files.length === 0) {\n return { processed: [], errors: [] };\n }\n\n const processed: ProcessingResult[] = [];\n const errors: { file: string; error: string }[] = [];\n\n for (const file of files) {\n try {\n const result = await handleProcessAudio({\n audioFile: file,\n outputDirectory: args.outputDirectory,\n });\n processed.push(result);\n } catch (error) {\n // Sanitize file path in error to ensure no absolute paths are exposed\n const sanitizedFile = await sanitizePath(file, inputDir);\n errors.push({\n file: sanitizedFile,\n error: error instanceof Error ? error.message : String(error),\n });\n }\n }\n\n return { processed, errors };\n}\n","/**\n * Context Management Tools - View and search context entities\n */\n// eslint-disable-next-line import/extensions\nimport type { Tool } from '@modelcontextprotocol/sdk/types.js';\nimport type { ContextInstance } from '@/context';\nimport type { Company, Entity, EntityType, Person, Project, Term } from '@/context/types';\nimport { formatEntity, createToolContext } from './shared';\nimport { listContextEntitiesFromGcs } from '../resources/entityIndexService';\nimport { resolveCanonicalEntityId } from '../util/scopedEntityId';\nimport { \n findPersonResilient, \n findCompanyResilient, \n findTermResilient, \n findProjectResilient,\n findIgnoredResilient \n} from '@redaksjon/protokoll-engine';\n\n/**\n * Get the context instance from ServerConfig, or create a new one if not available\n */\nasync function getContextInstance(contextDirectory?: string): Promise<ContextInstance> {\n // Import here to avoid circular dependencies\n const ServerConfig = await import('../serverConfig');\n \n // Validate that contextDirectory is not provided in remote mode\n if (contextDirectory && ServerConfig.isRemoteMode()) {\n throw new Error(\n 'contextDirectory parameter is not accepted in remote mode. ' +\n 'This server is pre-configured with workspace directories from protokoll-config.yaml. ' +\n 'Use the protokoll_info tool to check server configuration.'\n );\n }\n \n // If server has an initialized context, use it\n const serverContext = ServerConfig.getContext();\n if (serverContext?.hasContext()) {\n return serverContext;\n }\n \n // Fallback: create context using server config's contextDirectories\n return createToolContext(contextDirectory);\n}\n\nfunction normalizeProjectId(value: string | null | undefined): string {\n if (typeof value !== 'string') {\n return '';\n }\n return resolveCanonicalEntityId(value).trim().toLowerCase();\n}\n\nfunction createAllowedProjectSet(allowedProjectIds?: string[]): Set<string> {\n return new Set(\n (allowedProjectIds || [])\n .map((projectId) => normalizeProjectId(projectId))\n .filter((projectId) => projectId.length > 0)\n );\n}\n\nfunction isProjectInScope(projectId: string | null | undefined, allowedProjectIds: Set<string>): boolean {\n const normalized = normalizeProjectId(projectId);\n return normalized.length > 0 && allowedProjectIds.has(normalized);\n}\n\nfunction hasScopedProjectReference(projectIds: string[] | undefined, allowedProjectIds: Set<string>): boolean {\n return (projectIds || []).some((projectId) => isProjectInScope(projectId, allowedProjectIds));\n}\n\n/** Collapse duplicate rows that share the same canonical UUID (e.g. \"uuid\" vs \"server:uuid\"). */\nfunction dedupeByCanonicalEntityId<T extends { id: string }>(items: T[]): T[] {\n const groups = new Map<string, T[]>();\n for (const item of items) {\n const key = resolveCanonicalEntityId(item.id).toLowerCase();\n const arr = groups.get(key) ?? [];\n arr.push(item);\n groups.set(key, arr);\n }\n const out: T[] = [];\n for (const group of groups.values()) {\n if (group.length === 1) {\n out.push(group[0]);\n continue;\n }\n const preferred =\n group.find((r) => r.id === resolveCanonicalEntityId(r.id)) ?? group[0];\n out.push(preferred);\n }\n return out;\n}\n\nasync function loadProjects(context: ContextInstance): Promise<Project[]> {\n const projects = context.getAllProjects() as Project[];\n if (projects.length > 0) {\n return projects;\n }\n\n const gcsProjects = await listContextEntitiesFromGcs('project');\n return gcsProjects\n .map((project) => ({\n id: String(project.id || ''),\n name: String(project.name || ''),\n type: 'project' as const,\n active: project.active !== false,\n routing: typeof project.routing === 'object' && project.routing !== null\n ? project.routing as Record<string, unknown>\n : undefined,\n classification: typeof project.classification === 'object' && project.classification !== null\n ? project.classification as Record<string, unknown>\n : undefined,\n }))\n .filter((project) => project.id.length > 0 && project.name.length > 0)\n .map((project) => ({\n ...project,\n routing: {\n destination: project.routing?.destination as string | undefined,\n structure: project.routing?.structure as string | undefined,\n },\n classification: {\n context_type: project.classification?.context_type as string | undefined,\n explicit_phrases: project.classification?.explicit_phrases as string[] | undefined,\n associated_people: project.classification?.associated_people as string[] | undefined,\n associated_companies: project.classification?.associated_companies as string[] | undefined,\n },\n })) as Project[];\n}\n\nasync function loadPeople(context: ContextInstance): Promise<Person[]> {\n const people = context.getAllPeople() as Person[];\n if (people.length > 0) {\n return people;\n }\n\n const gcsPeople = await listContextEntitiesFromGcs('person');\n return gcsPeople\n .map((person) => ({\n id: String(person.id || ''),\n name: String(person.name || ''),\n type: 'person' as const,\n company: typeof person.company === 'string' ? person.company : undefined,\n role: typeof person.role === 'string' ? person.role : undefined,\n sounds_like: Array.isArray(person.sounds_like) ? person.sounds_like as string[] : undefined,\n }))\n .filter((person) => person.id.length > 0 && person.name.length > 0) as Person[];\n}\n\nasync function loadTerms(context: ContextInstance): Promise<Term[]> {\n const terms = context.getAllTerms() as Term[];\n if (terms.length > 0) {\n return terms;\n }\n\n const gcsTerms = await listContextEntitiesFromGcs('term');\n return gcsTerms\n .map((term) => ({\n id: String(term.id || ''),\n name: String(term.name || ''),\n type: 'term' as const,\n expansion: typeof term.expansion === 'string' ? term.expansion : undefined,\n domain: typeof term.domain === 'string' ? term.domain : undefined,\n sounds_like: Array.isArray(term.sounds_like) ? term.sounds_like as string[] : undefined,\n projects: Array.isArray(term.projects) ? term.projects.filter((value): value is string => typeof value === 'string') : undefined,\n }))\n .filter((term) => term.id.length > 0 && term.name.length > 0) as Term[];\n}\n\nasync function loadCompanies(context: ContextInstance): Promise<Company[]> {\n const companies = context.getAllCompanies() as Company[];\n if (companies.length > 0) {\n return companies;\n }\n\n const gcsCompanies = await listContextEntitiesFromGcs('company');\n return gcsCompanies\n .map((company) => ({\n id: String(company.id || ''),\n name: String(company.name || ''),\n type: 'company' as const,\n fullName: typeof company.fullName === 'string' ? company.fullName : undefined,\n industry: typeof company.industry === 'string' ? company.industry : undefined,\n sounds_like: Array.isArray(company.sounds_like) ? company.sounds_like as string[] : undefined,\n }))\n .filter((company) => company.id.length > 0 && company.name.length > 0) as Company[];\n}\n\ninterface ProjectScopeState {\n allowedProjectIds: Set<string>;\n projects: Project[];\n associatedPeople: Set<string>;\n associatedCompanies: Set<string>;\n}\n\nasync function buildProjectScopeState(\n context: ContextInstance,\n allowedProjectIds?: string[],\n): Promise<ProjectScopeState | null> {\n const allowedProjectSet = createAllowedProjectSet(allowedProjectIds);\n if (allowedProjectSet.size === 0) {\n return null;\n }\n\n const projects = (await loadProjects(context)).filter((project) => isProjectInScope(project.id, allowedProjectSet));\n const associatedPeople = new Set<string>();\n const associatedCompanies = new Set<string>();\n\n for (const project of projects) {\n for (const personId of project.classification?.associated_people || []) {\n associatedPeople.add(personId);\n }\n for (const companyId of project.classification?.associated_companies || []) {\n associatedCompanies.add(companyId);\n }\n }\n\n return {\n allowedProjectIds: allowedProjectSet,\n projects,\n associatedPeople,\n associatedCompanies,\n };\n}\n\nfunction isEntityVisibleInProjectScope(entity: Entity, scope: ProjectScopeState): boolean {\n switch (entity.type) {\n case 'project':\n return isProjectInScope(entity.id, scope.allowedProjectIds);\n case 'person':\n return scope.associatedPeople.has(entity.id);\n case 'company':\n return scope.associatedCompanies.has(entity.id);\n case 'term':\n return hasScopedProjectReference((entity as Term).projects, scope.allowedProjectIds);\n default:\n return false;\n }\n}\n\n// ============================================================================\n// Tool Definitions\n// ============================================================================\n\nexport const contextStatusTool: Tool = {\n name: 'protokoll_context_status',\n description:\n 'Get the status of the Protokoll context system. ' +\n 'Shows discovered .protokoll directories, entity counts, and configuration status. ' +\n 'Use this to understand what context is available for transcription enhancement.',\n inputSchema: {\n type: 'object',\n properties: {\n contextDirectory: {\n type: 'string',\n description: 'Path to start searching for .protokoll directories (default: cwd)',\n },\n },\n required: [],\n },\n};\n\nexport const listProjectsTool: Tool = {\n name: 'protokoll_list_projects',\n description:\n 'List all projects configured in the context. ' +\n 'Projects define routing rules for where transcripts should be saved ' +\n 'and what classification signals trigger them.',\n inputSchema: {\n type: 'object',\n properties: {\n contextDirectory: {\n type: 'string',\n description: 'Path to the .protokoll context directory',\n },\n includeInactive: {\n type: 'boolean',\n description: 'Include inactive projects (default: false)',\n },\n limit: {\n type: 'number',\n description: 'Maximum number of results to return (default: 50)',\n },\n offset: {\n type: 'number',\n description: 'Number of results to skip for pagination (default: 0)',\n },\n search: {\n type: 'string',\n description: 'Filter by name/ID substring match (case-insensitive)',\n },\n },\n required: [],\n },\n};\n\nexport const listPeopleTool: Tool = {\n name: 'protokoll_list_people',\n description:\n 'List all people configured in the context. ' +\n 'People entries help Protokoll recognize and correctly spell names that ' +\n 'Whisper might mishear (using sounds_like phonetic variants).',\n inputSchema: {\n type: 'object',\n properties: {\n contextDirectory: {\n type: 'string',\n description: 'Path to the .protokoll context directory',\n },\n limit: {\n type: 'number',\n description: 'Maximum number of results to return (default: 50)',\n },\n offset: {\n type: 'number',\n description: 'Number of results to skip for pagination (default: 0)',\n },\n search: {\n type: 'string',\n description: 'Filter by name/ID substring match (case-insensitive)',\n },\n },\n required: [],\n },\n};\n\nexport const listTermsTool: Tool = {\n name: 'protokoll_list_terms',\n description:\n 'List all technical terms and abbreviations in the context. ' +\n 'Terms help Protokoll correctly transcribe domain-specific vocabulary.',\n inputSchema: {\n type: 'object',\n properties: {\n contextDirectory: {\n type: 'string',\n description: 'Path to the .protokoll context directory',\n },\n limit: {\n type: 'number',\n description: 'Maximum number of results to return (default: 50)',\n },\n offset: {\n type: 'number',\n description: 'Number of results to skip for pagination (default: 0)',\n },\n search: {\n type: 'string',\n description: 'Filter by name/ID substring match (case-insensitive)',\n },\n },\n required: [],\n },\n};\n\nexport const listCompaniesTool: Tool = {\n name: 'protokoll_list_companies',\n description:\n 'List all companies configured in the context. ' +\n 'Company entries help recognize organization names in transcripts.',\n inputSchema: {\n type: 'object',\n properties: {\n contextDirectory: {\n type: 'string',\n description: 'Path to the .protokoll context directory',\n },\n limit: {\n type: 'number',\n description: 'Maximum number of results to return (default: 50)',\n },\n offset: {\n type: 'number',\n description: 'Number of results to skip for pagination (default: 0)',\n },\n search: {\n type: 'string',\n description: 'Filter by name/ID substring match (case-insensitive)',\n },\n },\n required: [],\n },\n};\n\nexport const searchContextTool: Tool = {\n name: 'protokoll_search_context',\n description:\n 'Search across all context entity types (projects, people, terms, companies). ' +\n 'Returns matching entities with their type and key details.',\n inputSchema: {\n type: 'object',\n properties: {\n query: {\n type: 'string',\n description: 'Search query to match against entity names, IDs, and sounds_like variants',\n },\n contextDirectory: {\n type: 'string',\n description: 'Path to the .protokoll context directory',\n },\n limit: {\n type: 'number',\n description: 'Maximum number of results to return (default: 50)',\n },\n offset: {\n type: 'number',\n description: 'Number of results to skip for pagination (default: 0)',\n },\n },\n required: ['query'],\n },\n};\n\nexport const getEntityTool: Tool = {\n name: 'protokoll_get_entity',\n description:\n 'Get detailed information about a specific context entity. ' +\n 'Returns the full YAML configuration including sounds_like variants, routing, etc.',\n inputSchema: {\n type: 'object',\n properties: {\n entityType: {\n type: 'string',\n enum: ['project', 'person', 'term', 'company', 'ignored'],\n description: 'Type of entity to retrieve',\n },\n entityId: {\n type: 'string',\n description: 'ID of the entity to retrieve',\n },\n contextDirectory: {\n type: 'string',\n description: 'Path to the .protokoll context directory',\n },\n },\n required: ['entityType', 'entityId'],\n },\n};\n\nexport const predictEntitiesTool: Tool = {\n name: 'protokoll_predict_entities',\n description:\n 'Predict likely entities based on transcript context using weight model. ' +\n 'Returns ranked entity suggestions based on co-occurrence patterns and project affinity. ' +\n 'Useful for intelligent entity correction suggestions.',\n inputSchema: {\n type: 'object',\n properties: {\n transcriptPath: {\n type: 'string',\n description: 'Path to the transcript file',\n },\n maxPredictions: {\n type: 'number',\n description: 'Maximum number of predictions to return (default: 10)',\n minimum: 1,\n maximum: 50,\n },\n minScore: {\n type: 'number', \n description: 'Minimum prediction score (default: 1)',\n minimum: 0,\n },\n contextDirectory: {\n type: 'string',\n description: 'Path to the .protokoll context directory',\n },\n },\n required: ['transcriptPath'],\n },\n};\n\n// ============================================================================\n// Tool Handlers\n// ============================================================================\n\nexport async function handleContextStatus(args: { contextDirectory?: string; allowedProjectIds?: string[] }) {\n const context = await getContextInstance(args.contextDirectory);\n const scope = await buildProjectScopeState(context, args.allowedProjectIds);\n\n const dirs = context.getDiscoveredDirs();\n const config = context.getConfig();\n const projects = scope?.projects ?? await loadProjects(context);\n const people = scope\n ? (await loadPeople(context)).filter((person) => scope.associatedPeople.has(person.id))\n : await loadPeople(context);\n const terms = scope\n ? (await loadTerms(context)).filter((term) => hasScopedProjectReference(term.projects, scope.allowedProjectIds))\n : await loadTerms(context);\n const companies = scope\n ? (await loadCompanies(context)).filter((company) => scope.associatedCompanies.has(company.id))\n : await loadCompanies(context);\n\n return {\n hasContext: context.hasContext(),\n discoveredDirectories: dirs.map(d => ({\n path: d.path,\n level: d.level,\n isPrimary: d.level === 0,\n })),\n entityCounts: {\n projects: projects.length,\n people: people.length,\n terms: terms.length,\n companies: companies.length,\n ignored: scope ? 0 : context.getAllIgnored().length,\n },\n config: {\n outputDirectory: config.outputDirectory,\n outputStructure: config.outputStructure,\n model: config.model,\n },\n };\n}\n\nexport async function handleListProjects(args: { \n contextDirectory?: string; \n includeInactive?: boolean;\n limit?: number;\n offset?: number;\n search?: string;\n allowedProjectIds?: string[];\n}) {\n const context = await getContextInstance(args.contextDirectory);\n const scope = await buildProjectScopeState(context, args.allowedProjectIds);\n let projects = dedupeByCanonicalEntityId(scope?.projects ?? await loadProjects(context));\n if (!args.includeInactive) {\n projects = projects.filter(p => p.active !== false);\n }\n\n // Apply search filter\n if (args.search) {\n const searchLower = args.search.toLowerCase();\n projects = projects.filter(p => \n p.name.toLowerCase().includes(searchLower) ||\n p.id.toLowerCase().includes(searchLower)\n );\n }\n\n const total = projects.length;\n const limit = args.limit ?? 50;\n const offset = args.offset ?? 0;\n\n // Apply pagination\n const paginatedProjects = projects.slice(offset, offset + limit);\n\n return {\n total,\n limit,\n offset,\n count: paginatedProjects.length,\n projects: paginatedProjects.map(p => ({\n id: resolveCanonicalEntityId(p.id),\n name: p.name,\n active: p.active !== false,\n destination: p.routing?.destination,\n structure: p.routing?.structure,\n contextType: p.classification?.context_type,\n triggerPhrases: p.classification?.explicit_phrases,\n })),\n };\n}\n\nexport async function handleListPeople(args: { \n contextDirectory?: string;\n limit?: number;\n offset?: number;\n search?: string;\n allowedProjectIds?: string[];\n}) {\n const context = await getContextInstance(args.contextDirectory);\n const scope = await buildProjectScopeState(context, args.allowedProjectIds);\n let people = dedupeByCanonicalEntityId(await loadPeople(context));\n if (scope) {\n people = people.filter((person) => scope.associatedPeople.has(person.id));\n }\n\n // Apply search filter\n if (args.search) {\n const searchLower = args.search.toLowerCase();\n people = people.filter(p => \n p.name.toLowerCase().includes(searchLower) ||\n p.id.toLowerCase().includes(searchLower) ||\n p.sounds_like?.some(s => s.toLowerCase().includes(searchLower))\n );\n }\n\n const total = people.length;\n const limit = args.limit ?? 50;\n const offset = args.offset ?? 0;\n\n // Apply pagination\n const paginatedPeople = people.slice(offset, offset + limit);\n\n return {\n total,\n limit,\n offset,\n count: paginatedPeople.length,\n people: paginatedPeople.map(p => ({\n id: resolveCanonicalEntityId(p.id),\n name: p.name,\n company: p.company,\n role: p.role,\n sounds_like: p.sounds_like,\n })),\n };\n}\n\nexport async function handleListTerms(args: { \n contextDirectory?: string;\n limit?: number;\n offset?: number;\n search?: string;\n allowedProjectIds?: string[];\n}) {\n const context = await getContextInstance(args.contextDirectory);\n const scope = await buildProjectScopeState(context, args.allowedProjectIds);\n let terms = dedupeByCanonicalEntityId(await loadTerms(context));\n if (scope) {\n terms = terms.filter((term) => hasScopedProjectReference(term.projects, scope.allowedProjectIds));\n }\n\n // Apply search filter\n if (args.search) {\n const searchLower = args.search.toLowerCase();\n terms = terms.filter(t => \n t.name.toLowerCase().includes(searchLower) ||\n t.id.toLowerCase().includes(searchLower) ||\n t.sounds_like?.some(s => s.toLowerCase().includes(searchLower))\n );\n }\n\n const total = terms.length;\n const limit = args.limit ?? 50;\n const offset = args.offset ?? 0;\n\n // Apply pagination\n const paginatedTerms = terms.slice(offset, offset + limit);\n\n return {\n total,\n limit,\n offset,\n count: paginatedTerms.length,\n terms: paginatedTerms.map(t => ({\n id: resolveCanonicalEntityId(t.id),\n name: t.name,\n expansion: t.expansion,\n domain: t.domain,\n sounds_like: t.sounds_like,\n })),\n };\n}\n\nexport async function handleListCompanies(args: { \n contextDirectory?: string;\n limit?: number;\n offset?: number;\n search?: string;\n allowedProjectIds?: string[];\n}) {\n const context = await getContextInstance(args.contextDirectory);\n const scope = await buildProjectScopeState(context, args.allowedProjectIds);\n let companies = dedupeByCanonicalEntityId(await loadCompanies(context));\n if (scope) {\n companies = companies.filter((company) => scope.associatedCompanies.has(company.id));\n }\n\n // Apply search filter\n if (args.search) {\n const searchLower = args.search.toLowerCase();\n companies = companies.filter(c => \n c.name.toLowerCase().includes(searchLower) ||\n c.id.toLowerCase().includes(searchLower) ||\n c.sounds_like?.some(s => s.toLowerCase().includes(searchLower))\n );\n }\n\n const total = companies.length;\n const limit = args.limit ?? 50;\n const offset = args.offset ?? 0;\n\n // Apply pagination\n const paginatedCompanies = companies.slice(offset, offset + limit);\n\n return {\n total,\n limit,\n offset,\n count: paginatedCompanies.length,\n companies: paginatedCompanies.map(c => ({\n id: resolveCanonicalEntityId(c.id),\n name: c.name,\n fullName: c.fullName,\n industry: c.industry,\n sounds_like: c.sounds_like,\n })),\n };\n}\n\nexport async function handleSearchContext(args: { \n query: string; \n contextDirectory?: string;\n limit?: number;\n offset?: number;\n allowedProjectIds?: string[];\n}) {\n const context = await getContextInstance(args.contextDirectory);\n const scope = await buildProjectScopeState(context, args.allowedProjectIds);\n const results = scope\n ? context.search(args.query).filter((entity) => isEntityVisibleInProjectScope(entity, scope))\n : context.search(args.query);\n\n const total = results.length;\n const limit = args.limit ?? 50;\n const offset = args.offset ?? 0;\n\n // Apply pagination\n const paginatedResults = results.slice(offset, offset + limit);\n\n return {\n query: args.query,\n total,\n limit,\n offset,\n count: paginatedResults.length,\n results: paginatedResults.map(formatEntity),\n };\n}\n\nexport async function handleGetEntity(args: {\n entityType: EntityType;\n entityId: string;\n contextDirectory?: string;\n allowedProjectIds?: string[];\n}) {\n const context = await getContextInstance(args.contextDirectory);\n const scope = await buildProjectScopeState(context, args.allowedProjectIds);\n\n const entityId = resolveCanonicalEntityId(args.entityId.trim());\n\n let entity: Entity;\n switch (args.entityType) {\n case 'project':\n entity = findProjectResilient(context, entityId);\n break;\n case 'person':\n entity = findPersonResilient(context, entityId);\n break;\n case 'term':\n entity = findTermResilient(context, entityId);\n break;\n case 'company':\n entity = findCompanyResilient(context, entityId);\n break;\n case 'ignored':\n entity = findIgnoredResilient(context, entityId);\n break;\n default:\n throw new Error(`Unknown entity type: ${args.entityType}`);\n }\n\n if (scope && !isEntityVisibleInProjectScope(entity, scope)) {\n throw new Error(`Project-scoped key cannot access ${args.entityType} \"${entityId}\".`);\n }\n\n const filePath = context.getEntityFilePath(entity);\n\n return {\n ...formatEntity(entity),\n filePath,\n };\n}\n\nexport async function handlePredictEntities(args: {\n transcriptPath: string;\n maxPredictions?: number;\n minScore?: number;\n contextDirectory?: string;\n}) {\n // Import transcript utilities\n const { resolveTranscriptPath } = await import('./shared');\n const { Transcript: TranscriptUtils } = await import('@redaksjon/protokoll-engine');\n const { ensurePklExtension } = TranscriptUtils;\n const { PklTranscript } = await import('@redaksjon/protokoll-format');\n \n const absolutePath = await resolveTranscriptPath(args.transcriptPath, args.contextDirectory);\n const pklPath = ensurePklExtension(absolutePath);\n \n const transcript = PklTranscript.open(pklPath, { readOnly: true });\n const projectId = transcript.metadata.project;\n const entities = transcript.metadata.entities || {};\n \n // Extract entity IDs from transcript metadata\n const knownEntityIds = [\n ...(entities.people || []).map(e => e.id),\n ...(entities.projects || []).map(e => e.id), \n ...(entities.terms || []).map(e => e.id),\n ...(entities.companies || []).map(e => e.id)\n ];\n \n transcript.close();\n \n const { getWeightModelService } = await import('../services/weightModel');\n const service = getWeightModelService();\n \n if (!service?.isReady || !service.provider) {\n return { success: true, predictions: [] };\n }\n \n const predictions = service.provider.predictLikelyEntities({\n knownEntityIds,\n projectId,\n maxPredictions: args.maxPredictions || 10,\n minScore: args.minScore ?? 1\n });\n \n return { success: true, predictions };\n}\n\n// --- Project plan summaries (Riotplan / extended project YAML) ----------------------------\n\nconst PROJECT_PLAN_ARRAY_KEYS = ['related_plans', 'plans', 'riotplan_plans'] as const;\n\nfunction humanizePlanSlug(slug: string): string {\n const trimmed = slug.trim();\n const withoutPrefix = trimmed.replace(/^[0-9a-f]{8}-/i, '');\n const words = withoutPrefix.split(/[-_/]+/).filter(Boolean);\n if (words.length === 0) {\n return trimmed;\n }\n return words\n .map((w) => w.charAt(0).toUpperCase() + w.slice(1).toLowerCase())\n .join(' ');\n}\n\nfunction pickString(obj: Record<string, unknown>, keys: string[]): string {\n for (const k of keys) {\n const v = obj[k];\n if (typeof v === 'string' && v.trim().length > 0) {\n return v.trim();\n }\n }\n return '';\n}\n\nfunction pickCreatedMs(obj: Record<string, unknown>): number {\n const raw = pickString(obj, ['createdAt', 'created_at', 'created', 'date', 'startedAt', 'started_at']);\n if (!raw) {\n return NaN;\n }\n const t = Date.parse(raw);\n return Number.isNaN(t) ? NaN : t;\n}\n\nfunction normalizePlanRow(raw: unknown, index: number): {\n id: string;\n title: string;\n stage: string;\n createdAt: string | null;\n createdMs: number;\n} {\n if (typeof raw === 'string') {\n const id = raw.trim();\n return {\n id: id || `row-${index}`,\n title: humanizePlanSlug(id),\n stage: '',\n createdAt: null,\n createdMs: NaN,\n };\n }\n if (raw && typeof raw === 'object' && !Array.isArray(raw)) {\n const o = raw as Record<string, unknown>;\n const id =\n pickString(o, ['id', 'planId', 'plan_id', 'folder', 'slug', 'path', 'name']) || `row-${index}`;\n const explicitTitle = pickString(o, ['title', 'label', 'displayName', 'planTitle', 'summary']);\n const title =\n explicitTitle.length > 0\n ? explicitTitle\n : humanizePlanSlug(\n pickString(o, ['folder', 'slug', 'path', 'id', 'planId', 'plan_id']) || id,\n );\n const stage = pickString(o, ['stage', 'status', 'state', 'phase', 'category']);\n const createdRaw = pickString(o, ['createdAt', 'created_at', 'created', 'date', 'startedAt']);\n const createdMs = pickCreatedMs(o);\n return {\n id,\n title,\n stage,\n createdAt: createdRaw || null,\n createdMs,\n };\n }\n return {\n id: `row-${index}`,\n title: '',\n stage: '',\n createdAt: null,\n createdMs: NaN,\n };\n}\n\nfunction collectPlanRowsFromProjectRecord(record: Record<string, unknown>): unknown[] {\n const rows: unknown[] = [];\n for (const k of PROJECT_PLAN_ARRAY_KEYS) {\n const v = record[k];\n if (Array.isArray(v)) {\n rows.push(...v);\n }\n }\n return rows;\n}\n\nexport const listProjectPlansTool: Tool = {\n name: 'protokoll_list_project_plans',\n description:\n 'List plans associated with a project entity (from related_plans / plans / riotplan_plans on the project YAML). ' +\n 'Supports limit/offset pagination. Used by clients instead of embedding full plan lists in the project resource.',\n inputSchema: {\n type: 'object',\n properties: {\n projectId: {\n type: 'string',\n description: 'Project entity UUID',\n },\n limit: {\n type: 'number',\n description: 'Page size (default 25, max 100)',\n },\n offset: {\n type: 'number',\n description: 'Number of plans to skip (default 0)',\n },\n contextDirectory: {\n type: 'string',\n description: 'Path to the .protokoll context directory',\n },\n },\n required: ['projectId'],\n },\n};\n\nexport async function handleListProjectPlans(args: {\n projectId: string;\n limit?: number;\n offset?: number;\n contextDirectory?: string;\n allowedProjectIds?: string[];\n}) {\n const context = await getContextInstance(args.contextDirectory);\n const scope = await buildProjectScopeState(context, args.allowedProjectIds);\n\n const projectId = resolveCanonicalEntityId(args.projectId.trim());\n const entity = findProjectResilient(context, projectId);\n if (scope && !isEntityVisibleInProjectScope(entity, scope)) {\n throw new Error(`Project-scoped key cannot access project \"${projectId}\".`);\n }\n\n const record = entity as unknown as Record<string, unknown>;\n const allRows = collectPlanRowsFromProjectRecord(record);\n const normalized = allRows.map((r, i) => normalizePlanRow(r, i));\n normalized.sort((a, b) => {\n const da = Number.isNaN(a.createdMs) ? -Infinity : a.createdMs;\n const db = Number.isNaN(b.createdMs) ? -Infinity : b.createdMs;\n if (db !== da) {\n return db - da;\n }\n return a.title.localeCompare(b.title, undefined, { sensitivity: 'base' });\n });\n\n const limit = Math.min(100, Math.max(1, args.limit ?? 25));\n const offset = Math.max(0, args.offset ?? 0);\n const page = normalized.slice(offset, offset + limit);\n const plans = page.map((p) => ({\n id: p.id,\n title: p.title,\n stage: p.stage,\n createdAt: p.createdAt,\n }));\n\n return {\n total: normalized.length,\n limit,\n offset,\n count: plans.length,\n plans,\n };\n}\n","/* eslint-disable import/extensions */\n/**\n * Entity Tools - Create, update, delete, and manage context entities\n */\n \nimport { randomUUID } from 'crypto';\nimport type { Tool } from '@modelcontextprotocol/sdk/types.js';\nimport type { Person, Project, Term, Company, Entity, EntityRelationship } from '@/context/types';\nimport { \n findPersonResilient, \n findTermResilient, \n findCompanyResilient, \n findProjectResilient,\n findIgnoredResilient \n} from '@redaksjon/protokoll-engine';\n \nimport { formatEntity, slugify, mergeArray, createToolContext } from './shared.js';\nimport { markContextEntityIndexDirty } from '../resources/entityIndexService';\n\n/**\n * Check if a string is a valid UUID\n */\nfunction isValidUUID(str: string): boolean {\n const uuidRegex = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;\n return uuidRegex.test(str);\n}\n\nfunction resolveCanonicalEntityId(providedId: string | undefined): string {\n if (providedId === undefined) {\n return randomUUID();\n }\n const normalized = providedId.trim();\n if (!normalized) {\n return randomUUID();\n }\n if (!isValidUUID(normalized)) {\n throw new Error(`Invalid id \"${providedId}\". Entity IDs must be UUIDs.`);\n }\n return normalized;\n}\n\nasync function assertContextAvailableForEntityEdit(context: { hasContext(): boolean }): Promise<void> {\n if (context.hasContext()) {\n return;\n }\n\n const ServerConfig = await import('../serverConfig');\n if (ServerConfig.getStorageConfig().backend === 'gcs') {\n return;\n }\n\n throw new Error('No .protokoll directory found. Initialize context first.');\n}\n\nasync function markEntityIndexDirtyIfGcs(entityType?: 'person' | 'project' | 'term' | 'company' | 'ignored'): Promise<void> {\n const ServerConfig = await import('../serverConfig');\n if (ServerConfig.getStorageConfig().backend !== 'gcs') {\n return;\n }\n markContextEntityIndexDirty(entityType);\n}\n\n// ============================================================================\n// Tool Definitions\n// ============================================================================\n\nexport const addPersonTool: Tool = {\n name: 'protokoll_add_person',\n description:\n 'Add a new person to the context. ' +\n 'People entries help Protokoll recognize names that Whisper mishears. ' +\n 'Include sounds_like variants for phonetic matching.',\n inputSchema: {\n type: 'object',\n properties: {\n name: {\n type: 'string',\n description: 'Full name of the person',\n },\n id: {\n type: 'string',\n description: 'Unique ID (default: slugified name)',\n },\n firstName: {\n type: 'string',\n description: 'First name',\n },\n lastName: {\n type: 'string',\n description: 'Last name',\n },\n company: {\n type: 'string',\n description: 'Company ID this person is associated with',\n },\n role: {\n type: 'string',\n description: 'Role or job title',\n },\n sounds_like: {\n type: 'array',\n items: { type: 'string' },\n description: 'Phonetic variants (how Whisper might mishear the name)',\n },\n context: {\n type: 'string',\n description: 'Additional context about this person',\n },\n contextDirectory: {\n type: 'string',\n description: 'Path to the .protokoll context directory',\n },\n },\n required: ['name'],\n },\n};\n\nexport const editPersonTool: Tool = {\n name: 'protokoll_edit_person',\n description:\n 'Edit an existing person with manual modifications. ' +\n 'Allows direct edits: adding specific sounds_like variants, changing company, role, etc. ' +\n 'For the sounds_like array, use add_sounds_like to append or remove_sounds_like to delete specific values, ' +\n 'or use sounds_like to replace the entire array.',\n inputSchema: {\n type: 'object',\n properties: {\n id: {\n type: 'string',\n description: 'Person ID to edit',\n },\n name: {\n type: 'string',\n description: 'Update the display name',\n },\n firstName: {\n type: 'string',\n description: 'Set the first name',\n },\n lastName: {\n type: 'string',\n description: 'Set the last name',\n },\n company: {\n type: 'string',\n description: 'Set the company ID this person is associated with',\n },\n role: {\n type: 'string',\n description: 'Set the role or job title',\n },\n context: {\n type: 'string',\n description: 'Set additional context about this person',\n },\n sounds_like: {\n type: 'array',\n items: { type: 'string' },\n description: 'Replace all sounds_like variants with this array',\n },\n add_sounds_like: {\n type: 'array',\n items: { type: 'string' },\n description: 'Add these sounds_like variants to existing ones',\n },\n remove_sounds_like: {\n type: 'array',\n items: { type: 'string' },\n description: 'Remove these sounds_like variants',\n },\n contextDirectory: {\n type: 'string',\n description: 'Path to the .protokoll context directory',\n },\n },\n required: ['id'],\n },\n};\n\nexport const addProjectTool: Tool = {\n name: 'protokoll_add_project',\n description:\n 'Add a new project to the context with optional smart assistance for generating metadata. ' +\n 'Projects define where transcripts should be routed based on classification signals. ' +\n 'Smart assistance auto-generates sounds_like (phonetic variants for transcription correction) and ' +\n 'explicit_phrases (content-matching trigger phrases for classification). ' +\n 'Provide a source URL or file path to also generate topics and description from content analysis.',\n inputSchema: {\n type: 'object',\n properties: {\n name: {\n type: 'string',\n description: 'Project name (required)',\n },\n id: {\n type: 'string',\n description: 'Unique ID (default: slugified name)',\n },\n source: {\n type: 'string',\n description: 'URL or file path to analyze for generating topics, description, sounds_like, and explicit_phrases (optional)',\n },\n destination: {\n type: 'string',\n description: 'Output directory for this project\\'s transcripts',\n },\n structure: {\n type: 'string',\n enum: ['none', 'year', 'month', 'day'],\n description: 'Directory structure (default: month)',\n },\n contextType: {\n type: 'string',\n enum: ['work', 'personal', 'mixed'],\n description: 'Context type for classification (default: work)',\n },\n explicit_phrases: {\n type: 'array',\n items: { type: 'string' },\n description: 'Content-matching trigger phrases for classification (auto-generated if smart assistance enabled)',\n },\n sounds_like: {\n type: 'array',\n items: { type: 'string' },\n description: 'Phonetic variants of project NAME for transcription correction (auto-generated if smart assistance enabled)',\n },\n topics: {\n type: 'array',\n items: { type: 'string' },\n description: 'Topic keywords for classification (auto-generated from source if provided)',\n },\n description: {\n type: 'string',\n description: 'Project description (auto-generated from source if provided)',\n },\n useSmartAssist: {\n type: 'boolean',\n description: 'Enable smart assistance for auto-generating metadata (default: true if configured)',\n },\n contextDirectory: {\n type: 'string',\n description: 'Path to the .protokoll context directory',\n },\n },\n required: ['name'],\n },\n};\n\nexport const editProjectTool: Tool = {\n name: 'protokoll_edit_project',\n description:\n 'Edit an existing project with manual modifications. Unlike protokoll_update_project (which regenerates from a source), ' +\n 'this allows direct edits: adding specific sounds_like variants, changing routing, modifying classification, managing relationships, etc. ' +\n 'For array fields (sounds_like, urls, topics, explicit_phrases, associated_people, associated_companies, children, siblings, related_terms), ' +\n 'use add_* to append or remove_* to delete specific values, or use the base field name to replace the entire array.',\n inputSchema: {\n type: 'object',\n properties: {\n id: {\n type: 'string',\n description: 'Project ID to edit',\n },\n name: {\n type: 'string',\n description: 'Update the project name',\n },\n description: {\n type: 'string',\n description: 'Set the project description',\n },\n destination: {\n type: 'string',\n description: 'Set the output directory for transcripts',\n },\n structure: {\n type: 'string',\n enum: ['none', 'year', 'month', 'day'],\n description: 'Set the directory structure',\n },\n contextType: {\n type: 'string',\n enum: ['work', 'personal', 'mixed'],\n description: 'Set the context type for classification',\n },\n active: {\n type: 'boolean',\n description: 'Set whether the project is active',\n },\n sounds_like: {\n type: 'array',\n items: { type: 'string' },\n description: 'Replace all sounds_like variants with this array',\n },\n add_sounds_like: {\n type: 'array',\n items: { type: 'string' },\n description: 'Add these sounds_like variants to existing ones',\n },\n remove_sounds_like: {\n type: 'array',\n items: { type: 'string' },\n description: 'Remove these sounds_like variants',\n },\n urls: {\n type: 'array',\n items: { type: 'string' },\n description: 'Replace all project URLs with this list (e.g. org homepage, documentation)',\n },\n add_urls: {\n type: 'array',\n items: { type: 'string' },\n description: 'Append these URLs to the project urls list',\n },\n remove_urls: {\n type: 'array',\n items: { type: 'string' },\n description: 'Remove these URLs from the project urls list',\n },\n topics: {\n type: 'array',\n items: { type: 'string' },\n description: 'Replace all classification topics with this array',\n },\n add_topics: {\n type: 'array',\n items: { type: 'string' },\n description: 'Add these topics to existing ones',\n },\n remove_topics: {\n type: 'array',\n items: { type: 'string' },\n description: 'Remove these topics',\n },\n explicit_phrases: {\n type: 'array',\n items: { type: 'string' },\n description: 'Replace all explicit trigger phrases with this array',\n },\n add_explicit_phrases: {\n type: 'array',\n items: { type: 'string' },\n description: 'Add these explicit trigger phrases',\n },\n remove_explicit_phrases: {\n type: 'array',\n items: { type: 'string' },\n description: 'Remove these explicit trigger phrases',\n },\n associated_people: {\n type: 'array',\n items: { type: 'string' },\n description: 'Replace all associated people (person IDs) with this array',\n },\n add_associated_people: {\n type: 'array',\n items: { type: 'string' },\n description: 'Add these person IDs to associated people',\n },\n remove_associated_people: {\n type: 'array',\n items: { type: 'string' },\n description: 'Remove these person IDs from associated people',\n },\n associated_companies: {\n type: 'array',\n items: { type: 'string' },\n description: 'Replace all associated companies (company IDs) with this array',\n },\n add_associated_companies: {\n type: 'array',\n items: { type: 'string' },\n description: 'Add these company IDs to associated companies',\n },\n remove_associated_companies: {\n type: 'array',\n items: { type: 'string' },\n description: 'Remove these company IDs from associated companies',\n },\n parent: {\n type: 'string',\n description: 'Set parent project ID (for project relationships)',\n },\n add_children: {\n type: 'array',\n items: { type: 'string' },\n description: 'Add these project IDs as children',\n },\n remove_children: {\n type: 'array',\n items: { type: 'string' },\n description: 'Remove these project IDs from children',\n },\n add_siblings: {\n type: 'array',\n items: { type: 'string' },\n description: 'Add these project IDs as siblings',\n },\n remove_siblings: {\n type: 'array',\n items: { type: 'string' },\n description: 'Remove these project IDs from siblings',\n },\n add_related_terms: {\n type: 'array',\n items: { type: 'string' },\n description: 'Add these term IDs as related terms (for project relationships)',\n },\n remove_related_terms: {\n type: 'array',\n items: { type: 'string' },\n description: 'Remove these term IDs from related terms',\n },\n contextDirectory: {\n type: 'string',\n description: 'Path to the .protokoll context directory',\n },\n },\n required: ['id'],\n },\n};\n\nexport const updateProjectTool: Tool = {\n name: 'protokoll_update_project',\n description:\n 'Update an existing project by regenerating metadata from a source URL or file. ' +\n 'Fetches content and uses LLM to regenerate sounds_like, explicit_phrases, topics, and description.',\n inputSchema: {\n type: 'object',\n properties: {\n id: {\n type: 'string',\n description: 'Project ID to update',\n },\n source: {\n type: 'string',\n description: 'URL or file path to analyze for regenerating metadata',\n },\n name: {\n type: 'string',\n description: 'Update project name (optional)',\n },\n contextDirectory: {\n type: 'string',\n description: 'Path to the .protokoll context directory',\n },\n },\n required: ['id', 'source'],\n },\n};\n\nexport const addTermTool: Tool = {\n name: 'protokoll_add_term',\n description:\n 'Add a new technical term or abbreviation to the context. ' +\n 'Terms help Protokoll correctly transcribe domain-specific vocabulary and enable topic-based routing. ' +\n 'Include sounds_like variants for phonetic matching, description for clarity, and topics for classification.',\n inputSchema: {\n type: 'object',\n properties: {\n term: {\n type: 'string',\n description: 'The term or abbreviation',\n },\n id: {\n type: 'string',\n description: 'Unique ID (default: slugified term)',\n },\n expansion: {\n type: 'string',\n description: 'Full expansion if this is an acronym',\n },\n domain: {\n type: 'string',\n description: 'Domain or field (e.g., devops, engineering, security, finance)',\n },\n description: {\n type: 'string',\n description: 'Clear explanation of what the term means',\n },\n sounds_like: {\n type: 'array',\n items: { type: 'string' },\n description: 'Phonetic variants (how Whisper might mishear the term)',\n },\n topics: {\n type: 'array',\n items: { type: 'string' },\n description: 'Related topic keywords for classification (e.g., containers, orchestration, devops)',\n },\n projects: {\n type: 'array',\n items: { type: 'string' },\n description: 'Associated project IDs where this term is relevant',\n },\n contextDirectory: {\n type: 'string',\n description: 'Path to the .protokoll context directory',\n },\n },\n required: ['term'],\n },\n};\n\nexport const editTermTool: Tool = {\n name: 'protokoll_edit_term',\n description:\n 'Edit an existing term with manual modifications. Unlike protokoll_update_term (which regenerates from a source), ' +\n 'this allows direct edits: adding specific sounds_like variants, changing description, modifying topics, etc. ' +\n 'For array fields (sounds_like, topics, projects), use add_* to append or remove_* to delete specific values, ' +\n 'or use the base field name to replace the entire array.',\n inputSchema: {\n type: 'object',\n properties: {\n id: {\n type: 'string',\n description: 'Term ID to edit',\n },\n name: {\n type: 'string',\n description: 'Update the display name',\n },\n expansion: {\n type: 'string',\n description: 'Set the expansion (full form if acronym)',\n },\n domain: {\n type: 'string',\n description: 'Set the domain (e.g., devops, engineering)',\n },\n description: {\n type: 'string',\n description: 'Set the description',\n },\n sounds_like: {\n type: 'array',\n items: { type: 'string' },\n description: 'Replace all sounds_like variants with this array',\n },\n add_sounds_like: {\n type: 'array',\n items: { type: 'string' },\n description: 'Add these sounds_like variants to existing ones',\n },\n remove_sounds_like: {\n type: 'array',\n items: { type: 'string' },\n description: 'Remove these sounds_like variants',\n },\n topics: {\n type: 'array',\n items: { type: 'string' },\n description: 'Replace all topics with this array',\n },\n add_topics: {\n type: 'array',\n items: { type: 'string' },\n description: 'Add these topics to existing ones',\n },\n remove_topics: {\n type: 'array',\n items: { type: 'string' },\n description: 'Remove these topics',\n },\n projects: {\n type: 'array',\n items: { type: 'string' },\n description: 'Replace all project associations with this array',\n },\n add_projects: {\n type: 'array',\n items: { type: 'string' },\n description: 'Add these project associations',\n },\n remove_projects: {\n type: 'array',\n items: { type: 'string' },\n description: 'Remove these project associations',\n },\n contextDirectory: {\n type: 'string',\n description: 'Path to the .protokoll context directory',\n },\n },\n required: ['id'],\n },\n};\n\nexport const updateTermTool: Tool = {\n name: 'protokoll_update_term',\n description:\n 'Update an existing term by regenerating metadata from a source URL or file. ' +\n 'Fetches content and uses LLM to regenerate description, topics, domain, and sounds_like.',\n inputSchema: {\n type: 'object',\n properties: {\n id: {\n type: 'string',\n description: 'Term ID to update',\n },\n source: {\n type: 'string',\n description: 'URL or file path to analyze for regenerating metadata',\n },\n expansion: {\n type: 'string',\n description: 'Update expansion (optional)',\n },\n contextDirectory: {\n type: 'string',\n description: 'Path to the .protokoll context directory',\n },\n },\n required: ['id', 'source'],\n },\n};\n\nexport const mergeTermsTool: Tool = {\n name: 'protokoll_merge_terms',\n description:\n 'Merge two duplicate terms into one. Combines metadata (sounds_like, topics, projects) and deletes the source term.',\n inputSchema: {\n type: 'object',\n properties: {\n sourceId: {\n type: 'string',\n description: 'ID of the term to merge from (will be deleted)',\n },\n targetId: {\n type: 'string',\n description: 'ID of the term to merge into (will be kept and updated)',\n },\n contextDirectory: {\n type: 'string',\n description: 'Path to the .protokoll context directory',\n },\n },\n required: ['sourceId', 'targetId'],\n },\n};\n\nexport const addCompanyTool: Tool = {\n name: 'protokoll_add_company',\n description:\n 'Add a new company to the context. ' +\n 'Company entries help recognize organization names in transcripts.',\n inputSchema: {\n type: 'object',\n properties: {\n name: {\n type: 'string',\n description: 'Company name',\n },\n id: {\n type: 'string',\n description: 'Unique ID (default: slugified name)',\n },\n fullName: {\n type: 'string',\n description: 'Full legal name',\n },\n industry: {\n type: 'string',\n description: 'Industry or sector',\n },\n sounds_like: {\n type: 'array',\n items: { type: 'string' },\n description: 'Phonetic variants',\n },\n contextDirectory: {\n type: 'string',\n description: 'Path to the .protokoll context directory',\n },\n },\n required: ['name'],\n },\n};\n\nexport const editCompanyTool: Tool = {\n name: 'protokoll_edit_company',\n description:\n 'Edit an existing company with manual modifications. ' +\n 'Can update company details and manage sounds_like variants.',\n inputSchema: {\n type: 'object',\n properties: {\n id: {\n type: 'string',\n description: 'Company ID to edit',\n },\n name: {\n type: 'string',\n description: 'Update company name',\n },\n fullName: {\n type: 'string',\n description: 'Set full legal name',\n },\n industry: {\n type: 'string',\n description: 'Set industry',\n },\n sounds_like: {\n type: 'array',\n items: { type: 'string' },\n description: 'Replace entire sounds_like array',\n },\n add_sounds_like: {\n type: 'array',\n items: { type: 'string' },\n description: 'Add sounds_like variants',\n },\n remove_sounds_like: {\n type: 'array',\n items: { type: 'string' },\n description: 'Remove sounds_like variants',\n },\n contextDirectory: {\n type: 'string',\n description: 'Path to the .protokoll context directory',\n },\n },\n required: ['id'],\n },\n};\n\nexport const deleteEntityTool: Tool = {\n name: 'protokoll_delete_entity',\n description:\n 'Delete an entity from the context. ' +\n 'Removes the entity\\'s YAML file from the context directory.',\n inputSchema: {\n type: 'object',\n properties: {\n entityType: {\n type: 'string',\n enum: ['project', 'person', 'term', 'company', 'ignored'],\n description: 'Type of entity to delete',\n },\n entityId: {\n type: 'string',\n description: 'ID of the entity to delete',\n },\n contextDirectory: {\n type: 'string',\n description: 'Path to the .protokoll context directory',\n },\n },\n required: ['entityType', 'entityId'],\n },\n};\n\n// ============================================================================\n// Tool Handlers\n// ============================================================================\n\nexport async function handleAddPerson(args: {\n name: string;\n id?: string;\n firstName?: string;\n lastName?: string;\n company?: string;\n role?: string;\n sounds_like?: string[];\n context?: string;\n contextDirectory?: string;\n}) {\n const context = await createToolContext(args.contextDirectory);\n\n if (!context.hasContext()) {\n throw new Error('No .protokoll directory found. Initialize context first.');\n }\n\n const id = resolveCanonicalEntityId(args.id);\n const slug = slugify(args.name);\n\n if (context.getPerson(id)) {\n throw new Error(`Person with ID \"${id}\" already exists`);\n }\n\n const person: Person = {\n id,\n slug,\n name: args.name,\n type: 'person',\n ...(args.firstName && { firstName: args.firstName }),\n ...(args.lastName && { lastName: args.lastName }),\n ...(args.company && { company: args.company }),\n ...(args.role && { role: args.role }),\n ...(args.sounds_like && { sounds_like: args.sounds_like }),\n ...(args.context && { context: args.context }),\n };\n\n await context.saveEntity(person);\n await markEntityIndexDirtyIfGcs('person');\n\n return {\n success: true,\n message: `Person \"${args.name}\" added successfully`,\n entity: formatEntity(person),\n };\n}\n\nexport async function handleEditPerson(args: {\n id: string;\n name?: string;\n firstName?: string;\n lastName?: string;\n company?: string;\n role?: string;\n context?: string;\n sounds_like?: string[];\n add_sounds_like?: string[];\n remove_sounds_like?: string[];\n contextDirectory?: string;\n}) {\n const context = await createToolContext(args.contextDirectory);\n await assertContextAvailableForEntityEdit(context);\n\n const existingPerson = findPersonResilient(context, args.id);\n\n const updatedSoundsLike = mergeArray(\n existingPerson.sounds_like,\n args.sounds_like,\n args.add_sounds_like,\n args.remove_sounds_like\n );\n\n // Build updated person\n const updatedPerson: Person = {\n ...existingPerson,\n ...(args.name !== undefined && { name: args.name }),\n ...(args.firstName !== undefined && { firstName: args.firstName }),\n ...(args.lastName !== undefined && { lastName: args.lastName }),\n ...(args.company !== undefined && { company: args.company }),\n ...(args.role !== undefined && { role: args.role }),\n ...(args.context !== undefined && { context: args.context }),\n updatedAt: new Date(),\n };\n\n // Handle sounds_like array\n if (updatedSoundsLike !== undefined) {\n updatedPerson.sounds_like = updatedSoundsLike;\n } else if (existingPerson.sounds_like && (args.sounds_like !== undefined || args.remove_sounds_like)) {\n delete updatedPerson.sounds_like;\n }\n\n await context.saveEntity(updatedPerson, true);\n await markEntityIndexDirtyIfGcs('person');\n\n // Build summary of changes\n const changes: string[] = [];\n if (args.name !== undefined) changes.push(`name: \"${args.name}\"`);\n if (args.firstName !== undefined) changes.push(`firstName: \"${args.firstName}\"`);\n if (args.lastName !== undefined) changes.push(`lastName: \"${args.lastName}\"`);\n if (args.company !== undefined) changes.push(`company: \"${args.company}\"`);\n if (args.role !== undefined) changes.push(`role: \"${args.role}\"`);\n if (args.context !== undefined) changes.push(`context updated`);\n if (args.sounds_like !== undefined) changes.push(`sounds_like replaced with ${args.sounds_like.length} items`);\n if (args.add_sounds_like?.length) changes.push(`added ${args.add_sounds_like.length} sounds_like variants`);\n if (args.remove_sounds_like?.length) changes.push(`removed ${args.remove_sounds_like.length} sounds_like variants`);\n\n return {\n success: true,\n message: `Updated person \"${existingPerson.name}\"`,\n changes,\n person: formatEntity(updatedPerson),\n };\n}\n\nexport async function handleAddProject(args: {\n name: string;\n id?: string;\n source?: string;\n destination?: string;\n structure?: 'none' | 'year' | 'month' | 'day';\n contextType?: 'work' | 'personal' | 'mixed';\n explicit_phrases?: string[];\n sounds_like?: string[];\n topics?: string[];\n description?: string;\n useSmartAssist?: boolean;\n contextDirectory?: string;\n}) {\n const context = await createToolContext(args.contextDirectory);\n\n if (!context.hasContext()) {\n throw new Error('No .protokoll directory found. Initialize context first.');\n }\n\n const id = resolveCanonicalEntityId(args.id);\n const slug = slugify(args.name);\n\n if (context.getProject(id)) {\n throw new Error(`Project with ID \"${id}\" already exists`);\n }\n\n // Smart assistance integration\n const smartConfig = context.getSmartAssistanceConfig();\n const useSmartAssist = args.useSmartAssist !== false && smartConfig.enabled;\n\n const soundsLike = args.sounds_like || [];\n const triggerPhrases = args.explicit_phrases || [];\n const topics = args.topics || [];\n const description = args.description;\n const suggestedName: string | undefined = undefined;\n\n if (useSmartAssist) {\n // ProjectAssist temporarily unavailable - needs extraction from CLI\n throw new Error('Smart assistance temporarily unavailable');\n \n /* Unreachable code - commented out until ProjectAssist is re-implemented\n // const assist = ProjectAssist.create(smartConfig);\n\n // Analyze source if provided\n if (args.source) {\n const suggestions = await assist.analyzeSource(args.source, args.name);\n\n // Only use suggestions for fields not explicitly provided (undefined, not just empty)\n if (args.sounds_like === undefined) {\n soundsLike = suggestions.soundsLike;\n }\n if (args.explicit_phrases === undefined) {\n triggerPhrases = suggestions.triggerPhrases;\n }\n if (args.topics === undefined && suggestions.topics) {\n topics = suggestions.topics;\n }\n if (!args.description && suggestions.description) {\n description = suggestions.description;\n }\n if (suggestions.name) {\n suggestedName = suggestions.name;\n }\n } else {\n // Generate sounds_like and trigger phrases from name even without source\n if (args.sounds_like === undefined) {\n soundsLike = await assist.generateSoundsLike(args.name);\n }\n if (args.explicit_phrases === undefined) {\n triggerPhrases = await assist.generateTriggerPhrases(args.name);\n }\n }\n */\n }\n\n const project: Project = {\n id,\n slug,\n name: args.name,\n type: 'project',\n classification: {\n context_type: args.contextType || 'work',\n explicit_phrases: triggerPhrases,\n ...(topics.length && { topics }),\n },\n routing: {\n ...(args.destination && { destination: args.destination }),\n structure: args.structure || 'month',\n filename_options: ['date', 'time', 'subject'],\n },\n // Include sounds_like if explicitly provided (even if empty) or if generated\n ...((args.sounds_like !== undefined || soundsLike.length) && { sounds_like: soundsLike }),\n ...(description && { description }),\n active: true,\n };\n\n await context.saveEntity(project);\n await markEntityIndexDirtyIfGcs('project');\n\n return {\n success: true,\n message: `Project \"${args.name}\" added successfully`,\n entity: formatEntity(project),\n smartAssistUsed: useSmartAssist,\n ...(suggestedName ? { suggestedName } : {}),\n generated: {\n soundsLike,\n triggerPhrases,\n topics,\n description,\n },\n };\n}\n\nexport async function handleEditProject(args: {\n id: string;\n name?: string;\n description?: string;\n destination?: string;\n structure?: 'none' | 'year' | 'month' | 'day';\n contextType?: 'work' | 'personal' | 'mixed';\n active?: boolean;\n sounds_like?: string[];\n add_sounds_like?: string[];\n remove_sounds_like?: string[];\n topics?: string[];\n add_topics?: string[];\n remove_topics?: string[];\n explicit_phrases?: string[];\n add_explicit_phrases?: string[];\n remove_explicit_phrases?: string[];\n associated_people?: string[];\n add_associated_people?: string[];\n remove_associated_people?: string[];\n associated_companies?: string[];\n add_associated_companies?: string[];\n remove_associated_companies?: string[];\n parent?: string;\n add_children?: string[];\n remove_children?: string[];\n add_siblings?: string[];\n remove_siblings?: string[];\n add_related_terms?: string[];\n remove_related_terms?: string[];\n urls?: string[];\n add_urls?: string[];\n remove_urls?: string[];\n contextDirectory?: string;\n}) {\n const context = await createToolContext(args.contextDirectory);\n await assertContextAvailableForEntityEdit(context);\n\n const existingProject = findProjectResilient(context, args.id);\n const existingProjectUrls = (existingProject as { urls?: string[] }).urls;\n\n const updatedSoundsLike = mergeArray(\n existingProject.sounds_like,\n args.sounds_like,\n args.add_sounds_like,\n args.remove_sounds_like\n );\n\n const updatedUrls = mergeArray(\n existingProjectUrls,\n args.urls,\n args.add_urls,\n args.remove_urls\n );\n\n const updatedTopics = mergeArray(\n existingProject.classification?.topics,\n args.topics,\n args.add_topics,\n args.remove_topics\n );\n\n const updatedExplicitPhrases = mergeArray(\n existingProject.classification?.explicit_phrases,\n args.explicit_phrases,\n args.add_explicit_phrases,\n args.remove_explicit_phrases\n );\n\n const updatedAssociatedPeople = mergeArray(\n existingProject.classification?.associated_people,\n args.associated_people,\n args.add_associated_people,\n args.remove_associated_people\n );\n\n const updatedAssociatedCompanies = mergeArray(\n existingProject.classification?.associated_companies,\n args.associated_companies,\n args.add_associated_companies,\n args.remove_associated_companies\n );\n\n // Handle relationships\n // Helper functions for relationships\n const createEntityUri = (type: string, id: string): string => `redaksjon://${type}/${id}`;\n const getIdFromUri = (uri: string): string | null => {\n const match = uri.match(/^redaksjon:\\/\\/[^/]+\\/(.+)$/);\n return match ? match[1] : null;\n };\n const getEntityIdsByRelationshipType = (relationships: EntityRelationship[] | undefined, relationshipType: string): string[] => {\n if (!relationships) return [];\n return relationships\n .filter(r => r.relationship === relationshipType)\n .map(r => getIdFromUri(r.uri))\n .filter((id): id is string => id !== null);\n };\n const setRelationships = (relationships: EntityRelationship[] | undefined, type: string, entityType: string, entityIds: string[]): EntityRelationship[] => {\n const rels = relationships || [];\n const filtered = rels.filter(r => r.relationship !== type);\n const newRels = entityIds.map(id => ({ uri: createEntityUri(entityType, id), relationship: type }));\n return [...filtered, ...newRels];\n };\n const addRelationship = (relationships: EntityRelationship[] | undefined, type: string, entityType: string, entityId: string): EntityRelationship[] => {\n const rels = relationships || [];\n const uri = createEntityUri(entityType, entityId);\n const filtered = rels.filter(r => !(r.relationship === type && r.uri === uri));\n return [...filtered, { uri, relationship: type }];\n };\n\n const existingChildren = getEntityIdsByRelationshipType(existingProject.relationships, 'child');\n const updatedChildren = mergeArray(\n existingChildren,\n undefined,\n args.add_children,\n args.remove_children\n );\n\n const existingSiblings = getEntityIdsByRelationshipType(existingProject.relationships, 'sibling');\n const updatedSiblings = mergeArray(\n existingSiblings,\n undefined,\n args.add_siblings,\n args.remove_siblings\n );\n\n const existingRelatedTerms = getEntityIdsByRelationshipType(existingProject.relationships, 'related_term');\n const updatedRelatedTerms = mergeArray(\n existingRelatedTerms,\n undefined,\n args.add_related_terms,\n args.remove_related_terms\n );\n\n // Build updated project\n const updatedProject: Project = {\n ...existingProject,\n ...(args.name !== undefined && { name: args.name }),\n ...(args.description !== undefined && { description: args.description }),\n ...(args.active !== undefined && { active: args.active }),\n classification: {\n ...existingProject.classification,\n ...(args.contextType !== undefined && { context_type: args.contextType }),\n },\n routing: {\n ...existingProject.routing,\n ...(args.destination !== undefined && { destination: args.destination }),\n ...(args.structure !== undefined && { structure: args.structure }),\n },\n updatedAt: new Date(),\n };\n\n // Handle sounds_like at project level\n if (updatedSoundsLike !== undefined) {\n updatedProject.sounds_like = updatedSoundsLike;\n } else if (existingProject.sounds_like && (args.sounds_like !== undefined || args.remove_sounds_like)) {\n delete updatedProject.sounds_like;\n }\n\n if (updatedUrls !== undefined) {\n (updatedProject as { urls?: string[] }).urls = updatedUrls;\n } else if (existingProjectUrls && (args.urls !== undefined || args.remove_urls)) {\n delete (updatedProject as { urls?: string[] }).urls;\n }\n\n // Handle classification arrays\n if (updatedTopics !== undefined) {\n updatedProject.classification.topics = updatedTopics;\n } else if (existingProject.classification?.topics && (args.topics !== undefined || args.remove_topics)) {\n delete updatedProject.classification.topics;\n }\n\n if (updatedExplicitPhrases !== undefined) {\n updatedProject.classification.explicit_phrases = updatedExplicitPhrases;\n } else if (existingProject.classification?.explicit_phrases && (args.explicit_phrases !== undefined || args.remove_explicit_phrases)) {\n delete updatedProject.classification.explicit_phrases;\n }\n\n if (updatedAssociatedPeople !== undefined) {\n updatedProject.classification.associated_people = updatedAssociatedPeople;\n } else if (existingProject.classification?.associated_people && (args.associated_people !== undefined || args.remove_associated_people)) {\n delete updatedProject.classification.associated_people;\n }\n\n if (updatedAssociatedCompanies !== undefined) {\n updatedProject.classification.associated_companies = updatedAssociatedCompanies;\n } else if (existingProject.classification?.associated_companies && (args.associated_companies !== undefined || args.remove_associated_companies)) {\n delete updatedProject.classification.associated_companies;\n }\n\n // Handle relationships\n let relationships: EntityRelationship[] = existingProject.relationships ? [...existingProject.relationships] : [];\n \n if (args.parent !== undefined) {\n relationships = addRelationship(relationships, 'parent', 'project', args.parent);\n }\n \n if (updatedChildren !== undefined && updatedChildren !== existingChildren) {\n relationships = setRelationships(relationships, 'child', 'project', updatedChildren);\n }\n \n if (updatedSiblings !== undefined && updatedSiblings !== existingSiblings) {\n relationships = setRelationships(relationships, 'sibling', 'project', updatedSiblings);\n }\n \n if (updatedRelatedTerms !== undefined && updatedRelatedTerms !== existingRelatedTerms) {\n relationships = setRelationships(relationships, 'related_term', 'term', updatedRelatedTerms);\n }\n \n if (args.parent !== undefined || updatedChildren !== undefined || updatedSiblings !== undefined || updatedRelatedTerms !== undefined) {\n updatedProject.relationships = relationships.length > 0 ? relationships : undefined;\n }\n\n await context.saveEntity(updatedProject, true);\n await markEntityIndexDirtyIfGcs('project');\n\n // Build summary of changes\n const changes: string[] = [];\n if (args.name !== undefined) changes.push(`name: \"${args.name}\"`);\n if (args.description !== undefined) changes.push(`description updated`);\n if (args.destination !== undefined) changes.push(`destination: \"${args.destination}\"`);\n if (args.structure !== undefined) changes.push(`structure: \"${args.structure}\"`);\n if (args.contextType !== undefined) changes.push(`context_type: \"${args.contextType}\"`);\n if (args.active !== undefined) changes.push(`active: ${args.active}`);\n if (args.sounds_like !== undefined) changes.push(`sounds_like replaced with ${args.sounds_like.length} items`);\n if (args.add_sounds_like?.length) changes.push(`added ${args.add_sounds_like.length} sounds_like variants`);\n if (args.remove_sounds_like?.length) changes.push(`removed ${args.remove_sounds_like.length} sounds_like variants`);\n if (args.urls !== undefined) changes.push(`urls replaced with ${args.urls.length} items`);\n if (args.add_urls?.length) changes.push(`added ${args.add_urls.length} urls`);\n if (args.remove_urls?.length) changes.push(`removed ${args.remove_urls.length} urls`);\n if (args.topics !== undefined) changes.push(`topics replaced with ${args.topics.length} items`);\n if (args.add_topics?.length) changes.push(`added ${args.add_topics.length} topics`);\n if (args.remove_topics?.length) changes.push(`removed ${args.remove_topics.length} topics`);\n if (args.explicit_phrases !== undefined) changes.push(`explicit_phrases replaced with ${args.explicit_phrases.length} items`);\n if (args.add_explicit_phrases?.length) changes.push(`added ${args.add_explicit_phrases.length} explicit phrases`);\n if (args.remove_explicit_phrases?.length) changes.push(`removed ${args.remove_explicit_phrases.length} explicit phrases`);\n if (args.associated_people !== undefined) changes.push(`associated_people replaced with ${args.associated_people.length} items`);\n if (args.add_associated_people?.length) changes.push(`added ${args.add_associated_people.length} associated people`);\n if (args.remove_associated_people?.length) changes.push(`removed ${args.remove_associated_people.length} associated people`);\n if (args.associated_companies !== undefined) changes.push(`associated_companies replaced with ${args.associated_companies.length} items`);\n if (args.add_associated_companies?.length) changes.push(`added ${args.add_associated_companies.length} associated companies`);\n if (args.remove_associated_companies?.length) changes.push(`removed ${args.remove_associated_companies.length} associated companies`);\n if (args.parent !== undefined) changes.push(`parent: \"${args.parent}\"`);\n if (args.add_children?.length) changes.push(`added ${args.add_children.length} children`);\n if (args.remove_children?.length) changes.push(`removed ${args.remove_children.length} children`);\n if (args.add_siblings?.length) changes.push(`added ${args.add_siblings.length} siblings`);\n if (args.remove_siblings?.length) changes.push(`removed ${args.remove_siblings.length} siblings`);\n if (args.add_related_terms?.length) changes.push(`added ${args.add_related_terms.length} related terms`);\n if (args.remove_related_terms?.length) changes.push(`removed ${args.remove_related_terms.length} related terms`);\n\n return {\n success: true,\n message: `Updated project \"${existingProject.name}\"`,\n changes,\n project: formatEntity(updatedProject),\n };\n}\n\nexport async function handleUpdateProject(args: {\n id: string;\n source: string;\n name?: string;\n contextDirectory?: string;\n}) {\n const context = await createToolContext(args.contextDirectory);\n\n if (!context.hasContext()) {\n throw new Error('No .protokoll directory found. Initialize context first.');\n }\n\n // Verify project exists\n findProjectResilient(context, args.id);\n\n const smartConfig = context.getSmartAssistanceConfig();\n if (!smartConfig.enabled) {\n throw new Error('Smart assistance is disabled in configuration.');\n }\n\n // ProjectAssist temporarily unavailable - needs extraction from CLI\n throw new Error('Smart assistance temporarily unavailable');\n \n /* Unreachable code - commented out until ProjectAssist is re-implemented\n // const assist = ProjectAssist.create(smartConfig);\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n const projectName = args.name || existingProject.name;\n\n // Analyze source for new metadata\n const suggestions = await assist.analyzeSource(args.source, projectName);\n\n // Update project with regenerated metadata\n const updatedProject: Project = {\n ...existingProject,\n ...(args.name && { name: args.name }),\n ...(suggestions.description && { description: suggestions.description }),\n ...(suggestions.soundsLike.length > 0 && { sounds_like: suggestions.soundsLike }),\n classification: {\n ...existingProject.classification,\n ...(suggestions.triggerPhrases.length > 0 && { explicit_phrases: suggestions.triggerPhrases }),\n ...(suggestions.topics && suggestions.topics.length > 0 && { topics: suggestions.topics }),\n },\n updatedAt: new Date(),\n };\n\n await context.saveEntity(updatedProject, true);\n\n return {\n success: true,\n message: `Updated project \"${existingProject.name}\" from source`,\n project: formatEntity(updatedProject),\n generated: {\n soundsLike: suggestions.soundsLike,\n triggerPhrases: suggestions.triggerPhrases,\n topics: suggestions.topics,\n description: suggestions.description,\n },\n };\n */\n}\n\nexport async function handleAddTerm(args: {\n term: string;\n id?: string;\n expansion?: string;\n domain?: string;\n description?: string;\n sounds_like?: string[];\n topics?: string[];\n projects?: string[];\n contextDirectory?: string;\n}) {\n const context = await createToolContext(args.contextDirectory);\n\n if (!context.hasContext()) {\n throw new Error('No .protokoll directory found. Initialize context first.');\n }\n\n const id = resolveCanonicalEntityId(args.id);\n const slug = slugify(args.term);\n\n if (context.getTerm(id)) {\n throw new Error(`Term with ID \"${id}\" already exists`);\n }\n\n const term: Term = {\n id,\n slug,\n name: args.term,\n type: 'term',\n ...(args.expansion && { expansion: args.expansion }),\n ...(args.domain && { domain: args.domain }),\n ...(args.description && { description: args.description }),\n ...(args.sounds_like && { sounds_like: args.sounds_like }),\n ...(args.topics && { topics: args.topics }),\n ...(args.projects && { projects: args.projects }),\n };\n\n await context.saveEntity(term);\n await markEntityIndexDirtyIfGcs('term');\n\n return {\n success: true,\n message: `Term \"${args.term}\" added successfully`,\n entity: formatEntity(term),\n };\n}\n\nexport async function handleEditTerm(args: {\n id: string;\n name?: string;\n expansion?: string;\n domain?: string;\n description?: string;\n sounds_like?: string[];\n add_sounds_like?: string[];\n remove_sounds_like?: string[];\n topics?: string[];\n add_topics?: string[];\n remove_topics?: string[];\n projects?: string[];\n add_projects?: string[];\n remove_projects?: string[];\n contextDirectory?: string;\n}) {\n const context = await createToolContext(args.contextDirectory);\n await assertContextAvailableForEntityEdit(context);\n\n const existingTerm = findTermResilient(context, args.id) || context.getTerm(args.id);\n if (!existingTerm) {\n throw new Error(`Term \"${args.id}\" not found`);\n }\n\n const updatedSoundsLike = mergeArray(\n existingTerm.sounds_like,\n args.sounds_like,\n args.add_sounds_like,\n args.remove_sounds_like\n );\n\n const updatedTopics = mergeArray(\n existingTerm.topics,\n args.topics,\n args.add_topics,\n args.remove_topics\n );\n\n const updatedProjects = mergeArray(\n existingTerm.projects,\n args.projects,\n args.add_projects,\n args.remove_projects\n );\n\n // Build updated term\n const updatedTerm: Term = {\n ...existingTerm,\n ...(args.name !== undefined && { name: args.name }),\n ...(args.expansion !== undefined && { expansion: args.expansion }),\n ...(args.domain !== undefined && { domain: args.domain }),\n ...(args.description !== undefined && { description: args.description }),\n updatedAt: new Date(),\n };\n\n // Handle array fields - only set if they have values\n if (updatedSoundsLike !== undefined) {\n updatedTerm.sounds_like = updatedSoundsLike;\n } else if (existingTerm.sounds_like && (args.sounds_like !== undefined || args.remove_sounds_like)) {\n delete updatedTerm.sounds_like;\n }\n\n if (updatedTopics !== undefined) {\n updatedTerm.topics = updatedTopics;\n } else if (existingTerm.topics && (args.topics !== undefined || args.remove_topics)) {\n delete updatedTerm.topics;\n }\n\n if (updatedProjects !== undefined) {\n updatedTerm.projects = updatedProjects;\n } else if (existingTerm.projects && (args.projects !== undefined || args.remove_projects)) {\n delete updatedTerm.projects;\n }\n\n await context.saveEntity(updatedTerm, true);\n await markEntityIndexDirtyIfGcs('term');\n\n // Build summary of changes\n const changes: string[] = [];\n if (args.name !== undefined) changes.push(`name: \"${args.name}\"`);\n if (args.expansion !== undefined) changes.push(`expansion: \"${args.expansion}\"`);\n if (args.domain !== undefined) changes.push(`domain: \"${args.domain}\"`);\n if (args.description !== undefined) changes.push(`description updated`);\n if (args.sounds_like !== undefined) changes.push(`sounds_like replaced with ${args.sounds_like.length} items`);\n if (args.add_sounds_like?.length) changes.push(`added ${args.add_sounds_like.length} sounds_like variants`);\n if (args.remove_sounds_like?.length) changes.push(`removed ${args.remove_sounds_like.length} sounds_like variants`);\n if (args.topics !== undefined) changes.push(`topics replaced with ${args.topics.length} items`);\n if (args.add_topics?.length) changes.push(`added ${args.add_topics.length} topics`);\n if (args.remove_topics?.length) changes.push(`removed ${args.remove_topics.length} topics`);\n if (args.projects !== undefined) changes.push(`projects replaced with ${args.projects.length} items`);\n if (args.add_projects?.length) changes.push(`added ${args.add_projects.length} project associations`);\n if (args.remove_projects?.length) changes.push(`removed ${args.remove_projects.length} project associations`);\n\n return {\n success: true,\n message: `Updated term \"${existingTerm.name}\"`,\n changes,\n term: formatEntity(updatedTerm),\n };\n}\n\nexport async function handleUpdateTerm(args: {\n id: string;\n source: string;\n expansion?: string;\n contextDirectory?: string;\n}) {\n const context = await createToolContext(args.contextDirectory);\n\n if (!context.hasContext()) {\n throw new Error('No .protokoll directory found. Initialize context first.');\n }\n\n // Verify term exists\n findTermResilient(context, args.id);\n\n const smartConfig = context.getSmartAssistanceConfig();\n if (!smartConfig.enabled || smartConfig.termsEnabled === false) {\n throw new Error('Term smart assistance is disabled in configuration.');\n }\n\n // ContentFetcher, TermAssist, TermContext temporarily unavailable\n throw new Error('Term assistance temporarily unavailable - business logic needs extraction from CLI');\n \n /* Unreachable code - commented out until modules are re-implemented\n // Fetch content from source\n const ContentFetcher = await import('@/cli/content-fetcher');\n const contentFetcher = ContentFetcher.create();\n const fetchResult = await contentFetcher.fetch(args.source);\n\n if (!fetchResult.success) {\n throw new Error(`Failed to fetch source: ${fetchResult.error}`);\n }\n\n // Gather context and generate suggestions\n const TermAssist = await import('@/cli/term-assist');\n const TermContext = await import('@/cli/term-context');\n\n const termAssist = TermAssist.create(smartConfig);\n const termContextHelper = TermContext.create(context);\n\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n const internalContext = termContextHelper.gatherInternalContext(\n existingTerm.name,\n args.expansion || existingTerm.expansion\n );\n\n const analysisContext = TermContext.buildAnalysisContext(\n existingTerm.name,\n args.expansion || existingTerm.expansion,\n fetchResult,\n internalContext\n );\n\n const suggestions = await termAssist.generateAll(existingTerm.name, analysisContext);\n\n // Update term with regenerated metadata\n const updatedTerm: Term = {\n ...existingTerm,\n ...(args.expansion && { expansion: args.expansion }),\n ...(suggestions.description && { description: suggestions.description }),\n ...(suggestions.domain && { domain: suggestions.domain }),\n ...(suggestions.soundsLike.length > 0 && { sounds_like: suggestions.soundsLike }),\n ...(suggestions.topics.length > 0 && { topics: suggestions.topics }),\n updatedAt: new Date(),\n };\n\n // Suggest projects based on topics\n let suggestedProjects: string[] = [];\n if (suggestions.topics.length > 0) {\n const projects = termContextHelper.findProjectsByTopic(suggestions.topics);\n suggestedProjects = projects.map((p: any) => p.id);\n }\n\n await context.saveEntity(updatedTerm, true);\n\n return {\n success: true,\n message: `Updated term \"${existingTerm.name}\" from source`,\n term: formatEntity(updatedTerm),\n generated: {\n soundsLike: suggestions.soundsLike,\n description: suggestions.description,\n topics: suggestions.topics,\n domain: suggestions.domain,\n suggestedProjects,\n },\n };\n */\n}\n\n/* c8 ignore start */\nexport async function handleMergeTerms(args: {\n sourceId: string;\n targetId: string;\n contextDirectory?: string;\n}) {\n const context = await createToolContext(args.contextDirectory);\n\n if (!context.hasContext()) {\n throw new Error('No .protokoll directory found. Initialize context first.');\n }\n\n const sourceTerm = findTermResilient(context, args.sourceId);\n const targetTerm = findTermResilient(context, args.targetId);\n\n // Merge metadata\n const mergedTerm: Term = {\n ...targetTerm,\n sounds_like: [\n ...(targetTerm.sounds_like || []),\n ...(sourceTerm.sounds_like || []),\n ].filter((v, i, arr) => arr.indexOf(v) === i),\n topics: [\n ...(targetTerm.topics || []),\n ...(sourceTerm.topics || []),\n ].filter((v, i, arr) => arr.indexOf(v) === i),\n projects: [\n ...(targetTerm.projects || []),\n ...(sourceTerm.projects || []),\n ].filter((v, i, arr) => arr.indexOf(v) === i),\n description: targetTerm.description || sourceTerm.description,\n domain: targetTerm.domain || sourceTerm.domain,\n expansion: targetTerm.expansion || sourceTerm.expansion,\n updatedAt: new Date(),\n };\n\n // Remove empty arrays\n if (mergedTerm.sounds_like && mergedTerm.sounds_like.length === 0) {\n delete mergedTerm.sounds_like;\n }\n if (mergedTerm.topics && mergedTerm.topics.length === 0) {\n delete mergedTerm.topics;\n }\n if (mergedTerm.projects && mergedTerm.projects.length === 0) {\n delete mergedTerm.projects;\n }\n\n // Save merged term and delete source\n await context.saveEntity(mergedTerm);\n await context.deleteEntity(sourceTerm);\n await markEntityIndexDirtyIfGcs('term');\n\n return {\n success: true,\n message: `Merged \"${sourceTerm.name}\" into \"${targetTerm.name}\"`,\n mergedTerm: formatEntity(mergedTerm),\n deletedTerm: args.sourceId,\n };\n}\n/* c8 ignore stop */\n\nexport async function handleAddCompany(args: {\n name: string;\n id?: string;\n fullName?: string;\n industry?: string;\n sounds_like?: string[];\n contextDirectory?: string;\n}) {\n const context = await createToolContext(args.contextDirectory);\n\n if (!context.hasContext()) {\n throw new Error('No .protokoll directory found. Initialize context first.');\n }\n\n const id = resolveCanonicalEntityId(args.id);\n const slug = slugify(args.name);\n\n if (context.getCompany(id)) {\n throw new Error(`Company with ID \"${id}\" already exists`);\n }\n\n const company: Company = {\n id,\n slug,\n name: args.name,\n type: 'company',\n ...(args.fullName && { fullName: args.fullName }),\n ...(args.industry && { industry: args.industry }),\n ...(args.sounds_like && { sounds_like: args.sounds_like }),\n };\n\n await context.saveEntity(company);\n await markEntityIndexDirtyIfGcs('company');\n\n return {\n success: true,\n message: `Company \"${args.name}\" added successfully`,\n entity: formatEntity(company),\n };\n}\n\nexport async function handleEditCompany(args: {\n id: string;\n name?: string;\n fullName?: string;\n industry?: string;\n sounds_like?: string[];\n add_sounds_like?: string[];\n remove_sounds_like?: string[];\n contextDirectory?: string;\n}) {\n const context = await createToolContext(args.contextDirectory);\n await assertContextAvailableForEntityEdit(context);\n\n const existingCompany = findCompanyResilient(context, args.id);\n\n const updatedSoundsLike = mergeArray(\n existingCompany.sounds_like,\n args.sounds_like,\n args.add_sounds_like,\n args.remove_sounds_like\n );\n\n // Build updated company\n const updatedCompany: Company = {\n ...existingCompany,\n ...(args.name !== undefined && { name: args.name }),\n ...(args.fullName !== undefined && { fullName: args.fullName }),\n ...(args.industry !== undefined && { industry: args.industry }),\n updatedAt: new Date(),\n };\n\n // Handle sounds_like array\n if (updatedSoundsLike !== undefined) {\n updatedCompany.sounds_like = updatedSoundsLike;\n } else if (existingCompany.sounds_like && (args.sounds_like !== undefined || args.remove_sounds_like)) {\n delete updatedCompany.sounds_like;\n }\n\n await context.saveEntity(updatedCompany, true);\n await markEntityIndexDirtyIfGcs('company');\n\n // Build summary of changes\n const changes: string[] = [];\n if (args.name !== undefined) changes.push(`name: \"${args.name}\"`);\n if (args.fullName !== undefined) changes.push(`fullName: \"${args.fullName}\"`);\n if (args.industry !== undefined) changes.push(`industry: \"${args.industry}\"`);\n if (args.sounds_like !== undefined) changes.push(`sounds_like replaced with ${args.sounds_like.length} items`);\n if (args.add_sounds_like?.length) changes.push(`added ${args.add_sounds_like.length} sounds_like variants`);\n if (args.remove_sounds_like?.length) changes.push(`removed ${args.remove_sounds_like.length} sounds_like variants`);\n\n return {\n success: true,\n message: `Updated company \"${existingCompany.name}\"`,\n changes,\n company: formatEntity(updatedCompany),\n };\n}\n\nexport async function handleDeleteEntity(args: { entityType: string; entityId: string; contextDirectory?: string }) {\n const context = await createToolContext(args.contextDirectory);\n\n let entity: Entity;\n switch (args.entityType) {\n case 'project':\n entity = findProjectResilient(context, args.entityId);\n break;\n case 'person':\n entity = findPersonResilient(context, args.entityId);\n break;\n case 'term':\n entity = findTermResilient(context, args.entityId);\n break;\n case 'company':\n entity = findCompanyResilient(context, args.entityId);\n break;\n case 'ignored':\n entity = findIgnoredResilient(context, args.entityId);\n break;\n default:\n throw new Error(`Unknown entity type: ${args.entityType}`);\n }\n\n const deleted = await context.deleteEntity(entity);\n if (deleted) {\n await markEntityIndexDirtyIfGcs(args.entityType as 'person' | 'project' | 'term' | 'company' | 'ignored');\n }\n\n if (!deleted) {\n throw new Error(`Failed to delete ${args.entityType} \"${args.entityId}\"`);\n }\n\n return {\n success: true,\n message: `${args.entityType} \"${args.entityId}\" deleted successfully`,\n };\n}\n","/* eslint-disable import/extensions */\n/**\n * Smart Assistance Tools - Generate metadata suggestions for entities\n */\n \nimport type { Tool } from '@modelcontextprotocol/sdk/types.js';\nimport { createToolContext } from './shared';\n\n// ============================================================================\n// Tool Definitions\n// ============================================================================\n\nexport const suggestProjectMetadataTool: Tool = {\n name: 'protokoll_suggest_project_metadata',\n description:\n 'Generate project metadata suggestions without creating the project. ' +\n 'Returns sounds_like (phonetic variants for transcription), explicit_phrases (content-matching trigger phrases), ' +\n 'topics and description from source content. Useful for interactive workflows where ' +\n 'AI assistant presents suggestions for user review before creating the project.',\n inputSchema: {\n type: 'object',\n properties: {\n name: {\n type: 'string',\n description: 'Project name for generating sounds_like and trigger phrases',\n },\n source: {\n type: 'string',\n description: 'URL or file path to analyze for topics, description, and suggested name',\n },\n contextDirectory: {\n type: 'string',\n description: 'Path to the .protokoll context directory',\n },\n },\n },\n};\n\nexport const suggestTermMetadataTool: Tool = {\n name: 'protokoll_suggest_term_metadata',\n description:\n 'Generate term metadata suggestions without creating the term. ' +\n 'Returns sounds_like (phonetic variants), description, topics, domain, and suggested projects. ' +\n 'Useful for interactive workflows where AI assistant presents suggestions for user review before creating the term.',\n inputSchema: {\n type: 'object',\n properties: {\n term: {\n type: 'string',\n description: 'Term name for generating metadata',\n },\n source: {\n type: 'string',\n description: 'URL or file path to analyze for richer suggestions (optional)',\n },\n expansion: {\n type: 'string',\n description: 'Full expansion if acronym (helps with analysis)',\n },\n contextDirectory: {\n type: 'string',\n description: 'Path to the .protokoll context directory',\n },\n },\n required: ['term'],\n },\n};\n\n// ============================================================================\n// Tool Handlers\n// ============================================================================\n\nexport async function handleSuggestProjectMetadata(args: {\n name?: string;\n source?: string;\n contextDirectory?: string;\n}) {\n const context = await createToolContext(args.contextDirectory);\n\n const smartConfig = context.getSmartAssistanceConfig();\n\n if (!smartConfig.enabled) {\n throw new Error('Smart assistance is disabled in configuration.');\n }\n\n // ProjectAssist moved to separate module - needs to be re-implemented\n throw new Error('Project assistance temporarily unavailable - business logic needs extraction from CLI');\n \n /* Unreachable code - commented out until ProjectAssist is re-implemented\n // const assist = ProjectAssist.create(smartConfig);\n\n const result: {\n soundsLike?: string[];\n triggerPhrases?: string[];\n topics?: string[];\n description?: string;\n suggestedName?: string;\n } = {};\n\n // Generate sounds_like and trigger phrases if name provided\n if (args.name) {\n // Generate in parallel for efficiency\n const [soundsLike, triggerPhrases] = await Promise.all([\n assist.generateSoundsLike(args.name),\n assist.generateTriggerPhrases(args.name),\n ]);\n result.soundsLike = soundsLike;\n result.triggerPhrases = triggerPhrases;\n }\n\n // Analyze source if provided\n if (args.source) {\n const suggestions = await assist.analyzeSource(args.source, args.name);\n\n if (!args.name && suggestions.name) {\n result.suggestedName = suggestions.name;\n result.soundsLike = suggestions.soundsLike;\n result.triggerPhrases = suggestions.triggerPhrases;\n }\n result.topics = suggestions.topics;\n result.description = suggestions.description;\n }\n\n return {\n success: true,\n data: result,\n };\n */\n}\n\nexport async function handleSuggestTermMetadata(args: {\n term: string;\n source?: string;\n expansion?: string;\n contextDirectory?: string;\n}) {\n const context = await createToolContext(args.contextDirectory);\n\n const smartConfig = context.getSmartAssistanceConfig();\n\n if (!smartConfig.enabled || smartConfig.termsEnabled === false) {\n throw new Error('Term smart assistance is disabled in configuration.');\n }\n\n // TermAssist, TermContext, ContentFetcher moved to separate modules - need re-implementation\n throw new Error('Term assistance temporarily unavailable - business logic needs extraction from CLI');\n \n /* Unreachable code - commented out until TermAssist is re-implemented\n // const termAssist = TermAssist.create(smartConfig);\n // const termContextHelper = TermContext.create(context);\n // const contentFetcher = ContentFetcher.create();\n\n // Gather internal context\n const internalContext = termContextHelper.gatherInternalContext(args.term, args.expansion);\n\n // Fetch external content if source provided\n let fetchResult: ContentFetcher.FetchResult | undefined;\n if (args.source) {\n fetchResult = await contentFetcher.fetch(args.source);\n }\n\n // Build analysis context\n const analysisContext = TermContext.buildAnalysisContext(\n args.term,\n args.expansion,\n fetchResult,\n internalContext\n );\n\n // Generate suggestions\n const suggestions = await termAssist.generateAll(args.term, analysisContext);\n\n // Find related projects based on generated topics\n let suggestedProjects: string[] = [];\n if (suggestions.topics && suggestions.topics.length > 0) {\n const projects = termContextHelper.findProjectsByTopic(suggestions.topics);\n suggestedProjects = projects.map((p: any) => p.id);\n }\n\n return {\n success: true,\n data: {\n soundsLike: suggestions.soundsLike,\n description: suggestions.description,\n topics: suggestions.topics,\n domain: suggestions.domain,\n suggestedProjects,\n },\n };\n */\n}\n","/* eslint-disable import/extensions */\n/**\n * Transcript Tools - Read, list, edit, combine, and provide feedback on transcripts\n */\n \nimport type { Tool } from '@modelcontextprotocol/sdk/types.js';\nimport { resolve, dirname } from 'node:path';\nimport { mkdir, mkdtemp, rm, readFile, writeFile } from 'node:fs/promises';\nimport { tmpdir } from 'node:os';\nimport { randomUUID } from 'node:crypto';\nimport Logging from '@fjell/logging';\nimport { Agentic, Phases, Reasoning, Routing, Transcript } from '@redaksjon/protokoll-engine';\nimport { DEFAULT_MODEL, MAX_CONTENT_LENGTH } from '@/constants';\nimport { markTranscriptIndexDirtyForStorage, resolveTranscriptPathByFilename } from '../resources/transcriptIndexService';\nimport type { FileStorageProvider } from '../storage/fileProviders';\nimport { markContextEntityIndexDirty, findContextEntityInGcs } from '../resources/entityIndexService';\n\nimport { createToolContext, fileExists, getConfiguredDirectory, getContextDirectories, sanitizePath, validatePathWithinDirectory, validatePathWithinOutputDirectory, validateNotRemoteMode, resolveTranscriptPath } from './shared.js';\nimport * as Metadata from '@redaksjon/protokoll-engine';\nimport { Transcript as TranscriptUtils } from '@redaksjon/protokoll-engine';\nconst { ensurePklExtension, transcriptExists } = TranscriptUtils;\nimport { \n PklTranscript, \n readTranscript as readTranscriptFromStorage,\n listTranscripts as listTranscriptsFromStorage,\n type TranscriptMetadata,\n} from '@redaksjon/protokoll-format';\n\nconst logger = Logging.getLogger('@redaksjon/protokoll-mcp').get('transcript-tools');\n\n// ============================================================================\n// Helper Functions\n// ============================================================================\n\ntype CandidateConfidence = 'high' | 'medium' | 'low';\n\ninterface TaskCandidate {\n id: string;\n taskText: string;\n confidence: number;\n confidenceBucket: CandidateConfidence;\n rationale: string;\n sourceExcerpt: string;\n suggestedDueDate: string | null;\n suggestedProject: { id: string | null; name: string | null };\n suggestedEntities: Array<{ id: string; name: string; type: 'person' | 'project' | 'term' | 'company' }>;\n suggestedTags: string[];\n}\n\ninterface SummaryStylePreset {\n label: string;\n instructions: string;\n}\n\ninterface StoredSummary {\n id: string;\n title: string;\n audience: string;\n guidance: string;\n stylePreset: string;\n styleLabel: string;\n content: string;\n generatedAt: string;\n}\n\ninterface TranscriptCommentInput {\n id: string;\n text: string;\n createdAt: string;\n updatedAt?: string;\n}\n\ntype TranscriptMetadataWithComments = TranscriptMetadata & {\n comments?: TranscriptCommentInput[];\n};\n\nfunction normalizeTranscriptComments(comments: unknown): TranscriptCommentInput[] {\n if (!Array.isArray(comments)) {\n return [];\n }\n\n return comments\n .filter((entry) => !!entry && typeof entry === 'object')\n .map((entry) => {\n const candidate = entry as Record<string, unknown>;\n const id = typeof candidate.id === 'string' ? candidate.id.trim() : '';\n const text = typeof candidate.text === 'string' ? candidate.text.trim() : '';\n const createdAt = typeof candidate.createdAt === 'string' ? candidate.createdAt.trim() : '';\n const updatedAt = typeof candidate.updatedAt === 'string' ? candidate.updatedAt.trim() : undefined;\n return { id, text, createdAt, updatedAt };\n })\n .filter((entry) => entry.id.length > 0 && entry.text.length > 0 && entry.createdAt.length > 0)\n .sort((a, b) => a.createdAt.localeCompare(b.createdAt));\n}\n\nfunction toStoragePathCandidates(transcriptPath: string): string[] {\n const normalizedInput = transcriptPath.trim();\n if (!normalizedInput) {\n return [];\n }\n\n let normalized = normalizedInput;\n if (normalized.startsWith('protokoll://transcript/')) {\n const rawPath = normalized\n .replace('protokoll://transcript/', '')\n .split('?')[0]\n .split('#')[0] || '';\n try {\n normalized = decodeURIComponent(rawPath);\n } catch {\n // Fall back to the undecoded path for malformed or partially encoded URIs.\n normalized = rawPath;\n }\n }\n\n normalized = normalized\n .replace(/^\\/+/, '')\n .replace(/\\\\/g, '/')\n .replace(/^(\\.\\.\\/)+/, '');\n if (!normalized) {\n return [];\n }\n\n const withoutExt = normalized.replace(/\\.pkl$/i, '');\n const candidates = new Set<string>([\n withoutExt,\n `${withoutExt}.pkl`,\n ]);\n return Array.from(candidates);\n}\n\nasync function resolveStorageTranscriptPath(\n transcriptPath: string,\n outputStorage: FileStorageProvider,\n): Promise<string | null> {\n const candidates = toStoragePathCandidates(transcriptPath);\n for (const candidate of candidates) {\n if (await outputStorage.exists(candidate)) {\n return candidate;\n }\n }\n\n const normalizedRef = transcriptPath.startsWith('protokoll://transcript/')\n ? transcriptPath.replace('protokoll://transcript/', '').split('?')[0].split('#')[0]\n : transcriptPath;\n const isBasenameOnly = !normalizedRef.replace(/^\\/+/, '').replace(/\\\\/g, '/').includes('/');\n if (!isBasenameOnly) {\n return null;\n }\n\n const basenameCandidates = new Set(\n candidates.map((candidate) => candidate.split('/').pop() || candidate)\n );\n\n const ServerConfig = await import('../serverConfig');\n const outputDirectory = ServerConfig.getOutputDirectory();\n const matches = await resolveTranscriptPathByFilename(\n outputStorage,\n outputDirectory,\n basenameCandidates,\n );\n if (matches.length === 1) {\n return matches[0];\n }\n if (matches.length > 1) {\n throw new Error(\n `Ambiguous transcript reference \"${transcriptPath}\": ${matches.length} matches found. ` +\n 'Use full transcript URI or relative path with date folders.'\n );\n }\n return null;\n}\n\nasync function getProjectLookupContext(contextDirectory?: string) {\n return createToolContext(contextDirectory);\n}\n\nexport const transcriptResolutionTestHelpers = {\n toStoragePathCandidates,\n resolveStorageTranscriptPath,\n};\n\ninterface ToolTranscriptAccess {\n pklPath: string;\n outputDirectory: string;\n storagePath?: string;\n isGcs: boolean;\n finalize: (persistChanges: boolean) => Promise<void>;\n}\n\nasync function openToolTranscript(\n transcriptPath: string,\n contextDirectory: string | undefined,\n): Promise<ToolTranscriptAccess> {\n const ServerConfig = await import('../serverConfig');\n const outputStorage = ServerConfig.getOutputStorage();\n const outputDirectory = await getConfiguredDirectory('outputDirectory', contextDirectory);\n\n if (outputStorage.name !== 'gcs') {\n const absolutePath = await resolveTranscriptPath(transcriptPath, contextDirectory);\n const pklPath = ensurePklExtension(absolutePath);\n return {\n pklPath,\n outputDirectory,\n isGcs: false,\n finalize: async () => {},\n };\n }\n\n if (/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i.test(transcriptPath.trim())) {\n throw new Error(\n 'UUID transcript references are not supported in GCS mode yet. ' +\n 'Use a transcript URI (protokoll://transcript/...) or relative path.'\n );\n }\n\n const storagePath = await resolveStorageTranscriptPath(transcriptPath, outputStorage);\n if (!storagePath) {\n throw new Error(`Transcript not found: ${transcriptPath}`);\n }\n\n const tmpRoot = await mkdtemp(`${tmpdir()}/protokoll-mcp-transcript-`);\n const pklPath = resolve(tmpRoot, 'transcript.pkl');\n const source = await outputStorage.readFile(storagePath);\n await writeFile(pklPath, source);\n\n return {\n pklPath,\n outputDirectory,\n storagePath,\n isGcs: true,\n finalize: async (persistChanges: boolean) => {\n try {\n if (persistChanges) {\n const updated = await readFile(pklPath);\n await outputStorage.writeFile(storagePath, updated);\n markTranscriptIndexDirtyForStorage(outputStorage, outputDirectory, storagePath);\n }\n } finally {\n await rm(tmpRoot, { recursive: true, force: true });\n }\n },\n };\n}\n\nfunction parseStoredSummaries(raw: string): StoredSummary[] {\n try {\n const parsed = JSON.parse(raw) as unknown;\n if (!Array.isArray(parsed)) {\n return [];\n }\n return parsed\n .map((item) => {\n if (!item || typeof item !== 'object') {\n return null;\n }\n const record = item as Record<string, unknown>;\n const id = String(record.id || '').trim();\n const content = String(record.content || '').trim();\n if (!id || !content) {\n return null;\n }\n return {\n id,\n title: String(record.title || '').trim(),\n audience: String(record.audience || '').trim(),\n guidance: String(record.guidance || '').trim(),\n stylePreset: String(record.stylePreset || 'detailed').trim() || 'detailed',\n styleLabel: String(record.styleLabel || 'Detailed summary').trim() || 'Detailed summary',\n content,\n generatedAt: String(record.generatedAt || '').trim() || new Date().toISOString(),\n } satisfies StoredSummary;\n })\n .filter((summary): summary is StoredSummary => summary !== null)\n .sort((a, b) => b.generatedAt.localeCompare(a.generatedAt));\n } catch {\n return [];\n }\n}\n\nconst SUMMARY_STYLE_PRESETS: Record<string, SummaryStylePreset> = {\n quick_bullets: {\n label: 'Quick paragraph + bullet points',\n instructions: 'Write one concise paragraph followed by 4-8 bullets covering decisions, actions, and risks.',\n },\n detailed: {\n label: 'Detailed summary',\n instructions: 'Write a structured summary with context, key discussion points, decisions, open questions, and next steps.',\n },\n attendee_facing: {\n label: 'Attendee-facing summary',\n instructions: 'Write a professional external-facing summary suitable for attendees; avoid private/internal reflections unless explicitly approved.',\n },\n};\n\nfunction splitIntoCandidateSentences(content: string): string[] {\n return content\n .split(/\\n+|(?<=[.!?])\\s+/g)\n .map((sentence) => sentence.trim())\n .filter((sentence) => sentence.length >= 8);\n}\n\nfunction normalizeTaskText(sentence: string): string {\n const normalized = sentence\n .replace(/^(?:i need to|we need to|i should|we should|let'?s|remember to|todo:|action item:)\\s+/i, '')\n .replace(/\\s+/g, ' ')\n .trim();\n return normalized.charAt(0).toUpperCase() + normalized.slice(1);\n}\n\nfunction inferDueDate(sentence: string): string | null {\n const lower = sentence.toLowerCase();\n if (lower.includes('today')) {\n return 'today';\n }\n if (lower.includes('tomorrow')) {\n return 'tomorrow';\n }\n if (lower.includes('next week')) {\n return 'next week';\n }\n if (lower.includes('this week')) {\n return 'this week';\n }\n if (lower.includes('by friday')) {\n return 'by friday';\n }\n return null;\n}\n\nfunction extractHashtagTags(sentence: string): string[] {\n const matches = sentence.match(/#[a-z0-9_-]+/gi) || [];\n return Array.from(new Set(matches.map((tag) => tag.slice(1).toLowerCase())));\n}\n\nfunction toConfidenceBucket(score: number): CandidateConfidence {\n if (score >= 0.75) {\n return 'high';\n }\n if (score >= 0.5) {\n return 'medium';\n }\n return 'low';\n}\n\nfunction scoreTaskCandidate(sentence: string): { score: number; rationale: string } | null {\n const explicitActionPattern = /\\b(i need to|we need to|i should|we should|let'?s|remember to|todo|action item|i will|i'll|must)\\b/i;\n const inferredIntentPattern = /\\b(follow up|check|review|investigate|confirm|decide|plan|schedule|reach out|send|draft|prepare|update|fix|create|write|call|email|look into|figure out)\\b/i;\n\n let score = 0;\n const rationaleParts: string[] = [];\n\n if (explicitActionPattern.test(sentence)) {\n score += 0.55;\n rationaleParts.push('explicit action language');\n }\n\n if (inferredIntentPattern.test(sentence)) {\n score += 0.35;\n rationaleParts.push('inferred follow-up intent');\n }\n\n if (inferDueDate(sentence)) {\n score += 0.1;\n rationaleParts.push('time cue detected');\n }\n\n if (score < 0.3) {\n return null;\n }\n\n return {\n score: Math.min(1, Number(score.toFixed(2))),\n rationale: rationaleParts.join('; '),\n };\n}\n\nfunction getSuggestedEntities(\n entities: NonNullable<TranscriptMetadata['entities']> | undefined\n): Array<{ id: string; name: string; type: 'person' | 'project' | 'term' | 'company' }> {\n if (!entities) {\n return [];\n }\n\n const people = (entities.people || []).map((entity) => ({ ...entity, type: 'person' as const }));\n const projects = (entities.projects || []).map((entity) => ({ ...entity, type: 'project' as const }));\n const terms = (entities.terms || []).map((entity) => ({ ...entity, type: 'term' as const }));\n const companies = (entities.companies || []).map((entity) => ({ ...entity, type: 'company' as const }));\n return [...people, ...projects, ...terms, ...companies];\n}\n\n// ============================================================================\n// Tool Definitions\n// ============================================================================\n\nexport const readTranscriptTool: Tool = {\n name: 'protokoll_read_transcript',\n description:\n 'Read a transcript file and parse its metadata and content. ' +\n 'Path is relative to the configured output directory. ' +\n 'Returns structured data including title, metadata, routing info, and content.',\n inputSchema: {\n type: 'object',\n properties: {\n transcriptPath: {\n type: 'string',\n description: \n 'Transcript URI (preferred) or relative path from output directory. ' +\n 'URI format: \"protokoll://transcript/2026/2/12-1606-meeting\" (no file extension). ' +\n 'Path format: \"2026/2/12-1606-meeting\" or \"2026/2/12-1606-meeting.pkl\"',\n },\n contextDirectory: {\n type: 'string',\n description: 'Optional: Path to the .protokoll context directory',\n },\n },\n required: ['transcriptPath'],\n },\n};\n\nexport const listTranscriptsTool: Tool = {\n name: 'protokoll_list_transcripts',\n description:\n 'List transcripts with pagination, filtering, and search. ' +\n 'If no directory is specified, uses the configured output directory. ' +\n 'Returns transcript metadata including date, time, title, and file path. ' +\n 'Supports sorting by date (default), filename, or title. ' +\n 'Can filter by date range and search within transcript content.',\n inputSchema: {\n type: 'object',\n properties: {\n directory: {\n type: 'string',\n description: \n 'Optional: Directory to search for transcripts (searches recursively). ' +\n 'If not specified, uses the configured output directory.',\n },\n limit: {\n type: 'number',\n description: 'Maximum number of results to return (default: 50)',\n default: 50,\n },\n offset: {\n type: 'number',\n description: 'Number of results to skip for pagination (default: 0)',\n default: 0,\n },\n sortBy: {\n type: 'string',\n enum: ['date', 'filename', 'title'],\n description: 'Field to sort by (default: date)',\n default: 'date',\n },\n startDate: {\n type: 'string',\n description: 'Filter transcripts from this date onwards (YYYY-MM-DD format)',\n },\n endDate: {\n type: 'string',\n description: 'Filter transcripts up to this date (YYYY-MM-DD format)',\n },\n search: {\n type: 'string',\n description: 'Search for transcripts containing this text (searches filename and content)',\n },\n entityId: {\n type: 'string',\n description: 'Filter to transcripts that reference this entity ID',\n },\n entityType: {\n type: 'string',\n enum: ['person', 'project', 'term', 'company'],\n description: 'Entity type to filter by (used with entityId to narrow search)',\n },\n contextDirectory: {\n type: 'string',\n description: 'Optional: Path to the .protokoll context directory',\n },\n },\n required: [],\n },\n};\n\nexport const identifyTasksFromTranscriptTool: Tool = {\n name: 'protokoll_identify_tasks_from_transcript',\n description:\n 'Identify task candidates from transcript or note content without creating tasks. ' +\n 'Returns structured candidates with confidence buckets, rationale, and metadata suggestions ' +\n 'so users can review and choose which tasks to create.',\n inputSchema: {\n type: 'object',\n properties: {\n transcriptPath: {\n type: 'string',\n description:\n 'Transcript URI (preferred) or relative path from output directory. ' +\n 'URI format: \"protokoll://transcript/2026/2/12-1606-meeting\" (no file extension). ' +\n 'Path format: \"2026/2/12-1606-meeting\" or \"2026/2/12-1606-meeting.pkl\"',\n },\n maxCandidates: {\n type: 'number',\n description: 'Maximum number of candidates to return (default: 25, max: 50)',\n default: 25,\n },\n includeTagSuggestions: {\n type: 'boolean',\n description: 'Whether to include suggested tags based on transcript metadata and hashtags (default: true)',\n default: true,\n },\n contextDirectory: {\n type: 'string',\n description: 'Optional: Path to the .protokoll context directory',\n },\n },\n required: ['transcriptPath'],\n },\n};\n\nexport const editTranscriptTool: Tool = {\n name: 'protokoll_edit_transcript',\n description:\n 'Edit an existing transcript\\'s title, project assignment, tags, and/or status. ' +\n 'Path is relative to the configured output directory. ' +\n 'IMPORTANT: When you change the title, this tool RENAMES THE FILE to match the new title (slugified). ' +\n 'Always use this tool instead of directly editing transcript files when changing titles. ' +\n 'Changing the project will update metadata and may move the file to a new location ' +\n 'based on the project\\'s routing configuration.',\n inputSchema: {\n type: 'object',\n properties: {\n transcriptPath: {\n type: 'string',\n description: \n 'Transcript URI (preferred) or relative path from output directory. ' +\n 'URI format: \"protokoll://transcript/2026/2/12-1606-meeting\" (no file extension). ' +\n 'Path format: \"2026/2/12-1606-meeting\" or \"2026/2/12-1606-meeting.pkl\"',\n },\n title: {\n type: 'string',\n description: 'New title for the transcript. This will RENAME the file to match the slugified title.',\n },\n projectId: {\n type: 'string',\n description: 'New project ID to assign',\n },\n tagsToAdd: {\n type: 'array',\n items: { type: 'string' },\n description: 'Tags to add to the transcript (will be deduplicated with existing tags)',\n },\n tagsToRemove: {\n type: 'array',\n items: { type: 'string' },\n description: 'Tags to remove from the transcript',\n },\n comments: {\n type: 'array',\n description: 'Replace transcript comments metadata with this full list.',\n items: {\n type: 'object',\n properties: {\n id: { type: 'string' },\n text: { type: 'string' },\n createdAt: { type: 'string', description: 'ISO-8601 timestamp' },\n updatedAt: { type: 'string', description: 'ISO-8601 timestamp (optional)' },\n },\n required: ['id', 'text', 'createdAt'],\n },\n },\n status: {\n type: 'string',\n enum: ['initial', 'enhanced', 'reviewed', 'in_progress', 'closed', 'archived'],\n description: 'New lifecycle status. Status transitions are recorded in history.',\n },\n contextDirectory: {\n type: 'string',\n description: 'Optional: Path to the .protokoll context directory',\n },\n },\n required: ['transcriptPath'],\n },\n};\n\nexport const summarizeTranscriptTool: Tool = {\n name: 'protokoll_summarize_transcript',\n description:\n 'Generate an audience-aware summary for a transcript using privacy/sensitivity guardrails. ' +\n 'Returns markdown summary text and does not modify transcript content.',\n inputSchema: {\n type: 'object',\n properties: {\n transcriptPath: {\n type: 'string',\n description:\n 'Transcript URI (preferred) or relative path from output directory. ' +\n 'URI format: \"protokoll://transcript/2026/2/12-1606-meeting\" (no file extension). ' +\n 'Path format: \"2026/2/12-1606-meeting\" or \"2026/2/12-1606-meeting.pkl\"',\n },\n audience: {\n type: 'string',\n description: 'Optional audience label (e.g. internal team, project attendees, external partner)',\n },\n stylePreset: {\n type: 'string',\n enum: ['quick_bullets', 'detailed', 'attendee_facing'],\n description: 'Summary style preset (default: detailed)',\n default: 'detailed',\n },\n guidance: {\n type: 'string',\n description: 'Optional extra instructions, especially for privacy/sensitivity constraints',\n },\n summaryTitle: {\n type: 'string',\n description: 'Optional title to use in the generated summary',\n },\n model: {\n type: 'string',\n description: `LLM model for summary generation (default: ${DEFAULT_MODEL})`,\n },\n contextDirectory: {\n type: 'string',\n description: 'Optional: Path to the .protokoll context directory',\n },\n },\n required: ['transcriptPath'],\n },\n};\n\nexport const deleteTranscriptSummaryTool: Tool = {\n name: 'protokoll_delete_transcript_summary',\n description:\n 'Delete a previously generated summary from transcript artifact storage by summary ID. ' +\n 'Path is relative to the configured output directory.',\n inputSchema: {\n type: 'object',\n properties: {\n transcriptPath: {\n type: 'string',\n description:\n 'Transcript URI (preferred) or relative path from output directory. ' +\n 'URI format: \"protokoll://transcript/2026/2/12-1606-meeting\" (no file extension). ' +\n 'Path format: \"2026/2/12-1606-meeting\" or \"2026/2/12-1606-meeting.pkl\"',\n },\n summaryId: {\n type: 'string',\n description: 'Summary ID to remove (for example: \"summary-174...\" )',\n },\n contextDirectory: {\n type: 'string',\n description: 'Optional: Path to the .protokoll context directory',\n },\n },\n required: ['transcriptPath', 'summaryId'],\n },\n};\n\nexport const changeTranscriptDateTool: Tool = {\n name: 'protokoll_change_transcript_date',\n description:\n 'Change the date of an existing transcript. ' +\n 'This will move the transcript file to a new location based on the new date and the project\\'s routing configuration. ' +\n 'The file will be moved to the appropriate YYYY/MM/ directory structure. ' +\n 'Path is relative to the configured output directory. ' +\n 'WARNING: This may remove the transcript from the current view if it moves to a different date folder.',\n inputSchema: {\n type: 'object',\n properties: {\n transcriptPath: {\n type: 'string',\n description: \n 'Transcript URI (preferred) or relative path from output directory. ' +\n 'URI format: \"protokoll://transcript/2026/2/12-1606-meeting\" (no file extension). ' +\n 'Path format: \"2026/2/12-1606-meeting\" or \"2026/2/12-1606-meeting.pkl\"',\n },\n newDate: {\n type: 'string',\n description: \n 'New date for the transcript in ISO 8601 format (YYYY-MM-DD or full ISO datetime). ' +\n 'Examples: \"2026-01-15\", \"2026-01-15T10:30:00Z\"',\n },\n contextDirectory: {\n type: 'string',\n description: 'Optional: Path to the .protokoll context directory',\n },\n },\n required: ['transcriptPath', 'newDate'],\n },\n};\n\nexport const combineTranscriptsTool: Tool = {\n name: 'protokoll_combine_transcripts',\n description:\n 'Combine multiple transcripts into a single document. ' +\n 'Paths are relative to the configured output directory. ' +\n 'Source files are automatically deleted after combining. ' +\n 'Metadata from the first transcript is preserved, and content is organized into sections.',\n inputSchema: {\n type: 'object',\n properties: {\n transcriptPaths: {\n type: 'array',\n items: { type: 'string' },\n description: \n 'Array of relative paths from the output directory. ' +\n 'Examples: [\"meeting-1.pkl\", \"meeting-2.pkl\"] or [\"2026/2/01-1325.pkl\", \"2026/2/01-1400.pkl\"]',\n },\n title: {\n type: 'string',\n description: 'Title for the combined transcript',\n },\n projectId: {\n type: 'string',\n description: 'Project ID to assign to the combined transcript',\n },\n contextDirectory: {\n type: 'string',\n description: 'Optional: Path to the .protokoll context directory',\n },\n },\n required: ['transcriptPaths'],\n },\n};\n\nexport const provideFeedbackTool: Tool = {\n name: 'protokoll_provide_feedback',\n description:\n 'Provide natural language feedback to correct a transcript. ' +\n 'Path is relative to the configured output directory. ' +\n 'The feedback is processed by an agentic model that can: ' +\n '- Fix spelling and term errors ' +\n '- Add new terms, people, or companies to context ' +\n '- Change project assignment ' +\n '- Update the title ' +\n 'Example: \"YB should be Wibey\" or \"San Jay Grouper is actually Sanjay Gupta\"',\n inputSchema: {\n type: 'object',\n properties: {\n transcriptPath: {\n type: 'string',\n description: \n 'Transcript URI (preferred) or relative path from output directory. ' +\n 'URI format: \"protokoll://transcript/2026/2/12-1606-meeting\" (no file extension). ' +\n 'Path format: \"2026/2/12-1606-meeting\" or \"2026/2/12-1606-meeting.pkl\"',\n },\n feedback: {\n type: 'string',\n description: 'Natural language feedback describing corrections needed',\n },\n model: {\n type: 'string',\n description: 'LLM model for processing feedback (default: gpt-5.2)',\n },\n contextDirectory: {\n type: 'string',\n description: 'Optional: Path to the .protokoll context directory',\n },\n },\n required: ['transcriptPath', 'feedback'],\n },\n};\n\nexport const enhanceTranscriptTool: Tool = {\n name: 'protokoll_enhance_transcript',\n description:\n 'Enhance an existing transcript using the same post-transcription pipeline flow ' +\n '(simple-replace + agentic tool-based enhancement) used after Whisper completes. ' +\n 'Reads from originalText when provided, otherwise uses raw transcript text if available, ' +\n 'falling back to current transcript content. Writes enhanced content and updates metadata/status.',\n inputSchema: {\n type: 'object',\n properties: {\n transcriptPath: {\n type: 'string',\n description:\n 'Transcript URI (preferred) or relative path from output directory. ' +\n 'URI format: \"protokoll://transcript/2026/2/12-1606-meeting\" (no file extension). ' +\n 'Path format: \"2026/2/12-1606-meeting\" or \"2026/2/12-1606-meeting.pkl\"',\n },\n originalText: {\n type: 'string',\n description:\n 'Optional explicit source text to enhance (usually the Original tab text). ' +\n 'If omitted, tool uses raw transcript text when present, else current content.',\n },\n model: {\n type: 'string',\n description: `LLM model for enhancement (default: ${DEFAULT_MODEL})`,\n },\n contextDirectory: {\n type: 'string',\n description: 'Optional: Path to the .protokoll context directory',\n },\n },\n required: ['transcriptPath'],\n },\n};\n\nexport const updateTranscriptContentTool: Tool = {\n name: 'protokoll_update_transcript_content',\n description:\n 'Update the content section of a transcript file while preserving all metadata. ' +\n 'Path is relative to the configured output directory. ' +\n 'This tool replaces only the content between the --- delimiters, keeping all metadata intact. ' +\n 'IMPORTANT: The content parameter should contain ONLY the transcript body text (the text after the --- delimiter), ' +\n 'NOT the full transcript file with headers and metadata. If the full transcript is provided, ' +\n 'the tool will automatically extract only the content section to prevent duplication.',\n inputSchema: {\n type: 'object',\n properties: {\n transcriptPath: {\n type: 'string',\n description: \n 'Transcript URI (preferred) or relative path from output directory. ' +\n 'URI format: \"protokoll://transcript/2026/2/12-1606-meeting\" (no file extension). ' +\n 'Path format: \"2026/2/12-1606-meeting\" or \"2026/2/12-1606-meeting.pkl\"',\n },\n content: {\n type: 'string',\n description: \n 'New content to replace the transcript body. ' +\n 'Should contain ONLY the body text (content after the --- delimiter). ' +\n 'If the full transcript is provided, the tool will extract only the content section automatically.',\n },\n contentTarget: {\n type: 'string',\n enum: ['enhanced', 'original'],\n description:\n 'Which content stream to update. ' +\n '\"enhanced\" updates transcript content (default). ' +\n '\"original\" updates raw transcript text only and never modifies enhanced content.',\n },\n contextDirectory: {\n type: 'string',\n description: 'Optional: Path to the .protokoll context directory',\n },\n },\n required: ['transcriptPath', 'content'],\n },\n};\n\nexport const updateTranscriptEntityReferencesTool: Tool = {\n name: 'protokoll_update_transcript_entity_references',\n description:\n 'Update the Entity References section of a transcript file while preserving all other content. ' +\n 'Path is relative to the configured output directory. ' +\n 'This tool replaces only the Entity References section at the end of the transcript, ' +\n 'preserving the title, metadata, and body content.',\n inputSchema: {\n type: 'object',\n properties: {\n transcriptPath: {\n type: 'string',\n description: \n 'Transcript URI (preferred) or relative path from output directory. ' +\n 'URI format: \"protokoll://transcript/2026/2/12-1606-meeting\" (no file extension). ' +\n 'Path format: \"2026/2/12-1606-meeting\" or \"2026/2/12-1606-meeting.pkl\"',\n },\n entities: {\n type: 'object',\n description: 'Entity references to update',\n properties: {\n people: {\n type: 'array',\n items: {\n type: 'object',\n properties: {\n id: { type: 'string', description: 'Entity ID (slugified identifier)' },\n name: { type: 'string', description: 'Display name' },\n },\n required: ['id', 'name'],\n },\n },\n projects: {\n type: 'array',\n items: {\n type: 'object',\n properties: {\n id: { type: 'string', description: 'Entity ID (slugified identifier)' },\n name: { type: 'string', description: 'Display name' },\n },\n required: ['id', 'name'],\n },\n },\n terms: {\n type: 'array',\n items: {\n type: 'object',\n properties: {\n id: { type: 'string', description: 'Entity ID (slugified identifier)' },\n name: { type: 'string', description: 'Display name' },\n },\n required: ['id', 'name'],\n },\n },\n companies: {\n type: 'array',\n items: {\n type: 'object',\n properties: {\n id: { type: 'string', description: 'Entity ID (slugified identifier)' },\n name: { type: 'string', description: 'Display name' },\n },\n required: ['id', 'name'],\n },\n },\n },\n },\n contextDirectory: {\n type: 'string',\n description: 'Optional: Path to the .protokoll context directory',\n },\n },\n required: ['transcriptPath', 'entities'],\n },\n};\n\nexport const createNoteTool: Tool = {\n name: 'protokoll_create_note',\n description:\n 'Create a new note/transcript file in the configured output directory. ' +\n 'The file will be created with proper metadata formatting and placed in a date-based directory structure (YYYY/MM/). ' +\n 'Returns the relative path to the created file.',\n inputSchema: {\n type: 'object',\n properties: {\n title: {\n type: 'string',\n description: 'Title for the note/transcript',\n },\n content: {\n type: 'string',\n description: 'Content/body text for the note (optional, can be empty)',\n default: '',\n },\n projectId: {\n type: 'string',\n description: 'Optional: Project ID to assign to the note',\n },\n tags: {\n type: 'array',\n items: { type: 'string' },\n description: 'Optional: Tags to add to the note',\n },\n date: {\n type: 'string',\n description: 'Optional: Date for the note (ISO 8601 format, e.g., \"2026-02-02\"). Defaults to current date.',\n },\n contextDirectory: {\n type: 'string',\n description: 'Optional: Path to the .protokoll context directory',\n },\n },\n required: ['title'],\n },\n};\n\nexport const getEnhancementLogTool: Tool = {\n name: 'protokoll_get_enhancement_log',\n description:\n 'Get the enhancement log for a transcript. ' +\n 'Returns a timestamped audit trail of enhancement pipeline steps (transcribe, enhance, simple-replace phases). ' +\n 'Shows what happened during processing: entities found, corrections applied, tools called, etc.',\n inputSchema: {\n type: 'object',\n properties: {\n transcriptPath: {\n type: 'string',\n description: \n 'Transcript URI (preferred) or relative path from output directory. ' +\n 'URI format: \"protokoll://transcript/2026/2/12-1606-meeting\" (no file extension). ' +\n 'Path format: \"2026/2/12-1606-meeting\" or \"2026/2/12-1606-meeting.pkl\"',\n },\n phase: {\n type: 'string',\n enum: ['transcribe', 'enhance', 'simple-replace'],\n description: 'Optional: Filter to a specific phase',\n },\n limit: {\n type: 'number',\n description: 'Maximum number of entries to return (default: 100)',\n },\n offset: {\n type: 'number',\n description: 'Number of entries to skip for pagination (default: 0)',\n },\n contextDirectory: {\n type: 'string',\n description: 'Optional: Path to the .protokoll context directory',\n },\n },\n required: ['transcriptPath'],\n },\n};\n\nexport const correctToEntityTool: Tool = {\n name: 'protokoll_correct_to_entity',\n description:\n 'Correct misheard text in transcript by mapping to existing or new entity. ' +\n 'Atomically updates transcript content, adds misspelling to entity sounds_like array, ' +\n 'updates entity references, and logs the correction to enhancement_log. ' +\n 'This is the primary mechanism for training the transcription system. ' +\n 'Context directory is resolved from server configuration.',\n inputSchema: {\n type: 'object',\n properties: {\n transcriptPath: {\n type: 'string',\n description:\n 'Transcript URI (preferred) or relative path from output directory. ' +\n 'URI format: \"protokoll://transcript/2026/2/12-1606-meeting\" (no file extension). ' +\n 'Path format: \"2026/2/12-1606-meeting\" or \"2026/2/12-1606-meeting.pkl\"',\n },\n selectedText: {\n type: 'string',\n description: 'The misheard text to correct',\n },\n entityType: {\n type: 'string',\n enum: ['person', 'project', 'term', 'company'],\n description: 'Type of entity',\n },\n entityId: {\n type: 'string',\n description: 'ID of existing entity (for map-to-existing flow)',\n },\n entityName: {\n type: 'string',\n description: 'Name of new entity to create (for create-new flow)',\n },\n firstName: {\n type: 'string',\n description: 'First name (person entities only)',\n },\n lastName: {\n type: 'string',\n description: 'Last name (person entities only)',\n },\n description: {\n type: 'string',\n description: 'Description/context for the new entity',\n },\n projectId: {\n type: 'string',\n description: 'Associated project ID (person entities only)',\n },\n contextDirectory: {\n type: 'string',\n description: 'Optional: Path to the .protokoll context directory',\n },\n },\n required: ['transcriptPath', 'selectedText', 'entityType'],\n },\n};\n\nexport const rejectCorrectionTool: Tool = {\n name: 'protokoll_reject_correction',\n description:\n 'Reject a previously applied enhancement correction and undo its text replacement in the transcript. ' +\n 'Also logs the rejection in enhancement_log for auditability.',\n inputSchema: {\n type: 'object',\n properties: {\n transcriptPath: {\n type: 'string',\n description:\n 'Transcript URI (preferred) or relative path from output directory. ' +\n 'URI format: \"protokoll://transcript/2026/2/12-1606-meeting\" (no file extension). ' +\n 'Path format: \"2026/2/12-1606-meeting\" or \"2026/2/12-1606-meeting.pkl\"',\n },\n correctionEntryId: {\n type: 'number',\n description: 'Enhancement log entry id for the correction_applied event to reject',\n },\n contextDirectory: {\n type: 'string',\n description: 'Optional: Path to the .protokoll context directory',\n },\n },\n required: ['transcriptPath', 'correctionEntryId'],\n },\n};\n\n// ============================================================================\n// Tool Handlers\n// ============================================================================\n\nexport async function handleReadTranscript(args: { \n transcriptPath: string;\n contextDirectory?: string;\n}) {\n const access = await openToolTranscript(args.transcriptPath, args.contextDirectory);\n let summaries: StoredSummary[] = [];\n let transcriptData: Awaited<ReturnType<typeof readTranscriptFromStorage>>;\n try {\n // Use protokoll-format storage API directly - returns structured JSON\n transcriptData = await readTranscriptFromStorage(access.pklPath);\n\n const transcriptHandle = PklTranscript.open(access.pklPath, { readOnly: true });\n try {\n const historyArtifact = transcriptHandle.getArtifact('summary_history');\n const rawHistory = historyArtifact?.data?.toString('utf8') || '[]';\n summaries = parseStoredSummaries(rawHistory);\n } finally {\n transcriptHandle.close();\n }\n } finally {\n await access.finalize(false);\n }\n\n // Convert to relative path for response\n const relativePath = access.storagePath\n ? await sanitizePath(access.storagePath, access.outputDirectory)\n : await sanitizePath(access.pklPath, access.outputDirectory);\n\n // Return complete structured JSON for client display\n // Clients should NOT need to parse this - all data is ready to display\n return {\n filePath: relativePath,\n title: transcriptData.metadata.title || '',\n metadata: {\n date: transcriptData.metadata.date?.toISOString() || null,\n recordingTime: transcriptData.metadata.recordingTime || null,\n duration: transcriptData.metadata.duration || null,\n project: transcriptData.metadata.project || null,\n projectId: transcriptData.metadata.projectId || null,\n tags: transcriptData.metadata.tags || [],\n status: transcriptData.metadata.status || 'initial',\n confidence: transcriptData.metadata.confidence || null,\n routing: transcriptData.metadata.routing || null,\n history: transcriptData.metadata.history || [],\n tasks: transcriptData.metadata.tasks || [],\n comments: (transcriptData.metadata as TranscriptMetadataWithComments).comments || [],\n entities: transcriptData.metadata.entities || {},\n },\n content: transcriptData.content,\n hasRawTranscript: transcriptData.hasRawTranscript,\n contentLength: transcriptData.content.length,\n summaries,\n };\n}\n\nexport async function handleListTranscripts(args: {\n directory?: string;\n limit?: number;\n offset?: number;\n sortBy?: 'date' | 'filename' | 'title';\n startDate?: string;\n endDate?: string;\n search?: string;\n entityId?: string;\n entityType?: 'person' | 'project' | 'term' | 'company';\n contextDirectory?: string;\n}) {\n const ServerConfig = await import('../serverConfig');\n const outputStorage = ServerConfig.getOutputStorage();\n\n // Get directory from args or config\n const directory = args.directory \n ? resolve(args.directory)\n : await getConfiguredDirectory('outputDirectory', args.contextDirectory);\n\n if (outputStorage.name !== 'gcs' && !await fileExists(directory)) {\n throw new Error(`Directory not found: ${directory}`);\n }\n\n // Use protokoll-format storage API directly\n const result = await listTranscriptsFromStorage({\n directory,\n limit: args.limit ?? 50,\n offset: args.offset ?? 0,\n sortBy: args.sortBy ?? 'date',\n startDate: args.startDate,\n endDate: args.endDate,\n search: args.search,\n entityId: args.entityId,\n entityType: args.entityType,\n });\n\n // Convert all paths to relative paths from output directory\n const outputDirectory = await getConfiguredDirectory('outputDirectory', args.contextDirectory);\n const relativeTranscripts = await Promise.all(\n result.transcripts.map(async (t) => ({\n path: await sanitizePath(t.filePath, outputDirectory),\n relativePath: t.relativePath,\n title: t.title,\n date: t.date?.toISOString() || null,\n project: t.project || null,\n tags: t.tags,\n status: t.status,\n duration: t.duration || null,\n contentPreview: t.contentPreview,\n }))\n );\n\n return {\n directory: await sanitizePath(directory, outputDirectory) || '.',\n transcripts: relativeTranscripts,\n pagination: {\n total: result.total,\n limit: args.limit ?? 50,\n offset: args.offset ?? 0,\n hasMore: result.hasMore,\n nextOffset: result.hasMore ? (args.offset ?? 0) + (args.limit ?? 50) : null,\n },\n filters: {\n sortBy: args.sortBy ?? 'date',\n startDate: args.startDate,\n endDate: args.endDate,\n search: args.search,\n entityId: args.entityId,\n entityType: args.entityType,\n },\n };\n}\n\nexport async function handleIdentifyTasksFromTranscript(args: {\n transcriptPath: string;\n maxCandidates?: number;\n includeTagSuggestions?: boolean;\n contextDirectory?: string;\n}) {\n const access = await openToolTranscript(args.transcriptPath, args.contextDirectory);\n let transcriptData: Awaited<ReturnType<typeof readTranscriptFromStorage>>;\n try {\n transcriptData = await readTranscriptFromStorage(access.pklPath);\n } finally {\n await access.finalize(false);\n }\n\n const content = transcriptData.content?.trim() || '';\n if (!content) {\n return {\n transcriptPath: args.transcriptPath,\n candidates: [] as TaskCandidate[],\n totalCandidates: 0,\n message: 'Transcript content is empty; no task candidates identified.',\n };\n }\n\n const limit = Math.max(1, Math.min(50, args.maxCandidates ?? 25));\n const includeTagSuggestions = args.includeTagSuggestions !== false;\n const existingTags = transcriptData.metadata.tags || [];\n const suggestedEntities = getSuggestedEntities(transcriptData.metadata.entities);\n const suggestedProject = {\n id: transcriptData.metadata.projectId || null,\n name: transcriptData.metadata.project || null,\n };\n\n const candidates = splitIntoCandidateSentences(content)\n .map((sentence, index) => {\n const scored = scoreTaskCandidate(sentence);\n if (!scored) {\n return null;\n }\n\n const sentenceTags = includeTagSuggestions ? extractHashtagTags(sentence) : [];\n const mergedTags = includeTagSuggestions\n ? Array.from(new Set([...existingTags.map((tag) => tag.toLowerCase()), ...sentenceTags]))\n : [];\n\n const candidate: TaskCandidate = {\n id: `candidate-${index + 1}`,\n taskText: normalizeTaskText(sentence),\n confidence: scored.score,\n confidenceBucket: toConfidenceBucket(scored.score),\n rationale: scored.rationale,\n sourceExcerpt: sentence,\n suggestedDueDate: inferDueDate(sentence),\n suggestedProject,\n suggestedEntities,\n suggestedTags: mergedTags,\n };\n\n return candidate;\n })\n .filter((candidate): candidate is TaskCandidate => candidate !== null)\n .sort((a, b) => b.confidence - a.confidence)\n .slice(0, limit);\n\n return {\n transcriptPath: args.transcriptPath,\n candidates,\n totalCandidates: candidates.length,\n message: candidates.length > 0\n ? `Identified ${candidates.length} task candidate(s).`\n : 'No likely task candidates found in transcript content.',\n };\n}\n\nexport async function handleSummarizeTranscript(args: {\n transcriptPath: string;\n audience?: string;\n stylePreset?: 'quick_bullets' | 'detailed' | 'attendee_facing' | string;\n guidance?: string;\n summaryTitle?: string;\n model?: string;\n contextDirectory?: string;\n}) {\n const startedAt = Date.now();\n const logSummary = (message: string, data: Record<string, unknown>) => {\n process.stdout.write(`Protokoll: [SUMMARY] ${message} ${JSON.stringify(data)}\\n`);\n };\n\n logSummary('Tool call received', {\n transcriptPath: args.transcriptPath,\n audience: args.audience,\n stylePreset: args.stylePreset || 'detailed',\n hasGuidance: !!args.guidance?.trim(),\n hasSummaryTitle: !!args.summaryTitle?.trim(),\n model: args.model || DEFAULT_MODEL,\n });\n\n const access = await openToolTranscript(args.transcriptPath, args.contextDirectory);\n const absolutePath = access.pklPath;\n let persistSummaryHistory = false;\n try {\n logSummary('Resolved transcript path', {\n transcriptPath: args.transcriptPath,\n absolutePath,\n });\n\n const transcriptData = await readTranscriptFromStorage(absolutePath);\n\n const transcriptContent = (transcriptData.content || '').trim();\n if (!transcriptContent) {\n logSummary('Transcript content empty, cannot summarize', {\n transcriptPath: args.transcriptPath,\n absolutePath,\n });\n throw new Error('Transcript content is empty; cannot generate summary.');\n }\n\n const audience = (args.audience || '').trim() || 'General audience';\n\n const stylePreset = (args.stylePreset || 'detailed').trim();\n const selectedStyle = SUMMARY_STYLE_PRESETS[stylePreset] || SUMMARY_STYLE_PRESETS.detailed;\n const guidance = (args.guidance || '').trim();\n const model = args.model || DEFAULT_MODEL;\n\n const transcriptTitle = transcriptData.metadata.title || 'Untitled transcript';\n const transcriptDate = transcriptData.metadata.date instanceof Date\n ? transcriptData.metadata.date.toISOString().slice(0, 10)\n : 'unknown date';\n const preferredTitle = (args.summaryTitle || '').trim();\n\n const boundedContent = transcriptContent.length > MAX_CONTENT_LENGTH\n ? `${transcriptContent.slice(0, MAX_CONTENT_LENGTH)}\\n\\n[...transcript truncated for summarization input length...]`\n : transcriptContent;\n const truncated = transcriptContent.length > MAX_CONTENT_LENGTH;\n logSummary('Prepared summary input', {\n transcriptTitle,\n transcriptDate,\n transcriptLength: transcriptContent.length,\n boundedLength: boundedContent.length,\n truncated,\n stylePreset,\n });\n\n const reasoning = Reasoning.create({\n model,\n reasoningLevel: 'medium',\n });\n\n const prompt = [\n 'Create an audience-aware summary for the transcript below.',\n '',\n `Transcript title: ${transcriptTitle}`,\n `Transcript date: ${transcriptDate}`,\n `Audience: ${audience}`,\n `Style preset: ${selectedStyle.label}`,\n preferredTitle ? `Preferred summary title: ${preferredTitle}` : 'Preferred summary title: (generate one)',\n '',\n 'Style instructions:',\n selectedStyle.instructions,\n '',\n 'Privacy and sensitivity guardrails:',\n '- Treat transcript content as potentially sensitive by default.',\n '- Exclude private internal reflections, personal judgments, or sensitive notes not appropriate for the audience.',\n '- If unsure whether a detail is audience-appropriate, exclude it or generalize safely.',\n '- Prefer factual and neutral language over speculative interpretation.',\n '',\n 'Additional guidance:',\n guidance || 'No extra guidance provided.',\n '',\n 'Required output shape:',\n '1) Title',\n '2) Summary body matching the selected style preset',\n '3) Optional \"Redactions / Exclusions\" section listing what was intentionally omitted for audience safety',\n '',\n 'Transcript:',\n boundedContent,\n ].join('\\n');\n\n const result = await reasoning.complete({\n prompt,\n systemPrompt: 'You are an expert meeting summarizer. Return markdown only.',\n });\n logSummary('Reasoning call completed', {\n transcriptPath: args.transcriptPath,\n model: result.model || model,\n durationMs: result.duration ?? null,\n finishReason: result.finishReason ?? null,\n });\n\n const summary = (result.content || '').trim();\n if (!summary) {\n logSummary('Empty summary response', {\n transcriptPath: args.transcriptPath,\n model: result.model || model,\n });\n throw new Error('No summary text generated.');\n }\n\n logSummary('Summary generated successfully', {\n transcriptPath: args.transcriptPath,\n summaryLength: summary.length,\n elapsedMs: Date.now() - startedAt,\n });\n\n const generatedAt = new Date().toISOString();\n const summaryId = `summary-${Date.now()}-${randomUUID().slice(0, 8)}`;\n const stylePresetKey = SUMMARY_STYLE_PRESETS[stylePreset] ? stylePreset : 'detailed';\n const storedSummary: StoredSummary = {\n id: summaryId,\n title: preferredTitle || `${transcriptTitle} Summary`,\n audience,\n guidance,\n stylePreset: stylePresetKey,\n styleLabel: selectedStyle.label,\n content: summary,\n generatedAt,\n };\n const transcriptHandle = PklTranscript.open(absolutePath, { readOnly: false });\n try {\n const existingHistory = transcriptHandle.getArtifact('summary_history');\n const existingSummaries = parseStoredSummaries(existingHistory?.data?.toString('utf8') || '[]');\n const nextSummaries = [storedSummary, ...existingSummaries.filter((entry) => entry.id !== summaryId)];\n\n transcriptHandle.addArtifact(\n 'summary_history',\n Buffer.from(JSON.stringify(nextSummaries), 'utf8'),\n {\n version: 1,\n count: nextSummaries.length,\n updatedAt: generatedAt,\n model: result.model || model,\n }\n );\n } finally {\n transcriptHandle.close();\n }\n persistSummaryHistory = true;\n logSummary('Summary persisted to transcript artifact storage', {\n transcriptPath: args.transcriptPath,\n summaryId,\n generatedAt,\n });\n\n return {\n summary,\n audience,\n stylePreset: stylePresetKey,\n model: result.model || model,\n summaryId,\n generatedAt,\n };\n } finally {\n await access.finalize(persistSummaryHistory);\n }\n}\n\nexport async function handleDeleteTranscriptSummary(args: {\n transcriptPath: string;\n summaryId: string;\n contextDirectory?: string;\n}) {\n const summaryId = (args.summaryId || '').trim();\n if (!summaryId) {\n throw new Error('summaryId is required');\n }\n\n const access = await openToolTranscript(args.transcriptPath, args.contextDirectory);\n const transcriptHandle = PklTranscript.open(access.pklPath, { readOnly: false });\n try {\n const historyArtifact = transcriptHandle.getArtifact('summary_history');\n const existingSummaries = parseStoredSummaries(historyArtifact?.data?.toString('utf8') || '[]');\n const remainingSummaries = existingSummaries.filter((entry) => entry.id !== summaryId);\n\n if (remainingSummaries.length === existingSummaries.length) {\n throw new Error(`Summary not found: ${summaryId}`);\n }\n\n transcriptHandle.addArtifact(\n 'summary_history',\n Buffer.from(JSON.stringify(remainingSummaries), 'utf8'),\n {\n version: 1,\n count: remainingSummaries.length,\n updatedAt: new Date().toISOString(),\n deletedSummaryId: summaryId,\n }\n );\n\n return {\n success: true,\n summaryId,\n remaining: remainingSummaries.length,\n };\n } finally {\n transcriptHandle.close();\n await access.finalize(true);\n }\n}\n\nexport async function handleEditTranscript(args: {\n transcriptPath: string;\n title?: string;\n projectId?: string;\n tagsToAdd?: string[];\n tagsToRemove?: string[];\n comments?: TranscriptCommentInput[];\n status?: string;\n contextDirectory?: string;\n}) {\n // Validate that contextDirectory is not provided in remote mode\n await validateNotRemoteMode(args.contextDirectory);\n \n // Get the output directory first to ensure consistent validation\n const outputDirectory = await getConfiguredDirectory('outputDirectory', args.contextDirectory);\n \n const ServerConfig = await import('../serverConfig');\n const outputStorage = ServerConfig.getOutputStorage();\n const serverContext = ServerConfig.getContext();\n\n if (outputStorage.name === 'gcs') {\n const access = await openToolTranscript(args.transcriptPath, args.contextDirectory);\n const resolvedStoragePath = access.storagePath || access.pklPath;\n let persistChanges = false;\n\n let statusChanged = false;\n let previousStatus: string | undefined;\n const changes: string[] = [];\n try {\n const transcript = PklTranscript.open(access.pklPath, { readOnly: false });\n try {\n const metadataUpdates: Partial<TranscriptMetadataWithComments> = {};\n\n if (args.title) {\n metadataUpdates.title = args.title.trim();\n changes.push('title updated');\n }\n if (args.projectId) {\n const context = await getProjectLookupContext(args.contextDirectory);\n const project = await context.getProject(args.projectId);\n let resolvedId: string;\n let resolvedName: string;\n if (project) {\n resolvedId = project.id;\n resolvedName = project.name;\n } else {\n const gcsEntity = await findContextEntityInGcs('project', args.projectId);\n if (gcsEntity && typeof gcsEntity.id === 'string' && typeof gcsEntity.name === 'string') {\n resolvedId = gcsEntity.id;\n resolvedName = gcsEntity.name;\n } else {\n throw new Error(`Project not found: ${args.projectId}`);\n }\n }\n\n metadataUpdates.projectId = resolvedId;\n metadataUpdates.project = resolvedName;\n\n const existingEntities = transcript.metadata.entities || {\n people: [],\n projects: [],\n terms: [],\n companies: [],\n };\n metadataUpdates.entities = {\n people: existingEntities.people || [],\n projects: [{\n id: resolvedId,\n name: resolvedName,\n type: 'project',\n }],\n terms: existingEntities.terms || [],\n companies: existingEntities.companies || [],\n };\n\n changes.push('project changed');\n }\n if (args.tagsToAdd || args.tagsToRemove) {\n const currentTags = transcript.metadata.tags || [];\n let nextTags = [...currentTags];\n if (args.tagsToAdd?.length) {\n for (const tag of args.tagsToAdd) {\n if (!nextTags.includes(tag)) {\n nextTags.push(tag);\n }\n }\n changes.push(`${args.tagsToAdd.length} tag(s) added`);\n }\n if (args.tagsToRemove?.length) {\n nextTags = nextTags.filter(tag => !args.tagsToRemove!.includes(tag));\n changes.push(`${args.tagsToRemove.length} tag(s) removed`);\n }\n metadataUpdates.tags = nextTags;\n }\n\n if (args.status) {\n previousStatus = transcript.metadata.status || 'reviewed';\n if (previousStatus !== args.status) {\n metadataUpdates.status = args.status as Metadata.TranscriptStatus;\n statusChanged = true;\n changes.push(`status: ${previousStatus} → ${args.status}`);\n } else {\n changes.push(`status unchanged (already ${args.status})`);\n }\n }\n if (args.comments) {\n metadataUpdates.comments = normalizeTranscriptComments(args.comments);\n changes.push(`comments updated (${metadataUpdates.comments.length})`);\n }\n\n if (Object.keys(metadataUpdates).length > 0) {\n transcript.updateMetadata(metadataUpdates as Partial<TranscriptMetadata>);\n }\n } finally {\n transcript.close();\n }\n persistChanges = true;\n\n return {\n success: true,\n originalPath: await sanitizePath(resolvedStoragePath, outputDirectory),\n outputPath: await sanitizePath(resolvedStoragePath, outputDirectory),\n renamed: false,\n statusChanged,\n message: changes.length > 0 ? `Transcript updated: ${changes.join(', ')}` : 'No changes made',\n };\n } finally {\n await access.finalize(persistChanges);\n }\n }\n\n // Find the transcript (returns absolute path for file operations)\n const absolutePath = await resolveTranscriptPath(args.transcriptPath, args.contextDirectory);\n\n // Validate status if provided\n if (args.status && !Metadata.isValidStatus(args.status)) {\n throw new Error(\n `Invalid status \"${args.status}\". ` +\n `Valid statuses are: ${Metadata.VALID_STATUSES.join(', ')}`\n );\n }\n\n if (!args.title && !args.projectId && !args.tagsToAdd && !args.tagsToRemove && !args.comments && !args.status) {\n throw new Error('Must specify at least one of: title, projectId, tagsToAdd, tagsToRemove, comments, or status');\n }\n\n let finalOutputPath = absolutePath;\n let wasRenamed = false;\n \n // Handle title/project/tags changes via existing editTranscript function\n // The editTranscript function handles PKL files directly\n if (args.title || args.projectId || args.tagsToAdd || args.tagsToRemove) {\n // Resolve context directories from the running server context (preferred)\n // or fall back to protokoll-config.yaml. The engine's editTranscript creates\n // a fresh Context.create() — it needs explicit contextDirectories so it can\n // find entities without walking up from the transcript's deep output path.\n let contextDirectories = await getContextDirectories();\n if ((!contextDirectories || contextDirectories.length === 0) && serverContext?.hasContext()) {\n contextDirectories = serverContext.getContextDirs();\n }\n\n const result = await Transcript.editTranscript(absolutePath, {\n title: args.title,\n projectId: args.projectId,\n tagsToAdd: args.tagsToAdd,\n tagsToRemove: args.tagsToRemove,\n contextDirectory: args.contextDirectory,\n contextDirectories,\n });\n\n // Validate that the output path stays within the output directory\n validatePathWithinDirectory(result.outputPath, outputDirectory);\n\n // editTranscript handles file operations internally for PKL files\n if (result.outputPath !== absolutePath) {\n wasRenamed = true;\n }\n \n finalOutputPath = result.outputPath;\n }\n\n // Handle status change using PklTranscript\n let statusChanged = false;\n let previousStatus: string | undefined;\n \n if (args.status) {\n const pklPath = ensurePklExtension(finalOutputPath);\n const transcript = PklTranscript.open(pklPath, { readOnly: false });\n try {\n previousStatus = transcript.metadata.status || 'reviewed';\n \n if (previousStatus !== args.status) {\n transcript.updateMetadata({ status: args.status as Metadata.TranscriptStatus });\n statusChanged = true;\n logger.info('transcript.status.update.complete', {\n transcriptPath: args.transcriptPath,\n previousStatus,\n nextStatus: args.status,\n });\n }\n } finally {\n transcript.close();\n }\n }\n\n if (args.comments) {\n const pklPath = ensurePklExtension(finalOutputPath);\n const transcript = PklTranscript.open(pklPath, { readOnly: false });\n try {\n transcript.updateMetadata({ comments: normalizeTranscriptComments(args.comments) } as Partial<TranscriptMetadata>);\n } finally {\n transcript.close();\n }\n }\n\n // Convert to relative paths for response\n const relativeOriginalPath = await sanitizePath(absolutePath || '', outputDirectory);\n const relativeOutputPath = await sanitizePath(finalOutputPath || '', outputDirectory);\n\n // Build message\n const changes: string[] = [];\n if (wasRenamed) changes.push(`moved to ${relativeOutputPath}`);\n if (args.title) changes.push(`title updated`);\n if (args.projectId) changes.push(`project changed`);\n if (args.tagsToAdd?.length) changes.push(`${args.tagsToAdd.length} tag(s) added`);\n if (args.tagsToRemove?.length) changes.push(`${args.tagsToRemove.length} tag(s) removed`);\n if (args.comments) changes.push(`comments updated (${normalizeTranscriptComments(args.comments).length})`);\n if (statusChanged) changes.push(`status: ${previousStatus} → ${args.status}`);\n if (!statusChanged && args.status) changes.push(`status unchanged (already ${args.status})`);\n\n return {\n success: true,\n originalPath: relativeOriginalPath,\n outputPath: relativeOutputPath,\n renamed: wasRenamed,\n statusChanged,\n message: changes.length > 0 ? `Transcript updated: ${changes.join(', ')}` : 'No changes made',\n };\n}\n\nexport async function handleChangeTranscriptDate(args: {\n transcriptPath: string;\n newDate: string;\n contextDirectory?: string;\n}) {\n const fsPromises = await import('node:fs/promises');\n const path = await import('node:path');\n \n // Parse the new date\n const newDate = new Date(args.newDate);\n if (isNaN(newDate.getTime())) {\n throw new Error(`Invalid date format: ${args.newDate}. Use ISO 8601 format (e.g., \"2026-01-15\" or \"2026-01-15T10:30:00Z\")`);\n }\n\n const access = await openToolTranscript(args.transcriptPath, args.contextDirectory);\n if (access.isGcs) {\n const transcript = PklTranscript.open(access.pklPath, { readOnly: false });\n try {\n transcript.updateMetadata({ date: newDate });\n } finally {\n transcript.close();\n await access.finalize(true);\n }\n\n const relativePath = access.storagePath\n ? await sanitizePath(access.storagePath, access.outputDirectory)\n : await sanitizePath(access.pklPath, access.outputDirectory);\n\n return {\n success: true,\n originalPath: relativePath,\n outputPath: relativePath,\n moved: false,\n message: 'Transcript date updated (GCS mode keeps the same object path).',\n };\n }\n\n // Get the output directory\n const outputDirectory = await getConfiguredDirectory('outputDirectory', args.contextDirectory);\n \n // Local mode: use already-resolved PKL path\n const absolutePath = access.pklPath;\n \n // Determine the new directory structure based on the date\n // Use YYYY/M structure (month-level organization, no zero-padding to match router convention)\n // Use UTC methods to avoid timezone issues with date-only strings\n const year = newDate.getUTCFullYear();\n const month = (newDate.getUTCMonth() + 1).toString(); // No zero-padding (e.g., \"8\" not \"08\")\n const newDirPath = path.join(outputDirectory, String(year), month);\n \n // Get the filename from the original path\n const filename = path.basename(absolutePath);\n const newAbsolutePath = path.join(newDirPath, filename);\n \n // Check if the file would move to a different location\n if (absolutePath === newAbsolutePath) {\n // Still update the date in metadata even if not moving\n const pklPath = ensurePklExtension(absolutePath);\n const transcript = PklTranscript.open(pklPath, { readOnly: false });\n try {\n transcript.updateMetadata({ date: newDate });\n } finally {\n transcript.close();\n }\n \n return {\n success: true,\n originalPath: await sanitizePath(pklPath, outputDirectory),\n outputPath: await sanitizePath(pklPath, outputDirectory),\n moved: false,\n message: 'Transcript date updated. No move needed (already in correct directory).',\n };\n }\n \n // Validate that the new path stays within the output directory\n validatePathWithinDirectory(newAbsolutePath, outputDirectory);\n \n // Create the new directory if it doesn't exist\n await mkdir(newDirPath, { recursive: true });\n \n // Check if a file already exists at the destination\n const destExists = await transcriptExists(newAbsolutePath);\n if (destExists.exists) {\n throw new Error(\n `A file already exists at the destination: ${await sanitizePath(destExists.path || newAbsolutePath, outputDirectory)}. ` +\n `Please rename the transcript first or choose a different date.`\n );\n }\n \n // Ensure we're working with PKL files\n const pklPath = ensurePklExtension(absolutePath);\n const newPklPath = ensurePklExtension(newAbsolutePath);\n \n // Update the date in metadata\n const transcript = PklTranscript.open(pklPath, { readOnly: false });\n try {\n transcript.updateMetadata({ date: newDate });\n } finally {\n transcript.close();\n }\n \n // Move the file to the new location\n await fsPromises.rename(pklPath, newPklPath);\n \n // Also move any associated WAL/SHM files if they exist\n const walPath = pklPath + '-wal';\n const shmPath = pklPath + '-shm';\n try {\n await fsPromises.rename(walPath, newPklPath + '-wal');\n } catch { /* ignore if doesn't exist */ }\n try {\n await fsPromises.rename(shmPath, newPklPath + '-shm');\n } catch { /* ignore if doesn't exist */ }\n \n // Convert to relative paths for response\n const relativeOriginalPath = await sanitizePath(pklPath, outputDirectory);\n const relativeOutputPath = await sanitizePath(newPklPath, outputDirectory);\n \n return {\n success: true,\n originalPath: relativeOriginalPath,\n outputPath: relativeOutputPath,\n moved: true,\n message: `Transcript moved from ${relativeOriginalPath} to ${relativeOutputPath}`,\n };\n}\n\nexport async function handleCombineTranscripts(args: {\n transcriptPaths: string[];\n title?: string;\n projectId?: string;\n contextDirectory?: string;\n}) {\n // Validate that contextDirectory is not provided in remote mode\n await validateNotRemoteMode(args.contextDirectory);\n\n const ServerConfig = await import('../serverConfig');\n const outputStorage = ServerConfig.getOutputStorage();\n if (outputStorage.name === 'gcs') {\n throw new Error(\n 'Combining transcripts is not yet supported in GCS mode. ' +\n 'Please run this operation against a filesystem-backed workspace.'\n );\n }\n \n if (args.transcriptPaths.length < 2) {\n throw new Error('At least 2 transcript files are required');\n }\n\n // Find all transcripts (returns absolute paths for file operations)\n const absolutePaths: string[] = [];\n for (const relativePath of args.transcriptPaths) {\n const absolute = await resolveTranscriptPath(relativePath, args.contextDirectory);\n absolutePaths.push(absolute);\n }\n\n // Resolve context directories from server config (preferred) and\n // fall back to active server context directories when available.\n const serverContext = ServerConfig.getContext();\n let contextDirectories = await getContextDirectories();\n if ((!contextDirectories || contextDirectories.length === 0) && serverContext?.hasContext()) {\n contextDirectories = serverContext.getContextDirs();\n }\n \n const result = await Transcript.combineTranscripts(absolutePaths, {\n title: args.title,\n projectId: args.projectId,\n contextDirectory: args.contextDirectory,\n contextDirectories,\n });\n\n // Validate that the output path stays within the output directory\n // This prevents project routing from writing files outside the allowed directory\n await validatePathWithinOutputDirectory(result.outputPath, args.contextDirectory);\n\n // The combineTranscripts function in operations.ts now creates the PKL file directly\n // No additional validation or writing needed here - the file is already saved\n\n // Delete source files\n const fsPromises = await import('node:fs/promises');\n const deletedFiles: string[] = [];\n for (const sourcePath of absolutePaths) {\n try {\n await fsPromises.unlink(sourcePath);\n deletedFiles.push(sourcePath);\n } catch {\n // Ignore deletion errors\n }\n }\n\n // Convert to relative paths for response\n const outputDirectory = await getConfiguredDirectory('outputDirectory', args.contextDirectory);\n const relativeOutputPath = await sanitizePath(result.outputPath || '', outputDirectory);\n const relativeSourceFiles = await Promise.all(\n absolutePaths.map(p => sanitizePath(p || '', outputDirectory))\n );\n const relativeDeletedFiles = await Promise.all(\n deletedFiles.map(p => sanitizePath(p || '', outputDirectory))\n );\n\n return {\n success: true,\n outputPath: relativeOutputPath,\n sourceFiles: relativeSourceFiles,\n deletedFiles: relativeDeletedFiles,\n message: `Combined ${absolutePaths.length} transcripts into: ${relativeOutputPath}`,\n };\n}\n\nexport async function handleUpdateTranscriptContent(args: {\n transcriptPath: string;\n content: string;\n contentTarget?: 'enhanced' | 'original' | string;\n contextDirectory?: string;\n}) {\n const updateRawTranscript = String(args.contentTarget || 'enhanced') === 'original';\n const access = await openToolTranscript(args.transcriptPath, args.contextDirectory);\n try {\n const transcript = PklTranscript.open(access.pklPath, { readOnly: false });\n try {\n if (updateRawTranscript) {\n const raw = transcript.hasRawTranscript ? transcript.rawTranscript : undefined;\n transcript.addArtifact(\n 'raw_transcript',\n Buffer.from(args.content, 'utf8'),\n {\n model: raw?.model,\n duration: raw?.duration,\n transcribedAt: raw?.transcribedAt,\n updatedAt: new Date().toISOString(),\n updatedBy: 'protokoll_update_transcript_content',\n }\n );\n } else {\n // Update the content - PklTranscript handles history tracking automatically\n transcript.updateContent(args.content);\n }\n } finally {\n transcript.close();\n }\n\n const relativePath = access.storagePath\n ? await sanitizePath(access.storagePath, access.outputDirectory)\n : await sanitizePath(access.pklPath, access.outputDirectory);\n\n return {\n success: true,\n filePath: relativePath,\n updatedTarget: updateRawTranscript ? 'original' : 'enhanced',\n message: updateRawTranscript\n ? 'Original transcript text updated successfully'\n : 'Transcript content updated successfully',\n };\n } finally {\n await access.finalize(true);\n }\n}\n\nexport async function handleUpdateTranscriptEntityReferences(args: {\n transcriptPath: string;\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 contextDirectory?: string;\n}) {\n const access = await openToolTranscript(args.transcriptPath, args.contextDirectory);\n const absolutePath = access.pklPath;\n try {\n\n // Validate and sanitize entity IDs\n const validateEntityId = (id: string, name: string, type: string): string => {\n if (!id || typeof id !== 'string') {\n throw new Error(`Invalid entity ID for ${type} \"${name}\": ID must be a non-empty string`);\n }\n \n // Check for common JSON parsing errors\n if (id.includes('},') || id.includes('{') || id.includes('}') || id.includes(',')) {\n throw new Error(\n `Invalid entity ID \"${id}\" for ${type} \"${name}\". ` +\n `Entity IDs should be UUIDs or slugified identifiers (e.g., \"a1b2c3d4-...\", \"jack-smith\"), ` +\n `not JSON syntax. Please provide a valid ID.`\n );\n }\n \n // Accept UUID format\n const uuidRegex = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;\n if (uuidRegex.test(id)) {\n return id.trim();\n }\n \n // Accept slug format for backward compatibility\n const slugRegex = /^[a-z0-9_-]+$/i;\n if (slugRegex.test(id)) {\n return id.trim();\n }\n \n throw new Error(\n `Invalid entity ID \"${id}\" for ${type} \"${name}\". ` +\n `Entity IDs should be UUIDs or slugified identifiers (letters, numbers, hyphens, underscores).`\n );\n };\n\n // Convert incoming entities to EntityReference format with validation\n const entityReferences: Metadata.EntityReference[] = [];\n \n if (args.entities.people) {\n entityReferences.push(...args.entities.people.map(e => ({\n id: validateEntityId(e.id, e.name, 'person'),\n name: e.name.trim(),\n type: 'person' as const,\n })));\n }\n \n if (args.entities.projects) {\n entityReferences.push(...args.entities.projects.map(e => ({\n id: validateEntityId(e.id, e.name, 'project'),\n name: e.name.trim(),\n type: 'project' as const,\n })));\n }\n \n if (args.entities.terms) {\n entityReferences.push(...args.entities.terms.map(e => ({\n id: validateEntityId(e.id, e.name, 'term'),\n name: e.name.trim(),\n type: 'term' as const,\n })));\n }\n \n if (args.entities.companies) {\n entityReferences.push(...args.entities.companies.map(e => ({\n id: validateEntityId(e.id, e.name, 'company'),\n name: e.name.trim(),\n type: 'company' as const,\n })));\n }\n\n // Group by type\n const entities: NonNullable<Metadata.TranscriptMetadata['entities']> = {\n people: entityReferences.filter(e => e.type === 'person'),\n projects: entityReferences.filter(e => e.type === 'project'),\n terms: entityReferences.filter(e => e.type === 'term'),\n companies: entityReferences.filter(e => e.type === 'company'),\n };\n\n // Ensure we're working with a PKL file\n const pklPath = ensurePklExtension(absolutePath);\n \n const transcript = PklTranscript.open(pklPath, { readOnly: false });\n const transcriptUuid = transcript.metadata.id;\n const projectId = transcript.metadata.project;\n try {\n // Update entities in metadata\n transcript.updateMetadata({ entities });\n } finally {\n transcript.close();\n }\n\n // Update weight model incrementally\n const { updateTranscriptInWeightModel } = await import('../services/weightModel');\n const allEntityIds = entityReferences.map(e => e.id);\n updateTranscriptInWeightModel(transcriptUuid, allEntityIds, projectId);\n\n // Convert to relative path for response\n const relativePath = access.storagePath\n ? await sanitizePath(access.storagePath, access.outputDirectory)\n : await sanitizePath(pklPath, access.outputDirectory);\n\n return {\n success: true,\n filePath: relativePath,\n message: 'Transcript entity references updated successfully',\n };\n } finally {\n await access.finalize(true);\n }\n}\n\nexport async function handleProvideFeedback(args: {\n transcriptPath: string;\n feedback: string;\n model?: string;\n contextDirectory?: string;\n}) {\n const access = await openToolTranscript(args.transcriptPath, args.contextDirectory);\n const absolutePath = access.pklPath;\n\n // Ensure we're working with a PKL file\n const pklPath = ensurePklExtension(absolutePath);\n \n const transcript = PklTranscript.open(pklPath, { readOnly: false });\n try {\n const transcriptContent = transcript.content;\n const context = await createToolContext(args.contextDirectory);\n const reasoning = Reasoning.create({ model: args.model || DEFAULT_MODEL });\n\n // Create a feedback context\n const feedbackCtx: Transcript.FeedbackContext = {\n transcriptPath: pklPath,\n transcriptContent,\n originalContent: transcriptContent,\n context,\n changes: [],\n verbose: false,\n dryRun: true, // Set to dry run so we can apply changes ourselves\n };\n\n await Transcript.processFeedback(args.feedback, feedbackCtx, reasoning);\n\n // Apply content changes to the PKL file\n if (feedbackCtx.changes.length > 0) {\n // Update content if it changed\n if (feedbackCtx.transcriptContent !== transcriptContent) {\n transcript.updateContent(feedbackCtx.transcriptContent);\n }\n \n // Handle title changes\n const titleChange = feedbackCtx.changes.find(c => c.type === 'title_changed');\n if (titleChange && titleChange.details.new_title) {\n transcript.updateMetadata({ title: titleChange.details.new_title as string });\n }\n \n // Handle project changes\n const projectChange = feedbackCtx.changes.find(c => c.type === 'project_changed');\n if (projectChange && projectChange.details.project_id) {\n transcript.updateMetadata({ \n projectId: projectChange.details.project_id as string,\n project: projectChange.details.project_name as string | undefined,\n });\n }\n }\n\n // Convert to relative path for response\n const outputDirectory = await getConfiguredDirectory('outputDirectory', args.contextDirectory);\n const relativeOutputPath = await sanitizePath(pklPath, outputDirectory);\n\n return {\n success: true,\n changesApplied: feedbackCtx.changes.length,\n changes: feedbackCtx.changes.map(c => ({\n type: c.type,\n description: c.description,\n })),\n outputPath: relativeOutputPath,\n moved: false,\n };\n } finally {\n transcript.close();\n await access.finalize(true);\n }\n}\n\nexport async function handleEnhanceTranscript(args: {\n transcriptPath: string;\n originalText?: string;\n model?: string;\n contextDirectory?: string;\n}) {\n const access = await openToolTranscript(args.transcriptPath, args.contextDirectory);\n const pklPath = access.pklPath;\n const requestId = randomUUID();\n\n const transcript = PklTranscript.open(pklPath, { readOnly: false });\n\n let tempDir: string | null = null;\n\n try {\n const explicitOriginal = (args.originalText || '').trim();\n const rawOriginal = (transcript.rawTranscript?.text || '').trim();\n const currentContent = (transcript.content || '').trim();\n const sourceText = explicitOriginal || rawOriginal || currentContent;\n\n if (!sourceText) {\n throw new Error('No source text available to enhance. Save or provide Original content first.');\n }\n\n const model = args.model || DEFAULT_MODEL;\n const reasoningLevel = 'low' as const;\n const maxIterations = 20;\n const startedAt = Date.now();\n let toolCallCount = 0;\n logger.info('transcript.enhance.start', {\n requestId,\n transcriptPath: args.transcriptPath,\n model,\n sourceLength: sourceText.length,\n hasExplicitOriginal: explicitOriginal.length > 0,\n hasRawTranscript: rawOriginal.length > 0,\n contextDirectory: args.contextDirectory ?? null,\n });\n\n // Build context and routing similar to the standard pipeline.\n const context = await createToolContext(args.contextDirectory);\n const projectCount = context.getAllProjects().length;\n const peopleCount = context.getAllPeople().length;\n const termCount = context.getAllTerms().length;\n const companyCount = context.getAllCompanies().length;\n logger.info('transcript.enhance.context.loaded', {\n requestId,\n transcriptPath: args.transcriptPath,\n projectCount,\n peopleCount,\n termCount,\n companyCount,\n });\n const outputDirectory = await getConfiguredDirectory('outputDirectory', args.contextDirectory);\n const defaultStructure = 'month' as const;\n const defaultFilenameOptions = ['date', 'time', 'subject'] as const;\n const routingProjects: Routing.ProjectRoute[] = context.getAllProjects()\n .filter(project => project.active !== false)\n .map(project => ({\n projectId: project.id,\n destination: {\n path: project.routing?.destination || outputDirectory,\n structure: project.routing?.structure || defaultStructure,\n filename_options: project.routing?.filename_options || [...defaultFilenameOptions],\n createDirectories: true,\n },\n classification: project.classification,\n active: project.active,\n auto_tags: project.routing?.auto_tags,\n }));\n const routing = Routing.create({\n default: {\n path: outputDirectory,\n structure: defaultStructure,\n filename_options: [...defaultFilenameOptions],\n createDirectories: true,\n },\n projects: routingProjects,\n conflict_resolution: 'primary',\n }, context);\n\n const fallbackDate = transcript.metadata.date instanceof Date\n ? transcript.metadata.date\n : new Date();\n const fallbackHash = transcript.metadata.audioHash || transcript.metadata.id || '';\n const routingContext: Routing.RoutingContext = {\n transcriptText: sourceText,\n audioDate: fallbackDate,\n sourceFile: pklPath,\n hash: fallbackHash,\n };\n const routeResult = routing.route(routingContext);\n const projectForReplace = routeResult.projectId || transcript.metadata.projectId || transcript.metadata.project;\n\n transcript.enhancementLog.logStep(new Date(), 'enhance', 'enhancement_start', {\n model,\n reasoningLevel,\n maxIterations,\n transcriptPath: args.transcriptPath,\n hasExplicitOriginal: explicitOriginal.length > 0,\n source: explicitOriginal ? 'explicit_original_text' : (rawOriginal ? 'raw_transcript' : 'enhanced_content_fallback'),\n routedProject: routeResult.projectId || null,\n routedConfidence: routeResult.confidence,\n sourceLength: sourceText.length,\n });\n\n // Run simple-replace with the same engine phase used by audio processing.\n tempDir = await mkdtemp(resolve(tmpdir(), 'protokoll-enhance-'));\n const simpleReplace = Phases.createSimpleReplacePhase({ debug: false }, context);\n const simpleReplaceResult = await simpleReplace.replace(\n sourceText,\n {\n project: projectForReplace || undefined,\n confidence: routeResult.confidence,\n },\n tempDir,\n transcript.metadata.id || 'manual-enhancement'\n );\n logger.info('transcript.enhance.simple_replace.complete', {\n requestId,\n transcriptPath: args.transcriptPath,\n replacements: simpleReplaceResult.stats.totalReplacements,\n tier1Replacements: simpleReplaceResult.stats.tier1Replacements,\n tier2Replacements: simpleReplaceResult.stats.tier2Replacements,\n processingTimeMs: simpleReplaceResult.stats.processingTimeMs,\n });\n\n if (simpleReplaceResult.stats.totalReplacements > 0) {\n transcript.enhancementLog.logStep(new Date(), 'simple-replace', 'phase_complete', {\n totalReplacements: simpleReplaceResult.stats.totalReplacements,\n tier1Replacements: simpleReplaceResult.stats.tier1Replacements,\n tier2Replacements: simpleReplaceResult.stats.tier2Replacements,\n projectContext: simpleReplaceResult.stats.projectContext,\n processingTimeMs: simpleReplaceResult.stats.processingTimeMs,\n });\n for (const mapping of simpleReplaceResult.stats.appliedMappings) {\n transcript.enhancementLog.logStep(new Date(), 'simple-replace', 'correction_applied', {\n original: mapping.soundsLike,\n replacement: mapping.correctText,\n tier: mapping.tier,\n occurrences: mapping.occurrences,\n entityId: mapping.entityId,\n entityType: mapping.entityType,\n });\n }\n }\n\n const preIdentifiedEntities: Agentic.ToolContext['preIdentifiedEntities'] = {\n people: new Set<string>(),\n projects: new Set<string>(),\n terms: new Set<string>(),\n companies: new Set<string>(),\n };\n for (const mapping of simpleReplaceResult.stats.appliedMappings) {\n if (!mapping.entityId || !mapping.entityType) {\n continue;\n }\n if (mapping.entityType === 'person') {\n preIdentifiedEntities.people.add(mapping.entityId);\n } else if (mapping.entityType === 'project') {\n preIdentifiedEntities.projects.add(mapping.entityId);\n } else if (mapping.entityType === 'term') {\n preIdentifiedEntities.terms.add(mapping.entityId);\n }\n }\n\n logger.info('transcript.enhance.agentic.start', {\n requestId,\n transcriptPath: args.transcriptPath,\n routedProject: routeResult.projectId || null,\n routedConfidence: routeResult.confidence,\n preIdentifiedPeople: preIdentifiedEntities.people.size,\n preIdentifiedProjects: preIdentifiedEntities.projects.size,\n preIdentifiedTerms: preIdentifiedEntities.terms.size,\n sourceLength: simpleReplaceResult.text.length,\n });\n\n // Run agentic enhancement exactly like pipeline enhancement stage.\n const reasoning = Reasoning.create({ model, reasoningLevel });\n const toolContext: Agentic.ToolContext & {\n modelConfiguration?: { model: string; reasoningLevel?: string };\n onModelCallStart?: (entry: {\n callIndex: number;\n phase: string;\n request: Record<string, unknown>;\n timestamp: Date;\n }) => void;\n onModelCallComplete?: (entry: {\n callIndex: number;\n phase: string;\n durationMs: number;\n response: Record<string, unknown>;\n timestamp: Date;\n }) => void;\n } = {\n transcriptText: simpleReplaceResult.text,\n audioDate: fallbackDate,\n sourceFile: pklPath,\n contextInstance: context,\n routingInstance: routing,\n interactiveMode: false,\n preIdentifiedEntities,\n modelConfiguration: {\n model,\n reasoningLevel,\n },\n onToolCallStart: (tool, input) => {\n toolCallCount++;\n logger.info('transcript.enhance.agentic.tool_start', {\n requestId,\n transcriptPath: args.transcriptPath,\n callIndex: toolCallCount,\n tool,\n input,\n });\n transcript.enhancementLog.logStep(new Date(), 'enhance', 'tool_start', {\n callIndex: toolCallCount,\n tool,\n input,\n });\n },\n onToolCallComplete: (entry) => {\n logger.info('transcript.enhance.agentic.tool_complete', {\n requestId,\n transcriptPath: args.transcriptPath,\n tool: entry.tool,\n durationMs: entry.durationMs,\n success: entry.success,\n });\n transcript.enhancementLog.logStep(entry.timestamp, 'enhance', 'tool_complete', {\n tool: entry.tool,\n input: entry.input,\n output: entry.output,\n durationMs: entry.durationMs,\n success: entry.success,\n });\n },\n onModelCallStart: (entry) => {\n logger.info('transcript.enhance.agentic.model_call_start', {\n requestId,\n transcriptPath: args.transcriptPath,\n callIndex: entry.callIndex,\n phase: entry.phase,\n });\n transcript.enhancementLog.logStep(entry.timestamp, 'enhance', 'model_call_start', {\n callIndex: entry.callIndex,\n phase: entry.phase,\n request: entry.request,\n });\n },\n onModelCallComplete: (entry: {\n callIndex: number;\n phase: string;\n durationMs: number;\n response: Record<string, unknown>;\n timestamp: Date;\n }) => {\n logger.info('transcript.enhance.agentic.model_call_complete', {\n requestId,\n transcriptPath: args.transcriptPath,\n callIndex: entry.callIndex,\n phase: entry.phase,\n durationMs: entry.durationMs,\n });\n transcript.enhancementLog.logStep(entry.timestamp, 'enhance', 'model_call_complete', {\n callIndex: entry.callIndex,\n phase: entry.phase,\n durationMs: entry.durationMs,\n response: entry.response,\n });\n },\n };\n const executor = Agentic.create(reasoning, toolContext);\n\n const agenticResult = await executor.process(simpleReplaceResult.text);\n const enhancedText = (agenticResult.enhancedText || '').trim() || sourceText;\n const enhancementSucceeded = enhancedText.length > 50 && enhancedText !== sourceText;\n const finalStatus = enhancementSucceeded ? 'enhanced' : (transcript.metadata.status || 'initial');\n logger.info('transcript.enhance.agentic.complete', {\n requestId,\n transcriptPath: args.transcriptPath,\n toolsUsed: agenticResult.toolsUsed,\n iterations: agenticResult.iterations,\n totalToolCalls: toolCallCount,\n changed: enhancedText !== sourceText,\n enhancedLength: enhancedText.length,\n elapsedMs: Date.now() - startedAt,\n });\n\n const referenced = agenticResult.state.referencedEntities;\n const entities = {\n people: [] as Metadata.EntityReference[],\n projects: [] as Metadata.EntityReference[],\n terms: [] as Metadata.EntityReference[],\n companies: [] as Metadata.EntityReference[],\n };\n for (const personId of referenced.people) {\n const person = context.getPerson(personId);\n if (person) {\n entities.people.push({ id: person.id, name: person.name, type: 'person' });\n }\n }\n for (const projectId of referenced.projects) {\n const project = context.getProject(projectId);\n if (project) {\n entities.projects.push({ id: project.id, name: project.name, type: 'project' });\n } else {\n const gcsEntity = await findContextEntityInGcs('project', projectId);\n if (gcsEntity && typeof gcsEntity.id === 'string' && typeof gcsEntity.name === 'string') {\n entities.projects.push({ id: gcsEntity.id, name: gcsEntity.name, type: 'project' });\n }\n }\n }\n for (const termId of referenced.terms) {\n const term = context.getTerm(termId);\n if (term) {\n entities.terms.push({ id: term.id, name: term.name, type: 'term' });\n }\n }\n for (const companyId of referenced.companies) {\n const company = context.getCompany(companyId);\n if (company) {\n entities.companies.push({ id: company.id, name: company.name, type: 'company' });\n }\n }\n const hasEntities = entities.people.length > 0\n || entities.projects.length > 0\n || entities.terms.length > 0\n || entities.companies.length > 0;\n\n const decidedProjectId = agenticResult.state.routeDecision?.projectId || routeResult.projectId || undefined;\n let decidedProjectName: string | undefined;\n if (decidedProjectId) {\n const decidedProject = context.getProject(decidedProjectId);\n if (decidedProject) {\n decidedProjectName = decidedProject.name;\n } else {\n const gcsEntity = await findContextEntityInGcs('project', decidedProjectId);\n if (gcsEntity && typeof gcsEntity.name === 'string') {\n decidedProjectName = gcsEntity.name;\n }\n }\n }\n const decidedConfidence = agenticResult.state.routeDecision?.confidence ?? routeResult.confidence;\n\n transcript.updateContent(enhancedText);\n transcript.updateMetadata({\n status: finalStatus as TranscriptMetadata['status'],\n projectId: decidedProjectId || transcript.metadata.projectId,\n project: decidedProjectName || transcript.metadata.project,\n confidence: typeof decidedConfidence === 'number' ? decidedConfidence : transcript.metadata.confidence,\n entities: hasEntities ? entities : transcript.metadata.entities,\n });\n\n transcript.enhancementLog.logStep(new Date(), 'enhance', 'enhancement_complete', {\n status: finalStatus,\n model,\n reasoningLevel,\n maxIterations,\n toolsUsed: agenticResult.toolsUsed,\n totalToolCalls: toolCallCount,\n iterations: agenticResult.iterations,\n processingTimeMs: Date.now() - startedAt,\n });\n logger.info('transcript.enhance.complete', {\n requestId,\n transcriptPath: args.transcriptPath,\n status: finalStatus,\n projectId: decidedProjectId || null,\n totalToolCalls: toolCallCount,\n changed: enhancedText !== sourceText,\n processingTimeMs: Date.now() - startedAt,\n });\n\n return {\n success: true,\n transcriptPath: args.transcriptPath,\n status: finalStatus,\n projectId: decidedProjectId || null,\n projectName: decidedProjectName || null,\n toolsUsed: agenticResult.toolsUsed,\n totalToolCalls: toolCallCount,\n iterations: agenticResult.iterations,\n processingTimeMs: Date.now() - startedAt,\n sourceLength: sourceText.length,\n enhancedLength: enhancedText.length,\n changed: enhancedText !== sourceText,\n };\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n transcript.enhancementLog.logStep(new Date(), 'enhance', 'enhancement_failed', {\n transcriptPath: args.transcriptPath,\n model: args.model || DEFAULT_MODEL,\n reasoningLevel: 'medium',\n maxIterations: 20,\n error: message,\n });\n // Always emit a terminal completion event so clients waiting on\n // enhancement_complete can reliably exit \"in progress\" state.\n transcript.enhancementLog.logStep(new Date(), 'enhance', 'enhancement_complete', {\n status: 'error',\n failed: true,\n transcriptPath: args.transcriptPath,\n model: args.model || DEFAULT_MODEL,\n reasoningLevel: 'medium',\n maxIterations: 20,\n error: message,\n });\n logger.error('transcript.enhance.failed', {\n requestId,\n transcriptPath: args.transcriptPath,\n error: message,\n stack: error instanceof Error ? error.stack : undefined,\n });\n throw error;\n } finally {\n if (tempDir) {\n await rm(tempDir, { recursive: true, force: true });\n }\n transcript.close();\n await access.finalize(true);\n }\n}\n\nexport async function handleCreateNote(args: {\n title: string;\n content?: string;\n projectId?: string;\n tags?: string[];\n date?: string;\n contextDirectory?: string;\n}) {\n const ServerConfig = await import('../serverConfig');\n const outputStorage = ServerConfig.getOutputStorage();\n\n // Get the output directory\n const outputDirectory = await getConfiguredDirectory('outputDirectory', args.contextDirectory);\n \n // Parse the date or use current date\n const noteDate = args.date ? new Date(args.date) : new Date();\n const year = noteDate.getFullYear();\n const month = String(noteDate.getMonth() + 1).padStart(2, '0');\n const day = String(noteDate.getDate()).padStart(2, '0');\n const hours = String(noteDate.getHours()).padStart(2, '0');\n const minutes = String(noteDate.getMinutes()).padStart(2, '0');\n const timestamp = String(noteDate.getTime());\n \n // Create a slug from the title for the filename\n const titleSlug = args.title\n .toLowerCase()\n .replace(/[^a-z0-9]+/g, '-')\n .replace(/^-+|-+$/g, '')\n .substring(0, 50); // Limit length\n \n // Use .pkl extension for PKL format\n const filename = `${day}-${hours}${minutes}-${timestamp.substring(0, 14)}-${titleSlug}.pkl`;\n const relativePath = `${year}/${month}/${filename}`;\n const absolutePath = resolve(outputDirectory, relativePath);\n \n // Validate that the path stays within the output directory\n if (outputStorage.name !== 'gcs') {\n validatePathWithinDirectory(absolutePath, outputDirectory);\n }\n \n // Build metadata\n let projectName: string | undefined;\n \n // If projectId is provided, try to get project name from context\n if (args.projectId) {\n try {\n const context = await getProjectLookupContext(args.contextDirectory);\n const project = await context.getProject(args.projectId);\n if (project) {\n projectName = project.name;\n } else {\n const gcsEntity = await findContextEntityInGcs('project', args.projectId);\n if (gcsEntity && typeof gcsEntity.name === 'string') {\n projectName = gcsEntity.name;\n }\n }\n } catch {\n // Ignore errors - project name is optional\n }\n }\n \n // Build entities\n const entities = {\n people: [] as Metadata.EntityReference[],\n projects: args.projectId && projectName ? [{\n id: args.projectId,\n name: projectName,\n type: 'project' as const,\n }] : [] as Metadata.EntityReference[],\n terms: [] as Metadata.EntityReference[],\n companies: [] as Metadata.EntityReference[],\n };\n \n // Build PKL metadata\n const pklMetadata = {\n id: '', // Will be auto-generated by PklTranscript.create()\n title: args.title,\n date: noteDate,\n projectId: args.projectId,\n project: projectName,\n tags: args.tags || [],\n entities,\n status: 'reviewed' as const, // Default status for new notes\n };\n \n if (outputStorage.name === 'gcs') {\n const tmpRoot = await mkdtemp(`${tmpdir()}/protokoll-mcp-note-`);\n const tmpPklPath = resolve(tmpRoot, filename);\n try {\n const transcript = PklTranscript.create(tmpPklPath, pklMetadata);\n try {\n if (args.content) {\n transcript.updateContent(args.content);\n }\n } finally {\n transcript.close();\n }\n\n const created = await readFile(tmpPklPath);\n await outputStorage.writeFile(relativePath, created);\n markTranscriptIndexDirtyForStorage(outputStorage, outputDirectory, relativePath);\n } finally {\n await rm(tmpRoot, { recursive: true, force: true });\n }\n\n return {\n success: true,\n filePath: await sanitizePath(relativePath, outputDirectory),\n filename: filename,\n message: `Note \"${args.title}\" created successfully`,\n };\n }\n \n // Create directory if it doesn't exist\n await mkdir(dirname(absolutePath), { recursive: true });\n \n // Create PKL transcript\n const transcript = PklTranscript.create(absolutePath, pklMetadata);\n try {\n if (args.content) {\n transcript.updateContent(args.content);\n }\n } finally {\n transcript.close();\n }\n \n // Convert to relative path for response\n const relativeOutputPath = await sanitizePath(absolutePath, outputDirectory);\n \n return {\n success: true,\n filePath: relativeOutputPath,\n filename: filename,\n message: `Note \"${args.title}\" created successfully`,\n };\n}\n\nexport async function handleGetEnhancementLog(args: {\n transcriptPath: string;\n phase?: 'transcribe' | 'enhance' | 'simple-replace';\n limit?: number;\n offset?: number;\n contextDirectory?: string;\n}) {\n const access = await openToolTranscript(args.transcriptPath, args.contextDirectory);\n try {\n const transcript = PklTranscript.open(access.pklPath, { readOnly: true });\n try {\n // Get enhancement log with optional phase filter\n const allEntries = transcript.getEnhancementLog(args.phase ? { phase: args.phase } : undefined);\n\n // Apply pagination\n const limit = args.limit ?? 100;\n const offset = args.offset ?? 0;\n const total = allEntries.length;\n const entries = allEntries.slice(offset, offset + limit);\n\n // Convert entries to serializable format\n const serializedEntries = entries.map((entry: any) => ({\n id: entry.id,\n timestamp: entry.timestamp.toISOString(),\n phase: entry.phase,\n action: entry.action,\n details: entry.details,\n entities: entry.entities,\n }));\n\n return {\n entries: serializedEntries,\n total,\n limit,\n offset,\n hasMore: offset + limit < total,\n };\n } finally {\n transcript.close();\n }\n } finally {\n await access.finalize(false);\n }\n}\n\n/**\n * Apply text corrections using regex replacement\n */\nfunction applyCorrections(\n transcriptText: string,\n corrections: Map<string, string>\n): string {\n let correctedText = transcriptText;\n \n for (const [original, corrected] of corrections) {\n if (original !== corrected && corrected.trim() !== '') {\n // Replace all instances of the original with the corrected version\n const regex = new RegExp(original.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&'), 'gi');\n correctedText = correctedText.replace(regex, corrected);\n }\n }\n \n return correctedText;\n}\n\nfunction countOccurrencesCaseInsensitive(text: string, target: string): number {\n if (!target.trim()) {\n return 0;\n }\n const regex = new RegExp(target.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&'), 'gi');\n const matches = text.match(regex);\n return matches ? matches.length : 0;\n}\n\nexport async function handleRejectCorrection(args: {\n transcriptPath: string;\n correctionEntryId: number;\n contextDirectory?: string;\n}) {\n if (!Number.isInteger(args.correctionEntryId) || args.correctionEntryId < 1) {\n throw new Error('correctionEntryId must be a positive integer');\n }\n\n const access = await openToolTranscript(args.transcriptPath, args.contextDirectory);\n const transcript = PklTranscript.open(access.pklPath, { readOnly: false });\n\n try {\n const allEntries = transcript.getEnhancementLog();\n const correctionEntry = allEntries.find((entry) => entry.id === args.correctionEntryId);\n\n if (!correctionEntry) {\n throw new Error(`Correction entry not found: ${args.correctionEntryId}`);\n }\n if (correctionEntry.action !== 'correction_applied') {\n throw new Error(`Entry ${args.correctionEntryId} is not a correction_applied action`);\n }\n\n const details = (correctionEntry.details || {}) as Record<string, unknown>;\n const original = String(details.original || '').trim();\n const replacement = String(details.replacement || '').trim();\n if (!original || !replacement) {\n throw new Error(`Correction entry ${args.correctionEntryId} is missing original/replacement details`);\n }\n\n const alreadyRejected = allEntries.some((entry) => {\n if (entry.action !== 'correction_rejected') {\n return false;\n }\n const rejectDetails = (entry.details || {}) as Record<string, unknown>;\n return Number(rejectDetails.correctionEntryId) === args.correctionEntryId;\n });\n if (alreadyRejected) {\n return {\n success: true,\n alreadyRejected: true,\n correctionEntryId: args.correctionEntryId,\n original,\n replacement,\n revertedOccurrences: 0,\n message: `Correction #${args.correctionEntryId} is already rejected`,\n };\n }\n\n const originalContent = transcript.content || '';\n const beforeCount = countOccurrencesCaseInsensitive(originalContent, replacement);\n const revertedContent = applyCorrections(\n originalContent,\n new Map([[replacement, original]])\n );\n const afterCount = countOccurrencesCaseInsensitive(revertedContent, replacement);\n const revertedOccurrences = Math.max(0, beforeCount - afterCount);\n const rejectionPhase = correctionEntry.phase === 'transcribe'\n || correctionEntry.phase === 'enhance'\n || correctionEntry.phase === 'simple-replace'\n ? correctionEntry.phase\n : 'simple-replace';\n\n transcript.updateContent(revertedContent);\n transcript.enhancementLog.logStep(\n new Date(),\n rejectionPhase,\n 'correction_rejected',\n {\n correctionEntryId: args.correctionEntryId,\n original,\n replacement,\n revertedOccurrences,\n sourceTimestamp: correctionEntry.timestamp.toISOString(),\n }\n );\n\n return {\n success: true,\n correctionEntryId: args.correctionEntryId,\n original,\n replacement,\n revertedOccurrences,\n message: `Rejected correction #${args.correctionEntryId} and restored \"${replacement}\" to \"${original}\"`,\n };\n } finally {\n transcript.close();\n await access.finalize(true);\n }\n}\n\nexport async function handleCorrectToEntity(args: {\n transcriptPath: string;\n selectedText: string;\n entityType: 'person' | 'project' | 'term' | 'company';\n entityId?: string;\n entityName?: string;\n firstName?: string;\n lastName?: string;\n description?: string;\n projectId?: string;\n contextDirectory?: string;\n}) {\n const { randomUUID } = await import('node:crypto');\n const { slugify } = await import('./shared.js');\n const ServerConfig = await import('../serverConfig');\n \n const context = ServerConfig.getContext();\n if (!context) {\n throw new Error('Server context not initialized. Check server configuration.');\n }\n \n const access = await openToolTranscript(args.transcriptPath, args.contextDirectory);\n const pklPath = access.pklPath;\n \n try {\n let finalEntityId: string;\n let finalEntityName: string;\n let isNewEntity = false;\n \n // Step 1: Create or look up entity using the server's pre-initialized context\n if (args.entityName) {\n const id = randomUUID();\n const slug = slugify(args.entityName);\n \n const entityBase = {\n id,\n slug,\n name: args.entityName,\n };\n \n let newEntity: any;\n switch (args.entityType) {\n case 'person':\n newEntity = {\n ...entityBase,\n type: 'person' as const,\n ...(args.firstName && { firstName: args.firstName }),\n ...(args.lastName && { lastName: args.lastName }),\n ...(args.description && { context: args.description }),\n };\n break;\n case 'project':\n newEntity = { ...entityBase, type: 'project' as const };\n break;\n case 'term':\n newEntity = { ...entityBase, type: 'term' as const };\n break;\n case 'company':\n newEntity = { ...entityBase, type: 'company' as const };\n break;\n }\n \n await context.saveEntity(newEntity);\n markContextEntityIndexDirty(args.entityType);\n finalEntityId = id;\n finalEntityName = args.entityName;\n isNewEntity = true;\n } else if (args.entityId) {\n finalEntityId = args.entityId;\n const { findPersonResilient, findProjectResilient, findTermResilient, findCompanyResilient } = await import('@redaksjon/protokoll-engine');\n let entity: any;\n switch (args.entityType) {\n case 'person': entity = findPersonResilient(context, finalEntityId); break;\n case 'project': entity = findProjectResilient(context, finalEntityId); break;\n case 'term': entity = findTermResilient(context, finalEntityId); break;\n case 'company': entity = findCompanyResilient(context, finalEntityId); break;\n }\n finalEntityName = entity.name;\n } else {\n throw new Error('Either entityId or entityName must be provided');\n }\n \n // Step 2: Update sounds_like on the entity (before opening transcript to avoid interleaving)\n if (args.selectedText.toLowerCase() !== finalEntityName.toLowerCase()) {\n const existingEntity = (() => {\n switch (args.entityType) {\n case 'person': return context.getPerson(finalEntityId);\n case 'project': return context.getProject(finalEntityId);\n case 'term': return context.getTerm(finalEntityId);\n case 'company': return context.getCompany(finalEntityId);\n }\n })();\n \n if (existingEntity) {\n const soundsLike = (existingEntity as any).sounds_like || [];\n if (!soundsLike.includes(args.selectedText)) {\n await context.saveEntity(\n { ...existingEntity, sounds_like: [...soundsLike, args.selectedText] },\n true\n );\n markContextEntityIndexDirty(args.entityType);\n }\n }\n }\n \n // Step 3: All transcript operations in one block with guaranteed close\n const transcript = PklTranscript.open(pklPath, { readOnly: false });\n let transcriptId: string;\n let transcriptProject: string | undefined;\n let allEntityIds: string[];\n \n try {\n // Replace text in content\n const originalContent = transcript.content;\n const corrections = new Map([[args.selectedText, finalEntityName]]);\n const correctedContent = applyCorrections(originalContent, corrections);\n transcript.updateContent(correctedContent);\n \n // Build a fresh entities object (same pattern as handleUpdateTranscriptEntityReferences)\n const existing = transcript.metadata.entities;\n const newEntityRef: Metadata.EntityReference = { id: finalEntityId, name: finalEntityName, type: args.entityType };\n \n const addIfMissing = (arr: Metadata.EntityReference[] | undefined, ref: Metadata.EntityReference): Metadata.EntityReference[] => {\n const list = arr ? [...arr] : [];\n if (!list.some(e => e.id === ref.id)) {\n list.push(ref);\n }\n return list;\n };\n \n const updatedEntities = {\n people: args.entityType === 'person' ? addIfMissing(existing?.people, newEntityRef) : [...(existing?.people || [])],\n projects: args.entityType === 'project' ? addIfMissing(existing?.projects, newEntityRef) : [...(existing?.projects || [])],\n terms: args.entityType === 'term' ? addIfMissing(existing?.terms, newEntityRef) : [...(existing?.terms || [])],\n companies: args.entityType === 'company' ? addIfMissing(existing?.companies, newEntityRef) : [...(existing?.companies || [])],\n };\n \n transcript.updateMetadata({ entities: updatedEntities });\n \n // Log to enhancement_log\n try {\n transcript.enhancementLog.logStep(\n new Date(),\n 'enhance',\n 'correction_applied',\n {\n original: args.selectedText,\n replacement: finalEntityName,\n entityId: finalEntityId,\n entityType: args.entityType,\n isNewEntity\n },\n [{ id: finalEntityId, name: finalEntityName, type: args.entityType }]\n );\n } catch {\n // Enhancement log is not critical\n }\n \n // Capture metadata before closing\n transcriptId = transcript.metadata.id;\n transcriptProject = transcript.metadata.project;\n allEntityIds = [\n ...updatedEntities.people.map(e => e.id),\n ...updatedEntities.projects.map(e => e.id),\n ...updatedEntities.terms.map(e => e.id),\n ...updatedEntities.companies.map(e => e.id),\n ];\n } finally {\n transcript.close();\n }\n \n // Step 4: Trigger weight model update (best-effort, after transcript is closed)\n try {\n const { updateTranscriptInWeightModel } = await import('../services/weightModel');\n updateTranscriptInWeightModel(transcriptId, allEntityIds, transcriptProject);\n } catch {\n // Weight model update is best-effort\n }\n \n return {\n success: true,\n message: `Corrected \"${args.selectedText}\" to \"${finalEntityName}\"`,\n correction: { original: args.selectedText, replacement: finalEntityName },\n entity: { id: finalEntityId, name: finalEntityName, type: args.entityType },\n isNewEntity\n };\n } finally {\n await access.finalize(true);\n }\n}\n","/**\n * System Tools - Version and system information\n */\n\n// eslint-disable-next-line import/extensions\nimport type { Tool } from '@modelcontextprotocol/sdk/types.js';\nimport { VERSION, PROGRAM_NAME } from '@/constants';\nimport * as ServerConfig from '../serverConfig';\n\n// ============================================================================\n// Tool Definitions\n// ============================================================================\n\nexport const getVersionTool: Tool = {\n name: 'protokoll_get_version',\n description: 'Get the current version of Protokoll including git information and system details. ' +\n 'Useful for diagnosing if you are using the latest version.',\n inputSchema: {\n type: 'object',\n properties: {},\n required: [],\n },\n};\n\nexport const getInfoTool: Tool = {\n name: 'protokoll_info',\n description: \n 'Get server configuration information including mode (local/remote) and workspace directories. ' +\n 'IMPORTANT: Check this tool first to understand if the server is running in:\\n' +\n '- \"remote\" mode: Server is pre-configured with workspace directories. Directory parameters are NOT accepted and will cause errors.\\n' +\n '- \"local\" mode: Server performs dynamic discovery. Directory parameters are optional and accepted.\\n\\n' +\n 'Use this to determine whether you need to provide contextDirectory parameters to other tools.',\n inputSchema: {\n type: 'object',\n properties: {},\n required: [],\n },\n};\n\n// ============================================================================\n// Handlers\n// ============================================================================\n\nexport interface GetVersionResult {\n version: string;\n programName: string;\n fullVersion: string;\n}\n\nexport async function handleGetVersion(): Promise<GetVersionResult> {\n return {\n version: VERSION,\n programName: PROGRAM_NAME,\n fullVersion: `${PROGRAM_NAME} ${VERSION}`,\n };\n}\n\nexport interface GetInfoResult {\n mode: 'local' | 'remote';\n modeDescription: string;\n acceptsDirectoryParameters: boolean;\n workspaceRoot: string | null;\n inputDirectory: string | null;\n outputDirectory: string | null;\n processedDirectory: string | null;\n contextDirectories: string[] | null;\n configFilePath: string | null;\n}\n\nexport async function handleGetInfo(): Promise<GetInfoResult> {\n const mode = ServerConfig.getServerMode();\n const isRemote = mode === 'remote';\n \n let config;\n try {\n config = ServerConfig.getServerConfig();\n } catch {\n // Not initialized - return minimal info\n return {\n mode: 'local',\n modeDescription: 'Server is running in local mode with dynamic discovery',\n acceptsDirectoryParameters: true,\n workspaceRoot: null,\n inputDirectory: null,\n outputDirectory: null,\n processedDirectory: null,\n contextDirectories: null,\n configFilePath: null,\n };\n }\n \n return {\n mode,\n modeDescription: isRemote\n ? 'Server is running in remote mode with pre-configured workspace directories'\n : 'Server is running in local mode with dynamic discovery',\n acceptsDirectoryParameters: !isRemote,\n workspaceRoot: config.workspaceRoot,\n inputDirectory: config.inputDirectory,\n outputDirectory: config.outputDirectory,\n processedDirectory: config.processedDirectory,\n contextDirectories: config.configFile?.contextDirectories as string[] | null,\n configFilePath: config.configFilePath,\n };\n}\n","/* eslint-disable import/extensions */\n/**\n * Relationship Tools - Manage entity relationships\n */\n\nimport type { Tool } from '@modelcontextprotocol/sdk/types.js';\nimport type { Entity } from '@/context/types';\nimport type { ContextInstance } from '@/context';\nimport { parseEntityUri, createRelationship, type EntityRelationship } from '@redaksjon/context';\nimport { \n findPersonResilient, \n findCompanyResilient, \n findTermResilient, \n findProjectResilient \n} from '@redaksjon/protokoll-engine';\nimport { createToolContext } from './shared.js';\n\n// ============================================================================\n// Type Extensions\n// ============================================================================\n\n/**\n * Entity with relationships field\n */\ntype EntityWithRelationships = Entity & { relationships?: EntityRelationship[] };\n\n// ============================================================================\n// Helper Functions\n// ============================================================================\n\n/**\n * Get an entity by type and ID from context\n */\nfunction getEntityByType(\n context: ContextInstance,\n entityType: string,\n entityId: string\n): Entity | undefined {\n switch (entityType) {\n case 'person':\n return findPersonResilient(context, entityId);\n case 'company':\n return findCompanyResilient(context, entityId);\n case 'term':\n return findTermResilient(context, entityId);\n case 'project':\n return findProjectResilient(context, entityId);\n default:\n return undefined;\n }\n}\n\n// ============================================================================\n// Tool Definitions\n// ============================================================================\n\nexport const addRelationshipTool: Tool = {\n name: 'protokoll_add_relationship',\n description:\n 'Add a relationship between two entities. ' +\n 'Relationships use URIs (redaksjon://{type}/{id}) to reference entities. ' +\n 'Common relationship types: works_at, manages, reports_to, used_in, part_of, expert_in, etc.',\n inputSchema: {\n type: 'object',\n properties: {\n entityType: {\n type: 'string',\n enum: ['person', 'company', 'term', 'project'],\n description: 'Type of the source entity',\n },\n entityId: {\n type: 'string',\n description: 'ID of the source entity',\n },\n targetType: {\n type: 'string',\n enum: ['person', 'company', 'term', 'project'],\n description: 'Type of the target entity',\n },\n targetId: {\n type: 'string',\n description: 'ID of the target entity',\n },\n relationship: {\n type: 'string',\n description: 'Type of relationship (e.g., works_at, manages, used_in, part_of)',\n },\n notes: {\n type: 'string',\n description: 'Optional notes about this relationship',\n },\n metadata: {\n type: 'object',\n description: 'Optional metadata (key-value pairs)',\n },\n contextDirectory: {\n type: 'string',\n description: 'Path to the .protokoll context directory',\n },\n },\n required: ['entityType', 'entityId', 'targetType', 'targetId', 'relationship'],\n },\n};\n\nexport const removeRelationshipTool: Tool = {\n name: 'protokoll_remove_relationship',\n description:\n 'Remove a specific relationship from an entity. ' +\n 'Identifies the relationship by target URI and relationship type.',\n inputSchema: {\n type: 'object',\n properties: {\n entityType: {\n type: 'string',\n enum: ['person', 'company', 'term', 'project'],\n description: 'Type of the source entity',\n },\n entityId: {\n type: 'string',\n description: 'ID of the source entity',\n },\n targetUri: {\n type: 'string',\n description: 'URI of the target entity (redaksjon://{type}/{id})',\n },\n relationship: {\n type: 'string',\n description: 'Type of relationship to remove',\n },\n contextDirectory: {\n type: 'string',\n description: 'Path to the .protokoll context directory',\n },\n },\n required: ['entityType', 'entityId', 'targetUri', 'relationship'],\n },\n};\n\nexport const listRelationshipsTool: Tool = {\n name: 'protokoll_list_relationships',\n description:\n 'List all relationships for an entity. ' +\n 'Returns the relationships array with URIs, types, notes, and metadata.',\n inputSchema: {\n type: 'object',\n properties: {\n entityType: {\n type: 'string',\n enum: ['person', 'company', 'term', 'project'],\n description: 'Type of the entity',\n },\n entityId: {\n type: 'string',\n description: 'ID of the entity',\n },\n relationshipType: {\n type: 'string',\n description: 'Optional: filter by relationship type',\n },\n contextDirectory: {\n type: 'string',\n description: 'Path to the .protokoll context directory',\n },\n },\n required: ['entityType', 'entityId'],\n },\n};\n\nexport const findRelatedEntitiesTool: Tool = {\n name: 'protokoll_find_related_entities',\n description:\n 'Find all entities related to a given entity. ' +\n 'Can filter by relationship type and target entity type.',\n inputSchema: {\n type: 'object',\n properties: {\n entityType: {\n type: 'string',\n enum: ['person', 'company', 'term', 'project'],\n description: 'Type of the source entity',\n },\n entityId: {\n type: 'string',\n description: 'ID of the source entity',\n },\n relationshipType: {\n type: 'string',\n description: 'Optional: filter by relationship type (e.g., works_at, manages)',\n },\n targetType: {\n type: 'string',\n enum: ['person', 'company', 'term', 'project'],\n description: 'Optional: filter by target entity type',\n },\n contextDirectory: {\n type: 'string',\n description: 'Path to the .protokoll context directory',\n },\n },\n required: ['entityType', 'entityId'],\n },\n};\n\n// ============================================================================\n// Handlers\n// ============================================================================\n\nexport async function handleAddRelationship(args: {\n entityType: string;\n entityId: string;\n targetType: string;\n targetId: string;\n relationship: string;\n notes?: string;\n metadata?: Record<string, unknown>;\n contextDirectory?: string;\n}): Promise<{ success: boolean; message: string; relationship: EntityRelationship }> {\n const { entityType, entityId, targetType, targetId, relationship, notes, metadata, contextDirectory } = args;\n\n // Get context\n const contextInstance = await createToolContext(contextDirectory);\n\n // Get the entity\n const entity = getEntityByType(contextInstance, entityType, entityId);\n if (!entity) {\n throw new Error(`Entity not found: ${entityType}/${entityId}`);\n }\n\n // Verify target entity exists\n const targetEntity = getEntityByType(contextInstance, targetType, targetId);\n if (!targetEntity) {\n throw new Error(`Target entity not found: ${targetType}/${targetId}`);\n }\n\n // Create the relationship\n const newRelationship = createRelationship(targetType, targetId, relationship, notes, metadata);\n\n // Prevent duplicate (same uri + relationship type)\n const existingRelationships = (entity as EntityWithRelationships).relationships || [];\n const alreadyExists = existingRelationships.some(\n (r: EntityRelationship) => r.uri === newRelationship.uri && r.relationship === relationship\n );\n if (alreadyExists) {\n throw new Error(`Relationship already exists: ${relationship} to ${newRelationship.uri}`);\n }\n\n // Add to entity's relationships array\n const updatedEntity = {\n ...entity,\n relationships: [...existingRelationships, newRelationship],\n };\n\n // Save the entity (allowUpdate = true since entity already exists)\n await contextInstance.saveEntity(updatedEntity as Entity, true);\n\n return {\n success: true,\n message: `Added ${relationship} relationship from ${entityType}/${entityId} to ${targetType}/${targetId}`,\n relationship: newRelationship,\n };\n}\n\nexport async function handleRemoveRelationship(args: {\n entityType: string;\n entityId: string;\n targetUri: string;\n relationship: string;\n contextDirectory?: string;\n}): Promise<{ success: boolean; message: string }> {\n const { entityType, entityId, targetUri, relationship, contextDirectory } = args;\n\n // Get context\n const contextInstance = await createToolContext(contextDirectory);\n\n // Get the entity\n const entity = getEntityByType(contextInstance, entityType, entityId);\n if (!entity) {\n throw new Error(`Entity not found: ${entityType}/${entityId}`);\n }\n\n // Filter out the relationship\n const relationships = (entity as EntityWithRelationships).relationships || [];\n const filteredRelationships = relationships.filter(\n (r: EntityRelationship) => !(r.uri === targetUri && r.relationship === relationship)\n );\n\n if (filteredRelationships.length === relationships.length) {\n throw new Error(`Relationship not found: ${relationship} to ${targetUri}`);\n }\n\n // Update entity\n const updatedEntity = {\n ...entity,\n relationships: filteredRelationships,\n };\n\n // Save the entity (allowUpdate = true since entity already exists)\n await contextInstance.saveEntity(updatedEntity as Entity, true);\n\n return {\n success: true,\n message: `Removed ${relationship} relationship to ${targetUri}`,\n };\n}\n\nexport async function handleListRelationships(args: {\n entityType: string;\n entityId: string;\n relationshipType?: string;\n contextDirectory?: string;\n}): Promise<{ entityId: string; entityType: string; relationships: EntityRelationship[] }> {\n const { entityType, entityId, relationshipType, contextDirectory } = args;\n\n // Get context\n const contextInstance = await createToolContext(contextDirectory);\n\n // Get the entity\n const entity = getEntityByType(contextInstance, entityType, entityId);\n if (!entity) {\n throw new Error(`Entity not found: ${entityType}/${entityId}`);\n }\n\n // Get relationships\n let relationships = (entity as EntityWithRelationships).relationships || [];\n\n // Filter by relationship type if specified\n if (relationshipType) {\n relationships = relationships.filter((r: EntityRelationship) => r.relationship === relationshipType);\n }\n\n return {\n entityId,\n entityType,\n relationships,\n };\n}\n\nexport async function handleFindRelatedEntities(args: {\n entityType: string;\n entityId: string;\n relationshipType?: string;\n targetType?: string;\n contextDirectory?: string;\n}): Promise<{\n entityId: string;\n entityType: string;\n relatedEntities: Array<{\n relationship: string;\n targetType: string;\n targetId: string;\n targetName: string;\n notes?: string;\n }>;\n}> {\n const { entityType, entityId, relationshipType, targetType, contextDirectory } = args;\n\n // Get context\n const contextInstance = await createToolContext(contextDirectory);\n\n // Get the entity\n const entity = getEntityByType(contextInstance, entityType, entityId);\n if (!entity) {\n throw new Error(`Entity not found: ${entityType}/${entityId}`);\n }\n\n // Get relationships\n let relationships = (entity as EntityWithRelationships).relationships || [];\n\n // Filter by relationship type if specified\n if (relationshipType) {\n relationships = relationships.filter((r: EntityRelationship) => r.relationship === relationshipType);\n }\n\n // Parse URIs and fetch target entities\n const relatedEntities = relationships\n .map((rel: EntityRelationship) => {\n const parsed = parseEntityUri(rel.uri);\n if (!parsed) return null;\n\n // Filter by target type if specified\n if (targetType && parsed.type !== targetType) return null;\n\n // Get the target entity\n const targetEntity = getEntityByType(contextInstance, parsed.type, parsed.id);\n\n if (!targetEntity) return null;\n\n return {\n relationship: rel.relationship,\n targetType: parsed.type,\n targetId: parsed.id,\n targetName: targetEntity.name,\n notes: rel.notes,\n };\n })\n .filter((item): item is NonNullable<typeof item> => item !== null);\n\n return {\n entityId,\n entityType,\n relatedEntities,\n };\n}\n","/* eslint-disable import/extensions */\n/**\n * Content Tools - Manage entity content (URLs, text, documents, etc.)\n */\n\nimport type { Tool } from '@modelcontextprotocol/sdk/types.js';\nimport type { Entity } from '@/context/types';\nimport type { ContextInstance } from '@/context';\nimport { \n findPersonResilient, \n findCompanyResilient, \n findTermResilient, \n findProjectResilient \n} from '@redaksjon/protokoll-engine';\nimport {\n createUrlContent,\n createTextContent,\n createMarkdownContent,\n createCodeContent,\n createDocumentContent,\n type EntityContentItem,\n} from '@redaksjon/context';\nimport { createToolContext } from './shared.js';\n\n// ============================================================================\n// Type Extensions\n// ============================================================================\n\n/**\n * Entity with content field\n */\ntype EntityWithContent = Entity & { content?: EntityContentItem[] };\n\n// ============================================================================\n// Helper Functions\n// ============================================================================\n\n/**\n * Get an entity by type and ID from context\n */\nfunction getEntityByType(\n context: ContextInstance,\n entityType: string,\n entityId: string\n): Entity | undefined {\n switch (entityType) {\n case 'person':\n return findPersonResilient(context, entityId);\n case 'company':\n return findCompanyResilient(context, entityId);\n case 'term':\n return findTermResilient(context, entityId);\n case 'project':\n return findProjectResilient(context, entityId);\n default:\n return undefined;\n }\n}\n\n// ============================================================================\n// Tool Definitions\n// ============================================================================\n\nexport const addContentTool: Tool = {\n name: 'protokoll_add_content',\n description:\n 'Add content to an entity (URL, text, markdown, code, document, etc.). ' +\n 'Content items have a type, title, content string, and optional metadata. ' +\n 'Common types: url, text, markdown, html, code, document, image, video.',\n inputSchema: {\n type: 'object',\n properties: {\n entityType: {\n type: 'string',\n enum: ['person', 'company', 'term', 'project'],\n description: 'Type of the entity',\n },\n entityId: {\n type: 'string',\n description: 'ID of the entity',\n },\n type: {\n type: 'string',\n description: 'Content type (url, text, markdown, html, code, document, image, video, etc.)',\n },\n content: {\n type: 'string',\n description: 'The actual content (URL, text, markdown, code, file path, etc.)',\n },\n title: {\n type: 'string',\n description: 'Title or label for this content',\n },\n mimeType: {\n type: 'string',\n description: 'Optional MIME type (text/plain, text/markdown, application/pdf, etc.)',\n },\n source: {\n type: 'string',\n description: 'Optional source or origin of this content',\n },\n notes: {\n type: 'string',\n description: 'Optional notes about this content',\n },\n metadata: {\n type: 'object',\n description: 'Optional metadata (key-value pairs)',\n },\n contextDirectory: {\n type: 'string',\n description: 'Path to the .protokoll context directory',\n },\n },\n required: ['entityType', 'entityId', 'type', 'content'],\n },\n};\n\nexport const removeContentTool: Tool = {\n name: 'protokoll_remove_content',\n description:\n 'Remove a specific content item from an entity. ' +\n 'Identifies the content by title or by index in the content array.',\n inputSchema: {\n type: 'object',\n properties: {\n entityType: {\n type: 'string',\n enum: ['person', 'company', 'term', 'project'],\n description: 'Type of the entity',\n },\n entityId: {\n type: 'string',\n description: 'ID of the entity',\n },\n title: {\n type: 'string',\n description: 'Title of the content item to remove',\n },\n index: {\n type: 'number',\n description: 'Index of the content item to remove (0-based)',\n },\n contextDirectory: {\n type: 'string',\n description: 'Path to the .protokoll context directory',\n },\n },\n required: ['entityType', 'entityId'],\n },\n};\n\nexport const listContentTool: Tool = {\n name: 'protokoll_list_content',\n description:\n 'List all content items for an entity. ' +\n 'Returns the content array with types, titles, and metadata. ' +\n 'Can filter by content type.',\n inputSchema: {\n type: 'object',\n properties: {\n entityType: {\n type: 'string',\n enum: ['person', 'company', 'term', 'project'],\n description: 'Type of the entity',\n },\n entityId: {\n type: 'string',\n description: 'ID of the entity',\n },\n contentType: {\n type: 'string',\n description: 'Optional: filter by content type (url, text, markdown, etc.)',\n },\n contextDirectory: {\n type: 'string',\n description: 'Path to the .protokoll context directory',\n },\n },\n required: ['entityType', 'entityId'],\n },\n};\n\nexport const getContentTool: Tool = {\n name: 'protokoll_get_content',\n description:\n 'Get a specific content item from an entity. ' +\n 'Returns the full content including the content string.',\n inputSchema: {\n type: 'object',\n properties: {\n entityType: {\n type: 'string',\n enum: ['person', 'company', 'term', 'project'],\n description: 'Type of the entity',\n },\n entityId: {\n type: 'string',\n description: 'ID of the entity',\n },\n title: {\n type: 'string',\n description: 'Title of the content item',\n },\n index: {\n type: 'number',\n description: 'Index of the content item (0-based)',\n },\n contextDirectory: {\n type: 'string',\n description: 'Path to the .protokoll context directory',\n },\n },\n required: ['entityType', 'entityId'],\n },\n};\n\n// ============================================================================\n// Handlers\n// ============================================================================\n\nexport async function handleAddContent(args: {\n entityType: string;\n entityId: string;\n type: string;\n content: string;\n title?: string;\n mimeType?: string;\n source?: string;\n notes?: string;\n metadata?: Record<string, unknown>;\n contextDirectory?: string;\n}): Promise<{ success: boolean; message: string; contentItem: EntityContentItem }> {\n const { entityType, entityId, type, content, title, mimeType, source, notes, metadata, contextDirectory } = args;\n\n // Get context\n const contextInstance = await createToolContext(contextDirectory);\n\n // Get the entity\n const entity = getEntityByType(contextInstance, entityType, entityId);\n if (!entity) {\n throw new Error(`Entity not found: ${entityType}/${entityId}`);\n }\n\n // Create the content item based on type\n let contentItem: EntityContentItem;\n \n switch (type) {\n case 'url':\n contentItem = createUrlContent(content, title, source, notes);\n break;\n case 'text':\n contentItem = createTextContent(content, title, source, notes);\n break;\n case 'markdown':\n contentItem = createMarkdownContent(content, title, source, notes);\n break;\n case 'code':\n contentItem = createCodeContent(\n content,\n metadata?.language as string || 'text',\n title,\n source,\n notes\n );\n break;\n case 'document':\n contentItem = createDocumentContent(content, title, mimeType, notes);\n break;\n default:\n // Generic content item\n contentItem = {\n type,\n title,\n content,\n mimeType,\n source,\n timestamp: new Date().toISOString(),\n notes,\n metadata,\n };\n }\n\n // Add to entity's content array\n const updatedEntity = {\n ...entity,\n content: [...((entity as EntityWithContent).content || []), contentItem],\n };\n\n // Save the entity\n await contextInstance.saveEntity(updatedEntity as Entity);\n\n return {\n success: true,\n message: `Added ${type} content to ${entityType}/${entityId}`,\n contentItem,\n };\n}\n\nexport async function handleRemoveContent(args: {\n entityType: string;\n entityId: string;\n title?: string;\n index?: number;\n contextDirectory?: string;\n}): Promise<{ success: boolean; message: string }> {\n const { entityType, entityId, title, index, contextDirectory } = args;\n\n if (title === undefined && index === undefined) {\n throw new Error('Either title or index must be provided');\n }\n\n // Get context\n const contextInstance = await createToolContext(contextDirectory);\n\n // Get the entity\n const entity = getEntityByType(contextInstance, entityType, entityId);\n if (!entity) {\n throw new Error(`Entity not found: ${entityType}/${entityId}`);\n }\n\n const content = (entity as EntityWithContent).content || [];\n\n // Find and remove the content item\n let filteredContent: EntityContentItem[];\n let removedTitle: string;\n\n if (index !== undefined) {\n if (index < 0 || index >= content.length) {\n throw new Error(`Invalid index: ${index}. Content array has ${content.length} items.`);\n }\n removedTitle = content[index].title || `item at index ${index}`;\n filteredContent = content.filter((_: EntityContentItem, i: number) => i !== index);\n } else {\n const foundIndex = content.findIndex((c: EntityContentItem) => c.title === title);\n if (foundIndex === -1) {\n throw new Error(`Content item not found with title: ${title}`);\n }\n removedTitle = title!;\n filteredContent = content.filter((c: EntityContentItem) => c.title !== title);\n }\n\n // Update entity\n const updatedEntity = {\n ...entity,\n content: filteredContent,\n };\n\n // Save the entity\n await contextInstance.saveEntity(updatedEntity as Entity);\n\n return {\n success: true,\n message: `Removed content \"${removedTitle}\" from ${entityType}/${entityId}`,\n };\n}\n\nexport async function handleListContent(args: {\n entityType: string;\n entityId: string;\n contentType?: string;\n contextDirectory?: string;\n}): Promise<{\n entityId: string;\n entityType: string;\n content: Array<{\n index: number;\n type: string;\n title?: string;\n mimeType?: string;\n source?: string;\n timestamp?: string;\n hasNotes: boolean;\n contentLength: number;\n }>;\n}> {\n const { entityType, entityId, contentType, contextDirectory } = args;\n\n // Get context\n const contextInstance = await createToolContext(contextDirectory);\n\n // Get the entity\n const entity = getEntityByType(contextInstance, entityType, entityId);\n if (!entity) {\n throw new Error(`Entity not found: ${entityType}/${entityId}`);\n }\n\n // Get content\n let content = (entity as EntityWithContent).content || [];\n\n // Filter by content type if specified\n if (contentType) {\n content = content.filter((c: EntityContentItem) => c.type === contentType);\n }\n\n // Return summary (without full content strings for brevity)\n const contentSummary = content.map((item: EntityContentItem, index: number) => ({\n index,\n type: item.type,\n title: item.title,\n mimeType: item.mimeType,\n source: item.source,\n timestamp: item.timestamp,\n hasNotes: !!item.notes,\n contentLength: item.content.length,\n }));\n\n return {\n entityId,\n entityType,\n content: contentSummary,\n };\n}\n\nexport async function handleGetContent(args: {\n entityType: string;\n entityId: string;\n title?: string;\n index?: number;\n contextDirectory?: string;\n}): Promise<{ entityId: string; entityType: string; contentItem: EntityContentItem }> {\n const { entityType, entityId, title, index, contextDirectory } = args;\n\n if (title === undefined && index === undefined) {\n throw new Error('Either title or index must be provided');\n }\n\n // Get context\n const contextInstance = await createToolContext(contextDirectory);\n\n // Get the entity\n const entity = getEntityByType(contextInstance, entityType, entityId);\n if (!entity) {\n throw new Error(`Entity not found: ${entityType}/${entityId}`);\n }\n\n const content = (entity as EntityWithContent).content || [];\n\n // Find the content item\n let contentItem: EntityContentItem | undefined;\n\n if (index !== undefined) {\n if (index < 0 || index >= content.length) {\n throw new Error(`Invalid index: ${index}. Content array has ${content.length} items.`);\n }\n contentItem = content[index];\n } else {\n contentItem = content.find((c: EntityContentItem) => c.title === title);\n if (!contentItem) {\n throw new Error(`Content item not found with title: ${title}`);\n }\n }\n\n return {\n entityId,\n entityType,\n contentItem: contentItem!,\n };\n}\n","/**\n * Status and Task Tools - MCP tools for managing transcript lifecycle status and tasks\n * \n * PKL-only implementation - all transcripts are stored in PKL format.\n */\n// eslint-disable-next-line import/extensions\nimport type { Tool } from '@modelcontextprotocol/sdk/types.js';\nimport { \n isValidStatus as isEngineValidStatus,\n VALID_STATUSES as ENGINE_VALID_STATUSES,\n} from '@redaksjon/protokoll-engine';\nimport { getConfiguredDirectory, sanitizePath, resolveTranscriptPath } from './shared';\nimport { PklTranscript } from '@redaksjon/protokoll-format';\nimport type { Task as PklTask, TranscriptStatus } from '@redaksjon/protokoll-format';\n\n// ============================================================================\n// Helper Functions\n// ============================================================================\n\n// Keep MCP surface forward-compatible when protokoll depends on an engine\n// version that does not yet include a newly introduced status.\ntype SupportedStatus = TranscriptStatus | 'deleted';\n\nconst engineStatuses = ENGINE_VALID_STATUSES as readonly string[];\nconst VALID_STATUSES: SupportedStatus[] = engineStatuses.includes('deleted')\n ? [...ENGINE_VALID_STATUSES] as SupportedStatus[]\n : [...ENGINE_VALID_STATUSES, 'deleted'];\n\nconst isValidStatus = (status: string): status is SupportedStatus =>\n isEngineValidStatus(status) || status === 'deleted';\n\n// ============================================================================\n// Tool Definitions\n// ============================================================================\n\nexport const setStatusTool: Tool = {\n name: 'protokoll_set_status',\n description:\n 'Change the lifecycle status of a transcript. ' +\n 'Valid statuses: initial, enhanced, reviewed, in_progress, closed, archived, deleted. ' +\n 'Status transitions are recorded in history with timestamps. ' +\n 'Use this to track transcript progress through your workflow.',\n inputSchema: {\n type: 'object',\n properties: {\n transcriptPath: {\n type: 'string',\n description:\n 'Transcript URI (preferred) or relative path from output directory. ' +\n 'URI format: \"protokoll://transcript/2026/2/12-1606-meeting\" (no file extension). ' +\n 'Path format: \"2026/2/12-1606-meeting\" or \"2026/2/12-1606-meeting.pkl\"',\n },\n status: {\n type: 'string',\n enum: VALID_STATUSES,\n description:\n 'New status to set. ' +\n 'initial/enhanced: Pipeline states. ' +\n 'reviewed: User has reviewed. ' +\n 'in_progress: Has tasks to complete. ' +\n 'closed: All work done. ' +\n 'archived: Long-term storage. ' +\n 'deleted: Soft-delete marker (not physically removed).',\n },\n contextDirectory: {\n type: 'string',\n description: 'Optional: Path to the .protokoll context directory',\n },\n },\n required: ['transcriptPath', 'status'],\n },\n};\n\nexport const createTaskTool: Tool = {\n name: 'protokoll_create_task',\n description:\n 'Add a new task to a transcript. Tasks are follow-up actions to complete. ' +\n 'Returns the generated task ID for later reference.',\n inputSchema: {\n type: 'object',\n properties: {\n transcriptPath: {\n type: 'string',\n description:\n 'Transcript URI (preferred) or relative path from output directory. ' +\n 'URI format: \"protokoll://transcript/2026/2/12-1606-meeting\" (no file extension). ' +\n 'Path format: \"2026/2/12-1606-meeting\" or \"2026/2/12-1606-meeting.pkl\"',\n },\n description: {\n type: 'string',\n description: 'Description of the task (1-2 sentences)',\n },\n contextDirectory: {\n type: 'string',\n description: 'Optional: Path to the .protokoll context directory',\n },\n },\n required: ['transcriptPath', 'description'],\n },\n};\n\nexport const completeTaskTool: Tool = {\n name: 'protokoll_complete_task',\n description: 'Mark a task as done. Sets the completed timestamp.',\n inputSchema: {\n type: 'object',\n properties: {\n transcriptPath: {\n type: 'string',\n description:\n 'Transcript URI (preferred) or relative path from output directory. ' +\n 'URI format: \"protokoll://transcript/2026/2/12-1606-meeting\" (no file extension). ' +\n 'Path format: \"2026/2/12-1606-meeting\" or \"2026/2/12-1606-meeting.pkl\"',\n },\n taskId: {\n type: 'string',\n description: 'ID of the task to complete (e.g., \"task-1234567890-abc123\")',\n },\n contextDirectory: {\n type: 'string',\n description: 'Optional: Path to the .protokoll context directory',\n },\n },\n required: ['transcriptPath', 'taskId'],\n },\n};\n\nexport const deleteTaskTool: Tool = {\n name: 'protokoll_delete_task',\n description: 'Remove a task from a transcript permanently.',\n inputSchema: {\n type: 'object',\n properties: {\n transcriptPath: {\n type: 'string',\n description:\n 'Transcript URI (preferred) or relative path from output directory. ' +\n 'URI format: \"protokoll://transcript/2026/2/12-1606-meeting\" (no file extension). ' +\n 'Path format: \"2026/2/12-1606-meeting\" or \"2026/2/12-1606-meeting.pkl\"',\n },\n taskId: {\n type: 'string',\n description: 'ID of the task to delete (e.g., \"task-1234567890-abc123\")',\n },\n contextDirectory: {\n type: 'string',\n description: 'Optional: Path to the .protokoll context directory',\n },\n },\n required: ['transcriptPath', 'taskId'],\n },\n};\n\n// ============================================================================\n// Tool Handlers\n// ============================================================================\n\nexport async function handleSetStatus(args: {\n transcriptPath: string;\n status: string;\n contextDirectory?: string;\n}) {\n // Validate status\n if (!isValidStatus(args.status)) {\n throw new Error(\n `Invalid status \"${args.status}\". ` +\n `Valid statuses are: ${VALID_STATUSES.join(', ')}`\n );\n }\n \n const newStatus = args.status as SupportedStatus;\n \n // Find the transcript\n const absolutePath = await resolveTranscriptPath(args.transcriptPath, args.contextDirectory);\n \n const transcript = PklTranscript.open(absolutePath, { readOnly: false });\n try {\n const oldStatus = transcript.metadata.status || 'reviewed';\n \n // Check if status is actually changing\n if (oldStatus === newStatus) {\n const outputDirectory = await getConfiguredDirectory('outputDirectory', args.contextDirectory);\n const relativePath = await sanitizePath(absolutePath, outputDirectory);\n \n return {\n success: true,\n filePath: relativePath,\n previousStatus: oldStatus,\n newStatus: newStatus,\n changed: false,\n message: `Status is already '${newStatus}'`,\n };\n }\n \n // Update status\n transcript.updateMetadata({ status: newStatus } as any);\n \n const outputDirectory = await getConfiguredDirectory('outputDirectory', args.contextDirectory);\n const relativePath = await sanitizePath(absolutePath, outputDirectory);\n \n return {\n success: true,\n filePath: relativePath,\n previousStatus: oldStatus,\n newStatus: newStatus,\n changed: true,\n message: `Status changed from '${oldStatus}' to '${newStatus}'`,\n };\n } finally {\n transcript.close();\n }\n}\n\n// ============================================================================\n// Task Handlers\n// ============================================================================\n\nexport async function handleCreateTask(args: {\n transcriptPath: string;\n description: string;\n contextDirectory?: string;\n}) {\n if (!args.description || typeof args.description !== 'string' || args.description.trim() === '') {\n throw new Error('Task description is required and must be a non-empty string');\n }\n \n // Find the transcript\n const absolutePath = await resolveTranscriptPath(args.transcriptPath, args.contextDirectory);\n \n const transcript = PklTranscript.open(absolutePath, { readOnly: false });\n try {\n // Create a new task\n const taskId = `task-${Date.now()}`;\n const newTask: PklTask = {\n id: taskId,\n description: args.description.trim(),\n status: 'open',\n created: new Date(),\n };\n \n // Get existing tasks and add the new one\n const existingTasks = transcript.metadata.tasks || [];\n transcript.updateMetadata({ tasks: [...existingTasks, newTask] });\n \n const outputDirectory = await getConfiguredDirectory('outputDirectory', args.contextDirectory);\n const relativePath = await sanitizePath(absolutePath, outputDirectory);\n \n return {\n success: true,\n filePath: relativePath,\n task: {\n id: newTask.id,\n description: newTask.description,\n status: newTask.status,\n created: newTask.created.toISOString(),\n },\n message: `Task created: ${newTask.id}`,\n };\n } finally {\n transcript.close();\n }\n}\n\nexport async function handleCompleteTask(args: {\n transcriptPath: string;\n taskId: string;\n contextDirectory?: string;\n}) {\n if (!args.taskId || typeof args.taskId !== 'string') {\n throw new Error('Task ID is required');\n }\n \n // Find the transcript\n const absolutePath = await resolveTranscriptPath(args.transcriptPath, args.contextDirectory);\n \n const transcript = PklTranscript.open(absolutePath, { readOnly: false });\n try {\n // Find the task\n const tasks = transcript.metadata.tasks || [];\n const task = tasks.find(t => t.id === args.taskId);\n if (!task) {\n throw new Error(`Task not found: ${args.taskId}`);\n }\n \n // Update the task to done\n const updatedTasks = tasks.map(t => \n t.id === args.taskId \n ? { ...t, status: 'done' as const, completed: new Date() }\n : t\n );\n transcript.updateMetadata({ tasks: updatedTasks });\n \n const outputDirectory = await getConfiguredDirectory('outputDirectory', args.contextDirectory);\n const relativePath = await sanitizePath(absolutePath, outputDirectory);\n \n return {\n success: true,\n filePath: relativePath,\n taskId: args.taskId,\n description: task.description,\n message: `Task completed: ${args.taskId}`,\n };\n } finally {\n transcript.close();\n }\n}\n\nexport async function handleDeleteTask(args: {\n transcriptPath: string;\n taskId: string;\n contextDirectory?: string;\n}) {\n if (!args.taskId || typeof args.taskId !== 'string') {\n throw new Error('Task ID is required');\n }\n \n // Find the transcript\n const absolutePath = await resolveTranscriptPath(args.transcriptPath, args.contextDirectory);\n \n const transcript = PklTranscript.open(absolutePath, { readOnly: false });\n try {\n // Find the task before deleting\n const tasks = transcript.metadata.tasks || [];\n const task = tasks.find(t => t.id === args.taskId);\n if (!task) {\n throw new Error(`Task not found: ${args.taskId}`);\n }\n \n // Remove the task\n const updatedTasks = tasks.filter(t => t.id !== args.taskId);\n transcript.updateMetadata({ tasks: updatedTasks });\n \n const outputDirectory = await getConfiguredDirectory('outputDirectory', args.contextDirectory);\n const relativePath = await sanitizePath(absolutePath, outputDirectory);\n \n return {\n success: true,\n filePath: relativePath,\n taskId: args.taskId,\n description: task.description,\n message: `Task deleted: ${args.taskId}`,\n };\n } finally {\n transcript.close();\n }\n}\n\n// Export all tools from this module\nexport const statusTools: Tool[] = [\n setStatusTool,\n createTaskTool,\n completeTaskTool,\n deleteTaskTool,\n];\n","/**\n * Queue Management Tools\n * \n * MCP tools for monitoring and managing the audio upload transcription queue.\n * Provides visibility into pending uploads, processing status, and recent completions.\n */\n\n// eslint-disable-next-line import/extensions\nimport type { Tool } from '@modelcontextprotocol/sdk/types.js';\nimport { PklTranscript } from '@redaksjon/protokoll-format';\nimport type { TranscriptMetadata } from '@redaksjon/protokoll-format';\nimport { Transcript } from '@redaksjon/protokoll-engine';\nimport Logging from '@fjell/logging';\nimport * as fs from 'node:fs/promises';\nimport { join } from 'node:path';\nimport { tmpdir } from 'node:os';\nimport type { FileStorageProvider, StorageFileMetadata } from '../storage/fileProviders';\n\nconst { \n findUploadedTranscripts,\n findTranscribingTranscripts,\n resetTranscriptToUploaded,\n findTranscriptByUuid,\n} = Transcript;\nimport { getOutputDirectory, getOutputStorage } from '../serverConfig';\nimport { sanitizePath } from './shared';\nimport { unlink } from 'node:fs/promises';\nimport type { TranscriptionWorker } from '../worker/transcription-worker';\n\n// Worker instance will be set by server\nlet workerInstance: TranscriptionWorker | null = null;\nconst logger = Logging.getLogger('@redaksjon/protokoll-mcp').get('queue-tools');\n\nexport function setWorkerInstance(worker: TranscriptionWorker | null): void {\n workerInstance = worker;\n}\n\n// ============================================================================\n// Tool Definitions\n// ============================================================================\n\nexport const queueStatusTool: Tool = {\n name: 'protokoll_queue_status',\n description: 'Get current upload queue status - pending transcriptions, processing, and recent completions. Shows what audio files are waiting to be transcribed and which are currently being processed.',\n inputSchema: {\n type: 'object',\n properties: {},\n },\n};\n\nexport const getTranscriptByUuidTool: Tool = {\n name: 'protokoll_get_transcript_by_uuid',\n description: 'Get transcript metadata and status by UUID. Accepts either full UUID or 8-character prefix. Useful for checking upload status after receiving UUID from upload endpoint.',\n inputSchema: {\n type: 'object',\n properties: {\n uuid: {\n type: 'string',\n description: 'UUID or 8-character UUID prefix',\n },\n includeContent: {\n type: 'boolean',\n description: 'Include transcript content (default: false). Only works for transcripts in initial/enhanced/reviewed status.',\n },\n },\n required: ['uuid'],\n },\n};\n\nexport const retryTranscriptionTool: Tool = {\n name: 'protokoll_retry_transcription',\n description: 'Retry a failed transcription by resetting status from error to uploaded. The transcript will be re-queued for processing.',\n inputSchema: {\n type: 'object',\n properties: {\n uuid: {\n type: 'string',\n description: 'UUID of transcript to retry',\n },\n },\n required: ['uuid'],\n },\n};\n\nexport const cancelTranscriptionTool: Tool = {\n name: 'protokoll_cancel_transcription',\n description: 'Cancel a pending or processing transcription. Optionally delete the PKL file.',\n inputSchema: {\n type: 'object',\n properties: {\n uuid: {\n type: 'string',\n description: 'UUID of transcript to cancel',\n },\n deleteFile: {\n type: 'boolean',\n description: 'Also delete the PKL file (default: false)',\n },\n },\n required: ['uuid'],\n },\n};\n\nexport const workerStatusTool: Tool = {\n name: 'protokoll_worker_status',\n description: 'Get background transcription worker status and statistics. Shows if worker is running, current task, total processed, and uptime.',\n inputSchema: {\n type: 'object',\n properties: {},\n },\n};\n\nexport const restartWorkerTool: Tool = {\n name: 'protokoll_restart_worker',\n description: 'Restart the background transcription worker. Useful if worker is stuck or needs to reload configuration.',\n inputSchema: {\n type: 'object',\n properties: {},\n },\n};\n\n// ============================================================================\n// Helper Functions\n// ============================================================================\n\n/**\n * Get transcribing start time from metadata history\n */\nfunction getTranscribingStartTime(metadata: TranscriptMetadata): string {\n if (!metadata.history || metadata.history.length === 0) {\n return metadata.date?.toISOString() || '';\n }\n \n // Find the most recent transition to 'transcribing' status\n const transcribingTransition = metadata.history\n .filter(h => h.to === 'transcribing')\n .sort((a, b) => b.at.getTime() - a.at.getTime())[0];\n \n return transcribingTransition?.at.toISOString() || metadata.date?.toISOString() || '';\n}\n\n/**\n * Get completion time from metadata\n */\nfunction getCompletionTime(metadata: TranscriptMetadata): string {\n if (!metadata.history || metadata.history.length === 0) {\n return '';\n }\n \n // Find the most recent status transition\n const lastTransition = metadata.history\n .sort((a, b) => b.at.getTime() - a.at.getTime())[0];\n \n return lastTransition?.at.toISOString() || '';\n}\n\nfunction isQueueCandidatePath(pathValue: string): boolean {\n const normalized = pathValue.replace(/^\\/+/, '').replace(/\\\\/g, '/');\n if (!normalized.toLowerCase().endsWith('.pkl')) {\n return false;\n }\n if (normalized.startsWith('uploads/') || normalized.includes('/uploads/')) {\n return false;\n }\n if (normalized.startsWith('.intermediate/') || normalized.includes('/.intermediate/')) {\n return false;\n }\n return true;\n}\n\n/**\n * Upload placeholder transcripts use a root-level `*-upload.pkl` naming convention.\n */\nfunction isUploadPlaceholderPath(pathValue: string): boolean {\n const normalized = pathValue.replace(/^\\/+/, '').replace(/\\\\/g, '/').toLowerCase();\n if (!normalized.endsWith('-upload.pkl')) {\n return false;\n }\n return !normalized.includes('/');\n}\n\nasync function listFilesWithMetadataCompat(\n provider: FileStorageProvider,\n prefix: string,\n pattern?: string,\n): Promise<StorageFileMetadata[]> {\n const withMetadata = (provider as {\n listFilesWithMetadata?: (prefix: string, pattern?: string) => Promise<StorageFileMetadata[]>;\n }).listFilesWithMetadata;\n if (typeof withMetadata === 'function') {\n return withMetadata.call(provider, prefix, pattern);\n }\n const listed = await provider.listFiles(prefix, pattern);\n return listed.map((pathValue) => ({\n path: pathValue,\n size: 1,\n updatedAt: null,\n }));\n}\n\nasync function materializeTranscriptFromStorage(\n outputStorage: FileStorageProvider,\n transcriptPath: string,\n): Promise<string> {\n const fileName = transcriptPath.split('/').pop() || 'transcript.pkl';\n const tempPath = join(\n tmpdir(),\n `protokoll-queue-pkl-${Date.now()}-${Math.random().toString(36).slice(2)}-${fileName}`,\n );\n const contents = await outputStorage.readFile(transcriptPath);\n await fs.writeFile(tempPath, contents);\n return tempPath;\n}\n\nasync function findQueueTranscriptsFromStorage(\n outputStorage: FileStorageProvider,\n): Promise<{\n uploaded: Array<{ uuid: string; metadata: TranscriptMetadata }>;\n transcribing: Array<{ uuid: string; metadata: TranscriptMetadata }>;\n}> {\n const files = await listFilesWithMetadataCompat(outputStorage, '', '-upload.pkl');\n const candidates = files\n .map((metadata) => ({ ...metadata, path: metadata.path.replace(/^\\/+/, '').replace(/\\\\/g, '/') }))\n .filter((metadata) => isQueueCandidatePath(metadata.path))\n .filter((metadata) => isUploadPlaceholderPath(metadata.path));\n\n const uploaded: Array<{ uuid: string; metadata: TranscriptMetadata }> = [];\n const transcribing: Array<{ uuid: string; metadata: TranscriptMetadata }> = [];\n\n for (const metadata of candidates) {\n let tempPath: string | null = null;\n try {\n tempPath = await materializeTranscriptFromStorage(outputStorage, metadata.path);\n const transcript = PklTranscript.open(tempPath, { readOnly: true });\n const transcriptMetadata = transcript.metadata;\n await transcript.close();\n\n if (transcriptMetadata.status === 'uploaded') {\n uploaded.push({ uuid: transcriptMetadata.id, metadata: transcriptMetadata });\n } else if (transcriptMetadata.status === 'transcribing') {\n transcribing.push({ uuid: transcriptMetadata.id, metadata: transcriptMetadata });\n }\n } catch {\n // Ignore unreadable queue placeholders.\n } finally {\n if (tempPath) {\n await fs.rm(tempPath, { force: true });\n }\n }\n }\n\n const sortByDateAsc = (a: { metadata: TranscriptMetadata }, b: { metadata: TranscriptMetadata }): number => {\n const aTime = a.metadata.date?.getTime() || 0;\n const bTime = b.metadata.date?.getTime() || 0;\n return aTime - bTime;\n };\n\n return {\n uploaded: uploaded.sort(sortByDateAsc),\n transcribing: transcribing.sort(sortByDateAsc),\n };\n}\n\n/**\n * Find recent transcripts (completed in last 24 hours)\n */\nasync function findRecentTranscripts(\n searchDirectories: string[],\n limit: number\n): Promise<Array<{ uuid: string; filePath: string; metadata: TranscriptMetadata }>> {\n const results: Array<{ uuid: string; filePath: string; metadata: TranscriptMetadata }> = [];\n const oneDayAgo = new Date(Date.now() - 24 * 60 * 60 * 1000);\n \n // Import glob here to avoid issues\n const { glob } = await import('glob');\n \n for (const dir of searchDirectories) {\n const files = await glob('????????-*.pkl', { cwd: dir, absolute: true });\n \n for (const file of files) {\n try {\n const transcript = PklTranscript.open(file, { readOnly: true });\n const metadata = transcript.metadata;\n \n // Include if completed recently (status changed in last 24h)\n const recentlyCompleted = metadata.history?.some(h => \n h.at >= oneDayAgo && \n ['initial', 'enhanced', 'reviewed', 'error'].includes(h.to)\n );\n \n if (recentlyCompleted) {\n results.push({ \n uuid: metadata.id, \n filePath: file, \n metadata \n });\n }\n \n await transcript.close();\n } catch (error) {\n // Skip files that can't be opened\n logger.warning('queue.recent.skip_unreadable_transcript', {\n file,\n error: error instanceof Error ? error.message : String(error),\n });\n }\n }\n }\n \n // Sort by most recent first\n results.sort((a, b) => {\n const aTime = a.metadata.history?.[a.metadata.history.length - 1]?.at.getTime() || 0;\n const bTime = b.metadata.history?.[b.metadata.history.length - 1]?.at.getTime() || 0;\n return bTime - aTime;\n });\n \n return results.slice(0, limit);\n}\n\n// ============================================================================\n// Tool Handlers\n// ============================================================================\n\n/**\n * Get current queue status\n */\nexport async function handleQueueStatus(): Promise<{\n pending: Array<{ uuid: string; filename: string; uploadedAt: string }>;\n processing: Array<{ uuid: string; filename: string; startedAt: string }>;\n recent: Array<{ uuid: string; filename: string; completedAt: string; status: string }>;\n totalPending: number;\n}> {\n const outputDir = getOutputDirectory();\n const outputStorage = getOutputStorage();\n let uploaded: Array<{ uuid: string; metadata: TranscriptMetadata }> = [];\n let transcribing: Array<{ uuid: string; metadata: TranscriptMetadata }> = [];\n\n if (outputStorage.name === 'gcs') {\n const storageQueue = await findQueueTranscriptsFromStorage(outputStorage);\n uploaded = storageQueue.uploaded;\n transcribing = storageQueue.transcribing;\n } else {\n uploaded = await findUploadedTranscripts([outputDir]);\n transcribing = await findTranscribingTranscripts([outputDir]);\n }\n\n const recent = await findRecentTranscripts([outputDir], 10);\n \n return {\n pending: uploaded.map(t => ({\n uuid: t.uuid,\n filename: t.metadata.audioFile || 'unknown',\n uploadedAt: t.metadata.date?.toISOString() || '',\n })),\n processing: transcribing.map(t => ({\n uuid: t.uuid,\n filename: t.metadata.audioFile || 'unknown',\n startedAt: getTranscribingStartTime(t.metadata),\n })),\n recent: recent.map(t => ({\n uuid: t.uuid,\n filename: t.metadata.audioFile || t.metadata.title || 'unknown',\n completedAt: getCompletionTime(t.metadata),\n status: t.metadata.status || 'unknown',\n })),\n totalPending: uploaded.length,\n };\n}\n\n/**\n * Get transcript by UUID\n */\nexport async function handleGetTranscriptByUuid(args: {\n uuid: string;\n includeContent?: boolean;\n}): Promise<{\n found: boolean;\n uuid?: string;\n filePath?: string;\n metadata?: TranscriptMetadata;\n content?: string;\n error?: string;\n}> {\n try {\n const outputDir = getOutputDirectory();\n const filePath = await findTranscriptByUuid(args.uuid, [outputDir]);\n \n if (!filePath) {\n return { found: false, error: `No transcript found for UUID: ${args.uuid}` };\n }\n \n const transcript = PklTranscript.open(filePath, { readOnly: true });\n const metadata = transcript.metadata;\n \n const result: {\n found: boolean;\n uuid?: string;\n filePath?: string;\n metadata?: TranscriptMetadata;\n content?: string;\n } = {\n found: true,\n uuid: metadata.id,\n filePath: await sanitizePath(filePath, outputDir),\n metadata,\n };\n \n if (args.includeContent && ['initial', 'enhanced', 'reviewed'].includes(metadata.status || '')) {\n result.content = transcript.content || '';\n }\n \n await transcript.close();\n return result;\n } catch (error) {\n return { found: false, error: error instanceof Error ? error.message : String(error) };\n }\n}\n\n/**\n * Retry a failed transcription\n */\nexport async function handleRetryTranscription(args: {\n uuid: string;\n}): Promise<{\n success: boolean;\n message: string;\n error?: string;\n}> {\n try {\n const outputDir = getOutputDirectory();\n const filePath = await findTranscriptByUuid(args.uuid, [outputDir]);\n \n if (!filePath) {\n return { \n success: false, \n message: '',\n error: `No transcript found for UUID: ${args.uuid}` \n };\n }\n \n // Check current status\n const transcript = PklTranscript.open(filePath, { readOnly: true });\n const metadata = transcript.metadata;\n await transcript.close();\n \n if (metadata.status !== 'error') {\n return {\n success: false,\n message: '',\n error: `Transcript is not in error status (current: ${metadata.status})`,\n };\n }\n \n // Reset to uploaded\n await resetTranscriptToUploaded(filePath);\n \n return {\n success: true,\n message: `Transcript ${args.uuid} reset to uploaded status and re-queued`,\n };\n } catch (error) {\n return { \n success: false, \n message: '',\n error: error instanceof Error ? error.message : String(error) \n };\n }\n}\n\n/**\n * Cancel a transcription\n */\nexport async function handleCancelTranscription(args: {\n uuid: string;\n deleteFile?: boolean;\n}): Promise<{\n success: boolean;\n message: string;\n error?: string;\n}> {\n try {\n const outputDir = getOutputDirectory();\n const filePath = await findTranscriptByUuid(args.uuid, [outputDir]);\n \n if (!filePath) {\n return { \n success: false, \n message: '',\n error: `No transcript found for UUID: ${args.uuid}` \n };\n }\n \n // Check current status\n const transcript = PklTranscript.open(filePath, { readOnly: true });\n const metadata = transcript.metadata;\n await transcript.close();\n \n if (!['uploaded', 'transcribing'].includes(metadata.status || '')) {\n return {\n success: false,\n message: '',\n error: `Cannot cancel transcript in ${metadata.status} status. Only uploaded/transcribing can be cancelled.`,\n };\n }\n \n if (args.deleteFile) {\n // Delete the file\n await unlink(filePath);\n return {\n success: true,\n message: `Transcript ${args.uuid} cancelled and file deleted`,\n };\n } else {\n // Just mark as error\n const transcriptToUpdate = PklTranscript.open(filePath);\n transcriptToUpdate.updateMetadata({ \n status: 'error',\n errorDetails: 'Cancelled by user',\n });\n await transcriptToUpdate.close();\n \n return {\n success: true,\n message: `Transcript ${args.uuid} cancelled (marked as error)`,\n };\n }\n } catch (error) {\n return { \n success: false, \n message: '',\n error: error instanceof Error ? error.message : String(error) \n };\n }\n}\n\n/**\n * Get worker status\n */\nexport async function handleWorkerStatus(): Promise<{\n isRunning: boolean;\n currentTask?: string;\n totalProcessed: number;\n lastProcessed?: string;\n uptime: number;\n}> {\n if (!workerInstance) {\n return {\n isRunning: false,\n totalProcessed: 0,\n uptime: 0,\n };\n }\n\n return {\n isRunning: workerInstance.isActive(),\n currentTask: workerInstance.getCurrentTask(),\n totalProcessed: workerInstance.getProcessedCount(),\n lastProcessed: workerInstance.getLastProcessedTime(),\n uptime: workerInstance.getUptime(),\n };\n}\n\n/**\n * Restart worker\n */\nexport async function handleRestartWorker(): Promise<{\n success: boolean;\n message: string;\n error?: string;\n}> {\n if (!workerInstance) {\n return {\n success: false,\n message: '',\n error: 'Worker not initialized',\n };\n }\n\n try {\n await workerInstance.stop();\n await workerInstance.start();\n return {\n success: true,\n message: 'Worker restarted successfully',\n };\n } catch (error) {\n return {\n success: false,\n message: '',\n error: error instanceof Error ? error.message : String(error),\n };\n }\n}\n","/**\n * MCP Tools - Exports all tool definitions and handlers\n */\n\n// eslint-disable-next-line import/extensions\nimport type { Tool } from '@modelcontextprotocol/sdk/types.js';\n\nimport * as DiscoveryTools from './discoveryTools';\nimport * as AudioTools from './audioTools';\nimport * as ContextTools from './contextTools';\nimport * as EntityTools from './entityTools';\nimport * as AssistTools from './assistTools';\nimport * as TranscriptTools from './transcriptTools';\nimport * as SystemTools from './systemTools';\nimport * as RelationshipTools from './relationshipTools';\nimport * as ContentTools from './contentTools';\nimport * as StatusTools from './statusTools';\nimport * as QueueTools from './queueTools';\n\n// Re-export all handlers for testing\nexport * from './discoveryTools';\nexport * from './audioTools';\nexport * from './contextTools';\nexport * from './entityTools';\nexport * from './assistTools';\nexport * from './transcriptTools';\nexport * from './systemTools';\nexport * from './relationshipTools';\nexport * from './contentTools';\nexport * from './statusTools';\nexport * from './queueTools';\nexport * from './shared';\n\n// ============================================================================\n// All Tools\n// ============================================================================\n\nexport const tools: Tool[] = [\n // System Information\n SystemTools.getVersionTool,\n SystemTools.getInfoTool,\n\n // Discovery & Configuration\n DiscoveryTools.discoverConfigTool,\n DiscoveryTools.suggestProjectTool,\n\n // Audio Processing\n AudioTools.processAudioTool,\n AudioTools.batchProcessTool,\n\n // Context Management\n ContextTools.contextStatusTool,\n ContextTools.listProjectsTool,\n ContextTools.listProjectPlansTool,\n ContextTools.listPeopleTool,\n ContextTools.listTermsTool,\n ContextTools.listCompaniesTool,\n ContextTools.searchContextTool,\n ContextTools.getEntityTool,\n ContextTools.predictEntitiesTool,\n\n // Entity CRUD\n EntityTools.addPersonTool,\n EntityTools.editPersonTool,\n EntityTools.addProjectTool,\n EntityTools.editProjectTool,\n EntityTools.updateProjectTool,\n EntityTools.addTermTool,\n EntityTools.editTermTool,\n EntityTools.updateTermTool,\n EntityTools.mergeTermsTool,\n EntityTools.addCompanyTool,\n EntityTools.editCompanyTool,\n EntityTools.deleteEntityTool,\n\n // Relationship Management\n RelationshipTools.addRelationshipTool,\n RelationshipTools.removeRelationshipTool,\n RelationshipTools.listRelationshipsTool,\n RelationshipTools.findRelatedEntitiesTool,\n\n // Content Management\n ContentTools.addContentTool,\n ContentTools.removeContentTool,\n ContentTools.listContentTool,\n ContentTools.getContentTool,\n\n // Smart Assistance\n AssistTools.suggestProjectMetadataTool,\n AssistTools.suggestTermMetadataTool,\n\n // Transcript Operations\n TranscriptTools.readTranscriptTool,\n TranscriptTools.listTranscriptsTool,\n TranscriptTools.identifyTasksFromTranscriptTool,\n TranscriptTools.summarizeTranscriptTool,\n TranscriptTools.deleteTranscriptSummaryTool,\n TranscriptTools.editTranscriptTool,\n TranscriptTools.changeTranscriptDateTool,\n TranscriptTools.combineTranscriptsTool,\n TranscriptTools.provideFeedbackTool,\n TranscriptTools.enhanceTranscriptTool,\n TranscriptTools.updateTranscriptContentTool,\n TranscriptTools.updateTranscriptEntityReferencesTool,\n TranscriptTools.createNoteTool,\n TranscriptTools.getEnhancementLogTool,\n TranscriptTools.correctToEntityTool,\n TranscriptTools.rejectCorrectionTool,\n\n // Lifecycle Status & Tasks\n StatusTools.setStatusTool,\n StatusTools.createTaskTool,\n StatusTools.completeTaskTool,\n StatusTools.deleteTaskTool,\n\n // Queue Management\n QueueTools.queueStatusTool,\n QueueTools.getTranscriptByUuidTool,\n QueueTools.retryTranscriptionTool,\n QueueTools.cancelTranscriptionTool,\n QueueTools.workerStatusTool,\n QueueTools.restartWorkerTool,\n];\n\n// ============================================================================\n// Tool Handler Router\n// ============================================================================\n\nexport async function handleToolCall(name: string, args: unknown): Promise<unknown> {\n switch (name) {\n // System Information\n case 'protokoll_get_version':\n return SystemTools.handleGetVersion();\n case 'protokoll_info':\n return SystemTools.handleGetInfo();\n\n // Discovery & Configuration\n case 'protokoll_discover_config':\n return DiscoveryTools.handleDiscoverConfig(args as Parameters<typeof DiscoveryTools.handleDiscoverConfig>[0]);\n case 'protokoll_suggest_project':\n return DiscoveryTools.handleSuggestProject(args as Parameters<typeof DiscoveryTools.handleSuggestProject>[0]);\n\n // Audio Processing\n case 'protokoll_process_audio':\n return AudioTools.handleProcessAudio(args as Parameters<typeof AudioTools.handleProcessAudio>[0]);\n case 'protokoll_batch_process':\n return AudioTools.handleBatchProcess(args as Parameters<typeof AudioTools.handleBatchProcess>[0]);\n\n // Context Management\n case 'protokoll_context_status':\n return ContextTools.handleContextStatus(args as Parameters<typeof ContextTools.handleContextStatus>[0]);\n case 'protokoll_list_projects':\n return ContextTools.handleListProjects(args as Parameters<typeof ContextTools.handleListProjects>[0]);\n case 'protokoll_list_project_plans':\n return ContextTools.handleListProjectPlans(\n args as Parameters<typeof ContextTools.handleListProjectPlans>[0],\n );\n case 'protokoll_list_people':\n return ContextTools.handleListPeople(args as Parameters<typeof ContextTools.handleListPeople>[0]);\n case 'protokoll_list_terms':\n return ContextTools.handleListTerms(args as Parameters<typeof ContextTools.handleListTerms>[0]);\n case 'protokoll_list_companies':\n return ContextTools.handleListCompanies(args as Parameters<typeof ContextTools.handleListCompanies>[0]);\n case 'protokoll_search_context':\n return ContextTools.handleSearchContext(args as Parameters<typeof ContextTools.handleSearchContext>[0]);\n case 'protokoll_get_entity':\n return ContextTools.handleGetEntity(args as Parameters<typeof ContextTools.handleGetEntity>[0]);\n case 'protokoll_predict_entities':\n return ContextTools.handlePredictEntities(args as Parameters<typeof ContextTools.handlePredictEntities>[0]);\n\n // Entity CRUD\n case 'protokoll_add_person':\n return EntityTools.handleAddPerson(args as Parameters<typeof EntityTools.handleAddPerson>[0]);\n case 'protokoll_edit_person':\n return EntityTools.handleEditPerson(args as Parameters<typeof EntityTools.handleEditPerson>[0]);\n case 'protokoll_add_project':\n return EntityTools.handleAddProject(args as Parameters<typeof EntityTools.handleAddProject>[0]);\n case 'protokoll_edit_project':\n return EntityTools.handleEditProject(args as Parameters<typeof EntityTools.handleEditProject>[0]);\n case 'protokoll_update_project':\n return EntityTools.handleUpdateProject(args as Parameters<typeof EntityTools.handleUpdateProject>[0]);\n case 'protokoll_add_term':\n return EntityTools.handleAddTerm(args as Parameters<typeof EntityTools.handleAddTerm>[0]);\n case 'protokoll_edit_term':\n return EntityTools.handleEditTerm(args as Parameters<typeof EntityTools.handleEditTerm>[0]);\n case 'protokoll_update_term':\n return EntityTools.handleUpdateTerm(args as Parameters<typeof EntityTools.handleUpdateTerm>[0]);\n case 'protokoll_merge_terms':\n return EntityTools.handleMergeTerms(args as Parameters<typeof EntityTools.handleMergeTerms>[0]);\n case 'protokoll_add_company':\n return EntityTools.handleAddCompany(args as Parameters<typeof EntityTools.handleAddCompany>[0]);\n case 'protokoll_edit_company':\n return EntityTools.handleEditCompany(args as Parameters<typeof EntityTools.handleEditCompany>[0]);\n case 'protokoll_delete_entity':\n return EntityTools.handleDeleteEntity(args as Parameters<typeof EntityTools.handleDeleteEntity>[0]);\n\n // Smart Assistance\n case 'protokoll_suggest_project_metadata':\n return AssistTools.handleSuggestProjectMetadata(args as Parameters<typeof AssistTools.handleSuggestProjectMetadata>[0]);\n case 'protokoll_suggest_term_metadata':\n return AssistTools.handleSuggestTermMetadata(args as Parameters<typeof AssistTools.handleSuggestTermMetadata>[0]);\n\n // Relationship Management\n case 'protokoll_add_relationship':\n return RelationshipTools.handleAddRelationship(args as Parameters<typeof RelationshipTools.handleAddRelationship>[0]);\n case 'protokoll_remove_relationship':\n return RelationshipTools.handleRemoveRelationship(args as Parameters<typeof RelationshipTools.handleRemoveRelationship>[0]);\n case 'protokoll_list_relationships':\n return RelationshipTools.handleListRelationships(args as Parameters<typeof RelationshipTools.handleListRelationships>[0]);\n case 'protokoll_find_related_entities':\n return RelationshipTools.handleFindRelatedEntities(args as Parameters<typeof RelationshipTools.handleFindRelatedEntities>[0]);\n\n // Content Management\n case 'protokoll_add_content':\n return ContentTools.handleAddContent(args as Parameters<typeof ContentTools.handleAddContent>[0]);\n case 'protokoll_remove_content':\n return ContentTools.handleRemoveContent(args as Parameters<typeof ContentTools.handleRemoveContent>[0]);\n case 'protokoll_list_content':\n return ContentTools.handleListContent(args as Parameters<typeof ContentTools.handleListContent>[0]);\n case 'protokoll_get_content':\n return ContentTools.handleGetContent(args as Parameters<typeof ContentTools.handleGetContent>[0]);\n\n // Transcript Operations\n case 'protokoll_read_transcript':\n return TranscriptTools.handleReadTranscript(args as Parameters<typeof TranscriptTools.handleReadTranscript>[0]);\n case 'protokoll_list_transcripts':\n return TranscriptTools.handleListTranscripts(args as Parameters<typeof TranscriptTools.handleListTranscripts>[0]);\n case 'protokoll_identify_tasks_from_transcript':\n return TranscriptTools.handleIdentifyTasksFromTranscript(args as Parameters<typeof TranscriptTools.handleIdentifyTasksFromTranscript>[0]);\n case 'protokoll_summarize_transcript':\n return TranscriptTools.handleSummarizeTranscript(args as Parameters<typeof TranscriptTools.handleSummarizeTranscript>[0]);\n case 'protokoll_delete_transcript_summary':\n return TranscriptTools.handleDeleteTranscriptSummary(args as Parameters<typeof TranscriptTools.handleDeleteTranscriptSummary>[0]);\n case 'protokoll_edit_transcript':\n return TranscriptTools.handleEditTranscript(args as Parameters<typeof TranscriptTools.handleEditTranscript>[0]);\n case 'protokoll_change_transcript_date':\n return TranscriptTools.handleChangeTranscriptDate(args as Parameters<typeof TranscriptTools.handleChangeTranscriptDate>[0]);\n case 'protokoll_combine_transcripts':\n return TranscriptTools.handleCombineTranscripts(args as Parameters<typeof TranscriptTools.handleCombineTranscripts>[0]);\n case 'protokoll_provide_feedback':\n return TranscriptTools.handleProvideFeedback(args as Parameters<typeof TranscriptTools.handleProvideFeedback>[0]);\n case 'protokoll_enhance_transcript':\n return TranscriptTools.handleEnhanceTranscript(args as Parameters<typeof TranscriptTools.handleEnhanceTranscript>[0]);\n case 'protokoll_update_transcript_content':\n return TranscriptTools.handleUpdateTranscriptContent(args as Parameters<typeof TranscriptTools.handleUpdateTranscriptContent>[0]);\n case 'protokoll_update_transcript_entity_references':\n return TranscriptTools.handleUpdateTranscriptEntityReferences(args as Parameters<typeof TranscriptTools.handleUpdateTranscriptEntityReferences>[0]);\n case 'protokoll_create_note':\n return TranscriptTools.handleCreateNote(args as Parameters<typeof TranscriptTools.handleCreateNote>[0]);\n case 'protokoll_get_enhancement_log':\n return TranscriptTools.handleGetEnhancementLog(args as Parameters<typeof TranscriptTools.handleGetEnhancementLog>[0]);\n case 'protokoll_correct_to_entity':\n return TranscriptTools.handleCorrectToEntity(args as Parameters<typeof TranscriptTools.handleCorrectToEntity>[0]);\n case 'protokoll_reject_correction':\n return TranscriptTools.handleRejectCorrection(args as Parameters<typeof TranscriptTools.handleRejectCorrection>[0]);\n\n // Lifecycle Status & Tasks\n case 'protokoll_set_status':\n return StatusTools.handleSetStatus(args as Parameters<typeof StatusTools.handleSetStatus>[0]);\n case 'protokoll_create_task':\n return StatusTools.handleCreateTask(args as Parameters<typeof StatusTools.handleCreateTask>[0]);\n case 'protokoll_complete_task':\n return StatusTools.handleCompleteTask(args as Parameters<typeof StatusTools.handleCompleteTask>[0]);\n case 'protokoll_delete_task':\n return StatusTools.handleDeleteTask(args as Parameters<typeof StatusTools.handleDeleteTask>[0]);\n\n // Queue Management\n case 'protokoll_queue_status':\n return QueueTools.handleQueueStatus();\n case 'protokoll_get_transcript_by_uuid':\n return QueueTools.handleGetTranscriptByUuid(args as Parameters<typeof QueueTools.handleGetTranscriptByUuid>[0]);\n case 'protokoll_retry_transcription':\n return QueueTools.handleRetryTranscription(args as Parameters<typeof QueueTools.handleRetryTranscription>[0]);\n case 'protokoll_cancel_transcription':\n return QueueTools.handleCancelTranscription(args as Parameters<typeof QueueTools.handleCancelTranscription>[0]);\n case 'protokoll_worker_status':\n return QueueTools.handleWorkerStatus();\n case 'protokoll_restart_worker':\n return QueueTools.handleRestartWorker();\n\n default:\n throw new Error(`Unknown tool: ${name}`);\n }\n}\n","/**\n * Shared Configuration Discovery\n * \n * Uses CardiganTime to discover protokoll-config.yaml files hierarchically,\n * matching the behavior of protokoll-cli. This module is shared between\n * the stdio server (server.ts) and HTTP server (server-hono.ts).\n */\n\nimport * as Cardigantime from '@utilarium/cardigantime';\nimport type { Logger } from '@utilarium/cardigantime';\nimport { resolve, dirname, basename } from 'node:path';\nimport Logging from '@fjell/logging';\n\nexport const DEFAULT_CONFIG_FILE = 'protokoll-config.yaml';\nconst logger = Logging.getLogger('@redaksjon/protokoll-mcp').get('config-discovery');\n\n/**\n * Check if debug mode is enabled via environment or will be via config\n */\nfunction isDebugEnabled(): boolean {\n return process.env.PROTOKOLL_DEBUG === 'true' || process.env.DEBUG === 'true';\n}\n\n/**\n * Create a quiet logger that only outputs when debug is enabled\n * and formats messages in a cleaner way\n */\nexport function createQuietLogger(): Logger {\n const debugEnabled = isDebugEnabled();\n \n const noop = () => { /* intentionally empty */ };\n \n return {\n debug: noop, // Suppress verbose debug messages\n info: noop, // Suppress info messages during discovery\n warn: (message: string, ...args: unknown[]) => {\n // eslint-disable-next-line no-console\n console.error(`[config:warn] ${message}`);\n logger.warning('cardigantime.warn', { message, args });\n },\n error: (message: string, ...args: unknown[]) => {\n // eslint-disable-next-line no-console\n console.error(`[config:error] ${message}`);\n logger.error('cardigantime.error', { message, args });\n },\n verbose: debugEnabled\n ? (message: string, ...args: unknown[]) => {\n // eslint-disable-next-line no-console\n console.error(`[config] ${message}`);\n logger.debug('cardigantime.debug', { message, args });\n }\n : noop,\n silly: noop,\n };\n}\n\n/**\n * Parse a CLI argument value from argv\n */\nexport function getArgValue(argv: string[], flag: string): string | undefined {\n const idx = argv.indexOf(flag);\n if (idx === -1) return undefined;\n const value = argv[idx + 1];\n if (!value || value.startsWith('-')) return undefined;\n return value;\n}\n\n/**\n * Read configuration from a directory using CardiganTime\n */\nexport async function readCardigantimeConfigFromDirectory(\n directory: string,\n configFile: string,\n features: Array<'config' | 'hierarchical'>\n): Promise<Record<string, unknown>> {\n const cardigantime = Cardigantime.create({\n defaults: {\n configDirectory: '.',\n configFile,\n isRequired: false,\n // Tell CardiganTime to resolve these path fields relative to the config file's directory\n // Note: contextDirectories must be in BOTH pathFields AND resolvePathArray - \n // pathFields determines which fields are processed, resolvePathArray determines\n // if array elements should be resolved individually\n pathResolution: {\n pathFields: ['inputDirectory', 'outputDirectory', 'processedDirectory', 'contextDirectories'],\n resolvePathArray: ['contextDirectories'],\n },\n },\n configShape: {},\n features,\n logger: createQuietLogger(),\n });\n\n const previousCwd = process.cwd();\n try {\n process.chdir(directory);\n return await cardigantime.read({});\n } finally {\n process.chdir(previousCwd);\n }\n}\n\n/**\n * Load configuration using CardiganTime from the workspace root\n * This respects environment variables and hierarchical config files\n */\nexport async function loadCardigantimeConfig(): Promise<Record<string, unknown>> {\n const workspaceRoot = process.env.WORKSPACE_ROOT || process.cwd();\n return await readCardigantimeConfigFromDirectory(workspaceRoot, DEFAULT_CONFIG_FILE, ['config', 'hierarchical']);\n}\n\n/**\n * Initialize working directory and WORKSPACE_ROOT from CLI args and config discovery.\n * \n * Supports:\n * - `--cwd <dir>` to change working directory\n * - `-c <path>` or `--config <path>` to specify config file (matching protokoll-cli)\n * - `PROTOKOLL_CONFIG` environment variable\n * - Hierarchical discovery of protokoll-config.yaml up the directory tree\n */\nexport async function initializeWorkingDirectoryFromArgsAndConfig(): Promise<void> {\n const argv = process.argv.slice(2);\n const cwdArg = getArgValue(argv, '--cwd');\n // Support both -c and --config (matching protokoll-cli)\n const configArg = getArgValue(argv, '-c') || getArgValue(argv, '--config') || process.env.PROTOKOLL_CONFIG;\n\n if (cwdArg) {\n process.chdir(resolve(cwdArg));\n }\n\n // Use CardiganTime (like protokoll-cli) to locate protokoll-config.yaml up the tree.\n // If an explicit config file path is provided, use only that file.\n if (configArg) {\n const configPath = resolve(configArg);\n const configDir = dirname(configPath);\n const configFile = basename(configPath);\n\n // Expose for downstream code; also makes it easier to debug.\n process.env.PROTOKOLL_CONFIG = configPath;\n process.env.WORKSPACE_ROOT = configDir;\n\n // Ensure it's readable early (and preserves CardiganTime semantics).\n await readCardigantimeConfigFromDirectory(configDir, configFile, ['config']);\n return;\n }\n\n const discoveryStart = process.env.WORKSPACE_ROOT || process.cwd();\n const config = await readCardigantimeConfigFromDirectory(\n discoveryStart,\n DEFAULT_CONFIG_FILE,\n ['config', 'hierarchical']\n );\n\n const resolvedConfigDirs = (config as any).resolvedConfigDirs;\n if (Array.isArray(resolvedConfigDirs) && resolvedConfigDirs.length > 0) {\n process.env.WORKSPACE_ROOT = resolvedConfigDirs[0];\n } else {\n process.env.WORKSPACE_ROOT = discoveryStart;\n }\n}\n","import { access } from 'node:fs/promises';\nimport { dirname, join } from 'node:path';\nimport { fileURLToPath, pathToFileURL } from 'node:url';\nimport Logging from '@fjell/logging';\n\nconst logger = Logging.getLogger('@redaksjon/protokoll-mcp').get('engine-logging');\nlet configured = false;\nlet stdioBridgeInstalled = false;\n\nfunction coerceMessage(args: unknown[]): string {\n return args\n .map((value) => {\n if (typeof value === 'string') {\n return value;\n }\n if (value instanceof Error) {\n return value.message;\n }\n try {\n return JSON.stringify(value);\n } catch {\n return String(value);\n }\n })\n .join(' ')\n .trim();\n}\n\nfunction stripAnsi(input: string): string {\n return input.split(String.fromCharCode(27)).join('');\n}\n\nfunction installStdIoBridge(): void {\n if (stdioBridgeInstalled) {\n return;\n }\n stdioBridgeInstalled = true;\n\n const engineLog = Logging.getLogger('@redaksjon/protokoll-mcp').get('engine');\n const originalStdoutWrite = process.stdout.write.bind(process.stdout);\n const originalStderrWrite = process.stderr.write.bind(process.stderr);\n\n let inBridgeWrite = false;\n let stdoutBuffer = '';\n let stderrBuffer = '';\n\n const flushBuffer = (\n buffer: string,\n writeOriginal: (chunk: string) => void,\n ): string => {\n let working = buffer;\n while (true) {\n const newlineIndex = working.indexOf('\\n');\n if (newlineIndex < 0) {\n break;\n }\n const line = working.slice(0, newlineIndex).replace(/\\r$/, '');\n working = working.slice(newlineIndex + 1);\n\n const normalized = stripAnsi(line).trim();\n const match = normalized.match(/^(info|debug|warn|warning|error):\\s*(.*)$/i);\n if (match) {\n const rawLevel = match[1].toLowerCase();\n const message = match[2] || '';\n inBridgeWrite = true;\n try {\n if (rawLevel === 'error') {\n engineLog.error('engine.message', { message });\n } else if (rawLevel === 'warn' || rawLevel === 'warning') {\n engineLog.warning('engine.message', { message });\n } else if (rawLevel === 'debug') {\n engineLog.debug('engine.message', { message });\n } else {\n engineLog.info('engine.message', { message });\n }\n } finally {\n inBridgeWrite = false;\n }\n continue;\n }\n\n writeOriginal(`${line}\\n`);\n }\n return working;\n };\n\n (process.stdout.write as unknown) = ((chunk: any, encoding?: BufferEncoding, cb?: (error?: Error | null) => void) => {\n if (inBridgeWrite) {\n return originalStdoutWrite(chunk, encoding as any, cb as any);\n }\n const text = typeof chunk === 'string' ? chunk : chunk?.toString(encoding || 'utf8');\n if (!text) {\n return originalStdoutWrite(chunk, encoding as any, cb as any);\n }\n stdoutBuffer += text;\n stdoutBuffer = flushBuffer(stdoutBuffer, (value) => {\n originalStdoutWrite(value);\n });\n if (typeof cb === 'function') cb(null);\n return true;\n }) as typeof process.stdout.write;\n\n (process.stderr.write as unknown) = ((chunk: any, encoding?: BufferEncoding, cb?: (error?: Error | null) => void) => {\n if (inBridgeWrite) {\n return originalStderrWrite(chunk, encoding as any, cb as any);\n }\n const text = typeof chunk === 'string' ? chunk : chunk?.toString(encoding || 'utf8');\n if (!text) {\n return originalStderrWrite(chunk, encoding as any, cb as any);\n }\n stderrBuffer += text;\n stderrBuffer = flushBuffer(stderrBuffer, (value) => {\n originalStderrWrite(value);\n });\n if (typeof cb === 'function') cb(null);\n return true;\n }) as typeof process.stderr.write;\n\n logger.info('bridge.stdio_installed');\n}\n\n/**\n * Route @redaksjon/protokoll-engine's internal winston logger through fjell/logging.\n * This prevents raw `info: ...` console lines and keeps a single structured log format.\n */\nexport async function configureEngineLoggingBridge(): Promise<void> {\n if (configured) {\n return;\n }\n\n installStdIoBridge();\n\n try {\n const candidates = new Set<string>();\n try {\n const resolvedEntryUrl = import.meta.resolve('@redaksjon/protokoll-engine');\n const resolvedEntryPath = fileURLToPath(resolvedEntryUrl);\n candidates.add(join(dirname(resolvedEntryPath), 'index47.js'));\n } catch {\n // fall through to additional discovery strategies\n }\n candidates.add(join(process.cwd(), 'node_modules', '@redaksjon', 'protokoll-engine', 'dist', 'index47.js'));\n\n let engineLoggerModulePath: string | null = null;\n for (const candidate of candidates) {\n try {\n await access(candidate);\n engineLoggerModulePath = candidate;\n break;\n } catch {\n // keep scanning candidates\n }\n }\n if (!engineLoggerModulePath) {\n logger.warning('bridge.unavailable', { reason: 'logger_module_not_found' });\n configured = true;\n return;\n }\n\n const engineLoggerModule = await import(pathToFileURL(engineLoggerModulePath).href) as {\n getLogger?: () => Record<string, any>;\n };\n\n const engineLogger = engineLoggerModule.getLogger?.();\n if (!engineLogger) {\n logger.warning('bridge.unavailable', { reason: 'missing_getLogger' });\n configured = true;\n return;\n }\n\n if (engineLogger.__protokollBridgeInstalled === true) {\n configured = true;\n return;\n }\n\n const engineLog = Logging.getLogger('@redaksjon/protokoll-mcp').get('engine');\n engineLogger.info = (...args: unknown[]) => {\n engineLog.info('engine.message', { message: coerceMessage(args) });\n };\n engineLogger.debug = (...args: unknown[]) => {\n engineLog.debug('engine.message', { message: coerceMessage(args) });\n };\n engineLogger.warn = (...args: unknown[]) => {\n engineLog.warning('engine.message', { message: coerceMessage(args) });\n };\n engineLogger.error = (...args: unknown[]) => {\n engineLog.error('engine.message', { message: coerceMessage(args) });\n };\n\n engineLogger.__protokollBridgeInstalled = true;\n configured = true;\n logger.info('bridge.installed');\n } catch (error) {\n configured = true;\n logger.warning('bridge.install_failed', {\n error: error instanceof Error ? error.message : String(error),\n });\n }\n}\n"],"names":["createContext","logger","normalizePath","DEFAULT_CONFIG_FILE","Context.create","getWorkspaceRoot","isServerConfigInitialized","ServerConfig.isInitialized","getServerContext","ServerConfig.getContext","getServerConfigFile","ServerConfig.getServerConfig","ServerConfig.getWorkspaceRoot","level","INDEX_SCHEMA_VERSION","ENTITY_DIRECTORY","metadataVersionKey","listFilesWithMetadataCompat","ServerConfig.getStorageConfig","transcriptExists","ensurePklExtension","findTranscriptByUuid","Storage","contextDirs","result","resolveTranscriptPath","readTranscriptContent","withTempPklFile","created","parseStoredSummaries","ServerConfig.getOutputDirectory","ServerConfig.getOutputStorage","resolveStorageTranscriptPath","resolveCanonicalEntityId","PROJECT_PLAN_ARRAY_KEYS","yamlContent","entities","responseData","ServerConfig.getInputDirectory","ServerConfig.getProcessedDirectory","__filename","__dirname","prompts","sanitizedSearchedFrom","relationships","TranscriptUtils","pklPath","readTranscriptFromStorage","listTranscriptsFromStorage","randomUUID","statusChanged","previousStatus","changes","transcript","ServerConfig.getServerMode","getEntityByType","parseEntityUri","ENGINE_VALID_STATUSES","isEngineValidStatus","outputDirectory","relativePath","SystemTools.getVersionTool","SystemTools.getInfoTool","DiscoveryTools.discoverConfigTool","DiscoveryTools.suggestProjectTool","AudioTools.processAudioTool","AudioTools.batchProcessTool","ContextTools.contextStatusTool","ContextTools.listProjectsTool","ContextTools.listProjectPlansTool","ContextTools.listPeopleTool","ContextTools.listTermsTool","ContextTools.listCompaniesTool","ContextTools.searchContextTool","ContextTools.getEntityTool","ContextTools.predictEntitiesTool","EntityTools.addPersonTool","EntityTools.editPersonTool","EntityTools.addProjectTool","EntityTools.editProjectTool","EntityTools.updateProjectTool","EntityTools.addTermTool","EntityTools.editTermTool","EntityTools.updateTermTool","EntityTools.mergeTermsTool","EntityTools.addCompanyTool","EntityTools.editCompanyTool","EntityTools.deleteEntityTool","RelationshipTools.addRelationshipTool","RelationshipTools.removeRelationshipTool","RelationshipTools.listRelationshipsTool","RelationshipTools.findRelatedEntitiesTool","ContentTools.addContentTool","ContentTools.removeContentTool","ContentTools.listContentTool","ContentTools.getContentTool","AssistTools.suggestProjectMetadataTool","AssistTools.suggestTermMetadataTool","TranscriptTools.readTranscriptTool","TranscriptTools.listTranscriptsTool","TranscriptTools.identifyTasksFromTranscriptTool","TranscriptTools.summarizeTranscriptTool","TranscriptTools.deleteTranscriptSummaryTool","TranscriptTools.editTranscriptTool","TranscriptTools.changeTranscriptDateTool","TranscriptTools.combineTranscriptsTool","TranscriptTools.provideFeedbackTool","TranscriptTools.enhanceTranscriptTool","TranscriptTools.updateTranscriptContentTool","TranscriptTools.updateTranscriptEntityReferencesTool","TranscriptTools.createNoteTool","TranscriptTools.getEnhancementLogTool","TranscriptTools.correctToEntityTool","TranscriptTools.rejectCorrectionTool","StatusTools.setStatusTool","StatusTools.createTaskTool","StatusTools.completeTaskTool","StatusTools.deleteTaskTool","QueueTools.queueStatusTool","QueueTools.getTranscriptByUuidTool","QueueTools.retryTranscriptionTool","QueueTools.cancelTranscriptionTool","QueueTools.workerStatusTool","QueueTools.restartWorkerTool","SystemTools.handleGetVersion","SystemTools.handleGetInfo","DiscoveryTools.handleDiscoverConfig","DiscoveryTools.handleSuggestProject","AudioTools.handleProcessAudio","AudioTools.handleBatchProcess","ContextTools.handleContextStatus","ContextTools.handleListProjects","ContextTools.handleListProjectPlans","ContextTools.handleListPeople","ContextTools.handleListTerms","ContextTools.handleListCompanies","ContextTools.handleSearchContext","ContextTools.handleGetEntity","ContextTools.handlePredictEntities","EntityTools.handleAddPerson","EntityTools.handleEditPerson","EntityTools.handleAddProject","EntityTools.handleEditProject","EntityTools.handleUpdateProject","EntityTools.handleAddTerm","EntityTools.handleEditTerm","EntityTools.handleUpdateTerm","EntityTools.handleMergeTerms","EntityTools.handleAddCompany","EntityTools.handleEditCompany","EntityTools.handleDeleteEntity","AssistTools.handleSuggestProjectMetadata","AssistTools.handleSuggestTermMetadata","RelationshipTools.handleAddRelationship","RelationshipTools.handleRemoveRelationship","RelationshipTools.handleListRelationships","RelationshipTools.handleFindRelatedEntities","ContentTools.handleAddContent","ContentTools.handleRemoveContent","ContentTools.handleListContent","ContentTools.handleGetContent","TranscriptTools.handleReadTranscript","TranscriptTools.handleListTranscripts","TranscriptTools.handleIdentifyTasksFromTranscript","TranscriptTools.handleSummarizeTranscript","TranscriptTools.handleDeleteTranscriptSummary","TranscriptTools.handleEditTranscript","TranscriptTools.handleChangeTranscriptDate","TranscriptTools.handleCombineTranscripts","TranscriptTools.handleProvideFeedback","TranscriptTools.handleEnhanceTranscript","TranscriptTools.handleUpdateTranscriptContent","TranscriptTools.handleUpdateTranscriptEntityReferences","TranscriptTools.handleCreateNote","TranscriptTools.handleGetEnhancementLog","TranscriptTools.handleCorrectToEntity","TranscriptTools.handleRejectCorrection","StatusTools.handleSetStatus","StatusTools.handleCreateTask","StatusTools.handleCompleteTask","StatusTools.handleDeleteTask","QueueTools.handleQueueStatus","QueueTools.handleGetTranscriptByUuid","QueueTools.handleRetryTranscription","QueueTools.handleCancelTranscription","QueueTools.handleWorkerStatus","QueueTools.handleRestartWorker"],"mappings":"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"}