@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.
- package/README.md +106 -0
- package/dist/__tests__/fixtures/index.d.ts +9 -0
- package/dist/__tests__/fixtures/index.d.ts.map +1 -0
- package/dist/__tests__/fixtures/index.js +12 -0
- package/dist/__tests__/fixtures/index.js.map +1 -0
- package/dist/__tests__/fixtures/kladoi/index.d.ts +165 -0
- package/dist/__tests__/fixtures/kladoi/index.d.ts.map +1 -0
- package/dist/__tests__/fixtures/kladoi/index.js +270 -0
- package/dist/__tests__/fixtures/kladoi/index.js.map +1 -0
- package/dist/__tests__/fixtures/logs/index.d.ts +19 -0
- package/dist/__tests__/fixtures/logs/index.d.ts.map +1 -0
- package/dist/__tests__/fixtures/logs/index.js +545 -0
- package/dist/__tests__/fixtures/logs/index.js.map +1 -0
- package/dist/__tests__/fixtures/mock-client.d.ts +127 -0
- package/dist/__tests__/fixtures/mock-client.d.ts.map +1 -0
- package/dist/__tests__/fixtures/mock-client.js +415 -0
- package/dist/__tests__/fixtures/mock-client.js.map +1 -0
- package/dist/__tests__/fixtures/rhizai/index.d.ts +54 -0
- package/dist/__tests__/fixtures/rhizai/index.d.ts.map +1 -0
- package/dist/__tests__/fixtures/rhizai/index.js +283 -0
- package/dist/__tests__/fixtures/rhizai/index.js.map +1 -0
- package/dist/__tests__/unit/fixtures.test.d.ts +10 -0
- package/dist/__tests__/unit/fixtures.test.d.ts.map +1 -0
- package/dist/__tests__/unit/fixtures.test.js +275 -0
- package/dist/__tests__/unit/fixtures.test.js.map +1 -0
- package/dist/__tests__/unit/handoff/gather.test.d.ts +8 -0
- package/dist/__tests__/unit/handoff/gather.test.d.ts.map +1 -0
- package/dist/__tests__/unit/handoff/gather.test.js +176 -0
- package/dist/__tests__/unit/handoff/gather.test.js.map +1 -0
- package/dist/__tests__/unit/handoff/interpret.test.d.ts +9 -0
- package/dist/__tests__/unit/handoff/interpret.test.d.ts.map +1 -0
- package/dist/__tests__/unit/handoff/interpret.test.js +370 -0
- package/dist/__tests__/unit/handoff/interpret.test.js.map +1 -0
- package/dist/__tests__/unit/handoff/route.test.d.ts +8 -0
- package/dist/__tests__/unit/handoff/route.test.d.ts.map +1 -0
- package/dist/__tests__/unit/handoff/route.test.js +271 -0
- package/dist/__tests__/unit/handoff/route.test.js.map +1 -0
- package/dist/__tests__/unit/handoff/scatter.test.d.ts +7 -0
- package/dist/__tests__/unit/handoff/scatter.test.d.ts.map +1 -0
- package/dist/__tests__/unit/handoff/scatter.test.js +54 -0
- package/dist/__tests__/unit/handoff/scatter.test.js.map +1 -0
- package/dist/__tests__/unit/resume.test.d.ts +8 -0
- package/dist/__tests__/unit/resume.test.d.ts.map +1 -0
- package/dist/__tests__/unit/resume.test.js +134 -0
- package/dist/__tests__/unit/resume.test.js.map +1 -0
- package/dist/__tests__/unit/status.test.d.ts +8 -0
- package/dist/__tests__/unit/status.test.d.ts.map +1 -0
- package/dist/__tests__/unit/status.test.js +164 -0
- package/dist/__tests__/unit/status.test.js.map +1 -0
- package/dist/__tests__/unit/target.test.d.ts +8 -0
- package/dist/__tests__/unit/target.test.d.ts.map +1 -0
- package/dist/__tests__/unit/target.test.js +116 -0
- package/dist/__tests__/unit/target.test.js.map +1 -0
- package/dist/__tests__/unit/traverse.test.d.ts +8 -0
- package/dist/__tests__/unit/traverse.test.d.ts.map +1 -0
- package/dist/__tests__/unit/traverse.test.js +143 -0
- package/dist/__tests__/unit/traverse.test.js.map +1 -0
- package/dist/__tests__/unit/validation/klados.test.d.ts +16 -0
- package/dist/__tests__/unit/validation/klados.test.d.ts.map +1 -0
- package/dist/__tests__/unit/validation/klados.test.js +275 -0
- package/dist/__tests__/unit/validation/klados.test.js.map +1 -0
- package/dist/__tests__/unit/validation/rhiza.test.d.ts +16 -0
- package/dist/__tests__/unit/validation/rhiza.test.d.ts.map +1 -0
- package/dist/__tests__/unit/validation/rhiza.test.js +612 -0
- package/dist/__tests__/unit/validation/rhiza.test.js.map +1 -0
- package/dist/__tests__/unit/validation/runtime.test.d.ts +11 -0
- package/dist/__tests__/unit/validation/runtime.test.d.ts.map +1 -0
- package/dist/__tests__/unit/validation/runtime.test.js +553 -0
- package/dist/__tests__/unit/validation/runtime.test.js.map +1 -0
- package/dist/__tests__/unit/worker/errors.test.d.ts +2 -0
- package/dist/__tests__/unit/worker/errors.test.d.ts.map +1 -0
- package/dist/__tests__/unit/worker/errors.test.js +226 -0
- package/dist/__tests__/unit/worker/errors.test.js.map +1 -0
- package/dist/__tests__/unit/worker/job.test.d.ts +2 -0
- package/dist/__tests__/unit/worker/job.test.d.ts.map +1 -0
- package/dist/__tests__/unit/worker/job.test.js +233 -0
- package/dist/__tests__/unit/worker/job.test.js.map +1 -0
- package/dist/client/index.d.ts +10 -0
- package/dist/client/index.d.ts.map +1 -0
- package/dist/client/index.js +8 -0
- package/dist/client/index.js.map +1 -0
- package/dist/client/interface.d.ts +142 -0
- package/dist/client/interface.d.ts.map +1 -0
- package/dist/client/interface.js +8 -0
- package/dist/client/interface.js.map +1 -0
- package/dist/client/mock.d.ts +95 -0
- package/dist/client/mock.d.ts.map +1 -0
- package/dist/client/mock.js +795 -0
- package/dist/client/mock.js.map +1 -0
- package/dist/client/types.d.ts +344 -0
- package/dist/client/types.d.ts.map +1 -0
- package/dist/client/types.js +8 -0
- package/dist/client/types.js.map +1 -0
- package/dist/handoff/gather-api.d.ts +60 -0
- package/dist/handoff/gather-api.d.ts.map +1 -0
- package/dist/handoff/gather-api.js +130 -0
- package/dist/handoff/gather-api.js.map +1 -0
- package/dist/handoff/gather.d.ts +59 -0
- package/dist/handoff/gather.d.ts.map +1 -0
- package/dist/handoff/gather.js +134 -0
- package/dist/handoff/gather.js.map +1 -0
- package/dist/handoff/index.d.ts +19 -0
- package/dist/handoff/index.d.ts.map +1 -0
- package/dist/handoff/index.js +25 -0
- package/dist/handoff/index.js.map +1 -0
- package/dist/handoff/interpret.d.ts +79 -0
- package/dist/handoff/interpret.d.ts.map +1 -0
- package/dist/handoff/interpret.js +197 -0
- package/dist/handoff/interpret.js.map +1 -0
- package/dist/handoff/invoke.d.ts +82 -0
- package/dist/handoff/invoke.d.ts.map +1 -0
- package/dist/handoff/invoke.js +196 -0
- package/dist/handoff/invoke.js.map +1 -0
- package/dist/handoff/route.d.ts +25 -0
- package/dist/handoff/route.d.ts.map +1 -0
- package/dist/handoff/route.js +65 -0
- package/dist/handoff/route.js.map +1 -0
- package/dist/handoff/scatter-api.d.ts +62 -0
- package/dist/handoff/scatter-api.d.ts.map +1 -0
- package/dist/handoff/scatter-api.js +81 -0
- package/dist/handoff/scatter-api.js.map +1 -0
- package/dist/handoff/scatter.d.ts +19 -0
- package/dist/handoff/scatter.d.ts.map +1 -0
- package/dist/handoff/scatter.js +27 -0
- package/dist/handoff/scatter.js.map +1 -0
- package/dist/handoff/target.d.ts +16 -0
- package/dist/handoff/target.d.ts.map +1 -0
- package/dist/handoff/target.js +51 -0
- package/dist/handoff/target.js.map +1 -0
- package/dist/index.d.ts +42 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +52 -0
- package/dist/index.js.map +1 -0
- package/dist/logging/index.d.ts +4 -0
- package/dist/logging/index.d.ts.map +1 -0
- package/dist/logging/index.js +3 -0
- package/dist/logging/index.js.map +1 -0
- package/dist/logging/logger.d.ts +52 -0
- package/dist/logging/logger.d.ts.map +1 -0
- package/dist/logging/logger.js +70 -0
- package/dist/logging/logger.js.map +1 -0
- package/dist/logging/writer.d.ts +63 -0
- package/dist/logging/writer.d.ts.map +1 -0
- package/dist/logging/writer.js +160 -0
- package/dist/logging/writer.js.map +1 -0
- package/dist/resume/index.d.ts +77 -0
- package/dist/resume/index.d.ts.map +1 -0
- package/dist/resume/index.js +110 -0
- package/dist/resume/index.js.map +1 -0
- package/dist/status/index.d.ts +54 -0
- package/dist/status/index.d.ts.map +1 -0
- package/dist/status/index.js +107 -0
- package/dist/status/index.js.map +1 -0
- package/dist/traverse/index.d.ts +53 -0
- package/dist/traverse/index.d.ts.map +1 -0
- package/dist/traverse/index.js +142 -0
- package/dist/traverse/index.js.map +1 -0
- package/dist/types/batch.d.ts +53 -0
- package/dist/types/batch.d.ts.map +1 -0
- package/dist/types/batch.js +2 -0
- package/dist/types/batch.js.map +1 -0
- package/dist/types/index.d.ts +10 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +2 -0
- package/dist/types/index.js.map +1 -0
- package/dist/types/klados.d.ts +63 -0
- package/dist/types/klados.d.ts.map +1 -0
- package/dist/types/klados.js +2 -0
- package/dist/types/klados.js.map +1 -0
- package/dist/types/log.d.ts +107 -0
- package/dist/types/log.d.ts.map +1 -0
- package/dist/types/log.js +2 -0
- package/dist/types/log.js.map +1 -0
- package/dist/types/refs.d.ts +58 -0
- package/dist/types/refs.d.ts.map +1 -0
- package/dist/types/refs.js +43 -0
- package/dist/types/refs.js.map +1 -0
- package/dist/types/request.d.ts +69 -0
- package/dist/types/request.d.ts.map +1 -0
- package/dist/types/request.js +2 -0
- package/dist/types/request.js.map +1 -0
- package/dist/types/response.d.ts +31 -0
- package/dist/types/response.d.ts.map +1 -0
- package/dist/types/response.js +2 -0
- package/dist/types/response.js.map +1 -0
- package/dist/types/rhiza.d.ts +100 -0
- package/dist/types/rhiza.d.ts.map +1 -0
- package/dist/types/rhiza.js +2 -0
- package/dist/types/rhiza.js.map +1 -0
- package/dist/types/status.d.ts +84 -0
- package/dist/types/status.d.ts.map +1 -0
- package/dist/types/status.js +2 -0
- package/dist/types/status.js.map +1 -0
- package/dist/utils/id.d.ts +15 -0
- package/dist/utils/id.d.ts.map +1 -0
- package/dist/utils/id.js +25 -0
- package/dist/utils/id.js.map +1 -0
- package/dist/utils/index.d.ts +2 -0
- package/dist/utils/index.d.ts.map +1 -0
- package/dist/utils/index.js +2 -0
- package/dist/utils/index.js.map +1 -0
- package/dist/validation/index.d.ts +9 -0
- package/dist/validation/index.d.ts.map +1 -0
- package/dist/validation/index.js +9 -0
- package/dist/validation/index.js.map +1 -0
- package/dist/validation/validate-klados.d.ts +38 -0
- package/dist/validation/validate-klados.d.ts.map +1 -0
- package/dist/validation/validate-klados.js +139 -0
- package/dist/validation/validate-klados.js.map +1 -0
- package/dist/validation/validate-rhiza.d.ts +29 -0
- package/dist/validation/validate-rhiza.d.ts.map +1 -0
- package/dist/validation/validate-rhiza.js +382 -0
- package/dist/validation/validate-rhiza.js.map +1 -0
- package/dist/validation/validate-runtime.d.ts +28 -0
- package/dist/validation/validate-runtime.d.ts.map +1 -0
- package/dist/validation/validate-runtime.js +212 -0
- package/dist/validation/validate-runtime.js.map +1 -0
- package/dist/worker/errors.d.ts +77 -0
- package/dist/worker/errors.d.ts.map +1 -0
- package/dist/worker/errors.js +143 -0
- package/dist/worker/errors.js.map +1 -0
- package/dist/worker/index.d.ts +8 -0
- package/dist/worker/index.d.ts.map +1 -0
- package/dist/worker/index.js +8 -0
- package/dist/worker/index.js.map +1 -0
- package/dist/worker/job.d.ts +150 -0
- package/dist/worker/job.d.ts.map +1 -0
- package/dist/worker/job.js +280 -0
- package/dist/worker/job.js.map +1 -0
- 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 @@
|
|
|
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 @@
|
|
|
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":"AAAA;;;;;GAKG;AAGH,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAwCnD;;;;;;GAMG;AACH,MAAM,CAAC,KAAK,UAAU,cAAc,CAClC,OAAwB;IAExB,MAAM,EACJ,MAAM,EACN,eAAe,EACf,KAAK,EACL,QAAQ,EACR,OAAO,EACP,YAAY,GACb,GAAG,OAAO,CAAC;IAEZ,8BAA8B;IAC9B,MAAM,MAAM,GAAW;QACrB,KAAK;QACL,QAAQ,EAAE,OAAO;QACjB,aAAa,EAAE,YAAY;QAC3B,QAAQ;KACT,CAAC;IAEF,iCAAiC;IACjC,MAAM,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,WAAW,EAAE,GAAG,MAAM,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,WAAW,EAAE;QACjF,IAAI,EAAE;YACJ,IAAI,EAAE,YAAY;YAClB,UAAU,EAAE,eAAe;YAC3B,UAAU,EAAE;gBACV,QAAQ,EAAE,KAAK,CAAC,QAAQ;gBACxB,SAAS,EAAE,KAAK,CAAC,SAAS;gBAC1B,MAAM,EAAE,KAAK,CAAC,MAAM;gBACpB,MAAM,EAAE,KAAK,CAAC,MAAM;gBACpB,QAAQ,EAAE,MAA4C;aACvD;SACF;KACF,CAAC,CAAC;IAEH,IAAI,WAAW,IAAI,CAAC,SAAS,EAAE,CAAC;QAC9B,MAAM,IAAI,KAAK,CAAC,gCAAgC,WAAW,EAAE,KAAK,IAAI,eAAe,EAAE,CAAC,CAAC;IAC3F,CAAC;IAED,MAAM,WAAW,GAAG,SAAS,CAAC,EAAE,CAAC;IAEjC,2DAA2D;IAC3D,MAAM,aAAa,GAId,EAAE,CAAC;IAER,sDAAsD;IACtD,2DAA2D;IAC3D,IAAI,KAAK,CAAC,QAAQ,CAAC,SAAS,IAAI,KAAK,CAAC,QAAQ,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACpE,KAAK,MAAM,WAAW,IAAI,KAAK,CAAC,QAAQ,CAAC,SAAS,EAAE,CAAC;YACnD,aAAa,CAAC,IAAI,CAAC;gBACjB,SAAS,EAAE,eAAe;gBAC1B,IAAI,EAAE,WAAW;gBACjB,SAAS,EAAE,UAAU;aACtB,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IAED,+DAA+D;IAC/D,IAAI,aAAa,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC7B,MAAM,YAAY,CAChB;YACE,MAAM,EAAE,KAAK,IAAI,EAAE;gBACjB,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,MAAM,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,oBAAoB,EAAE;oBACjE,MAAM,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE,EAAE,WAAW,EAAE,EAAE;iBACtC,CAAC,CAAC;gBACH,IAAI,KAAK,IAAI,CAAC,IAAI;oBAAE,MAAM,IAAI,KAAK,CAAC,8BAA8B,CAAC,CAAC;gBACpE,OAAO,IAAI,CAAC,GAAG,CAAC;YAClB,CAAC;YACD,MAAM,EAAE,KAAK,EAAE,GAAW,EAAE,EAAE;gBAC5B,OAAO,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,gBAAgB,EAAE;oBACtC,MAAM,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE,EAAE,WAAW,EAAE,EAAE;oBACrC,IAAI,EAAE;wBACJ,UAAU,EAAE,GAAG;wBACf,iBAAiB,EAAE,aAAa;qBACjC;iBACF,CAAC,CAAC;YACL,CAAC;SACF,EACD,EAAE,WAAW,EAAE,GAAG,EAAE,CACrB,CAAC;IACJ,CAAC;IAED,OAAO,EAAE,KAAK,EAAE,KAAK,CAAC,EAAE,EAAE,MAAM,EAAE,WAAW,EAAE,CAAC;AAClD,CAAC;AAED;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,qBAAqB,CACzC,MAAkB,EAClB,SAAiB,EACjB,QAAyB;IAEzB,MAAM,YAAY,CAChB;QACE,MAAM,EAAE,KAAK,IAAI,EAAE;YACjB,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,MAAM,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,oBAAoB,EAAE;gBACjE,MAAM,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE,EAAE,SAAS,EAAE,EAAE;aACpC,CAAC,CAAC;YACH,IAAI,KAAK,IAAI,CAAC,IAAI;gBAAE,MAAM,IAAI,KAAK,CAAC,uBAAuB,CAAC,CAAC;YAC7D,OAAO,IAAI,CAAC,GAAG,CAAC;QAClB,CAAC;QACD,MAAM,EAAE,KAAK,EAAE,GAAW,EAAE,EAAE;YAC5B,iDAAiD;YACjD,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,QAAQ,EAAE,GAAG,MAAM,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,gBAAgB,EAAE;gBAC/E,MAAM,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE,EAAE,SAAS,EAAE,EAAE;aACpC,CAAC,CAAC;YAEH,IAAI,QAAQ,IAAI,CAAC,MAAM,EAAE,CAAC;gBACxB,MAAM,IAAI,KAAK,CAAC,0BAA0B,CAAC,CAAC;YAC9C,CAAC;YAED,MAAM,OAAO,GAAG,MAAM,CAAC,UAAU,CAAC,QAAkB,CAAC;YACrD,OAAO,CAAC,KAAK,CAAC,QAAQ,GAAG,QAAQ,CAAC;YAElC,OAAO,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,gBAAgB,EAAE;gBACtC,MAAM,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE,EAAE,SAAS,EAAE,EAAE;gBACnC,IAAI,EAAE;oBACJ,UAAU,EAAE,GAAG;oBACf,UAAU,EAAE;wBACV,GAAG,MAAM,CAAC,UAAU;wBACpB,QAAQ,EAAE,OAA6C;qBACxD;iBACF;aACF,CAAC,CAAC;QACL,CAAC;KACF,EACD,EAAE,WAAW,EAAE,EAAE,EAAE,CACpB,CAAC;AACJ,CAAC;AAWD;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,eAAe,CACnC,MAAkB,EAClB,SAAiB,EACjB,MAAoC,EACpC,QAAmB;IAEnB,MAAM,YAAY,CAChB;QACE,MAAM,EAAE,KAAK,IAAI,EAAE;YACjB,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,MAAM,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,oBAAoB,EAAE;gBACjE,MAAM,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE,EAAE,SAAS,EAAE,EAAE;aACpC,CAAC,CAAC;YACH,IAAI,KAAK,IAAI,CAAC,IAAI;gBAAE,MAAM,IAAI,KAAK,CAAC,uBAAuB,CAAC,CAAC;YAC7D,OAAO,IAAI,CAAC,GAAG,CAAC;QAClB,CAAC;QACD,MAAM,EAAE,KAAK,EAAE,GAAW,EAAE,EAAE;YAC5B,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,QAAQ,EAAE,GAAG,MAAM,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,gBAAgB,EAAE;gBAC/E,MAAM,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE,EAAE,SAAS,EAAE,EAAE;aACpC,CAAC,CAAC;YAEH,IAAI,QAAQ,IAAI,CAAC,MAAM,EAAE,CAAC;gBACxB,MAAM,IAAI,KAAK,CAAC,0BAA0B,CAAC,CAAC;YAC9C,CAAC;YAED,MAAM,OAAO,GAAG,MAAM,CAAC,UAAU,CAAC,QAAkB,CAAC;YACrD,OAAO,CAAC,KAAK,CAAC,MAAM,GAAG,MAAM,CAAC;YAC9B,OAAO,CAAC,KAAK,CAAC,YAAY,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;YAEtD,IAAI,QAAQ,EAAE,CAAC;gBACb,OAAO,CAAC,KAAK,CAAC,KAAK,GAAG,QAAQ,CAAC;YACjC,CAAC;YAED,OAAO,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,gBAAgB,EAAE;gBACtC,MAAM,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE,EAAE,SAAS,EAAE,EAAE;gBACnC,IAAI,EAAE;oBACJ,UAAU,EAAE,GAAG;oBACf,UAAU,EAAE;wBACV,GAAG,MAAM,CAAC,UAAU;wBACpB,MAAM,EAAE,0CAA0C;wBAClD,QAAQ,EAAE,OAA6C;qBACxD;iBACF;aACF,CAAC,CAAC;QACL,CAAC;KACF,EACD,EAAE,WAAW,EAAE,EAAE,EAAE,CACpB,CAAC;AACJ,CAAC"}
|
|
@@ -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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"}
|