@redaksjon/protokoll-engine 0.1.1-dev.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (240) hide show
  1. package/README.md +47 -0
  2. package/dist/agentic/executor.d.ts +21 -0
  3. package/dist/agentic/executor.d.ts.map +1 -0
  4. package/dist/agentic/index.d.ts +27 -0
  5. package/dist/agentic/index.d.ts.map +1 -0
  6. package/dist/agentic/registry.d.ts +11 -0
  7. package/dist/agentic/registry.d.ts.map +1 -0
  8. package/dist/agentic/tools/lookup-person.d.ts +3 -0
  9. package/dist/agentic/tools/lookup-person.d.ts.map +1 -0
  10. package/dist/agentic/tools/lookup-project.d.ts +3 -0
  11. package/dist/agentic/tools/lookup-project.d.ts.map +1 -0
  12. package/dist/agentic/tools/route-note.d.ts +3 -0
  13. package/dist/agentic/tools/route-note.d.ts.map +1 -0
  14. package/dist/agentic/tools/store-context.d.ts +3 -0
  15. package/dist/agentic/tools/store-context.d.ts.map +1 -0
  16. package/dist/agentic/tools/verify-spelling.d.ts +3 -0
  17. package/dist/agentic/tools/verify-spelling.d.ts.map +1 -0
  18. package/dist/agentic/types.d.ts +110 -0
  19. package/dist/agentic/types.d.ts.map +1 -0
  20. package/dist/constants.d.ts +98 -0
  21. package/dist/constants.d.ts.map +1 -0
  22. package/dist/feedback/analyzer.d.ts +13 -0
  23. package/dist/feedback/analyzer.d.ts.map +1 -0
  24. package/dist/feedback/decision-tracker.d.ts +14 -0
  25. package/dist/feedback/decision-tracker.d.ts.map +1 -0
  26. package/dist/feedback/handler.d.ts +14 -0
  27. package/dist/feedback/handler.d.ts.map +1 -0
  28. package/dist/feedback/index.d.ts +12 -0
  29. package/dist/feedback/index.d.ts.map +1 -0
  30. package/dist/feedback/types.d.ts +72 -0
  31. package/dist/feedback/types.d.ts.map +1 -0
  32. package/dist/index.d.ts +24 -0
  33. package/dist/index.d.ts.map +1 -0
  34. package/dist/index.js +32 -0
  35. package/dist/index.js.map +1 -0
  36. package/dist/index10.js +4 -0
  37. package/dist/index10.js.map +1 -0
  38. package/dist/index11.js +22 -0
  39. package/dist/index11.js.map +1 -0
  40. package/dist/index12.js +125 -0
  41. package/dist/index12.js.map +1 -0
  42. package/dist/index13.js +124 -0
  43. package/dist/index13.js.map +1 -0
  44. package/dist/index14.js +296 -0
  45. package/dist/index14.js.map +1 -0
  46. package/dist/index15.js +100 -0
  47. package/dist/index15.js.map +1 -0
  48. package/dist/index16.js +107 -0
  49. package/dist/index16.js.map +1 -0
  50. package/dist/index17.js +185 -0
  51. package/dist/index17.js.map +1 -0
  52. package/dist/index18.js +53 -0
  53. package/dist/index18.js.map +1 -0
  54. package/dist/index19.js +19 -0
  55. package/dist/index19.js.map +1 -0
  56. package/dist/index2.js +33 -0
  57. package/dist/index2.js.map +1 -0
  58. package/dist/index20.js +105 -0
  59. package/dist/index20.js.map +1 -0
  60. package/dist/index21.js +26 -0
  61. package/dist/index21.js.map +1 -0
  62. package/dist/index22.js +49 -0
  63. package/dist/index22.js.map +1 -0
  64. package/dist/index23.js +119 -0
  65. package/dist/index23.js.map +1 -0
  66. package/dist/index24.js +330 -0
  67. package/dist/index24.js.map +1 -0
  68. package/dist/index25.js +57 -0
  69. package/dist/index25.js.map +1 -0
  70. package/dist/index26.js +38 -0
  71. package/dist/index26.js.map +1 -0
  72. package/dist/index27.js +127 -0
  73. package/dist/index27.js.map +1 -0
  74. package/dist/index28.js +157 -0
  75. package/dist/index28.js.map +1 -0
  76. package/dist/index29.js +163 -0
  77. package/dist/index29.js.map +1 -0
  78. package/dist/index3.js +36 -0
  79. package/dist/index3.js.map +1 -0
  80. package/dist/index30.js +173 -0
  81. package/dist/index30.js.map +1 -0
  82. package/dist/index31.js +423 -0
  83. package/dist/index31.js.map +1 -0
  84. package/dist/index32.js +161 -0
  85. package/dist/index32.js.map +1 -0
  86. package/dist/index33.js +152 -0
  87. package/dist/index33.js.map +1 -0
  88. package/dist/index34.js +56 -0
  89. package/dist/index34.js.map +1 -0
  90. package/dist/index35.js +103 -0
  91. package/dist/index35.js.map +1 -0
  92. package/dist/index36.js +451 -0
  93. package/dist/index36.js.map +1 -0
  94. package/dist/index37.js +431 -0
  95. package/dist/index37.js.map +1 -0
  96. package/dist/index38.js +87 -0
  97. package/dist/index38.js.map +1 -0
  98. package/dist/index39.js +122 -0
  99. package/dist/index39.js.map +1 -0
  100. package/dist/index4.js +3 -0
  101. package/dist/index4.js.map +1 -0
  102. package/dist/index40.js +299 -0
  103. package/dist/index40.js.map +1 -0
  104. package/dist/index41.js +49 -0
  105. package/dist/index41.js.map +1 -0
  106. package/dist/index42.js +151 -0
  107. package/dist/index42.js.map +1 -0
  108. package/dist/index43.js +226 -0
  109. package/dist/index43.js.map +1 -0
  110. package/dist/index44.js +49 -0
  111. package/dist/index44.js.map +1 -0
  112. package/dist/index45.js +45 -0
  113. package/dist/index45.js.map +1 -0
  114. package/dist/index46.js +37 -0
  115. package/dist/index46.js.map +1 -0
  116. package/dist/index47.js +51 -0
  117. package/dist/index47.js.map +1 -0
  118. package/dist/index48.js +39 -0
  119. package/dist/index48.js.map +1 -0
  120. package/dist/index49.js +239 -0
  121. package/dist/index49.js.map +1 -0
  122. package/dist/index5.js +17 -0
  123. package/dist/index5.js.map +1 -0
  124. package/dist/index50.js +163 -0
  125. package/dist/index50.js.map +1 -0
  126. package/dist/index51.js +81 -0
  127. package/dist/index51.js.map +1 -0
  128. package/dist/index52.js +78 -0
  129. package/dist/index52.js.map +1 -0
  130. package/dist/index53.js +22 -0
  131. package/dist/index53.js.map +1 -0
  132. package/dist/index54.js +8 -0
  133. package/dist/index54.js.map +1 -0
  134. package/dist/index55.js +8 -0
  135. package/dist/index55.js.map +1 -0
  136. package/dist/index56.js +17 -0
  137. package/dist/index56.js.map +1 -0
  138. package/dist/index57.js +4 -0
  139. package/dist/index57.js.map +1 -0
  140. package/dist/index58.js +17 -0
  141. package/dist/index58.js.map +1 -0
  142. package/dist/index59.js +4 -0
  143. package/dist/index59.js.map +1 -0
  144. package/dist/index6.js +22 -0
  145. package/dist/index6.js.map +1 -0
  146. package/dist/index60.js +6 -0
  147. package/dist/index60.js.map +1 -0
  148. package/dist/index7.js +27 -0
  149. package/dist/index7.js.map +1 -0
  150. package/dist/index8.js +22 -0
  151. package/dist/index8.js.map +1 -0
  152. package/dist/index9.js +5 -0
  153. package/dist/index9.js.map +1 -0
  154. package/dist/logging.d.ts +7 -0
  155. package/dist/logging.d.ts.map +1 -0
  156. package/dist/output/index.d.ts +15 -0
  157. package/dist/output/index.d.ts.map +1 -0
  158. package/dist/phases/complete.d.ts +17 -0
  159. package/dist/phases/complete.d.ts.map +1 -0
  160. package/dist/phases/index.d.ts +5 -0
  161. package/dist/phases/index.d.ts.map +1 -0
  162. package/dist/phases/locate.d.ts +15 -0
  163. package/dist/phases/locate.d.ts.map +1 -0
  164. package/dist/phases/simple-replace.d.ts +72 -0
  165. package/dist/phases/simple-replace.d.ts.map +1 -0
  166. package/dist/phases/transcribe.d.ts +19 -0
  167. package/dist/phases/transcribe.d.ts.map +1 -0
  168. package/dist/pipeline/index.d.ts +10 -0
  169. package/dist/pipeline/index.d.ts.map +1 -0
  170. package/dist/pipeline/orchestrator.d.ts +13 -0
  171. package/dist/pipeline/orchestrator.d.ts.map +1 -0
  172. package/dist/pipeline/types.d.ts +58 -0
  173. package/dist/pipeline/types.d.ts.map +1 -0
  174. package/dist/prompt/index.d.ts +3 -0
  175. package/dist/prompt/index.d.ts.map +1 -0
  176. package/dist/prompt/templates.d.ts +40 -0
  177. package/dist/prompt/templates.d.ts.map +1 -0
  178. package/dist/prompt/transcribe.d.ts +42 -0
  179. package/dist/prompt/transcribe.d.ts.map +1 -0
  180. package/dist/reasoning/client.d.ts +42 -0
  181. package/dist/reasoning/client.d.ts.map +1 -0
  182. package/dist/reasoning/index.d.ts +17 -0
  183. package/dist/reasoning/index.d.ts.map +1 -0
  184. package/dist/reasoning/strategy.d.ts +12 -0
  185. package/dist/reasoning/strategy.d.ts.map +1 -0
  186. package/dist/reasoning/types.d.ts +58 -0
  187. package/dist/reasoning/types.d.ts.map +1 -0
  188. package/dist/reflection/collector.d.ts +18 -0
  189. package/dist/reflection/collector.d.ts.map +1 -0
  190. package/dist/reflection/index.d.ts +13 -0
  191. package/dist/reflection/index.d.ts.map +1 -0
  192. package/dist/reflection/reporter.d.ts +10 -0
  193. package/dist/reflection/reporter.d.ts.map +1 -0
  194. package/dist/reflection/types.d.ts +99 -0
  195. package/dist/reflection/types.d.ts.map +1 -0
  196. package/dist/routing/classifier.d.ts +8 -0
  197. package/dist/routing/classifier.d.ts.map +1 -0
  198. package/dist/routing/index.d.ts +12 -0
  199. package/dist/routing/index.d.ts.map +1 -0
  200. package/dist/routing/router.d.ts +8 -0
  201. package/dist/routing/router.d.ts.map +1 -0
  202. package/dist/routing/types.d.ts +68 -0
  203. package/dist/routing/types.d.ts.map +1 -0
  204. package/dist/transcript/feedback.d.ts +70 -0
  205. package/dist/transcript/feedback.d.ts.map +1 -0
  206. package/dist/transcript/index.d.ts +10 -0
  207. package/dist/transcript/index.d.ts.map +1 -0
  208. package/dist/transcript/operations.d.ts +152 -0
  209. package/dist/transcript/operations.d.ts.map +1 -0
  210. package/dist/transcript/pkl-utils.d.ts +66 -0
  211. package/dist/transcript/pkl-utils.d.ts.map +1 -0
  212. package/dist/transcription/index.d.ts +17 -0
  213. package/dist/transcription/index.d.ts.map +1 -0
  214. package/dist/transcription/service.d.ts +10 -0
  215. package/dist/transcription/service.d.ts.map +1 -0
  216. package/dist/transcription/types.d.ts +41 -0
  217. package/dist/transcription/types.d.ts.map +1 -0
  218. package/dist/types.d.ts +28 -0
  219. package/dist/types.d.ts.map +1 -0
  220. package/dist/util/collision-detector.d.ts +77 -0
  221. package/dist/util/collision-detector.d.ts.map +1 -0
  222. package/dist/util/dates.d.ts +57 -0
  223. package/dist/util/dates.d.ts.map +1 -0
  224. package/dist/util/general.d.ts +3 -0
  225. package/dist/util/general.d.ts.map +1 -0
  226. package/dist/util/media.d.ts +9 -0
  227. package/dist/util/media.d.ts.map +1 -0
  228. package/dist/util/metadata.d.ts +138 -0
  229. package/dist/util/metadata.d.ts.map +1 -0
  230. package/dist/util/openai.d.ts +22 -0
  231. package/dist/util/openai.d.ts.map +1 -0
  232. package/dist/util/sounds-like-database.d.ts +98 -0
  233. package/dist/util/sounds-like-database.d.ts.map +1 -0
  234. package/dist/util/storage.d.ts +35 -0
  235. package/dist/util/storage.d.ts.map +1 -0
  236. package/dist/util/text-replacer.d.ts +56 -0
  237. package/dist/util/text-replacer.d.ts.map +1 -0
  238. package/dist/utils/entityFinder.d.ts +29 -0
  239. package/dist/utils/entityFinder.d.ts.map +1 -0
  240. package/package.json +84 -0
@@ -0,0 +1,87 @@
1
+ import * as path from 'node:path';
2
+ import * as fs from 'fs/promises';
3
+ import { PklTranscript, isUuidInput } from '@redaksjon/protokoll-format';
4
+
5
+ function isPklFile(filePath) {
6
+ return path.extname(filePath).toLowerCase() === ".pkl";
7
+ }
8
+ function getTranscriptGlobPattern() {
9
+ return "**/*.pkl";
10
+ }
11
+ function stripTranscriptExtension(filePath) {
12
+ return filePath.replace(/\.pkl$/i, "");
13
+ }
14
+ function ensurePklExtension(filePath) {
15
+ if (isPklFile(filePath)) {
16
+ return filePath;
17
+ }
18
+ return filePath.replace(/\.md$/i, "") + ".pkl";
19
+ }
20
+ async function transcriptExists(basePath) {
21
+ const pklPath = ensurePklExtension(basePath);
22
+ try {
23
+ await fs.access(pklPath);
24
+ return { exists: true, path: pklPath };
25
+ } catch {
26
+ return { exists: false, path: null };
27
+ }
28
+ }
29
+ async function transcriptExistsUuid(pathOrUuid, searchDirectories) {
30
+ if (isUuidInput(pathOrUuid)) {
31
+ if (!searchDirectories || searchDirectories.length === 0) {
32
+ return { exists: false };
33
+ }
34
+ const { findTranscriptByUuid } = await import('./index36.js');
35
+ const foundPath = await findTranscriptByUuid(pathOrUuid, searchDirectories);
36
+ if (foundPath) {
37
+ const transcript = PklTranscript.open(foundPath, { readOnly: true });
38
+ const uuid = transcript.metadata.id;
39
+ transcript.close();
40
+ return { exists: true, path: foundPath, uuid };
41
+ }
42
+ return { exists: false };
43
+ }
44
+ const result = await transcriptExists(ensurePklExtension(pathOrUuid));
45
+ return { exists: result.exists, path: result.path ?? void 0 };
46
+ }
47
+ async function resolveTranscriptPath(identifier, baseDirectory) {
48
+ let basePath = identifier;
49
+ if (baseDirectory && !path.isAbsolute(identifier)) {
50
+ basePath = path.resolve(baseDirectory, identifier);
51
+ }
52
+ return transcriptExists(basePath);
53
+ }
54
+ async function readTranscriptContent(filePath) {
55
+ const pklPath = ensurePklExtension(filePath);
56
+ const transcript = PklTranscript.open(pklPath, { readOnly: true });
57
+ try {
58
+ const pklMetadata = transcript.metadata;
59
+ return {
60
+ content: transcript.content,
61
+ mimeType: "text/plain",
62
+ metadata: convertPklMetadataToLegacy(pklMetadata),
63
+ title: pklMetadata.title
64
+ };
65
+ } finally {
66
+ transcript.close();
67
+ }
68
+ }
69
+ function convertPklMetadataToLegacy(pklMetadata) {
70
+ return {
71
+ date: pklMetadata.date instanceof Date ? pklMetadata.date.toISOString().split("T")[0] : void 0,
72
+ time: pklMetadata.recordingTime,
73
+ project: pklMetadata.project,
74
+ projectId: pklMetadata.projectId,
75
+ destination: pklMetadata.routing?.destination,
76
+ confidence: pklMetadata.routing?.confidence?.toString(),
77
+ tags: pklMetadata.tags,
78
+ duration: pklMetadata.duration,
79
+ status: pklMetadata.status,
80
+ tasks: pklMetadata.tasks,
81
+ entities: pklMetadata.entities,
82
+ history: pklMetadata.history
83
+ };
84
+ }
85
+
86
+ export { convertPklMetadataToLegacy, ensurePklExtension, getTranscriptGlobPattern, isPklFile, readTranscriptContent, resolveTranscriptPath, stripTranscriptExtension, transcriptExists, transcriptExistsUuid };
87
+ //# sourceMappingURL=index38.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index38.js","sources":["../src/transcript/pkl-utils.ts"],"sourcesContent":["/**\n * PKL Transcript Utilities\n * \n * Simple utility functions for working with .pkl transcript files.\n * This replaces the dual-format format-adapter.ts with PKL-only operations.\n */\n\nimport * as path from 'node:path';\nimport * as fs from 'fs/promises';\nimport { PklTranscript, isUuidInput } from '@redaksjon/protokoll-format';\nimport type { TranscriptMetadata as PklMetadata } from '@redaksjon/protokoll-format';\n\n/**\n * Check if a file is a .pkl transcript\n */\nexport function isPklFile(filePath: string): boolean {\n return path.extname(filePath).toLowerCase() === '.pkl';\n}\n\n/**\n * Get the glob pattern for finding transcript files (PKL only)\n */\nexport function getTranscriptGlobPattern(): string {\n return '**/*.pkl';\n}\n\n/**\n * Strip .pkl extension from a transcript path\n * Used for creating extension-agnostic identifiers\n */\nexport function stripTranscriptExtension(filePath: string): string {\n return filePath.replace(/\\.pkl$/i, '');\n}\n\n/**\n * Ensure a path has .pkl extension\n */\nexport function ensurePklExtension(filePath: string): string {\n if (isPklFile(filePath)) {\n return filePath;\n }\n // Remove any .md extension if present, add .pkl\n return filePath.replace(/\\.md$/i, '') + '.pkl';\n}\n\n/**\n * Check if a transcript file exists\n * \n * If the path has .pkl extension, checks that file.\n * If no extension, adds .pkl and checks.\n */\nexport async function transcriptExists(basePath: string): Promise<{ exists: boolean; path: string | null }> {\n const pklPath = ensurePklExtension(basePath);\n \n try {\n await fs.access(pklPath);\n return { exists: true, path: pklPath };\n } catch {\n return { exists: false, path: null };\n }\n}\n\n/**\n * Enhanced transcript existence check supporting UUID\n * \n * @param pathOrUuid - File path or UUID to check\n * @param searchDirectories - Optional directories to search if UUID is provided\n * @returns Existence info with path and UUID if found\n */\nexport async function transcriptExistsUuid(\n pathOrUuid: string,\n searchDirectories?: string[]\n): Promise<{ exists: boolean; path?: string; uuid?: string }> {\n if (isUuidInput(pathOrUuid)) {\n if (!searchDirectories || searchDirectories.length === 0) {\n return { exists: false };\n }\n // Import dynamically to avoid circular dependency\n const { findTranscriptByUuid } = await import('./operations');\n const foundPath = await findTranscriptByUuid(pathOrUuid, searchDirectories);\n if (foundPath) {\n // Extract UUID from found file\n const transcript = PklTranscript.open(foundPath, { readOnly: true });\n const uuid = transcript.metadata.id;\n transcript.close();\n return { exists: true, path: foundPath, uuid };\n }\n return { exists: false };\n }\n \n // Fallback to existing transcriptExists logic\n const result = await transcriptExists(ensurePklExtension(pathOrUuid));\n return { exists: result.exists, path: result.path ?? undefined };\n}\n\n/**\n * Resolve a transcript identifier to an actual file path\n * \n * @param identifier The transcript identifier (with or without extension)\n * @param baseDirectory Optional base directory to resolve relative paths\n * @returns The resolved file info\n */\nexport async function resolveTranscriptPath(\n identifier: string,\n baseDirectory?: string\n): Promise<{ exists: boolean; path: string | null }> {\n let basePath = identifier;\n if (baseDirectory && !path.isAbsolute(identifier)) {\n basePath = path.resolve(baseDirectory, identifier);\n }\n \n return transcriptExists(basePath);\n}\n\n/**\n * Read transcript content from a .pkl file\n * Returns the content and metadata\n */\nexport async function readTranscriptContent(filePath: string): Promise<{\n content: string;\n mimeType: string;\n metadata: Record<string, unknown>;\n title?: string;\n}> {\n const pklPath = ensurePklExtension(filePath);\n const transcript = PklTranscript.open(pklPath, { readOnly: true });\n \n try {\n const pklMetadata = transcript.metadata;\n return {\n content: transcript.content,\n mimeType: 'text/plain',\n metadata: convertPklMetadataToLegacy(pklMetadata),\n title: pklMetadata.title,\n };\n } finally {\n transcript.close();\n }\n}\n\n/**\n * Convert PklTranscript metadata to a simpler format for legacy compatibility\n */\nexport function convertPklMetadataToLegacy(\n pklMetadata: PklMetadata\n): Record<string, unknown> {\n return {\n date: pklMetadata.date instanceof Date \n ? pklMetadata.date.toISOString().split('T')[0] \n : undefined,\n time: pklMetadata.recordingTime,\n project: pklMetadata.project,\n projectId: pklMetadata.projectId,\n destination: pklMetadata.routing?.destination,\n confidence: pklMetadata.routing?.confidence?.toString(),\n tags: pklMetadata.tags,\n duration: pklMetadata.duration,\n status: pklMetadata.status,\n tasks: pklMetadata.tasks,\n entities: pklMetadata.entities,\n history: pklMetadata.history,\n };\n}\n"],"names":[],"mappings":"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"}
@@ -0,0 +1,122 @@
1
+ import { getLogger } from './index41.js';
2
+
3
+ const create = () => {
4
+ const logger = getLogger();
5
+ let startTime = /* @__PURE__ */ new Date();
6
+ let whisperDuration = 0;
7
+ let iterations = 0;
8
+ let originalLength = 0;
9
+ let correctedLength = 0;
10
+ let correctionsApplied = 0;
11
+ let model = "";
12
+ let tokensUsed = 0;
13
+ const unknownEntities = [];
14
+ const resolvedEntities = /* @__PURE__ */ new Map();
15
+ const toolCalls = /* @__PURE__ */ new Map();
16
+ const contextChanges = [];
17
+ let routingDecision;
18
+ const start = () => {
19
+ startTime = /* @__PURE__ */ new Date();
20
+ logger.debug("Reflection collector started");
21
+ };
22
+ const recordWhisper = (duration) => {
23
+ whisperDuration = duration;
24
+ };
25
+ const recordToolCall = (name, duration, success) => {
26
+ iterations++;
27
+ if (!toolCalls.has(name)) {
28
+ toolCalls.set(name, { count: 0, successCount: 0, totalDuration: 0 });
29
+ }
30
+ const stats = toolCalls.get(name);
31
+ stats.count++;
32
+ stats.totalDuration += duration;
33
+ if (success) {
34
+ stats.successCount++;
35
+ }
36
+ };
37
+ const recordCorrection = (original, corrected) => {
38
+ if (originalLength === 0) {
39
+ originalLength = original.length;
40
+ }
41
+ correctedLength = corrected.length;
42
+ correctionsApplied++;
43
+ };
44
+ const recordUnknownEntity = (entity) => {
45
+ unknownEntities.push(entity);
46
+ };
47
+ const recordResolvedEntity = (entity, resolved) => {
48
+ resolvedEntities.set(entity, resolved);
49
+ };
50
+ const recordModelResponse = (m, tokens) => {
51
+ model = m;
52
+ tokensUsed += tokens;
53
+ };
54
+ const recordContextChange = (change) => {
55
+ contextChanges.push(change);
56
+ logger.info('Context change recorded: %s %s "%s"', change.action, change.entityType, change.entityName);
57
+ };
58
+ const getContextChanges = () => {
59
+ return [...contextChanges];
60
+ };
61
+ const recordRoutingDecision = (decision) => {
62
+ routingDecision = decision;
63
+ logger.debug(
64
+ "Routing decision recorded: project=%s, confidence=%.1f%%",
65
+ decision.projectId || "default",
66
+ decision.confidence * 100
67
+ );
68
+ };
69
+ const getRoutingDecision = () => {
70
+ return routingDecision;
71
+ };
72
+ const getMetrics = () => {
73
+ const endTime = /* @__PURE__ */ new Date();
74
+ const totalDuration = endTime.getTime() - startTime.getTime();
75
+ const reasoningDuration = totalDuration - whisperDuration;
76
+ return {
77
+ startTime,
78
+ endTime,
79
+ totalDuration,
80
+ whisperDuration,
81
+ reasoningDuration,
82
+ iterations,
83
+ toolCallsExecuted: Array.from(toolCalls.values()).reduce((sum, t) => sum + t.count, 0),
84
+ toolsUsed: Array.from(toolCalls.keys()),
85
+ originalLength,
86
+ correctedLength,
87
+ correctionsApplied,
88
+ unknownEntitiesFound: unknownEntities.length,
89
+ entitiesResolved: resolvedEntities.size,
90
+ model,
91
+ tokensUsed
92
+ };
93
+ };
94
+ const getToolEffectiveness = () => {
95
+ return Array.from(toolCalls.entries()).map(([name, stats]) => ({
96
+ name,
97
+ callCount: stats.count,
98
+ successCount: stats.successCount,
99
+ failureCount: stats.count - stats.successCount,
100
+ avgDuration: stats.count > 0 ? stats.totalDuration / stats.count : 0,
101
+ successRate: stats.count > 0 ? stats.successCount / stats.count : 0
102
+ }));
103
+ };
104
+ return {
105
+ start,
106
+ recordWhisper,
107
+ recordToolCall,
108
+ recordCorrection,
109
+ recordUnknownEntity,
110
+ recordResolvedEntity,
111
+ recordModelResponse,
112
+ recordContextChange,
113
+ recordRoutingDecision,
114
+ getMetrics,
115
+ getToolEffectiveness,
116
+ getContextChanges,
117
+ getRoutingDecision
118
+ };
119
+ };
120
+
121
+ export { create };
122
+ //# sourceMappingURL=index39.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index39.js","sources":["../src/reflection/collector.ts"],"sourcesContent":["/**\n * Metrics Collector\n *\n * Collects metrics during transcription for self-reflection reporting.\n */\n\nimport { TranscriptionMetrics, ToolEffectiveness, ContextChange, RoutingDecisionRecord } from './types';\nimport * as Logging from '../logging';\n\nexport interface CollectorInstance {\n start(): void;\n recordWhisper(duration: number): void;\n recordToolCall(name: string, duration: number, success: boolean): void;\n recordCorrection(original: string, corrected: string): void;\n recordUnknownEntity(entity: string): void;\n recordResolvedEntity(entity: string, resolved: string): void;\n recordModelResponse(model: string, tokens: number): void;\n recordContextChange(change: ContextChange): void;\n recordRoutingDecision(decision: RoutingDecisionRecord): void;\n getMetrics(): TranscriptionMetrics;\n getToolEffectiveness(): ToolEffectiveness[];\n getContextChanges(): ContextChange[];\n getRoutingDecision(): RoutingDecisionRecord | undefined;\n}\n\ninterface ToolStats {\n count: number;\n successCount: number;\n totalDuration: number;\n}\n\nexport const create = (): CollectorInstance => {\n const logger = Logging.getLogger();\n \n let startTime: Date = new Date();\n let whisperDuration = 0;\n let iterations = 0;\n let originalLength = 0;\n let correctedLength = 0;\n let correctionsApplied = 0;\n let model = '';\n let tokensUsed = 0;\n \n const unknownEntities: string[] = [];\n const resolvedEntities: Map<string, string> = new Map();\n const toolCalls: Map<string, ToolStats> = new Map();\n const contextChanges: ContextChange[] = [];\n let routingDecision: RoutingDecisionRecord | undefined;\n \n const start = () => {\n startTime = new Date();\n logger.debug('Reflection collector started');\n };\n \n const recordWhisper = (duration: number) => {\n whisperDuration = duration;\n };\n \n const recordToolCall = (name: string, duration: number, success: boolean) => {\n iterations++;\n \n if (!toolCalls.has(name)) {\n toolCalls.set(name, { count: 0, successCount: 0, totalDuration: 0 });\n }\n \n const stats = toolCalls.get(name)!;\n stats.count++;\n stats.totalDuration += duration;\n if (success) {\n stats.successCount++;\n }\n };\n \n const recordCorrection = (original: string, corrected: string) => {\n if (originalLength === 0) {\n originalLength = original.length;\n }\n correctedLength = corrected.length;\n correctionsApplied++;\n };\n \n const recordUnknownEntity = (entity: string) => {\n unknownEntities.push(entity);\n };\n \n const recordResolvedEntity = (entity: string, resolved: string) => {\n resolvedEntities.set(entity, resolved);\n };\n \n const recordModelResponse = (m: string, tokens: number) => {\n model = m;\n tokensUsed += tokens;\n };\n \n const recordContextChange = (change: ContextChange) => {\n contextChanges.push(change);\n logger.info('Context change recorded: %s %s \"%s\"', change.action, change.entityType, change.entityName);\n };\n\n const getContextChanges = (): ContextChange[] => {\n return [...contextChanges];\n };\n\n const recordRoutingDecision = (decision: RoutingDecisionRecord) => {\n routingDecision = decision;\n logger.debug('Routing decision recorded: project=%s, confidence=%.1f%%', \n decision.projectId || 'default', decision.confidence * 100);\n };\n\n const getRoutingDecision = (): RoutingDecisionRecord | undefined => {\n return routingDecision;\n };\n \n const getMetrics = (): TranscriptionMetrics => {\n const endTime = new Date();\n const totalDuration = endTime.getTime() - startTime.getTime();\n const reasoningDuration = totalDuration - whisperDuration;\n \n return {\n startTime,\n endTime,\n totalDuration,\n whisperDuration,\n reasoningDuration,\n iterations,\n toolCallsExecuted: Array.from(toolCalls.values()).reduce((sum, t) => sum + t.count, 0),\n toolsUsed: Array.from(toolCalls.keys()),\n originalLength,\n correctedLength,\n correctionsApplied,\n unknownEntitiesFound: unknownEntities.length,\n entitiesResolved: resolvedEntities.size,\n model,\n tokensUsed,\n };\n };\n \n const getToolEffectiveness = (): ToolEffectiveness[] => {\n return Array.from(toolCalls.entries()).map(([name, stats]) => ({\n name,\n callCount: stats.count,\n successCount: stats.successCount,\n failureCount: stats.count - stats.successCount,\n avgDuration: stats.count > 0 ? stats.totalDuration / stats.count : 0,\n successRate: stats.count > 0 ? stats.successCount / stats.count : 0,\n }));\n };\n \n return {\n start,\n recordWhisper,\n recordToolCall,\n recordCorrection,\n recordUnknownEntity,\n recordResolvedEntity,\n recordModelResponse,\n recordContextChange,\n recordRoutingDecision,\n getMetrics,\n getToolEffectiveness,\n getContextChanges,\n getRoutingDecision,\n };\n};\n\n"],"names":["Logging.getLogger"],"mappings":"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"}
package/dist/index4.js ADDED
@@ -0,0 +1,3 @@
1
+ export { create, createTranscribePrompt } from './index22.js';
2
+ export { TEMPLATES, clearAllTemplates, getTemplate, getTemplateNames, initializeTemplates, selectTemplate } from './index23.js';
3
+ //# sourceMappingURL=index4.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index4.js","sources":[],"sourcesContent":[],"names":[],"mappings":";"}
@@ -0,0 +1,299 @@
1
+ import * as fs from 'fs/promises';
2
+ import { getLogger } from './index41.js';
3
+
4
+ const create = (config) => {
5
+ const logger = getLogger();
6
+ const assessQuality = (metrics, toolEffectiveness) => {
7
+ const nameAccuracy = metrics.unknownEntitiesFound > 0 ? metrics.entitiesResolved / metrics.unknownEntitiesFound : 1;
8
+ const contentPreservation = metrics.originalLength > 0 ? Math.min(metrics.correctedLength / metrics.originalLength, 1) : 1;
9
+ const avgToolSuccess = toolEffectiveness.length > 0 ? toolEffectiveness.reduce((sum, t) => sum + t.successRate, 0) / toolEffectiveness.length : 1;
10
+ const confidence = nameAccuracy * 0.4 + contentPreservation * 0.3 + avgToolSuccess * 0.3;
11
+ return {
12
+ confidence,
13
+ nameAccuracy,
14
+ routingConfidence: 0.9,
15
+ // Would be calculated from routing decision
16
+ contentPreservation,
17
+ overallScore: confidence
18
+ };
19
+ };
20
+ const generateRecommendations = (metrics, toolEffectiveness, quality) => {
21
+ const recommendations = [];
22
+ const failedTools = toolEffectiveness.filter((t) => t.successRate < 0.8);
23
+ if (failedTools.length > 0) {
24
+ recommendations.push({
25
+ type: "tool-issue",
26
+ severity: "high",
27
+ message: `${failedTools.length} tool(s) had low success rates`,
28
+ suggestion: `Review tool implementations: ${failedTools.map((t) => t.name).join(", ")}`
29
+ });
30
+ }
31
+ if (metrics.unknownEntitiesFound > metrics.entitiesResolved) {
32
+ const unresolved = metrics.unknownEntitiesFound - metrics.entitiesResolved;
33
+ recommendations.push({
34
+ type: "context-gap",
35
+ severity: "medium",
36
+ message: `${unresolved} entities could not be resolved`,
37
+ suggestion: "Run in interactive mode to add new context entries"
38
+ });
39
+ }
40
+ if (metrics.iterations > 10) {
41
+ recommendations.push({
42
+ type: "context-gap",
43
+ severity: "medium",
44
+ message: `High iteration count (${metrics.iterations}) - model may be struggling to route this note`,
45
+ suggestion: 'Add explicit trigger phrases to your project context files (e.g., "update on [project]")'
46
+ });
47
+ }
48
+ if (metrics.totalDuration > 3e5) {
49
+ recommendations.push({
50
+ type: "performance",
51
+ severity: "low",
52
+ message: `Processing took ${(metrics.totalDuration / 1e3).toFixed(1)}s`,
53
+ suggestion: "Consider reviewing context files - unclear routing can cause excessive iterations"
54
+ });
55
+ }
56
+ if (quality.contentPreservation < 0.9) {
57
+ recommendations.push({
58
+ type: "quality",
59
+ severity: "high",
60
+ message: "Significant content may have been lost",
61
+ suggestion: "Review prompt to ensure full content preservation"
62
+ });
63
+ }
64
+ return recommendations;
65
+ };
66
+ const generate = (collector, audioFile, outputFile, conversationHistory, output) => {
67
+ const metrics = collector.getMetrics();
68
+ const toolEffectiveness = collector.getToolEffectiveness();
69
+ const contextChanges = collector.getContextChanges();
70
+ const routingDecision = collector.getRoutingDecision();
71
+ const quality = assessQuality(metrics, toolEffectiveness);
72
+ const recommendations = generateRecommendations(metrics, toolEffectiveness, quality);
73
+ return {
74
+ id: `reflection-${Date.now()}`,
75
+ generated: /* @__PURE__ */ new Date(),
76
+ audioFile,
77
+ outputFile,
78
+ summary: {
79
+ duration: metrics.totalDuration,
80
+ iterations: metrics.iterations,
81
+ toolCalls: metrics.toolCallsExecuted,
82
+ corrections: metrics.correctionsApplied,
83
+ confidence: quality.confidence
84
+ },
85
+ metrics,
86
+ toolEffectiveness,
87
+ quality,
88
+ recommendations,
89
+ routingDecision,
90
+ contextChanges: contextChanges.length > 0 ? contextChanges : void 0,
91
+ conversationHistory: config.includeConversation ? conversationHistory : void 0,
92
+ output: config.includeOutput ? output : void 0
93
+ };
94
+ };
95
+ const formatMarkdown = (report) => {
96
+ let md = `# Protokoll - Self-Reflection Report
97
+
98
+ `;
99
+ md += `**Generated:** ${report.generated.toISOString()}
100
+ `;
101
+ md += `**Audio File:** ${report.audioFile}
102
+ `;
103
+ md += `**Output:** ${report.outputFile}
104
+
105
+ `;
106
+ md += `## Summary
107
+
108
+ `;
109
+ md += `- **Duration**: ${(report.summary.duration / 1e3).toFixed(1)}s
110
+ `;
111
+ md += `- **Iterations**: ${report.summary.iterations}
112
+ `;
113
+ md += `- **Tool Calls**: ${report.summary.toolCalls}
114
+ `;
115
+ md += `- **Corrections**: ${report.summary.corrections}
116
+ `;
117
+ md += `- **Confidence**: ${(report.summary.confidence * 100).toFixed(1)}%
118
+
119
+ `;
120
+ md += `## Quality Assessment
121
+
122
+ `;
123
+ md += `- **Overall Score**: ${(report.quality.overallScore * 100).toFixed(1)}%
124
+ `;
125
+ md += `- **Name Accuracy**: ${(report.quality.nameAccuracy * 100).toFixed(1)}%
126
+ `;
127
+ md += `- **Content Preservation**: ${(report.quality.contentPreservation * 100).toFixed(1)}%
128
+ `;
129
+ md += `- **Routing Confidence**: ${(report.quality.routingConfidence * 100).toFixed(1)}%
130
+
131
+ `;
132
+ if (report.routingDecision) {
133
+ const rd = report.routingDecision;
134
+ md += `## Routing Decision
135
+
136
+ `;
137
+ md += `**Project**: ${rd.projectId || "(default routing)"}
138
+ `;
139
+ md += `**Destination**: \`${rd.destination}\`
140
+ `;
141
+ md += `**Confidence**: ${(rd.confidence * 100).toFixed(1)}%
142
+
143
+ `;
144
+ md += `### Reasoning
145
+
146
+ `;
147
+ md += `${rd.reasoning}
148
+
149
+ `;
150
+ if (rd.signals && rd.signals.length > 0) {
151
+ md += `### Classification Signals
152
+
153
+ `;
154
+ md += `| Signal Type | Value | Weight | Source |
155
+ `;
156
+ md += `|-------------|-------|--------|--------|
157
+ `;
158
+ for (const signal of rd.signals) {
159
+ const source = signal.source || "-";
160
+ md += `| ${signal.type} | "${signal.value}" | ${(signal.weight * 100).toFixed(0)}% | ${source} |
161
+ `;
162
+ }
163
+ md += "\n";
164
+ }
165
+ if (rd.alternativesConsidered && rd.alternativesConsidered.length > 0) {
166
+ md += `### Alternatives Considered
167
+
168
+ `;
169
+ for (const alt of rd.alternativesConsidered) {
170
+ md += `- **${alt.projectId}** (${(alt.confidence * 100).toFixed(1)}% confidence)
171
+ `;
172
+ md += ` - Not chosen because: ${alt.whyNotChosen}
173
+ `;
174
+ }
175
+ md += "\n";
176
+ }
177
+ if (rd.userConfirmed) {
178
+ md += `*User confirmed this routing decision in interactive mode.*
179
+
180
+ `;
181
+ }
182
+ if (rd.feedbackProvided) {
183
+ md += `### Feedback Received
184
+
185
+ `;
186
+ md += `This routing was later corrected: ${rd.feedbackCorrection}
187
+
188
+ `;
189
+ }
190
+ }
191
+ if (report.toolEffectiveness.length > 0) {
192
+ md += `## Tool Effectiveness
193
+
194
+ `;
195
+ md += `| Tool | Calls | Success | Failure | Success Rate | Avg Duration |
196
+ `;
197
+ md += `|------|-------|---------|---------|--------------|-------------|
198
+ `;
199
+ for (const tool of report.toolEffectiveness) {
200
+ md += `| ${tool.name} | ${tool.callCount} | ${tool.successCount} | ${tool.failureCount} | `;
201
+ md += `${(tool.successRate * 100).toFixed(1)}% | ${tool.avgDuration.toFixed(0)}ms |
202
+ `;
203
+ }
204
+ md += "\n";
205
+ }
206
+ if (report.recommendations.length > 0) {
207
+ md += `## Recommendations
208
+
209
+ `;
210
+ const bySeverity = {
211
+ high: report.recommendations.filter((r) => r.severity === "high"),
212
+ medium: report.recommendations.filter((r) => r.severity === "medium"),
213
+ low: report.recommendations.filter((r) => r.severity === "low")
214
+ };
215
+ if (bySeverity.high.length > 0) {
216
+ md += `### 🔴 High Priority
217
+
218
+ `;
219
+ bySeverity.high.forEach((rec, i) => {
220
+ md += `${i + 1}. **${rec.message}**
221
+ `;
222
+ if (rec.suggestion) md += ` - ${rec.suggestion}
223
+ `;
224
+ });
225
+ md += "\n";
226
+ }
227
+ if (bySeverity.medium.length > 0) {
228
+ md += `### 🟡 Medium Priority
229
+
230
+ `;
231
+ bySeverity.medium.forEach((rec, i) => {
232
+ md += `${i + 1}. **${rec.message}**
233
+ `;
234
+ if (rec.suggestion) md += ` - ${rec.suggestion}
235
+ `;
236
+ });
237
+ md += "\n";
238
+ }
239
+ if (bySeverity.low.length > 0) {
240
+ md += `### 🟢 Low Priority
241
+
242
+ `;
243
+ bySeverity.low.forEach((rec, i) => {
244
+ md += `${i + 1}. **${rec.message}**
245
+ `;
246
+ if (rec.suggestion) md += ` - ${rec.suggestion}
247
+ `;
248
+ });
249
+ md += "\n";
250
+ }
251
+ }
252
+ if (report.contextChanges && report.contextChanges.length > 0) {
253
+ md += `## Context Changes
254
+
255
+ `;
256
+ md += `The following context entries were created or updated during this session:
257
+
258
+ `;
259
+ for (const change of report.contextChanges) {
260
+ const emoji = change.action === "created" ? "✨" : "📝";
261
+ md += `${emoji} **${change.action.charAt(0).toUpperCase() + change.action.slice(1)} ${change.entityType}**: ${change.entityName}
262
+ `;
263
+ if (change.details) {
264
+ const details = change.details;
265
+ const routing = details.routing;
266
+ const destination = details.destination || routing?.destination;
267
+ if (destination) {
268
+ md += ` - Routing to: \`${destination}\`
269
+ `;
270
+ }
271
+ }
272
+ }
273
+ md += "\n";
274
+ }
275
+ md += `---
276
+
277
+ `;
278
+ md += `*Report generated by Protokoll Self-Reflection System*
279
+ `;
280
+ return md;
281
+ };
282
+ const formatJson = (report) => {
283
+ return JSON.stringify(report, null, 2);
284
+ };
285
+ const save = async (report, path) => {
286
+ const content = config.format === "markdown" ? formatMarkdown(report) : formatJson(report);
287
+ await fs.writeFile(path, content, "utf-8");
288
+ logger.info("Saved reflection report", { path });
289
+ };
290
+ return {
291
+ generate,
292
+ formatMarkdown,
293
+ formatJson,
294
+ save
295
+ };
296
+ };
297
+
298
+ export { create };
299
+ //# sourceMappingURL=index40.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index40.js","sources":["../src/reflection/reporter.ts"],"sourcesContent":["/**\n * Report Generator\n *\n * Generates self-reflection reports in markdown or JSON format.\n */\n\nimport { \n ReflectionReport, \n ReflectionConfig, \n TranscriptionMetrics, \n ToolEffectiveness,\n QualityAssessment,\n Recommendation \n} from './types';\nimport * as Collector from './collector';\nimport * as fs from 'fs/promises';\nimport * as Logging from '../logging';\n\nexport interface ReporterInstance {\n generate(\n collector: Collector.CollectorInstance,\n audioFile: string,\n outputFile: string,\n conversationHistory?: unknown[],\n output?: string\n ): ReflectionReport;\n \n formatMarkdown(report: ReflectionReport): string;\n formatJson(report: ReflectionReport): string;\n save(report: ReflectionReport, path: string): Promise<void>;\n}\n\nexport const create = (config: ReflectionConfig): ReporterInstance => {\n const logger = Logging.getLogger();\n \n const assessQuality = (\n metrics: TranscriptionMetrics,\n toolEffectiveness: ToolEffectiveness[]\n ): QualityAssessment => {\n // Calculate name accuracy based on resolution rate\n const nameAccuracy = metrics.unknownEntitiesFound > 0\n ? metrics.entitiesResolved / metrics.unknownEntitiesFound\n : 1.0;\n \n // Content preservation (should be close to 1.0)\n const contentPreservation = metrics.originalLength > 0\n ? Math.min(metrics.correctedLength / metrics.originalLength, 1.0)\n : 1.0;\n \n // Tool success rate\n const avgToolSuccess = toolEffectiveness.length > 0\n ? toolEffectiveness.reduce((sum, t) => sum + t.successRate, 0) / toolEffectiveness.length\n : 1.0;\n \n // Overall confidence\n const confidence = (nameAccuracy * 0.4) + (contentPreservation * 0.3) + (avgToolSuccess * 0.3);\n \n return {\n confidence,\n nameAccuracy,\n routingConfidence: 0.9, // Would be calculated from routing decision\n contentPreservation,\n overallScore: confidence,\n };\n };\n \n const generateRecommendations = (\n metrics: TranscriptionMetrics,\n toolEffectiveness: ToolEffectiveness[],\n quality: QualityAssessment\n ): Recommendation[] => {\n const recommendations: Recommendation[] = [];\n \n // Check for tool failures\n const failedTools = toolEffectiveness.filter(t => t.successRate < 0.8);\n if (failedTools.length > 0) {\n recommendations.push({\n type: 'tool-issue',\n severity: 'high',\n message: `${failedTools.length} tool(s) had low success rates`,\n suggestion: `Review tool implementations: ${failedTools.map(t => t.name).join(', ')}`,\n });\n }\n \n // Check for unresolved entities\n if (metrics.unknownEntitiesFound > metrics.entitiesResolved) {\n const unresolved = metrics.unknownEntitiesFound - metrics.entitiesResolved;\n recommendations.push({\n type: 'context-gap',\n severity: 'medium',\n message: `${unresolved} entities could not be resolved`,\n suggestion: 'Run in interactive mode to add new context entries',\n });\n }\n \n // Check for high iteration count (real issue is usually unclear routing)\n if (metrics.iterations > 10) {\n recommendations.push({\n type: 'context-gap',\n severity: 'medium',\n message: `High iteration count (${metrics.iterations}) - model may be struggling to route this note`,\n suggestion: 'Add explicit trigger phrases to your project context files (e.g., \"update on [project]\")',\n });\n }\n \n // Only flag extremely long processing (> 5 minutes) as potential issue\n // Normal reasoning with gpt-5.2 can take 1-3 minutes and that's fine\n if (metrics.totalDuration > 300000) { // > 5 minutes\n recommendations.push({\n type: 'performance',\n severity: 'low',\n message: `Processing took ${(metrics.totalDuration / 1000).toFixed(1)}s`,\n suggestion: 'Consider reviewing context files - unclear routing can cause excessive iterations',\n });\n }\n \n // Check content preservation\n if (quality.contentPreservation < 0.9) {\n recommendations.push({\n type: 'quality',\n severity: 'high',\n message: 'Significant content may have been lost',\n suggestion: 'Review prompt to ensure full content preservation',\n });\n }\n \n return recommendations;\n };\n \n const generate = (\n collector: Collector.CollectorInstance,\n audioFile: string,\n outputFile: string,\n conversationHistory?: unknown[],\n output?: string\n ): ReflectionReport => {\n const metrics = collector.getMetrics();\n const toolEffectiveness = collector.getToolEffectiveness();\n const contextChanges = collector.getContextChanges();\n const routingDecision = collector.getRoutingDecision();\n const quality = assessQuality(metrics, toolEffectiveness);\n const recommendations = generateRecommendations(metrics, toolEffectiveness, quality);\n \n return {\n id: `reflection-${Date.now()}`,\n generated: new Date(),\n audioFile,\n outputFile,\n summary: {\n duration: metrics.totalDuration,\n iterations: metrics.iterations,\n toolCalls: metrics.toolCallsExecuted,\n corrections: metrics.correctionsApplied,\n confidence: quality.confidence,\n },\n metrics,\n toolEffectiveness,\n quality,\n recommendations,\n routingDecision,\n contextChanges: contextChanges.length > 0 ? contextChanges : undefined,\n conversationHistory: config.includeConversation ? conversationHistory : undefined,\n output: config.includeOutput ? output : undefined,\n };\n };\n \n const formatMarkdown = (report: ReflectionReport): string => {\n let md = `# Protokoll - Self-Reflection Report\\n\\n`;\n md += `**Generated:** ${report.generated.toISOString()}\\n`;\n md += `**Audio File:** ${report.audioFile}\\n`;\n md += `**Output:** ${report.outputFile}\\n\\n`;\n \n md += `## Summary\\n\\n`;\n md += `- **Duration**: ${(report.summary.duration / 1000).toFixed(1)}s\\n`;\n md += `- **Iterations**: ${report.summary.iterations}\\n`;\n md += `- **Tool Calls**: ${report.summary.toolCalls}\\n`;\n md += `- **Corrections**: ${report.summary.corrections}\\n`;\n md += `- **Confidence**: ${(report.summary.confidence * 100).toFixed(1)}%\\n\\n`;\n \n md += `## Quality Assessment\\n\\n`;\n md += `- **Overall Score**: ${(report.quality.overallScore * 100).toFixed(1)}%\\n`;\n md += `- **Name Accuracy**: ${(report.quality.nameAccuracy * 100).toFixed(1)}%\\n`;\n md += `- **Content Preservation**: ${(report.quality.contentPreservation * 100).toFixed(1)}%\\n`;\n md += `- **Routing Confidence**: ${(report.quality.routingConfidence * 100).toFixed(1)}%\\n\\n`;\n \n // Routing Decision with Reasoning\n if (report.routingDecision) {\n const rd = report.routingDecision;\n md += `## Routing Decision\\n\\n`;\n md += `**Project**: ${rd.projectId || '(default routing)'}\\n`;\n md += `**Destination**: \\`${rd.destination}\\`\\n`;\n md += `**Confidence**: ${(rd.confidence * 100).toFixed(1)}%\\n\\n`;\n \n md += `### Reasoning\\n\\n`;\n md += `${rd.reasoning}\\n\\n`;\n \n if (rd.signals && rd.signals.length > 0) {\n md += `### Classification Signals\\n\\n`;\n md += `| Signal Type | Value | Weight | Source |\\n`;\n md += `|-------------|-------|--------|--------|\\n`;\n for (const signal of rd.signals) {\n const source = signal.source || '-';\n md += `| ${signal.type} | \"${signal.value}\" | ${(signal.weight * 100).toFixed(0)}% | ${source} |\\n`;\n }\n md += '\\n';\n }\n \n if (rd.alternativesConsidered && rd.alternativesConsidered.length > 0) {\n md += `### Alternatives Considered\\n\\n`;\n for (const alt of rd.alternativesConsidered) {\n md += `- **${alt.projectId}** (${(alt.confidence * 100).toFixed(1)}% confidence)\\n`;\n md += ` - Not chosen because: ${alt.whyNotChosen}\\n`;\n }\n md += '\\n';\n }\n \n if (rd.userConfirmed) {\n md += `*User confirmed this routing decision in interactive mode.*\\n\\n`;\n }\n \n if (rd.feedbackProvided) {\n md += `### Feedback Received\\n\\n`;\n md += `This routing was later corrected: ${rd.feedbackCorrection}\\n\\n`;\n }\n }\n \n if (report.toolEffectiveness.length > 0) {\n md += `## Tool Effectiveness\\n\\n`;\n md += `| Tool | Calls | Success | Failure | Success Rate | Avg Duration |\\n`;\n md += `|------|-------|---------|---------|--------------|-------------|\\n`;\n \n for (const tool of report.toolEffectiveness) {\n md += `| ${tool.name} | ${tool.callCount} | ${tool.successCount} | ${tool.failureCount} | `;\n md += `${(tool.successRate * 100).toFixed(1)}% | ${tool.avgDuration.toFixed(0)}ms |\\n`;\n }\n md += '\\n';\n }\n \n if (report.recommendations.length > 0) {\n md += `## Recommendations\\n\\n`;\n \n const bySeverity = {\n high: report.recommendations.filter(r => r.severity === 'high'),\n medium: report.recommendations.filter(r => r.severity === 'medium'),\n low: report.recommendations.filter(r => r.severity === 'low'),\n };\n \n if (bySeverity.high.length > 0) {\n md += `### 🔴 High Priority\\n\\n`;\n bySeverity.high.forEach((rec, i) => {\n md += `${i + 1}. **${rec.message}**\\n`;\n if (rec.suggestion) md += ` - ${rec.suggestion}\\n`;\n });\n md += '\\n';\n }\n \n if (bySeverity.medium.length > 0) {\n md += `### 🟡 Medium Priority\\n\\n`;\n bySeverity.medium.forEach((rec, i) => {\n md += `${i + 1}. **${rec.message}**\\n`;\n if (rec.suggestion) md += ` - ${rec.suggestion}\\n`;\n });\n md += '\\n';\n }\n \n if (bySeverity.low.length > 0) {\n md += `### 🟢 Low Priority\\n\\n`;\n bySeverity.low.forEach((rec, i) => {\n md += `${i + 1}. **${rec.message}**\\n`;\n if (rec.suggestion) md += ` - ${rec.suggestion}\\n`;\n });\n md += '\\n';\n }\n }\n \n // Context changes section\n if (report.contextChanges && report.contextChanges.length > 0) {\n md += `## Context Changes\\n\\n`;\n md += `The following context entries were created or updated during this session:\\n\\n`;\n \n for (const change of report.contextChanges) {\n const emoji = change.action === 'created' ? '✨' : '📝';\n md += `${emoji} **${change.action.charAt(0).toUpperCase() + change.action.slice(1)} ${change.entityType}**: ${change.entityName}\\n`;\n if (change.details) {\n const details = change.details as Record<string, unknown>;\n const routing = details.routing as Record<string, unknown> | undefined;\n const destination = details.destination || routing?.destination;\n if (destination) {\n md += ` - Routing to: \\`${destination}\\`\\n`;\n }\n }\n }\n md += '\\n';\n }\n \n md += `---\\n\\n`;\n md += `*Report generated by Protokoll Self-Reflection System*\\n`;\n \n return md;\n };\n \n const formatJson = (report: ReflectionReport): string => {\n return JSON.stringify(report, null, 2);\n };\n \n const save = async (report: ReflectionReport, path: string): Promise<void> => {\n const content = config.format === 'markdown' \n ? formatMarkdown(report)\n : formatJson(report);\n \n await fs.writeFile(path, content, 'utf-8');\n logger.info('Saved reflection report', { path });\n };\n \n return {\n generate,\n formatMarkdown,\n formatJson,\n save,\n };\n};\n\n"],"names":["Logging.getLogger"],"mappings":"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"}
@@ -0,0 +1,49 @@
1
+ import winston from 'winston';
2
+ import { DATE_FORMAT_YEAR_MONTH_DAY_HOURS_MINUTES_SECONDS, PROGRAM_NAME } from './index16.js';
3
+
4
+ const createLogger = (level = "info") => {
5
+ let format = winston.format.combine(
6
+ winston.format.timestamp({ format: DATE_FORMAT_YEAR_MONTH_DAY_HOURS_MINUTES_SECONDS }),
7
+ winston.format.errors({ stack: true }),
8
+ winston.format.splat(),
9
+ winston.format.json()
10
+ );
11
+ let transports = [
12
+ new winston.transports.Console({
13
+ format: winston.format.combine(
14
+ winston.format.colorize(),
15
+ winston.format.printf(({ timestamp, level: level2, message, ...meta }) => {
16
+ const metaStr = Object.keys(meta).length ? ` ${JSON.stringify(meta)}` : "";
17
+ return `${timestamp} ${level2}: ${message}${metaStr}`;
18
+ })
19
+ )
20
+ })
21
+ ];
22
+ if (level === "info") {
23
+ format = winston.format.combine(
24
+ winston.format.errors({ stack: true }),
25
+ winston.format.splat()
26
+ );
27
+ transports = [
28
+ new winston.transports.Console({
29
+ format: winston.format.combine(
30
+ winston.format.colorize(),
31
+ winston.format.printf(({ level: level2, message }) => {
32
+ return `${level2}: ${message}`;
33
+ })
34
+ )
35
+ })
36
+ ];
37
+ }
38
+ return winston.createLogger({
39
+ level,
40
+ format,
41
+ defaultMeta: { service: PROGRAM_NAME },
42
+ transports
43
+ });
44
+ };
45
+ let logger = createLogger();
46
+ const getLogger = () => logger;
47
+
48
+ export { getLogger };
49
+ //# sourceMappingURL=index41.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index41.js","sources":["../src/logging.ts"],"sourcesContent":["import winston from 'winston';\nimport { DATE_FORMAT_YEAR_MONTH_DAY_HOURS_MINUTES_SECONDS, PROGRAM_NAME } from './constants';\n\nexport interface LogContext {\n [key: string]: any;\n}\n\nconst createLogger = (level: string = 'info') => {\n\n let format = winston.format.combine(\n winston.format.timestamp({ format: DATE_FORMAT_YEAR_MONTH_DAY_HOURS_MINUTES_SECONDS }),\n winston.format.errors({ stack: true }),\n winston.format.splat(),\n winston.format.json()\n );\n\n let transports = [\n new winston.transports.Console({\n format: winston.format.combine(\n winston.format.colorize(),\n winston.format.printf(({ timestamp, level, message, ...meta }) => {\n const metaStr = Object.keys(meta).length ? ` ${JSON.stringify(meta)}` : '';\n return `${timestamp} ${level}: ${message}${metaStr}`;\n })\n )\n })\n ];\n\n if (level === 'info') {\n format = winston.format.combine(\n winston.format.errors({ stack: true }),\n winston.format.splat(),\n );\n\n transports = [\n new winston.transports.Console({\n format: winston.format.combine(\n winston.format.colorize(),\n winston.format.printf(({ level, message }) => {\n return `${level}: ${message}`;\n })\n )\n })\n ];\n }\n\n return winston.createLogger({\n level,\n format,\n defaultMeta: { service: PROGRAM_NAME },\n transports,\n });\n};\n\nlet logger = createLogger();\n\nexport const setLogLevel = (level: string) => {\n logger = createLogger(level);\n};\n\nexport const getLogger = () => logger; "],"names":["level"],"mappings":";;;AAOA,MAAM,YAAA,GAAe,CAAC,KAAA,GAAgB,MAAA,KAAW;AAE7C,EAAA,IAAI,MAAA,GAAS,QAAQ,MAAA,CAAO,OAAA;AAAA,IACxB,QAAQ,MAAA,CAAO,SAAA,CAAU,EAAE,MAAA,EAAQ,kDAAkD,CAAA;AAAA,IACrF,QAAQ,MAAA,CAAO,MAAA,CAAO,EAAE,KAAA,EAAO,MAAM,CAAA;AAAA,IACrC,OAAA,CAAQ,OAAO,KAAA,EAAM;AAAA,IACrB,OAAA,CAAQ,OAAO,IAAA;AAAK,GACxB;AAEA,EAAA,IAAI,UAAA,GAAa;AAAA,IACb,IAAI,OAAA,CAAQ,UAAA,CAAW,OAAA,CAAQ;AAAA,MAC3B,MAAA,EAAQ,QAAQ,MAAA,CAAO,OAAA;AAAA,QACnB,OAAA,CAAQ,OAAO,QAAA,EAAS;AAAA,QACxB,OAAA,CAAQ,MAAA,CAAO,MAAA,CAAO,CAAC,EAAE,SAAA,EAAW,KAAA,EAAAA,MAAAA,EAAO,OAAA,EAAS,GAAG,IAAA,EAAK,KAAM;AAC9D,UAAA,MAAM,OAAA,GAAU,MAAA,CAAO,IAAA,CAAK,IAAI,CAAA,CAAE,MAAA,GAAS,CAAA,CAAA,EAAI,IAAA,CAAK,SAAA,CAAU,IAAI,CAAC,CAAA,CAAA,GAAK,EAAA;AACxE,UAAA,OAAO,GAAG,SAAS,CAAA,CAAA,EAAIA,MAAK,CAAA,EAAA,EAAK,OAAO,GAAG,OAAO,CAAA,CAAA;AAAA,QACtD,CAAC;AAAA;AACL,KACH;AAAA,GACL;AAEA,EAAA,IAAI,UAAU,MAAA,EAAQ;AAClB,IAAA,MAAA,GAAS,QAAQ,MAAA,CAAO,OAAA;AAAA,MACpB,QAAQ,MAAA,CAAO,MAAA,CAAO,EAAE,KAAA,EAAO,MAAM,CAAA;AAAA,MACrC,OAAA,CAAQ,OAAO,KAAA;AAAM,KACzB;AAEA,IAAA,UAAA,GAAa;AAAA,MACT,IAAI,OAAA,CAAQ,UAAA,CAAW,OAAA,CAAQ;AAAA,QAC3B,MAAA,EAAQ,QAAQ,MAAA,CAAO,OAAA;AAAA,UACnB,OAAA,CAAQ,OAAO,QAAA,EAAS;AAAA,UACxB,OAAA,CAAQ,OAAO,MAAA,CAAO,CAAC,EAAE,KAAA,EAAAA,MAAAA,EAAO,SAAQ,KAAM;AAC1C,YAAA,OAAO,CAAA,EAAGA,MAAK,CAAA,EAAA,EAAK,OAAO,CAAA,CAAA;AAAA,UAC/B,CAAC;AAAA;AACL,OACH;AAAA,KACL;AAAA,EACJ;AAEA,EAAA,OAAO,QAAQ,YAAA,CAAa;AAAA,IACxB,KAAA;AAAA,IACA,MAAA;AAAA,IACA,WAAA,EAAa,EAAE,OAAA,EAAS,YAAA,EAAa;AAAA,IACrC;AAAA,GACH,CAAA;AACL,CAAA;AAEA,IAAI,SAAS,YAAA,EAAa;AAMnB,MAAM,YAAY,MAAM;;;;"}