@redaksjon/protokoll 0.0.13 → 0.0.14

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (108) hide show
  1. package/README.md +198 -0
  2. package/dist/feedback.js +5193 -0
  3. package/dist/feedback.js.map +1 -0
  4. package/dist/main.js +1858 -9
  5. package/dist/main.js.map +1 -1
  6. package/dist/mcp/server.js +1330 -0
  7. package/dist/mcp/server.js.map +1 -0
  8. package/guide/index.md +16 -0
  9. package/guide/mcp-integration.md +341 -0
  10. package/package.json +5 -3
  11. package/tsconfig.tsbuildinfo +1 -1
  12. package/vite.config.ts +13 -29
  13. package/dist/agentic/executor.js +0 -747
  14. package/dist/agentic/executor.js.map +0 -1
  15. package/dist/agentic/index.js +0 -19
  16. package/dist/agentic/index.js.map +0 -1
  17. package/dist/agentic/registry.js +0 -41
  18. package/dist/agentic/registry.js.map +0 -1
  19. package/dist/agentic/tools/lookup-person.js +0 -185
  20. package/dist/agentic/tools/lookup-person.js.map +0 -1
  21. package/dist/agentic/tools/lookup-project.js +0 -210
  22. package/dist/agentic/tools/lookup-project.js.map +0 -1
  23. package/dist/agentic/tools/route-note.js +0 -49
  24. package/dist/agentic/tools/route-note.js.map +0 -1
  25. package/dist/agentic/tools/store-context.js +0 -51
  26. package/dist/agentic/tools/store-context.js.map +0 -1
  27. package/dist/agentic/tools/verify-spelling.js +0 -57
  28. package/dist/agentic/tools/verify-spelling.js.map +0 -1
  29. package/dist/arguments.js +0 -178
  30. package/dist/arguments.js.map +0 -1
  31. package/dist/cli/action.js +0 -704
  32. package/dist/cli/action.js.map +0 -1
  33. package/dist/cli/config.js +0 -482
  34. package/dist/cli/config.js.map +0 -1
  35. package/dist/cli/context.js +0 -466
  36. package/dist/cli/context.js.map +0 -1
  37. package/dist/cli/feedback.js +0 -858
  38. package/dist/cli/feedback.js.map +0 -1
  39. package/dist/cli/index.js +0 -103
  40. package/dist/cli/index.js.map +0 -1
  41. package/dist/cli/install.js +0 -572
  42. package/dist/cli/install.js.map +0 -1
  43. package/dist/cli/transcript.js +0 -199
  44. package/dist/cli/transcript.js.map +0 -1
  45. package/dist/constants.js +0 -91
  46. package/dist/constants.js.map +0 -1
  47. package/dist/context/discovery.js +0 -114
  48. package/dist/context/discovery.js.map +0 -1
  49. package/dist/context/index.js +0 -82
  50. package/dist/context/index.js.map +0 -1
  51. package/dist/context/storage.js +0 -184
  52. package/dist/context/storage.js.map +0 -1
  53. package/dist/interactive/handler.js +0 -524
  54. package/dist/interactive/handler.js.map +0 -1
  55. package/dist/interactive/index.js +0 -18
  56. package/dist/interactive/index.js.map +0 -1
  57. package/dist/interactive/onboarding.js +0 -28
  58. package/dist/interactive/onboarding.js.map +0 -1
  59. package/dist/logging.js +0 -46
  60. package/dist/logging.js.map +0 -1
  61. package/dist/output/index.js +0 -8
  62. package/dist/output/index.js.map +0 -1
  63. package/dist/output/manager.js +0 -150
  64. package/dist/output/manager.js.map +0 -1
  65. package/dist/phases/complete.js +0 -142
  66. package/dist/phases/complete.js.map +0 -1
  67. package/dist/phases/locate.js +0 -64
  68. package/dist/phases/locate.js.map +0 -1
  69. package/dist/pipeline/index.js +0 -8
  70. package/dist/pipeline/index.js.map +0 -1
  71. package/dist/pipeline/orchestrator.js +0 -354
  72. package/dist/pipeline/orchestrator.js.map +0 -1
  73. package/dist/protokoll.js +0 -180
  74. package/dist/protokoll.js.map +0 -1
  75. package/dist/reasoning/client.js +0 -233
  76. package/dist/reasoning/client.js.map +0 -1
  77. package/dist/reasoning/index.js +0 -37
  78. package/dist/reasoning/index.js.map +0 -1
  79. package/dist/reasoning/strategy.js +0 -60
  80. package/dist/reasoning/strategy.js.map +0 -1
  81. package/dist/reflection/collector.js +0 -124
  82. package/dist/reflection/collector.js.map +0 -1
  83. package/dist/reflection/index.js +0 -16
  84. package/dist/reflection/index.js.map +0 -1
  85. package/dist/reflection/reporter.js +0 -238
  86. package/dist/reflection/reporter.js.map +0 -1
  87. package/dist/routing/classifier.js +0 -201
  88. package/dist/routing/classifier.js.map +0 -1
  89. package/dist/routing/index.js +0 -27
  90. package/dist/routing/index.js.map +0 -1
  91. package/dist/routing/router.js +0 -153
  92. package/dist/routing/router.js.map +0 -1
  93. package/dist/transcription/index.js +0 -41
  94. package/dist/transcription/index.js.map +0 -1
  95. package/dist/transcription/service.js +0 -64
  96. package/dist/transcription/service.js.map +0 -1
  97. package/dist/transcription/types.js +0 -31
  98. package/dist/transcription/types.js.map +0 -1
  99. package/dist/util/dates.js +0 -96
  100. package/dist/util/dates.js.map +0 -1
  101. package/dist/util/media.js +0 -103
  102. package/dist/util/media.js.map +0 -1
  103. package/dist/util/metadata.js +0 -95
  104. package/dist/util/metadata.js.map +0 -1
  105. package/dist/util/sound.js +0 -116
  106. package/dist/util/sound.js.map +0 -1
  107. package/dist/util/storage.js +0 -135
  108. package/dist/util/storage.js.map +0 -1
@@ -1,524 +0,0 @@
1
- import * as readline from 'readline';
2
- import { getLogger } from '../logging.js';
3
- import { create as create$1 } from '../util/sound.js';
4
-
5
- const createReadlineInterface = ()=>{
6
- // Ensure stdin is in the correct mode for readline
7
- // This helps prevent issues with some terminal emulators
8
- if (process.stdin.setRawMode) {
9
- try {
10
- // Ensure we're NOT in raw mode - readline handles this itself
11
- process.stdin.setRawMode(false);
12
- } catch {
13
- // Ignore errors - some environments don't support setRawMode
14
- }
15
- }
16
- return readline.createInterface({
17
- input: process.stdin,
18
- output: process.stdout,
19
- terminal: true
20
- });
21
- };
22
- const askQuestion = (rl, question)=>{
23
- return new Promise((resolve)=>{
24
- rl.question(question, (answer)=>{
25
- resolve(answer.trim());
26
- });
27
- });
28
- };
29
- // Helper to write to stdout without triggering no-console lint rule
30
- const write = (text)=>process.stdout.write(text + '\n');
31
- // Simplified project creation (used when creating project from term/person association)
32
- const runCreateProjectFlow = async (rl, contextMessage)=>{
33
- if (contextMessage) {
34
- write('');
35
- write(contextMessage);
36
- }
37
- // Step 1: Project name (required)
38
- const projectName = await askQuestion(rl, '\nProject name: ');
39
- if (!projectName) {
40
- write('Project name is required. Skipping project creation.');
41
- return {
42
- action: 'skip'
43
- };
44
- }
45
- // Step 2: Destination
46
- const destination = await askQuestion(rl, '\nWhere should output be routed to? (Enter for default): ');
47
- // Step 3: Description
48
- const description = await askQuestion(rl, '\nCan you tell me something about this project? (Enter to skip): ');
49
- return {
50
- action: 'create',
51
- projectName: projectName.trim(),
52
- destination: destination || undefined,
53
- description: description || undefined
54
- };
55
- };
56
- const runNewProjectWizard = async (rl, term, context, projectOptions)=>{
57
- write('');
58
- write('─'.repeat(60));
59
- write(`[Unknown Project/Term]`);
60
- write(`Term: "${term}"`);
61
- write('');
62
- if (context) {
63
- // Display context with proper formatting (it now includes file info)
64
- write(context);
65
- }
66
- write('─'.repeat(60));
67
- // Step 1: Is this a project or a term?
68
- const entityType = await askQuestion(rl, '\nIs this a Project or a Term? (P/T/X to ignore, or Enter to skip): ');
69
- if (entityType === '' || entityType.toLowerCase() === 's' || entityType.toLowerCase() === 'skip') {
70
- return {
71
- action: 'skip'
72
- };
73
- }
74
- // IGNORE FLOW - user doesn't want to be asked about this term again
75
- if (entityType.toLowerCase() === 'x' || entityType.toLowerCase() === 'i' || entityType.toLowerCase() === 'ignore') {
76
- write(`\n[Adding "${term}" to ignore list - you won't be asked about this again]`);
77
- return {
78
- action: 'ignore',
79
- ignoredTerm: term
80
- };
81
- }
82
- // PROJECT FLOW
83
- if (entityType.toLowerCase() === 'p' || entityType.toLowerCase() === 'project') {
84
- // Step 2: Project name
85
- const projectName = await askQuestion(rl, `\nWhat is this project's name? [${term}]: `);
86
- const finalName = projectName || term;
87
- // Step 3: Destination
88
- const destination = await askQuestion(rl, '\nWhere should output be routed to? (Enter for default): ');
89
- // Step 4: Description
90
- const description = await askQuestion(rl, '\nCan you tell me something about this project? (Enter to skip): ');
91
- return {
92
- action: 'create',
93
- projectName: finalName,
94
- destination: destination || undefined,
95
- description: description || undefined
96
- };
97
- }
98
- // TERM FLOW
99
- if (entityType.toLowerCase() === 't' || entityType.toLowerCase() === 'term') {
100
- // Step 2: Validate spelling
101
- const termCorrection = await askQuestion(rl, `\nIs "${term}" spelled correctly? (Enter to accept, or type correction): `);
102
- const finalTermName = termCorrection || term;
103
- if (termCorrection) {
104
- write(`Term updated to: "${finalTermName}"`);
105
- }
106
- // Step 3: Is this an acronym?
107
- const expansion = await askQuestion(rl, `\nIf "${finalTermName}" is an acronym, what does it stand for? (Enter to skip): `);
108
- // Step 4: Which project(s) is this term associated with?
109
- const termProjects = [];
110
- let createdProject;
111
- if (projectOptions && projectOptions.length > 0) {
112
- write('\nExisting projects:');
113
- projectOptions.forEach((opt, i)=>{
114
- write(` ${i + 1}. ${opt}`);
115
- });
116
- write(` N. Create a new project`);
117
- const projectSelection = await askQuestion(rl, `\nWhich project(s) is "${finalTermName}" associated with? (Enter numbers separated by commas, N for new, or Enter to skip): `);
118
- if (projectSelection.toLowerCase().includes('n')) {
119
- // User wants to create a new project to associate with this term
120
- write('');
121
- write(`[Create New Project for Term "${finalTermName}"]`);
122
- createdProject = await runCreateProjectFlow(rl, `The term "${finalTermName}" will be associated with this new project.`);
123
- if (createdProject.action === 'create' && createdProject.projectName) {
124
- write(`\n[Project "${createdProject.projectName}" will be created and associated with term "${finalTermName}"]`);
125
- }
126
- } else if (projectSelection) {
127
- const indices = projectSelection.split(',').map((s)=>parseInt(s.trim(), 10) - 1);
128
- for (const idx of indices){
129
- if (!isNaN(idx) && idx >= 0 && idx < projectOptions.length) {
130
- termProjects.push(idx);
131
- }
132
- }
133
- if (termProjects.length > 0) {
134
- write(`Associated with: ${termProjects.map((i)=>projectOptions[i].split(' - ')[0]).join(', ')}`);
135
- }
136
- }
137
- } else {
138
- // No existing projects - offer to create one
139
- const createNew = await askQuestion(rl, `\nNo existing projects found. Create a new project for term "${finalTermName}"? (Y/N, or Enter to skip): `);
140
- if (createNew.toLowerCase() === 'y' || createNew.toLowerCase() === 'yes') {
141
- write('');
142
- write(`[Create New Project for Term "${finalTermName}"]`);
143
- createdProject = await runCreateProjectFlow(rl, `The term "${finalTermName}" will be associated with this new project.`);
144
- if (createdProject.action === 'create' && createdProject.projectName) {
145
- write(`\n[Project "${createdProject.projectName}" will be created and associated with term "${finalTermName}"]`);
146
- }
147
- }
148
- }
149
- // Step 5: Description
150
- const termDesc = await askQuestion(rl, `\nBrief description of "${finalTermName}"? (Enter to skip): `);
151
- return {
152
- action: 'term',
153
- termName: finalTermName,
154
- termExpansion: expansion || undefined,
155
- termProjects: termProjects.length > 0 ? termProjects : undefined,
156
- termDescription: termDesc || undefined,
157
- createdProject
158
- };
159
- }
160
- // Unrecognized input
161
- write('\nUnrecognized input. Please enter P for Project, T for Term, or press Enter to skip.');
162
- return {
163
- action: 'skip'
164
- };
165
- };
166
- const runNewPersonWizard = async (rl, name, context, projectOptions)=>{
167
- write('');
168
- write('─'.repeat(60));
169
- write(`[Unknown Person Detected]`);
170
- write(`Name heard: "${name}"`);
171
- write('');
172
- if (context) {
173
- // Display context with proper formatting (it now includes file info)
174
- write(context);
175
- }
176
- write('─'.repeat(60));
177
- // Step 1: Confirm name spelling
178
- const nameCorrection = await askQuestion(rl, `\nIs the name spelled correctly? (Enter to accept, or type correction): `);
179
- const finalName = nameCorrection || name;
180
- if (nameCorrection) {
181
- write(`Name updated to: "${finalName}"`);
182
- }
183
- // Step 2: Ask for organization/company
184
- const organization = await askQuestion(rl, `\nWhat organization/company is ${finalName} with? (Enter to skip): `);
185
- // Step 3: Project association
186
- let linkedProjectIndex;
187
- let createdProject;
188
- // Show project options with "N" for new project
189
- if (projectOptions && projectOptions.length > 0) {
190
- write('\nExisting projects:');
191
- projectOptions.forEach((opt, i)=>{
192
- write(` ${i + 1}. ${opt}`);
193
- });
194
- write(` N. Create a new project`);
195
- const projectSelection = await askQuestion(rl, `\nWhich project is ${finalName} related to? (Enter number, N for new, or Enter to skip): `);
196
- if (projectSelection.toLowerCase() === 'n') {
197
- // User wants to create a new project for this person
198
- write('');
199
- write(`[Create New Project for ${finalName}]`);
200
- const contextMsg = organization ? `Creating project for ${finalName} (${organization})` : `Creating project for ${finalName}`;
201
- createdProject = await runCreateProjectFlow(rl, contextMsg);
202
- if (createdProject.action === 'create' && createdProject.projectName) {
203
- write(`\n[Project "${createdProject.projectName}" will be created and linked to ${finalName}]`);
204
- }
205
- } else if (projectSelection && /^\d+$/.test(projectSelection)) {
206
- const idx = parseInt(projectSelection, 10) - 1;
207
- if (idx >= 0 && idx < projectOptions.length) {
208
- linkedProjectIndex = idx;
209
- write(`Linked to: ${projectOptions[idx]}`);
210
- }
211
- }
212
- } else {
213
- // No existing projects - offer to create one
214
- const createNew = await askQuestion(rl, `\nNo existing projects found. Create a new project for ${finalName}? (Y/N, or Enter to skip): `);
215
- if (createNew.toLowerCase() === 'y' || createNew.toLowerCase() === 'yes') {
216
- write('');
217
- write(`[Create New Project for ${finalName}]`);
218
- const contextMsg = organization ? `Creating project for ${finalName} (${organization})` : `Creating project for ${finalName}`;
219
- createdProject = await runCreateProjectFlow(rl, contextMsg);
220
- if (createdProject.action === 'create' && createdProject.projectName) {
221
- write(`\n[Project "${createdProject.projectName}" will be created and linked to ${finalName}]`);
222
- }
223
- }
224
- }
225
- // Step 4: Ask for notes about the person
226
- const notes = await askQuestion(rl, `\nAny notes about ${finalName}? (Enter to skip): `);
227
- // Determine if we should create the person
228
- const hasInfo = organization || linkedProjectIndex !== undefined || createdProject || notes;
229
- if (!hasInfo) {
230
- // User skipped everything - confirm if they want to skip entirely
231
- const confirm = await askQuestion(rl, `\nNo information provided. Skip saving ${finalName}? (Enter to skip, or any key to save anyway): `);
232
- if (confirm === '') {
233
- return {
234
- action: 'skip'
235
- };
236
- }
237
- }
238
- return {
239
- action: 'create',
240
- personName: finalName,
241
- organization: organization || undefined,
242
- linkedProjectIndex,
243
- notes: notes || undefined,
244
- createdProject
245
- };
246
- };
247
- const formatClarificationPrompt = (request)=>{
248
- const lines = [];
249
- lines.push('');
250
- lines.push('─'.repeat(60));
251
- switch(request.type){
252
- case 'name_spelling':
253
- lines.push(`[Name Spelling Clarification]`);
254
- lines.push(`Context: ${request.context}`);
255
- lines.push(`Heard: "${request.term}"`);
256
- if (request.suggestion) {
257
- lines.push(`Suggested correction: "${request.suggestion}"`);
258
- }
259
- lines.push('');
260
- lines.push('Enter correct spelling (or press Enter to accept suggestion):');
261
- break;
262
- case 'new_person':
263
- lines.push(`[New Person Detected]`);
264
- lines.push(`Context: ${request.context}`);
265
- lines.push(`Name heard: "${request.term}"`);
266
- lines.push('');
267
- lines.push('Who is this person? (brief description, or press Enter to skip):');
268
- break;
269
- case 'new_project':
270
- // This case is handled by the wizard, but provide fallback prompt
271
- lines.push(`[Unknown Project/Term]`);
272
- lines.push(`Term: "${request.term}"`);
273
- if (request.context) {
274
- lines.push(`${request.context}`);
275
- }
276
- lines.push('');
277
- lines.push('Is this a new project? (Y/N, or Enter to skip):');
278
- break;
279
- case 'new_company':
280
- lines.push(`[New Company Detected]`);
281
- lines.push(`Context: ${request.context}`);
282
- lines.push(`Company name: "${request.term}"`);
283
- lines.push('');
284
- lines.push('Any notes about this company? (or press Enter to skip):');
285
- break;
286
- case 'new_term':
287
- lines.push(`[New Term Found]`);
288
- lines.push(`Context: ${request.context}`);
289
- lines.push(`Term: "${request.term}"`);
290
- lines.push('');
291
- lines.push('What does this term mean? (brief description, or press Enter to skip):');
292
- break;
293
- case 'routing_decision':
294
- lines.push(`[Routing Decision Required]`);
295
- lines.push(`Context: ${request.context}`);
296
- if (request.options && request.options.length > 0) {
297
- lines.push('Available destinations:');
298
- request.options.forEach((opt, i)=>{
299
- lines.push(` ${i + 1}. ${opt}`);
300
- });
301
- lines.push('');
302
- lines.push('Enter number or destination path:');
303
- } else {
304
- lines.push('');
305
- lines.push('Where should this note be filed?');
306
- }
307
- break;
308
- case 'low_confidence_routing':
309
- lines.push(`[Confirm Note Routing]`);
310
- lines.push(`Confidence: ${request.term}`);
311
- lines.push(`${request.context}`);
312
- lines.push('');
313
- lines.push('Is this correct? (Y/Enter to accept, or enter different path):');
314
- break;
315
- case 'first_run_onboarding':
316
- lines.push(`[First Run Setup]`);
317
- lines.push(`${request.context}`);
318
- lines.push('');
319
- if (request.options && request.options.length > 0) {
320
- request.options.forEach((opt, i)=>{
321
- lines.push(` ${i + 1}. ${opt}`);
322
- });
323
- lines.push('');
324
- lines.push('Enter your choice:');
325
- } else {
326
- lines.push('Enter your response:');
327
- }
328
- break;
329
- case 'general':
330
- default:
331
- lines.push(`[Clarification Needed]`);
332
- lines.push(`${request.context}`);
333
- if (request.term) {
334
- lines.push(`Term: "${request.term}"`);
335
- }
336
- if (request.suggestion) {
337
- lines.push(`Suggested spelling: "${request.suggestion}"`);
338
- lines.push('');
339
- lines.push('Press Enter or Y to accept suggestion, or type alternative:');
340
- } else {
341
- lines.push('');
342
- lines.push('Your response:');
343
- }
344
- break;
345
- }
346
- lines.push('─'.repeat(60));
347
- return lines.join('\n') + '\n> ';
348
- };
349
- const create = (config)=>{
350
- var _config_silent;
351
- const logger = getLogger();
352
- const sound = create$1({
353
- silent: (_config_silent = config.silent) !== null && _config_silent !== void 0 ? _config_silent : false
354
- });
355
- let session = null;
356
- let rl = null;
357
- const startSession = ()=>{
358
- session = {
359
- requests: [],
360
- responses: [],
361
- startedAt: new Date()
362
- };
363
- // Check if we can run interactively:
364
- // 1. Interactive mode must be enabled (not --batch)
365
- // 2. stdin must be a TTY (not piped/cron/etc)
366
- const isTTY = process.stdin.isTTY === true;
367
- if (config.enabled && isTTY) {
368
- // Only create readline interface if one doesn't already exist
369
- // This prevents duplicate input handlers when processing multiple files
370
- if (!rl) {
371
- rl = createReadlineInterface();
372
- logger.info('Interactive session started - will prompt for clarifications');
373
- } else {
374
- logger.debug('Interactive session continued (readline already active)');
375
- }
376
- } else if (config.enabled && !isTTY) {
377
- logger.info('Interactive mode enabled but stdin is not a TTY - running in auto-resolve mode');
378
- } else {
379
- logger.debug('Interactive session started (batch mode)');
380
- }
381
- };
382
- const endSession = ()=>{
383
- if (!session) {
384
- throw new Error('No active session');
385
- }
386
- if (rl) {
387
- // Remove all listeners before closing to prevent any lingering handlers
388
- // Check if method exists (may not in mocks)
389
- if (typeof rl.removeAllListeners === 'function') {
390
- rl.removeAllListeners();
391
- }
392
- rl.close();
393
- rl = null;
394
- // Resume stdin in case it was paused
395
- if (process.stdin.isPaused && process.stdin.isPaused()) {
396
- process.stdin.resume();
397
- }
398
- }
399
- session.completedAt = new Date();
400
- const completed = session;
401
- session = null;
402
- logger.info('Interactive session ended', {
403
- requests: completed.requests.length,
404
- responses: completed.responses.length
405
- });
406
- return completed;
407
- };
408
- const handleClarification = async (request)=>{
409
- if (session) {
410
- session.requests.push(request);
411
- }
412
- // In non-interactive mode, return the suggestion or the original term
413
- if (!config.enabled || !rl) {
414
- const response = {
415
- type: request.type,
416
- term: request.term,
417
- response: request.suggestion ? request.suggestion : request.term,
418
- shouldRemember: false
419
- };
420
- if (session) {
421
- session.responses.push(response);
422
- }
423
- logger.debug('Clarification auto-resolved (non-interactive)', {
424
- type: request.type,
425
- term: request.term,
426
- response: response.response
427
- });
428
- return response;
429
- }
430
- // Interactive mode - actually prompt the user
431
- // Play notification sound to get user's attention (like Cursor does)
432
- await sound.playNotification();
433
- // Special handling for new_project - use wizard
434
- if (request.type === 'new_project') {
435
- const wizardResult = await runNewProjectWizard(rl, request.term, request.context, request.options);
436
- const response = {
437
- type: request.type,
438
- term: request.term,
439
- response: wizardResult.action,
440
- shouldRemember: wizardResult.action !== 'skip',
441
- additionalInfo: wizardResult
442
- };
443
- if (session) {
444
- session.responses.push(response);
445
- }
446
- logger.debug('New project wizard completed', {
447
- term: request.term,
448
- action: wizardResult.action,
449
- additionalInfo: wizardResult
450
- });
451
- return response;
452
- }
453
- // Special handling for new_person - use wizard
454
- if (request.type === 'new_person') {
455
- const wizardResult = await runNewPersonWizard(rl, request.term, request.context, request.options);
456
- const response = {
457
- type: request.type,
458
- term: request.term,
459
- response: wizardResult.action,
460
- shouldRemember: wizardResult.action !== 'skip',
461
- additionalInfo: wizardResult
462
- };
463
- if (session) {
464
- session.responses.push(response);
465
- }
466
- logger.debug('New person wizard completed', {
467
- term: request.term,
468
- action: wizardResult.action,
469
- additionalInfo: wizardResult
470
- });
471
- return response;
472
- }
473
- // Standard single-prompt flow for other types
474
- const prompt = formatClarificationPrompt(request);
475
- const userInput = await askQuestion(rl, prompt);
476
- // Process the user's response
477
- let finalResponse;
478
- let shouldRemember = false;
479
- if (userInput === '' || userInput.toLowerCase() === 'y') {
480
- // User pressed Enter or typed Y - use suggestion or original
481
- finalResponse = request.suggestion || request.term;
482
- } else if (request.options && /^\d+$/.test(userInput)) {
483
- // User entered a number - select from options
484
- const index = parseInt(userInput, 10) - 1;
485
- if (index >= 0 && index < request.options.length) {
486
- finalResponse = request.options[index];
487
- } else {
488
- finalResponse = userInput;
489
- }
490
- } else {
491
- finalResponse = userInput;
492
- // If user provided a custom answer, they might want to remember it
493
- shouldRemember = true;
494
- }
495
- const response = {
496
- type: request.type,
497
- term: request.term,
498
- response: finalResponse,
499
- shouldRemember
500
- };
501
- if (session) {
502
- session.responses.push(response);
503
- }
504
- logger.debug('Clarification resolved via user input', {
505
- type: request.type,
506
- term: request.term,
507
- response: response.response,
508
- shouldRemember
509
- });
510
- return response;
511
- };
512
- const isEnabled = ()=>config.enabled;
513
- const getSession = ()=>session;
514
- return {
515
- startSession,
516
- endSession,
517
- handleClarification,
518
- isEnabled,
519
- getSession
520
- };
521
- };
522
-
523
- export { create };
524
- //# sourceMappingURL=handler.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"handler.js","sources":["../../src/interactive/handler.ts"],"sourcesContent":["/**\n * Interactive Handler\n * \n * Manages interactive sessions and clarification requests.\n * Uses readline for actual user prompting.\n * Plays notification sounds when user input is needed (like Cursor).\n */\n\nimport * as readline from 'readline';\nimport { \n InteractiveConfig, \n InteractiveSession, \n ClarificationRequest, \n ClarificationResponse,\n NewProjectWizardResult,\n NewPersonWizardResult,\n} from './types';\nimport * as Logging from '../logging';\nimport * as Sound from '../util/sound';\n\nexport interface HandlerInstance {\n startSession(): void;\n endSession(): InteractiveSession;\n handleClarification(request: ClarificationRequest): Promise<ClarificationResponse>;\n isEnabled(): boolean;\n getSession(): InteractiveSession | null;\n}\n\nconst createReadlineInterface = () => {\n // Ensure stdin is in the correct mode for readline\n // This helps prevent issues with some terminal emulators\n if (process.stdin.setRawMode) {\n try {\n // Ensure we're NOT in raw mode - readline handles this itself\n process.stdin.setRawMode(false);\n } catch {\n // Ignore errors - some environments don't support setRawMode\n }\n }\n \n return readline.createInterface({\n input: process.stdin,\n output: process.stdout,\n terminal: true, // Explicitly enable terminal mode for proper echo handling\n });\n};\n\nconst askQuestion = (rl: readline.Interface, question: string): Promise<string> => {\n return new Promise((resolve) => {\n rl.question(question, (answer) => {\n resolve(answer.trim());\n });\n });\n};\n\n// Helper to write to stdout without triggering no-console lint rule\nconst write = (text: string) => process.stdout.write(text + '\\n');\n\n// Simplified project creation (used when creating project from term/person association)\nconst runCreateProjectFlow = async (\n rl: readline.Interface,\n contextMessage?: string\n): Promise<NewProjectWizardResult> => {\n if (contextMessage) {\n write('');\n write(contextMessage);\n }\n \n // Step 1: Project name (required)\n const projectName = await askQuestion(rl, '\\nProject name: ');\n \n if (!projectName) {\n write('Project name is required. Skipping project creation.');\n return { action: 'skip' };\n }\n \n // Step 2: Destination\n const destination = await askQuestion(rl, '\\nWhere should output be routed to? (Enter for default): ');\n \n // Step 3: Description\n const description = await askQuestion(rl, '\\nCan you tell me something about this project? (Enter to skip): ');\n \n return {\n action: 'create',\n projectName: projectName.trim(),\n destination: destination || undefined,\n description: description || undefined,\n };\n};\n\nconst runNewProjectWizard = async (\n rl: readline.Interface,\n term: string,\n context: string | undefined,\n projectOptions: string[] | undefined\n): Promise<NewProjectWizardResult> => {\n write('');\n write('─'.repeat(60));\n write(`[Unknown Project/Term]`);\n write(`Term: \"${term}\"`);\n write('');\n if (context) {\n // Display context with proper formatting (it now includes file info)\n write(context);\n }\n write('─'.repeat(60));\n \n // Step 1: Is this a project or a term?\n const entityType = await askQuestion(rl, '\\nIs this a Project or a Term? (P/T/X to ignore, or Enter to skip): ');\n \n if (entityType === '' || entityType.toLowerCase() === 's' || entityType.toLowerCase() === 'skip') {\n return { action: 'skip' };\n }\n \n // IGNORE FLOW - user doesn't want to be asked about this term again\n if (entityType.toLowerCase() === 'x' || entityType.toLowerCase() === 'i' || entityType.toLowerCase() === 'ignore') {\n write(`\\n[Adding \"${term}\" to ignore list - you won't be asked about this again]`);\n return { action: 'ignore', ignoredTerm: term };\n }\n \n // PROJECT FLOW\n if (entityType.toLowerCase() === 'p' || entityType.toLowerCase() === 'project') {\n // Step 2: Project name\n const projectName = await askQuestion(rl, `\\nWhat is this project's name? [${term}]: `);\n const finalName = projectName || term;\n \n // Step 3: Destination\n const destination = await askQuestion(rl, '\\nWhere should output be routed to? (Enter for default): ');\n \n // Step 4: Description\n const description = await askQuestion(rl, '\\nCan you tell me something about this project? (Enter to skip): ');\n \n return {\n action: 'create',\n projectName: finalName,\n destination: destination || undefined,\n description: description || undefined,\n };\n }\n \n // TERM FLOW\n if (entityType.toLowerCase() === 't' || entityType.toLowerCase() === 'term') {\n // Step 2: Validate spelling\n const termCorrection = await askQuestion(rl, `\\nIs \"${term}\" spelled correctly? (Enter to accept, or type correction): `);\n const finalTermName = termCorrection || term;\n \n if (termCorrection) {\n write(`Term updated to: \"${finalTermName}\"`);\n }\n \n // Step 3: Is this an acronym?\n const expansion = await askQuestion(rl, `\\nIf \"${finalTermName}\" is an acronym, what does it stand for? (Enter to skip): `);\n \n // Step 4: Which project(s) is this term associated with?\n const termProjects: number[] = [];\n let createdProject: NewProjectWizardResult | undefined;\n \n if (projectOptions && projectOptions.length > 0) {\n write('\\nExisting projects:');\n projectOptions.forEach((opt, i) => {\n write(` ${i + 1}. ${opt}`);\n });\n write(` N. Create a new project`);\n \n const projectSelection = await askQuestion(rl, `\\nWhich project(s) is \"${finalTermName}\" associated with? (Enter numbers separated by commas, N for new, or Enter to skip): `);\n \n if (projectSelection.toLowerCase().includes('n')) {\n // User wants to create a new project to associate with this term\n write('');\n write(`[Create New Project for Term \"${finalTermName}\"]`);\n createdProject = await runCreateProjectFlow(rl, `The term \"${finalTermName}\" will be associated with this new project.`);\n \n if (createdProject.action === 'create' && createdProject.projectName) {\n write(`\\n[Project \"${createdProject.projectName}\" will be created and associated with term \"${finalTermName}\"]`);\n }\n } else if (projectSelection) {\n const indices = projectSelection.split(',').map(s => parseInt(s.trim(), 10) - 1);\n for (const idx of indices) {\n if (!isNaN(idx) && idx >= 0 && idx < projectOptions.length) {\n termProjects.push(idx);\n }\n }\n \n if (termProjects.length > 0) {\n write(`Associated with: ${termProjects.map(i => projectOptions[i].split(' - ')[0]).join(', ')}`);\n }\n }\n } else {\n // No existing projects - offer to create one\n const createNew = await askQuestion(rl, `\\nNo existing projects found. Create a new project for term \"${finalTermName}\"? (Y/N, or Enter to skip): `);\n \n if (createNew.toLowerCase() === 'y' || createNew.toLowerCase() === 'yes') {\n write('');\n write(`[Create New Project for Term \"${finalTermName}\"]`);\n createdProject = await runCreateProjectFlow(rl, `The term \"${finalTermName}\" will be associated with this new project.`);\n \n if (createdProject.action === 'create' && createdProject.projectName) {\n write(`\\n[Project \"${createdProject.projectName}\" will be created and associated with term \"${finalTermName}\"]`);\n }\n }\n }\n \n // Step 5: Description\n const termDesc = await askQuestion(rl, `\\nBrief description of \"${finalTermName}\"? (Enter to skip): `);\n \n return {\n action: 'term',\n termName: finalTermName,\n termExpansion: expansion || undefined,\n termProjects: termProjects.length > 0 ? termProjects : undefined,\n termDescription: termDesc || undefined,\n createdProject,\n };\n }\n \n // Unrecognized input\n write('\\nUnrecognized input. Please enter P for Project, T for Term, or press Enter to skip.');\n return { action: 'skip' };\n};\n\nconst runNewPersonWizard = async (\n rl: readline.Interface,\n name: string,\n context: string | undefined,\n projectOptions: string[] | undefined\n): Promise<NewPersonWizardResult> => {\n write('');\n write('─'.repeat(60));\n write(`[Unknown Person Detected]`);\n write(`Name heard: \"${name}\"`);\n write('');\n if (context) {\n // Display context with proper formatting (it now includes file info)\n write(context);\n }\n write('─'.repeat(60));\n \n // Step 1: Confirm name spelling\n const nameCorrection = await askQuestion(rl, `\\nIs the name spelled correctly? (Enter to accept, or type correction): `);\n const finalName = nameCorrection || name;\n \n if (nameCorrection) {\n write(`Name updated to: \"${finalName}\"`);\n }\n \n // Step 2: Ask for organization/company\n const organization = await askQuestion(rl, `\\nWhat organization/company is ${finalName} with? (Enter to skip): `);\n \n // Step 3: Project association\n let linkedProjectIndex: number | undefined;\n let createdProject: NewProjectWizardResult | undefined;\n \n // Show project options with \"N\" for new project\n if (projectOptions && projectOptions.length > 0) {\n write('\\nExisting projects:');\n projectOptions.forEach((opt, i) => {\n write(` ${i + 1}. ${opt}`);\n });\n write(` N. Create a new project`);\n \n const projectSelection = await askQuestion(rl, `\\nWhich project is ${finalName} related to? (Enter number, N for new, or Enter to skip): `);\n \n if (projectSelection.toLowerCase() === 'n') {\n // User wants to create a new project for this person\n write('');\n write(`[Create New Project for ${finalName}]`);\n const contextMsg = organization \n ? `Creating project for ${finalName} (${organization})`\n : `Creating project for ${finalName}`;\n createdProject = await runCreateProjectFlow(rl, contextMsg);\n \n if (createdProject.action === 'create' && createdProject.projectName) {\n write(`\\n[Project \"${createdProject.projectName}\" will be created and linked to ${finalName}]`);\n }\n } else if (projectSelection && /^\\d+$/.test(projectSelection)) {\n const idx = parseInt(projectSelection, 10) - 1;\n if (idx >= 0 && idx < projectOptions.length) {\n linkedProjectIndex = idx;\n write(`Linked to: ${projectOptions[idx]}`);\n }\n }\n } else {\n // No existing projects - offer to create one\n const createNew = await askQuestion(rl, `\\nNo existing projects found. Create a new project for ${finalName}? (Y/N, or Enter to skip): `);\n \n if (createNew.toLowerCase() === 'y' || createNew.toLowerCase() === 'yes') {\n write('');\n write(`[Create New Project for ${finalName}]`);\n const contextMsg = organization \n ? `Creating project for ${finalName} (${organization})`\n : `Creating project for ${finalName}`;\n createdProject = await runCreateProjectFlow(rl, contextMsg);\n \n if (createdProject.action === 'create' && createdProject.projectName) {\n write(`\\n[Project \"${createdProject.projectName}\" will be created and linked to ${finalName}]`);\n }\n }\n }\n \n // Step 4: Ask for notes about the person\n const notes = await askQuestion(rl, `\\nAny notes about ${finalName}? (Enter to skip): `);\n \n // Determine if we should create the person\n const hasInfo = organization || linkedProjectIndex !== undefined || createdProject || notes;\n \n if (!hasInfo) {\n // User skipped everything - confirm if they want to skip entirely\n const confirm = await askQuestion(rl, `\\nNo information provided. Skip saving ${finalName}? (Enter to skip, or any key to save anyway): `);\n if (confirm === '') {\n return { action: 'skip' };\n }\n }\n \n return {\n action: 'create',\n personName: finalName,\n organization: organization || undefined,\n linkedProjectIndex,\n notes: notes || undefined,\n createdProject,\n };\n};\n\nconst formatClarificationPrompt = (request: ClarificationRequest): string => {\n const lines: string[] = [];\n \n lines.push('');\n lines.push('─'.repeat(60));\n \n switch (request.type) {\n case 'name_spelling':\n lines.push(`[Name Spelling Clarification]`);\n lines.push(`Context: ${request.context}`);\n lines.push(`Heard: \"${request.term}\"`);\n if (request.suggestion) {\n lines.push(`Suggested correction: \"${request.suggestion}\"`);\n }\n lines.push('');\n lines.push('Enter correct spelling (or press Enter to accept suggestion):');\n break;\n \n case 'new_person':\n lines.push(`[New Person Detected]`);\n lines.push(`Context: ${request.context}`);\n lines.push(`Name heard: \"${request.term}\"`);\n lines.push('');\n lines.push('Who is this person? (brief description, or press Enter to skip):');\n break;\n \n case 'new_project':\n // This case is handled by the wizard, but provide fallback prompt\n lines.push(`[Unknown Project/Term]`);\n lines.push(`Term: \"${request.term}\"`);\n if (request.context) {\n lines.push(`${request.context}`);\n }\n lines.push('');\n lines.push('Is this a new project? (Y/N, or Enter to skip):');\n break;\n \n case 'new_company':\n lines.push(`[New Company Detected]`);\n lines.push(`Context: ${request.context}`);\n lines.push(`Company name: \"${request.term}\"`);\n lines.push('');\n lines.push('Any notes about this company? (or press Enter to skip):');\n break;\n \n case 'new_term':\n lines.push(`[New Term Found]`);\n lines.push(`Context: ${request.context}`);\n lines.push(`Term: \"${request.term}\"`);\n lines.push('');\n lines.push('What does this term mean? (brief description, or press Enter to skip):');\n break;\n \n case 'routing_decision':\n lines.push(`[Routing Decision Required]`);\n lines.push(`Context: ${request.context}`);\n if (request.options && request.options.length > 0) {\n lines.push('Available destinations:');\n request.options.forEach((opt, i) => {\n lines.push(` ${i + 1}. ${opt}`);\n });\n lines.push('');\n lines.push('Enter number or destination path:');\n } else {\n lines.push('');\n lines.push('Where should this note be filed?');\n }\n break;\n \n case 'low_confidence_routing':\n lines.push(`[Confirm Note Routing]`);\n lines.push(`Confidence: ${request.term}`);\n lines.push(`${request.context}`);\n lines.push('');\n lines.push('Is this correct? (Y/Enter to accept, or enter different path):');\n break;\n \n case 'first_run_onboarding':\n lines.push(`[First Run Setup]`);\n lines.push(`${request.context}`);\n lines.push('');\n if (request.options && request.options.length > 0) {\n request.options.forEach((opt, i) => {\n lines.push(` ${i + 1}. ${opt}`);\n });\n lines.push('');\n lines.push('Enter your choice:');\n } else {\n lines.push('Enter your response:');\n }\n break;\n \n case 'general':\n default:\n lines.push(`[Clarification Needed]`);\n lines.push(`${request.context}`);\n if (request.term) {\n lines.push(`Term: \"${request.term}\"`);\n }\n if (request.suggestion) {\n lines.push(`Suggested spelling: \"${request.suggestion}\"`);\n lines.push('');\n lines.push('Press Enter or Y to accept suggestion, or type alternative:');\n } else {\n lines.push('');\n lines.push('Your response:');\n }\n break;\n }\n \n lines.push('─'.repeat(60));\n \n return lines.join('\\n') + '\\n> ';\n};\n\nexport const create = (config: InteractiveConfig): HandlerInstance => {\n const logger = Logging.getLogger();\n const sound = Sound.create({ silent: config.silent ?? false });\n \n let session: InteractiveSession | null = null;\n let rl: readline.Interface | null = null;\n \n const startSession = () => {\n session = {\n requests: [],\n responses: [],\n startedAt: new Date(),\n };\n \n // Check if we can run interactively:\n // 1. Interactive mode must be enabled (not --batch)\n // 2. stdin must be a TTY (not piped/cron/etc)\n const isTTY = process.stdin.isTTY === true;\n \n if (config.enabled && isTTY) {\n // Only create readline interface if one doesn't already exist\n // This prevents duplicate input handlers when processing multiple files\n if (!rl) {\n rl = createReadlineInterface();\n logger.info('Interactive session started - will prompt for clarifications');\n } else {\n logger.debug('Interactive session continued (readline already active)');\n }\n } else if (config.enabled && !isTTY) {\n logger.info('Interactive mode enabled but stdin is not a TTY - running in auto-resolve mode');\n } else {\n logger.debug('Interactive session started (batch mode)');\n }\n };\n \n const endSession = (): InteractiveSession => {\n if (!session) {\n throw new Error('No active session');\n }\n \n if (rl) {\n // Remove all listeners before closing to prevent any lingering handlers\n // Check if method exists (may not in mocks)\n if (typeof rl.removeAllListeners === 'function') {\n rl.removeAllListeners();\n }\n rl.close();\n rl = null;\n \n // Resume stdin in case it was paused\n if (process.stdin.isPaused && process.stdin.isPaused()) {\n process.stdin.resume();\n }\n }\n \n session.completedAt = new Date();\n const completed = session;\n session = null;\n \n logger.info('Interactive session ended', { \n requests: completed.requests.length,\n responses: completed.responses.length,\n });\n \n return completed;\n };\n \n const handleClarification = async (\n request: ClarificationRequest\n ): Promise<ClarificationResponse> => {\n if (session) {\n session.requests.push(request);\n }\n \n // In non-interactive mode, return the suggestion or the original term\n if (!config.enabled || !rl) {\n const response: ClarificationResponse = {\n type: request.type,\n term: request.term,\n response: config.defaultToSuggestion && request.suggestion \n ? request.suggestion \n : request.term,\n shouldRemember: false,\n };\n \n if (session) {\n session.responses.push(response);\n }\n \n logger.debug('Clarification auto-resolved (non-interactive)', { \n type: request.type, \n term: request.term,\n response: response.response,\n });\n \n return response;\n }\n \n // Interactive mode - actually prompt the user\n // Play notification sound to get user's attention (like Cursor does)\n await sound.playNotification();\n \n // Special handling for new_project - use wizard\n if (request.type === 'new_project') {\n const wizardResult = await runNewProjectWizard(\n rl,\n request.term,\n request.context,\n request.options\n );\n \n const response: ClarificationResponse = {\n type: request.type,\n term: request.term,\n response: wizardResult.action,\n shouldRemember: wizardResult.action !== 'skip',\n additionalInfo: wizardResult as unknown as Record<string, unknown>,\n };\n \n if (session) {\n session.responses.push(response);\n }\n \n logger.debug('New project wizard completed', {\n term: request.term,\n action: wizardResult.action,\n additionalInfo: wizardResult,\n });\n \n return response;\n }\n \n // Special handling for new_person - use wizard\n if (request.type === 'new_person') {\n const wizardResult = await runNewPersonWizard(\n rl,\n request.term,\n request.context,\n request.options\n );\n \n const response: ClarificationResponse = {\n type: request.type,\n term: request.term,\n response: wizardResult.action,\n shouldRemember: wizardResult.action !== 'skip',\n additionalInfo: wizardResult as unknown as Record<string, unknown>,\n };\n \n if (session) {\n session.responses.push(response);\n }\n \n logger.debug('New person wizard completed', {\n term: request.term,\n action: wizardResult.action,\n additionalInfo: wizardResult,\n });\n \n return response;\n }\n \n // Standard single-prompt flow for other types\n const prompt = formatClarificationPrompt(request);\n const userInput = await askQuestion(rl, prompt);\n \n // Process the user's response\n let finalResponse: string;\n let shouldRemember = false;\n \n if (userInput === '' || userInput.toLowerCase() === 'y') {\n // User pressed Enter or typed Y - use suggestion or original\n finalResponse = request.suggestion || request.term;\n } else if (request.options && /^\\d+$/.test(userInput)) {\n // User entered a number - select from options\n const index = parseInt(userInput, 10) - 1;\n if (index >= 0 && index < request.options.length) {\n finalResponse = request.options[index];\n } else {\n finalResponse = userInput;\n }\n } else {\n finalResponse = userInput;\n // If user provided a custom answer, they might want to remember it\n shouldRemember = true;\n }\n \n const response: ClarificationResponse = {\n type: request.type,\n term: request.term,\n response: finalResponse,\n shouldRemember,\n };\n \n if (session) {\n session.responses.push(response);\n }\n \n logger.debug('Clarification resolved via user input', { \n type: request.type, \n term: request.term,\n response: response.response,\n shouldRemember,\n });\n \n return response;\n };\n \n const isEnabled = () => config.enabled;\n \n const getSession = () => session;\n \n return {\n startSession,\n endSession,\n handleClarification,\n isEnabled,\n getSession,\n };\n};\n"],"names":["createReadlineInterface","process","stdin","setRawMode","readline","createInterface","input","output","stdout","terminal","askQuestion","rl","question","Promise","resolve","answer","trim","write","text","runCreateProjectFlow","contextMessage","projectName","action","destination","description","undefined","runNewProjectWizard","term","context","projectOptions","repeat","entityType","toLowerCase","ignoredTerm","finalName","termCorrection","finalTermName","expansion","termProjects","createdProject","length","forEach","opt","i","projectSelection","includes","indices","split","map","s","parseInt","idx","isNaN","push","join","createNew","termDesc","termName","termExpansion","termDescription","runNewPersonWizard","name","nameCorrection","organization","linkedProjectIndex","contextMsg","test","notes","hasInfo","confirm","personName","formatClarificationPrompt","request","lines","type","suggestion","options","create","config","logger","Logging","sound","Sound","silent","session","startSession","requests","responses","startedAt","Date","isTTY","enabled","info","debug","endSession","Error","removeAllListeners","close","isPaused","resume","completedAt","completed","handleClarification","response","shouldRemember","playNotification","wizardResult","additionalInfo","prompt","userInput","finalResponse","index","isEnabled","getSession"],"mappings":"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"}
@@ -1,18 +0,0 @@
1
- import { create as create$2 } from './handler.js';
2
- import { create as create$1 } from './onboarding.js';
3
-
4
- const create = (config, context)=>{
5
- const handler = create$2(config);
6
- const onboarding = create$1(context);
7
- return {
8
- startSession: handler.startSession,
9
- endSession: handler.endSession,
10
- getSession: handler.getSession,
11
- handleClarification: handler.handleClarification,
12
- isEnabled: handler.isEnabled,
13
- checkNeedsOnboarding: onboarding.checkNeedsOnboarding
14
- };
15
- };
16
-
17
- export { create };
18
- //# sourceMappingURL=index.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.js","sources":["../../src/interactive/index.ts"],"sourcesContent":["/**\n * Interactive Mode System\n * \n * Main entry point for the interactive mode system. Provides session management,\n * clarification handling, and onboarding detection.\n */\n\nimport { \n InteractiveConfig, \n InteractiveSession, \n ClarificationRequest, \n ClarificationResponse,\n OnboardingState \n} from './types';\nimport * as Handler from './handler';\nimport * as Onboarding from './onboarding';\nimport * as Context from '../context';\n\nexport interface InteractiveInstance {\n // Session management\n startSession(): void;\n endSession(): InteractiveSession;\n getSession(): InteractiveSession | null;\n \n // Clarification handling\n handleClarification(request: ClarificationRequest): Promise<ClarificationResponse>;\n \n // State\n isEnabled(): boolean;\n \n // Onboarding\n checkNeedsOnboarding(): OnboardingState;\n}\n\nexport const create = (\n config: InteractiveConfig,\n context: Context.ContextInstance\n): InteractiveInstance => {\n const handler = Handler.create(config);\n const onboarding = Onboarding.create(context);\n \n return {\n startSession: handler.startSession,\n endSession: handler.endSession,\n getSession: handler.getSession,\n handleClarification: handler.handleClarification,\n isEnabled: handler.isEnabled,\n checkNeedsOnboarding: onboarding.checkNeedsOnboarding,\n };\n};\n\n// Re-export types\nexport * from './types';\n\n// Re-export utilities\nexport { createDefaultOnboardingResult } from './onboarding';\n\n"],"names":["create","config","context","handler","Handler","onboarding","Onboarding","startSession","endSession","getSession","handleClarification","isEnabled","checkNeedsOnboarding"],"mappings":";;;AAkCO,MAAMA,MAAAA,GAAS,CAClBC,MAAAA,EACAC,OAAAA,GAAAA;IAEA,MAAMC,OAAAA,GAAUC,QAAc,CAACH,MAAAA,CAAAA;IAC/B,MAAMI,UAAAA,GAAaC,QAAiB,CAACJ,OAAAA,CAAAA;IAErC,OAAO;AACHK,QAAAA,YAAAA,EAAcJ,QAAQI,YAAY;AAClCC,QAAAA,UAAAA,EAAYL,QAAQK,UAAU;AAC9BC,QAAAA,UAAAA,EAAYN,QAAQM,UAAU;AAC9BC,QAAAA,mBAAAA,EAAqBP,QAAQO,mBAAmB;AAChDC,QAAAA,SAAAA,EAAWR,QAAQQ,SAAS;AAC5BC,QAAAA,oBAAAA,EAAsBP,WAAWO;AACrC,KAAA;AACJ;;;;"}