@redaksjon/protokoll-engine 0.1.4-dev.20260215203434.442d604 → 0.1.4

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 (163) hide show
  1. package/dist/agentic/executor.d.ts.map +1 -1
  2. package/dist/agentic/types.d.ts +4 -1
  3. package/dist/agentic/types.d.ts.map +1 -1
  4. package/dist/index.d.ts +2 -0
  5. package/dist/index.d.ts.map +1 -1
  6. package/dist/index.js +8 -5
  7. package/dist/index.js.map +1 -1
  8. package/dist/index10.js +4 -3
  9. package/dist/index10.js.map +1 -1
  10. package/dist/index11.js +2 -2
  11. package/dist/index12.js +3 -124
  12. package/dist/index12.js.map +1 -1
  13. package/dist/index13.js +101 -100
  14. package/dist/index13.js.map +1 -1
  15. package/dist/index14.js +109 -281
  16. package/dist/index14.js.map +1 -1
  17. package/dist/index15.js +285 -89
  18. package/dist/index15.js.map +1 -1
  19. package/dist/index16.js +97 -104
  20. package/dist/index16.js.map +1 -1
  21. package/dist/index17.js +18 -179
  22. package/dist/index17.js.map +1 -1
  23. package/dist/index18.js +102 -48
  24. package/dist/index18.js.map +1 -1
  25. package/dist/index19.js +182 -16
  26. package/dist/index19.js.map +1 -1
  27. package/dist/index2.js +3 -3
  28. package/dist/index20.js +48 -100
  29. package/dist/index20.js.map +1 -1
  30. package/dist/index21.js +16 -23
  31. package/dist/index21.js.map +1 -1
  32. package/dist/index22.js +98 -42
  33. package/dist/index22.js.map +1 -1
  34. package/dist/index23.js +19 -112
  35. package/dist/index23.js.map +1 -1
  36. package/dist/index24.js +42 -323
  37. package/dist/index24.js.map +1 -1
  38. package/dist/index25.js +114 -52
  39. package/dist/index25.js.map +1 -1
  40. package/dist/index26.js +339 -37
  41. package/dist/index26.js.map +1 -1
  42. package/dist/index27.js +51 -121
  43. package/dist/index27.js.map +1 -1
  44. package/dist/index28.js +36 -155
  45. package/dist/index28.js.map +1 -1
  46. package/dist/index29.js +114 -150
  47. package/dist/index29.js.map +1 -1
  48. package/dist/index3.js +2 -2
  49. package/dist/index30.js +171 -161
  50. package/dist/index30.js.map +1 -1
  51. package/dist/index31.js +141 -401
  52. package/dist/index31.js.map +1 -1
  53. package/dist/index32.js +158 -146
  54. package/dist/index32.js.map +1 -1
  55. package/dist/index33.js +425 -130
  56. package/dist/index33.js.map +1 -1
  57. package/dist/index34.js +145 -40
  58. package/dist/index34.js.map +1 -1
  59. package/dist/index35.js +159 -83
  60. package/dist/index35.js.map +1 -1
  61. package/dist/index36.js +46 -439
  62. package/dist/index36.js.map +1 -1
  63. package/dist/index37.js +91 -419
  64. package/dist/index37.js.map +1 -1
  65. package/dist/index38.js +447 -66
  66. package/dist/index38.js.map +1 -1
  67. package/dist/index39.js +424 -115
  68. package/dist/index39.js.map +1 -1
  69. package/dist/index4.js +2 -2
  70. package/dist/index40.js +78 -290
  71. package/dist/index40.js.map +1 -1
  72. package/dist/index41.js +112 -44
  73. package/dist/index41.js.map +1 -1
  74. package/dist/index42.js +114 -143
  75. package/dist/index42.js.map +1 -1
  76. package/dist/index43.js +280 -207
  77. package/dist/index43.js.map +1 -1
  78. package/dist/index44.js +283 -41
  79. package/dist/index44.js.map +1 -1
  80. package/dist/index45.js +137 -38
  81. package/dist/index45.js.map +1 -1
  82. package/dist/index46.js +120 -32
  83. package/dist/index46.js.map +1 -1
  84. package/dist/index47.js +45 -4
  85. package/dist/index47.js.map +1 -1
  86. package/dist/index48.js +143 -43
  87. package/dist/index48.js.map +1 -1
  88. package/dist/index49.js +221 -34
  89. package/dist/index49.js.map +1 -1
  90. package/dist/index5.js +3 -3
  91. package/dist/index50.js +43 -233
  92. package/dist/index50.js.map +1 -1
  93. package/dist/index51.js +38 -156
  94. package/dist/index51.js.map +1 -1
  95. package/dist/index52.js +31 -75
  96. package/dist/index52.js.map +1 -1
  97. package/dist/index53.js +46 -73
  98. package/dist/index53.js.map +1 -1
  99. package/dist/index54.js +33 -144
  100. package/dist/index54.js.map +1 -1
  101. package/dist/index55.js +236 -5
  102. package/dist/index55.js.map +1 -1
  103. package/dist/index56.js +160 -5
  104. package/dist/index56.js.map +1 -1
  105. package/dist/index57.js +78 -14
  106. package/dist/index57.js.map +1 -1
  107. package/dist/index58.js +76 -2
  108. package/dist/index58.js.map +1 -1
  109. package/dist/index59.js +5 -14
  110. package/dist/index59.js.map +1 -1
  111. package/dist/index6.js +4 -4
  112. package/dist/index6.js.map +1 -1
  113. package/dist/index60.js +6 -2
  114. package/dist/index60.js.map +1 -1
  115. package/dist/index61.js +6 -4
  116. package/dist/index61.js.map +1 -1
  117. package/dist/index62.js +151 -0
  118. package/dist/index62.js.map +1 -0
  119. package/dist/index63.js +17 -0
  120. package/dist/index63.js.map +1 -0
  121. package/dist/index64.js +4 -0
  122. package/dist/index64.js.map +1 -0
  123. package/dist/index65.js +17 -0
  124. package/dist/index65.js.map +1 -0
  125. package/dist/index66.js +4 -0
  126. package/dist/index66.js.map +1 -0
  127. package/dist/index67.js +6 -0
  128. package/dist/index67.js.map +1 -0
  129. package/dist/index7.js +2 -2
  130. package/dist/index8.js +1 -1
  131. package/dist/index9.js +4 -4
  132. package/dist/phases/simple-replace.d.ts +2 -1
  133. package/dist/phases/simple-replace.d.ts.map +1 -1
  134. package/dist/pipeline/orchestrator.d.ts.map +1 -1
  135. package/dist/pipeline/types.d.ts +3 -0
  136. package/dist/pipeline/types.d.ts.map +1 -1
  137. package/dist/routing/classifier.d.ts +2 -1
  138. package/dist/routing/classifier.d.ts.map +1 -1
  139. package/dist/routing/index.d.ts +2 -1
  140. package/dist/routing/index.d.ts.map +1 -1
  141. package/dist/routing/types.d.ts +1 -1
  142. package/dist/routing/types.d.ts.map +1 -1
  143. package/dist/transcript/index.d.ts +1 -0
  144. package/dist/transcript/index.d.ts.map +1 -1
  145. package/dist/transcript/operations.d.ts +14 -1
  146. package/dist/transcript/operations.d.ts.map +1 -1
  147. package/dist/transcript/upload-utils.d.ts +80 -0
  148. package/dist/transcript/upload-utils.d.ts.map +1 -0
  149. package/dist/util/enhancement-logger.d.ts +19 -0
  150. package/dist/util/enhancement-logger.d.ts.map +1 -0
  151. package/dist/util/metadata.d.ts +1 -0
  152. package/dist/util/metadata.d.ts.map +1 -1
  153. package/dist/weighting/builder.d.ts +126 -0
  154. package/dist/weighting/builder.d.ts.map +1 -0
  155. package/dist/weighting/index.d.ts +12 -0
  156. package/dist/weighting/index.d.ts.map +1 -0
  157. package/dist/weighting/prepositioning.d.ts +55 -0
  158. package/dist/weighting/prepositioning.d.ts.map +1 -0
  159. package/dist/weighting/provider.d.ts +78 -0
  160. package/dist/weighting/provider.d.ts.map +1 -0
  161. package/dist/weighting/types.d.ts +119 -0
  162. package/dist/weighting/types.d.ts.map +1 -0
  163. package/package.json +2 -2
@@ -1 +1 @@
1
- {"version":3,"file":"executor.d.ts","sourceRoot":"","sources":["../../src/agentic/executor.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,WAAW,EAAE,kBAAkB,EAAE,MAAM,SAAS,CAAC;AAE1D,OAAO,KAAK,SAAS,MAAM,cAAc,CAAC;AAI1C,MAAM,WAAW,mBAAmB;IAChC,UAAU,EAAE,QAAQ,GAAG,SAAS,GAAG,SAAS,GAAG,MAAM,GAAG,SAAS,CAAC;IAClE,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,SAAS,GAAG,SAAS,CAAC;IAC9B,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACrC;AAED,MAAM,WAAW,gBAAgB;IAC7B,OAAO,CAAC,cAAc,EAAE,MAAM,GAAG,OAAO,CAAC;QACrC,YAAY,EAAE,MAAM,CAAC;QACrB,KAAK,EAAE,kBAAkB,CAAC;QAC1B,SAAS,EAAE,MAAM,EAAE,CAAC;QACpB,UAAU,EAAE,MAAM,CAAC;QACnB,WAAW,CAAC,EAAE,MAAM,CAAC;QACrB,cAAc,CAAC,EAAE,mBAAmB,EAAE,CAAC;KAC1C,CAAC,CAAC;CACN;AAuFD,eAAO,MAAM,MAAM,GACf,WAAW,SAAS,CAAC,iBAAiB,EACtC,KAAK,WAAW,KACjB,gBAi4BF,CAAC"}
1
+ {"version":3,"file":"executor.d.ts","sourceRoot":"","sources":["../../src/agentic/executor.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,WAAW,EAAE,kBAAkB,EAAE,MAAM,SAAS,CAAC;AAE1D,OAAO,KAAK,SAAS,MAAM,cAAc,CAAC;AAK1C,MAAM,WAAW,mBAAmB;IAChC,UAAU,EAAE,QAAQ,GAAG,SAAS,GAAG,SAAS,GAAG,MAAM,GAAG,SAAS,CAAC;IAClE,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,SAAS,GAAG,SAAS,CAAC;IAC9B,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACrC;AAED,MAAM,WAAW,gBAAgB;IAC7B,OAAO,CAAC,cAAc,EAAE,MAAM,GAAG,OAAO,CAAC;QACrC,YAAY,EAAE,MAAM,CAAC;QACrB,KAAK,EAAE,kBAAkB,CAAC;QAC1B,SAAS,EAAE,MAAM,EAAE,CAAC;QACpB,UAAU,EAAE,MAAM,CAAC;QACnB,WAAW,CAAC,EAAE,MAAM,CAAC;QACrB,cAAc,CAAC,EAAE,mBAAmB,EAAE,CAAC;KAC1C,CAAC,CAAC;CACN;AAuFD,eAAO,MAAM,MAAM,GACf,WAAW,SAAS,CAAC,iBAAiB,EACtC,KAAK,WAAW,KACjB,gBAk5BF,CAAC"}
@@ -1,4 +1,5 @@
1
1
  import { z } from 'zod';
2
+ import { WeightModelProvider } from '../weighting/provider';
2
3
  import * as Context from '@redaksjon/context';
3
4
  import * as Routing from '../routing';
4
5
  /**
@@ -8,10 +9,10 @@ export declare const CorrectedEntitySchema: z.ZodObject<{
8
9
  original: z.ZodString;
9
10
  corrected: z.ZodString;
10
11
  type: z.ZodEnum<{
11
- company: "company";
12
12
  person: "person";
13
13
  project: "project";
14
14
  term: "term";
15
+ company: "company";
15
16
  }>;
16
17
  confidence: z.ZodNumber;
17
18
  }, z.core.$strip>;
@@ -80,6 +81,8 @@ export interface ToolContext {
80
81
  routingInstance: Routing.RoutingInstance;
81
82
  interactiveMode: boolean;
82
83
  resolvedEntities?: Map<string, string>;
84
+ /** Optional: entity affinity graph predictions for LLM prepositioning */
85
+ weightModelProvider?: WeightModelProvider;
83
86
  }
84
87
  export interface ToolResult {
85
88
  success: boolean;
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/agentic/types.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,KAAK,OAAO,MAAM,oBAAoB,CAAC;AAC9C,OAAO,KAAK,OAAO,MAAM,YAAY,CAAC;AAMtC;;GAEG;AACH,eAAO,MAAM,qBAAqB;;;;;;;;;;iBAKhC,CAAC;AAEH,MAAM,MAAM,eAAe,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,qBAAqB,CAAC,CAAC;AAEpE;;;GAGG;AACH,eAAO,MAAM,qBAAqB;;;;;;;;;;;;;;;;;;;;;;;;iBAahC,CAAC;AAEH,MAAM,MAAM,eAAe,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,qBAAqB,CAAC,CAAC;AAEpE;;GAEG;AACH,eAAO,MAAM,wBAAwB;;;;;iBAKnC,CAAC;AAEH,MAAM,MAAM,wBAAwB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,wBAAwB,CAAC,CAAC;AAEhF;;GAEG;AACH,eAAO,MAAM,gBAAgB;;;;;;iBAM3B,CAAC;AAMH,MAAM,WAAW,iBAAiB;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IAEpB,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IAEhC,OAAO,EAAE,CAAC,IAAI,EAAE,GAAG,KAAK,OAAO,CAAC,UAAU,CAAC,CAAC;CAC/C;AAED,MAAM,WAAW,WAAW;IACxB,cAAc,EAAE,MAAM,CAAC;IACvB,SAAS,EAAE,IAAI,CAAC;IAChB,UAAU,EAAE,MAAM,CAAC;IACnB,eAAe,EAAE,OAAO,CAAC,eAAe,CAAC;IACzC,eAAe,EAAE,OAAO,CAAC,eAAe,CAAC;IACzC,eAAe,EAAE,OAAO,CAAC;IAEzB,gBAAgB,CAAC,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAC1C;AAED,MAAM,WAAW,UAAU;IACvB,OAAO,EAAE,OAAO,CAAC;IAEjB,IAAI,CAAC,EAAE,GAAG,CAAC;IACX,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,UAAU,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,gBAAgB;IAC7B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,QAAQ,GAAG,SAAS,GAAG,MAAM,GAAG,SAAS,CAAC;CACnD;AAED,MAAM,WAAW,kBAAkB;IAC/B,YAAY,EAAE,MAAM,CAAC;IACrB,aAAa,EAAE,MAAM,CAAC;IACtB,eAAe,EAAE,MAAM,EAAE,CAAC;IAC1B,gBAAgB,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAEtC,aAAa,CAAC,EAAE,eAAe,CAAC;IAChC,UAAU,EAAE,MAAM,CAAC;IAGnB,kBAAkB,EAAE;QAChB,MAAM,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;QACpB,QAAQ,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;QACtB,KAAK,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;QACnB,SAAS,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;KAC1B,CAAC;CACL"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/agentic/types.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,KAAK,OAAO,MAAM,oBAAoB,CAAC;AAC9C,OAAO,KAAK,OAAO,MAAM,YAAY,CAAC;AACtC,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AAMjE;;GAEG;AACH,eAAO,MAAM,qBAAqB;;;;;;;;;;iBAKhC,CAAC;AAEH,MAAM,MAAM,eAAe,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,qBAAqB,CAAC,CAAC;AAEpE;;;GAGG;AACH,eAAO,MAAM,qBAAqB;;;;;;;;;;;;;;;;;;;;;;;;iBAahC,CAAC;AAEH,MAAM,MAAM,eAAe,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,qBAAqB,CAAC,CAAC;AAEpE;;GAEG;AACH,eAAO,MAAM,wBAAwB;;;;;iBAKnC,CAAC;AAEH,MAAM,MAAM,wBAAwB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,wBAAwB,CAAC,CAAC;AAEhF;;GAEG;AACH,eAAO,MAAM,gBAAgB;;;;;;iBAM3B,CAAC;AAMH,MAAM,WAAW,iBAAiB;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IAEpB,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IAEhC,OAAO,EAAE,CAAC,IAAI,EAAE,GAAG,KAAK,OAAO,CAAC,UAAU,CAAC,CAAC;CAC/C;AAED,MAAM,WAAW,WAAW;IACxB,cAAc,EAAE,MAAM,CAAC;IACvB,SAAS,EAAE,IAAI,CAAC;IAChB,UAAU,EAAE,MAAM,CAAC;IACnB,eAAe,EAAE,OAAO,CAAC,eAAe,CAAC;IACzC,eAAe,EAAE,OAAO,CAAC,eAAe,CAAC;IACzC,eAAe,EAAE,OAAO,CAAC;IAEzB,gBAAgB,CAAC,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACvC,yEAAyE;IACzE,mBAAmB,CAAC,EAAE,mBAAmB,CAAC;CAC7C;AAED,MAAM,WAAW,UAAU;IACvB,OAAO,EAAE,OAAO,CAAC;IAEjB,IAAI,CAAC,EAAE,GAAG,CAAC;IACX,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,UAAU,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,gBAAgB;IAC7B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,QAAQ,GAAG,SAAS,GAAG,MAAM,GAAG,SAAS,CAAC;CACnD;AAED,MAAM,WAAW,kBAAkB;IAC/B,YAAY,EAAE,MAAM,CAAC;IACrB,aAAa,EAAE,MAAM,CAAC;IACtB,eAAe,EAAE,MAAM,EAAE,CAAC;IAC1B,gBAAgB,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAEtC,aAAa,CAAC,EAAE,eAAe,CAAC;IAChC,UAAU,EAAE,MAAM,CAAC;IAGnB,kBAAkB,EAAE;QAChB,MAAM,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;QACpB,QAAQ,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;QACtB,KAAK,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;QACnB,SAAS,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;KAC1B,CAAC;CACL"}
package/dist/index.d.ts CHANGED
@@ -15,10 +15,12 @@ export * as Pipeline from './pipeline';
15
15
  export * as Phases from './phases';
16
16
  export * as Transcript from './transcript';
17
17
  export * as Reflection from './reflection';
18
+ export * as Weighting from './weighting';
18
19
  export * as Util from './util/storage';
19
20
  export * as Media from './util/media';
20
21
  export * from './util/metadata';
21
22
  export * from './utils/entityFinder';
23
+ export * from './util/enhancement-logger';
22
24
  export * from './types';
23
25
  export * from './constants';
24
26
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,eAAO,MAAM,OAAO,UAAU,CAAC;AAG/B,OAAO,KAAK,SAAS,MAAM,aAAa,CAAC;AACzC,OAAO,KAAK,aAAa,MAAM,iBAAiB,CAAC;AACjD,OAAO,KAAK,MAAM,MAAM,UAAU,CAAC;AAGnC,OAAO,KAAK,OAAO,MAAM,WAAW,CAAC;AACrC,OAAO,KAAK,OAAO,MAAM,WAAW,CAAC;AACrC,OAAO,KAAK,QAAQ,MAAM,YAAY,CAAC;AAGvC,OAAO,KAAK,QAAQ,MAAM,YAAY,CAAC;AACvC,OAAO,KAAK,MAAM,MAAM,UAAU,CAAC;AACnC,OAAO,KAAK,UAAU,MAAM,cAAc,CAAC;AAC3C,OAAO,KAAK,UAAU,MAAM,cAAc,CAAC;AAG3C,OAAO,KAAK,IAAI,MAAM,gBAAgB,CAAC;AACvC,OAAO,KAAK,KAAK,MAAM,cAAc,CAAC;AACtC,cAAc,iBAAiB,CAAC;AAChC,cAAc,sBAAsB,CAAC;AAGrC,cAAc,SAAS,CAAC;AACxB,cAAc,aAAa,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,eAAO,MAAM,OAAO,UAAU,CAAC;AAG/B,OAAO,KAAK,SAAS,MAAM,aAAa,CAAC;AACzC,OAAO,KAAK,aAAa,MAAM,iBAAiB,CAAC;AACjD,OAAO,KAAK,MAAM,MAAM,UAAU,CAAC;AAGnC,OAAO,KAAK,OAAO,MAAM,WAAW,CAAC;AACrC,OAAO,KAAK,OAAO,MAAM,WAAW,CAAC;AACrC,OAAO,KAAK,QAAQ,MAAM,YAAY,CAAC;AAGvC,OAAO,KAAK,QAAQ,MAAM,YAAY,CAAC;AACvC,OAAO,KAAK,MAAM,MAAM,UAAU,CAAC;AACnC,OAAO,KAAK,UAAU,MAAM,cAAc,CAAC;AAC3C,OAAO,KAAK,UAAU,MAAM,cAAc,CAAC;AAG3C,OAAO,KAAK,SAAS,MAAM,aAAa,CAAC;AAGzC,OAAO,KAAK,IAAI,MAAM,gBAAgB,CAAC;AACvC,OAAO,KAAK,KAAK,MAAM,cAAc,CAAC;AACtC,cAAc,iBAAiB,CAAC;AAChC,cAAc,sBAAsB,CAAC;AACrC,cAAc,2BAA2B,CAAC;AAG1C,cAAc,SAAS,CAAC;AACxB,cAAc,aAAa,CAAC"}
package/dist/index.js CHANGED
@@ -18,13 +18,16 @@ import * as index$8 from './index10.js';
18
18
  export { index$8 as Transcript };
19
19
  import * as index$6 from './index11.js';
20
20
  export { index$6 as Reflection };
21
- import * as storage from './index12.js';
21
+ import * as index$a from './index12.js';
22
+ export { index$a as Weighting };
23
+ import * as storage from './index13.js';
22
24
  export { storage as Util };
23
- import * as media from './index13.js';
25
+ import * as media from './index14.js';
24
26
  export { media as Media };
25
- export { VALID_STATUSES, addTask, applyLifecycleDefaults, completeTask, createRoutingMetadata, createTask, deleteTask, extractTagsFromSignals, extractTopicFromSignals, formatDuration, formatEntityMetadataMarkdown, formatMetadataMarkdown, formatTime, generateTaskId, isValidStatus, parseEntityMetadata, updateStatus } from './index14.js';
26
- export { findCompanyResilient, findIgnoredResilient, findPersonResilient, findProjectResilient, findTermResilient } from './index15.js';
27
- export { ALLOWED_AUDIO_EXTENSIONS, ALLOWED_CONTENT_TYPES, ALLOWED_OUTPUT_FILENAME_OPTIONS, ALLOWED_OUTPUT_STRUCTURES, ASSIST_TIMEOUT_MS, CONTEXT_SUBDIRECTORIES, DATE_FORMAT_DAY, DATE_FORMAT_HOURS, DATE_FORMAT_MILLISECONDS, DATE_FORMAT_MINUTES, DATE_FORMAT_MONTH, DATE_FORMAT_MONTH_DAY, DATE_FORMAT_SECONDS, DATE_FORMAT_YEAR, DATE_FORMAT_YEAR_MONTH, DATE_FORMAT_YEAR_MONTH_DAY, DATE_FORMAT_YEAR_MONTH_DAY_HOURS_MINUTES, DATE_FORMAT_YEAR_MONTH_DAY_HOURS_MINUTES_SECONDS, DATE_FORMAT_YEAR_MONTH_DAY_HOURS_MINUTES_SECONDS_MILLISECONDS, DATE_FORMAT_YEAR_MONTH_DAY_SLASH, DEFAULT_ANALYSIS_MODEL, DEFAULT_AUDIO_EXTENSIONS, DEFAULT_BINARY_TO_TEXT_ENCODING, DEFAULT_CHARACTER_ENCODING, DEFAULT_CONFIG_DIR, DEFAULT_CONTENT_TYPES, DEFAULT_CONTEXT_CONFIG_FILE_NAME, DEFAULT_CONTEXT_DIR_NAME, DEFAULT_CONTEXT_NAMESPACE, DEFAULT_DEBUG, DEFAULT_DIFF, DEFAULT_DRY_RUN, DEFAULT_INPUT_DIRECTORY, DEFAULT_INSTRUCTIONS_DIR, DEFAULT_INSTRUCTIONS_TRANSCRIBE_FILE, DEFAULT_INTERACTIVE, DEFAULT_INTERMEDIATE_DIRECTORY, DEFAULT_KEEP_INTERMEDIATES, DEFAULT_LOG, DEFAULT_MAX_AUDIO_SIZE, DEFAULT_MAX_DISCOVERY_LEVELS, DEFAULT_MODEL, DEFAULT_OUTPUT_DIRECTORY, DEFAULT_OUTPUT_FILENAME_OPTIONS, DEFAULT_OUTPUT_STRUCTURE, DEFAULT_OVERRIDES, DEFAULT_PERSONAS_DIR, DEFAULT_PERSONA_TRANSCRIBER_FILE, DEFAULT_PHONETIC_MODEL, DEFAULT_PROCESSED_DIR, DEFAULT_PROMPT_FOR_SOURCE, DEFAULT_REASONING_LEVEL, DEFAULT_RECURSIVE, DEFAULT_SELF_REFLECTION, DEFAULT_SILENT, DEFAULT_SMART_ASSISTANCE, DEFAULT_SOUNDS_LIKE_ON_ADD, DEFAULT_TEMP_DIRECTORY, DEFAULT_TERMS_ENABLED, DEFAULT_TERM_DESCRIPTION_ON_ADD, DEFAULT_TERM_PROJECT_SUGGESTIONS, DEFAULT_TERM_SOUNDS_LIKE_ON_ADD, DEFAULT_TERM_TOPICS_ON_ADD, DEFAULT_TIMEZONE, DEFAULT_TRANSCRIPTION_MODEL, DEFAULT_TRIGGER_PHRASES_ON_ADD, DEFAULT_VERBOSE, MAX_CONTENT_LENGTH, MAX_TERM_CONTEXT_LENGTH, OUTPUT_FILE_TYPES, PROGRAM_NAME, PROTOKOLL_DEFAULTS, TERM_ASSIST_TIMEOUT_MS } from './index16.js';
27
+ export { VALID_STATUSES, addTask, applyLifecycleDefaults, completeTask, createRoutingMetadata, createTask, deleteTask, extractTagsFromSignals, extractTopicFromSignals, formatDuration, formatEntityMetadataMarkdown, formatMetadataMarkdown, formatTime, generateTaskId, isValidStatus, parseEntityMetadata, updateStatus } from './index15.js';
28
+ export { findCompanyResilient, findIgnoredResilient, findPersonResilient, findProjectResilient, findTermResilient } from './index16.js';
29
+ export { createEnhancementLogger, createNoOpLogger } from './index17.js';
30
+ export { ALLOWED_AUDIO_EXTENSIONS, ALLOWED_CONTENT_TYPES, ALLOWED_OUTPUT_FILENAME_OPTIONS, ALLOWED_OUTPUT_STRUCTURES, ASSIST_TIMEOUT_MS, CONTEXT_SUBDIRECTORIES, DATE_FORMAT_DAY, DATE_FORMAT_HOURS, DATE_FORMAT_MILLISECONDS, DATE_FORMAT_MINUTES, DATE_FORMAT_MONTH, DATE_FORMAT_MONTH_DAY, DATE_FORMAT_SECONDS, DATE_FORMAT_YEAR, DATE_FORMAT_YEAR_MONTH, DATE_FORMAT_YEAR_MONTH_DAY, DATE_FORMAT_YEAR_MONTH_DAY_HOURS_MINUTES, DATE_FORMAT_YEAR_MONTH_DAY_HOURS_MINUTES_SECONDS, DATE_FORMAT_YEAR_MONTH_DAY_HOURS_MINUTES_SECONDS_MILLISECONDS, DATE_FORMAT_YEAR_MONTH_DAY_SLASH, DEFAULT_ANALYSIS_MODEL, DEFAULT_AUDIO_EXTENSIONS, DEFAULT_BINARY_TO_TEXT_ENCODING, DEFAULT_CHARACTER_ENCODING, DEFAULT_CONFIG_DIR, DEFAULT_CONTENT_TYPES, DEFAULT_CONTEXT_CONFIG_FILE_NAME, DEFAULT_CONTEXT_DIR_NAME, DEFAULT_CONTEXT_NAMESPACE, DEFAULT_DEBUG, DEFAULT_DIFF, DEFAULT_DRY_RUN, DEFAULT_INPUT_DIRECTORY, DEFAULT_INSTRUCTIONS_DIR, DEFAULT_INSTRUCTIONS_TRANSCRIBE_FILE, DEFAULT_INTERACTIVE, DEFAULT_INTERMEDIATE_DIRECTORY, DEFAULT_KEEP_INTERMEDIATES, DEFAULT_LOG, DEFAULT_MAX_AUDIO_SIZE, DEFAULT_MAX_DISCOVERY_LEVELS, DEFAULT_MODEL, DEFAULT_OUTPUT_DIRECTORY, DEFAULT_OUTPUT_FILENAME_OPTIONS, DEFAULT_OUTPUT_STRUCTURE, DEFAULT_OVERRIDES, DEFAULT_PERSONAS_DIR, DEFAULT_PERSONA_TRANSCRIBER_FILE, DEFAULT_PHONETIC_MODEL, DEFAULT_PROCESSED_DIR, DEFAULT_PROMPT_FOR_SOURCE, DEFAULT_REASONING_LEVEL, DEFAULT_RECURSIVE, DEFAULT_SELF_REFLECTION, DEFAULT_SILENT, DEFAULT_SMART_ASSISTANCE, DEFAULT_SOUNDS_LIKE_ON_ADD, DEFAULT_TEMP_DIRECTORY, DEFAULT_TERMS_ENABLED, DEFAULT_TERM_DESCRIPTION_ON_ADD, DEFAULT_TERM_PROJECT_SUGGESTIONS, DEFAULT_TERM_SOUNDS_LIKE_ON_ADD, DEFAULT_TERM_TOPICS_ON_ADD, DEFAULT_TIMEZONE, DEFAULT_TRANSCRIPTION_MODEL, DEFAULT_TRIGGER_PHRASES_ON_ADD, DEFAULT_VERBOSE, MAX_CONTENT_LENGTH, MAX_TERM_CONTEXT_LENGTH, OUTPUT_FILE_TYPES, PROGRAM_NAME, PROTOKOLL_DEFAULTS, TERM_ASSIST_TIMEOUT_MS } from './index18.js';
28
31
 
29
32
  const VERSION = "0.1.0";
30
33
 
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":["../src/index.ts"],"sourcesContent":["/**\n * Protokoll Engine\n * \n * Processing engine for Protokoll - transcription pipeline, agentic execution,\n * routing, LLM integration, and all core processing logic.\n */\n\nexport const VERSION = '0.1.0';\n\n// Step 5 exports\nexport * as Reasoning from './reasoning';\nexport * as Transcription from './transcription';\nexport * as Prompt from './prompt';\n\n// Step 6 exports\nexport * as Agentic from './agentic';\nexport * as Routing from './routing';\nexport * as Feedback from './feedback';\n\n// Step 7 exports\nexport * as Pipeline from './pipeline';\nexport * as Phases from './phases';\nexport * as Transcript from './transcript';\nexport * as Reflection from './reflection';\n\n// Shared utilities\nexport * as Util from './util/storage';\nexport * as Media from './util/media';\nexport * from './util/metadata';\nexport * from './utils/entityFinder';\n\n// Re-export types and constants\nexport * from './types';\nexport * from './constants';\n"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;AAOO,MAAM,OAAA,GAAU;;;;"}
1
+ {"version":3,"file":"index.js","sources":["../src/index.ts"],"sourcesContent":["/**\n * Protokoll Engine\n * \n * Processing engine for Protokoll - transcription pipeline, agentic execution,\n * routing, LLM integration, and all core processing logic.\n */\n\nexport const VERSION = '0.1.0';\n\n// Step 5 exports\nexport * as Reasoning from './reasoning';\nexport * as Transcription from './transcription';\nexport * as Prompt from './prompt';\n\n// Step 6 exports\nexport * as Agentic from './agentic';\nexport * as Routing from './routing';\nexport * as Feedback from './feedback';\n\n// Step 7 exports\nexport * as Pipeline from './pipeline';\nexport * as Phases from './phases';\nexport * as Transcript from './transcript';\nexport * as Reflection from './reflection';\n\n// Weighting module\nexport * as Weighting from './weighting';\n\n// Shared utilities\nexport * as Util from './util/storage';\nexport * as Media from './util/media';\nexport * from './util/metadata';\nexport * from './utils/entityFinder';\nexport * from './util/enhancement-logger';\n\n// Re-export types and constants\nexport * from './types';\nexport * from './constants';\n"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAOO,MAAM,OAAA,GAAU;;;;"}
package/dist/index10.js CHANGED
@@ -1,4 +1,5 @@
1
- export { combineTranscripts, editTranscript, extractTimestampFromFilename, findTranscriptByUuid, isUuidInput, listTranscripts, parseTranscript, slugifyTitle } from './index36.js';
2
- export { FEEDBACK_TOOLS, applyChanges, buildFeedbackSystemPrompt, executeTool, processFeedback } from './index37.js';
3
- export { convertPklMetadataToLegacy, ensurePklExtension, getTranscriptGlobPattern, isPklFile, readTranscriptContent, resolveTranscriptPath, stripTranscriptExtension, transcriptExists, transcriptExistsUuid } from './index38.js';
1
+ export { combineTranscripts, editTranscript, extractTimestampFromFilename, findTranscriptByUuid, isUuidInput, isValidStatusTransition, listTranscripts, parseTranscript, slugifyTitle } from './index38.js';
2
+ export { FEEDBACK_TOOLS, applyChanges, buildFeedbackSystemPrompt, executeTool, processFeedback } from './index39.js';
3
+ export { convertPklMetadataToLegacy, ensurePklExtension, getTranscriptGlobPattern, isPklFile, readTranscriptContent, resolveTranscriptPath, stripTranscriptExtension, transcriptExists, transcriptExistsUuid } from './index40.js';
4
+ export { createUploadTranscript, findTranscribingTranscripts, findUploadedTranscripts, generateFilenameWithUuid, markTranscriptAsFailed, markTranscriptAsTranscribing, resetTranscriptToUploaded } from './index41.js';
4
5
  //# sourceMappingURL=index10.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index10.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;"}
1
+ {"version":3,"file":"index10.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;"}
package/dist/index11.js CHANGED
@@ -1,5 +1,5 @@
1
- import { create as create$2 } from './index39.js';
2
- import { create as create$1 } from './index40.js';
1
+ import { create as create$2 } from './index42.js';
2
+ import { create as create$1 } from './index43.js';
3
3
 
4
4
  const create = (config) => {
5
5
  const collector = create$2();
package/dist/index12.js CHANGED
@@ -1,125 +1,4 @@
1
- import * as fs from 'node:fs';
2
- import { glob } from 'glob';
3
- import path__default from 'node:path';
4
- import crypto from 'node:crypto';
5
-
6
- const create = (params) => {
7
- const log = params.log || console.log;
8
- const exists = async (path2) => {
9
- try {
10
- await fs.promises.stat(path2);
11
- return true;
12
- } catch (error) {
13
- return false;
14
- }
15
- };
16
- const isDirectory = async (path2) => {
17
- const stats = await fs.promises.stat(path2);
18
- if (!stats.isDirectory()) {
19
- log(`${path2} is not a directory`);
20
- return false;
21
- }
22
- return true;
23
- };
24
- const isFile = async (path2) => {
25
- const stats = await fs.promises.stat(path2);
26
- if (!stats.isFile()) {
27
- log(`${path2} is not a file`);
28
- return false;
29
- }
30
- return true;
31
- };
32
- const isReadable = async (path2) => {
33
- try {
34
- await fs.promises.access(path2, fs.constants.R_OK);
35
- } catch (error) {
36
- log(`${path2} is not readable: %s %s`, error.message, error.stack);
37
- return false;
38
- }
39
- return true;
40
- };
41
- const isWritable = async (path2) => {
42
- try {
43
- await fs.promises.access(path2, fs.constants.W_OK);
44
- } catch (error) {
45
- log(`${path2} is not writable: %s %s`, error.message, error.stack);
46
- return false;
47
- }
48
- return true;
49
- };
50
- const isFileReadable = async (path2) => {
51
- return await exists(path2) && await isFile(path2) && await isReadable(path2);
52
- };
53
- const isDirectoryWritable = async (path2) => {
54
- return await exists(path2) && await isDirectory(path2) && await isWritable(path2);
55
- };
56
- const isDirectoryReadable = async (path2) => {
57
- return await exists(path2) && await isDirectory(path2) && await isReadable(path2);
58
- };
59
- const createDirectory = async (path2) => {
60
- try {
61
- await fs.promises.mkdir(path2, { recursive: true });
62
- } catch (mkdirError) {
63
- throw new Error(`Failed to create output directory ${path2}: ${mkdirError.message} ${mkdirError.stack}`);
64
- }
65
- };
66
- const readFile = async (path2, encoding) => {
67
- return await fs.promises.readFile(path2, { encoding });
68
- };
69
- const writeFile = async (path2, data, encoding) => {
70
- await fs.promises.writeFile(path2, data, { encoding });
71
- };
72
- const forEachFileIn = async (directory, callback, options = { pattern: "*.*" }) => {
73
- try {
74
- const files = await glob(options.pattern, { cwd: directory, nodir: true });
75
- for (const file of files) {
76
- await callback(path__default.join(directory, file));
77
- }
78
- } catch (err) {
79
- throw new Error(`Failed to glob pattern ${options.pattern} in ${directory}: ${err.message}`);
80
- }
81
- };
82
- const readStream = async (path2) => {
83
- return fs.createReadStream(path2);
84
- };
85
- const hashFile = async (path2, length) => {
86
- const file = await readFile(path2, "utf8");
87
- return crypto.createHash("sha256").update(file).digest("hex").slice(0, length);
88
- };
89
- const listFiles = async (directory) => {
90
- return await fs.promises.readdir(directory);
91
- };
92
- const deleteFile = async (path2) => {
93
- await fs.promises.unlink(path2);
94
- };
95
- const deleteDirectory = async (path2) => {
96
- await fs.promises.rm(path2, { recursive: true, force: true });
97
- };
98
- const getFileSize = async (path2) => {
99
- const stats = await fs.promises.stat(path2);
100
- return stats.size;
101
- };
102
- return {
103
- exists,
104
- isDirectory,
105
- isFile,
106
- isReadable,
107
- isWritable,
108
- isFileReadable,
109
- isDirectoryWritable,
110
- isDirectoryReadable,
111
- createDirectory,
112
- readFile,
113
- readStream,
114
- writeFile,
115
- forEachFileIn,
116
- hashFile,
117
- listFiles,
118
- deleteFile,
119
- deleteDirectory,
120
- getFileSize
121
- };
122
- };
123
-
124
- export { create };
1
+ export { WeightModelBuilder } from './index44.js';
2
+ export { WeightModelProvider } from './index45.js';
3
+ export { EntityPrepositioner } from './index46.js';
125
4
  //# sourceMappingURL=index12.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index12.js","sources":["../src/util/storage.ts"],"sourcesContent":["// eslint-disable-next-line no-restricted-imports\nimport * as fs from 'node:fs';\nimport { glob } from 'glob';\nimport path from 'node:path';\nimport crypto from 'node:crypto';\n/**\n * This module exists to isolate filesystem operations from the rest of the codebase.\n * This makes testing easier by avoiding direct fs mocking in jest configuration.\n * \n * Additionally, abstracting storage operations allows for future flexibility - \n * this export utility may need to work with storage systems other than the local filesystem\n * (e.g. S3, Google Cloud Storage, etc).\n */\n\nexport interface Utility {\n exists: (path: string) => Promise<boolean>;\n isDirectory: (path: string) => Promise<boolean>;\n isFile: (path: string) => Promise<boolean>;\n isReadable: (path: string) => Promise<boolean>;\n isWritable: (path: string) => Promise<boolean>;\n isFileReadable: (path: string) => Promise<boolean>;\n isDirectoryWritable: (path: string) => Promise<boolean>;\n isDirectoryReadable: (path: string) => Promise<boolean>;\n createDirectory: (path: string) => Promise<void>;\n readFile: (path: string, encoding: string) => Promise<string>;\n readStream: (path: string) => Promise<fs.ReadStream>;\n writeFile: (path: string, data: string | Buffer, encoding: string) => Promise<void>;\n forEachFileIn: (directory: string, callback: (path: string) => Promise<void>, options?: { pattern: string }) => Promise<void>;\n hashFile: (path: string, length: number) => Promise<string>;\n listFiles: (directory: string) => Promise<string[]>;\n deleteFile: (path: string) => Promise<void>;\n deleteDirectory: (path: string) => Promise<void>;\n getFileSize: (path: string) => Promise<number>;\n}\n\nexport const create = (params: { log?: (message: string, ...args: any[]) => void }): Utility => {\n\n // eslint-disable-next-line no-console\n const log = params.log || console.log;\n\n const exists = async (path: string): Promise<boolean> => {\n try {\n await fs.promises.stat(path);\n return true;\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n } catch (error: any) {\n return false;\n }\n }\n\n const isDirectory = async (path: string): Promise<boolean> => {\n const stats = await fs.promises.stat(path);\n if (!stats.isDirectory()) {\n log(`${path} is not a directory`);\n return false;\n }\n return true;\n }\n\n const isFile = async (path: string): Promise<boolean> => {\n const stats = await fs.promises.stat(path);\n if (!stats.isFile()) {\n log(`${path} is not a file`);\n return false;\n }\n return true;\n }\n\n const isReadable = async (path: string): Promise<boolean> => {\n try {\n await fs.promises.access(path, fs.constants.R_OK);\n } catch (error: any) {\n log(`${path} is not readable: %s %s`, error.message, error.stack);\n return false;\n }\n return true;\n }\n\n const isWritable = async (path: string): Promise<boolean> => {\n try {\n await fs.promises.access(path, fs.constants.W_OK);\n } catch (error: any) {\n log(`${path} is not writable: %s %s`, error.message, error.stack);\n return false;\n }\n return true;\n }\n\n const isFileReadable = async (path: string): Promise<boolean> => {\n return await exists(path) && await isFile(path) && await isReadable(path);\n }\n\n const isDirectoryWritable = async (path: string): Promise<boolean> => {\n return await exists(path) && await isDirectory(path) && await isWritable(path);\n }\n\n const isDirectoryReadable = async (path: string): Promise<boolean> => {\n return await exists(path) && await isDirectory(path) && await isReadable(path);\n }\n\n const createDirectory = async (path: string): Promise<void> => {\n try {\n await fs.promises.mkdir(path, { recursive: true });\n } catch (mkdirError: any) {\n throw new Error(`Failed to create output directory ${path}: ${mkdirError.message} ${mkdirError.stack}`);\n }\n }\n\n const readFile = async (path: string, encoding: string): Promise<string> => {\n return await fs.promises.readFile(path, { encoding: encoding as BufferEncoding });\n }\n\n const writeFile = async (path: string, data: string | Buffer, encoding: string): Promise<void> => {\n await fs.promises.writeFile(path, data, { encoding: encoding as BufferEncoding });\n }\n\n const forEachFileIn = async (directory: string, callback: (file: string) => Promise<void>, options: { pattern: string | string[] } = { pattern: '*.*' }): Promise<void> => {\n try {\n const files = await glob(options.pattern, { cwd: directory, nodir: true });\n for (const file of files) {\n await callback(path.join(directory, file));\n }\n } catch (err: any) {\n throw new Error(`Failed to glob pattern ${options.pattern} in ${directory}: ${err.message}`);\n }\n }\n\n const readStream = async (path: string): Promise<fs.ReadStream> => {\n return fs.createReadStream(path);\n }\n\n const hashFile = async (path: string, length: number): Promise<string> => {\n const file = await readFile(path, 'utf8');\n return crypto.createHash('sha256').update(file).digest('hex').slice(0, length);\n }\n\n const listFiles = async (directory: string): Promise<string[]> => {\n return await fs.promises.readdir(directory);\n }\n\n const deleteFile = async (path: string): Promise<void> => {\n await fs.promises.unlink(path);\n }\n\n const deleteDirectory = async (path: string): Promise<void> => {\n await fs.promises.rm(path, { recursive: true, force: true });\n }\n\n const getFileSize = async (path: string): Promise<number> => {\n const stats = await fs.promises.stat(path);\n return stats.size;\n }\n\n return {\n exists,\n isDirectory,\n isFile,\n isReadable,\n isWritable,\n isFileReadable,\n isDirectoryWritable,\n isDirectoryReadable,\n createDirectory,\n readFile,\n readStream,\n writeFile,\n forEachFileIn,\n hashFile,\n listFiles,\n deleteFile,\n deleteDirectory,\n getFileSize,\n };\n}"],"names":["path"],"mappings":"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"}
1
+ {"version":3,"file":"index12.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;"}
package/dist/index13.js CHANGED
@@ -1,122 +1,123 @@
1
- import ffmpeg from 'fluent-ffmpeg';
1
+ import * as fs from 'node:fs';
2
+ import { glob } from 'glob';
2
3
  import path__default from 'node:path';
3
- import { create as create$1 } from './index12.js';
4
+ import crypto from 'node:crypto';
4
5
 
5
- const ffprobeAsync = (filePath) => {
6
- return new Promise((resolve, reject) => {
7
- ffmpeg.ffprobe(filePath, (err, metadata) => {
8
- if (err) return reject(err);
9
- resolve(metadata);
10
- });
11
- });
12
- };
13
- const create = (logger) => {
14
- const storage$1 = create$1({ log: logger.debug });
15
- const getAudioCreationTime = async (filePath) => {
6
+ const create = (params) => {
7
+ const log = params.log || console.log;
8
+ const exists = async (path2) => {
16
9
  try {
17
- const metadata = await ffprobeAsync(filePath);
18
- const formatTags = metadata?.format?.tags;
19
- if (formatTags?.creation_time) {
20
- logger.debug("Found creation_time in format tags: %s", formatTags.creation_time);
21
- return new Date(formatTags.creation_time);
22
- }
23
- if (metadata?.streams?.length > 0) {
24
- for (const stream of metadata.streams) {
25
- if (stream.tags?.creation_time) {
26
- logger.debug("Found creation_time in stream tags: %s", stream.tags.creation_time);
27
- return new Date(stream.tags.creation_time);
28
- }
29
- }
30
- }
31
- logger.debug("No creation_time found in audio file metadata");
32
- return null;
10
+ await fs.promises.stat(path2);
11
+ return true;
33
12
  } catch (error) {
34
- logger.error("Error extracting creation time from audio file: %s", error);
35
- return null;
13
+ return false;
14
+ }
15
+ };
16
+ const isDirectory = async (path2) => {
17
+ const stats = await fs.promises.stat(path2);
18
+ if (!stats.isDirectory()) {
19
+ log(`${path2} is not a directory`);
20
+ return false;
21
+ }
22
+ return true;
23
+ };
24
+ const isFile = async (path2) => {
25
+ const stats = await fs.promises.stat(path2);
26
+ if (!stats.isFile()) {
27
+ log(`${path2} is not a file`);
28
+ return false;
36
29
  }
30
+ return true;
37
31
  };
38
- const getFileSize = async (filePath) => {
32
+ const isReadable = async (path2) => {
39
33
  try {
40
- return await storage$1.getFileSize(filePath);
34
+ await fs.promises.access(path2, fs.constants.R_OK);
41
35
  } catch (error) {
42
- logger.error("Error getting file size: %s", error);
43
- throw new Error(`Failed to get file size for ${filePath}: ${error}`);
36
+ log(`${path2} is not readable: %s %s`, error.message, error.stack);
37
+ return false;
44
38
  }
39
+ return true;
45
40
  };
46
- const splitAudioFile = async (filePath, outputDir, maxSizeBytes) => {
41
+ const isWritable = async (path2) => {
47
42
  try {
48
- const metadata = await ffprobeAsync(filePath);
49
- const duration = parseFloat(metadata.format.duration);
50
- const fileSize = await getFileSize(filePath);
51
- const segmentCount = Math.ceil(fileSize / maxSizeBytes);
52
- const segmentDuration = duration / segmentCount;
53
- logger.debug(`Splitting ${filePath} (${fileSize} bytes) into ${segmentCount} segments of ~${segmentDuration} seconds each`);
54
- await storage$1.createDirectory(outputDir);
55
- const outputFiles = [];
56
- const fileExt = path__default.extname(filePath);
57
- const fileName = path__default.basename(filePath, fileExt);
58
- const promises = [];
59
- for (let i = 0; i < segmentCount; i++) {
60
- const startTime = i * segmentDuration;
61
- const outputPath = path__default.join(outputDir, `${fileName}_part${i + 1}${fileExt}`);
62
- outputFiles.push(outputPath);
63
- const promise = new Promise((resolve, reject) => {
64
- ffmpeg(filePath).setStartTime(startTime).setDuration(segmentDuration).output(outputPath).on("end", () => {
65
- logger.debug(`Created segment ${i + 1}/${segmentCount}: ${outputPath}`);
66
- resolve();
67
- }).on("error", (err) => {
68
- logger.error(`Error creating segment ${i + 1}/${segmentCount}: ${err}`);
69
- reject(err);
70
- }).run();
71
- });
72
- promises.push(promise);
73
- }
74
- await Promise.all(promises);
75
- return outputFiles;
43
+ await fs.promises.access(path2, fs.constants.W_OK);
76
44
  } catch (error) {
77
- logger.error("Error splitting audio file: %s", error);
78
- throw new Error(`Failed to split audio file ${filePath}: ${error}`);
45
+ log(`${path2} is not writable: %s %s`, error.message, error.stack);
46
+ return false;
79
47
  }
48
+ return true;
49
+ };
50
+ const isFileReadable = async (path2) => {
51
+ return await exists(path2) && await isFile(path2) && await isReadable(path2);
52
+ };
53
+ const isDirectoryWritable = async (path2) => {
54
+ return await exists(path2) && await isDirectory(path2) && await isWritable(path2);
80
55
  };
81
- const convertToSupportedFormat = async (filePath, outputDir, forceConversion = false) => {
56
+ const isDirectoryReadable = async (path2) => {
57
+ return await exists(path2) && await isDirectory(path2) && await isReadable(path2);
58
+ };
59
+ const createDirectory = async (path2) => {
82
60
  try {
83
- const fileExt = path__default.extname(filePath).toLowerCase();
84
- const supportedFormats = [".flac", ".m4a", ".mp3", ".mp4", ".mpeg", ".mpga", ".oga", ".ogg", ".wav", ".webm"];
85
- if (supportedFormats.includes(fileExt) && !forceConversion) {
86
- logger.debug(`File ${filePath} is already in a supported format: ${fileExt}`);
87
- return filePath;
88
- }
89
- if (forceConversion && fileExt === ".mp3") {
90
- logger.debug(`File ${filePath} is already MP3 (compressed format)`);
91
- return filePath;
92
- }
93
- logger.info(`Converting ${fileExt} file to mp3 for transcription...`);
94
- const fileName = path__default.basename(filePath, fileExt);
95
- const outputPath = path__default.join(outputDir, `${fileName}.mp3`);
96
- if (await storage$1.exists(outputPath)) {
97
- logger.debug(`Converted file already exists: ${outputPath}`);
98
- return outputPath;
61
+ await fs.promises.mkdir(path2, { recursive: true });
62
+ } catch (mkdirError) {
63
+ throw new Error(`Failed to create output directory ${path2}: ${mkdirError.message} ${mkdirError.stack}`);
64
+ }
65
+ };
66
+ const readFile = async (path2, encoding) => {
67
+ return await fs.promises.readFile(path2, { encoding });
68
+ };
69
+ const writeFile = async (path2, data, encoding) => {
70
+ await fs.promises.writeFile(path2, data, { encoding });
71
+ };
72
+ const forEachFileIn = async (directory, callback, options = { pattern: "*.*" }) => {
73
+ try {
74
+ const files = await glob(options.pattern, { cwd: directory, nodir: true });
75
+ for (const file of files) {
76
+ await callback(path__default.join(directory, file));
99
77
  }
100
- await storage$1.createDirectory(outputDir);
101
- return new Promise((resolve, reject) => {
102
- ffmpeg(filePath).toFormat("mp3").audioBitrate("128k").output(outputPath).on("end", () => {
103
- logger.info(`Successfully converted to: ${outputPath}`);
104
- resolve(outputPath);
105
- }).on("error", (err) => {
106
- logger.error(`Error converting audio file: ${err}`);
107
- reject(new Error(`Failed to convert ${filePath} to mp3: ${err.message}`));
108
- }).run();
109
- });
110
- } catch (error) {
111
- logger.error("Error in convertToSupportedFormat: %s", error);
112
- throw new Error(`Failed to convert audio file ${filePath}: ${error}`);
78
+ } catch (err) {
79
+ throw new Error(`Failed to glob pattern ${options.pattern} in ${directory}: ${err.message}`);
113
80
  }
114
81
  };
82
+ const readStream = async (path2) => {
83
+ return fs.createReadStream(path2);
84
+ };
85
+ const hashFile = async (path2, length) => {
86
+ const file = await readFile(path2, "utf8");
87
+ return crypto.createHash("sha256").update(file).digest("hex").slice(0, length);
88
+ };
89
+ const listFiles = async (directory) => {
90
+ return await fs.promises.readdir(directory);
91
+ };
92
+ const deleteFile = async (path2) => {
93
+ await fs.promises.unlink(path2);
94
+ };
95
+ const deleteDirectory = async (path2) => {
96
+ await fs.promises.rm(path2, { recursive: true, force: true });
97
+ };
98
+ const getFileSize = async (path2) => {
99
+ const stats = await fs.promises.stat(path2);
100
+ return stats.size;
101
+ };
115
102
  return {
116
- getAudioCreationTime,
117
- getFileSize,
118
- splitAudioFile,
119
- convertToSupportedFormat
103
+ exists,
104
+ isDirectory,
105
+ isFile,
106
+ isReadable,
107
+ isWritable,
108
+ isFileReadable,
109
+ isDirectoryWritable,
110
+ isDirectoryReadable,
111
+ createDirectory,
112
+ readFile,
113
+ readStream,
114
+ writeFile,
115
+ forEachFileIn,
116
+ hashFile,
117
+ listFiles,
118
+ deleteFile,
119
+ deleteDirectory,
120
+ getFileSize
120
121
  };
121
122
  };
122
123
 
@@ -1 +1 @@
1
- {"version":3,"file":"index13.js","sources":["../src/util/media.ts"],"sourcesContent":["import ffmpeg from 'fluent-ffmpeg';\nimport { Logger } from 'winston';\nimport path from 'node:path';\nimport * as Storage from '@/util/storage';\n\nexport interface Media {\n getAudioCreationTime: (filePath: string) => Promise<Date | null>;\n getFileSize: (filePath: string) => Promise<number>;\n splitAudioFile: (filePath: string, outputDir: string, maxSizeBytes: number) => Promise<string[]>;\n convertToSupportedFormat: (filePath: string, outputDir: string, forceConversion?: boolean) => Promise<string>;\n}\n\nconst ffprobeAsync = (filePath: string): Promise<any> => {\n return new Promise((resolve, reject) => {\n ffmpeg.ffprobe(filePath, (err, metadata) => {\n if (err) return reject(err);\n resolve(metadata);\n });\n });\n};\n\n\nexport const create = (logger: Logger): Media => {\n const storage = Storage.create({ log: logger.debug });\n\n // Extract creation time from audio file using ffmpeg\n const getAudioCreationTime = async (filePath: string): Promise<Date | null> => {\n try {\n const metadata = await ffprobeAsync(filePath);\n\n // Look for creation_time in format tags\n const formatTags = metadata?.format?.tags;\n if (formatTags?.creation_time) {\n logger.debug('Found creation_time in format tags: %s', formatTags.creation_time);\n return new Date(formatTags.creation_time);\n }\n\n // Check for creation_time in stream tags as fallback\n if (metadata?.streams?.length > 0) {\n for (const stream of metadata.streams) {\n if (stream.tags?.creation_time) {\n logger.debug('Found creation_time in stream tags: %s', stream.tags.creation_time);\n return new Date(stream.tags.creation_time);\n }\n }\n }\n\n logger.debug('No creation_time found in audio file metadata');\n return null;\n } catch (error) {\n logger.error('Error extracting creation time from audio file: %s', error);\n return null;\n }\n };\n\n // Get file size in bytes\n const getFileSize = async (filePath: string): Promise<number> => {\n try {\n return await storage.getFileSize(filePath);\n } catch (error) {\n logger.error('Error getting file size: %s', error);\n throw new Error(`Failed to get file size for ${filePath}: ${error}`);\n }\n };\n\n // Split large audio file into smaller chunks\n const splitAudioFile = async (filePath: string, outputDir: string, maxSizeBytes: number): Promise<string[]> => {\n try {\n const metadata = await ffprobeAsync(filePath);\n const duration = parseFloat(metadata.format.duration);\n\n // Calculate how many segments we need based on file size and max size\n const fileSize = await getFileSize(filePath);\n const segmentCount = Math.ceil(fileSize / maxSizeBytes);\n\n // Calculate segment duration\n const segmentDuration = duration / segmentCount;\n logger.debug(`Splitting ${filePath} (${fileSize} bytes) into ${segmentCount} segments of ~${segmentDuration} seconds each`);\n\n // Create output directory if it doesn't exist\n await storage.createDirectory(outputDir);\n\n const outputFiles: string[] = [];\n const fileExt = path.extname(filePath);\n const fileName = path.basename(filePath, fileExt);\n\n // Create a promise for each segment\n const promises = [];\n\n for (let i = 0; i < segmentCount; i++) {\n const startTime = i * segmentDuration;\n const outputPath = path.join(outputDir, `${fileName}_part${i + 1}${fileExt}`);\n outputFiles.push(outputPath);\n\n const promise = new Promise<void>((resolve, reject) => {\n ffmpeg(filePath)\n .setStartTime(startTime)\n .setDuration(segmentDuration)\n .output(outputPath)\n .on('end', () => {\n logger.debug(`Created segment ${i + 1}/${segmentCount}: ${outputPath}`);\n resolve();\n })\n .on('error', (err) => {\n logger.error(`Error creating segment ${i + 1}/${segmentCount}: ${err}`);\n reject(err);\n })\n .run();\n });\n\n promises.push(promise);\n }\n\n // Wait for all segments to be created\n await Promise.all(promises);\n return outputFiles;\n } catch (error) {\n logger.error('Error splitting audio file: %s', error);\n throw new Error(`Failed to split audio file ${filePath}: ${error}`);\n }\n };\n\n // Convert audio file to a format supported by OpenAI Whisper API\n // Supported formats: flac, m4a, mp3, mp4, mpeg, mpga, oga, ogg, wav, webm\n const convertToSupportedFormat = async (filePath: string, outputDir: string, forceConversion = false): Promise<string> => {\n try {\n const fileExt = path.extname(filePath).toLowerCase();\n\n // List of formats that OpenAI supports\n const supportedFormats = ['.flac', '.m4a', '.mp3', '.mp4', '.mpeg', '.mpga', '.oga', '.ogg', '.wav', '.webm'];\n\n // If already in a supported format and not forcing conversion, return as-is\n if (supportedFormats.includes(fileExt) && !forceConversion) {\n logger.debug(`File ${filePath} is already in a supported format: ${fileExt}`);\n return filePath;\n }\n\n // If forcing conversion and already MP3, return as-is (MP3 is already compressed)\n if (forceConversion && fileExt === '.mp3') {\n logger.debug(`File ${filePath} is already MP3 (compressed format)`);\n return filePath;\n }\n\n // Otherwise, convert to mp3 (widely supported and good compression)\n logger.info(`Converting ${fileExt} file to mp3 for transcription...`);\n const fileName = path.basename(filePath, fileExt);\n const outputPath = path.join(outputDir, `${fileName}.mp3`);\n\n // Check if converted file already exists\n if (await storage.exists(outputPath)) {\n logger.debug(`Converted file already exists: ${outputPath}`);\n return outputPath;\n }\n\n // Create output directory if it doesn't exist\n await storage.createDirectory(outputDir);\n\n return new Promise<string>((resolve, reject) => {\n ffmpeg(filePath)\n .toFormat('mp3')\n .audioBitrate('128k')\n .output(outputPath)\n .on('end', () => {\n logger.info(`Successfully converted to: ${outputPath}`);\n resolve(outputPath);\n })\n .on('error', (err) => {\n logger.error(`Error converting audio file: ${err}`);\n reject(new Error(`Failed to convert ${filePath} to mp3: ${err.message}`));\n })\n .run();\n });\n } catch (error) {\n logger.error('Error in convertToSupportedFormat: %s', error);\n throw new Error(`Failed to convert audio file ${filePath}: ${error}`);\n }\n };\n\n return {\n getAudioCreationTime,\n getFileSize,\n splitAudioFile,\n convertToSupportedFormat,\n }\n}\n"],"names":["storage","Storage.create","path"],"mappings":"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"}
1
+ {"version":3,"file":"index13.js","sources":["../src/util/storage.ts"],"sourcesContent":["// eslint-disable-next-line no-restricted-imports\nimport * as fs from 'node:fs';\nimport { glob } from 'glob';\nimport path from 'node:path';\nimport crypto from 'node:crypto';\n/**\n * This module exists to isolate filesystem operations from the rest of the codebase.\n * This makes testing easier by avoiding direct fs mocking in jest configuration.\n * \n * Additionally, abstracting storage operations allows for future flexibility - \n * this export utility may need to work with storage systems other than the local filesystem\n * (e.g. S3, Google Cloud Storage, etc).\n */\n\nexport interface Utility {\n exists: (path: string) => Promise<boolean>;\n isDirectory: (path: string) => Promise<boolean>;\n isFile: (path: string) => Promise<boolean>;\n isReadable: (path: string) => Promise<boolean>;\n isWritable: (path: string) => Promise<boolean>;\n isFileReadable: (path: string) => Promise<boolean>;\n isDirectoryWritable: (path: string) => Promise<boolean>;\n isDirectoryReadable: (path: string) => Promise<boolean>;\n createDirectory: (path: string) => Promise<void>;\n readFile: (path: string, encoding: string) => Promise<string>;\n readStream: (path: string) => Promise<fs.ReadStream>;\n writeFile: (path: string, data: string | Buffer, encoding: string) => Promise<void>;\n forEachFileIn: (directory: string, callback: (path: string) => Promise<void>, options?: { pattern: string }) => Promise<void>;\n hashFile: (path: string, length: number) => Promise<string>;\n listFiles: (directory: string) => Promise<string[]>;\n deleteFile: (path: string) => Promise<void>;\n deleteDirectory: (path: string) => Promise<void>;\n getFileSize: (path: string) => Promise<number>;\n}\n\nexport const create = (params: { log?: (message: string, ...args: any[]) => void }): Utility => {\n\n // eslint-disable-next-line no-console\n const log = params.log || console.log;\n\n const exists = async (path: string): Promise<boolean> => {\n try {\n await fs.promises.stat(path);\n return true;\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n } catch (error: any) {\n return false;\n }\n }\n\n const isDirectory = async (path: string): Promise<boolean> => {\n const stats = await fs.promises.stat(path);\n if (!stats.isDirectory()) {\n log(`${path} is not a directory`);\n return false;\n }\n return true;\n }\n\n const isFile = async (path: string): Promise<boolean> => {\n const stats = await fs.promises.stat(path);\n if (!stats.isFile()) {\n log(`${path} is not a file`);\n return false;\n }\n return true;\n }\n\n const isReadable = async (path: string): Promise<boolean> => {\n try {\n await fs.promises.access(path, fs.constants.R_OK);\n } catch (error: any) {\n log(`${path} is not readable: %s %s`, error.message, error.stack);\n return false;\n }\n return true;\n }\n\n const isWritable = async (path: string): Promise<boolean> => {\n try {\n await fs.promises.access(path, fs.constants.W_OK);\n } catch (error: any) {\n log(`${path} is not writable: %s %s`, error.message, error.stack);\n return false;\n }\n return true;\n }\n\n const isFileReadable = async (path: string): Promise<boolean> => {\n return await exists(path) && await isFile(path) && await isReadable(path);\n }\n\n const isDirectoryWritable = async (path: string): Promise<boolean> => {\n return await exists(path) && await isDirectory(path) && await isWritable(path);\n }\n\n const isDirectoryReadable = async (path: string): Promise<boolean> => {\n return await exists(path) && await isDirectory(path) && await isReadable(path);\n }\n\n const createDirectory = async (path: string): Promise<void> => {\n try {\n await fs.promises.mkdir(path, { recursive: true });\n } catch (mkdirError: any) {\n throw new Error(`Failed to create output directory ${path}: ${mkdirError.message} ${mkdirError.stack}`);\n }\n }\n\n const readFile = async (path: string, encoding: string): Promise<string> => {\n return await fs.promises.readFile(path, { encoding: encoding as BufferEncoding });\n }\n\n const writeFile = async (path: string, data: string | Buffer, encoding: string): Promise<void> => {\n await fs.promises.writeFile(path, data, { encoding: encoding as BufferEncoding });\n }\n\n const forEachFileIn = async (directory: string, callback: (file: string) => Promise<void>, options: { pattern: string | string[] } = { pattern: '*.*' }): Promise<void> => {\n try {\n const files = await glob(options.pattern, { cwd: directory, nodir: true });\n for (const file of files) {\n await callback(path.join(directory, file));\n }\n } catch (err: any) {\n throw new Error(`Failed to glob pattern ${options.pattern} in ${directory}: ${err.message}`);\n }\n }\n\n const readStream = async (path: string): Promise<fs.ReadStream> => {\n return fs.createReadStream(path);\n }\n\n const hashFile = async (path: string, length: number): Promise<string> => {\n const file = await readFile(path, 'utf8');\n return crypto.createHash('sha256').update(file).digest('hex').slice(0, length);\n }\n\n const listFiles = async (directory: string): Promise<string[]> => {\n return await fs.promises.readdir(directory);\n }\n\n const deleteFile = async (path: string): Promise<void> => {\n await fs.promises.unlink(path);\n }\n\n const deleteDirectory = async (path: string): Promise<void> => {\n await fs.promises.rm(path, { recursive: true, force: true });\n }\n\n const getFileSize = async (path: string): Promise<number> => {\n const stats = await fs.promises.stat(path);\n return stats.size;\n }\n\n return {\n exists,\n isDirectory,\n isFile,\n isReadable,\n isWritable,\n isFileReadable,\n isDirectoryWritable,\n isDirectoryReadable,\n createDirectory,\n readFile,\n readStream,\n writeFile,\n forEachFileIn,\n hashFile,\n listFiles,\n deleteFile,\n deleteDirectory,\n getFileSize,\n };\n}"],"names":["path"],"mappings":"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"}