@redaksjon/protokoll 0.0.11 → 0.0.13
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.cursor/rules/definition-of-done.md +1 -0
- package/.cursor/rules/no-emoticons.md +26 -12
- package/README.md +483 -69
- package/dist/agentic/executor.js +473 -41
- package/dist/agentic/executor.js.map +1 -1
- package/dist/agentic/index.js.map +1 -1
- package/dist/agentic/tools/lookup-person.js +123 -4
- package/dist/agentic/tools/lookup-person.js.map +1 -1
- package/dist/agentic/tools/lookup-project.js +139 -22
- package/dist/agentic/tools/lookup-project.js.map +1 -1
- package/dist/agentic/tools/route-note.js +5 -1
- package/dist/agentic/tools/route-note.js.map +1 -1
- package/dist/arguments.js +6 -3
- package/dist/arguments.js.map +1 -1
- package/dist/cli/action.js +704 -0
- package/dist/cli/action.js.map +1 -0
- package/dist/cli/config.js +482 -0
- package/dist/cli/config.js.map +1 -0
- package/dist/cli/context.js +466 -0
- package/dist/cli/context.js.map +1 -0
- package/dist/cli/feedback.js +858 -0
- package/dist/cli/feedback.js.map +1 -0
- package/dist/cli/index.js +103 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/cli/install.js +572 -0
- package/dist/cli/install.js.map +1 -0
- package/dist/cli/transcript.js +199 -0
- package/dist/cli/transcript.js.map +1 -0
- package/dist/constants.js +12 -5
- package/dist/constants.js.map +1 -1
- package/dist/context/discovery.js +1 -1
- package/dist/context/discovery.js.map +1 -1
- package/dist/context/index.js +25 -1
- package/dist/context/index.js.map +1 -1
- package/dist/context/storage.js +57 -4
- package/dist/context/storage.js.map +1 -1
- package/dist/interactive/handler.js +310 -9
- package/dist/interactive/handler.js.map +1 -1
- package/dist/main.js +11 -1
- package/dist/main.js.map +1 -1
- package/dist/output/index.js.map +1 -1
- package/dist/output/manager.js +47 -2
- package/dist/output/manager.js.map +1 -1
- package/dist/phases/complete.js +38 -3
- package/dist/phases/complete.js.map +1 -1
- package/dist/phases/locate.js +1 -1
- package/dist/phases/locate.js.map +1 -1
- package/dist/pipeline/orchestrator.js +104 -31
- package/dist/pipeline/orchestrator.js.map +1 -1
- package/dist/protokoll.js +68 -2
- package/dist/protokoll.js.map +1 -1
- package/dist/reasoning/client.js +83 -0
- package/dist/reasoning/client.js.map +1 -1
- package/dist/reasoning/index.js +1 -0
- package/dist/reasoning/index.js.map +1 -1
- package/dist/routing/router.js +2 -2
- package/dist/routing/router.js.map +1 -1
- package/dist/util/media.js +1 -1
- package/dist/util/media.js.map +1 -1
- package/dist/util/metadata.js.map +1 -1
- package/dist/util/sound.js +116 -0
- package/dist/util/sound.js.map +1 -0
- package/dist/util/storage.js +3 -3
- package/dist/util/storage.js.map +1 -1
- package/docs/duplicate-question-prevention.md +117 -0
- package/docs/examples.md +152 -0
- package/docs/interactive-context-example.md +92 -0
- package/docs/package-lock.json +6 -0
- package/docs/package.json +3 -1
- package/eslint.config.mjs +1 -1
- package/guide/action.md +375 -0
- package/guide/config.md +207 -0
- package/guide/configuration.md +82 -67
- package/guide/context-commands.md +574 -0
- package/guide/context-system.md +20 -7
- package/guide/development.md +106 -4
- package/guide/feedback.md +335 -0
- package/guide/index.md +100 -4
- package/guide/interactive.md +15 -14
- package/guide/quickstart.md +21 -7
- package/guide/reasoning.md +18 -4
- package/guide/routing.md +192 -97
- package/package.json +2 -3
- package/scripts/copy-assets.mjs +47 -0
- package/scripts/coverage-priority.mjs +323 -0
- package/tsconfig.tsbuildinfo +1 -1
- package/vite.config.ts +6 -13
- package/vitest.config.ts +5 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"feedback.js","sources":["../../src/cli/feedback.ts"],"sourcesContent":["/**\n * Feedback CLI\n * \n * Provides an intelligent feedback system that uses an agentic model to:\n * - Understand natural language feedback about transcripts\n * - Correct spelling/term issues in transcripts\n * - Add terms, people, or companies to context\n * - Change project assignments and move files\n * - Help users understand what feedback they can provide\n * \n * Usage:\n * protokoll feedback /path/to/transcript.md\n * protokoll feedback --help-me\n */\n\nimport { Command } from 'commander';\nimport * as readline from 'readline';\nimport * as fs from 'fs/promises';\nimport * as path from 'node:path';\nimport * as Context from '../context';\nimport * as Reasoning from '../reasoning';\nimport * as Logging from '../logging';\nimport { slugifyTitle, extractTimestampFromFilename } from './action';\nimport { DEFAULT_MODEL } from '../constants';\n\n// CLI output helper\nconst print = (text: string) => process.stdout.write(text + '\\n');\n\n/**\n * Tool definitions for the agentic feedback processor\n */\nexport interface FeedbackTool {\n name: string;\n description: string;\n parameters: Record<string, {\n type: string;\n description: string;\n required?: boolean;\n enum?: string[];\n items?: { type: string };\n }>;\n}\n\nexport const FEEDBACK_TOOLS: FeedbackTool[] = [\n {\n name: 'correct_text',\n description: 'Replace text in the transcript. Use this to fix misspellings, wrong terms, or incorrect names.',\n parameters: {\n find: { type: 'string', description: 'The text to find in the transcript', required: true },\n replace: { type: 'string', description: 'The text to replace it with', required: true },\n replace_all: { type: 'boolean', description: 'Replace all occurrences (default: true)' },\n },\n },\n {\n name: 'add_term',\n description: 'Add a new term to the context so it will be recognized in future transcripts. Use this when you learn about abbreviations, acronyms, or technical terms.',\n parameters: {\n term: { type: 'string', description: 'The correct term/abbreviation', required: true },\n definition: { type: 'string', description: 'What the term means', required: true },\n sounds_like: { type: 'array', items: { type: 'string' }, description: 'Phonetic variations that might be transcribed incorrectly (e.g., [\"W C M P\", \"double u see em pee\"])' },\n context: { type: 'string', description: 'Additional context about when this term is used' },\n },\n },\n {\n name: 'add_person',\n description: 'Add a new person to the context for future name recognition. Use this when you learn about people whose names were transcribed incorrectly.',\n parameters: {\n name: { type: 'string', description: 'The correct full name', required: true },\n sounds_like: { type: 'array', items: { type: 'string' }, description: 'Phonetic variations (e.g., [\"San Jay\", \"Sanjai\", \"Sanjey\"])', required: true },\n role: { type: 'string', description: 'Their role or title' },\n company: { type: 'string', description: 'Company they work for' },\n context: { type: 'string', description: 'Additional context about this person' },\n },\n },\n {\n name: 'change_project',\n description: 'Change the project assignment of this transcript. This updates metadata and may move the file to a new location based on project routing.',\n parameters: {\n project_id: { type: 'string', description: 'The project ID to assign', required: true },\n },\n },\n {\n name: 'change_title',\n description: 'Change the title of this transcript. This updates the document heading and renames the file.',\n parameters: {\n new_title: { type: 'string', description: 'The new title for the transcript', required: true },\n },\n },\n {\n name: 'provide_help',\n description: 'Provide helpful information to the user about what kinds of feedback they can give.',\n parameters: {\n topic: { type: 'string', description: 'The topic to help with', enum: ['terms', 'people', 'projects', 'corrections', 'general'] },\n },\n },\n {\n name: 'complete',\n description: 'Call this when you have finished processing all the feedback and applied all necessary changes.',\n parameters: {\n summary: { type: 'string', description: 'A summary of what was done', required: true },\n },\n },\n];\n\n/**\n * Result of a tool execution\n */\nexport interface ToolResult {\n success: boolean;\n message: string;\n data?: Record<string, unknown>;\n}\n\n/**\n * Feedback processing context\n */\nexport interface FeedbackContext {\n transcriptPath: string;\n transcriptContent: string;\n originalContent: string;\n context: Context.ContextInstance;\n changes: FeedbackChange[];\n verbose: boolean;\n dryRun: boolean;\n}\n\nexport interface FeedbackChange {\n type: 'text_correction' | 'term_added' | 'person_added' | 'project_changed' | 'title_changed';\n description: string;\n details: Record<string, unknown>;\n}\n\n/**\n * Create a readline interface for user input\n */\nconst createReadlineInterface = () => {\n return readline.createInterface({\n input: process.stdin,\n output: process.stdout,\n });\n};\n\n/**\n * Ask a question and get user input\n */\nconst askQuestion = (rl: readline.Interface, question: string): Promise<string> => {\n return new Promise((resolve) => {\n rl.question(question, (answer) => {\n resolve(answer.trim());\n });\n });\n};\n\n/**\n * Execute a feedback tool\n */\nexport const executeTool = async (\n toolName: string,\n args: Record<string, unknown>,\n feedbackCtx: FeedbackContext\n): Promise<ToolResult> => {\n const logger = Logging.getLogger();\n \n switch (toolName) {\n case 'correct_text': {\n const find = String(args.find);\n const replace = String(args.replace);\n const replaceAll = args.replace_all !== false;\n \n if (!feedbackCtx.transcriptContent.includes(find)) {\n return {\n success: false,\n message: `Text \"${find}\" not found in transcript.`,\n };\n }\n \n const occurrences = feedbackCtx.transcriptContent.split(find).length - 1;\n \n if (replaceAll) {\n feedbackCtx.transcriptContent = feedbackCtx.transcriptContent.split(find).join(replace);\n } else {\n feedbackCtx.transcriptContent = feedbackCtx.transcriptContent.replace(find, replace);\n }\n \n const changeCount = replaceAll ? occurrences : 1;\n \n feedbackCtx.changes.push({\n type: 'text_correction',\n description: `Replaced \"${find}\" with \"${replace}\" (${changeCount} occurrence${changeCount > 1 ? 's' : ''})`,\n details: { find, replace, count: changeCount },\n });\n \n if (feedbackCtx.verbose) {\n print(` ✓ Replaced \"${find}\" → \"${replace}\" (${changeCount}x)`);\n }\n \n return {\n success: true,\n message: `Replaced ${changeCount} occurrence(s) of \"${find}\" with \"${replace}\".`,\n };\n }\n \n case 'add_term': {\n const term = String(args.term);\n const definition = String(args.definition);\n const soundsLike = args.sounds_like as string[] | undefined;\n const termContext = args.context as string | undefined;\n \n // Generate ID from term\n const id = term.toLowerCase().replace(/[^a-z0-9]+/g, '-').replace(/^-|-$/g, '');\n \n // Check if term already exists\n const existing = feedbackCtx.context.getTerm(id);\n if (existing) {\n return {\n success: false,\n message: `Term \"${term}\" already exists in context.`,\n };\n }\n \n const newTerm: Context.Term = {\n id,\n name: term,\n type: 'term',\n expansion: definition,\n sounds_like: soundsLike,\n domain: termContext,\n };\n \n if (!feedbackCtx.dryRun) {\n await feedbackCtx.context.saveEntity(newTerm);\n }\n \n feedbackCtx.changes.push({\n type: 'term_added',\n description: `Added term \"${term}\" to context`,\n details: { term, definition, sounds_like: soundsLike },\n });\n \n if (feedbackCtx.verbose) {\n print(` ✓ Added term: ${term} = \"${definition}\"`);\n if (soundsLike?.length) {\n print(` sounds_like: ${soundsLike.join(', ')}`);\n }\n }\n \n return {\n success: true,\n message: `Added term \"${term}\" to context. It will be recognized in future transcripts.`,\n data: { id, term, definition },\n };\n }\n \n case 'add_person': {\n const name = String(args.name);\n const soundsLike = args.sounds_like as string[];\n const role = args.role as string | undefined;\n const company = args.company as string | undefined;\n const personContext = args.context as string | undefined;\n \n // Generate ID from name\n const id = name.toLowerCase().replace(/[^a-z0-9]+/g, '-').replace(/^-|-$/g, '');\n \n // Check if person already exists\n const existing = feedbackCtx.context.getPerson(id);\n if (existing) {\n return {\n success: false,\n message: `Person \"${name}\" already exists in context.`,\n };\n }\n \n const newPerson: Context.Person = {\n id,\n name,\n type: 'person',\n sounds_like: soundsLike,\n role,\n company,\n context: personContext,\n };\n \n if (!feedbackCtx.dryRun) {\n await feedbackCtx.context.saveEntity(newPerson);\n }\n \n feedbackCtx.changes.push({\n type: 'person_added',\n description: `Added person \"${name}\" to context`,\n details: { name, sounds_like: soundsLike, role, company },\n });\n \n if (feedbackCtx.verbose) {\n print(` ✓ Added person: ${name}`);\n print(` sounds_like: ${soundsLike.join(', ')}`);\n if (role) print(` role: ${role}`);\n if (company) print(` company: ${company}`);\n }\n \n return {\n success: true,\n message: `Added person \"${name}\" to context. Their name will be recognized in future transcripts.`,\n data: { id, name, sounds_like: soundsLike },\n };\n }\n \n case 'change_project': {\n const projectId = String(args.project_id);\n \n // Find the project\n const project = feedbackCtx.context.getProject(projectId);\n if (!project) {\n // List available projects\n const available = feedbackCtx.context.getAllProjects().map(p => p.id);\n return {\n success: false,\n message: `Project \"${projectId}\" not found. Available projects: ${available.join(', ')}`,\n };\n }\n \n // Update metadata in transcript\n const metadataRegex = /\\*\\*Project\\*\\*: .+/;\n const projectIdRegex = /\\*\\*Project ID\\*\\*: `.+`/;\n \n if (metadataRegex.test(feedbackCtx.transcriptContent)) {\n feedbackCtx.transcriptContent = feedbackCtx.transcriptContent.replace(\n metadataRegex,\n `**Project**: ${project.name}`\n );\n }\n \n if (projectIdRegex.test(feedbackCtx.transcriptContent)) {\n feedbackCtx.transcriptContent = feedbackCtx.transcriptContent.replace(\n projectIdRegex,\n `**Project ID**: \\`${project.id}\\``\n );\n }\n \n feedbackCtx.changes.push({\n type: 'project_changed',\n description: `Changed project to \"${project.name}\" (${project.id})`,\n details: { project_id: projectId, project_name: project.name, routing: project.routing },\n });\n \n if (feedbackCtx.verbose) {\n print(` ✓ Changed project to: ${project.name} (${project.id})`);\n if (project.routing?.destination) {\n print(` New destination: ${project.routing.destination}`);\n }\n }\n \n return {\n success: true,\n message: `Changed project to \"${project.name}\". The transcript metadata has been updated.`,\n data: { project_id: projectId, destination: project.routing?.destination },\n };\n }\n \n case 'change_title': {\n const newTitle = String(args.new_title);\n \n // Update title in transcript (first # heading)\n const titleRegex = /^# .+$/m;\n if (titleRegex.test(feedbackCtx.transcriptContent)) {\n feedbackCtx.transcriptContent = feedbackCtx.transcriptContent.replace(\n titleRegex,\n `# ${newTitle}`\n );\n }\n \n feedbackCtx.changes.push({\n type: 'title_changed',\n description: `Changed title to \"${newTitle}\"`,\n details: { new_title: newTitle, slug: slugifyTitle(newTitle) },\n });\n \n if (feedbackCtx.verbose) {\n print(` ✓ Changed title to: ${newTitle}`);\n }\n \n return {\n success: true,\n message: `Changed title to \"${newTitle}\". The file will be renamed accordingly.`,\n data: { new_title: newTitle },\n };\n }\n \n case 'provide_help': {\n const topic = String(args.topic || 'general');\n let helpText = '';\n \n switch (topic) {\n case 'terms':\n helpText = `\n**Term Corrections**\n\nYou can teach me about abbreviations, acronyms, and technical terms:\n\n- \"Everywhere it says WCMP, that should be WCNP - Walmart's Native Cloud Platform\"\n- \"YB should be spelled Wibey\"\n- \"API should be written as A.P.I. in this context\"\n\nI'll:\n1. Fix the term in this transcript\n2. Add it to my vocabulary for future transcripts\n`;\n break;\n \n case 'people':\n helpText = `\n**Name Corrections**\n\nYou can teach me about people whose names were transcribed incorrectly:\n\n- \"San Jay Grouper is actually Sanjay Gupta\"\n- \"Priya was transcribed as 'pre a' - please fix\"\n- \"Marie should be spelled Mari (without the e)\"\n\nI'll:\n1. Fix the name everywhere in this transcript\n2. Remember how the name sounds for future transcripts\n`;\n break;\n \n case 'projects':\n helpText = `\n**Project Assignment**\n\nYou can tell me if a transcript belongs to a different project:\n\n- \"This should be in the Quantum Readiness project\"\n- \"Move this to the client-alpha project\"\n- \"This was misclassified - it's a personal note, not work\"\n\nI'll:\n1. Update the project metadata\n2. Move the file to the project's configured location\n`;\n break;\n \n case 'corrections':\n helpText = `\n**General Corrections**\n\nYou can ask me to fix any text in the transcript:\n\n- \"Change 'gonna' to 'going to' everywhere\"\n- \"The date mentioned should be January 15th, not January 5th\"\n- \"Remove the paragraph about lunch - that was a tangent\"\n\nI'll make the corrections while preserving the rest of the transcript.\n`;\n break;\n \n default:\n helpText = `\n**What I Can Help With**\n\nI can process your feedback to:\n\n1. **Fix Terms & Abbreviations**: \"WCMP should be WCNP\"\n2. **Correct Names**: \"San Jay Grouper is Sanjay Gupta\"\n3. **Change Projects**: \"This belongs in the Quantum project\"\n4. **Update Title**: \"Change the title to 'Q1 Planning Session'\"\n5. **General Corrections**: \"Replace X with Y everywhere\"\n\nJust describe what's wrong in natural language, and I'll figure out what to do!\n\nAsk about specific topics:\n- \"How do I correct terms?\"\n- \"How do I fix names?\"\n- \"How do I change the project?\"\n`;\n }\n \n print(helpText);\n \n return {\n success: true,\n message: helpText,\n };\n }\n \n case 'complete': {\n const summary = String(args.summary);\n return {\n success: true,\n message: summary,\n data: { complete: true },\n };\n }\n \n default:\n logger.warn('Unknown tool: %s', toolName);\n return {\n success: false,\n message: `Unknown tool: ${toolName}`,\n };\n }\n};\n\n/**\n * Build the system prompt for the feedback agent\n */\nexport const buildFeedbackSystemPrompt = (\n transcriptPreview: string,\n availableProjects: string[]\n): string => {\n const toolDescriptions = FEEDBACK_TOOLS.map(t => \n `- ${t.name}: ${t.description}`\n ).join('\\n');\n \n return `You are an intelligent feedback processor for a transcription system. Your job is to understand user feedback about transcripts and take appropriate actions.\n\n## Current Transcript Preview\n${transcriptPreview.substring(0, 1000)}${transcriptPreview.length > 1000 ? '...' : ''}\n\n## Available Projects\n${availableProjects.length > 0 ? availableProjects.join(', ') : '(no projects configured)'}\n\n## Available Tools\n${toolDescriptions}\n\n## How to Process Feedback\n\n1. **Understand the feedback**: What is the user asking for?\n2. **Identify actions**: What tools do you need to use?\n3. **Execute in order**: \n - First, make text corrections (correct_text)\n - Then, add context entities (add_term, add_person)\n - Finally, change metadata if needed (change_project, change_title)\n4. **Summarize**: Call 'complete' with a summary when done\n\n## Important Rules\n\n- If the user asks for help or seems unsure, use provide_help first\n- For name corrections: BOTH fix the text AND add the person to context\n- For term corrections: BOTH fix the text AND add the term to context\n- When fixing names/terms, use correct_text with replace_all=true\n- Be thorough - if \"San Jay Grouper\" should be \"Sanjay Gupta\", also consider variations like \"San jay\", \"Sanjay Grouper\", etc.\n- Always call 'complete' when finished, with a summary of what you did\n\n## Example Interactions\n\nUser: \"YB should be Wibey\"\n→ Use correct_text to replace \"YB\" with \"Wibey\"\n→ Use add_term to add \"Wibey\" with sounds_like [\"YB\", \"Y B\"]\n→ Use complete to summarize\n\nUser: \"San Jay Grouper is actually Sanjay Gupta\"\n→ Use correct_text to replace \"San Jay Grouper\" with \"Sanjay Gupta\"\n→ Use correct_text to replace any other variations like \"San jay Grouper\"\n→ Use add_person to add \"Sanjay Gupta\" with sounds_like [\"San Jay Grouper\", \"Sanjay Grouper\"]\n→ Use complete to summarize\n\nUser: \"This should be in the Quantum Readiness project\"\n→ Use change_project with project_id matching \"Quantum Readiness\" or similar\n→ Use complete to summarize\n\nRespond with tool calls to process the feedback.`;\n};\n\n/**\n * Process feedback using the agentic model\n */\nexport const processFeedback = async (\n feedback: string,\n feedbackCtx: FeedbackContext,\n reasoning: Reasoning.ReasoningInstance\n): Promise<void> => {\n const logger = Logging.getLogger();\n \n // Get available projects\n const projects = feedbackCtx.context.getAllProjects().map(p => `${p.id} (${p.name})`);\n \n // Build the prompt\n const systemPrompt = buildFeedbackSystemPrompt(\n feedbackCtx.transcriptContent,\n projects\n );\n \n // Convert tools to OpenAI format\n const tools = FEEDBACK_TOOLS.map(t => ({\n type: 'function' as const,\n function: {\n name: t.name,\n description: t.description,\n parameters: {\n type: 'object',\n properties: Object.fromEntries(\n Object.entries(t.parameters).map(([key, param]) => [\n key,\n {\n type: param.type,\n description: param.description,\n ...(param.enum ? { enum: param.enum } : {}),\n ...(param.items ? { items: param.items } : {}),\n },\n ])\n ),\n required: Object.entries(t.parameters)\n .filter(([_, p]) => p.required)\n .map(([key]) => key),\n },\n },\n }));\n \n // Process with reasoning model\n let iterations = 0;\n const maxIterations = 10;\n const conversationHistory: Array<{\n role: 'system' | 'user' | 'assistant' | 'tool';\n content: string;\n tool_call_id?: string;\n tool_calls?: Array<{ id: string; function: { name: string; arguments: string } }>;\n }> = [\n { role: 'system', content: systemPrompt },\n { role: 'user', content: feedback },\n ];\n \n while (iterations < maxIterations) {\n iterations++;\n \n logger.debug('Feedback processing iteration %d', iterations);\n \n try {\n const response = await reasoning.completeWithTools({\n messages: conversationHistory,\n tools,\n });\n \n // Check for tool calls\n if (response.tool_calls && response.tool_calls.length > 0) {\n // Add assistant message with tool calls\n conversationHistory.push({\n role: 'assistant',\n content: response.content || '',\n tool_calls: response.tool_calls.map(tc => ({\n id: tc.id,\n function: {\n name: tc.function.name,\n arguments: tc.function.arguments,\n },\n })),\n });\n \n // Execute each tool call\n for (const toolCall of response.tool_calls) {\n const toolName = toolCall.function.name;\n let args: Record<string, unknown>;\n \n try {\n args = JSON.parse(toolCall.function.arguments);\n } catch {\n args = {};\n }\n \n if (feedbackCtx.verbose) {\n print(`\\n[Executing: ${toolName}]`);\n }\n \n const result = await executeTool(toolName, args, feedbackCtx);\n \n // Add tool result to conversation\n conversationHistory.push({\n role: 'tool',\n content: JSON.stringify(result),\n tool_call_id: toolCall.id,\n });\n \n // Check if complete\n if (toolName === 'complete') {\n if (feedbackCtx.verbose) {\n print(`\\n${result.message}`);\n }\n return;\n }\n }\n } else {\n // No tool calls - model is done or confused\n if (response.content) {\n print(`\\n${response.content}`);\n }\n return;\n }\n } catch (error) {\n logger.error('Error during feedback processing', { error });\n throw error;\n }\n }\n \n logger.warn('Feedback processing reached max iterations');\n};\n\n/**\n * Apply changes and save the transcript\n */\nexport const applyChanges = async (\n feedbackCtx: FeedbackContext\n): Promise<{ newPath: string; moved: boolean }> => {\n const logger = Logging.getLogger();\n \n let newPath = feedbackCtx.transcriptPath;\n let moved = false;\n \n // Check if we need to rename the file (title changed)\n const titleChange = feedbackCtx.changes.find(c => c.type === 'title_changed');\n if (titleChange) {\n const slug = titleChange.details.slug as string;\n const timestamp = extractTimestampFromFilename(feedbackCtx.transcriptPath);\n const dir = path.dirname(feedbackCtx.transcriptPath);\n \n if (timestamp) {\n const timeStr = `${timestamp.hour.toString().padStart(2, '0')}${timestamp.minute.toString().padStart(2, '0')}`;\n newPath = path.join(dir, `${timestamp.day}-${timeStr}-${slug}.md`);\n } else {\n newPath = path.join(dir, `${slug}.md`);\n }\n }\n \n // Check if we need to move the file (project changed)\n const projectChange = feedbackCtx.changes.find(c => c.type === 'project_changed');\n if (projectChange && projectChange.details.routing) {\n const routing = projectChange.details.routing as { destination?: string; structure?: string };\n if (routing.destination) {\n // Expand ~ to home directory\n let dest = routing.destination;\n if (dest.startsWith('~')) {\n dest = path.join(process.env.HOME || '', dest.slice(1));\n }\n \n // Get date from transcript metadata or use current date\n const now = new Date();\n const year = now.getFullYear().toString();\n const month = (now.getMonth() + 1).toString().padStart(2, '0');\n \n // Build path based on structure\n let structuredPath = dest;\n const structure = routing.structure || 'month';\n if (structure === 'year') {\n structuredPath = path.join(dest, year);\n } else if (structure === 'month') {\n structuredPath = path.join(dest, year, month);\n } else if (structure === 'day') {\n const day = now.getDate().toString().padStart(2, '0');\n structuredPath = path.join(dest, year, month, day);\n }\n \n // Update path\n const filename = path.basename(newPath);\n newPath = path.join(structuredPath, filename);\n moved = true;\n }\n }\n \n // Ensure directory exists\n await fs.mkdir(path.dirname(newPath), { recursive: true });\n \n // Write the updated content\n if (!feedbackCtx.dryRun) {\n await fs.writeFile(newPath, feedbackCtx.transcriptContent, 'utf-8');\n \n // Delete original if moved/renamed\n if (newPath !== feedbackCtx.transcriptPath) {\n await fs.unlink(feedbackCtx.transcriptPath);\n }\n }\n \n logger.info('Applied %d changes to transcript', feedbackCtx.changes.length);\n \n return { newPath, moved };\n};\n\n/**\n * Run the feedback command\n */\nexport const runFeedback = async (\n transcriptPath: string,\n options: {\n feedback?: string;\n model?: string;\n dryRun?: boolean;\n verbose?: boolean;\n }\n): Promise<void> => {\n // Verify file exists\n try {\n await fs.access(transcriptPath);\n } catch {\n print(`Error: File not found: ${transcriptPath}`);\n process.exit(1);\n }\n \n // Read transcript\n const transcriptContent = await fs.readFile(transcriptPath, 'utf-8');\n \n // Initialize context\n const context = await Context.create();\n \n // Initialize reasoning\n const reasoning = Reasoning.create({ model: options.model || DEFAULT_MODEL });\n \n // Create feedback context\n const feedbackCtx: FeedbackContext = {\n transcriptPath,\n transcriptContent,\n originalContent: transcriptContent,\n context,\n changes: [],\n verbose: options.verbose || false,\n dryRun: options.dryRun || false,\n };\n \n // Get feedback from user if not provided\n let feedback = options.feedback;\n if (!feedback) {\n const rl = createReadlineInterface();\n \n print('\\n' + '─'.repeat(60));\n print(`[Feedback for: ${path.basename(transcriptPath)}]`);\n print('─'.repeat(60));\n print('\\nDescribe what needs to be corrected in natural language.');\n print('Examples:');\n print(' - \"YB should be Wibey\"');\n print(' - \"San Jay Grouper is actually Sanjay Gupta\"');\n print(' - \"This should be in the Quantum Readiness project\"');\n print(' - \"What feedback can I give?\" (for help)\\n');\n \n feedback = await askQuestion(rl, 'What is your feedback? ');\n rl.close();\n \n if (!feedback) {\n print('No feedback provided.');\n return;\n }\n }\n \n if (options.verbose) {\n print('\\n[Processing feedback...]');\n }\n \n // Process feedback with agentic model\n await processFeedback(feedback, feedbackCtx, reasoning);\n \n // Apply changes\n if (feedbackCtx.changes.length > 0) {\n if (options.dryRun) {\n print('\\n[Dry Run] Would apply the following changes:');\n for (const change of feedbackCtx.changes) {\n print(` - ${change.description}`);\n }\n } else {\n const { newPath, moved } = await applyChanges(feedbackCtx);\n \n print('\\n' + '─'.repeat(60));\n print('[Changes Applied]');\n print('─'.repeat(60));\n \n for (const change of feedbackCtx.changes) {\n print(` ✓ ${change.description}`);\n }\n \n if (newPath !== feedbackCtx.transcriptPath) {\n if (moved) {\n print(`\\nFile moved to: ${newPath}`);\n } else {\n print(`\\nFile renamed to: ${path.basename(newPath)}`);\n }\n } else {\n print(`\\nFile updated: ${transcriptPath}`);\n }\n }\n } else {\n print('\\nNo changes were made.');\n }\n};\n\n/**\n * Register the feedback command\n */\nexport const registerFeedbackCommands = (program: Command): void => {\n const feedbackCmd = new Command('feedback')\n .description('Provide natural language feedback to correct transcripts and improve context')\n .argument('[file]', 'Transcript file to provide feedback on')\n .option('-f, --feedback <text>', 'Feedback text (if not provided, will prompt interactively)')\n .option('-m, --model <model>', 'Reasoning model to use', DEFAULT_MODEL)\n .option('--dry-run', 'Show what would happen without making changes')\n .option('-v, --verbose', 'Show detailed output')\n .option('--help-me', 'Show examples of feedback you can provide')\n .action(async (file: string | undefined, options: {\n feedback?: string;\n model?: string;\n dryRun?: boolean;\n verbose?: boolean;\n helpMe?: boolean;\n }) => {\n if (options.helpMe) {\n print(`\n╔════════════════════════════════════════════════════════════╗\n║ PROTOKOLL FEEDBACK - EXAMPLES ║\n╠════════════════════════════════════════════════════════════╣\n║ ║\n║ CORRECTING TERMS & ABBREVIATIONS ║\n║ ───────────────────────────────── ║\n║ \"Everywhere it says WCMP, that should be WCNP\" ║\n║ \"YB should be spelled Wibey\" ║\n║ \"API should be written as A-P-I\" ║\n║ ║\n║ FIXING NAMES ║\n║ ──────────── ║\n║ \"San Jay Grouper is actually Sanjay Gupta\" ║\n║ \"Priya was transcribed as 'pre a' - please fix\" ║\n║ \"Marie should be spelled Mari\" ║\n║ ║\n║ CHANGING PROJECT ASSIGNMENT ║\n║ ─────────────────────────── ║\n║ \"This should be in the Quantum Readiness project\" ║\n║ \"Move this to client-alpha\" ║\n║ \"This was misclassified - should be personal\" ║\n║ ║\n║ GENERAL CORRECTIONS ║\n║ ─────────────────── ║\n║ \"Change the title to 'Q1 Planning Session'\" ║\n║ \"Replace 'gonna' with 'going to' everywhere\" ║\n║ ║\n╚════════════════════════════════════════════════════════════╝\n\nUsage:\n protokoll feedback /path/to/transcript.md\n protokoll feedback /path/to/transcript.md -f \"YB should be Wibey\"\n protokoll feedback /path/to/transcript.md --dry-run -v\n`);\n return;\n }\n \n if (!file) {\n print('Error: A transcript file is required.');\n print('Usage: protokoll feedback /path/to/transcript.md');\n print('Run \"protokoll feedback --help-me\" for examples.');\n process.exit(1);\n }\n \n await runFeedback(file, options);\n });\n \n program.addCommand(feedbackCmd);\n};\n"],"names":["print","text","process","stdout","write","FEEDBACK_TOOLS","name","description","parameters","find","type","required","replace","replace_all","term","definition","sounds_like","items","context","role","company","project_id","new_title","topic","enum","summary","createReadlineInterface","readline","createInterface","input","stdin","output","askQuestion","rl","question","Promise","resolve","answer","trim","executeTool","toolName","args","feedbackCtx","logger","Logging","String","replaceAll","transcriptContent","includes","success","message","occurrences","split","length","join","changeCount","changes","push","details","count","verbose","soundsLike","termContext","id","toLowerCase","existing","getTerm","newTerm","expansion","domain","dryRun","saveEntity","data","personContext","getPerson","newPerson","project","projectId","getProject","available","getAllProjects","map","p","metadataRegex","projectIdRegex","test","project_name","routing","destination","newTitle","titleRegex","slug","slugifyTitle","helpText","complete","warn","buildFeedbackSystemPrompt","transcriptPreview","availableProjects","toolDescriptions","t","substring","processFeedback","feedback","reasoning","projects","systemPrompt","tools","function","properties","Object","fromEntries","entries","key","param","filter","_","iterations","maxIterations","conversationHistory","content","debug","response","completeWithTools","messages","tool_calls","tc","arguments","toolCall","JSON","parse","result","stringify","tool_call_id","error","applyChanges","newPath","transcriptPath","moved","titleChange","c","timestamp","extractTimestampFromFilename","dir","path","dirname","timeStr","hour","toString","padStart","minute","day","projectChange","dest","startsWith","env","HOME","slice","now","Date","year","getFullYear","month","getMonth","structuredPath","structure","getDate","filename","basename","fs","mkdir","recursive","writeFile","unlink","info","runFeedback","options","access","exit","readFile","Context","Reasoning","model","DEFAULT_MODEL","originalContent","repeat","close","change","registerFeedbackCommands","program","feedbackCmd","Command","argument","option","action","file","helpMe","addCommand"],"mappings":"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"}
|
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
import { Command } from 'commander';
|
|
2
|
+
import { PROGRAM_NAME, VERSION } from '../constants.js';
|
|
3
|
+
import { registerContextCommands } from './context.js';
|
|
4
|
+
import { registerActionCommands } from './action.js';
|
|
5
|
+
import { registerFeedbackCommands } from './feedback.js';
|
|
6
|
+
import { registerConfigCommands } from './config.js';
|
|
7
|
+
import { isInstallCommand, runInstallCLI, registerInstallCommand } from './install.js';
|
|
8
|
+
import { registerTranscriptCommands } from './transcript.js';
|
|
9
|
+
|
|
10
|
+
// Context management subcommands
|
|
11
|
+
const CONTEXT_SUBCOMMANDS = [
|
|
12
|
+
'project',
|
|
13
|
+
'person',
|
|
14
|
+
'term',
|
|
15
|
+
'company',
|
|
16
|
+
'ignored',
|
|
17
|
+
'context',
|
|
18
|
+
'action',
|
|
19
|
+
'feedback',
|
|
20
|
+
'install',
|
|
21
|
+
'config',
|
|
22
|
+
'transcript'
|
|
23
|
+
];
|
|
24
|
+
/**
|
|
25
|
+
* Check if the CLI arguments contain a context management subcommand
|
|
26
|
+
*/ const isContextCommand = ()=>{
|
|
27
|
+
const args = process.argv.slice(2);
|
|
28
|
+
if (args.length === 0) return false;
|
|
29
|
+
const firstArg = args[0];
|
|
30
|
+
return CONTEXT_SUBCOMMANDS.includes(firstArg);
|
|
31
|
+
};
|
|
32
|
+
/**
|
|
33
|
+
* Run the context management CLI
|
|
34
|
+
*/ const runContextCLI = async ()=>{
|
|
35
|
+
// Special handling for install command - run directly without commander parsing
|
|
36
|
+
if (isInstallCommand()) {
|
|
37
|
+
await runInstallCLI();
|
|
38
|
+
return;
|
|
39
|
+
}
|
|
40
|
+
const program = new Command();
|
|
41
|
+
program.name(PROGRAM_NAME).version(VERSION).description('Intelligent audio transcription with context management');
|
|
42
|
+
// Register install command
|
|
43
|
+
registerInstallCommand(program);
|
|
44
|
+
// Register context management commands
|
|
45
|
+
registerContextCommands(program);
|
|
46
|
+
// Register action commands
|
|
47
|
+
registerActionCommands(program);
|
|
48
|
+
// Register feedback commands
|
|
49
|
+
registerFeedbackCommands(program);
|
|
50
|
+
// Register config commands
|
|
51
|
+
registerConfigCommands(program);
|
|
52
|
+
// Register transcript commands (compare, reanalyze)
|
|
53
|
+
registerTranscriptCommands(program);
|
|
54
|
+
// Add help text about main transcription
|
|
55
|
+
program.addHelpText('after', `
|
|
56
|
+
Setup:
|
|
57
|
+
${PROGRAM_NAME} install Interactive setup wizard (first time)
|
|
58
|
+
|
|
59
|
+
Configuration:
|
|
60
|
+
${PROGRAM_NAME} config Interactive configuration editor
|
|
61
|
+
${PROGRAM_NAME} config --list List all settings
|
|
62
|
+
${PROGRAM_NAME} config <key> View a specific setting
|
|
63
|
+
${PROGRAM_NAME} config <key> <value> Set a specific setting
|
|
64
|
+
|
|
65
|
+
To transcribe audio files:
|
|
66
|
+
${PROGRAM_NAME} --input-directory <dir>
|
|
67
|
+
|
|
68
|
+
Context management:
|
|
69
|
+
${PROGRAM_NAME} project list List all projects
|
|
70
|
+
${PROGRAM_NAME} project show <id> Show project details
|
|
71
|
+
${PROGRAM_NAME} project add Add a new project
|
|
72
|
+
${PROGRAM_NAME} project delete <id> Delete a project
|
|
73
|
+
|
|
74
|
+
${PROGRAM_NAME} person list List all people
|
|
75
|
+
${PROGRAM_NAME} term list List all terms
|
|
76
|
+
${PROGRAM_NAME} company list List all companies
|
|
77
|
+
|
|
78
|
+
${PROGRAM_NAME} ignored list List ignored terms (won't prompt)
|
|
79
|
+
${PROGRAM_NAME} ignored add Add term to ignore list
|
|
80
|
+
${PROGRAM_NAME} ignored delete <id> Remove from ignore list
|
|
81
|
+
|
|
82
|
+
${PROGRAM_NAME} context status Show context system status
|
|
83
|
+
${PROGRAM_NAME} context search <q> Search across all entities
|
|
84
|
+
|
|
85
|
+
Transcript actions:
|
|
86
|
+
${PROGRAM_NAME} action --title "Title" <file> Edit a single transcript
|
|
87
|
+
${PROGRAM_NAME} action --combine "<files>" Combine multiple transcripts
|
|
88
|
+
|
|
89
|
+
Feedback:
|
|
90
|
+
${PROGRAM_NAME} feedback <file> Provide feedback to improve transcripts
|
|
91
|
+
${PROGRAM_NAME} feedback --help-me Show feedback examples
|
|
92
|
+
|
|
93
|
+
Transcript tools:
|
|
94
|
+
${PROGRAM_NAME} transcript compare <file> Compare raw vs enhanced
|
|
95
|
+
${PROGRAM_NAME} transcript compare --raw <f> Show only raw Whisper output
|
|
96
|
+
${PROGRAM_NAME} transcript info <file> Show raw transcript metadata
|
|
97
|
+
${PROGRAM_NAME} transcript list <dir> List transcripts with raw status
|
|
98
|
+
`);
|
|
99
|
+
await program.parseAsync(process.argv);
|
|
100
|
+
};
|
|
101
|
+
|
|
102
|
+
export { isContextCommand, runContextCLI };
|
|
103
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sources":["../../src/cli/index.ts"],"sourcesContent":["/**\n * CLI Entry Point\n * \n * Routes between context management subcommands and the main transcription flow.\n */\n\nimport { Command } from 'commander';\nimport { PROGRAM_NAME, VERSION } from '../constants';\nimport { registerContextCommands } from './context';\nimport { registerActionCommands } from './action';\nimport { registerFeedbackCommands } from './feedback';\nimport { registerConfigCommands } from './config';\nimport { registerInstallCommand, isInstallCommand, runInstallCLI } from './install';\nimport { registerTranscriptCommands } from './transcript';\n\n// Context management subcommands\nconst CONTEXT_SUBCOMMANDS = ['project', 'person', 'term', 'company', 'ignored', 'context', 'action', 'feedback', 'install', 'config', 'transcript'];\n\n/**\n * Check if the CLI arguments contain a context management subcommand\n */\nexport const isContextCommand = (): boolean => {\n const args = process.argv.slice(2);\n if (args.length === 0) return false;\n \n const firstArg = args[0];\n return CONTEXT_SUBCOMMANDS.includes(firstArg);\n};\n\n/**\n * Run the context management CLI\n */\nexport const runContextCLI = async (): Promise<void> => {\n // Special handling for install command - run directly without commander parsing\n if (isInstallCommand()) {\n await runInstallCLI();\n return;\n }\n\n const program = new Command();\n \n program\n .name(PROGRAM_NAME)\n .version(VERSION)\n .description('Intelligent audio transcription with context management');\n \n // Register install command\n registerInstallCommand(program);\n \n // Register context management commands\n registerContextCommands(program);\n \n // Register action commands\n registerActionCommands(program);\n \n // Register feedback commands\n registerFeedbackCommands(program);\n \n // Register config commands\n registerConfigCommands(program);\n \n // Register transcript commands (compare, reanalyze)\n registerTranscriptCommands(program);\n \n // Add help text about main transcription\n program.addHelpText('after', `\nSetup:\n ${PROGRAM_NAME} install Interactive setup wizard (first time)\n\nConfiguration:\n ${PROGRAM_NAME} config Interactive configuration editor\n ${PROGRAM_NAME} config --list List all settings\n ${PROGRAM_NAME} config <key> View a specific setting\n ${PROGRAM_NAME} config <key> <value> Set a specific setting\n\nTo transcribe audio files:\n ${PROGRAM_NAME} --input-directory <dir>\n\nContext management:\n ${PROGRAM_NAME} project list List all projects\n ${PROGRAM_NAME} project show <id> Show project details\n ${PROGRAM_NAME} project add Add a new project\n ${PROGRAM_NAME} project delete <id> Delete a project\n \n ${PROGRAM_NAME} person list List all people\n ${PROGRAM_NAME} term list List all terms\n ${PROGRAM_NAME} company list List all companies\n \n ${PROGRAM_NAME} ignored list List ignored terms (won't prompt)\n ${PROGRAM_NAME} ignored add Add term to ignore list\n ${PROGRAM_NAME} ignored delete <id> Remove from ignore list\n \n ${PROGRAM_NAME} context status Show context system status\n ${PROGRAM_NAME} context search <q> Search across all entities\n\nTranscript actions:\n ${PROGRAM_NAME} action --title \"Title\" <file> Edit a single transcript\n ${PROGRAM_NAME} action --combine \"<files>\" Combine multiple transcripts\n\nFeedback:\n ${PROGRAM_NAME} feedback <file> Provide feedback to improve transcripts\n ${PROGRAM_NAME} feedback --help-me Show feedback examples\n\nTranscript tools:\n ${PROGRAM_NAME} transcript compare <file> Compare raw vs enhanced\n ${PROGRAM_NAME} transcript compare --raw <f> Show only raw Whisper output\n ${PROGRAM_NAME} transcript info <file> Show raw transcript metadata\n ${PROGRAM_NAME} transcript list <dir> List transcripts with raw status\n`);\n \n await program.parseAsync(process.argv);\n};\n"],"names":["CONTEXT_SUBCOMMANDS","isContextCommand","args","process","argv","slice","length","firstArg","includes","runContextCLI","isInstallCommand","runInstallCLI","program","Command","name","PROGRAM_NAME","version","VERSION","description","registerInstallCommand","registerContextCommands","registerActionCommands","registerFeedbackCommands","registerConfigCommands","registerTranscriptCommands","addHelpText","parseAsync"],"mappings":";;;;;;;;;AAeA;AACA,MAAMA,mBAAAA,GAAsB;AAAC,IAAA,SAAA;AAAW,IAAA,QAAA;AAAU,IAAA,MAAA;AAAQ,IAAA,SAAA;AAAW,IAAA,SAAA;AAAW,IAAA,SAAA;AAAW,IAAA,QAAA;AAAU,IAAA,UAAA;AAAY,IAAA,SAAA;AAAW,IAAA,QAAA;AAAU,IAAA;AAAa,CAAA;AAEnJ;;UAGaC,gBAAAA,GAAmB,IAAA;AAC5B,IAAA,MAAMC,IAAAA,GAAOC,OAAAA,CAAQC,IAAI,CAACC,KAAK,CAAC,CAAA,CAAA;AAChC,IAAA,IAAIH,IAAAA,CAAKI,MAAM,KAAK,CAAA,EAAG,OAAO,KAAA;IAE9B,MAAMC,QAAAA,GAAWL,IAAI,CAAC,CAAA,CAAE;IACxB,OAAOF,mBAAAA,CAAoBQ,QAAQ,CAACD,QAAAA,CAAAA;AACxC;AAEA;;UAGaE,aAAAA,GAAgB,UAAA;;AAEzB,IAAA,IAAIC,gBAAAA,EAAAA,EAAoB;QACpB,MAAMC,aAAAA,EAAAA;AACN,QAAA;AACJ,IAAA;AAEA,IAAA,MAAMC,UAAU,IAAIC,OAAAA,EAAAA;AAEpBD,IAAAA,OAAAA,CACKE,IAAI,CAACC,YAAAA,CAAAA,CACLC,OAAO,CAACC,OAAAA,CAAAA,CACRC,WAAW,CAAC,yDAAA,CAAA;;IAGjBC,sBAAAA,CAAuBP,OAAAA,CAAAA;;IAGvBQ,uBAAAA,CAAwBR,OAAAA,CAAAA;;IAGxBS,sBAAAA,CAAuBT,OAAAA,CAAAA;;IAGvBU,wBAAAA,CAAyBV,OAAAA,CAAAA;;IAGzBW,sBAAAA,CAAuBX,OAAAA,CAAAA;;IAGvBY,0BAAAA,CAA2BZ,OAAAA,CAAAA;;IAG3BA,OAAAA,CAAQa,WAAW,CAAC,OAAA,EAAS;;AAE/B,EAAA,EAAEV,YAAAA,CAAa;;;AAGf,EAAA,EAAEA,YAAAA,CAAa;AACf,EAAA,EAAEA,YAAAA,CAAa;AACf,EAAA,EAAEA,YAAAA,CAAa;AACf,EAAA,EAAEA,YAAAA,CAAa;;;AAGf,EAAA,EAAEA,YAAAA,CAAa;;;AAGf,EAAA,EAAEA,YAAAA,CAAa;AACf,EAAA,EAAEA,YAAAA,CAAa;AACf,EAAA,EAAEA,YAAAA,CAAa;AACf,EAAA,EAAEA,YAAAA,CAAa;;AAEf,EAAA,EAAEA,YAAAA,CAAa;AACf,EAAA,EAAEA,YAAAA,CAAa;AACf,EAAA,EAAEA,YAAAA,CAAa;;AAEf,EAAA,EAAEA,YAAAA,CAAa;AACf,EAAA,EAAEA,YAAAA,CAAa;AACf,EAAA,EAAEA,YAAAA,CAAa;;AAEf,EAAA,EAAEA,YAAAA,CAAa;AACf,EAAA,EAAEA,YAAAA,CAAa;;;AAGf,EAAA,EAAEA,YAAAA,CAAa;AACf,EAAA,EAAEA,YAAAA,CAAa;;;AAGf,EAAA,EAAEA,YAAAA,CAAa;AACf,EAAA,EAAEA,YAAAA,CAAa;;;AAGf,EAAA,EAAEA,YAAAA,CAAa;AACf,EAAA,EAAEA,YAAAA,CAAa;AACf,EAAA,EAAEA,YAAAA,CAAa;AACf,EAAA,EAAEA,YAAAA,CAAa;AACjB,CAAC,CAAA;AAEG,IAAA,MAAMH,OAAAA,CAAQc,UAAU,CAACvB,OAAAA,CAAQC,IAAI,CAAA;AACzC;;;;"}
|