@redaksjon/protokoll-engine 0.1.3 → 0.1.4-dev.20260216151443.e1454c9
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/dist/agentic/executor.d.ts.map +1 -1
- package/dist/agentic/types.d.ts +4 -1
- package/dist/agentic/types.d.ts.map +1 -1
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +8 -5
- package/dist/index.js.map +1 -1
- package/dist/index10.js +4 -3
- package/dist/index10.js.map +1 -1
- package/dist/index11.js +2 -2
- package/dist/index12.js +3 -124
- package/dist/index12.js.map +1 -1
- package/dist/index13.js +101 -100
- package/dist/index13.js.map +1 -1
- package/dist/index14.js +109 -281
- package/dist/index14.js.map +1 -1
- package/dist/index15.js +285 -89
- package/dist/index15.js.map +1 -1
- package/dist/index16.js +97 -104
- package/dist/index16.js.map +1 -1
- package/dist/index17.js +18 -179
- package/dist/index17.js.map +1 -1
- package/dist/index18.js +102 -48
- package/dist/index18.js.map +1 -1
- package/dist/index19.js +182 -16
- package/dist/index19.js.map +1 -1
- package/dist/index2.js +3 -3
- package/dist/index20.js +48 -100
- package/dist/index20.js.map +1 -1
- package/dist/index21.js +16 -23
- package/dist/index21.js.map +1 -1
- package/dist/index22.js +98 -42
- package/dist/index22.js.map +1 -1
- package/dist/index23.js +19 -112
- package/dist/index23.js.map +1 -1
- package/dist/index24.js +42 -323
- package/dist/index24.js.map +1 -1
- package/dist/index25.js +114 -52
- package/dist/index25.js.map +1 -1
- package/dist/index26.js +339 -37
- package/dist/index26.js.map +1 -1
- package/dist/index27.js +51 -121
- package/dist/index27.js.map +1 -1
- package/dist/index28.js +36 -155
- package/dist/index28.js.map +1 -1
- package/dist/index29.js +114 -150
- package/dist/index29.js.map +1 -1
- package/dist/index3.js +2 -2
- package/dist/index30.js +171 -161
- package/dist/index30.js.map +1 -1
- package/dist/index31.js +141 -401
- package/dist/index31.js.map +1 -1
- package/dist/index32.js +158 -146
- package/dist/index32.js.map +1 -1
- package/dist/index33.js +425 -130
- package/dist/index33.js.map +1 -1
- package/dist/index34.js +145 -40
- package/dist/index34.js.map +1 -1
- package/dist/index35.js +159 -83
- package/dist/index35.js.map +1 -1
- package/dist/index36.js +46 -439
- package/dist/index36.js.map +1 -1
- package/dist/index37.js +91 -419
- package/dist/index37.js.map +1 -1
- package/dist/index38.js +447 -66
- package/dist/index38.js.map +1 -1
- package/dist/index39.js +424 -115
- package/dist/index39.js.map +1 -1
- package/dist/index4.js +2 -2
- package/dist/index40.js +78 -290
- package/dist/index40.js.map +1 -1
- package/dist/index41.js +112 -44
- package/dist/index41.js.map +1 -1
- package/dist/index42.js +115 -44
- package/dist/index42.js.map +1 -1
- package/dist/index43.js +295 -35
- package/dist/index43.js.map +1 -1
- package/dist/index44.js +270 -218
- package/dist/index44.js.map +1 -1
- package/dist/index45.js +131 -150
- package/dist/index45.js.map +1 -1
- package/dist/index46.js +117 -73
- package/dist/index46.js.map +1 -1
- package/dist/index47.js +45 -74
- package/dist/index47.js.map +1 -1
- package/dist/index48.js +48 -5
- package/dist/index48.js.map +1 -1
- package/dist/index49.js +33 -145
- package/dist/index49.js.map +1 -1
- package/dist/index5.js +3 -3
- package/dist/index50.js +216 -203
- package/dist/index50.js.map +1 -1
- package/dist/index51.js +153 -39
- package/dist/index51.js.map +1 -1
- package/dist/index52.js +74 -38
- package/dist/index52.js.map +1 -1
- package/dist/index53.js +74 -33
- package/dist/index53.js.map +1 -1
- package/dist/index54.js +149 -6
- package/dist/index54.js.map +1 -1
- package/dist/index55.js +224 -6
- package/dist/index55.js.map +1 -1
- package/dist/index56.js +42 -143
- package/dist/index56.js.map +1 -1
- package/dist/index57.js +43 -15
- package/dist/index57.js.map +1 -1
- package/dist/index58.js +35 -2
- package/dist/index58.js.map +1 -1
- package/dist/index59.js +5 -14
- package/dist/index59.js.map +1 -1
- package/dist/index6.js +4 -4
- package/dist/index6.js.map +1 -1
- package/dist/index60.js +6 -2
- package/dist/index60.js.map +1 -1
- package/dist/index61.js +6 -4
- package/dist/index61.js.map +1 -1
- package/dist/index62.js +151 -0
- package/dist/index62.js.map +1 -0
- package/dist/index63.js +17 -0
- package/dist/index63.js.map +1 -0
- package/dist/index64.js +4 -0
- package/dist/index64.js.map +1 -0
- package/dist/index65.js +17 -0
- package/dist/index65.js.map +1 -0
- package/dist/index66.js +4 -0
- package/dist/index66.js.map +1 -0
- package/dist/index67.js +6 -0
- package/dist/index67.js.map +1 -0
- package/dist/index7.js +2 -2
- package/dist/index8.js +1 -1
- package/dist/index9.js +4 -4
- package/dist/phases/simple-replace.d.ts +2 -1
- package/dist/phases/simple-replace.d.ts.map +1 -1
- package/dist/pipeline/orchestrator.d.ts.map +1 -1
- package/dist/pipeline/types.d.ts +3 -0
- package/dist/pipeline/types.d.ts.map +1 -1
- package/dist/routing/classifier.d.ts +2 -1
- package/dist/routing/classifier.d.ts.map +1 -1
- package/dist/routing/index.d.ts +2 -1
- package/dist/routing/index.d.ts.map +1 -1
- package/dist/routing/types.d.ts +1 -1
- package/dist/routing/types.d.ts.map +1 -1
- package/dist/transcript/index.d.ts +1 -0
- package/dist/transcript/index.d.ts.map +1 -1
- package/dist/transcript/operations.d.ts +14 -1
- package/dist/transcript/operations.d.ts.map +1 -1
- package/dist/transcript/upload-utils.d.ts +80 -0
- package/dist/transcript/upload-utils.d.ts.map +1 -0
- package/dist/util/enhancement-logger.d.ts +19 -0
- package/dist/util/enhancement-logger.d.ts.map +1 -0
- package/dist/util/metadata.d.ts +1 -0
- package/dist/util/metadata.d.ts.map +1 -1
- package/dist/weighting/builder.d.ts +126 -0
- package/dist/weighting/builder.d.ts.map +1 -0
- package/dist/weighting/index.d.ts +12 -0
- package/dist/weighting/index.d.ts.map +1 -0
- package/dist/weighting/prepositioning.d.ts +55 -0
- package/dist/weighting/prepositioning.d.ts.map +1 -0
- package/dist/weighting/provider.d.ts +78 -0
- package/dist/weighting/provider.d.ts.map +1 -0
- package/dist/weighting/types.d.ts +119 -0
- package/dist/weighting/types.d.ts.map +1 -0
- package/package.json +2 -2
package/dist/index54.js
CHANGED
|
@@ -1,8 +1,151 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
1
|
+
function extractNameContext(transcript, name) {
|
|
2
|
+
const lowerTranscript = transcript.toLowerCase();
|
|
3
|
+
const lowerName = name.toLowerCase();
|
|
4
|
+
const index = lowerTranscript.indexOf(lowerName);
|
|
5
|
+
if (index === -1) {
|
|
6
|
+
return null;
|
|
7
|
+
}
|
|
8
|
+
const sentenceBoundary = /[.!?]/;
|
|
9
|
+
let startIndex = 0;
|
|
10
|
+
let boundariesFound = 0;
|
|
11
|
+
for (let i = index - 1; i >= 0; i--) {
|
|
12
|
+
if (sentenceBoundary.test(transcript[i])) {
|
|
13
|
+
boundariesFound++;
|
|
14
|
+
if (boundariesFound === 2) {
|
|
15
|
+
startIndex = i + 1;
|
|
16
|
+
break;
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
let endIndex = transcript.length;
|
|
21
|
+
boundariesFound = 0;
|
|
22
|
+
for (let i = index + name.length; i < transcript.length; i++) {
|
|
23
|
+
if (sentenceBoundary.test(transcript[i])) {
|
|
24
|
+
boundariesFound++;
|
|
25
|
+
if (boundariesFound === 2) {
|
|
26
|
+
endIndex = i + 1;
|
|
27
|
+
break;
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
let context = transcript.substring(startIndex, endIndex).trim();
|
|
32
|
+
if (context.length > 300) {
|
|
33
|
+
const midPoint = context.indexOf(name);
|
|
34
|
+
if (midPoint !== -1) {
|
|
35
|
+
let sentenceStart = midPoint;
|
|
36
|
+
let sentenceEnd = midPoint + name.length;
|
|
37
|
+
for (let i = midPoint - 1; i >= 0; i--) {
|
|
38
|
+
if (sentenceBoundary.test(context[i])) {
|
|
39
|
+
sentenceStart = i + 1;
|
|
40
|
+
break;
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
for (let i = midPoint + name.length; i < context.length; i++) {
|
|
44
|
+
if (sentenceBoundary.test(context[i])) {
|
|
45
|
+
sentenceEnd = i + 1;
|
|
46
|
+
break;
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
context = context.substring(sentenceStart, sentenceEnd).trim();
|
|
50
|
+
} else {
|
|
51
|
+
context = context.substring(0, 300) + "...";
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
return context;
|
|
55
|
+
}
|
|
56
|
+
const create = (ctx) => ({
|
|
57
|
+
name: "lookup_person",
|
|
58
|
+
description: "Look up information about a person mentioned in the transcript. Use when you encounter a name that might need spelling verification or additional context.",
|
|
59
|
+
parameters: {
|
|
60
|
+
type: "object",
|
|
61
|
+
properties: {
|
|
62
|
+
name: {
|
|
63
|
+
type: "string",
|
|
64
|
+
description: "The name to look up (as heard in transcript)"
|
|
65
|
+
},
|
|
66
|
+
phonetic: {
|
|
67
|
+
type: "string",
|
|
68
|
+
description: "How the name sounds (for alias matching)"
|
|
69
|
+
}
|
|
70
|
+
},
|
|
71
|
+
required: ["name"]
|
|
72
|
+
},
|
|
73
|
+
execute: async (args) => {
|
|
74
|
+
const context = ctx.contextInstance;
|
|
75
|
+
if (ctx.resolvedEntities?.has(args.name)) {
|
|
76
|
+
const resolvedName = ctx.resolvedEntities.get(args.name);
|
|
77
|
+
return {
|
|
78
|
+
success: true,
|
|
79
|
+
data: {
|
|
80
|
+
found: true,
|
|
81
|
+
suggestion: `Already resolved: use "${resolvedName}"`,
|
|
82
|
+
cached: true
|
|
83
|
+
}
|
|
84
|
+
};
|
|
85
|
+
}
|
|
86
|
+
const people = context.search(args.name);
|
|
87
|
+
const personMatches = people.filter((e) => e.type === "person");
|
|
88
|
+
if (personMatches.length > 0) {
|
|
89
|
+
return {
|
|
90
|
+
success: true,
|
|
91
|
+
data: {
|
|
92
|
+
found: true,
|
|
93
|
+
person: personMatches[0],
|
|
94
|
+
suggestion: `Use "${personMatches[0].name}" for correct spelling`
|
|
95
|
+
}
|
|
96
|
+
};
|
|
97
|
+
}
|
|
98
|
+
if (args.phonetic) {
|
|
99
|
+
const person = context.findBySoundsLike(args.phonetic);
|
|
100
|
+
if (person) {
|
|
101
|
+
return {
|
|
102
|
+
success: true,
|
|
103
|
+
data: {
|
|
104
|
+
found: true,
|
|
105
|
+
person,
|
|
106
|
+
suggestion: `"${args.phonetic}" likely refers to "${person.name}"`
|
|
107
|
+
}
|
|
108
|
+
};
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
const allProjects = context.getAllProjects();
|
|
112
|
+
const projectOptions = allProjects.filter((p) => p.active !== false).map((p) => `${p.name}${p.description ? ` - ${p.description}` : ""}`);
|
|
113
|
+
const fileName = ctx.sourceFile.split("/").pop() || ctx.sourceFile;
|
|
114
|
+
const fileDate = ctx.audioDate.toLocaleString("en-US", {
|
|
115
|
+
weekday: "short",
|
|
116
|
+
year: "numeric",
|
|
117
|
+
month: "short",
|
|
118
|
+
day: "numeric",
|
|
119
|
+
hour: "2-digit",
|
|
120
|
+
minute: "2-digit"
|
|
121
|
+
});
|
|
122
|
+
const transcriptContext = extractNameContext(ctx.transcriptText, args.name);
|
|
123
|
+
const promptLines = [
|
|
124
|
+
`File: ${fileName}`,
|
|
125
|
+
`Date: ${fileDate}`,
|
|
126
|
+
"",
|
|
127
|
+
`Unknown person mentioned: "${args.name}"`
|
|
128
|
+
];
|
|
129
|
+
if (transcriptContext) {
|
|
130
|
+
promptLines.push("");
|
|
131
|
+
promptLines.push("Context from transcript:");
|
|
132
|
+
promptLines.push(`"${transcriptContext}"`);
|
|
133
|
+
}
|
|
134
|
+
return {
|
|
135
|
+
success: true,
|
|
136
|
+
needsUserInput: true,
|
|
137
|
+
userPrompt: promptLines.join("\n"),
|
|
138
|
+
data: {
|
|
139
|
+
found: false,
|
|
140
|
+
clarificationType: "new_person",
|
|
141
|
+
term: args.name,
|
|
142
|
+
message: `Person "${args.name}" not found. Asking user for details.`,
|
|
143
|
+
knownProjects: allProjects.filter((p) => p.active !== false),
|
|
144
|
+
options: projectOptions
|
|
145
|
+
}
|
|
146
|
+
};
|
|
147
|
+
}
|
|
148
|
+
});
|
|
3
149
|
|
|
4
|
-
|
|
5
|
-
const timezone = /*@__PURE__*/getDefaultExportFromCjs(timezoneExports);
|
|
6
|
-
|
|
7
|
-
export { timezone as default };
|
|
150
|
+
export { create };
|
|
8
151
|
//# sourceMappingURL=index54.js.map
|
package/dist/index54.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index54.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;"}
|
|
1
|
+
{"version":3,"file":"index54.js","sources":["../src/agentic/tools/lookup-person.ts"],"sourcesContent":["/**\n * Lookup Person Tool\n * \n * Looks up information about a person mentioned in the transcript.\n */\n\nimport { TranscriptionTool, ToolContext, ToolResult } from '../types';\n\n/**\n * Extract context from transcript around where a name is mentioned.\n * Returns approximately one sentence before and after the name mention.\n */\nfunction extractNameContext(transcript: string, name: string): string | null {\n // Case-insensitive search for the name\n const lowerTranscript = transcript.toLowerCase();\n const lowerName = name.toLowerCase();\n const index = lowerTranscript.indexOf(lowerName);\n \n if (index === -1) {\n return null;\n }\n \n // Define strong sentence boundaries (., !, ?)\n const sentenceBoundary = /[.!?]/;\n \n // Look backwards for the start (find the sentence boundary 1 sentence before)\n let startIndex = 0;\n let boundariesFound = 0;\n for (let i = index - 1; i >= 0; i--) {\n if (sentenceBoundary.test(transcript[i])) {\n boundariesFound++;\n // After finding first boundary (end of current sentence), \n // keep looking for the second (end of previous sentence)\n if (boundariesFound === 2) {\n // Start after this boundary\n startIndex = i + 1;\n break;\n }\n }\n }\n \n // Look forwards for the end (find sentence boundary 1 sentence after)\n let endIndex = transcript.length;\n boundariesFound = 0;\n for (let i = index + name.length; i < transcript.length; i++) {\n if (sentenceBoundary.test(transcript[i])) {\n boundariesFound++;\n // After finding first boundary (end of current sentence),\n // keep looking for the second (end of next sentence)\n if (boundariesFound === 2) {\n // Include this boundary\n endIndex = i + 1;\n break;\n }\n }\n }\n \n // Extract and clean up the context\n let context = transcript.substring(startIndex, endIndex).trim();\n \n // Limit length to avoid overwhelming the prompt (max ~300 chars)\n if (context.length > 300) {\n // Try to cut at a sentence boundary\n const midPoint = context.indexOf(name);\n if (midPoint !== -1) {\n // Keep the sentence with the name, trim around it\n let sentenceStart = midPoint;\n let sentenceEnd = midPoint + name.length;\n \n // Find sentence start\n for (let i = midPoint - 1; i >= 0; i--) {\n if (sentenceBoundary.test(context[i])) {\n sentenceStart = i + 1;\n break;\n }\n }\n \n // Find sentence end\n for (let i = midPoint + name.length; i < context.length; i++) {\n if (sentenceBoundary.test(context[i])) {\n sentenceEnd = i + 1;\n break;\n }\n }\n \n context = context.substring(sentenceStart, sentenceEnd).trim();\n } else {\n // Just truncate if name not found in extracted context\n context = context.substring(0, 300) + '...';\n }\n }\n \n return context;\n}\n\nexport const create = (ctx: ToolContext): TranscriptionTool => ({\n name: 'lookup_person',\n description: 'Look up information about a person mentioned in the transcript. Use when you encounter a name that might need spelling verification or additional context.',\n parameters: {\n type: 'object',\n properties: {\n name: {\n type: 'string',\n description: 'The name to look up (as heard in transcript)',\n },\n phonetic: {\n type: 'string',\n description: 'How the name sounds (for alias matching)',\n },\n },\n required: ['name'],\n },\n execute: async (args: { name: string; phonetic?: string }): Promise<ToolResult> => {\n const context = ctx.contextInstance;\n \n // First, check if this person was already resolved in this session\n if (ctx.resolvedEntities?.has(args.name)) {\n const resolvedName = ctx.resolvedEntities.get(args.name);\n return {\n success: true,\n data: {\n found: true,\n suggestion: `Already resolved: use \"${resolvedName}\"`,\n cached: true,\n },\n };\n }\n \n // Try direct name search\n const people = context.search(args.name);\n const personMatches = people.filter(e => e.type === 'person');\n \n if (personMatches.length > 0) {\n return {\n success: true,\n data: {\n found: true,\n person: personMatches[0],\n suggestion: `Use \"${personMatches[0].name}\" for correct spelling`,\n },\n };\n }\n \n // Try phonetic match (sounds_like)\n if (args.phonetic) {\n const person = context.findBySoundsLike(args.phonetic);\n if (person) {\n return {\n success: true,\n data: {\n found: true,\n person,\n suggestion: `\"${args.phonetic}\" likely refers to \"${person.name}\"`,\n },\n };\n }\n }\n \n // Not found - always signal that we need user input\n // The executor will decide whether to actually prompt based on handler availability\n const allProjects = context.getAllProjects();\n const projectOptions = allProjects\n .filter(p => p.active !== false)\n .map(p => `${p.name}${p.description ? ` - ${p.description}` : ''}`);\n \n // Extract filename from sourceFile path for cleaner display\n const fileName = ctx.sourceFile.split('/').pop() || ctx.sourceFile;\n const fileDate = ctx.audioDate.toLocaleString('en-US', {\n weekday: 'short',\n year: 'numeric',\n month: 'short',\n day: 'numeric',\n hour: '2-digit',\n minute: '2-digit',\n });\n \n // Find context from transcript where the name is mentioned\n const transcriptContext = extractNameContext(ctx.transcriptText, args.name);\n \n const promptLines = [\n `File: ${fileName}`,\n `Date: ${fileDate}`,\n '',\n `Unknown person mentioned: \"${args.name}\"`,\n ];\n \n if (transcriptContext) {\n promptLines.push('');\n promptLines.push('Context from transcript:');\n promptLines.push(`\"${transcriptContext}\"`);\n }\n \n return {\n success: true,\n needsUserInput: true,\n userPrompt: promptLines.join('\\n'),\n data: {\n found: false,\n clarificationType: 'new_person',\n term: args.name,\n message: `Person \"${args.name}\" not found. Asking user for details.`,\n knownProjects: allProjects.filter(p => p.active !== false),\n options: projectOptions,\n },\n };\n },\n});\n\n"],"names":[],"mappings":"AAYA,SAAS,kBAAA,CAAmB,YAAoB,IAAA,EAA6B;AAEzE,EAAA,MAAM,eAAA,GAAkB,WAAW,WAAA,EAAY;AAC/C,EAAA,MAAM,SAAA,GAAY,KAAK,WAAA,EAAY;AACnC,EAAA,MAAM,KAAA,GAAQ,eAAA,CAAgB,OAAA,CAAQ,SAAS,CAAA;AAE/C,EAAA,IAAI,UAAU,EAAA,EAAI;AACd,IAAA,OAAO,IAAA;AAAA,EACX;AAGA,EAAA,MAAM,gBAAA,GAAmB,OAAA;AAGzB,EAAA,IAAI,UAAA,GAAa,CAAA;AACjB,EAAA,IAAI,eAAA,GAAkB,CAAA;AACtB,EAAA,KAAA,IAAS,CAAA,GAAI,KAAA,GAAQ,CAAA,EAAG,CAAA,IAAK,GAAG,CAAA,EAAA,EAAK;AACjC,IAAA,IAAI,gBAAA,CAAiB,IAAA,CAAK,UAAA,CAAW,CAAC,CAAC,CAAA,EAAG;AACtC,MAAA,eAAA,EAAA;AAGA,MAAA,IAAI,oBAAoB,CAAA,EAAG;AAEvB,QAAA,UAAA,GAAa,CAAA,GAAI,CAAA;AACjB,QAAA;AAAA,MACJ;AAAA,IACJ;AAAA,EACJ;AAGA,EAAA,IAAI,WAAW,UAAA,CAAW,MAAA;AAC1B,EAAA,eAAA,GAAkB,CAAA;AAClB,EAAA,KAAA,IAAS,IAAI,KAAA,GAAQ,IAAA,CAAK,QAAQ,CAAA,GAAI,UAAA,CAAW,QAAQ,CAAA,EAAA,EAAK;AAC1D,IAAA,IAAI,gBAAA,CAAiB,IAAA,CAAK,UAAA,CAAW,CAAC,CAAC,CAAA,EAAG;AACtC,MAAA,eAAA,EAAA;AAGA,MAAA,IAAI,oBAAoB,CAAA,EAAG;AAEvB,QAAA,QAAA,GAAW,CAAA,GAAI,CAAA;AACf,QAAA;AAAA,MACJ;AAAA,IACJ;AAAA,EACJ;AAGA,EAAA,IAAI,UAAU,UAAA,CAAW,SAAA,CAAU,UAAA,EAAY,QAAQ,EAAE,IAAA,EAAK;AAG9D,EAAA,IAAI,OAAA,CAAQ,SAAS,GAAA,EAAK;AAEtB,IAAA,MAAM,QAAA,GAAW,OAAA,CAAQ,OAAA,CAAQ,IAAI,CAAA;AACrC,IAAA,IAAI,aAAa,EAAA,EAAI;AAEjB,MAAA,IAAI,aAAA,GAAgB,QAAA;AACpB,MAAA,IAAI,WAAA,GAAc,WAAW,IAAA,CAAK,MAAA;AAGlC,MAAA,KAAA,IAAS,CAAA,GAAI,QAAA,GAAW,CAAA,EAAG,CAAA,IAAK,GAAG,CAAA,EAAA,EAAK;AACpC,QAAA,IAAI,gBAAA,CAAiB,IAAA,CAAK,OAAA,CAAQ,CAAC,CAAC,CAAA,EAAG;AACnC,UAAA,aAAA,GAAgB,CAAA,GAAI,CAAA;AACpB,UAAA;AAAA,QACJ;AAAA,MACJ;AAGA,MAAA,KAAA,IAAS,IAAI,QAAA,GAAW,IAAA,CAAK,QAAQ,CAAA,GAAI,OAAA,CAAQ,QAAQ,CAAA,EAAA,EAAK;AAC1D,QAAA,IAAI,gBAAA,CAAiB,IAAA,CAAK,OAAA,CAAQ,CAAC,CAAC,CAAA,EAAG;AACnC,UAAA,WAAA,GAAc,CAAA,GAAI,CAAA;AAClB,UAAA;AAAA,QACJ;AAAA,MACJ;AAEA,MAAA,OAAA,GAAU,OAAA,CAAQ,SAAA,CAAU,aAAA,EAAe,WAAW,EAAE,IAAA,EAAK;AAAA,IACjE,CAAA,MAAO;AAEH,MAAA,OAAA,GAAU,OAAA,CAAQ,SAAA,CAAU,CAAA,EAAG,GAAG,CAAA,GAAI,KAAA;AAAA,IAC1C;AAAA,EACJ;AAEA,EAAA,OAAO,OAAA;AACX;AAEO,MAAM,MAAA,GAAS,CAAC,GAAA,MAAyC;AAAA,EAC5D,IAAA,EAAM,eAAA;AAAA,EACN,WAAA,EAAa,4JAAA;AAAA,EACb,UAAA,EAAY;AAAA,IACR,IAAA,EAAM,QAAA;AAAA,IACN,UAAA,EAAY;AAAA,MACR,IAAA,EAAM;AAAA,QACF,IAAA,EAAM,QAAA;AAAA,QACN,WAAA,EAAa;AAAA,OACjB;AAAA,MACA,QAAA,EAAU;AAAA,QACN,IAAA,EAAM,QAAA;AAAA,QACN,WAAA,EAAa;AAAA;AACjB,KACJ;AAAA,IACA,QAAA,EAAU,CAAC,MAAM;AAAA,GACrB;AAAA,EACA,OAAA,EAAS,OAAO,IAAA,KAAmE;AAC/E,IAAA,MAAM,UAAU,GAAA,CAAI,eAAA;AAGpB,IAAA,IAAI,GAAA,CAAI,gBAAA,EAAkB,GAAA,CAAI,IAAA,CAAK,IAAI,CAAA,EAAG;AACtC,MAAA,MAAM,YAAA,GAAe,GAAA,CAAI,gBAAA,CAAiB,GAAA,CAAI,KAAK,IAAI,CAAA;AACvD,MAAA,OAAO;AAAA,QACH,OAAA,EAAS,IAAA;AAAA,QACT,IAAA,EAAM;AAAA,UACF,KAAA,EAAO,IAAA;AAAA,UACP,UAAA,EAAY,0BAA0B,YAAY,CAAA,CAAA,CAAA;AAAA,UAClD,MAAA,EAAQ;AAAA;AACZ,OACJ;AAAA,IACJ;AAGA,IAAA,MAAM,MAAA,GAAS,OAAA,CAAQ,MAAA,CAAO,IAAA,CAAK,IAAI,CAAA;AACvC,IAAA,MAAM,gBAAgB,MAAA,CAAO,MAAA,CAAO,CAAA,CAAA,KAAK,CAAA,CAAE,SAAS,QAAQ,CAAA;AAE5D,IAAA,IAAI,aAAA,CAAc,SAAS,CAAA,EAAG;AAC1B,MAAA,OAAO;AAAA,QACH,OAAA,EAAS,IAAA;AAAA,QACT,IAAA,EAAM;AAAA,UACF,KAAA,EAAO,IAAA;AAAA,UACP,MAAA,EAAQ,cAAc,CAAC,CAAA;AAAA,UACvB,UAAA,EAAY,CAAA,KAAA,EAAQ,aAAA,CAAc,CAAC,EAAE,IAAI,CAAA,sBAAA;AAAA;AAC7C,OACJ;AAAA,IACJ;AAGA,IAAA,IAAI,KAAK,QAAA,EAAU;AACf,MAAA,MAAM,MAAA,GAAS,OAAA,CAAQ,gBAAA,CAAiB,IAAA,CAAK,QAAQ,CAAA;AACrD,MAAA,IAAI,MAAA,EAAQ;AACR,QAAA,OAAO;AAAA,UACH,OAAA,EAAS,IAAA;AAAA,UACT,IAAA,EAAM;AAAA,YACF,KAAA,EAAO,IAAA;AAAA,YACP,MAAA;AAAA,YACA,YAAY,CAAA,CAAA,EAAI,IAAA,CAAK,QAAQ,CAAA,oBAAA,EAAuB,OAAO,IAAI,CAAA,CAAA;AAAA;AACnE,SACJ;AAAA,MACJ;AAAA,IACJ;AAIA,IAAA,MAAM,WAAA,GAAc,QAAQ,cAAA,EAAe;AAC3C,IAAA,MAAM,cAAA,GAAiB,YAClB,MAAA,CAAO,CAAA,CAAA,KAAK,EAAE,MAAA,KAAW,KAAK,EAC9B,GAAA,CAAI,CAAA,CAAA,KAAK,GAAG,CAAA,CAAE,IAAI,GAAG,CAAA,CAAE,WAAA,GAAc,MAAM,CAAA,CAAE,WAAW,CAAA,CAAA,GAAK,EAAE,CAAA,CAAE,CAAA;AAGtE,IAAA,MAAM,QAAA,GAAW,IAAI,UAAA,CAAW,KAAA,CAAM,GAAG,CAAA,CAAE,GAAA,MAAS,GAAA,CAAI,UAAA;AACxD,IAAA,MAAM,QAAA,GAAW,GAAA,CAAI,SAAA,CAAU,cAAA,CAAe,OAAA,EAAS;AAAA,MACnD,OAAA,EAAS,OAAA;AAAA,MACT,IAAA,EAAM,SAAA;AAAA,MACN,KAAA,EAAO,OAAA;AAAA,MACP,GAAA,EAAK,SAAA;AAAA,MACL,IAAA,EAAM,SAAA;AAAA,MACN,MAAA,EAAQ;AAAA,KACX,CAAA;AAGD,IAAA,MAAM,iBAAA,GAAoB,kBAAA,CAAmB,GAAA,CAAI,cAAA,EAAgB,KAAK,IAAI,CAAA;AAE1E,IAAA,MAAM,WAAA,GAAc;AAAA,MAChB,SAAS,QAAQ,CAAA,CAAA;AAAA,MACjB,SAAS,QAAQ,CAAA,CAAA;AAAA,MACjB,EAAA;AAAA,MACA,CAAA,2BAAA,EAA8B,KAAK,IAAI,CAAA,CAAA;AAAA,KAC3C;AAEA,IAAA,IAAI,iBAAA,EAAmB;AACnB,MAAA,WAAA,CAAY,KAAK,EAAE,CAAA;AACnB,MAAA,WAAA,CAAY,KAAK,0BAA0B,CAAA;AAC3C,MAAA,WAAA,CAAY,IAAA,CAAK,CAAA,CAAA,EAAI,iBAAiB,CAAA,CAAA,CAAG,CAAA;AAAA,IAC7C;AAEA,IAAA,OAAO;AAAA,MACH,OAAA,EAAS,IAAA;AAAA,MACT,cAAA,EAAgB,IAAA;AAAA,MAChB,UAAA,EAAY,WAAA,CAAY,IAAA,CAAK,IAAI,CAAA;AAAA,MACjC,IAAA,EAAM;AAAA,QACF,KAAA,EAAO,KAAA;AAAA,QACP,iBAAA,EAAmB,YAAA;AAAA,QACnB,MAAM,IAAA,CAAK,IAAA;AAAA,QACX,OAAA,EAAS,CAAA,QAAA,EAAW,IAAA,CAAK,IAAI,CAAA,qCAAA,CAAA;AAAA,QAC7B,eAAe,WAAA,CAAY,MAAA,CAAO,CAAA,CAAA,KAAK,CAAA,CAAE,WAAW,KAAK,CAAA;AAAA,QACzD,OAAA,EAAS;AAAA;AACb,KACJ;AAAA,EACJ;AACJ,CAAA;;;;"}
|
package/dist/index55.js
CHANGED
|
@@ -1,8 +1,226 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
1
|
+
function extractTermContext(transcript, term) {
|
|
2
|
+
const lowerTranscript = transcript.toLowerCase();
|
|
3
|
+
const lowerTerm = term.toLowerCase();
|
|
4
|
+
const index = lowerTranscript.indexOf(lowerTerm);
|
|
5
|
+
if (index === -1) {
|
|
6
|
+
return null;
|
|
7
|
+
}
|
|
8
|
+
const sentenceBoundary = /[.!?]/;
|
|
9
|
+
let startIndex = 0;
|
|
10
|
+
let boundariesFound = 0;
|
|
11
|
+
for (let i = index - 1; i >= 0; i--) {
|
|
12
|
+
if (sentenceBoundary.test(transcript[i])) {
|
|
13
|
+
boundariesFound++;
|
|
14
|
+
if (boundariesFound === 2) {
|
|
15
|
+
startIndex = i + 1;
|
|
16
|
+
break;
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
let endIndex = transcript.length;
|
|
21
|
+
boundariesFound = 0;
|
|
22
|
+
for (let i = index + term.length; i < transcript.length; i++) {
|
|
23
|
+
if (sentenceBoundary.test(transcript[i])) {
|
|
24
|
+
boundariesFound++;
|
|
25
|
+
if (boundariesFound === 2) {
|
|
26
|
+
endIndex = i + 1;
|
|
27
|
+
break;
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
let context = transcript.substring(startIndex, endIndex).trim();
|
|
32
|
+
if (context.length > 300) {
|
|
33
|
+
const midPoint = context.indexOf(term);
|
|
34
|
+
if (midPoint !== -1) {
|
|
35
|
+
let sentenceStart = midPoint;
|
|
36
|
+
let sentenceEnd = midPoint + term.length;
|
|
37
|
+
for (let i = midPoint - 1; i >= 0; i--) {
|
|
38
|
+
if (sentenceBoundary.test(context[i])) {
|
|
39
|
+
sentenceStart = i + 1;
|
|
40
|
+
break;
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
for (let i = midPoint + term.length; i < context.length; i++) {
|
|
44
|
+
if (sentenceBoundary.test(context[i])) {
|
|
45
|
+
sentenceEnd = i + 1;
|
|
46
|
+
break;
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
context = context.substring(sentenceStart, sentenceEnd).trim();
|
|
50
|
+
} else {
|
|
51
|
+
context = context.substring(0, 300) + "...";
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
return context;
|
|
55
|
+
}
|
|
56
|
+
const create = (ctx) => ({
|
|
57
|
+
name: "lookup_project",
|
|
58
|
+
description: "Look up project information for routing and context. Use when you need to determine where this note should be filed.",
|
|
59
|
+
parameters: {
|
|
60
|
+
type: "object",
|
|
61
|
+
properties: {
|
|
62
|
+
name: {
|
|
63
|
+
type: "string",
|
|
64
|
+
description: "The project name or identifier"
|
|
65
|
+
},
|
|
66
|
+
triggerPhrase: {
|
|
67
|
+
type: "string",
|
|
68
|
+
description: "A phrase from the transcript that might indicate the project"
|
|
69
|
+
}
|
|
70
|
+
},
|
|
71
|
+
required: ["name"]
|
|
72
|
+
},
|
|
73
|
+
execute: async (args) => {
|
|
74
|
+
const context = ctx.contextInstance;
|
|
75
|
+
if (ctx.resolvedEntities?.has(args.name)) {
|
|
76
|
+
const resolvedName = ctx.resolvedEntities.get(args.name);
|
|
77
|
+
return {
|
|
78
|
+
success: true,
|
|
79
|
+
data: {
|
|
80
|
+
found: true,
|
|
81
|
+
suggestion: `Already resolved: use "${resolvedName}"`,
|
|
82
|
+
cached: true
|
|
83
|
+
}
|
|
84
|
+
};
|
|
85
|
+
}
|
|
86
|
+
if (context.isIgnored(args.name)) {
|
|
87
|
+
return {
|
|
88
|
+
success: true,
|
|
89
|
+
data: {
|
|
90
|
+
found: false,
|
|
91
|
+
ignored: true,
|
|
92
|
+
message: `"${args.name}" is on the ignore list - skipping without prompting`
|
|
93
|
+
}
|
|
94
|
+
};
|
|
95
|
+
}
|
|
96
|
+
let contextProjectId;
|
|
97
|
+
if (ctx.routingInstance) {
|
|
98
|
+
const allProjects2 = context.getAllProjects();
|
|
99
|
+
const activeProject = allProjects2.find((p) => p.active !== false);
|
|
100
|
+
contextProjectId = activeProject?.id;
|
|
101
|
+
}
|
|
102
|
+
const searchResults = context.searchWithContext(args.name, contextProjectId);
|
|
103
|
+
const projectMatches = searchResults.filter((e) => e.type === "project");
|
|
104
|
+
const termMatches = searchResults.filter((e) => e.type === "term");
|
|
105
|
+
if (projectMatches.length > 0) {
|
|
106
|
+
const project = projectMatches[0];
|
|
107
|
+
return {
|
|
108
|
+
success: true,
|
|
109
|
+
data: {
|
|
110
|
+
found: true,
|
|
111
|
+
project,
|
|
112
|
+
matchedVia: "context_aware_search"
|
|
113
|
+
}
|
|
114
|
+
};
|
|
115
|
+
}
|
|
116
|
+
if (termMatches.length > 0) {
|
|
117
|
+
const term = termMatches[0];
|
|
118
|
+
const termProjects = term.projects || [];
|
|
119
|
+
if (termProjects.length > 0) {
|
|
120
|
+
const allProjects2 = context.getAllProjects();
|
|
121
|
+
const associatedProject = allProjects2.find((p) => p.id === termProjects[0]);
|
|
122
|
+
if (associatedProject) {
|
|
123
|
+
return {
|
|
124
|
+
success: true,
|
|
125
|
+
data: {
|
|
126
|
+
found: true,
|
|
127
|
+
project: associatedProject,
|
|
128
|
+
matchedVia: "term",
|
|
129
|
+
termName: term.name
|
|
130
|
+
}
|
|
131
|
+
};
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
const soundsLikeMatch = context.findBySoundsLike(args.name);
|
|
136
|
+
if (soundsLikeMatch) {
|
|
137
|
+
if (soundsLikeMatch.type === "project") {
|
|
138
|
+
return {
|
|
139
|
+
success: true,
|
|
140
|
+
data: {
|
|
141
|
+
found: true,
|
|
142
|
+
project: soundsLikeMatch,
|
|
143
|
+
matchedVia: "sounds_like"
|
|
144
|
+
}
|
|
145
|
+
};
|
|
146
|
+
} else if (soundsLikeMatch.type === "term") {
|
|
147
|
+
const termProjects = soundsLikeMatch.projects || [];
|
|
148
|
+
if (termProjects.length > 0) {
|
|
149
|
+
const allProjects2 = context.getAllProjects();
|
|
150
|
+
const associatedProject = allProjects2.find((p) => p.id === termProjects[0]);
|
|
151
|
+
if (associatedProject) {
|
|
152
|
+
return {
|
|
153
|
+
success: true,
|
|
154
|
+
data: {
|
|
155
|
+
found: true,
|
|
156
|
+
project: associatedProject,
|
|
157
|
+
matchedVia: "term_sounds_like",
|
|
158
|
+
termName: soundsLikeMatch.name
|
|
159
|
+
}
|
|
160
|
+
};
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
if (args.triggerPhrase) {
|
|
166
|
+
const allProjects2 = context.getAllProjects();
|
|
167
|
+
for (const project of allProjects2) {
|
|
168
|
+
const phrases = project.classification?.explicit_phrases ?? [];
|
|
169
|
+
if (phrases.some((p) => args.triggerPhrase?.toLowerCase().includes(p.toLowerCase()))) {
|
|
170
|
+
return {
|
|
171
|
+
success: true,
|
|
172
|
+
data: {
|
|
173
|
+
found: true,
|
|
174
|
+
project,
|
|
175
|
+
matchedTrigger: args.triggerPhrase
|
|
176
|
+
}
|
|
177
|
+
};
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
const allProjects = context.getAllProjects();
|
|
182
|
+
const projectOptions = allProjects.filter((p) => p.active !== false).map((p) => `${p.name}${p.description ? ` - ${p.description}` : ""}`);
|
|
183
|
+
const fileName = ctx.sourceFile.split("/").pop() || ctx.sourceFile;
|
|
184
|
+
const fileDate = ctx.audioDate.toLocaleString("en-US", {
|
|
185
|
+
weekday: "short",
|
|
186
|
+
year: "numeric",
|
|
187
|
+
month: "short",
|
|
188
|
+
day: "numeric",
|
|
189
|
+
hour: "2-digit",
|
|
190
|
+
minute: "2-digit"
|
|
191
|
+
});
|
|
192
|
+
const transcriptContext = extractTermContext(ctx.transcriptText, args.name);
|
|
193
|
+
const contextLines = [
|
|
194
|
+
`File: ${fileName}`,
|
|
195
|
+
`Date: ${fileDate}`,
|
|
196
|
+
"",
|
|
197
|
+
`Unknown project/term: "${args.name}"`
|
|
198
|
+
];
|
|
199
|
+
if (transcriptContext) {
|
|
200
|
+
contextLines.push("");
|
|
201
|
+
contextLines.push("Context from transcript:");
|
|
202
|
+
contextLines.push(`"${transcriptContext}"`);
|
|
203
|
+
} else if (args.triggerPhrase) {
|
|
204
|
+
contextLines.push("");
|
|
205
|
+
contextLines.push("Context from transcript:");
|
|
206
|
+
contextLines.push(`"${args.triggerPhrase}"`);
|
|
207
|
+
}
|
|
208
|
+
return {
|
|
209
|
+
success: true,
|
|
210
|
+
needsUserInput: true,
|
|
211
|
+
userPrompt: contextLines.join("\n"),
|
|
212
|
+
data: {
|
|
213
|
+
found: false,
|
|
214
|
+
clarificationType: "new_project",
|
|
215
|
+
term: args.name,
|
|
216
|
+
triggerPhrase: args.triggerPhrase,
|
|
217
|
+
message: `Project "${args.name}" not found. Asking user if this is a new project.`,
|
|
218
|
+
knownProjects: allProjects.filter((p) => p.active !== false),
|
|
219
|
+
options: projectOptions
|
|
220
|
+
}
|
|
221
|
+
};
|
|
222
|
+
}
|
|
223
|
+
});
|
|
3
224
|
|
|
4
|
-
|
|
5
|
-
const utc = /*@__PURE__*/getDefaultExportFromCjs(utcExports);
|
|
6
|
-
|
|
7
|
-
export { utc as default };
|
|
225
|
+
export { create };
|
|
8
226
|
//# sourceMappingURL=index55.js.map
|
package/dist/index55.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index55.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;"}
|
|
1
|
+
{"version":3,"file":"index55.js","sources":["../src/agentic/tools/lookup-project.ts"],"sourcesContent":["/**\n * Lookup Project Tool\n * \n * Looks up project information for routing and context.\n * Prompts to create unknown projects when user input is available.\n */\n\nimport { TranscriptionTool, ToolContext, ToolResult } from '../types';\n\n/**\n * Extract context from transcript around where a term is mentioned.\n * Returns approximately one sentence before and after the term mention.\n */\nfunction extractTermContext(transcript: string, term: string): string | null {\n // Case-insensitive search for the term\n const lowerTranscript = transcript.toLowerCase();\n const lowerTerm = term.toLowerCase();\n const index = lowerTranscript.indexOf(lowerTerm);\n \n if (index === -1) {\n return null;\n }\n \n // Define strong sentence boundaries (., !, ?)\n const sentenceBoundary = /[.!?]/;\n \n // Look backwards for the start (find the sentence boundary 1 sentence before)\n let startIndex = 0;\n let boundariesFound = 0;\n for (let i = index - 1; i >= 0; i--) {\n if (sentenceBoundary.test(transcript[i])) {\n boundariesFound++;\n // After finding first boundary (end of current sentence), \n // keep looking for the second (end of previous sentence)\n if (boundariesFound === 2) {\n // Start after this boundary\n startIndex = i + 1;\n break;\n }\n }\n }\n \n // Look forwards for the end (find sentence boundary 1 sentence after)\n let endIndex = transcript.length;\n boundariesFound = 0;\n for (let i = index + term.length; i < transcript.length; i++) {\n if (sentenceBoundary.test(transcript[i])) {\n boundariesFound++;\n // After finding first boundary (end of current sentence),\n // keep looking for the second (end of next sentence)\n if (boundariesFound === 2) {\n // Include this boundary\n endIndex = i + 1;\n break;\n }\n }\n }\n \n // Extract and clean up the context\n let context = transcript.substring(startIndex, endIndex).trim();\n \n // Limit length to avoid overwhelming the prompt (max ~300 chars)\n if (context.length > 300) {\n // Try to cut at a sentence boundary\n const midPoint = context.indexOf(term);\n if (midPoint !== -1) {\n // Keep the sentence with the term, trim around it\n let sentenceStart = midPoint;\n let sentenceEnd = midPoint + term.length;\n \n // Find sentence start\n for (let i = midPoint - 1; i >= 0; i--) {\n if (sentenceBoundary.test(context[i])) {\n sentenceStart = i + 1;\n break;\n }\n }\n \n // Find sentence end\n for (let i = midPoint + term.length; i < context.length; i++) {\n if (sentenceBoundary.test(context[i])) {\n sentenceEnd = i + 1;\n break;\n }\n }\n \n context = context.substring(sentenceStart, sentenceEnd).trim();\n } else {\n // Just truncate if term not found in extracted context\n context = context.substring(0, 300) + '...';\n }\n }\n \n return context;\n}\n\nexport const create = (ctx: ToolContext): TranscriptionTool => ({\n name: 'lookup_project',\n description: 'Look up project information for routing and context. Use when you need to determine where this note should be filed.',\n parameters: {\n type: 'object',\n properties: {\n name: {\n type: 'string',\n description: 'The project name or identifier',\n },\n triggerPhrase: {\n type: 'string',\n description: 'A phrase from the transcript that might indicate the project',\n },\n },\n required: ['name'],\n },\n execute: async (args: { name: string; triggerPhrase?: string }): Promise<ToolResult> => {\n const context = ctx.contextInstance;\n \n // First, check if this project/term was already resolved in this session\n if (ctx.resolvedEntities?.has(args.name)) {\n const resolvedName = ctx.resolvedEntities.get(args.name);\n return {\n success: true,\n data: {\n found: true,\n suggestion: `Already resolved: use \"${resolvedName}\"`,\n cached: true,\n },\n };\n }\n \n // Check if this term is on the ignore list\n if (context.isIgnored(args.name)) {\n return {\n success: true,\n data: {\n found: false,\n ignored: true,\n message: `\"${args.name}\" is on the ignore list - skipping without prompting`,\n },\n };\n }\n \n // Try to determine context from routing instance if available\n let contextProjectId: string | undefined;\n if (ctx.routingInstance) {\n const allProjects = context.getAllProjects();\n // Use the first active project as a context hint (could be improved)\n const activeProject = allProjects.find(p => p.active !== false);\n contextProjectId = activeProject?.id;\n }\n \n // Use context-aware search (prefers related projects)\n const searchResults = context.searchWithContext(args.name, contextProjectId);\n const projectMatches = searchResults.filter(e => e.type === 'project');\n const termMatches = searchResults.filter(e => e.type === 'term');\n \n if (projectMatches.length > 0) {\n const project = projectMatches[0];\n return {\n success: true,\n data: {\n found: true,\n project,\n matchedVia: 'context_aware_search',\n },\n };\n }\n \n // Check if we found a term that's associated with projects\n if (termMatches.length > 0) {\n const term = termMatches[0];\n const termProjects = term.projects || [];\n \n if (termProjects.length > 0) {\n // Get the first associated project\n const allProjects = context.getAllProjects();\n const associatedProject = allProjects.find(p => p.id === termProjects[0]);\n \n if (associatedProject) {\n return {\n success: true,\n data: {\n found: true,\n project: associatedProject,\n matchedVia: 'term',\n termName: term.name,\n },\n };\n }\n }\n }\n \n // Try findBySoundsLike as a fallback for exact phonetic matches\n const soundsLikeMatch = context.findBySoundsLike(args.name);\n if (soundsLikeMatch) {\n if (soundsLikeMatch.type === 'project') {\n return {\n success: true,\n data: {\n found: true,\n project: soundsLikeMatch,\n matchedVia: 'sounds_like',\n },\n };\n } else if (soundsLikeMatch.type === 'term') {\n const termProjects = soundsLikeMatch.projects || [];\n \n if (termProjects.length > 0) {\n const allProjects = context.getAllProjects();\n const associatedProject = allProjects.find(p => p.id === termProjects[0]);\n \n if (associatedProject) {\n return {\n success: true,\n data: {\n found: true,\n project: associatedProject,\n matchedVia: 'term_sounds_like',\n termName: soundsLikeMatch.name,\n },\n };\n }\n }\n }\n }\n \n // Try getting all projects and matching trigger phrases\n if (args.triggerPhrase) {\n const allProjects = context.getAllProjects();\n for (const project of allProjects) {\n const phrases = project.classification?.explicit_phrases ?? [];\n if (phrases.some(p => args.triggerPhrase?.toLowerCase().includes(p.toLowerCase()))) {\n return {\n success: true,\n data: {\n found: true,\n project,\n matchedTrigger: args.triggerPhrase,\n },\n };\n }\n }\n }\n \n // Project not found - always signal that we need user input\n // The executor will decide whether to actually prompt based on handler availability\n const allProjects = context.getAllProjects();\n const projectOptions = allProjects\n .filter(p => p.active !== false)\n .map(p => `${p.name}${p.description ? ` - ${p.description}` : ''}`);\n \n // Extract filename from sourceFile path for cleaner display\n const fileName = ctx.sourceFile.split('/').pop() || ctx.sourceFile;\n const fileDate = ctx.audioDate.toLocaleString('en-US', {\n weekday: 'short',\n year: 'numeric',\n month: 'short',\n day: 'numeric',\n hour: '2-digit',\n minute: '2-digit',\n });\n \n // Find context from transcript where the project/term is mentioned\n const transcriptContext = extractTermContext(ctx.transcriptText, args.name);\n \n const contextLines = [\n `File: ${fileName}`,\n `Date: ${fileDate}`,\n '',\n `Unknown project/term: \"${args.name}\"`,\n ];\n \n if (transcriptContext) {\n contextLines.push('');\n contextLines.push('Context from transcript:');\n contextLines.push(`\"${transcriptContext}\"`);\n } else if (args.triggerPhrase) {\n contextLines.push('');\n contextLines.push('Context from transcript:');\n contextLines.push(`\"${args.triggerPhrase}\"`);\n }\n \n return {\n success: true,\n needsUserInput: true,\n userPrompt: contextLines.join('\\n'),\n data: {\n found: false,\n clarificationType: 'new_project',\n term: args.name,\n triggerPhrase: args.triggerPhrase,\n message: `Project \"${args.name}\" not found. Asking user if this is a new project.`,\n knownProjects: allProjects.filter(p => p.active !== false),\n options: projectOptions,\n },\n };\n },\n});\n\n"],"names":["allProjects"],"mappings":"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"}
|
package/dist/index56.js
CHANGED
|
@@ -1,150 +1,49 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
const createOutputPaths = (_audioFile, routedDestination, hash, date) => {
|
|
19
|
-
const timestamp = formatTimestamp(date);
|
|
20
|
-
const shortHash = hash.slice(0, 6);
|
|
21
|
-
const buildFilename = (type, ext) => `${timestamp}-${type}-${shortHash}${ext}`;
|
|
22
|
-
const intermediateDir = config.intermediateDir;
|
|
23
|
-
let finalPath = routedDestination;
|
|
24
|
-
if (finalPath.endsWith(".md")) {
|
|
25
|
-
finalPath = finalPath.replace(/\.md$/, ".pkl");
|
|
26
|
-
} else if (!finalPath.endsWith(".pkl")) {
|
|
27
|
-
finalPath = finalPath + ".pkl";
|
|
28
|
-
}
|
|
29
|
-
const finalDir = path.dirname(finalPath);
|
|
30
|
-
const finalBasename = path.basename(finalPath, ".pkl");
|
|
31
|
-
const rawTranscriptPath = path.join(finalDir, ".transcript", `${finalBasename}.json`);
|
|
32
|
-
return {
|
|
33
|
-
final: finalPath,
|
|
34
|
-
rawTranscript: rawTranscriptPath,
|
|
35
|
-
intermediate: {
|
|
36
|
-
transcript: path.join(intermediateDir, buildFilename("transcript", ".json")),
|
|
37
|
-
context: path.join(intermediateDir, buildFilename("context", ".json")),
|
|
38
|
-
request: path.join(intermediateDir, buildFilename("request", ".json")),
|
|
39
|
-
response: path.join(intermediateDir, buildFilename("response", ".json")),
|
|
40
|
-
reflection: path.join(intermediateDir, buildFilename("reflection", ".md")),
|
|
41
|
-
session: path.join(intermediateDir, buildFilename("session", ".json"))
|
|
1
|
+
const create = (ctx) => ({
|
|
2
|
+
name: "verify_spelling",
|
|
3
|
+
description: "Request user verification for an unknown name or term. Use when you encounter something that needs human confirmation.",
|
|
4
|
+
parameters: {
|
|
5
|
+
type: "object",
|
|
6
|
+
properties: {
|
|
7
|
+
term: {
|
|
8
|
+
type: "string",
|
|
9
|
+
description: "The term that needs verification"
|
|
10
|
+
},
|
|
11
|
+
context: {
|
|
12
|
+
type: "string",
|
|
13
|
+
description: "Context around where this term appears"
|
|
14
|
+
},
|
|
15
|
+
suggestedSpelling: {
|
|
16
|
+
type: "string",
|
|
17
|
+
description: "Your best guess at the correct spelling"
|
|
42
18
|
}
|
|
43
|
-
}
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
const writeIntermediate = async (paths, type, content) => {
|
|
56
|
-
const filePath = paths.intermediate[type];
|
|
57
|
-
if (!filePath) {
|
|
58
|
-
throw new Error(`Invalid intermediate type: ${type}`);
|
|
59
|
-
}
|
|
60
|
-
const contentStr = typeof content === "string" ? content : JSON.stringify(content, null, 2);
|
|
61
|
-
await fs.writeFile(filePath, contentStr, "utf-8");
|
|
62
|
-
logger.debug("Wrote intermediate file", { type, path: filePath });
|
|
63
|
-
return filePath;
|
|
64
|
-
};
|
|
65
|
-
const writeTranscript = async (paths, content, metadata) => {
|
|
66
|
-
const pklRouting = metadata?.routing ? {
|
|
67
|
-
destination: metadata.routing.destination,
|
|
68
|
-
confidence: metadata.routing.confidence,
|
|
69
|
-
signals: metadata.routing.signals?.map(
|
|
70
|
-
(s) => typeof s === "string" ? s : `${s.type}: ${s.value} (weight: ${s.weight})`
|
|
71
|
-
),
|
|
72
|
-
reasoning: metadata.routing.reasoning
|
|
73
|
-
} : void 0;
|
|
74
|
-
const pklMetadata = metadata ? {
|
|
75
|
-
id: randomUUID(),
|
|
76
|
-
title: metadata.title,
|
|
77
|
-
date: metadata.date,
|
|
78
|
-
recordingTime: metadata.recordingTime,
|
|
79
|
-
project: metadata.project,
|
|
80
|
-
projectId: metadata.projectId,
|
|
81
|
-
tags: metadata.tags || [],
|
|
82
|
-
duration: metadata.duration,
|
|
83
|
-
status: metadata.status || "initial",
|
|
84
|
-
entities: metadata.entities,
|
|
85
|
-
routing: pklRouting
|
|
86
|
-
} : {
|
|
87
|
-
id: randomUUID(),
|
|
88
|
-
title: "Untitled",
|
|
89
|
-
tags: [],
|
|
90
|
-
status: "initial"
|
|
91
|
-
};
|
|
92
|
-
const transcript = PklTranscript.create(paths.final, pklMetadata);
|
|
93
|
-
try {
|
|
94
|
-
transcript.updateContent(content);
|
|
95
|
-
logger.info("Wrote final transcript", { path: paths.final });
|
|
96
|
-
} finally {
|
|
97
|
-
transcript.close();
|
|
98
|
-
}
|
|
99
|
-
return paths.final;
|
|
100
|
-
};
|
|
101
|
-
const cleanIntermediates = async (paths) => {
|
|
102
|
-
if (config.keepIntermediates) {
|
|
103
|
-
logger.debug("Keeping intermediate files");
|
|
104
|
-
return;
|
|
105
|
-
}
|
|
106
|
-
for (const [type, filePath] of Object.entries(paths.intermediate)) {
|
|
107
|
-
if (filePath) {
|
|
108
|
-
try {
|
|
109
|
-
await fs.unlink(filePath);
|
|
110
|
-
logger.debug("Removed intermediate file", { type, path: filePath });
|
|
111
|
-
} catch {
|
|
19
|
+
},
|
|
20
|
+
required: ["term"]
|
|
21
|
+
},
|
|
22
|
+
execute: async (args) => {
|
|
23
|
+
if (!ctx.interactiveMode) {
|
|
24
|
+
return {
|
|
25
|
+
success: true,
|
|
26
|
+
data: {
|
|
27
|
+
verified: false,
|
|
28
|
+
useSuggestion: true,
|
|
29
|
+
spelling: args.suggestedSpelling || args.term,
|
|
30
|
+
message: "Non-interactive mode: using best guess"
|
|
112
31
|
}
|
|
113
|
-
}
|
|
32
|
+
};
|
|
114
33
|
}
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
const ext = path.extname(finalOutputPath);
|
|
125
|
-
const finalBasename = path.basename(finalOutputPath, ext);
|
|
126
|
-
const rawTranscriptPath = path.join(finalDir, ".transcript", `${finalBasename}.json`);
|
|
127
|
-
try {
|
|
128
|
-
const content = await fs.readFile(rawTranscriptPath, "utf-8");
|
|
129
|
-
return JSON.parse(content);
|
|
130
|
-
} catch (error) {
|
|
131
|
-
if (error && typeof error === "object" && "code" in error && error.code === "ENOENT") {
|
|
132
|
-
logger.debug("No raw transcript found", { path: rawTranscriptPath });
|
|
133
|
-
return null;
|
|
34
|
+
return {
|
|
35
|
+
success: true,
|
|
36
|
+
needsUserInput: true,
|
|
37
|
+
userPrompt: `Unknown term: "${args.term}"${args.context ? ` (context: "${args.context}")` : ""}
|
|
38
|
+
${args.suggestedSpelling ? `Suggested spelling: "${args.suggestedSpelling}"` : ""}
|
|
39
|
+
Please provide the correct spelling:`,
|
|
40
|
+
data: {
|
|
41
|
+
term: args.term,
|
|
42
|
+
suggestedSpelling: args.suggestedSpelling
|
|
134
43
|
}
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
return {
|
|
139
|
-
createOutputPaths,
|
|
140
|
-
ensureDirectories,
|
|
141
|
-
writeIntermediate,
|
|
142
|
-
writeRawTranscript,
|
|
143
|
-
writeTranscript,
|
|
144
|
-
readRawTranscript,
|
|
145
|
-
cleanIntermediates
|
|
146
|
-
};
|
|
147
|
-
};
|
|
44
|
+
};
|
|
45
|
+
}
|
|
46
|
+
});
|
|
148
47
|
|
|
149
48
|
export { create };
|
|
150
49
|
//# sourceMappingURL=index56.js.map
|