akribes 0.21.17

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 (100) hide show
  1. package/CHANGELOG.md +30 -0
  2. package/LICENSE +21 -0
  3. package/README.md +160 -0
  4. package/dist/client.d.ts +240 -0
  5. package/dist/client.d.ts.map +1 -0
  6. package/dist/client.js +272 -0
  7. package/dist/client.js.map +1 -0
  8. package/dist/errors.d.ts +196 -0
  9. package/dist/errors.d.ts.map +1 -0
  10. package/dist/errors.js +274 -0
  11. package/dist/errors.js.map +1 -0
  12. package/dist/execution/index.d.ts +3 -0
  13. package/dist/execution/index.d.ts.map +1 -0
  14. package/dist/execution/index.js +3 -0
  15. package/dist/execution/index.js.map +1 -0
  16. package/dist/execution/replay.d.ts +37 -0
  17. package/dist/execution/replay.d.ts.map +1 -0
  18. package/dist/execution/replay.js +59 -0
  19. package/dist/execution/replay.js.map +1 -0
  20. package/dist/execution/steps.d.ts +327 -0
  21. package/dist/execution/steps.d.ts.map +1 -0
  22. package/dist/execution/steps.js +1068 -0
  23. package/dist/execution/steps.js.map +1 -0
  24. package/dist/http.d.ts +53 -0
  25. package/dist/http.d.ts.map +1 -0
  26. package/dist/http.js +141 -0
  27. package/dist/http.js.map +1 -0
  28. package/dist/index.d.ts +36 -0
  29. package/dist/index.d.ts.map +1 -0
  30. package/dist/index.js +38 -0
  31. package/dist/index.js.map +1 -0
  32. package/dist/runStream.d.ts +176 -0
  33. package/dist/runStream.d.ts.map +1 -0
  34. package/dist/runStream.js +408 -0
  35. package/dist/runStream.js.map +1 -0
  36. package/dist/sse.d.ts +46 -0
  37. package/dist/sse.d.ts.map +1 -0
  38. package/dist/sse.js +218 -0
  39. package/dist/sse.js.map +1 -0
  40. package/dist/sub/bench.d.ts +182 -0
  41. package/dist/sub/bench.d.ts.map +1 -0
  42. package/dist/sub/bench.js +420 -0
  43. package/dist/sub/bench.js.map +1 -0
  44. package/dist/sub/channels.d.ts +22 -0
  45. package/dist/sub/channels.d.ts.map +1 -0
  46. package/dist/sub/channels.js +32 -0
  47. package/dist/sub/channels.js.map +1 -0
  48. package/dist/sub/clients.d.ts +79 -0
  49. package/dist/sub/clients.d.ts.map +1 -0
  50. package/dist/sub/clients.js +190 -0
  51. package/dist/sub/clients.js.map +1 -0
  52. package/dist/sub/documents.d.ts +113 -0
  53. package/dist/sub/documents.d.ts.map +1 -0
  54. package/dist/sub/documents.js +329 -0
  55. package/dist/sub/documents.js.map +1 -0
  56. package/dist/sub/evals.d.ts +71 -0
  57. package/dist/sub/evals.d.ts.map +1 -0
  58. package/dist/sub/evals.js +86 -0
  59. package/dist/sub/evals.js.map +1 -0
  60. package/dist/sub/events.d.ts +65 -0
  61. package/dist/sub/events.d.ts.map +1 -0
  62. package/dist/sub/events.js +154 -0
  63. package/dist/sub/events.js.map +1 -0
  64. package/dist/sub/executions.d.ts +255 -0
  65. package/dist/sub/executions.d.ts.map +1 -0
  66. package/dist/sub/executions.js +322 -0
  67. package/dist/sub/executions.js.map +1 -0
  68. package/dist/sub/mcp.d.ts +51 -0
  69. package/dist/sub/mcp.d.ts.map +1 -0
  70. package/dist/sub/mcp.js +42 -0
  71. package/dist/sub/mcp.js.map +1 -0
  72. package/dist/sub/projects.d.ts +73 -0
  73. package/dist/sub/projects.d.ts.map +1 -0
  74. package/dist/sub/projects.js +101 -0
  75. package/dist/sub/projects.js.map +1 -0
  76. package/dist/sub/scripts.d.ts +58 -0
  77. package/dist/sub/scripts.d.ts.map +1 -0
  78. package/dist/sub/scripts.js +82 -0
  79. package/dist/sub/scripts.js.map +1 -0
  80. package/dist/sub/tokens.d.ts +126 -0
  81. package/dist/sub/tokens.d.ts.map +1 -0
  82. package/dist/sub/tokens.js +105 -0
  83. package/dist/sub/tokens.js.map +1 -0
  84. package/dist/sub/versions.d.ts +29 -0
  85. package/dist/sub/versions.d.ts.map +1 -0
  86. package/dist/sub/versions.js +52 -0
  87. package/dist/sub/versions.js.map +1 -0
  88. package/dist/tokenSafety.d.ts +15 -0
  89. package/dist/tokenSafety.d.ts.map +1 -0
  90. package/dist/tokenSafety.js +24 -0
  91. package/dist/tokenSafety.js.map +1 -0
  92. package/dist/types.d.ts +1147 -0
  93. package/dist/types.d.ts.map +1 -0
  94. package/dist/types.js +132 -0
  95. package/dist/types.js.map +1 -0
  96. package/dist/workflowEvents.d.ts +297 -0
  97. package/dist/workflowEvents.d.ts.map +1 -0
  98. package/dist/workflowEvents.js +612 -0
  99. package/dist/workflowEvents.js.map +1 -0
  100. package/package.json +57 -0
package/dist/errors.js ADDED
@@ -0,0 +1,274 @@
1
+ /** Base error class for all Akribes SDK errors. */
2
+ export class AkribesError extends Error {
3
+ name = 'AkribesError';
4
+ }
5
+ /** Structured HTTP error with status code and server message.
6
+ *
7
+ * `errorType` and `reason` are populated when the server returns a structured
8
+ * error body of the shape `{ error, error_type, reason, ... }` (currently
9
+ * used by the document conversion path). Callers that care about typed
10
+ * failures should branch on these instead of regex-matching `message`.
11
+ *
12
+ * As of #987, this is the abstract parent for typed HTTP-status subclasses
13
+ * (`AkribesAuthError`, `AkribesNotFoundError`, `AkribesRateLimitError`,
14
+ * `AkribesTransientHttpError`, `AkribesAlreadyExistsError`,
15
+ * `CaseTypeMismatchError`, `JudgeContractError`). `instanceof AkribesHttpError`
16
+ * still works as a catch-all for any non-2xx. */
17
+ export class AkribesHttpError extends AkribesError {
18
+ status;
19
+ body;
20
+ serverMessage;
21
+ errorType;
22
+ reason;
23
+ name = 'AkribesHttpError';
24
+ constructor(status, body, serverMessage, errorType, reason) {
25
+ super(`HTTP ${status}: ${serverMessage ?? body}`);
26
+ this.status = status;
27
+ this.body = body;
28
+ this.serverMessage = serverMessage;
29
+ this.errorType = errorType;
30
+ this.reason = reason;
31
+ }
32
+ }
33
+ /** Thrown on HTTP 401/403. Auth / authorization failure — do not retry; mint
34
+ * a fresh scoped token (or rotate the service-token secret) and try again. */
35
+ export class AkribesAuthError extends AkribesHttpError {
36
+ name = 'AkribesAuthError';
37
+ constructor(status, body, serverMessage) {
38
+ super(status, body, serverMessage);
39
+ }
40
+ }
41
+ /** Thrown on HTTP 429. Carries `retryAfter` (parsed from the `Retry-After`
42
+ * header) in **seconds** when the server sent numeric-seconds form; `null`
43
+ * when the header is absent or in HTTP-date form (matching Python). */
44
+ export class AkribesRateLimitError extends AkribesHttpError {
45
+ retryAfter;
46
+ name = 'AkribesRateLimitError';
47
+ constructor(body, serverMessage, retryAfter) {
48
+ super(429, body, serverMessage);
49
+ this.retryAfter = retryAfter;
50
+ }
51
+ }
52
+ /** Recommended base backoff (in milliseconds) for a retriable HTTP status
53
+ * after #1296 split the umbrella `AkribesTransientHttpError` into one
54
+ * subclass per 5xx variant. Mirrors `ErrorKind::base_backoff_ms` on the
55
+ * Rust side so server + SDK retry cadences agree:
56
+ *
57
+ * - 500: maybe-transient origin error — start short (1s).
58
+ * - 502: edge fronted a failing origin — start short (1s).
59
+ * - 503: rate-limit-adjacent — honour `Retry-After`; default 2s.
60
+ * - 504: slow upstream — start longer (4s) before retrying.
61
+ * - 429: rate-limit — 2s default; honour `Retry-After` when present.
62
+ *
63
+ * Returned in milliseconds; callers convert to seconds with `/ 1000`.
64
+ * Returns `null` for non-transient statuses. */
65
+ export function recommendedBackoffMs(status) {
66
+ switch (status) {
67
+ case 429: return 2_000;
68
+ case 500: return 1_000;
69
+ case 502: return 1_000;
70
+ case 503: return 2_000;
71
+ case 504: return 4_000;
72
+ default: return null;
73
+ }
74
+ }
75
+ /** Thrown on HTTP 500/502/503/504. Retriable server-side failure (#1296
76
+ * splits this into status-specific subclasses below). `retryAfter` (in
77
+ * seconds) is populated when the server sent a numeric `Retry-After`.
78
+ * Use `instanceof AkribesTransientHttpError` for the umbrella check, or
79
+ * branch on the specific subclass (`AkribesServerError500`,
80
+ * `AkribesBadGatewayError502`, `AkribesServiceUnavailableError503`,
81
+ * `AkribesGatewayTimeoutError504`) for per-status retry cadence. */
82
+ export class AkribesTransientHttpError extends AkribesHttpError {
83
+ retryAfter;
84
+ name = 'AkribesTransientHttpError';
85
+ constructor(status, body, serverMessage, retryAfter) {
86
+ super(status, body, serverMessage);
87
+ this.retryAfter = retryAfter;
88
+ }
89
+ /** Recommended base backoff in milliseconds for this transient status
90
+ * (#1296). Prefer `retryAfter * 1000` when the server sent the header;
91
+ * fall back to this when it didn't. */
92
+ recommendedBackoffMs() {
93
+ return recommendedBackoffMs(this.status) ?? 1_000;
94
+ }
95
+ }
96
+ /** Thrown on HTTP 500 (internal server error). The origin reported a
97
+ * generic failure; retry with a short exponential backoff. (#1296) */
98
+ export class AkribesServerError500 extends AkribesTransientHttpError {
99
+ name = 'AkribesServerError500';
100
+ constructor(body, serverMessage, retryAfter) {
101
+ super(500, body, serverMessage, retryAfter);
102
+ }
103
+ }
104
+ /** Thrown on HTTP 502 (bad gateway). The provider's edge fronted a
105
+ * failing origin; retry with a short backoff. (#1296) */
106
+ export class AkribesBadGatewayError502 extends AkribesTransientHttpError {
107
+ name = 'AkribesBadGatewayError502';
108
+ constructor(body, serverMessage, retryAfter) {
109
+ super(502, body, serverMessage, retryAfter);
110
+ }
111
+ }
112
+ /** Thrown on HTTP 503 (service unavailable). Rate-limit-adjacent; honour
113
+ * `Retry-After` aggressively, otherwise back off at the rate-limit
114
+ * cadence. (#1296) */
115
+ export class AkribesServiceUnavailableError503 extends AkribesTransientHttpError {
116
+ name = 'AkribesServiceUnavailableError503';
117
+ constructor(body, serverMessage, retryAfter) {
118
+ super(503, body, serverMessage, retryAfter);
119
+ }
120
+ }
121
+ /** Thrown on HTTP 504 (gateway timeout). The upstream is slow or stuck;
122
+ * start with a longer base backoff than for 500/502. (#1296) */
123
+ export class AkribesGatewayTimeoutError504 extends AkribesTransientHttpError {
124
+ name = 'AkribesGatewayTimeoutError504';
125
+ constructor(body, serverMessage, retryAfter) {
126
+ super(504, body, serverMessage, retryAfter);
127
+ }
128
+ }
129
+ /** Parse a `Retry-After` header value into a numeric **seconds** value.
130
+ * Returns `null` for missing, empty, or HTTP-date values (matching the
131
+ * Python SDK's `_parse_retry_after`). Exported for tests + reuse. */
132
+ export function parseRetryAfter(headerValue) {
133
+ if (headerValue == null)
134
+ return null;
135
+ const trimmed = headerValue.trim();
136
+ if (!trimmed)
137
+ return null;
138
+ const n = Number(trimmed);
139
+ if (Number.isFinite(n) && n >= 0)
140
+ return n;
141
+ return null;
142
+ }
143
+ /** Thrown when the server returns 409 with `error_type: "suite_already_exists"`
144
+ * (or any other future "this resource already exists" condition). The
145
+ * `existingId` field carries the conflicting row's id so callers can
146
+ * redirect the operator to it. */
147
+ export class AkribesAlreadyExistsError extends AkribesHttpError {
148
+ existingId;
149
+ name = 'AkribesAlreadyExistsError';
150
+ constructor(status, body, serverMessage, existingId) {
151
+ super(status, body, serverMessage);
152
+ this.existingId = existingId;
153
+ }
154
+ }
155
+ export class AkribesTransientError extends AkribesError {
156
+ executionId;
157
+ name = 'AkribesTransientError';
158
+ constructor(message, executionId) {
159
+ super(message);
160
+ this.executionId = executionId;
161
+ }
162
+ }
163
+ export class AkribesFatalError extends AkribesError {
164
+ executionId;
165
+ name = 'AkribesFatalError';
166
+ constructor(message, executionId) {
167
+ super(message);
168
+ this.executionId = executionId;
169
+ }
170
+ }
171
+ export class AkribesScriptError extends AkribesError {
172
+ executionId;
173
+ name = 'AkribesScriptError';
174
+ constructor(message, executionId) {
175
+ super(message);
176
+ this.executionId = executionId;
177
+ }
178
+ }
179
+ /** Thrown by polling helpers (`waitFor` / `await`) when an execution does
180
+ * not reach a terminal state within the supplied timeout. Carries the
181
+ * execution id + elapsed budget so callers can route timeouts distinctly
182
+ * from script / transient failures. Mirrors Python's `AkribesTimeoutError`.
183
+ *
184
+ * The message still contains "timed out" verbatim for back-compat with
185
+ * pre-#109 callers that grep on it. */
186
+ export class AkribesTimeoutError extends AkribesError {
187
+ executionId;
188
+ timeoutMs;
189
+ name = 'AkribesTimeoutError';
190
+ constructor(message, executionId, timeoutMs) {
191
+ super(message);
192
+ this.executionId = executionId;
193
+ this.timeoutMs = timeoutMs;
194
+ }
195
+ }
196
+ /** Thrown when run() is called after a ScriptUpdated event with schema_changed=true. */
197
+ export class ScriptSchemaChangedError extends AkribesError {
198
+ scriptName;
199
+ name = 'ScriptSchemaChangedError';
200
+ constructor(scriptName) {
201
+ super(`Script "${scriptName}" schema has changed since init(). Re-register to continue.`);
202
+ this.scriptName = scriptName;
203
+ }
204
+ }
205
+ /** Parse a 400 `input_validation_failed` body off an AkribesHttpError.
206
+ * Returns null when the error is something else or the body doesn't match. */
207
+ export function tryParseInputValidationErrors(err) {
208
+ if (!(err instanceof AkribesHttpError) || err.status !== 400)
209
+ return null;
210
+ try {
211
+ const body = JSON.parse(err.body);
212
+ if (body?.error === 'input_validation_failed' && Array.isArray(body.errors)) {
213
+ return body.errors;
214
+ }
215
+ return null;
216
+ }
217
+ catch {
218
+ return null;
219
+ }
220
+ }
221
+ /** Thrown when run() is called with document keys that don't match the cached schema. */
222
+ export class ScriptInputMismatchError extends AkribesError {
223
+ scriptName;
224
+ missing;
225
+ extra;
226
+ name = 'ScriptInputMismatchError';
227
+ constructor(scriptName, missing, extra) {
228
+ const parts = [];
229
+ if (missing.length)
230
+ parts.push(`missing: ${missing.join(', ')}`);
231
+ if (extra.length)
232
+ parts.push(`extra: ${extra.join(', ')}`);
233
+ super(`Script "${scriptName}" input mismatch: ${parts.join('; ')}`);
234
+ this.scriptName = scriptName;
235
+ this.missing = missing;
236
+ this.extra = extra;
237
+ }
238
+ }
239
+ /** Thrown when the server returns 404 with a structured `{"error": ...}`
240
+ * body. Carries the parsed `error` message so callers can distinguish
241
+ * "no bench configured" from "bench run not found" without regex-matching
242
+ * `message`. Status is always 404. */
243
+ export class AkribesNotFoundError extends AkribesHttpError {
244
+ name = 'AkribesNotFoundError';
245
+ constructor(body, serverMessage) {
246
+ super(404, body, serverMessage, undefined, undefined);
247
+ }
248
+ }
249
+ /** Thrown by case-create / promote-execution when the server rejects the
250
+ * payload with structured per-field violations (HTTP 400 +
251
+ * `error: "case_type_mismatch"`). Callers in the form layer catch this
252
+ * and populate `errorsByPath` from {@link CaseTypeMismatchError.fieldErrors}. */
253
+ export class CaseTypeMismatchError extends AkribesHttpError {
254
+ fieldErrors;
255
+ name = 'CaseTypeMismatchError';
256
+ constructor(body, serverMessage, fieldErrors) {
257
+ super(400, body, serverMessage, 'case_type_mismatch', undefined);
258
+ this.fieldErrors = fieldErrors;
259
+ }
260
+ }
261
+ /** Thrown by `bench.triggerRun()` when the workflow's outputs are
262
+ * incompatible with the judge's `inputs.{expected,actual}` slots. The
263
+ * server returns 400 with a `Judge contract mismatch: ...` message; the
264
+ * SDK parses the trailing `N field(s) incompatible: ...` fragment into a
265
+ * `breaks` list when present, leaving it empty otherwise. */
266
+ export class JudgeContractError extends AkribesHttpError {
267
+ breaks;
268
+ name = 'JudgeContractError';
269
+ constructor(body, serverMessage, breaks) {
270
+ super(400, body, serverMessage, 'judge_contract_mismatch', undefined);
271
+ this.breaks = breaks;
272
+ }
273
+ }
274
+ //# sourceMappingURL=errors.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.js","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ export { reduceExecutionEvent, buildRunFromParams, type ExecutionStep, type StepVisibility, type StepTokens, type SubScriptTokens, type SubScriptTaskSummary, type LoopTurnSummary, type ActiveLineRef, type ActiveNodeRef, type ReducerSideEffects, type ValidationFailurePayload, } from './steps';
2
+ export { replayEvents, createReplayController, type ReplayController, type ReplayState, } from './replay';
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/execution/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,oBAAoB,EACpB,kBAAkB,EAClB,KAAK,aAAa,EAClB,KAAK,cAAc,EACnB,KAAK,UAAU,EACf,KAAK,eAAe,EACpB,KAAK,oBAAoB,EACzB,KAAK,eAAe,EACpB,KAAK,aAAa,EAClB,KAAK,aAAa,EAClB,KAAK,kBAAkB,EACvB,KAAK,wBAAwB,GAC9B,MAAM,SAAS,CAAC;AAEjB,OAAO,EACL,YAAY,EACZ,sBAAsB,EACtB,KAAK,gBAAgB,EACrB,KAAK,WAAW,GACjB,MAAM,UAAU,CAAC"}
@@ -0,0 +1,3 @@
1
+ export { reduceExecutionEvent, buildRunFromParams, } from './steps';
2
+ export { replayEvents, createReplayController, } from './replay';
3
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/execution/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,oBAAoB,EACpB,kBAAkB,GAWnB,MAAM,SAAS,CAAC;AAEjB,OAAO,EACL,YAAY,EACZ,sBAAsB,GAGvB,MAAM,UAAU,CAAC"}
@@ -0,0 +1,37 @@
1
+ /**
2
+ * Replay stored EngineEvent[] arrays into ExecutionStep[] for display.
3
+ *
4
+ * Uses the same reducer as the live handler but processes events in bulk
5
+ * (no incremental state). Also exposes a step-through controller for
6
+ * historical debugging.
7
+ */
8
+ import type { EngineEvent } from '../types';
9
+ import { type ExecutionStep } from './steps';
10
+ /** Apply the reducer to every event in order and return the resulting steps. */
11
+ export declare function replayEvents(events: EngineEvent[]): ExecutionStep[];
12
+ /**
13
+ * Step-through replay controller for historical executions. Allows stepping
14
+ * forward/backward through events one at a time, seeking to arbitrary
15
+ * positions, and getting the current active line.
16
+ */
17
+ export type ReplayController = {
18
+ eventIndex: number;
19
+ totalEvents: number;
20
+ steps: ExecutionStep[];
21
+ activeLine: number | null;
22
+ stepForward(): ReplayState;
23
+ stepBackward(): ReplayState;
24
+ seekTo(index: number): ReplayState;
25
+ };
26
+ export type ReplayState = {
27
+ steps: ExecutionStep[];
28
+ activeLine: number | null;
29
+ eventIndex: number;
30
+ done: boolean;
31
+ };
32
+ /**
33
+ * Create a replay controller from a list of engine events. The controller
34
+ * replays from scratch on backward/seek (events are small, this is fast).
35
+ */
36
+ export declare function createReplayController(events: EngineEvent[]): ReplayController;
37
+ //# sourceMappingURL=replay.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"replay.d.ts","sourceRoot":"","sources":["../../src/execution/replay.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,OAAO,KAAK,EAAE,WAAW,EAAY,MAAM,UAAU,CAAC;AACtD,OAAO,EAEL,KAAK,aAAa,EAGnB,MAAM,SAAS,CAAC;AAEjB,gFAAgF;AAChF,wBAAgB,YAAY,CAAC,MAAM,EAAE,WAAW,EAAE,GAAG,aAAa,EAAE,CAenE;AAED;;;;GAIG;AACH,MAAM,MAAM,gBAAgB,GAAG;IAC7B,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,MAAM,CAAC;IACpB,KAAK,EAAE,aAAa,EAAE,CAAC;IACvB,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,WAAW,IAAI,WAAW,CAAC;IAC3B,YAAY,IAAI,WAAW,CAAC;IAC5B,MAAM,CAAC,KAAK,EAAE,MAAM,GAAG,WAAW,CAAC;CACpC,CAAC;AAEF,MAAM,MAAM,WAAW,GAAG;IACxB,KAAK,EAAE,aAAa,EAAE,CAAC;IACvB,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,UAAU,EAAE,MAAM,CAAC;IACnB,IAAI,EAAE,OAAO,CAAC;CACf,CAAC;AAEF;;;GAGG;AACH,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,WAAW,EAAE,GAAG,gBAAgB,CA2C9E"}
@@ -0,0 +1,59 @@
1
+ import { reduceExecutionEvent, } from './steps';
2
+ /** Apply the reducer to every event in order and return the resulting steps. */
3
+ export function replayEvents(events) {
4
+ let steps = [];
5
+ const activeLineRef = { current: null };
6
+ const activeNodeRef = { current: null };
7
+ for (const evt of events) {
8
+ const hubEvt = {
9
+ type: 'Execution',
10
+ payload: { project_id: 0, script_name: '', execution_id: '', event: evt },
11
+ };
12
+ const result = reduceExecutionEvent(steps, hubEvt, activeLineRef, activeNodeRef);
13
+ steps = result.steps;
14
+ }
15
+ return steps;
16
+ }
17
+ /**
18
+ * Create a replay controller from a list of engine events. The controller
19
+ * replays from scratch on backward/seek (events are small, this is fast).
20
+ */
21
+ export function createReplayController(events) {
22
+ let currentIndex = 0;
23
+ let currentSteps = [];
24
+ let currentActiveLine = null;
25
+ function replayTo(targetIndex) {
26
+ const clamped = Math.max(0, Math.min(targetIndex, events.length));
27
+ let steps = [];
28
+ const activeLineRef = { current: null };
29
+ const activeNodeRef = { current: null };
30
+ for (let i = 0; i < clamped; i++) {
31
+ const hubEvt = {
32
+ type: 'Execution',
33
+ payload: { project_id: 0, script_name: '', execution_id: '', event: events[i] },
34
+ };
35
+ const result = reduceExecutionEvent(steps, hubEvt, activeLineRef, activeNodeRef);
36
+ steps = result.steps;
37
+ }
38
+ currentIndex = clamped;
39
+ currentSteps = steps;
40
+ currentActiveLine = activeLineRef.current;
41
+ return {
42
+ steps,
43
+ activeLine: activeLineRef.current,
44
+ eventIndex: clamped,
45
+ done: clamped >= events.length,
46
+ };
47
+ }
48
+ const controller = {
49
+ get eventIndex() { return currentIndex; },
50
+ get totalEvents() { return events.length; },
51
+ get steps() { return currentSteps; },
52
+ get activeLine() { return currentActiveLine; },
53
+ stepForward() { return replayTo(currentIndex + 1); },
54
+ stepBackward() { return replayTo(currentIndex - 1); },
55
+ seekTo(index) { return replayTo(index); },
56
+ };
57
+ return controller;
58
+ }
59
+ //# sourceMappingURL=replay.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"replay.js","sourceRoot":"","sources":["../../src/execution/replay.ts"],"names":[],"mappings":"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"}