@arke-institute/rhiza 0.1.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 (230) hide show
  1. package/README.md +106 -0
  2. package/dist/__tests__/fixtures/index.d.ts +9 -0
  3. package/dist/__tests__/fixtures/index.d.ts.map +1 -0
  4. package/dist/__tests__/fixtures/index.js +12 -0
  5. package/dist/__tests__/fixtures/index.js.map +1 -0
  6. package/dist/__tests__/fixtures/kladoi/index.d.ts +165 -0
  7. package/dist/__tests__/fixtures/kladoi/index.d.ts.map +1 -0
  8. package/dist/__tests__/fixtures/kladoi/index.js +270 -0
  9. package/dist/__tests__/fixtures/kladoi/index.js.map +1 -0
  10. package/dist/__tests__/fixtures/logs/index.d.ts +19 -0
  11. package/dist/__tests__/fixtures/logs/index.d.ts.map +1 -0
  12. package/dist/__tests__/fixtures/logs/index.js +545 -0
  13. package/dist/__tests__/fixtures/logs/index.js.map +1 -0
  14. package/dist/__tests__/fixtures/mock-client.d.ts +127 -0
  15. package/dist/__tests__/fixtures/mock-client.d.ts.map +1 -0
  16. package/dist/__tests__/fixtures/mock-client.js +415 -0
  17. package/dist/__tests__/fixtures/mock-client.js.map +1 -0
  18. package/dist/__tests__/fixtures/rhizai/index.d.ts +54 -0
  19. package/dist/__tests__/fixtures/rhizai/index.d.ts.map +1 -0
  20. package/dist/__tests__/fixtures/rhizai/index.js +283 -0
  21. package/dist/__tests__/fixtures/rhizai/index.js.map +1 -0
  22. package/dist/__tests__/unit/fixtures.test.d.ts +10 -0
  23. package/dist/__tests__/unit/fixtures.test.d.ts.map +1 -0
  24. package/dist/__tests__/unit/fixtures.test.js +275 -0
  25. package/dist/__tests__/unit/fixtures.test.js.map +1 -0
  26. package/dist/__tests__/unit/handoff/gather.test.d.ts +8 -0
  27. package/dist/__tests__/unit/handoff/gather.test.d.ts.map +1 -0
  28. package/dist/__tests__/unit/handoff/gather.test.js +176 -0
  29. package/dist/__tests__/unit/handoff/gather.test.js.map +1 -0
  30. package/dist/__tests__/unit/handoff/interpret.test.d.ts +9 -0
  31. package/dist/__tests__/unit/handoff/interpret.test.d.ts.map +1 -0
  32. package/dist/__tests__/unit/handoff/interpret.test.js +370 -0
  33. package/dist/__tests__/unit/handoff/interpret.test.js.map +1 -0
  34. package/dist/__tests__/unit/handoff/route.test.d.ts +8 -0
  35. package/dist/__tests__/unit/handoff/route.test.d.ts.map +1 -0
  36. package/dist/__tests__/unit/handoff/route.test.js +271 -0
  37. package/dist/__tests__/unit/handoff/route.test.js.map +1 -0
  38. package/dist/__tests__/unit/handoff/scatter.test.d.ts +7 -0
  39. package/dist/__tests__/unit/handoff/scatter.test.d.ts.map +1 -0
  40. package/dist/__tests__/unit/handoff/scatter.test.js +54 -0
  41. package/dist/__tests__/unit/handoff/scatter.test.js.map +1 -0
  42. package/dist/__tests__/unit/resume.test.d.ts +8 -0
  43. package/dist/__tests__/unit/resume.test.d.ts.map +1 -0
  44. package/dist/__tests__/unit/resume.test.js +134 -0
  45. package/dist/__tests__/unit/resume.test.js.map +1 -0
  46. package/dist/__tests__/unit/status.test.d.ts +8 -0
  47. package/dist/__tests__/unit/status.test.d.ts.map +1 -0
  48. package/dist/__tests__/unit/status.test.js +164 -0
  49. package/dist/__tests__/unit/status.test.js.map +1 -0
  50. package/dist/__tests__/unit/target.test.d.ts +8 -0
  51. package/dist/__tests__/unit/target.test.d.ts.map +1 -0
  52. package/dist/__tests__/unit/target.test.js +116 -0
  53. package/dist/__tests__/unit/target.test.js.map +1 -0
  54. package/dist/__tests__/unit/traverse.test.d.ts +8 -0
  55. package/dist/__tests__/unit/traverse.test.d.ts.map +1 -0
  56. package/dist/__tests__/unit/traverse.test.js +143 -0
  57. package/dist/__tests__/unit/traverse.test.js.map +1 -0
  58. package/dist/__tests__/unit/validation/klados.test.d.ts +16 -0
  59. package/dist/__tests__/unit/validation/klados.test.d.ts.map +1 -0
  60. package/dist/__tests__/unit/validation/klados.test.js +275 -0
  61. package/dist/__tests__/unit/validation/klados.test.js.map +1 -0
  62. package/dist/__tests__/unit/validation/rhiza.test.d.ts +16 -0
  63. package/dist/__tests__/unit/validation/rhiza.test.d.ts.map +1 -0
  64. package/dist/__tests__/unit/validation/rhiza.test.js +612 -0
  65. package/dist/__tests__/unit/validation/rhiza.test.js.map +1 -0
  66. package/dist/__tests__/unit/validation/runtime.test.d.ts +11 -0
  67. package/dist/__tests__/unit/validation/runtime.test.d.ts.map +1 -0
  68. package/dist/__tests__/unit/validation/runtime.test.js +553 -0
  69. package/dist/__tests__/unit/validation/runtime.test.js.map +1 -0
  70. package/dist/__tests__/unit/worker/errors.test.d.ts +2 -0
  71. package/dist/__tests__/unit/worker/errors.test.d.ts.map +1 -0
  72. package/dist/__tests__/unit/worker/errors.test.js +226 -0
  73. package/dist/__tests__/unit/worker/errors.test.js.map +1 -0
  74. package/dist/__tests__/unit/worker/job.test.d.ts +2 -0
  75. package/dist/__tests__/unit/worker/job.test.d.ts.map +1 -0
  76. package/dist/__tests__/unit/worker/job.test.js +233 -0
  77. package/dist/__tests__/unit/worker/job.test.js.map +1 -0
  78. package/dist/client/index.d.ts +10 -0
  79. package/dist/client/index.d.ts.map +1 -0
  80. package/dist/client/index.js +8 -0
  81. package/dist/client/index.js.map +1 -0
  82. package/dist/client/interface.d.ts +142 -0
  83. package/dist/client/interface.d.ts.map +1 -0
  84. package/dist/client/interface.js +8 -0
  85. package/dist/client/interface.js.map +1 -0
  86. package/dist/client/mock.d.ts +95 -0
  87. package/dist/client/mock.d.ts.map +1 -0
  88. package/dist/client/mock.js +795 -0
  89. package/dist/client/mock.js.map +1 -0
  90. package/dist/client/types.d.ts +344 -0
  91. package/dist/client/types.d.ts.map +1 -0
  92. package/dist/client/types.js +8 -0
  93. package/dist/client/types.js.map +1 -0
  94. package/dist/handoff/gather-api.d.ts +60 -0
  95. package/dist/handoff/gather-api.d.ts.map +1 -0
  96. package/dist/handoff/gather-api.js +130 -0
  97. package/dist/handoff/gather-api.js.map +1 -0
  98. package/dist/handoff/gather.d.ts +59 -0
  99. package/dist/handoff/gather.d.ts.map +1 -0
  100. package/dist/handoff/gather.js +134 -0
  101. package/dist/handoff/gather.js.map +1 -0
  102. package/dist/handoff/index.d.ts +19 -0
  103. package/dist/handoff/index.d.ts.map +1 -0
  104. package/dist/handoff/index.js +25 -0
  105. package/dist/handoff/index.js.map +1 -0
  106. package/dist/handoff/interpret.d.ts +79 -0
  107. package/dist/handoff/interpret.d.ts.map +1 -0
  108. package/dist/handoff/interpret.js +197 -0
  109. package/dist/handoff/interpret.js.map +1 -0
  110. package/dist/handoff/invoke.d.ts +82 -0
  111. package/dist/handoff/invoke.d.ts.map +1 -0
  112. package/dist/handoff/invoke.js +196 -0
  113. package/dist/handoff/invoke.js.map +1 -0
  114. package/dist/handoff/route.d.ts +25 -0
  115. package/dist/handoff/route.d.ts.map +1 -0
  116. package/dist/handoff/route.js +65 -0
  117. package/dist/handoff/route.js.map +1 -0
  118. package/dist/handoff/scatter-api.d.ts +62 -0
  119. package/dist/handoff/scatter-api.d.ts.map +1 -0
  120. package/dist/handoff/scatter-api.js +81 -0
  121. package/dist/handoff/scatter-api.js.map +1 -0
  122. package/dist/handoff/scatter.d.ts +19 -0
  123. package/dist/handoff/scatter.d.ts.map +1 -0
  124. package/dist/handoff/scatter.js +27 -0
  125. package/dist/handoff/scatter.js.map +1 -0
  126. package/dist/handoff/target.d.ts +16 -0
  127. package/dist/handoff/target.d.ts.map +1 -0
  128. package/dist/handoff/target.js +51 -0
  129. package/dist/handoff/target.js.map +1 -0
  130. package/dist/index.d.ts +42 -0
  131. package/dist/index.d.ts.map +1 -0
  132. package/dist/index.js +52 -0
  133. package/dist/index.js.map +1 -0
  134. package/dist/logging/index.d.ts +4 -0
  135. package/dist/logging/index.d.ts.map +1 -0
  136. package/dist/logging/index.js +3 -0
  137. package/dist/logging/index.js.map +1 -0
  138. package/dist/logging/logger.d.ts +52 -0
  139. package/dist/logging/logger.d.ts.map +1 -0
  140. package/dist/logging/logger.js +70 -0
  141. package/dist/logging/logger.js.map +1 -0
  142. package/dist/logging/writer.d.ts +63 -0
  143. package/dist/logging/writer.d.ts.map +1 -0
  144. package/dist/logging/writer.js +160 -0
  145. package/dist/logging/writer.js.map +1 -0
  146. package/dist/resume/index.d.ts +77 -0
  147. package/dist/resume/index.d.ts.map +1 -0
  148. package/dist/resume/index.js +110 -0
  149. package/dist/resume/index.js.map +1 -0
  150. package/dist/status/index.d.ts +54 -0
  151. package/dist/status/index.d.ts.map +1 -0
  152. package/dist/status/index.js +107 -0
  153. package/dist/status/index.js.map +1 -0
  154. package/dist/traverse/index.d.ts +53 -0
  155. package/dist/traverse/index.d.ts.map +1 -0
  156. package/dist/traverse/index.js +142 -0
  157. package/dist/traverse/index.js.map +1 -0
  158. package/dist/types/batch.d.ts +53 -0
  159. package/dist/types/batch.d.ts.map +1 -0
  160. package/dist/types/batch.js +2 -0
  161. package/dist/types/batch.js.map +1 -0
  162. package/dist/types/index.d.ts +10 -0
  163. package/dist/types/index.d.ts.map +1 -0
  164. package/dist/types/index.js +2 -0
  165. package/dist/types/index.js.map +1 -0
  166. package/dist/types/klados.d.ts +63 -0
  167. package/dist/types/klados.d.ts.map +1 -0
  168. package/dist/types/klados.js +2 -0
  169. package/dist/types/klados.js.map +1 -0
  170. package/dist/types/log.d.ts +107 -0
  171. package/dist/types/log.d.ts.map +1 -0
  172. package/dist/types/log.js +2 -0
  173. package/dist/types/log.js.map +1 -0
  174. package/dist/types/refs.d.ts +58 -0
  175. package/dist/types/refs.d.ts.map +1 -0
  176. package/dist/types/refs.js +43 -0
  177. package/dist/types/refs.js.map +1 -0
  178. package/dist/types/request.d.ts +69 -0
  179. package/dist/types/request.d.ts.map +1 -0
  180. package/dist/types/request.js +2 -0
  181. package/dist/types/request.js.map +1 -0
  182. package/dist/types/response.d.ts +31 -0
  183. package/dist/types/response.d.ts.map +1 -0
  184. package/dist/types/response.js +2 -0
  185. package/dist/types/response.js.map +1 -0
  186. package/dist/types/rhiza.d.ts +100 -0
  187. package/dist/types/rhiza.d.ts.map +1 -0
  188. package/dist/types/rhiza.js +2 -0
  189. package/dist/types/rhiza.js.map +1 -0
  190. package/dist/types/status.d.ts +84 -0
  191. package/dist/types/status.d.ts.map +1 -0
  192. package/dist/types/status.js +2 -0
  193. package/dist/types/status.js.map +1 -0
  194. package/dist/utils/id.d.ts +15 -0
  195. package/dist/utils/id.d.ts.map +1 -0
  196. package/dist/utils/id.js +25 -0
  197. package/dist/utils/id.js.map +1 -0
  198. package/dist/utils/index.d.ts +2 -0
  199. package/dist/utils/index.d.ts.map +1 -0
  200. package/dist/utils/index.js +2 -0
  201. package/dist/utils/index.js.map +1 -0
  202. package/dist/validation/index.d.ts +9 -0
  203. package/dist/validation/index.d.ts.map +1 -0
  204. package/dist/validation/index.js +9 -0
  205. package/dist/validation/index.js.map +1 -0
  206. package/dist/validation/validate-klados.d.ts +38 -0
  207. package/dist/validation/validate-klados.d.ts.map +1 -0
  208. package/dist/validation/validate-klados.js +139 -0
  209. package/dist/validation/validate-klados.js.map +1 -0
  210. package/dist/validation/validate-rhiza.d.ts +29 -0
  211. package/dist/validation/validate-rhiza.d.ts.map +1 -0
  212. package/dist/validation/validate-rhiza.js +382 -0
  213. package/dist/validation/validate-rhiza.js.map +1 -0
  214. package/dist/validation/validate-runtime.d.ts +28 -0
  215. package/dist/validation/validate-runtime.d.ts.map +1 -0
  216. package/dist/validation/validate-runtime.js +212 -0
  217. package/dist/validation/validate-runtime.js.map +1 -0
  218. package/dist/worker/errors.d.ts +77 -0
  219. package/dist/worker/errors.d.ts.map +1 -0
  220. package/dist/worker/errors.js +143 -0
  221. package/dist/worker/errors.js.map +1 -0
  222. package/dist/worker/index.d.ts +8 -0
  223. package/dist/worker/index.d.ts.map +1 -0
  224. package/dist/worker/index.js +8 -0
  225. package/dist/worker/index.js.map +1 -0
  226. package/dist/worker/job.d.ts +150 -0
  227. package/dist/worker/job.d.ts.map +1 -0
  228. package/dist/worker/job.js +280 -0
  229. package/dist/worker/job.js.map +1 -0
  230. package/package.json +48 -0
package/dist/index.js ADDED
@@ -0,0 +1,52 @@
1
+ /**
2
+ * @arke-institute/rhiza
3
+ *
4
+ * Types, pure logic, and SDK utilities for Arke workflow protocol.
5
+ * Workers use rhiza for types, validation, and workflow execution.
6
+ *
7
+ * Naming:
8
+ * - Rhiza (ῥίζα) = root, the workflow definition
9
+ * - Klados (κλάδος) = branch, an individual action
10
+ *
11
+ * The library provides:
12
+ * - Types: Entity types, request/response types, log types
13
+ * - Validation: Pure validation functions for klados/rhiza properties
14
+ * - Handoff (pure): Route matching, target resolution, gather state transforms
15
+ * - Handoff (SDK): Invocation, scatter/gather with CAS, orchestration
16
+ * - Logging: In-memory logger and API writers
17
+ * - Utilities: ID generation
18
+ */
19
+ export { isEntityRef, ref } from './types/refs';
20
+ // ============================================================================
21
+ // Validation
22
+ // ============================================================================
23
+ export { validateKladosProperties, } from './validation/validate-klados';
24
+ export { validateRhizaProperties } from './validation/validate-rhiza';
25
+ // ============================================================================
26
+ // Handoff - Pure functions for route matching, target resolution, gather
27
+ // ============================================================================
28
+ export { evaluateWhere, matchRoute } from './handoff/route';
29
+ export { resolveTarget } from './handoff/target';
30
+ export { findGatherTarget } from './handoff/scatter';
31
+ export { completeBatchSlot, errorBatchSlot, } from './handoff/gather';
32
+ // ============================================================================
33
+ // Handoff - SDK utilities for execution (requires @arke-institute/sdk)
34
+ // ============================================================================
35
+ export { discoverTargetType, invokeTarget, invokeKlados, invokeRhiza, } from './handoff/invoke';
36
+ export { createScatterBatch, } from './handoff/scatter-api';
37
+ export { completeBatchSlotWithCAS, errorBatchSlotWithCAS, } from './handoff/gather-api';
38
+ export { interpretThen, } from './handoff/interpret';
39
+ // ============================================================================
40
+ // Logging - In-memory logger and API writers
41
+ // ============================================================================
42
+ export { KladosLogger } from './logging/logger';
43
+ export { writeKladosLog, updateLogWithHandoffs, updateLogStatus, } from './logging/writer';
44
+ // ============================================================================
45
+ // Worker Utilities - High-level abstractions for klados workers
46
+ // ============================================================================
47
+ export { KladosJob, KladosErrorCode, createKladosError, toKladosError, isKladosError, failKlados, } from './worker';
48
+ // ============================================================================
49
+ // Utilities
50
+ // ============================================================================
51
+ export { generateId } from './utils/id';
52
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AA4BH,OAAO,EAAE,WAAW,EAAE,GAAG,EAAE,MAAM,cAAc,CAAC;AAyChD,+EAA+E;AAC/E,aAAa;AACb,+EAA+E;AAE/E,OAAO,EACL,wBAAwB,GAIzB,MAAM,8BAA8B,CAAC;AAEtC,OAAO,EAAE,uBAAuB,EAAE,MAAM,6BAA6B,CAAC;AAEtE,+EAA+E;AAC/E,yEAAyE;AACzE,+EAA+E;AAE/E,OAAO,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAC5D,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AACjD,OAAO,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AACrD,OAAO,EACL,iBAAiB,EACjB,cAAc,GAIf,MAAM,kBAAkB,CAAC;AAE1B,+EAA+E;AAC/E,uEAAuE;AACvE,+EAA+E;AAE/E,OAAO,EACL,kBAAkB,EAClB,YAAY,EACZ,YAAY,EACZ,WAAW,GAGZ,MAAM,kBAAkB,CAAC;AAE1B,OAAO,EACL,kBAAkB,GAGnB,MAAM,uBAAuB,CAAC;AAE/B,OAAO,EACL,wBAAwB,EACxB,qBAAqB,GAGtB,MAAM,sBAAsB,CAAC;AAE9B,OAAO,EACL,aAAa,GAId,MAAM,qBAAqB,CAAC;AAE7B,+EAA+E;AAC/E,6CAA6C;AAC7C,+EAA+E;AAE/E,OAAO,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAChD,OAAO,EACL,cAAc,EACd,qBAAqB,EACrB,eAAe,GAIhB,MAAM,kBAAkB,CAAC;AAE1B,+EAA+E;AAC/E,gEAAgE;AAChE,+EAA+E;AAE/E,OAAO,EACL,SAAS,EAGT,eAAe,EAGf,iBAAiB,EACjB,aAAa,EACb,aAAa,EACb,UAAU,GAEX,MAAM,UAAU,CAAC;AAElB,+EAA+E;AAC/E,YAAY;AACZ,+EAA+E;AAE/E,OAAO,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC"}
@@ -0,0 +1,4 @@
1
+ export { KladosLogger } from './logger';
2
+ export { writeKladosLog, updateLogWithHandoffs, updateLogStatus, } from './writer';
3
+ export type { WriteLogOptions, WriteLogResult, LogError } from './writer';
4
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/logging/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC;AAExC,OAAO,EACL,cAAc,EACd,qBAAqB,EACrB,eAAe,GAChB,MAAM,UAAU,CAAC;AAClB,YAAY,EAAE,eAAe,EAAE,cAAc,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAC"}
@@ -0,0 +1,3 @@
1
+ export { KladosLogger } from './logger';
2
+ export { writeKladosLog, updateLogWithHandoffs, updateLogStatus, } from './writer';
3
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/logging/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC;AAExC,OAAO,EACL,cAAc,EACd,qBAAqB,EACrB,eAAe,GAChB,MAAM,UAAU,CAAC"}
@@ -0,0 +1,52 @@
1
+ /**
2
+ * KladosLogger - In-memory log message collector
3
+ *
4
+ * Collects log messages during klados execution.
5
+ * Messages are written to the log entry when execution completes.
6
+ */
7
+ import type { LogMessage } from '../types';
8
+ /**
9
+ * KladosLogger - In-memory log message collector
10
+ *
11
+ * Usage:
12
+ * ```typescript
13
+ * const logger = new KladosLogger();
14
+ * logger.info('Starting processing', { target: entityId });
15
+ * logger.success('Processing complete');
16
+ *
17
+ * // Get messages for log entry
18
+ * const messages = logger.getMessages();
19
+ * ```
20
+ */
21
+ export declare class KladosLogger {
22
+ private messages;
23
+ /**
24
+ * Log an info message
25
+ */
26
+ info(message: string, metadata?: Record<string, unknown>): void;
27
+ /**
28
+ * Log a warning message
29
+ */
30
+ warning(message: string, metadata?: Record<string, unknown>): void;
31
+ /**
32
+ * Log an error message
33
+ */
34
+ error(message: string, metadata?: Record<string, unknown>): void;
35
+ /**
36
+ * Log a success message
37
+ */
38
+ success(message: string, metadata?: Record<string, unknown>): void;
39
+ /**
40
+ * Add a log message
41
+ */
42
+ private add;
43
+ /**
44
+ * Get all collected messages
45
+ */
46
+ getMessages(): LogMessage[];
47
+ /**
48
+ * Clear all messages
49
+ */
50
+ clear(): void;
51
+ }
52
+ //# sourceMappingURL=logger.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logger.d.ts","sourceRoot":"","sources":["../../src/logging/logger.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AAE3C;;;;;;;;;;;;GAYG;AACH,qBAAa,YAAY;IACvB,OAAO,CAAC,QAAQ,CAAoB;IAEpC;;OAEG;IACH,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI;IAI/D;;OAEG;IACH,OAAO,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI;IAIlE;;OAEG;IACH,KAAK,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI;IAIhE;;OAEG;IACH,OAAO,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI;IAIlE;;OAEG;IACH,OAAO,CAAC,GAAG;IAaX;;OAEG;IACH,WAAW,IAAI,UAAU,EAAE;IAI3B;;OAEG;IACH,KAAK,IAAI,IAAI;CAGd"}
@@ -0,0 +1,70 @@
1
+ /**
2
+ * KladosLogger - In-memory log message collector
3
+ *
4
+ * Collects log messages during klados execution.
5
+ * Messages are written to the log entry when execution completes.
6
+ */
7
+ /**
8
+ * KladosLogger - In-memory log message collector
9
+ *
10
+ * Usage:
11
+ * ```typescript
12
+ * const logger = new KladosLogger();
13
+ * logger.info('Starting processing', { target: entityId });
14
+ * logger.success('Processing complete');
15
+ *
16
+ * // Get messages for log entry
17
+ * const messages = logger.getMessages();
18
+ * ```
19
+ */
20
+ export class KladosLogger {
21
+ messages = [];
22
+ /**
23
+ * Log an info message
24
+ */
25
+ info(message, metadata) {
26
+ this.add('info', message, metadata);
27
+ }
28
+ /**
29
+ * Log a warning message
30
+ */
31
+ warning(message, metadata) {
32
+ this.add('warning', message, metadata);
33
+ }
34
+ /**
35
+ * Log an error message
36
+ */
37
+ error(message, metadata) {
38
+ this.add('error', message, metadata);
39
+ }
40
+ /**
41
+ * Log a success message
42
+ */
43
+ success(message, metadata) {
44
+ this.add('success', message, metadata);
45
+ }
46
+ /**
47
+ * Add a log message
48
+ */
49
+ add(level, message, metadata) {
50
+ this.messages.push({
51
+ level,
52
+ message,
53
+ timestamp: new Date().toISOString(),
54
+ metadata,
55
+ });
56
+ }
57
+ /**
58
+ * Get all collected messages
59
+ */
60
+ getMessages() {
61
+ return [...this.messages];
62
+ }
63
+ /**
64
+ * Clear all messages
65
+ */
66
+ clear() {
67
+ this.messages = [];
68
+ }
69
+ }
70
+ //# sourceMappingURL=logger.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logger.js","sourceRoot":"","sources":["../../src/logging/logger.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH;;;;;;;;;;;;GAYG;AACH,MAAM,OAAO,YAAY;IACf,QAAQ,GAAiB,EAAE,CAAC;IAEpC;;OAEG;IACH,IAAI,CAAC,OAAe,EAAE,QAAkC;QACtD,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,OAAO,EAAE,QAAQ,CAAC,CAAC;IACtC,CAAC;IAED;;OAEG;IACH,OAAO,CAAC,OAAe,EAAE,QAAkC;QACzD,IAAI,CAAC,GAAG,CAAC,SAAS,EAAE,OAAO,EAAE,QAAQ,CAAC,CAAC;IACzC,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,OAAe,EAAE,QAAkC;QACvD,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,OAAO,EAAE,QAAQ,CAAC,CAAC;IACvC,CAAC;IAED;;OAEG;IACH,OAAO,CAAC,OAAe,EAAE,QAAkC;QACzD,IAAI,CAAC,GAAG,CAAC,SAAS,EAAE,OAAO,EAAE,QAAQ,CAAC,CAAC;IACzC,CAAC;IAED;;OAEG;IACK,GAAG,CACT,KAA0B,EAC1B,OAAe,EACf,QAAkC;QAElC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC;YACjB,KAAK;YACL,OAAO;YACP,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;YACnC,QAAQ;SACT,CAAC,CAAC;IACL,CAAC;IAED;;OAEG;IACH,WAAW;QACT,OAAO,CAAC,GAAG,IAAI,CAAC,QAAQ,CAAC,CAAC;IAC5B,CAAC;IAED;;OAEG;IACH,KAAK;QACH,IAAI,CAAC,QAAQ,GAAG,EAAE,CAAC;IACrB,CAAC;CACF"}
@@ -0,0 +1,63 @@
1
+ /**
2
+ * Log Writer - SDK utilities for writing klados logs
3
+ *
4
+ * Uses the SDK to write log entries to the job collection.
5
+ * CAS retry is handled by the SDK's withCasRetry utility.
6
+ */
7
+ import type { ArkeClient } from '@arke-institute/sdk';
8
+ import type { KladosLogEntry, LogMessage, HandoffRecord } from '../types';
9
+ /**
10
+ * Options for writing a klados log
11
+ */
12
+ export interface WriteLogOptions {
13
+ /** Arke client */
14
+ client: ArkeClient;
15
+ /** Job collection ID */
16
+ jobCollectionId: string;
17
+ /** Klados log entry data */
18
+ entry: KladosLogEntry;
19
+ /** Human-readable log messages */
20
+ messages: LogMessage[];
21
+ /** Agent info */
22
+ agentId: string;
23
+ agentVersion: string;
24
+ }
25
+ /**
26
+ * Result of writing a klados log
27
+ */
28
+ export interface WriteLogResult {
29
+ /** Log entity ID (the generated log ID) */
30
+ logId: string;
31
+ /** Log file entity ID (the actual file entity) */
32
+ fileId: string;
33
+ }
34
+ /**
35
+ * Write a klados log entry to the job collection
36
+ *
37
+ * Creates an entity with the log data and adds relationships
38
+ * for chain traversal. The from_logs array is stored both in
39
+ * properties and as received_from relationships.
40
+ */
41
+ export declare function writeKladosLog(options: WriteLogOptions): Promise<WriteLogResult>;
42
+ /**
43
+ * Update log entry with handoff records
44
+ *
45
+ * Called after handoffs are made to record what was invoked.
46
+ * Uses CAS retry for concurrent safety.
47
+ */
48
+ export declare function updateLogWithHandoffs(client: ArkeClient, logFileId: string, handoffs: HandoffRecord[]): Promise<void>;
49
+ /**
50
+ * Log error info for status updates
51
+ */
52
+ export interface LogError {
53
+ code: string;
54
+ message: string;
55
+ retryable: boolean;
56
+ }
57
+ /**
58
+ * Update log entry status (e.g., to done or error)
59
+ *
60
+ * Uses CAS retry for concurrent safety.
61
+ */
62
+ export declare function updateLogStatus(client: ArkeClient, logFileId: string, status: 'running' | 'done' | 'error', logError?: LogError): Promise<void>;
63
+ //# sourceMappingURL=writer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"writer.d.ts","sourceRoot":"","sources":["../../src/logging/writer.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAEtD,OAAO,KAAK,EACV,cAAc,EAEd,UAAU,EACV,aAAa,EACd,MAAM,UAAU,CAAC;AAElB;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B,kBAAkB;IAClB,MAAM,EAAE,UAAU,CAAC;IAEnB,wBAAwB;IACxB,eAAe,EAAE,MAAM,CAAC;IAExB,4BAA4B;IAC5B,KAAK,EAAE,cAAc,CAAC;IAEtB,kCAAkC;IAClC,QAAQ,EAAE,UAAU,EAAE,CAAC;IAEvB,iBAAiB;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,YAAY,EAAE,MAAM,CAAC;CACtB;AAED;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,2CAA2C;IAC3C,KAAK,EAAE,MAAM,CAAC;IAEd,kDAAkD;IAClD,MAAM,EAAE,MAAM,CAAC;CAChB;AAED;;;;;;GAMG;AACH,wBAAsB,cAAc,CAClC,OAAO,EAAE,eAAe,GACvB,OAAO,CAAC,cAAc,CAAC,CAoFzB;AAED;;;;;GAKG;AACH,wBAAsB,qBAAqB,CACzC,MAAM,EAAE,UAAU,EAClB,SAAS,EAAE,MAAM,EACjB,QAAQ,EAAE,aAAa,EAAE,GACxB,OAAO,CAAC,IAAI,CAAC,CAqCf;AAED;;GAEG;AACH,MAAM,WAAW,QAAQ;IACvB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,OAAO,CAAC;CACpB;AAED;;;;GAIG;AACH,wBAAsB,eAAe,CACnC,MAAM,EAAE,UAAU,EAClB,SAAS,EAAE,MAAM,EACjB,MAAM,EAAE,SAAS,GAAG,MAAM,GAAG,OAAO,EACpC,QAAQ,CAAC,EAAE,QAAQ,GAClB,OAAO,CAAC,IAAI,CAAC,CA0Cf"}
@@ -0,0 +1,160 @@
1
+ /**
2
+ * Log Writer - SDK utilities for writing klados logs
3
+ *
4
+ * Uses the SDK to write log entries to the job collection.
5
+ * CAS retry is handled by the SDK's withCasRetry utility.
6
+ */
7
+ import { withCasRetry } from '@arke-institute/sdk';
8
+ /**
9
+ * Write a klados log entry to the job collection
10
+ *
11
+ * Creates an entity with the log data and adds relationships
12
+ * for chain traversal. The from_logs array is stored both in
13
+ * properties and as received_from relationships.
14
+ */
15
+ export async function writeKladosLog(options) {
16
+ const { client, jobCollectionId, entry, messages, agentId, agentVersion, } = options;
17
+ // Build the job log structure
18
+ const jobLog = {
19
+ entry,
20
+ agent_id: agentId,
21
+ agent_version: agentVersion,
22
+ messages,
23
+ };
24
+ // 1. Create entity with log data
25
+ const { data: logEntity, error: createError } = await client.api.POST('/entities', {
26
+ body: {
27
+ type: 'klados_log',
28
+ collection: jobCollectionId,
29
+ properties: {
30
+ rhiza_id: entry.rhiza_id,
31
+ klados_id: entry.klados_id,
32
+ job_id: entry.job_id,
33
+ status: entry.status,
34
+ log_data: jobLog,
35
+ },
36
+ },
37
+ });
38
+ if (createError || !logEntity) {
39
+ throw new Error(`Failed to create log entity: ${createError?.error || 'Unknown error'}`);
40
+ }
41
+ const logEntityId = logEntity.id;
42
+ // 2. Build relationships for received_from chain traversal
43
+ const relationships = [];
44
+ // Add received_from relationships for graph traversal
45
+ // These mirror the from_logs array in the entry properties
46
+ if (entry.received.from_logs && entry.received.from_logs.length > 0) {
47
+ for (const parentLogId of entry.received.from_logs) {
48
+ relationships.push({
49
+ predicate: 'received_from',
50
+ peer: parentLogId,
51
+ direction: 'outgoing',
52
+ });
53
+ }
54
+ }
55
+ // 3. Add relationships to the log entity if needed (CAS retry)
56
+ if (relationships.length > 0) {
57
+ await withCasRetry({
58
+ getTip: async () => {
59
+ const { data, error } = await client.api.GET('/entities/{id}/tip', {
60
+ params: { path: { id: logEntityId } },
61
+ });
62
+ if (error || !data)
63
+ throw new Error('Failed to get log entity tip');
64
+ return data.cid;
65
+ },
66
+ update: async (tip) => {
67
+ return client.api.PUT('/entities/{id}', {
68
+ params: { path: { id: logEntityId } },
69
+ body: {
70
+ expect_tip: tip,
71
+ relationships_add: relationships,
72
+ },
73
+ });
74
+ },
75
+ }, { concurrency: 100 });
76
+ }
77
+ return { logId: entry.id, fileId: logEntityId };
78
+ }
79
+ /**
80
+ * Update log entry with handoff records
81
+ *
82
+ * Called after handoffs are made to record what was invoked.
83
+ * Uses CAS retry for concurrent safety.
84
+ */
85
+ export async function updateLogWithHandoffs(client, logFileId, handoffs) {
86
+ await withCasRetry({
87
+ getTip: async () => {
88
+ const { data, error } = await client.api.GET('/entities/{id}/tip', {
89
+ params: { path: { id: logFileId } },
90
+ });
91
+ if (error || !data)
92
+ throw new Error('Failed to get log tip');
93
+ return data.cid;
94
+ },
95
+ update: async (tip) => {
96
+ // Get current entity to merge with existing data
97
+ const { data: entity, error: getError } = await client.api.GET('/entities/{id}', {
98
+ params: { path: { id: logFileId } },
99
+ });
100
+ if (getError || !entity) {
101
+ throw new Error('Failed to get log entity');
102
+ }
103
+ const logData = entity.properties.log_data;
104
+ logData.entry.handoffs = handoffs;
105
+ return client.api.PUT('/entities/{id}', {
106
+ params: { path: { id: logFileId } },
107
+ body: {
108
+ expect_tip: tip,
109
+ properties: {
110
+ ...entity.properties,
111
+ log_data: logData,
112
+ },
113
+ },
114
+ });
115
+ },
116
+ }, { concurrency: 10 });
117
+ }
118
+ /**
119
+ * Update log entry status (e.g., to done or error)
120
+ *
121
+ * Uses CAS retry for concurrent safety.
122
+ */
123
+ export async function updateLogStatus(client, logFileId, status, logError) {
124
+ await withCasRetry({
125
+ getTip: async () => {
126
+ const { data, error } = await client.api.GET('/entities/{id}/tip', {
127
+ params: { path: { id: logFileId } },
128
+ });
129
+ if (error || !data)
130
+ throw new Error('Failed to get log tip');
131
+ return data.cid;
132
+ },
133
+ update: async (tip) => {
134
+ const { data: entity, error: getError } = await client.api.GET('/entities/{id}', {
135
+ params: { path: { id: logFileId } },
136
+ });
137
+ if (getError || !entity) {
138
+ throw new Error('Failed to get log entity');
139
+ }
140
+ const logData = entity.properties.log_data;
141
+ logData.entry.status = status;
142
+ logData.entry.completed_at = new Date().toISOString();
143
+ if (logError) {
144
+ logData.entry.error = logError;
145
+ }
146
+ return client.api.PUT('/entities/{id}', {
147
+ params: { path: { id: logFileId } },
148
+ body: {
149
+ expect_tip: tip,
150
+ properties: {
151
+ ...entity.properties,
152
+ status, // Also update top-level for easy querying
153
+ log_data: logData,
154
+ },
155
+ },
156
+ });
157
+ },
158
+ }, { concurrency: 10 });
159
+ }
160
+ //# sourceMappingURL=writer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"writer.js","sourceRoot":"","sources":["../../src/logging/writer.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,77 @@
1
+ /**
2
+ * Resume Module
3
+ *
4
+ * Functions for resuming failed workflow executions.
5
+ * Resume allows retrying failed jobs while preserving context.
6
+ */
7
+ import type { KladosLogEntry } from '../types';
8
+ import type { MockArkeClient } from '../__tests__/fixtures/mock-client';
9
+ /**
10
+ * Options for resuming a workflow
11
+ */
12
+ export interface ResumeOptions {
13
+ /** Maximum number of jobs to resume */
14
+ maxJobs?: number;
15
+ /** Only resume these specific job IDs */
16
+ jobIds?: string[];
17
+ }
18
+ /**
19
+ * Information about a resumed job
20
+ */
21
+ export interface ResumedJob {
22
+ originalJobId: string;
23
+ newJobId: string;
24
+ kladosId: string;
25
+ errorLogId: string;
26
+ targetEntityId: string;
27
+ }
28
+ /**
29
+ * Result of resuming a workflow
30
+ */
31
+ export interface ResumeResult {
32
+ resumed: number;
33
+ skipped: number;
34
+ jobs: ResumedJob[];
35
+ }
36
+ /**
37
+ * Error summary for canResume
38
+ */
39
+ export interface ErrorSummary {
40
+ jobId: string;
41
+ kladosId: string;
42
+ code: string;
43
+ message: string;
44
+ retryable: boolean;
45
+ }
46
+ /**
47
+ * Result of checking if a workflow can be resumed
48
+ */
49
+ export interface CanResumeResult {
50
+ canResume: boolean;
51
+ totalErrors: number;
52
+ retryableCount: number;
53
+ nonRetryableCount: number;
54
+ errors?: ErrorSummary[];
55
+ }
56
+ /**
57
+ * Resume a workflow by retrying failed jobs
58
+ *
59
+ * Finds all error leaves in the log chain and re-invokes them.
60
+ * Only retries jobs marked as retryable.
61
+ *
62
+ * @param client - The Arke client
63
+ * @param logs - The log chain for the workflow
64
+ * @param options - Resume options
65
+ * @returns Resume result with count and job details
66
+ */
67
+ export declare function resumeWorkflow(client: MockArkeClient, logs: KladosLogEntry[], options?: ResumeOptions): Promise<ResumeResult>;
68
+ /**
69
+ * Check if a workflow can be resumed
70
+ *
71
+ * Analyzes the log chain to find retryable errors.
72
+ *
73
+ * @param logs - The log chain for the workflow
74
+ * @returns Information about resume possibility
75
+ */
76
+ export declare function canResume(logs: KladosLogEntry[]): CanResumeResult;
77
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/resume/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,UAAU,CAAC;AAC/C,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,mCAAmC,CAAC;AAGxE;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B,uCAAuC;IACvC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,yCAAyC;IACzC,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;CACnB;AAED;;GAEG;AACH,MAAM,WAAW,UAAU;IACzB,aAAa,EAAE,MAAM,CAAC;IACtB,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;IACnB,cAAc,EAAE,MAAM,CAAC;CACxB;AAED;;GAEG;AACH,MAAM,WAAW,YAAY;IAC3B,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,UAAU,EAAE,CAAC;CACpB;AAED;;GAEG;AACH,MAAM,WAAW,YAAY;IAC3B,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,OAAO,CAAC;CACpB;AAED;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B,SAAS,EAAE,OAAO,CAAC;IACnB,WAAW,EAAE,MAAM,CAAC;IACpB,cAAc,EAAE,MAAM,CAAC;IACvB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,MAAM,CAAC,EAAE,YAAY,EAAE,CAAC;CACzB;AASD;;;;;;;;;;GAUG;AACH,wBAAsB,cAAc,CAClC,MAAM,EAAE,cAAc,EACtB,IAAI,EAAE,cAAc,EAAE,EACtB,OAAO,GAAE,aAAkB,GAC1B,OAAO,CAAC,YAAY,CAAC,CAsEvB;AAED;;;;;;;GAOG;AACH,wBAAgB,SAAS,CAAC,IAAI,EAAE,cAAc,EAAE,GAAG,eAAe,CAqBjE"}
@@ -0,0 +1,110 @@
1
+ /**
2
+ * Resume Module
3
+ *
4
+ * Functions for resuming failed workflow executions.
5
+ * Resume allows retrying failed jobs while preserving context.
6
+ */
7
+ import { findErrorLeaves } from '../traverse';
8
+ /**
9
+ * Generate a new job ID for resume
10
+ */
11
+ function generateJobId() {
12
+ return `job-resume-${Date.now()}-${Math.random().toString(36).substr(2, 9)}`;
13
+ }
14
+ /**
15
+ * Resume a workflow by retrying failed jobs
16
+ *
17
+ * Finds all error leaves in the log chain and re-invokes them.
18
+ * Only retries jobs marked as retryable.
19
+ *
20
+ * @param client - The Arke client
21
+ * @param logs - The log chain for the workflow
22
+ * @param options - Resume options
23
+ * @returns Resume result with count and job details
24
+ */
25
+ export async function resumeWorkflow(client, logs, options = {}) {
26
+ const { maxJobs, jobIds } = options;
27
+ // Find all error leaves
28
+ const errorLeaves = findErrorLeaves(logs);
29
+ // Filter by jobIds if provided
30
+ let candidates = errorLeaves;
31
+ if (jobIds && jobIds.length > 0) {
32
+ const jobIdSet = new Set(jobIds);
33
+ candidates = errorLeaves.filter((e) => jobIdSet.has(e.log.job_id));
34
+ }
35
+ const result = {
36
+ resumed: 0,
37
+ skipped: 0,
38
+ jobs: [],
39
+ };
40
+ for (const errorLeaf of candidates) {
41
+ // Check maxJobs limit
42
+ if (maxJobs !== undefined && result.resumed >= maxJobs) {
43
+ result.skipped++;
44
+ continue;
45
+ }
46
+ // Skip non-retryable errors
47
+ if (!errorLeaf.retryable) {
48
+ result.skipped++;
49
+ continue;
50
+ }
51
+ // Extract original request from the error log
52
+ const originalLog = errorLeaf.log;
53
+ const originalRequest = originalLog.received?.invocation?.request;
54
+ if (!originalRequest) {
55
+ // Cannot resume without original request
56
+ result.skipped++;
57
+ continue;
58
+ }
59
+ // Generate new job ID
60
+ const newJobId = generateJobId();
61
+ // Get target entity from original request or received
62
+ const targetEntityId = originalRequest.target ||
63
+ originalLog.received?.target ||
64
+ '';
65
+ // Re-invoke the klados
66
+ client.invokeKlados(originalLog.klados_id, {
67
+ jobId: newJobId,
68
+ targetEntityId,
69
+ originalRequest,
70
+ resumedFrom: originalLog.id,
71
+ });
72
+ result.resumed++;
73
+ result.jobs.push({
74
+ originalJobId: originalLog.job_id,
75
+ newJobId,
76
+ kladosId: originalLog.klados_id,
77
+ errorLogId: originalLog.id,
78
+ targetEntityId,
79
+ });
80
+ }
81
+ return result;
82
+ }
83
+ /**
84
+ * Check if a workflow can be resumed
85
+ *
86
+ * Analyzes the log chain to find retryable errors.
87
+ *
88
+ * @param logs - The log chain for the workflow
89
+ * @returns Information about resume possibility
90
+ */
91
+ export function canResume(logs) {
92
+ const errorLeaves = findErrorLeaves(logs);
93
+ const errors = errorLeaves.map((e) => ({
94
+ jobId: e.log.job_id,
95
+ kladosId: e.log.klados_id,
96
+ code: e.log.error?.code ?? 'UNKNOWN',
97
+ message: e.log.error?.message ?? 'Unknown error',
98
+ retryable: e.retryable,
99
+ }));
100
+ const retryableCount = errors.filter((e) => e.retryable).length;
101
+ const nonRetryableCount = errors.filter((e) => !e.retryable).length;
102
+ return {
103
+ canResume: retryableCount > 0,
104
+ totalErrors: errors.length,
105
+ retryableCount,
106
+ nonRetryableCount,
107
+ errors: errors.length > 0 ? errors : undefined,
108
+ };
109
+ }
110
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/resume/index.ts"],"names":[],"mappings":"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"}