@redaksjon/protokoll-engine 0.1.1-dev.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +47 -0
- package/dist/agentic/executor.d.ts +21 -0
- package/dist/agentic/executor.d.ts.map +1 -0
- package/dist/agentic/index.d.ts +27 -0
- package/dist/agentic/index.d.ts.map +1 -0
- package/dist/agentic/registry.d.ts +11 -0
- package/dist/agentic/registry.d.ts.map +1 -0
- package/dist/agentic/tools/lookup-person.d.ts +3 -0
- package/dist/agentic/tools/lookup-person.d.ts.map +1 -0
- package/dist/agentic/tools/lookup-project.d.ts +3 -0
- package/dist/agentic/tools/lookup-project.d.ts.map +1 -0
- package/dist/agentic/tools/route-note.d.ts +3 -0
- package/dist/agentic/tools/route-note.d.ts.map +1 -0
- package/dist/agentic/tools/store-context.d.ts +3 -0
- package/dist/agentic/tools/store-context.d.ts.map +1 -0
- package/dist/agentic/tools/verify-spelling.d.ts +3 -0
- package/dist/agentic/tools/verify-spelling.d.ts.map +1 -0
- package/dist/agentic/types.d.ts +110 -0
- package/dist/agentic/types.d.ts.map +1 -0
- package/dist/constants.d.ts +98 -0
- package/dist/constants.d.ts.map +1 -0
- package/dist/feedback/analyzer.d.ts +13 -0
- package/dist/feedback/analyzer.d.ts.map +1 -0
- package/dist/feedback/decision-tracker.d.ts +14 -0
- package/dist/feedback/decision-tracker.d.ts.map +1 -0
- package/dist/feedback/handler.d.ts +14 -0
- package/dist/feedback/handler.d.ts.map +1 -0
- package/dist/feedback/index.d.ts +12 -0
- package/dist/feedback/index.d.ts.map +1 -0
- package/dist/feedback/types.d.ts +72 -0
- package/dist/feedback/types.d.ts.map +1 -0
- package/dist/index.d.ts +24 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +32 -0
- package/dist/index.js.map +1 -0
- package/dist/index10.js +4 -0
- package/dist/index10.js.map +1 -0
- package/dist/index11.js +22 -0
- package/dist/index11.js.map +1 -0
- package/dist/index12.js +125 -0
- package/dist/index12.js.map +1 -0
- package/dist/index13.js +124 -0
- package/dist/index13.js.map +1 -0
- package/dist/index14.js +296 -0
- package/dist/index14.js.map +1 -0
- package/dist/index15.js +100 -0
- package/dist/index15.js.map +1 -0
- package/dist/index16.js +107 -0
- package/dist/index16.js.map +1 -0
- package/dist/index17.js +185 -0
- package/dist/index17.js.map +1 -0
- package/dist/index18.js +53 -0
- package/dist/index18.js.map +1 -0
- package/dist/index19.js +19 -0
- package/dist/index19.js.map +1 -0
- package/dist/index2.js +33 -0
- package/dist/index2.js.map +1 -0
- package/dist/index20.js +105 -0
- package/dist/index20.js.map +1 -0
- package/dist/index21.js +26 -0
- package/dist/index21.js.map +1 -0
- package/dist/index22.js +49 -0
- package/dist/index22.js.map +1 -0
- package/dist/index23.js +119 -0
- package/dist/index23.js.map +1 -0
- package/dist/index24.js +330 -0
- package/dist/index24.js.map +1 -0
- package/dist/index25.js +57 -0
- package/dist/index25.js.map +1 -0
- package/dist/index26.js +38 -0
- package/dist/index26.js.map +1 -0
- package/dist/index27.js +127 -0
- package/dist/index27.js.map +1 -0
- package/dist/index28.js +157 -0
- package/dist/index28.js.map +1 -0
- package/dist/index29.js +163 -0
- package/dist/index29.js.map +1 -0
- package/dist/index3.js +36 -0
- package/dist/index3.js.map +1 -0
- package/dist/index30.js +173 -0
- package/dist/index30.js.map +1 -0
- package/dist/index31.js +423 -0
- package/dist/index31.js.map +1 -0
- package/dist/index32.js +161 -0
- package/dist/index32.js.map +1 -0
- package/dist/index33.js +152 -0
- package/dist/index33.js.map +1 -0
- package/dist/index34.js +56 -0
- package/dist/index34.js.map +1 -0
- package/dist/index35.js +103 -0
- package/dist/index35.js.map +1 -0
- package/dist/index36.js +451 -0
- package/dist/index36.js.map +1 -0
- package/dist/index37.js +431 -0
- package/dist/index37.js.map +1 -0
- package/dist/index38.js +87 -0
- package/dist/index38.js.map +1 -0
- package/dist/index39.js +122 -0
- package/dist/index39.js.map +1 -0
- package/dist/index4.js +3 -0
- package/dist/index4.js.map +1 -0
- package/dist/index40.js +299 -0
- package/dist/index40.js.map +1 -0
- package/dist/index41.js +49 -0
- package/dist/index41.js.map +1 -0
- package/dist/index42.js +151 -0
- package/dist/index42.js.map +1 -0
- package/dist/index43.js +226 -0
- package/dist/index43.js.map +1 -0
- package/dist/index44.js +49 -0
- package/dist/index44.js.map +1 -0
- package/dist/index45.js +45 -0
- package/dist/index45.js.map +1 -0
- package/dist/index46.js +37 -0
- package/dist/index46.js.map +1 -0
- package/dist/index47.js +51 -0
- package/dist/index47.js.map +1 -0
- package/dist/index48.js +39 -0
- package/dist/index48.js.map +1 -0
- package/dist/index49.js +239 -0
- package/dist/index49.js.map +1 -0
- package/dist/index5.js +17 -0
- package/dist/index5.js.map +1 -0
- package/dist/index50.js +163 -0
- package/dist/index50.js.map +1 -0
- package/dist/index51.js +81 -0
- package/dist/index51.js.map +1 -0
- package/dist/index52.js +78 -0
- package/dist/index52.js.map +1 -0
- package/dist/index53.js +22 -0
- package/dist/index53.js.map +1 -0
- package/dist/index54.js +8 -0
- package/dist/index54.js.map +1 -0
- package/dist/index55.js +8 -0
- package/dist/index55.js.map +1 -0
- package/dist/index56.js +17 -0
- package/dist/index56.js.map +1 -0
- package/dist/index57.js +4 -0
- package/dist/index57.js.map +1 -0
- package/dist/index58.js +17 -0
- package/dist/index58.js.map +1 -0
- package/dist/index59.js +4 -0
- package/dist/index59.js.map +1 -0
- package/dist/index6.js +22 -0
- package/dist/index6.js.map +1 -0
- package/dist/index60.js +6 -0
- package/dist/index60.js.map +1 -0
- package/dist/index7.js +27 -0
- package/dist/index7.js.map +1 -0
- package/dist/index8.js +22 -0
- package/dist/index8.js.map +1 -0
- package/dist/index9.js +5 -0
- package/dist/index9.js.map +1 -0
- package/dist/logging.d.ts +7 -0
- package/dist/logging.d.ts.map +1 -0
- package/dist/output/index.d.ts +15 -0
- package/dist/output/index.d.ts.map +1 -0
- package/dist/phases/complete.d.ts +17 -0
- package/dist/phases/complete.d.ts.map +1 -0
- package/dist/phases/index.d.ts +5 -0
- package/dist/phases/index.d.ts.map +1 -0
- package/dist/phases/locate.d.ts +15 -0
- package/dist/phases/locate.d.ts.map +1 -0
- package/dist/phases/simple-replace.d.ts +72 -0
- package/dist/phases/simple-replace.d.ts.map +1 -0
- package/dist/phases/transcribe.d.ts +19 -0
- package/dist/phases/transcribe.d.ts.map +1 -0
- package/dist/pipeline/index.d.ts +10 -0
- package/dist/pipeline/index.d.ts.map +1 -0
- package/dist/pipeline/orchestrator.d.ts +13 -0
- package/dist/pipeline/orchestrator.d.ts.map +1 -0
- package/dist/pipeline/types.d.ts +58 -0
- package/dist/pipeline/types.d.ts.map +1 -0
- package/dist/prompt/index.d.ts +3 -0
- package/dist/prompt/index.d.ts.map +1 -0
- package/dist/prompt/templates.d.ts +40 -0
- package/dist/prompt/templates.d.ts.map +1 -0
- package/dist/prompt/transcribe.d.ts +42 -0
- package/dist/prompt/transcribe.d.ts.map +1 -0
- package/dist/reasoning/client.d.ts +42 -0
- package/dist/reasoning/client.d.ts.map +1 -0
- package/dist/reasoning/index.d.ts +17 -0
- package/dist/reasoning/index.d.ts.map +1 -0
- package/dist/reasoning/strategy.d.ts +12 -0
- package/dist/reasoning/strategy.d.ts.map +1 -0
- package/dist/reasoning/types.d.ts +58 -0
- package/dist/reasoning/types.d.ts.map +1 -0
- package/dist/reflection/collector.d.ts +18 -0
- package/dist/reflection/collector.d.ts.map +1 -0
- package/dist/reflection/index.d.ts +13 -0
- package/dist/reflection/index.d.ts.map +1 -0
- package/dist/reflection/reporter.d.ts +10 -0
- package/dist/reflection/reporter.d.ts.map +1 -0
- package/dist/reflection/types.d.ts +99 -0
- package/dist/reflection/types.d.ts.map +1 -0
- package/dist/routing/classifier.d.ts +8 -0
- package/dist/routing/classifier.d.ts.map +1 -0
- package/dist/routing/index.d.ts +12 -0
- package/dist/routing/index.d.ts.map +1 -0
- package/dist/routing/router.d.ts +8 -0
- package/dist/routing/router.d.ts.map +1 -0
- package/dist/routing/types.d.ts +68 -0
- package/dist/routing/types.d.ts.map +1 -0
- package/dist/transcript/feedback.d.ts +70 -0
- package/dist/transcript/feedback.d.ts.map +1 -0
- package/dist/transcript/index.d.ts +10 -0
- package/dist/transcript/index.d.ts.map +1 -0
- package/dist/transcript/operations.d.ts +152 -0
- package/dist/transcript/operations.d.ts.map +1 -0
- package/dist/transcript/pkl-utils.d.ts +66 -0
- package/dist/transcript/pkl-utils.d.ts.map +1 -0
- package/dist/transcription/index.d.ts +17 -0
- package/dist/transcription/index.d.ts.map +1 -0
- package/dist/transcription/service.d.ts +10 -0
- package/dist/transcription/service.d.ts.map +1 -0
- package/dist/transcription/types.d.ts +41 -0
- package/dist/transcription/types.d.ts.map +1 -0
- package/dist/types.d.ts +28 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/util/collision-detector.d.ts +77 -0
- package/dist/util/collision-detector.d.ts.map +1 -0
- package/dist/util/dates.d.ts +57 -0
- package/dist/util/dates.d.ts.map +1 -0
- package/dist/util/general.d.ts +3 -0
- package/dist/util/general.d.ts.map +1 -0
- package/dist/util/media.d.ts +9 -0
- package/dist/util/media.d.ts.map +1 -0
- package/dist/util/metadata.d.ts +138 -0
- package/dist/util/metadata.d.ts.map +1 -0
- package/dist/util/openai.d.ts +22 -0
- package/dist/util/openai.d.ts.map +1 -0
- package/dist/util/sounds-like-database.d.ts +98 -0
- package/dist/util/sounds-like-database.d.ts.map +1 -0
- package/dist/util/storage.d.ts +35 -0
- package/dist/util/storage.d.ts.map +1 -0
- package/dist/util/text-replacer.d.ts +56 -0
- package/dist/util/text-replacer.d.ts.map +1 -0
- package/dist/utils/entityFinder.d.ts +29 -0
- package/dist/utils/entityFinder.d.ts.map +1 -0
- package/package.json +84 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index14.js","sources":["../src/util/metadata.ts"],"sourcesContent":["import * as Routing from '@/routing';\n\n// ============================================================================\n// Lifecycle Types\n// ============================================================================\n\n/**\n * Transcript lifecycle status\n * - initial: Whisper transcription complete\n * - enhanced: Context-aware enhancement complete\n * - reviewed: User has reviewed the transcript\n * - in_progress: Has outstanding tasks to complete\n * - closed: All work complete, no pending tasks\n * - archived: Archived for long-term storage\n */\nexport type TranscriptStatus = 'initial' | 'enhanced' | 'reviewed' | 'in_progress' | 'closed' | 'archived';\n\n/**\n * Record of a status transition with timestamp\n */\nexport interface StatusTransition {\n from: TranscriptStatus;\n to: TranscriptStatus;\n at: string; // ISO 8601 timestamp\n}\n\n/**\n * A follow-up task associated with a transcript\n */\nexport interface Task {\n id: string; // generated unique ID (e.g., task-1234567890-abc123)\n description: string;\n status: 'open' | 'done';\n created: string; // ISO 8601 timestamp\n changed?: string; // ISO 8601 timestamp - when last modified\n completed?: string; // ISO 8601 timestamp - when marked done\n}\n\n// ============================================================================\n// Entity Types\n// ============================================================================\n\nexport interface EntityReference {\n id: string;\n name: string;\n type: 'person' | 'project' | 'term' | 'company';\n}\n\nexport interface TranscriptMetadata {\n // Core fields\n title?: string;\n project?: string;\n projectId?: string;\n routing?: RoutingMetadata;\n tags?: string[];\n date?: Date;\n recordingTime?: string;\n confidence?: number;\n duration?: string;\n \n // Lifecycle fields\n status?: TranscriptStatus;\n history?: StatusTransition[];\n tasks?: Task[];\n \n // Entity references - entities mentioned/used in this transcript\n entities?: {\n people?: EntityReference[];\n projects?: EntityReference[];\n terms?: EntityReference[];\n companies?: EntityReference[];\n };\n}\n\nexport interface RoutingMetadata {\n destination: string;\n confidence: number;\n signals: Routing.ClassificationSignal[];\n reasoning: string;\n}\n\n/**\n * Format metadata as Markdown heading section\n */\nexport const formatMetadataMarkdown = (metadata: TranscriptMetadata): string => {\n const lines: string[] = [];\n \n // Title section\n if (metadata.title) {\n lines.push(`# ${metadata.title}`);\n lines.push('');\n }\n \n // Metadata frontmatter as readable markdown\n lines.push('## Metadata');\n lines.push('');\n \n // Date and Time\n if (metadata.date) {\n const dateStr = metadata.date.toLocaleDateString('en-US', {\n year: 'numeric',\n month: 'long',\n day: 'numeric'\n });\n lines.push(`**Date**: ${dateStr}`);\n \n if (metadata.recordingTime) {\n lines.push(`**Time**: ${metadata.recordingTime}`);\n } else {\n const timeStr = metadata.date.toLocaleTimeString('en-US', {\n hour: '2-digit',\n minute: '2-digit',\n hour12: true\n });\n lines.push(`**Time**: ${timeStr}`);\n }\n }\n \n lines.push('');\n \n // Project\n if (metadata.project) {\n lines.push(`**Project**: ${metadata.project}`);\n if (metadata.projectId) {\n lines.push(`**Project ID**: \\`${metadata.projectId}\\``);\n }\n lines.push('');\n }\n \n // Routing Information\n if (metadata.routing) {\n lines.push('### Routing');\n lines.push('');\n lines.push(`**Destination**: ${metadata.routing.destination}`);\n lines.push(`**Confidence**: ${(metadata.routing.confidence * 100).toFixed(1)}%`);\n lines.push('');\n \n if (metadata.routing.signals.length > 0) {\n lines.push('**Classification Signals**:');\n for (const signal of metadata.routing.signals) {\n const signalType = signal.type.replace(/_/g, ' ');\n const weight = (signal.weight * 100).toFixed(0);\n lines.push(`- ${signalType}: \"${signal.value}\" (${weight}% weight)`);\n }\n lines.push('');\n }\n \n if (metadata.routing.reasoning) {\n lines.push(`**Reasoning**: ${metadata.routing.reasoning}`);\n lines.push('');\n }\n }\n \n // Tags\n if (metadata.tags && metadata.tags.length > 0) {\n lines.push('**Tags**: ' + metadata.tags.map(tag => `\\`${tag}\\``).join(', '));\n lines.push('');\n }\n \n // Duration\n if (metadata.duration) {\n lines.push(`**Duration**: ${metadata.duration}`);\n lines.push('');\n }\n \n // Separator\n lines.push('---');\n lines.push('');\n \n return lines.join('\\n');\n};\n\n/**\n * Format entity metadata as Markdown footer section\n * This goes at the END of the transcript for machine readability\n */\nexport const formatEntityMetadataMarkdown = (metadata: TranscriptMetadata): string => {\n if (!metadata.entities) {\n return '';\n }\n \n const lines: string[] = [];\n lines.push('');\n lines.push('---');\n lines.push('');\n lines.push('## Entity References');\n lines.push('');\n lines.push('<!-- Machine-readable entity metadata for indexing and querying -->');\n lines.push('');\n \n // People\n if (metadata.entities.people && metadata.entities.people.length > 0) {\n lines.push('### People');\n lines.push('');\n for (const person of metadata.entities.people) {\n lines.push(`- \\`${person.id}\\`: ${person.name}`);\n }\n lines.push('');\n }\n \n // Projects\n if (metadata.entities.projects && metadata.entities.projects.length > 0) {\n lines.push('### Projects');\n lines.push('');\n for (const project of metadata.entities.projects) {\n lines.push(`- \\`${project.id}\\`: ${project.name}`);\n }\n lines.push('');\n }\n \n // Terms\n if (metadata.entities.terms && metadata.entities.terms.length > 0) {\n lines.push('### Terms');\n lines.push('');\n for (const term of metadata.entities.terms) {\n lines.push(`- \\`${term.id}\\`: ${term.name}`);\n }\n lines.push('');\n }\n \n // Companies\n if (metadata.entities.companies && metadata.entities.companies.length > 0) {\n lines.push('### Companies');\n lines.push('');\n for (const company of metadata.entities.companies) {\n lines.push(`- \\`${company.id}\\`: ${company.name}`);\n }\n lines.push('');\n }\n \n return lines.join('\\n');\n};\n\n/**\n * Parse entity metadata from a transcript\n * Reads the Entity References section if present\n */\nexport const parseEntityMetadata = (content: string): TranscriptMetadata['entities'] | undefined => {\n // Find the Entity References section\n // Look for \"## Entity References\" and capture everything after it until the next \"##\" header or end of content\n const headerIndex = content.indexOf('## Entity References');\n if (headerIndex === -1) {\n return undefined;\n }\n \n // Find the start of the content (after the header and any whitespace/newlines)\n let contentStart = headerIndex + '## Entity References'.length;\n // Skip whitespace and newlines\n while (contentStart < content.length && (content[contentStart] === '\\n' || content[contentStart] === '\\r' || content[contentStart] === ' ' || content[contentStart] === '\\t')) {\n contentStart++;\n }\n \n // Find the end - look for next \"##\" at start of line or end of content\n const remainingContent = content.substring(contentStart);\n const nextHeaderMatch = remainingContent.match(/\\n## /);\n const sectionContent = nextHeaderMatch \n ? remainingContent.substring(0, nextHeaderMatch.index)\n : remainingContent;\n const entities: NonNullable<TranscriptMetadata['entities']> = {\n people: [],\n projects: [],\n terms: [],\n companies: [],\n };\n \n // Parse each entity type\n const parseEntities = (type: 'People' | 'Projects' | 'Terms' | 'Companies'): EntityReference[] => {\n // Map plural type names to singular entity types\n const typeMap: Record<string, 'person' | 'project' | 'term' | 'company'> = {\n 'People': 'person',\n 'Projects': 'project',\n 'Terms': 'term',\n 'Companies': 'company',\n };\n \n const entityType = typeMap[type];\n \n // Find the section for this type\n const sectionHeader = `### ${type}`;\n const sectionStart = sectionContent.indexOf(sectionHeader);\n if (sectionStart === -1) return [];\n \n // Find the end (next ### or end of content)\n // Skip past the header line (including newline)\n const headerEnd = sectionStart + sectionHeader.length;\n let sectionTextStart = headerEnd;\n // Skip whitespace and newlines after the header\n while (sectionTextStart < sectionContent.length && \n (sectionContent[sectionTextStart] === '\\n' || sectionContent[sectionTextStart] === '\\r' || sectionContent[sectionTextStart] === ' ')) {\n sectionTextStart++;\n }\n \n const afterSection = sectionContent.substring(sectionTextStart);\n const nextSection = afterSection.search(/\\n###/);\n const sectionText = nextSection === -1 ? afterSection : afterSection.substring(0, nextSection);\n \n // Extract items - match format: \"- `id`: name\"\n // Match bullet point with backticked ID and name\n const items: EntityReference[] = [];\n // Use multiline regex to match across lines, look for \"- `id`: name\" pattern\n const lines = sectionText.split('\\n');\n for (const line of lines) {\n const trimmed = line.trim();\n // Match: \"- `id`: name\" or \"- `id`:name\" (with or without space after colon)\n const match = trimmed.match(/^- `([^`]+)`:\\s*(.+)$/);\n if (match) {\n items.push({\n id: match[1],\n name: match[2].trim(),\n type: entityType,\n });\n }\n }\n \n return items;\n };\n \n entities.people = parseEntities('People');\n entities.projects = parseEntities('Projects');\n entities.terms = parseEntities('Terms');\n entities.companies = parseEntities('Companies');\n \n // Only return if we found any entities\n const hasEntities = \n entities.people.length > 0 ||\n entities.projects.length > 0 ||\n entities.terms.length > 0 ||\n entities.companies.length > 0;\n \n return hasEntities ? entities : undefined;\n};\n\n/**\n * Extract routing metadata from a RouteDecision\n */\nexport const createRoutingMetadata = (decision: Routing.RouteDecision): RoutingMetadata => {\n return {\n destination: decision.destination.path,\n confidence: decision.confidence,\n signals: decision.signals,\n reasoning: decision.reasoning,\n };\n};\n\n/**\n * Format duration in seconds to readable format (e.g., \"2m 30s\")\n */\nexport const formatDuration = (seconds: number): string => {\n const minutes = Math.floor(seconds / 60);\n const secs = Math.round(seconds % 60);\n \n if (minutes === 0) {\n return `${secs}s`;\n }\n \n if (secs === 0) {\n return `${minutes}m`;\n }\n \n return `${minutes}m ${secs}s`;\n};\n\n/**\n * Format time as HH:MM AM/PM\n */\nexport const formatTime = (date: Date): string => {\n return date.toLocaleTimeString('en-US', {\n hour: '2-digit',\n minute: '2-digit',\n hour12: true\n });\n};\n\n/**\n * Extract topic from routing signals\n */\nexport const extractTopicFromSignals = (signals: Routing.ClassificationSignal[]): string | undefined => {\n const topicSignal = signals.find(s => s.type === 'topic' || s.type === 'context_type');\n return topicSignal?.value;\n};\n\n/**\n * Extract all tags from routing signals\n * Tags are deduplicated to avoid duplicates from multiple signal sources\n */\nexport const extractTagsFromSignals = (signals: Routing.ClassificationSignal[]): string[] => {\n const tags = signals\n .filter(s => s.type !== 'context_type') // Skip generic context type\n .map(s => s.value)\n .filter((v): v is string => typeof v === 'string');\n \n // Deduplicate tags using Set\n return Array.from(new Set(tags));\n};\n\n// ============================================================================\n// Lifecycle Utilities\n// ============================================================================\n\n/**\n * Valid transcript statuses for validation\n */\nexport const VALID_STATUSES: TranscriptStatus[] = [\n 'initial', 'enhanced', 'reviewed', 'in_progress', 'closed', 'archived'\n];\n\n/**\n * Check if a string is a valid TranscriptStatus\n */\nexport const isValidStatus = (status: string): status is TranscriptStatus => {\n return VALID_STATUSES.includes(status as TranscriptStatus);\n};\n\n/**\n * Generate a unique task ID\n */\nexport const generateTaskId = (): string => {\n const timestamp = Date.now();\n const random = Math.random().toString(36).substring(2, 8);\n return `task-${timestamp}-${random}`;\n};\n\n/**\n * Create a new task\n */\nexport const createTask = (description: string): Task => {\n return {\n id: generateTaskId(),\n description,\n status: 'open',\n created: new Date().toISOString(),\n };\n};\n\n/**\n * Update transcript status and record the transition in history\n * Returns unchanged metadata if status is the same (no duplicate history)\n */\nexport const updateStatus = (\n metadata: TranscriptMetadata,\n newStatus: TranscriptStatus\n): TranscriptMetadata => {\n const oldStatus = metadata.status;\n \n // Don't add duplicate history if status unchanged\n if (oldStatus === newStatus) {\n return metadata;\n }\n \n const transition: StatusTransition = {\n from: oldStatus || 'reviewed',\n to: newStatus,\n at: new Date().toISOString(),\n };\n \n return {\n ...metadata,\n status: newStatus,\n history: [...(metadata.history || []), transition],\n };\n};\n\n/**\n * Apply default lifecycle fields to metadata\n * Used during lazy migration of old-format transcripts\n */\nexport const applyLifecycleDefaults = (metadata: TranscriptMetadata): TranscriptMetadata => {\n return {\n ...metadata,\n status: metadata.status ?? 'reviewed',\n history: metadata.history ?? [],\n tasks: metadata.tasks ?? [],\n };\n};\n\n/**\n * Complete a task by ID\n */\nexport const completeTask = (metadata: TranscriptMetadata, taskId: string): TranscriptMetadata => {\n const tasks = metadata.tasks || [];\n const taskIndex = tasks.findIndex(t => t.id === taskId);\n \n if (taskIndex === -1) {\n throw new Error(`Task not found: ${taskId}`);\n }\n \n const now = new Date().toISOString();\n const updatedTasks = [...tasks];\n updatedTasks[taskIndex] = {\n ...updatedTasks[taskIndex],\n status: 'done',\n changed: now,\n completed: now,\n };\n \n return {\n ...metadata,\n tasks: updatedTasks,\n };\n};\n\n/**\n * Delete a task by ID\n */\nexport const deleteTask = (metadata: TranscriptMetadata, taskId: string): TranscriptMetadata => {\n const tasks = metadata.tasks || [];\n const taskIndex = tasks.findIndex(t => t.id === taskId);\n \n if (taskIndex === -1) {\n throw new Error(`Task not found: ${taskId}`);\n }\n \n return {\n ...metadata,\n tasks: tasks.filter(t => t.id !== taskId),\n };\n};\n\n/**\n * Add a task to metadata\n */\nexport const addTask = (metadata: TranscriptMetadata, description: string): { metadata: TranscriptMetadata; task: Task } => {\n const task = createTask(description);\n \n return {\n metadata: {\n ...metadata,\n tasks: [...(metadata.tasks || []), task],\n },\n task,\n };\n};\n\n\n"],"names":[],"mappings":"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"}
|
package/dist/index15.js
ADDED
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
function levenshteinDistance(str1, str2) {
|
|
2
|
+
const s1 = str1.toLowerCase();
|
|
3
|
+
const s2 = str2.toLowerCase();
|
|
4
|
+
if (s1 === s2) return 0;
|
|
5
|
+
if (s1.length === 0) return s2.length;
|
|
6
|
+
if (s2.length === 0) return s1.length;
|
|
7
|
+
const matrix = [];
|
|
8
|
+
for (let i = 0; i <= s2.length; i++) {
|
|
9
|
+
matrix[i] = [i];
|
|
10
|
+
}
|
|
11
|
+
for (let j = 0; j <= s1.length; j++) {
|
|
12
|
+
matrix[0][j] = j;
|
|
13
|
+
}
|
|
14
|
+
for (let i = 1; i <= s2.length; i++) {
|
|
15
|
+
for (let j = 1; j <= s1.length; j++) {
|
|
16
|
+
if (s2.charAt(i - 1) === s1.charAt(j - 1)) {
|
|
17
|
+
matrix[i][j] = matrix[i - 1][j - 1];
|
|
18
|
+
} else {
|
|
19
|
+
matrix[i][j] = Math.min(
|
|
20
|
+
matrix[i - 1][j - 1] + 1,
|
|
21
|
+
// substitution
|
|
22
|
+
matrix[i][j - 1] + 1,
|
|
23
|
+
// insertion
|
|
24
|
+
matrix[i - 1][j] + 1
|
|
25
|
+
// deletion
|
|
26
|
+
);
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
return matrix[s2.length][s1.length];
|
|
31
|
+
}
|
|
32
|
+
function similarityScore(str1, str2) {
|
|
33
|
+
const distance = levenshteinDistance(str1, str2);
|
|
34
|
+
const maxLength = Math.max(str1.length, str2.length);
|
|
35
|
+
if (maxLength === 0) return 1;
|
|
36
|
+
return 1 - distance / maxLength;
|
|
37
|
+
}
|
|
38
|
+
function findEntityResilient(allEntities, query, entityTypeName) {
|
|
39
|
+
const queryLower = query.toLowerCase();
|
|
40
|
+
const matches = [];
|
|
41
|
+
for (const entity of allEntities) {
|
|
42
|
+
const idLower = entity.id.toLowerCase();
|
|
43
|
+
const nameLower = entity.name.toLowerCase();
|
|
44
|
+
if (idLower === queryLower) {
|
|
45
|
+
return entity;
|
|
46
|
+
}
|
|
47
|
+
if (nameLower === queryLower) {
|
|
48
|
+
matches.push({ entity, score: 1, matchType: "exact_name" });
|
|
49
|
+
continue;
|
|
50
|
+
}
|
|
51
|
+
const idSimilarity = similarityScore(query, entity.id);
|
|
52
|
+
if (idSimilarity >= 0.7) {
|
|
53
|
+
matches.push({ entity, score: idSimilarity, matchType: "fuzzy_id" });
|
|
54
|
+
}
|
|
55
|
+
const nameSimilarity = similarityScore(query, entity.name);
|
|
56
|
+
if (nameSimilarity >= 0.7) {
|
|
57
|
+
matches.push({ entity, score: nameSimilarity, matchType: "fuzzy_name" });
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
if (matches.length > 0) {
|
|
61
|
+
matches.sort((a, b) => {
|
|
62
|
+
if (a.matchType === "exact_name" && b.matchType !== "exact_name") return -1;
|
|
63
|
+
if (b.matchType === "exact_name" && a.matchType !== "exact_name") return 1;
|
|
64
|
+
return b.score - a.score;
|
|
65
|
+
});
|
|
66
|
+
return matches[0].entity;
|
|
67
|
+
}
|
|
68
|
+
const entityList = allEntities.map((e) => ` - ${e.id} (${e.name})`).join("\n");
|
|
69
|
+
throw new Error(
|
|
70
|
+
`${entityTypeName} not found: "${query}"
|
|
71
|
+
|
|
72
|
+
Available ${entityTypeName.toLowerCase()}s:
|
|
73
|
+
${entityList}
|
|
74
|
+
|
|
75
|
+
Note: Matching is case-insensitive and supports fuzzy matching. Try using the ${entityTypeName.toLowerCase()} ID or name exactly as shown above.`
|
|
76
|
+
);
|
|
77
|
+
}
|
|
78
|
+
function findProjectResilient(context, query) {
|
|
79
|
+
const allProjects = context.getAllProjects();
|
|
80
|
+
return findEntityResilient(allProjects, query, "Project");
|
|
81
|
+
}
|
|
82
|
+
function findPersonResilient(context, query) {
|
|
83
|
+
const allPeople = context.getAllPeople();
|
|
84
|
+
return findEntityResilient(allPeople, query, "Person");
|
|
85
|
+
}
|
|
86
|
+
function findCompanyResilient(context, query) {
|
|
87
|
+
const allCompanies = context.getAllCompanies();
|
|
88
|
+
return findEntityResilient(allCompanies, query, "Company");
|
|
89
|
+
}
|
|
90
|
+
function findTermResilient(context, query) {
|
|
91
|
+
const allTerms = context.getAllTerms();
|
|
92
|
+
return findEntityResilient(allTerms, query, "Term");
|
|
93
|
+
}
|
|
94
|
+
function findIgnoredResilient(context, query) {
|
|
95
|
+
const allIgnored = context.getAllIgnored();
|
|
96
|
+
return findEntityResilient(allIgnored, query, "Ignored term");
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
export { findCompanyResilient, findIgnoredResilient, findPersonResilient, findProjectResilient, findTermResilient };
|
|
100
|
+
//# sourceMappingURL=index15.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index15.js","sources":["../src/utils/entityFinder.ts"],"sourcesContent":["/**\n * Resilient Entity Finder\n * \n * Provides case-insensitive and fuzzy matching for all entity types.\n * Handles typos, capitalization differences, and matches by both ID and name.\n */\n\nimport * as Context from '@redaksjon/context';\nimport type { Entity, Person, Project, Company, Term, IgnoredTerm } from '@redaksjon/context';\n\n/**\n * Calculate Levenshtein distance between two strings\n * Returns the minimum number of single-character edits needed to transform str1 into str2\n */\nfunction levenshteinDistance(str1: string, str2: string): number {\n const s1 = str1.toLowerCase();\n const s2 = str2.toLowerCase();\n \n if (s1 === s2) return 0;\n if (s1.length === 0) return s2.length;\n if (s2.length === 0) return s1.length;\n \n const matrix: number[][] = [];\n \n // Initialize first row and column\n for (let i = 0; i <= s2.length; i++) {\n matrix[i] = [i];\n }\n for (let j = 0; j <= s1.length; j++) {\n matrix[0][j] = j;\n }\n \n // Fill the matrix\n for (let i = 1; i <= s2.length; i++) {\n for (let j = 1; j <= s1.length; j++) {\n if (s2.charAt(i - 1) === s1.charAt(j - 1)) {\n matrix[i][j] = matrix[i - 1][j - 1];\n } else {\n matrix[i][j] = Math.min(\n matrix[i - 1][j - 1] + 1, // substitution\n matrix[i][j - 1] + 1, // insertion\n matrix[i - 1][j] + 1 // deletion\n );\n }\n }\n }\n \n return matrix[s2.length][s1.length];\n}\n\n/**\n * Calculate similarity score (0-1) based on Levenshtein distance\n * 1.0 = identical, 0.0 = completely different\n */\nfunction similarityScore(str1: string, str2: string): number {\n const distance = levenshteinDistance(str1, str2);\n const maxLength = Math.max(str1.length, str2.length);\n if (maxLength === 0) return 1.0;\n return 1 - (distance / maxLength);\n}\n\ninterface EntityMatch<T extends Entity> {\n entity: T;\n score: number;\n matchType: 'exact_id' | 'exact_name' | 'fuzzy_id' | 'fuzzy_name';\n}\n\n/**\n * Generic resilient entity finder\n * Works for any entity type that has id and name properties\n */\nfunction findEntityResilient<T extends Entity>(\n allEntities: T[],\n query: string,\n entityTypeName: string\n): T {\n const queryLower = query.toLowerCase();\n const matches: EntityMatch<T>[] = [];\n \n for (const entity of allEntities) {\n const idLower = entity.id.toLowerCase();\n const nameLower = entity.name.toLowerCase();\n \n // 1. Exact ID match\n if (idLower === queryLower) {\n return entity; // Return immediately for exact match\n }\n \n // 2. Exact name match\n if (nameLower === queryLower) {\n matches.push({ entity, score: 1.0, matchType: 'exact_name' });\n continue;\n }\n \n // 3. Fuzzy ID match\n const idSimilarity = similarityScore(query, entity.id);\n if (idSimilarity >= 0.7) {\n matches.push({ entity, score: idSimilarity, matchType: 'fuzzy_id' });\n }\n \n // 4. Fuzzy name match\n const nameSimilarity = similarityScore(query, entity.name);\n if (nameSimilarity >= 0.7) {\n matches.push({ entity, score: nameSimilarity, matchType: 'fuzzy_name' });\n }\n }\n \n // If we found matches, return the best one\n if (matches.length > 0) {\n matches.sort((a, b) => {\n // Prefer exact matches over fuzzy\n if (a.matchType === 'exact_name' && b.matchType !== 'exact_name') return -1;\n if (b.matchType === 'exact_name' && a.matchType !== 'exact_name') return 1;\n // Then sort by score\n return b.score - a.score;\n });\n return matches[0].entity;\n }\n \n // No match found - build helpful error message\n const entityList = allEntities\n .map(e => ` - ${e.id} (${e.name})`)\n .join('\\n');\n \n throw new Error(\n `${entityTypeName} not found: \"${query}\"\\n\\n` +\n `Available ${entityTypeName.toLowerCase()}s:\\n${entityList}\\n\\n` +\n `Note: Matching is case-insensitive and supports fuzzy matching. ` +\n `Try using the ${entityTypeName.toLowerCase()} ID or name exactly as shown above.`\n );\n}\n\n/**\n * Find a project using resilient matching\n */\nexport function findProjectResilient(\n context: Context.ContextInstance,\n query: string\n): Project {\n const allProjects = context.getAllProjects();\n return findEntityResilient(allProjects, query, 'Project');\n}\n\n/**\n * Find a person using resilient matching\n */\nexport function findPersonResilient(\n context: Context.ContextInstance,\n query: string\n): Person {\n const allPeople = context.getAllPeople();\n return findEntityResilient(allPeople, query, 'Person');\n}\n\n/**\n * Find a company using resilient matching\n */\nexport function findCompanyResilient(\n context: Context.ContextInstance,\n query: string\n): Company {\n const allCompanies = context.getAllCompanies();\n return findEntityResilient(allCompanies, query, 'Company');\n}\n\n/**\n * Find a term using resilient matching\n */\nexport function findTermResilient(\n context: Context.ContextInstance,\n query: string\n): Term {\n const allTerms = context.getAllTerms();\n return findEntityResilient(allTerms, query, 'Term');\n}\n\n/**\n * Find an ignored term using resilient matching\n */\nexport function findIgnoredResilient(\n context: Context.ContextInstance,\n query: string\n): IgnoredTerm {\n const allIgnored = context.getAllIgnored();\n return findEntityResilient(allIgnored, query, 'Ignored term');\n}\n"],"names":[],"mappings":"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"}
|
package/dist/index16.js
ADDED
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
import os__default from 'node:os';
|
|
2
|
+
|
|
3
|
+
const PROGRAM_NAME = "protokoll";
|
|
4
|
+
const DEFAULT_CHARACTER_ENCODING = "utf-8";
|
|
5
|
+
const DEFAULT_BINARY_TO_TEXT_ENCODING = "base64";
|
|
6
|
+
const DEFAULT_DIFF = true;
|
|
7
|
+
const DEFAULT_LOG = false;
|
|
8
|
+
const DEFAULT_TIMEZONE = "Etc/UTC";
|
|
9
|
+
const DATE_FORMAT_MONTH_DAY = "M-D";
|
|
10
|
+
const DATE_FORMAT_YEAR = "YYYY";
|
|
11
|
+
const DATE_FORMAT_YEAR_MONTH = "YYYY-M";
|
|
12
|
+
const DATE_FORMAT_YEAR_MONTH_DAY = "YYYY-M-D";
|
|
13
|
+
const DATE_FORMAT_YEAR_MONTH_DAY_SLASH = "YYYY/M/D";
|
|
14
|
+
const DATE_FORMAT_YEAR_MONTH_DAY_HOURS_MINUTES = "YYYY-M-D-HHmm";
|
|
15
|
+
const DATE_FORMAT_YEAR_MONTH_DAY_HOURS_MINUTES_SECONDS = "YYYY-M-D-HHmmss";
|
|
16
|
+
const DATE_FORMAT_YEAR_MONTH_DAY_HOURS_MINUTES_SECONDS_MILLISECONDS = "YYYY-M-D-HHmmss.SSS";
|
|
17
|
+
const DATE_FORMAT_MONTH = "M";
|
|
18
|
+
const DATE_FORMAT_DAY = "D";
|
|
19
|
+
const DATE_FORMAT_HOURS = "HHmm";
|
|
20
|
+
const DATE_FORMAT_MINUTES = "mm";
|
|
21
|
+
const DATE_FORMAT_SECONDS = "ss";
|
|
22
|
+
const DATE_FORMAT_MILLISECONDS = "SSS";
|
|
23
|
+
const DEFAULT_VERBOSE = false;
|
|
24
|
+
const DEFAULT_DRY_RUN = false;
|
|
25
|
+
const DEFAULT_DEBUG = false;
|
|
26
|
+
const DEFAULT_CONTENT_TYPES = ["diff"];
|
|
27
|
+
const DEFAULT_RECURSIVE = false;
|
|
28
|
+
const DEFAULT_INPUT_DIRECTORY = "./";
|
|
29
|
+
const DEFAULT_OUTPUT_DIRECTORY = "./";
|
|
30
|
+
const DEFAULT_AUDIO_EXTENSIONS = ["mp3", "mp4", "mpeg", "mpga", "m4a", "wav", "webm", "qta"];
|
|
31
|
+
const ALLOWED_CONTENT_TYPES = ["log", "diff"];
|
|
32
|
+
const ALLOWED_AUDIO_EXTENSIONS = ["mp3", "mp4", "mpeg", "mpga", "m4a", "wav", "webm", "qta"];
|
|
33
|
+
const DEFAULT_OUTPUT_STRUCTURE = "month";
|
|
34
|
+
const DEFAULT_OUTPUT_FILENAME_OPTIONS = ["date", "time", "subject"];
|
|
35
|
+
const ALLOWED_OUTPUT_STRUCTURES = ["none", "year", "month", "day"];
|
|
36
|
+
const ALLOWED_OUTPUT_FILENAME_OPTIONS = ["date", "time", "subject"];
|
|
37
|
+
const DEFAULT_CONFIG_DIR = `./.${PROGRAM_NAME}`;
|
|
38
|
+
const DEFAULT_PROCESSED_DIR = "./processed";
|
|
39
|
+
const DEFAULT_CONTEXT_DIR_NAME = ".protokoll";
|
|
40
|
+
const DEFAULT_CONTEXT_NAMESPACE = "redaksjon";
|
|
41
|
+
const DEFAULT_CONTEXT_CONFIG_FILE_NAME = "config.yaml";
|
|
42
|
+
const DEFAULT_MAX_DISCOVERY_LEVELS = 10;
|
|
43
|
+
const CONTEXT_SUBDIRECTORIES = {
|
|
44
|
+
people: "people",
|
|
45
|
+
projects: "projects",
|
|
46
|
+
companies: "companies",
|
|
47
|
+
terms: "terms"
|
|
48
|
+
};
|
|
49
|
+
const DEFAULT_PERSONAS_DIR = `/personas`;
|
|
50
|
+
const DEFAULT_PERSONA_TRANSCRIBER_FILE = `${DEFAULT_PERSONAS_DIR}/transcriber.md`;
|
|
51
|
+
const DEFAULT_INSTRUCTIONS_DIR = `/instructions`;
|
|
52
|
+
const DEFAULT_INSTRUCTIONS_TRANSCRIBE_FILE = `${DEFAULT_INSTRUCTIONS_DIR}/transcribe.md`;
|
|
53
|
+
const DEFAULT_TRANSCRIPTION_MODEL = "whisper-1";
|
|
54
|
+
const DEFAULT_MODEL = "gpt-5.2";
|
|
55
|
+
const DEFAULT_REASONING_LEVEL = "medium";
|
|
56
|
+
const DEFAULT_PHONETIC_MODEL = "gpt-5-nano";
|
|
57
|
+
const DEFAULT_ANALYSIS_MODEL = "gpt-5-mini";
|
|
58
|
+
const DEFAULT_SMART_ASSISTANCE = true;
|
|
59
|
+
const DEFAULT_SOUNDS_LIKE_ON_ADD = true;
|
|
60
|
+
const DEFAULT_TRIGGER_PHRASES_ON_ADD = true;
|
|
61
|
+
const DEFAULT_PROMPT_FOR_SOURCE = true;
|
|
62
|
+
const DEFAULT_TERMS_ENABLED = true;
|
|
63
|
+
const DEFAULT_TERM_SOUNDS_LIKE_ON_ADD = true;
|
|
64
|
+
const DEFAULT_TERM_DESCRIPTION_ON_ADD = true;
|
|
65
|
+
const DEFAULT_TERM_TOPICS_ON_ADD = true;
|
|
66
|
+
const DEFAULT_TERM_PROJECT_SUGGESTIONS = true;
|
|
67
|
+
const MAX_CONTENT_LENGTH = 15e3;
|
|
68
|
+
const MAX_TERM_CONTEXT_LENGTH = 1e4;
|
|
69
|
+
const ASSIST_TIMEOUT_MS = 3e4;
|
|
70
|
+
const TERM_ASSIST_TIMEOUT_MS = 2e4;
|
|
71
|
+
const DEFAULT_OVERRIDES = false;
|
|
72
|
+
const DEFAULT_MAX_AUDIO_SIZE = 26214400;
|
|
73
|
+
const DEFAULT_TEMP_DIRECTORY = os__default.tmpdir();
|
|
74
|
+
const DEFAULT_INTERACTIVE = true;
|
|
75
|
+
const DEFAULT_SELF_REFLECTION = true;
|
|
76
|
+
const DEFAULT_SILENT = false;
|
|
77
|
+
const DEFAULT_INTERMEDIATE_DIRECTORY = "./output/protokoll";
|
|
78
|
+
const DEFAULT_KEEP_INTERMEDIATES = true;
|
|
79
|
+
const OUTPUT_FILE_TYPES = [
|
|
80
|
+
"transcript",
|
|
81
|
+
"context",
|
|
82
|
+
"request",
|
|
83
|
+
"response",
|
|
84
|
+
"reflection",
|
|
85
|
+
"session"
|
|
86
|
+
];
|
|
87
|
+
const PROTOKOLL_DEFAULTS = {
|
|
88
|
+
dryRun: DEFAULT_DRY_RUN,
|
|
89
|
+
verbose: DEFAULT_VERBOSE,
|
|
90
|
+
debug: DEFAULT_DEBUG,
|
|
91
|
+
diff: DEFAULT_DIFF,
|
|
92
|
+
log: DEFAULT_LOG,
|
|
93
|
+
transcriptionModel: DEFAULT_TRANSCRIPTION_MODEL,
|
|
94
|
+
model: DEFAULT_MODEL,
|
|
95
|
+
reasoningLevel: DEFAULT_REASONING_LEVEL,
|
|
96
|
+
contentTypes: DEFAULT_CONTENT_TYPES,
|
|
97
|
+
overrides: DEFAULT_OVERRIDES,
|
|
98
|
+
maxAudioSize: DEFAULT_MAX_AUDIO_SIZE,
|
|
99
|
+
tempDirectory: DEFAULT_TEMP_DIRECTORY || os__default.tmpdir(),
|
|
100
|
+
configDirectory: DEFAULT_CONFIG_DIR,
|
|
101
|
+
interactive: DEFAULT_INTERACTIVE,
|
|
102
|
+
selfReflection: DEFAULT_SELF_REFLECTION,
|
|
103
|
+
silent: DEFAULT_SILENT
|
|
104
|
+
};
|
|
105
|
+
|
|
106
|
+
export { ALLOWED_AUDIO_EXTENSIONS, ALLOWED_CONTENT_TYPES, ALLOWED_OUTPUT_FILENAME_OPTIONS, ALLOWED_OUTPUT_STRUCTURES, ASSIST_TIMEOUT_MS, CONTEXT_SUBDIRECTORIES, DATE_FORMAT_DAY, DATE_FORMAT_HOURS, DATE_FORMAT_MILLISECONDS, DATE_FORMAT_MINUTES, DATE_FORMAT_MONTH, DATE_FORMAT_MONTH_DAY, DATE_FORMAT_SECONDS, DATE_FORMAT_YEAR, DATE_FORMAT_YEAR_MONTH, DATE_FORMAT_YEAR_MONTH_DAY, DATE_FORMAT_YEAR_MONTH_DAY_HOURS_MINUTES, DATE_FORMAT_YEAR_MONTH_DAY_HOURS_MINUTES_SECONDS, DATE_FORMAT_YEAR_MONTH_DAY_HOURS_MINUTES_SECONDS_MILLISECONDS, DATE_FORMAT_YEAR_MONTH_DAY_SLASH, DEFAULT_ANALYSIS_MODEL, DEFAULT_AUDIO_EXTENSIONS, DEFAULT_BINARY_TO_TEXT_ENCODING, DEFAULT_CHARACTER_ENCODING, DEFAULT_CONFIG_DIR, DEFAULT_CONTENT_TYPES, DEFAULT_CONTEXT_CONFIG_FILE_NAME, DEFAULT_CONTEXT_DIR_NAME, DEFAULT_CONTEXT_NAMESPACE, DEFAULT_DEBUG, DEFAULT_DIFF, DEFAULT_DRY_RUN, DEFAULT_INPUT_DIRECTORY, DEFAULT_INSTRUCTIONS_DIR, DEFAULT_INSTRUCTIONS_TRANSCRIBE_FILE, DEFAULT_INTERACTIVE, DEFAULT_INTERMEDIATE_DIRECTORY, DEFAULT_KEEP_INTERMEDIATES, DEFAULT_LOG, DEFAULT_MAX_AUDIO_SIZE, DEFAULT_MAX_DISCOVERY_LEVELS, DEFAULT_MODEL, DEFAULT_OUTPUT_DIRECTORY, DEFAULT_OUTPUT_FILENAME_OPTIONS, DEFAULT_OUTPUT_STRUCTURE, DEFAULT_OVERRIDES, DEFAULT_PERSONAS_DIR, DEFAULT_PERSONA_TRANSCRIBER_FILE, DEFAULT_PHONETIC_MODEL, DEFAULT_PROCESSED_DIR, DEFAULT_PROMPT_FOR_SOURCE, DEFAULT_REASONING_LEVEL, DEFAULT_RECURSIVE, DEFAULT_SELF_REFLECTION, DEFAULT_SILENT, DEFAULT_SMART_ASSISTANCE, DEFAULT_SOUNDS_LIKE_ON_ADD, DEFAULT_TEMP_DIRECTORY, DEFAULT_TERMS_ENABLED, DEFAULT_TERM_DESCRIPTION_ON_ADD, DEFAULT_TERM_PROJECT_SUGGESTIONS, DEFAULT_TERM_SOUNDS_LIKE_ON_ADD, DEFAULT_TERM_TOPICS_ON_ADD, DEFAULT_TIMEZONE, DEFAULT_TRANSCRIPTION_MODEL, DEFAULT_TRIGGER_PHRASES_ON_ADD, DEFAULT_VERBOSE, MAX_CONTENT_LENGTH, MAX_TERM_CONTEXT_LENGTH, OUTPUT_FILE_TYPES, PROGRAM_NAME, PROTOKOLL_DEFAULTS, TERM_ASSIST_TIMEOUT_MS };
|
|
107
|
+
//# sourceMappingURL=index16.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index16.js","sources":["../src/constants.ts"],"sourcesContent":["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"],"names":["os"],"mappings":"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"}
|
package/dist/index17.js
ADDED
|
@@ -0,0 +1,185 @@
|
|
|
1
|
+
import OpenAI from 'openai';
|
|
2
|
+
import { getLogger } from './index41.js';
|
|
3
|
+
|
|
4
|
+
const create = (config) => {
|
|
5
|
+
const logger = getLogger();
|
|
6
|
+
let client = null;
|
|
7
|
+
const getClient = () => {
|
|
8
|
+
if (!client) {
|
|
9
|
+
client = new OpenAI({ apiKey: config.apiKey });
|
|
10
|
+
}
|
|
11
|
+
return client;
|
|
12
|
+
};
|
|
13
|
+
const getModelFamily = (model) => {
|
|
14
|
+
if (model.startsWith("gpt") || model.startsWith("o1") || model.startsWith("o3")) return "openai";
|
|
15
|
+
if (model.startsWith("claude")) return "anthropic";
|
|
16
|
+
if (model.startsWith("gemini")) return "gemini";
|
|
17
|
+
return "unknown";
|
|
18
|
+
};
|
|
19
|
+
const isReasoningModel = (model) => {
|
|
20
|
+
const reasoningModels = [
|
|
21
|
+
"gpt-4o",
|
|
22
|
+
"gpt-4-turbo",
|
|
23
|
+
"gpt-5",
|
|
24
|
+
"gpt-5-mini",
|
|
25
|
+
"gpt-5.1",
|
|
26
|
+
"gpt-5.2",
|
|
27
|
+
"o1",
|
|
28
|
+
"o1-mini",
|
|
29
|
+
"o1-preview",
|
|
30
|
+
"o3",
|
|
31
|
+
"o3-mini",
|
|
32
|
+
"claude-3-5-sonnet",
|
|
33
|
+
"claude-3-opus",
|
|
34
|
+
"claude-4"
|
|
35
|
+
];
|
|
36
|
+
return reasoningModels.some((rm) => model.includes(rm));
|
|
37
|
+
};
|
|
38
|
+
const supportsReasoningLevel = (model) => {
|
|
39
|
+
const models = ["gpt-5.1", "gpt-5.2", "o1", "o1-mini", "o3", "o3-mini"];
|
|
40
|
+
return models.some((m) => model.includes(m));
|
|
41
|
+
};
|
|
42
|
+
const complete = async (request) => {
|
|
43
|
+
const startTime = Date.now();
|
|
44
|
+
logger.debug("Reasoning request starting", { model: config.model });
|
|
45
|
+
try {
|
|
46
|
+
const messages = [];
|
|
47
|
+
if (request.systemPrompt) {
|
|
48
|
+
messages.push({ role: "system", content: request.systemPrompt });
|
|
49
|
+
}
|
|
50
|
+
messages.push({ role: "user", content: request.prompt });
|
|
51
|
+
const tools = request.tools?.map((tool) => ({
|
|
52
|
+
type: "function",
|
|
53
|
+
function: {
|
|
54
|
+
name: tool.name,
|
|
55
|
+
description: tool.description,
|
|
56
|
+
parameters: tool.parameters
|
|
57
|
+
}
|
|
58
|
+
}));
|
|
59
|
+
const requestOptions = {
|
|
60
|
+
model: config.model,
|
|
61
|
+
messages,
|
|
62
|
+
tools: tools && tools.length > 0 ? tools : void 0,
|
|
63
|
+
tool_choice: tools && tools.length > 0 ? "auto" : void 0
|
|
64
|
+
};
|
|
65
|
+
if (supportsReasoningLevel(config.model)) {
|
|
66
|
+
const reasoningLevel = config.reasoningLevel || "medium";
|
|
67
|
+
requestOptions.reasoning_effort = reasoningLevel;
|
|
68
|
+
logger.debug("Using reasoning_effort: %s for model %s", reasoningLevel, config.model);
|
|
69
|
+
}
|
|
70
|
+
const response = await getClient().chat.completions.create(
|
|
71
|
+
requestOptions
|
|
72
|
+
);
|
|
73
|
+
const duration = Date.now() - startTime;
|
|
74
|
+
logger.debug("Reasoning model responded in %dms", duration);
|
|
75
|
+
const choice = response.choices[0];
|
|
76
|
+
const message = choice.message;
|
|
77
|
+
const usage = response.usage ? {
|
|
78
|
+
promptTokens: response.usage.prompt_tokens,
|
|
79
|
+
completionTokens: response.usage.completion_tokens,
|
|
80
|
+
totalTokens: response.usage.total_tokens
|
|
81
|
+
} : void 0;
|
|
82
|
+
const toolCalls = message.tool_calls?.map((tc) => {
|
|
83
|
+
const fn = "function" in tc ? tc.function : null;
|
|
84
|
+
if (!fn) {
|
|
85
|
+
return { id: tc.id, name: "unknown", arguments: {} };
|
|
86
|
+
}
|
|
87
|
+
return {
|
|
88
|
+
id: tc.id,
|
|
89
|
+
name: fn.name,
|
|
90
|
+
arguments: JSON.parse(fn.arguments)
|
|
91
|
+
};
|
|
92
|
+
});
|
|
93
|
+
if (toolCalls && toolCalls.length > 0) {
|
|
94
|
+
logger.debug("Model requested %d tool calls: %s", toolCalls.length, toolCalls.map((t) => t.name).join(", "));
|
|
95
|
+
}
|
|
96
|
+
return {
|
|
97
|
+
content: message.content || "",
|
|
98
|
+
model: config.model,
|
|
99
|
+
duration,
|
|
100
|
+
usage,
|
|
101
|
+
toolCalls,
|
|
102
|
+
finishReason: choice.finish_reason
|
|
103
|
+
};
|
|
104
|
+
} catch (error) {
|
|
105
|
+
logger.error("Reasoning request failed", { error });
|
|
106
|
+
throw error;
|
|
107
|
+
}
|
|
108
|
+
};
|
|
109
|
+
const completeWithTools = async (request) => {
|
|
110
|
+
logger.debug("Tool call request starting", { model: config.model, messageCount: request.messages.length });
|
|
111
|
+
try {
|
|
112
|
+
const messages = request.messages.map((msg) => {
|
|
113
|
+
if (msg.role === "tool") {
|
|
114
|
+
return {
|
|
115
|
+
role: "tool",
|
|
116
|
+
content: msg.content,
|
|
117
|
+
tool_call_id: msg.tool_call_id || ""
|
|
118
|
+
};
|
|
119
|
+
}
|
|
120
|
+
if (msg.role === "assistant" && msg.tool_calls) {
|
|
121
|
+
return {
|
|
122
|
+
role: "assistant",
|
|
123
|
+
content: msg.content || null,
|
|
124
|
+
tool_calls: msg.tool_calls.map((tc) => ({
|
|
125
|
+
id: tc.id,
|
|
126
|
+
type: "function",
|
|
127
|
+
function: tc.function
|
|
128
|
+
}))
|
|
129
|
+
};
|
|
130
|
+
}
|
|
131
|
+
return {
|
|
132
|
+
role: msg.role,
|
|
133
|
+
content: msg.content
|
|
134
|
+
};
|
|
135
|
+
});
|
|
136
|
+
const requestOptions = {
|
|
137
|
+
model: config.model,
|
|
138
|
+
messages,
|
|
139
|
+
tools: request.tools,
|
|
140
|
+
tool_choice: request.tools && request.tools.length > 0 ? "auto" : void 0
|
|
141
|
+
};
|
|
142
|
+
if (supportsReasoningLevel(config.model)) {
|
|
143
|
+
requestOptions.reasoning_effort = config.reasoningLevel || "medium";
|
|
144
|
+
}
|
|
145
|
+
const response = await getClient().chat.completions.create(
|
|
146
|
+
requestOptions
|
|
147
|
+
);
|
|
148
|
+
const choice = response.choices[0];
|
|
149
|
+
const message = choice.message;
|
|
150
|
+
const toolCalls = message.tool_calls?.map((tc) => {
|
|
151
|
+
const fn = "function" in tc ? tc.function : null;
|
|
152
|
+
if (!fn) {
|
|
153
|
+
return { id: tc.id, function: { name: "unknown", arguments: "{}" } };
|
|
154
|
+
}
|
|
155
|
+
return {
|
|
156
|
+
id: tc.id,
|
|
157
|
+
function: {
|
|
158
|
+
name: fn.name,
|
|
159
|
+
arguments: fn.arguments
|
|
160
|
+
}
|
|
161
|
+
};
|
|
162
|
+
});
|
|
163
|
+
if (toolCalls && toolCalls.length > 0) {
|
|
164
|
+
logger.debug("Model requested %d tool calls: %s", toolCalls.length, toolCalls.map((t) => t.function.name).join(", "));
|
|
165
|
+
}
|
|
166
|
+
return {
|
|
167
|
+
content: message.content || "",
|
|
168
|
+
tool_calls: toolCalls,
|
|
169
|
+
finish_reason: choice.finish_reason
|
|
170
|
+
};
|
|
171
|
+
} catch (error) {
|
|
172
|
+
logger.error("Tool call request failed", { error });
|
|
173
|
+
throw error;
|
|
174
|
+
}
|
|
175
|
+
};
|
|
176
|
+
return {
|
|
177
|
+
complete,
|
|
178
|
+
completeWithTools,
|
|
179
|
+
isReasoningModel,
|
|
180
|
+
getModelFamily
|
|
181
|
+
};
|
|
182
|
+
};
|
|
183
|
+
|
|
184
|
+
export { create };
|
|
185
|
+
//# sourceMappingURL=index17.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index17.js","sources":["../src/reasoning/client.ts"],"sourcesContent":["/**\n * Reasoning Client\n * \n * Wrapper for reasoning model calls with tool/function calling support.\n * Uses OpenAI's native function calling for agentic workflows.\n */\n\nimport OpenAI from 'openai';\nimport { ReasoningConfig, ReasoningRequest, ReasoningResponse, ToolCall } from './types';\nimport * as Logging from '../logging';\n\nexport interface ToolCallRequest {\n messages: Array<{\n role: 'system' | 'user' | 'assistant' | 'tool';\n content: string;\n tool_call_id?: string;\n tool_calls?: Array<{ id: string; function: { name: string; arguments: string } }>;\n }>;\n tools?: Array<{\n type: 'function';\n function: {\n name: string;\n description: string;\n parameters: Record<string, unknown>;\n };\n }>;\n}\n\nexport interface ToolCallResponse {\n content: string;\n tool_calls?: Array<{\n id: string;\n function: {\n name: string;\n arguments: string;\n };\n }>;\n finish_reason?: string;\n}\n\nexport interface ClientInstance {\n complete(request: ReasoningRequest): Promise<ReasoningResponse>;\n completeWithTools(request: ToolCallRequest): Promise<ToolCallResponse>;\n isReasoningModel(model: string): boolean;\n getModelFamily(model: string): 'openai' | 'anthropic' | 'gemini' | 'unknown';\n}\n\nexport const create = (config: ReasoningConfig): ClientInstance => {\n const logger = Logging.getLogger();\n \n // Lazy-initialize OpenAI client (only when actually needed)\n let client: OpenAI | null = null;\n const getClient = (): OpenAI => {\n if (!client) {\n client = new OpenAI({ apiKey: config.apiKey });\n }\n return client;\n };\n \n const getModelFamily = (model: string): 'openai' | 'anthropic' | 'gemini' | 'unknown' => {\n if (model.startsWith('gpt') || model.startsWith('o1') || model.startsWith('o3')) return 'openai';\n if (model.startsWith('claude')) return 'anthropic';\n if (model.startsWith('gemini')) return 'gemini';\n return 'unknown';\n };\n \n const isReasoningModel = (model: string): boolean => {\n // Models known for strong reasoning\n const reasoningModels = [\n 'gpt-4o', 'gpt-4-turbo', 'gpt-5', 'gpt-5-mini', 'gpt-5.1', 'gpt-5.2',\n 'o1', 'o1-mini', 'o1-preview', 'o3', 'o3-mini',\n 'claude-3-5-sonnet', 'claude-3-opus', 'claude-4',\n ];\n return reasoningModels.some(rm => model.includes(rm));\n };\n \n const supportsReasoningLevel = (model: string): boolean => {\n // Models that support reasoning_effort parameter\n const models = ['gpt-5.1', 'gpt-5.2', 'o1', 'o1-mini', 'o3', 'o3-mini'];\n return models.some(m => model.includes(m));\n };\n \n const complete = async (request: ReasoningRequest): Promise<ReasoningResponse> => {\n const startTime = Date.now();\n logger.debug('Reasoning request starting', { model: config.model });\n \n try {\n // Build messages for OpenAI\n const messages: Array<OpenAI.Chat.ChatCompletionMessageParam> = [];\n \n if (request.systemPrompt) {\n messages.push({ role: 'system', content: request.systemPrompt });\n }\n \n // Add the main prompt\n messages.push({ role: 'user', content: request.prompt });\n \n // Build tools if provided\n const tools: OpenAI.Chat.ChatCompletionTool[] | undefined = request.tools?.map(tool => ({\n type: 'function' as const,\n function: {\n name: tool.name,\n description: tool.description,\n parameters: tool.parameters,\n },\n }));\n \n // Build request options\n const requestOptions: Record<string, unknown> = {\n model: config.model,\n messages,\n tools: tools && tools.length > 0 ? tools : undefined,\n tool_choice: tools && tools.length > 0 ? 'auto' : undefined,\n };\n \n // Add reasoning_effort for models that support it (default to 'medium')\n if (supportsReasoningLevel(config.model)) {\n const reasoningLevel = config.reasoningLevel || 'medium';\n requestOptions.reasoning_effort = reasoningLevel;\n logger.debug('Using reasoning_effort: %s for model %s', reasoningLevel, config.model);\n }\n \n const response = await getClient().chat.completions.create(\n requestOptions as unknown as OpenAI.Chat.ChatCompletionCreateParamsNonStreaming\n );\n \n const duration = Date.now() - startTime;\n logger.debug('Reasoning model responded in %dms', duration);\n \n const choice = response.choices[0];\n const message = choice.message;\n \n // Extract token usage\n const usage = response.usage ? {\n promptTokens: response.usage.prompt_tokens,\n completionTokens: response.usage.completion_tokens,\n totalTokens: response.usage.total_tokens,\n } : undefined;\n \n // Extract tool calls if any\n const toolCalls: ToolCall[] | undefined = message.tool_calls?.map(tc => {\n // Handle both standard and custom tool call formats\n const fn = 'function' in tc ? tc.function : null;\n if (!fn) {\n return { id: tc.id, name: 'unknown', arguments: {} };\n }\n return {\n id: tc.id,\n name: fn.name,\n arguments: JSON.parse(fn.arguments),\n };\n });\n \n if (toolCalls && toolCalls.length > 0) {\n logger.debug('Model requested %d tool calls: %s', toolCalls.length, toolCalls.map(t => t.name).join(', '));\n }\n \n return {\n content: message.content || '',\n model: config.model,\n duration,\n usage,\n toolCalls,\n finishReason: choice.finish_reason,\n };\n } catch (error) {\n logger.error('Reasoning request failed', { error });\n throw error;\n }\n };\n \n const completeWithTools = async (request: ToolCallRequest): Promise<ToolCallResponse> => {\n logger.debug('Tool call request starting', { model: config.model, messageCount: request.messages.length });\n \n try {\n // Convert messages to OpenAI format\n const messages: Array<OpenAI.Chat.ChatCompletionMessageParam> = request.messages.map(msg => {\n if (msg.role === 'tool') {\n return {\n role: 'tool' as const,\n content: msg.content,\n tool_call_id: msg.tool_call_id || '',\n };\n }\n if (msg.role === 'assistant' && msg.tool_calls) {\n return {\n role: 'assistant' as const,\n content: msg.content || null,\n tool_calls: msg.tool_calls.map(tc => ({\n id: tc.id,\n type: 'function' as const,\n function: tc.function,\n })),\n };\n }\n return {\n role: msg.role as 'system' | 'user' | 'assistant',\n content: msg.content,\n };\n });\n \n // Build request options\n const requestOptions: Record<string, unknown> = {\n model: config.model,\n messages,\n tools: request.tools,\n tool_choice: request.tools && request.tools.length > 0 ? 'auto' : undefined,\n };\n \n // Add reasoning_effort for models that support it\n if (supportsReasoningLevel(config.model)) {\n requestOptions.reasoning_effort = config.reasoningLevel || 'medium';\n }\n \n const response = await getClient().chat.completions.create(\n requestOptions as unknown as OpenAI.Chat.ChatCompletionCreateParamsNonStreaming\n );\n \n const choice = response.choices[0];\n const message = choice.message;\n \n // Extract tool calls if any\n const toolCalls = message.tool_calls?.map(tc => {\n // Handle both standard and custom tool call formats\n const fn = 'function' in tc ? tc.function : null;\n if (!fn) {\n return { id: tc.id, function: { name: 'unknown', arguments: '{}' } };\n }\n return {\n id: tc.id,\n function: {\n name: fn.name,\n arguments: fn.arguments,\n },\n };\n });\n \n if (toolCalls && toolCalls.length > 0) {\n logger.debug('Model requested %d tool calls: %s', toolCalls.length, toolCalls.map(t => t.function.name).join(', '));\n }\n \n return {\n content: message.content || '',\n tool_calls: toolCalls,\n finish_reason: choice.finish_reason,\n };\n } catch (error) {\n logger.error('Tool call request failed', { error });\n throw error;\n }\n };\n \n return {\n complete,\n completeWithTools,\n isReasoningModel,\n getModelFamily,\n };\n};\n"],"names":["Logging.getLogger"],"mappings":"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"}
|
package/dist/index18.js
ADDED
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
import { IterationStrategyFactory } from '@kjerneverk/riotprompt';
|
|
2
|
+
|
|
3
|
+
const createStrategy = (config) => {
|
|
4
|
+
const maxIterations = config.maxIterations ?? getDefaultIterations(config.type);
|
|
5
|
+
switch (config.type) {
|
|
6
|
+
case "simple":
|
|
7
|
+
return IterationStrategyFactory.simple({
|
|
8
|
+
maxIterations,
|
|
9
|
+
allowTools: false
|
|
10
|
+
});
|
|
11
|
+
case "investigate-then-respond":
|
|
12
|
+
return IterationStrategyFactory.investigateThenRespond({
|
|
13
|
+
maxInvestigationSteps: Math.floor(maxIterations * 0.8),
|
|
14
|
+
requireMinimumTools: config.requireMinimumTools ?? 2,
|
|
15
|
+
finalSynthesis: true
|
|
16
|
+
});
|
|
17
|
+
case "multi-pass":
|
|
18
|
+
return IterationStrategyFactory.multiPassRefinement({
|
|
19
|
+
passes: 3,
|
|
20
|
+
critiqueBetweenPasses: true
|
|
21
|
+
});
|
|
22
|
+
case "adaptive":
|
|
23
|
+
return IterationStrategyFactory.adaptive({});
|
|
24
|
+
default:
|
|
25
|
+
return IterationStrategyFactory.simple({ maxIterations });
|
|
26
|
+
}
|
|
27
|
+
};
|
|
28
|
+
const getDefaultIterations = (type) => {
|
|
29
|
+
switch (type) {
|
|
30
|
+
case "simple":
|
|
31
|
+
return 1;
|
|
32
|
+
case "investigate-then-respond":
|
|
33
|
+
return 15;
|
|
34
|
+
case "multi-pass":
|
|
35
|
+
return 6;
|
|
36
|
+
case "adaptive":
|
|
37
|
+
return 20;
|
|
38
|
+
default:
|
|
39
|
+
return 10;
|
|
40
|
+
}
|
|
41
|
+
};
|
|
42
|
+
const getRecommendedStrategy = (transcriptLength, hasUnknownNames, complexity) => {
|
|
43
|
+
if (transcriptLength < 500 && !hasUnknownNames && complexity === "low") {
|
|
44
|
+
return "simple";
|
|
45
|
+
}
|
|
46
|
+
if (hasUnknownNames || complexity === "high") {
|
|
47
|
+
return "investigate-then-respond";
|
|
48
|
+
}
|
|
49
|
+
return "adaptive";
|
|
50
|
+
};
|
|
51
|
+
|
|
52
|
+
export { createStrategy, getRecommendedStrategy };
|
|
53
|
+
//# sourceMappingURL=index18.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index18.js","sources":["../src/reasoning/strategy.ts"],"sourcesContent":["/**\n * Reasoning Strategy\n * \n * Strategy factory for different transcription processing approaches.\n * Uses riotprompt's IterationStrategyFactory for complex workflows.\n */\n\nimport { IterationStrategy, IterationStrategyFactory } from '@kjerneverk/riotprompt';\nimport { ReasoningLevel } from './types';\n\nexport type TranscriptionStrategy = \n | 'simple' // Basic completion\n | 'investigate-then-respond' // Use tools to gather info, then respond\n | 'multi-pass' // Multiple refinement passes\n | 'adaptive'; // Changes based on complexity\n\nexport interface StrategyConfig {\n type: TranscriptionStrategy;\n maxIterations?: number;\n requireMinimumTools?: number;\n reasoningLevel?: ReasoningLevel;\n}\n\nexport const createStrategy = (config: StrategyConfig): IterationStrategy => {\n const maxIterations = config.maxIterations ?? getDefaultIterations(config.type);\n \n switch (config.type) {\n case 'simple':\n return IterationStrategyFactory.simple({\n maxIterations,\n allowTools: false,\n });\n \n case 'investigate-then-respond':\n return IterationStrategyFactory.investigateThenRespond({\n maxInvestigationSteps: Math.floor(maxIterations * 0.8),\n requireMinimumTools: config.requireMinimumTools ?? 2,\n finalSynthesis: true,\n });\n \n case 'multi-pass':\n return IterationStrategyFactory.multiPassRefinement({\n passes: 3,\n critiqueBetweenPasses: true,\n });\n \n case 'adaptive':\n return IterationStrategyFactory.adaptive({});\n \n default:\n return IterationStrategyFactory.simple({ maxIterations });\n }\n};\n\nconst getDefaultIterations = (type: TranscriptionStrategy): number => {\n switch (type) {\n case 'simple': return 1;\n case 'investigate-then-respond': return 15;\n case 'multi-pass': return 6;\n case 'adaptive': return 20;\n default: return 10;\n }\n};\n\nexport const getRecommendedStrategy = (\n transcriptLength: number,\n hasUnknownNames: boolean,\n complexity: 'low' | 'medium' | 'high'\n): TranscriptionStrategy => {\n // Short, simple transcripts\n if (transcriptLength < 500 && !hasUnknownNames && complexity === 'low') {\n return 'simple';\n }\n \n // Complex or with unknowns - need investigation\n if (hasUnknownNames || complexity === 'high') {\n return 'investigate-then-respond';\n }\n \n // Medium complexity - adaptive is good\n return 'adaptive';\n};\n\n"],"names":[],"mappings":";;AAuBO,MAAM,cAAA,GAAiB,CAAC,MAAA,KAA8C;AACzE,EAAA,MAAM,aAAA,GAAgB,MAAA,CAAO,aAAA,IAAiB,oBAAA,CAAqB,OAAO,IAAI,CAAA;AAE9E,EAAA,QAAQ,OAAO,IAAA;AAAM,IACjB,KAAK,QAAA;AACD,MAAA,OAAO,yBAAyB,MAAA,CAAO;AAAA,QACnC,aAAA;AAAA,QACA,UAAA,EAAY;AAAA,OACf,CAAA;AAAA,IAEL,KAAK,0BAAA;AACD,MAAA,OAAO,yBAAyB,sBAAA,CAAuB;AAAA,QACnD,qBAAA,EAAuB,IAAA,CAAK,KAAA,CAAM,aAAA,GAAgB,GAAG,CAAA;AAAA,QACrD,mBAAA,EAAqB,OAAO,mBAAA,IAAuB,CAAA;AAAA,QACnD,cAAA,EAAgB;AAAA,OACnB,CAAA;AAAA,IAEL,KAAK,YAAA;AACD,MAAA,OAAO,yBAAyB,mBAAA,CAAoB;AAAA,QAChD,MAAA,EAAQ,CAAA;AAAA,QACR,qBAAA,EAAuB;AAAA,OAC1B,CAAA;AAAA,IAEL,KAAK,UAAA;AACD,MAAA,OAAO,wBAAA,CAAyB,QAAA,CAAS,EAAE,CAAA;AAAA,IAE/C;AACI,MAAA,OAAO,wBAAA,CAAyB,MAAA,CAAO,EAAE,aAAA,EAAe,CAAA;AAAA;AAEpE;AAEA,MAAM,oBAAA,GAAuB,CAAC,IAAA,KAAwC;AAClE,EAAA,QAAQ,IAAA;AAAM,IACV,KAAK,QAAA;AAAU,MAAA,OAAO,CAAA;AAAA,IACtB,KAAK,0BAAA;AAA4B,MAAA,OAAO,EAAA;AAAA,IACxC,KAAK,YAAA;AAAc,MAAA,OAAO,CAAA;AAAA,IAC1B,KAAK,UAAA;AAAY,MAAA,OAAO,EAAA;AAAA,IACxB;AAAS,MAAA,OAAO,EAAA;AAAA;AAExB,CAAA;AAEO,MAAM,sBAAA,GAAyB,CAClC,gBAAA,EACA,eAAA,EACA,UAAA,KACwB;AAExB,EAAA,IAAI,gBAAA,GAAmB,GAAA,IAAO,CAAC,eAAA,IAAmB,eAAe,KAAA,EAAO;AACpE,IAAA,OAAO,QAAA;AAAA,EACX;AAGA,EAAA,IAAI,eAAA,IAAmB,eAAe,MAAA,EAAQ;AAC1C,IAAA,OAAO,0BAAA;AAAA,EACX;AAGA,EAAA,OAAO,UAAA;AACX;;;;"}
|
package/dist/index19.js
ADDED
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
const REASONING_MODELS = {
|
|
2
|
+
"claude-3-5-sonnet": { maxTokens: 4096, supportsTools: true },
|
|
3
|
+
"claude-3-opus": { maxTokens: 4096, supportsTools: true },
|
|
4
|
+
"claude-4": { maxTokens: 8192, supportsTools: true },
|
|
5
|
+
"gpt-4o": { maxTokens: 4096, supportsTools: true },
|
|
6
|
+
"gpt-4o-mini": { maxTokens: 4096, supportsTools: true },
|
|
7
|
+
"gpt-5": { maxTokens: 8192, supportsTools: true },
|
|
8
|
+
"gpt-5-nano": { maxTokens: 2048, supportsTools: true },
|
|
9
|
+
"gpt-5-mini": { maxTokens: 4096, supportsTools: true },
|
|
10
|
+
"gpt-5.1": { maxTokens: 16384, supportsTools: true, reasoningLevel: true },
|
|
11
|
+
"gpt-5.2": { maxTokens: 32768, supportsTools: true, reasoningLevel: true },
|
|
12
|
+
"o1": { maxTokens: 65536, supportsTools: false, reasoningLevel: true },
|
|
13
|
+
"o1-mini": { maxTokens: 65536, supportsTools: false, reasoningLevel: true },
|
|
14
|
+
"o3": { maxTokens: 1e5, supportsTools: true, reasoningLevel: true },
|
|
15
|
+
"o3-mini": { maxTokens: 65536, supportsTools: true, reasoningLevel: true }
|
|
16
|
+
};
|
|
17
|
+
|
|
18
|
+
export { REASONING_MODELS };
|
|
19
|
+
//# sourceMappingURL=index19.js.map
|