@ddse/acm-runtime 0.5.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 (55) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +393 -0
  3. package/dist/src/checkpoint.d.ts +97 -0
  4. package/dist/src/checkpoint.d.ts.map +1 -0
  5. package/dist/src/checkpoint.js +200 -0
  6. package/dist/src/checkpoint.js.map +1 -0
  7. package/dist/src/execution-transcript.d.ts +30 -0
  8. package/dist/src/execution-transcript.d.ts.map +1 -0
  9. package/dist/src/execution-transcript.js +70 -0
  10. package/dist/src/execution-transcript.js.map +1 -0
  11. package/dist/src/executor.d.ts +49 -0
  12. package/dist/src/executor.d.ts.map +1 -0
  13. package/dist/src/executor.js +390 -0
  14. package/dist/src/executor.js.map +1 -0
  15. package/dist/src/guards.d.ts +7 -0
  16. package/dist/src/guards.d.ts.map +1 -0
  17. package/dist/src/guards.js +13 -0
  18. package/dist/src/guards.js.map +1 -0
  19. package/dist/src/index.d.ts +9 -0
  20. package/dist/src/index.d.ts.map +1 -0
  21. package/dist/src/index.js +10 -0
  22. package/dist/src/index.js.map +1 -0
  23. package/dist/src/ledger.d.ts +12 -0
  24. package/dist/src/ledger.d.ts.map +1 -0
  25. package/dist/src/ledger.js +53 -0
  26. package/dist/src/ledger.js.map +1 -0
  27. package/dist/src/resumable-executor.d.ts +39 -0
  28. package/dist/src/resumable-executor.d.ts.map +1 -0
  29. package/dist/src/resumable-executor.js +354 -0
  30. package/dist/src/resumable-executor.js.map +1 -0
  31. package/dist/src/retry.d.ts +7 -0
  32. package/dist/src/retry.d.ts.map +1 -0
  33. package/dist/src/retry.js +25 -0
  34. package/dist/src/retry.js.map +1 -0
  35. package/dist/src/tool-envelope.d.ts +14 -0
  36. package/dist/src/tool-envelope.d.ts.map +1 -0
  37. package/dist/src/tool-envelope.js +84 -0
  38. package/dist/src/tool-envelope.js.map +1 -0
  39. package/dist/tests/resumable.test.d.ts +2 -0
  40. package/dist/tests/resumable.test.d.ts.map +1 -0
  41. package/dist/tests/resumable.test.js +337 -0
  42. package/dist/tests/resumable.test.js.map +1 -0
  43. package/dist/tsconfig.tsbuildinfo +1 -0
  44. package/package.json +29 -0
  45. package/src/checkpoint.ts +311 -0
  46. package/src/execution-transcript.ts +108 -0
  47. package/src/executor.ts +540 -0
  48. package/src/guards.ts +21 -0
  49. package/src/index.ts +9 -0
  50. package/src/ledger.ts +63 -0
  51. package/src/resumable-executor.ts +471 -0
  52. package/src/retry.ts +37 -0
  53. package/src/tool-envelope.ts +113 -0
  54. package/tests/resumable.test.ts +421 -0
  55. package/tsconfig.json +11 -0
@@ -0,0 +1,354 @@
1
+ // Resumable executor with checkpoint and resume support
2
+ import { InternalContextScopeImpl, } from '@ddse/acm-sdk';
3
+ import { evaluateGuard } from './guards.js';
4
+ import { MemoryLedger } from './ledger.js';
5
+ import { withRetry } from './retry.js';
6
+ import { createCheckpoint, validateCheckpoint, MemoryCheckpointStore, } from './checkpoint.js';
7
+ import { buildTaskNarrative, synthesizeGoalSummary } from './executor.js';
8
+ import { createInstrumentedToolGetter } from './tool-envelope.js';
9
+ /**
10
+ * Execute a plan with checkpoint and resume support
11
+ */
12
+ export async function executeResumablePlan(options) {
13
+ const { goal, context, plan, capabilityRegistry, toolRegistry, policy, verify, stream, nucleusFactory, nucleusConfig, contextProvider, resumeFrom, checkpointInterval = 1, checkpointStore = new MemoryCheckpointStore(), runId = `run-${Date.now()}`, } = options;
14
+ const ledger = options.ledger ?? new MemoryLedger();
15
+ let outputs = {};
16
+ let executionRecords = {};
17
+ const policyContext = {};
18
+ const metrics = { costUsd: 0, elapsedSec: 0 };
19
+ let startTime = Date.now();
20
+ let executed = new Set();
21
+ let tasksExecutedSinceCheckpoint = 0;
22
+ // Restore from checkpoint if resuming
23
+ if (resumeFrom) {
24
+ console.log(`Resuming from checkpoint: ${resumeFrom}`);
25
+ const checkpoint = await checkpointStore.get(runId, resumeFrom);
26
+ if (!checkpoint) {
27
+ throw new Error(`Checkpoint not found: ${resumeFrom}`);
28
+ }
29
+ if (!validateCheckpoint(checkpoint)) {
30
+ throw new Error(`Invalid checkpoint: ${resumeFrom}`);
31
+ }
32
+ // Restore state
33
+ outputs = checkpoint.state.outputs;
34
+ executionRecords = checkpoint.state.executionRecords ?? {};
35
+ executed = new Set(checkpoint.state.executed);
36
+ metrics.costUsd = checkpoint.state.metrics.costUsd;
37
+ metrics.elapsedSec = checkpoint.state.metrics.elapsedSec;
38
+ // Restore ledger
39
+ for (const entry of checkpoint.state.ledger) {
40
+ ledger.append(entry.type, entry.details);
41
+ }
42
+ console.log(`Restored ${executed.size} completed tasks`);
43
+ startTime = Date.now() - metrics.elapsedSec * 1000;
44
+ }
45
+ else {
46
+ // Log plan selection for new execution
47
+ ledger.append('PLAN_SELECTED', {
48
+ planId: plan.id,
49
+ contextRef: plan.contextRef,
50
+ capabilityMapVersion: plan.capabilityMapVersion,
51
+ });
52
+ }
53
+ // Helper to create checkpoint
54
+ const saveCheckpoint = async () => {
55
+ const state = {
56
+ goal,
57
+ context,
58
+ plan,
59
+ outputs,
60
+ executionRecords,
61
+ executed: Array.from(executed),
62
+ ledger: ledger.getEntries(),
63
+ metrics: { ...metrics },
64
+ };
65
+ const checkpoint = createCheckpoint(runId, state);
66
+ await checkpointStore.put(runId, checkpoint);
67
+ if (stream) {
68
+ stream.emit('checkpoint', {
69
+ checkpointId: checkpoint.id,
70
+ tasksCompleted: executed.size,
71
+ });
72
+ }
73
+ return checkpoint;
74
+ };
75
+ // Build execution order based on edges
76
+ const pending = plan.tasks.filter(t => !executed.has(t.id));
77
+ while (pending.length > 0) {
78
+ const readyTasks = pending.filter(taskSpec => {
79
+ // Skip already executed tasks
80
+ if (executed.has(taskSpec.id)) {
81
+ return false;
82
+ }
83
+ // Check if all dependencies are satisfied
84
+ const incomingEdges = plan.edges.filter(e => e.to === taskSpec.id);
85
+ if (incomingEdges.length === 0) {
86
+ return true; // No dependencies
87
+ }
88
+ return incomingEdges.every(edge => {
89
+ if (!executed.has(edge.from)) {
90
+ return false;
91
+ }
92
+ // Evaluate guard if present
93
+ if (edge.guard) {
94
+ const guardResult = evaluateGuard(edge.guard, {
95
+ context,
96
+ outputs,
97
+ policy: policyContext,
98
+ });
99
+ ledger.append('GUARD_EVAL', {
100
+ edge: `${edge.from}->${edge.to}`,
101
+ guard: edge.guard,
102
+ result: guardResult,
103
+ });
104
+ return guardResult;
105
+ }
106
+ return true;
107
+ });
108
+ });
109
+ if (readyTasks.length === 0) {
110
+ break; // No more tasks can be executed
111
+ }
112
+ // Execute ready tasks
113
+ for (const taskSpec of readyTasks) {
114
+ pending.splice(pending.indexOf(taskSpec), 1);
115
+ const capabilityName = taskSpec.capabilityRef || taskSpec.capability;
116
+ if (!capabilityName) {
117
+ throw new Error(`Task ${taskSpec.id} missing capability reference`);
118
+ }
119
+ const task = capabilityRegistry.resolve(capabilityName);
120
+ if (!task) {
121
+ throw new Error(`Task not found for capability: ${capabilityName}`);
122
+ }
123
+ const nucleusAllowedTools = new Set(nucleusConfig.allowedTools ?? []);
124
+ for (const tool of taskSpec.tools ?? []) {
125
+ nucleusAllowedTools.add(tool.name);
126
+ }
127
+ const nucleus = nucleusFactory({
128
+ goalId: goal.id,
129
+ goalIntent: goal.intent,
130
+ planId: plan.id,
131
+ taskId: taskSpec.id,
132
+ contextRef: plan.contextRef,
133
+ context,
134
+ llmCall: nucleusConfig.llmCall,
135
+ hooks: nucleusConfig.hooks,
136
+ allowedTools: Array.from(nucleusAllowedTools),
137
+ });
138
+ const internalScope = new InternalContextScopeImpl(entry => {
139
+ ledger.append(entry.type, entry.details);
140
+ });
141
+ nucleus.setInternalContext(internalScope);
142
+ const getTool = createInstrumentedToolGetter({
143
+ taskId: taskSpec.id,
144
+ capability: capabilityName,
145
+ toolRegistry,
146
+ ledger,
147
+ });
148
+ // Build run context
149
+ const runContext = {
150
+ goal,
151
+ context,
152
+ outputs,
153
+ metrics,
154
+ getTool,
155
+ getCapabilityRegistry: () => capabilityRegistry,
156
+ stream,
157
+ nucleus,
158
+ internalContext: internalScope,
159
+ };
160
+ let preflight = await nucleus.preflight();
161
+ if (preflight.status === 'NEEDS_CONTEXT') {
162
+ const requestedDirectives = preflight.retrievalDirectives;
163
+ ledger.append('CONTEXT_INTERNALIZED', {
164
+ taskId: taskSpec.id,
165
+ directives: requestedDirectives,
166
+ status: contextProvider ? 'requested' : 'unhandled',
167
+ });
168
+ if (!contextProvider) {
169
+ throw new Error(`Task ${taskSpec.id} requires additional context retrieval: ${requestedDirectives.join(', ')}`);
170
+ }
171
+ await contextProvider.fulfill({
172
+ directives: requestedDirectives,
173
+ scope: internalScope,
174
+ runContext,
175
+ nucleus,
176
+ });
177
+ preflight = await nucleus.preflight();
178
+ if (preflight.status === 'NEEDS_CONTEXT') {
179
+ throw new Error(`Task ${taskSpec.id} still requires additional context after adapter execution: ${preflight.retrievalDirectives.join(', ')}`);
180
+ }
181
+ ledger.append('CONTEXT_INTERNALIZED', {
182
+ taskId: taskSpec.id,
183
+ directives: requestedDirectives,
184
+ status: 'resolved',
185
+ });
186
+ }
187
+ // Policy pre-check
188
+ if (policy) {
189
+ const policyInput = task.policyInput?.(runContext, taskSpec.input) ?? {};
190
+ const decision = await policy.evaluate('task.pre', {
191
+ taskId: taskSpec.id,
192
+ capability: taskSpec.capability,
193
+ ...policyInput,
194
+ });
195
+ ledger.append('POLICY_PRE', {
196
+ taskId: taskSpec.id,
197
+ decision,
198
+ });
199
+ if (!decision.allow) {
200
+ throw new Error(`Policy denied task ${taskSpec.id}: ${decision.reason}`);
201
+ }
202
+ policyContext[taskSpec.id] = decision;
203
+ }
204
+ // Execute task with retry
205
+ const ledgerBaseline = ledger.getEntries().length;
206
+ ledger.append('TASK_START', {
207
+ taskId: taskSpec.id,
208
+ capability: capabilityName,
209
+ input: taskSpec.input,
210
+ });
211
+ stream?.emit('task', { taskId: taskSpec.id, status: 'running' });
212
+ try {
213
+ const executeTask = async () => task.execute(runContext, taskSpec.input);
214
+ const retryConfig = taskSpec.retry || (taskSpec.retryPolicy
215
+ ? {
216
+ attempts: taskSpec.retryPolicy.maxAttempts || 3,
217
+ backoff: 'exp',
218
+ }
219
+ : undefined);
220
+ const output = retryConfig
221
+ ? await withRetry(executeTask, retryConfig)
222
+ : await executeTask();
223
+ outputs[taskSpec.id] = output;
224
+ // Policy post-check
225
+ if (policy) {
226
+ const decision = await policy.evaluate('task.post', {
227
+ taskId: taskSpec.id,
228
+ output,
229
+ });
230
+ ledger.append('POLICY_POST', {
231
+ taskId: taskSpec.id,
232
+ decision,
233
+ });
234
+ }
235
+ // Verification
236
+ if (verify && taskSpec.verification && taskSpec.verification.length > 0) {
237
+ const verified = await verify(taskSpec.id, output, taskSpec.verification);
238
+ ledger.append('VERIFICATION', {
239
+ taskId: taskSpec.id,
240
+ expressions: taskSpec.verification,
241
+ result: verified,
242
+ });
243
+ if (!verified) {
244
+ throw new Error(`Verification failed for task ${taskSpec.id}`);
245
+ }
246
+ }
247
+ const postcheck = await nucleus.postcheck(output);
248
+ if (postcheck.status === 'NEEDS_COMPENSATION') {
249
+ ledger.append('ERROR', {
250
+ taskId: taskSpec.id,
251
+ stage: 'NUCLEUS_POSTCHECK',
252
+ message: postcheck.reason,
253
+ });
254
+ throw new Error(`Task ${taskSpec.id} requires compensation: ${postcheck.reason}`);
255
+ }
256
+ if (postcheck.status === 'ESCALATE') {
257
+ ledger.append('ERROR', {
258
+ taskId: taskSpec.id,
259
+ stage: 'NUCLEUS_POSTCHECK',
260
+ message: postcheck.reason,
261
+ });
262
+ throw new Error(`Task ${taskSpec.id} escalated: ${postcheck.reason}`);
263
+ }
264
+ const narrative = buildTaskNarrative(ledger, ledgerBaseline, taskSpec.id, postcheck);
265
+ executionRecords[taskSpec.id] = {
266
+ output,
267
+ narrative,
268
+ };
269
+ ledger.append('TASK_END', {
270
+ taskId: taskSpec.id,
271
+ output,
272
+ narrative,
273
+ });
274
+ stream?.emit('task', { taskId: taskSpec.id, status: 'completed', output, narrative });
275
+ executed.add(taskSpec.id);
276
+ tasksExecutedSinceCheckpoint++;
277
+ // Create checkpoint if interval reached
278
+ if (tasksExecutedSinceCheckpoint >= checkpointInterval) {
279
+ await saveCheckpoint();
280
+ tasksExecutedSinceCheckpoint = 0;
281
+ }
282
+ }
283
+ catch (err) {
284
+ const error = err;
285
+ ledger.append('ERROR', {
286
+ taskId: taskSpec.id,
287
+ error: error.message,
288
+ stack: error.stack,
289
+ });
290
+ stream?.emit('task', { taskId: taskSpec.id, status: 'failed', error: error.message });
291
+ // Save checkpoint before throwing to allow resume
292
+ await saveCheckpoint();
293
+ throw error;
294
+ }
295
+ }
296
+ }
297
+ // Final checkpoint
298
+ if (tasksExecutedSinceCheckpoint > 0) {
299
+ await saveCheckpoint();
300
+ }
301
+ const goalSummary = await synthesizeGoalSummary({
302
+ goal,
303
+ plan,
304
+ executionRecords,
305
+ context,
306
+ nucleusFactory,
307
+ nucleusConfig,
308
+ ledger,
309
+ stream,
310
+ });
311
+ metrics.elapsedSec = (Date.now() - startTime) / 1000;
312
+ return {
313
+ outputsByTask: executionRecords,
314
+ ledger: ledger.getEntries(),
315
+ goalSummary,
316
+ };
317
+ }
318
+ /**
319
+ * ResumableExecutor class for managing resumable executions
320
+ */
321
+ export class ResumableExecutor {
322
+ checkpointStore;
323
+ constructor(checkpointStore = new MemoryCheckpointStore()) {
324
+ this.checkpointStore = checkpointStore;
325
+ }
326
+ /**
327
+ * Execute a plan with checkpointing enabled
328
+ */
329
+ async execute(options) {
330
+ return executeResumablePlan({
331
+ ...options,
332
+ checkpointStore: options.checkpointStore ?? this.checkpointStore,
333
+ });
334
+ }
335
+ /**
336
+ * List available checkpoints for a run
337
+ */
338
+ async listCheckpoints(runId) {
339
+ return this.checkpointStore.list(runId);
340
+ }
341
+ /**
342
+ * Get a specific checkpoint
343
+ */
344
+ async getCheckpoint(runId, checkpointId) {
345
+ return this.checkpointStore.get(runId, checkpointId);
346
+ }
347
+ /**
348
+ * Prune old checkpoints
349
+ */
350
+ async pruneCheckpoints(runId, keepLast = 5) {
351
+ return this.checkpointStore.prune(runId, keepLast);
352
+ }
353
+ }
354
+ //# sourceMappingURL=resumable-executor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resumable-executor.js","sourceRoot":"","sources":["../../src/resumable-executor.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ export declare function withRetry<T>(fn: () => Promise<T>, config: {
2
+ attempts: number;
3
+ backoff: 'fixed' | 'exp';
4
+ baseMs?: number;
5
+ jitter?: boolean;
6
+ }): Promise<T>;
7
+ //# sourceMappingURL=retry.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"retry.d.ts","sourceRoot":"","sources":["../../src/retry.ts"],"names":[],"mappings":"AACA,wBAAsB,SAAS,CAAC,CAAC,EAC/B,EAAE,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,EACpB,MAAM,EAAE;IACN,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,OAAO,GAAG,KAAK,CAAC;IACzB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB,GACA,OAAO,CAAC,CAAC,CAAC,CA2BZ"}
@@ -0,0 +1,25 @@
1
+ // Retry logic with backoff
2
+ export async function withRetry(fn, config) {
3
+ const baseMs = config.baseMs ?? 1000;
4
+ let lastError;
5
+ for (let attempt = 0; attempt < config.attempts; attempt++) {
6
+ try {
7
+ return await fn();
8
+ }
9
+ catch (err) {
10
+ lastError = err;
11
+ if (attempt < config.attempts - 1) {
12
+ let delayMs = baseMs;
13
+ if (config.backoff === 'exp') {
14
+ delayMs = baseMs * Math.pow(2, attempt);
15
+ }
16
+ if (config.jitter) {
17
+ delayMs = delayMs * (0.5 + Math.random() * 0.5);
18
+ }
19
+ await new Promise(resolve => setTimeout(resolve, delayMs));
20
+ }
21
+ }
22
+ }
23
+ throw lastError;
24
+ }
25
+ //# sourceMappingURL=retry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"retry.js","sourceRoot":"","sources":["../../src/retry.ts"],"names":[],"mappings":"AAAA,2BAA2B;AAC3B,MAAM,CAAC,KAAK,UAAU,SAAS,CAC7B,EAAoB,EACpB,MAKC;IAED,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,IAAI,IAAI,CAAC;IACrC,IAAI,SAA4B,CAAC;IAEjC,KAAK,IAAI,OAAO,GAAG,CAAC,EAAE,OAAO,GAAG,MAAM,CAAC,QAAQ,EAAE,OAAO,EAAE,EAAE,CAAC;QAC3D,IAAI,CAAC;YACH,OAAO,MAAM,EAAE,EAAE,CAAC;QACpB,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,SAAS,GAAG,GAAY,CAAC;YAEzB,IAAI,OAAO,GAAG,MAAM,CAAC,QAAQ,GAAG,CAAC,EAAE,CAAC;gBAClC,IAAI,OAAO,GAAG,MAAM,CAAC;gBAErB,IAAI,MAAM,CAAC,OAAO,KAAK,KAAK,EAAE,CAAC;oBAC7B,OAAO,GAAG,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;gBAC1C,CAAC;gBAED,IAAI,MAAM,CAAC,MAAM,EAAE,CAAC;oBAClB,OAAO,GAAG,OAAO,GAAG,CAAC,GAAG,GAAG,IAAI,CAAC,MAAM,EAAE,GAAG,GAAG,CAAC,CAAC;gBAClD,CAAC;gBAED,MAAM,IAAI,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC;YAC7D,CAAC;QACH,CAAC;IACH,CAAC;IAED,MAAM,SAAS,CAAC;AAClB,CAAC"}
@@ -0,0 +1,14 @@
1
+ import type { Tool, ToolRegistry } from '@ddse/acm-sdk';
2
+ import type { MemoryLedger } from './ledger.js';
3
+ type ToolGetterOptions = {
4
+ taskId: string;
5
+ capability: string;
6
+ toolRegistry: ToolRegistry;
7
+ ledger?: MemoryLedger;
8
+ };
9
+ type InstrumentedTool = Tool<any, any> & {
10
+ call(input: any, idemKey?: string): Promise<any>;
11
+ };
12
+ export declare function createInstrumentedToolGetter(options: ToolGetterOptions): (toolName: string) => InstrumentedTool | undefined;
13
+ export {};
14
+ //# sourceMappingURL=tool-envelope.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tool-envelope.d.ts","sourceRoot":"","sources":["../../src/tool-envelope.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,IAAI,EAAoB,YAAY,EAAE,MAAM,eAAe,CAAC;AAC1E,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAEhD,KAAK,iBAAiB,GAAG;IACvB,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,EAAE,YAAY,CAAC;IAC3B,MAAM,CAAC,EAAE,YAAY,CAAC;CACvB,CAAC;AAEF,KAAK,gBAAgB,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,CAAC,GAAG;IACvC,IAAI,CAAC,KAAK,EAAE,GAAG,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC;CAClD,CAAC;AAoFF,wBAAgB,4BAA4B,CAAC,OAAO,EAAE,iBAAiB,IAG7D,UAAU,MAAM,kCAYzB"}
@@ -0,0 +1,84 @@
1
+ import { createHash } from 'crypto';
2
+ function computeDigest(payload) {
3
+ const normalized = typeof payload === 'string' ? payload : JSON.stringify(payload ?? {});
4
+ const hash = createHash('sha256');
5
+ hash.update(normalized);
6
+ return hash.digest('hex').substring(0, 32);
7
+ }
8
+ function cloneWithInstrumentedCall(toolName, tool, options) {
9
+ const instrumented = Object.create(tool);
10
+ instrumented.call = async (input, idemKey) => {
11
+ const start = Date.now();
12
+ const envelopeBase = {
13
+ id: idemKey ?? `${options.taskId}-${toolName}-${Date.now()}-${Math.random().toString(36).slice(2, 10)}`,
14
+ name: toolName,
15
+ input: input ?? {},
16
+ metadata: {
17
+ timestamp: start,
18
+ digest: computeDigest(input ?? {}),
19
+ },
20
+ };
21
+ options.ledger?.append('TOOL_CALL', {
22
+ stage: 'start',
23
+ taskId: options.taskId,
24
+ capability: options.capability,
25
+ tool: toolName,
26
+ envelope: envelopeBase,
27
+ });
28
+ try {
29
+ const result = await tool.call.call(tool, input, idemKey);
30
+ const completed = {
31
+ ...envelopeBase,
32
+ output: result,
33
+ metadata: {
34
+ ...envelopeBase.metadata,
35
+ duration_ms: Date.now() - start,
36
+ },
37
+ };
38
+ options.ledger?.append('TOOL_CALL', {
39
+ stage: 'complete',
40
+ taskId: options.taskId,
41
+ capability: options.capability,
42
+ tool: toolName,
43
+ envelope: completed,
44
+ });
45
+ return result;
46
+ }
47
+ catch (error) {
48
+ const errEnvelope = {
49
+ ...envelopeBase,
50
+ error: {
51
+ code: 'ERROR',
52
+ message: error?.message ?? String(error),
53
+ },
54
+ metadata: {
55
+ ...envelopeBase.metadata,
56
+ duration_ms: Date.now() - start,
57
+ },
58
+ };
59
+ options.ledger?.append('TOOL_CALL', {
60
+ stage: 'error',
61
+ taskId: options.taskId,
62
+ capability: options.capability,
63
+ tool: toolName,
64
+ envelope: errEnvelope,
65
+ });
66
+ throw error;
67
+ }
68
+ };
69
+ return instrumented;
70
+ }
71
+ export function createInstrumentedToolGetter(options) {
72
+ const cache = new Map();
73
+ return (toolName) => {
74
+ const tool = options.toolRegistry.get(toolName);
75
+ if (!tool) {
76
+ return undefined;
77
+ }
78
+ if (!cache.has(tool)) {
79
+ cache.set(tool, cloneWithInstrumentedCall(toolName, tool, options));
80
+ }
81
+ return cache.get(tool);
82
+ };
83
+ }
84
+ //# sourceMappingURL=tool-envelope.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tool-envelope.js","sourceRoot":"","sources":["../../src/tool-envelope.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=resumable.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resumable.test.d.ts","sourceRoot":"","sources":["../../tests/resumable.test.ts"],"names":[],"mappings":""}