@melra/runtime-core 0.3.0-alpha.3

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 (62) hide show
  1. package/LICENSE +202 -0
  2. package/dist/index.d.ts +8 -0
  3. package/dist/index.d.ts.map +1 -0
  4. package/dist/index.js +10 -0
  5. package/dist/index.js.map +1 -0
  6. package/dist/payload-cipher.d.ts +8 -0
  7. package/dist/payload-cipher.d.ts.map +1 -0
  8. package/dist/payload-cipher.js +47 -0
  9. package/dist/payload-cipher.js.map +1 -0
  10. package/dist/payload-cipher.test.d.ts +2 -0
  11. package/dist/payload-cipher.test.d.ts.map +1 -0
  12. package/dist/payload-cipher.test.js +33 -0
  13. package/dist/payload-cipher.test.js.map +1 -0
  14. package/dist/retry-guard.d.ts +21 -0
  15. package/dist/retry-guard.d.ts.map +1 -0
  16. package/dist/retry-guard.js +56 -0
  17. package/dist/retry-guard.js.map +1 -0
  18. package/dist/retry-guard.test.d.ts +2 -0
  19. package/dist/retry-guard.test.d.ts.map +1 -0
  20. package/dist/retry-guard.test.js +45 -0
  21. package/dist/retry-guard.test.js.map +1 -0
  22. package/dist/task-controller.d.ts +52 -0
  23. package/dist/task-controller.d.ts.map +1 -0
  24. package/dist/task-controller.js +416 -0
  25. package/dist/task-controller.js.map +1 -0
  26. package/dist/task-controller.test.d.ts +2 -0
  27. package/dist/task-controller.test.d.ts.map +1 -0
  28. package/dist/task-controller.test.js +422 -0
  29. package/dist/task-controller.test.js.map +1 -0
  30. package/dist/verification-gate.d.ts +18 -0
  31. package/dist/verification-gate.d.ts.map +1 -0
  32. package/dist/verification-gate.js +29 -0
  33. package/dist/verification-gate.js.map +1 -0
  34. package/dist/verification-gate.test.d.ts +2 -0
  35. package/dist/verification-gate.test.d.ts.map +1 -0
  36. package/dist/verification-gate.test.js +42 -0
  37. package/dist/verification-gate.test.js.map +1 -0
  38. package/dist/workflow-controller.d.ts +33 -0
  39. package/dist/workflow-controller.d.ts.map +1 -0
  40. package/dist/workflow-controller.js +711 -0
  41. package/dist/workflow-controller.js.map +1 -0
  42. package/dist/workflow-controller.test.d.ts +2 -0
  43. package/dist/workflow-controller.test.d.ts.map +1 -0
  44. package/dist/workflow-controller.test.js +641 -0
  45. package/dist/workflow-controller.test.js.map +1 -0
  46. package/dist/workflow-events.d.ts +4 -0
  47. package/dist/workflow-events.d.ts.map +1 -0
  48. package/dist/workflow-events.js +112 -0
  49. package/dist/workflow-events.js.map +1 -0
  50. package/dist/workflow-events.test.d.ts +2 -0
  51. package/dist/workflow-events.test.d.ts.map +1 -0
  52. package/dist/workflow-events.test.js +113 -0
  53. package/dist/workflow-events.test.js.map +1 -0
  54. package/dist/workflow-graph.d.ts +8 -0
  55. package/dist/workflow-graph.d.ts.map +1 -0
  56. package/dist/workflow-graph.js +107 -0
  57. package/dist/workflow-graph.js.map +1 -0
  58. package/dist/workflow-graph.test.d.ts +2 -0
  59. package/dist/workflow-graph.test.d.ts.map +1 -0
  60. package/dist/workflow-graph.test.js +169 -0
  61. package/dist/workflow-graph.test.js.map +1 -0
  62. package/package.json +36 -0
@@ -0,0 +1,422 @@
1
+ // Copyright 2026 XAGI Labs Private Limited
2
+ // SPDX-License-Identifier: Apache-2.0
3
+ import { mkdtemp, readFile, rm, writeFile } from "node:fs/promises";
4
+ import { tmpdir } from "node:os";
5
+ import { join } from "node:path";
6
+ import { afterEach, describe, expect, it, vi } from "vitest";
7
+ import { TaskRequestSchema, } from "@melra/protocol";
8
+ import { createDefaultPolicy } from "@melra/policy-core";
9
+ import { SqliteStore } from "@melra/storage-sqlite";
10
+ import { Verifier } from "@melra/verifier-core";
11
+ import { PayloadCipher } from "./payload-cipher.js";
12
+ import { TaskController } from "./task-controller.js";
13
+ const roots = [];
14
+ const stores = [];
15
+ afterEach(async () => {
16
+ stores.splice(0).forEach((store) => store.close());
17
+ await Promise.all(roots.splice(0).map((root) => rm(root, { recursive: true, force: true })));
18
+ });
19
+ async function setup(executor = {
20
+ async execute() {
21
+ return { success: true, stored: true, value: "verified" };
22
+ },
23
+ }) {
24
+ const root = await mkdtemp(join(tmpdir(), "melra-controller-"));
25
+ roots.push(root);
26
+ const store = new SqliteStore(":memory:");
27
+ stores.push(store);
28
+ const controller = await createController(store, root, Buffer.alloc(32, 7), executor);
29
+ return { controller, store };
30
+ }
31
+ async function createController(store, root, key, executor) {
32
+ return new TaskController(store, createDefaultPolicy(root), executor, await Verifier.create(root), new PayloadCipher(key));
33
+ }
34
+ describe("TaskController", () => {
35
+ it("executes a planned task after restart with the same key", async () => {
36
+ const root = await mkdtemp(join(tmpdir(), "melra-controller-restart-"));
37
+ roots.push(root);
38
+ const databasePath = join(root, "melra.sqlite");
39
+ const key = Buffer.alloc(32, 21);
40
+ const executor = {
41
+ execute: vi.fn(async () => ({ success: true, value: "verified" })),
42
+ };
43
+ const storeA = new SqliteStore(databasePath);
44
+ stores.push(storeA);
45
+ const controllerA = await createController(storeA, root, key, executor);
46
+ const request = TaskRequestSchema.parse({
47
+ goal: "Inspect the runtime after restart",
48
+ operation: { kind: "system", action: "info" },
49
+ });
50
+ const planned = controllerA.plan(request);
51
+ storeA.close();
52
+ stores.splice(stores.indexOf(storeA), 1);
53
+ const storeB = new SqliteStore(databasePath);
54
+ stores.push(storeB);
55
+ const controllerB = await createController(storeB, root, key, executor);
56
+ const result = await controllerB.execute(planned.id);
57
+ expect(result.task.status).toBe("verified_success");
58
+ expect(executor.execute).toHaveBeenCalledWith(request.operation, expect.any(AbortSignal));
59
+ });
60
+ it("keeps exact requests out of SQLite and rejects the wrong key", async () => {
61
+ const root = await mkdtemp(join(tmpdir(), "melra-controller-sealed-"));
62
+ roots.push(root);
63
+ const databasePath = join(root, "melra.sqlite");
64
+ const storeA = new SqliteStore(databasePath);
65
+ stores.push(storeA);
66
+ const controllerA = await createController(storeA, root, Buffer.alloc(32, 23), { async execute() { return { success: true }; } });
67
+ const planned = controllerA.plan(TaskRequestSchema.parse({
68
+ goal: "one-time-secret",
69
+ operation: { kind: "system", action: "info" },
70
+ }));
71
+ storeA.close();
72
+ stores.splice(stores.indexOf(storeA), 1);
73
+ expect((await readFile(databasePath)).toString()).not.toContain("one-time-secret");
74
+ const storeB = new SqliteStore(databasePath);
75
+ stores.push(storeB);
76
+ const controllerB = await createController(storeB, root, Buffer.alloc(32, 29), { async execute() { return { success: true }; } });
77
+ await expect(controllerB.execute(planned.id)).rejects.toThrow("task_payload_authentication_failed");
78
+ });
79
+ it("verifies an authenticated persisted adapter result", async () => {
80
+ const { controller } = await setup();
81
+ const planned = controller.plan(TaskRequestSchema.parse({
82
+ goal: "Persist a result for later workflow conditions",
83
+ operation: { kind: "system", action: "info" },
84
+ }));
85
+ await controller.execute(planned.id);
86
+ await expect(controller.verifyPersisted(planned.id, [
87
+ { type: "result_equals", path: "value", value: "verified" },
88
+ ])).resolves.toMatchObject({ verified: true });
89
+ });
90
+ it("preflights installed capabilities without persisting a task", async () => {
91
+ const { controller, store } = await setup({
92
+ capabilities() {
93
+ return new Set(["file"]);
94
+ },
95
+ async execute() {
96
+ return { success: true };
97
+ },
98
+ });
99
+ const request = TaskRequestSchema.parse({
100
+ goal: "Require an installed system adapter",
101
+ operation: { kind: "system", action: "info" },
102
+ });
103
+ expect(() => controller.preflight(request)).toThrow("operation_capability_unavailable:system");
104
+ expect(store.listTasks()).toEqual([]);
105
+ });
106
+ it("rejects an approval whose stored action digest no longer matches", async () => {
107
+ const { controller, store } = await setup();
108
+ const planned = controller.plan(TaskRequestSchema.parse({
109
+ goal: "Store a governed memory",
110
+ operation: {
111
+ kind: "memory",
112
+ action: "put",
113
+ key: "project",
114
+ value: "MELRA",
115
+ },
116
+ requiredEvidence: [
117
+ { type: "result_equals", path: "stored", value: true },
118
+ ],
119
+ }));
120
+ const stored = store.getTask(planned.id);
121
+ stored.approval = {
122
+ ...stored.approval,
123
+ actionDigest: "0".repeat(64),
124
+ };
125
+ store.saveTask(stored);
126
+ await expect(controller.execute(planned.id, {
127
+ approvalId: stored.approval.approvalId,
128
+ phrase: stored.approval.phrase,
129
+ })).rejects.toThrow("approval_action_digest_mismatch");
130
+ });
131
+ it("uses rechecked policy rather than a stale stored allow decision", async () => {
132
+ const execute = vi.fn(async () => ({ success: true, stored: true }));
133
+ const { controller, store } = await setup({ execute });
134
+ const planned = controller.plan(TaskRequestSchema.parse({
135
+ goal: "Store a governed memory",
136
+ operation: {
137
+ kind: "memory",
138
+ action: "put",
139
+ key: "project",
140
+ value: "MELRA",
141
+ },
142
+ requiredEvidence: [
143
+ { type: "result_equals", path: "stored", value: true },
144
+ ],
145
+ }));
146
+ const stored = store.getTask(planned.id);
147
+ stored.policyDecision = {
148
+ ...stored.policyDecision,
149
+ outcome: "allow",
150
+ reason: "stale projection",
151
+ };
152
+ store.saveTask(stored);
153
+ await expect(controller.execute(planned.id)).rejects.toThrow("approval_required");
154
+ expect(execute).not.toHaveBeenCalled();
155
+ });
156
+ it("recovers interrupted reads for retry and quarantines mutations", async () => {
157
+ const execute = vi.fn(async () => ({ success: true }));
158
+ const { controller, store } = await setup({ execute });
159
+ const read = controller.plan(TaskRequestSchema.parse({
160
+ goal: "Recover an interrupted read",
161
+ operation: { kind: "system", action: "info" },
162
+ }));
163
+ const mutation = controller.plan(TaskRequestSchema.parse({
164
+ goal: "Recover an interrupted mutation",
165
+ operation: {
166
+ kind: "memory",
167
+ action: "put",
168
+ key: "project",
169
+ value: "MELRA",
170
+ },
171
+ requiredEvidence: [
172
+ { type: "result_equals", path: "stored", value: true },
173
+ ],
174
+ }));
175
+ for (const item of [read, mutation]) {
176
+ const stored = store.getTask(item.id);
177
+ stored.status = "running";
178
+ store.saveTask(stored);
179
+ }
180
+ const recovered = await controller.recoverInterrupted();
181
+ expect(recovered).toHaveLength(2);
182
+ expect(store.getTask(read.id)).toMatchObject({
183
+ status: "planned",
184
+ error: "interrupted_read_ready_for_retry",
185
+ });
186
+ expect(store.getTask(mutation.id)).toMatchObject({
187
+ status: "recovery_required",
188
+ error: "interrupted_mutation_requires_reconciliation",
189
+ });
190
+ expect(execute).not.toHaveBeenCalled();
191
+ });
192
+ it("reconciles a verifying file mutation from independent evidence", async () => {
193
+ const execute = vi.fn(async () => ({ success: true }));
194
+ const { controller, store } = await setup({ execute });
195
+ const root = roots.at(-1);
196
+ const planned = controller.plan(TaskRequestSchema.parse({
197
+ goal: "Recover an already completed file write",
198
+ operation: {
199
+ kind: "file",
200
+ action: "write",
201
+ path: "recovered.txt",
202
+ content: "complete",
203
+ },
204
+ requiredEvidence: [
205
+ { type: "file_exists", path: "recovered.txt" },
206
+ ],
207
+ }), {
208
+ idempotencyKey: "b".repeat(64),
209
+ attempt: 1,
210
+ });
211
+ await writeFile(join(root, "recovered.txt"), "complete");
212
+ const interrupted = store.getTask(planned.id);
213
+ interrupted.status = "verifying";
214
+ store.saveTask(interrupted);
215
+ const [recovered] = await controller.recoverInterrupted();
216
+ expect(recovered).toMatchObject({
217
+ id: planned.id,
218
+ status: "verified_success",
219
+ });
220
+ expect(controller.receipts({ taskId: planned.id }).certificate?.result).toBe("VERIFIED_SUCCESS");
221
+ expect(store.getIdempotencyCommit("b".repeat(64))).toMatchObject({
222
+ taskId: planned.id,
223
+ attempt: 1,
224
+ });
225
+ expect(execute).not.toHaveBeenCalled();
226
+ });
227
+ it("prevents an already committed idempotency key from executing again", async () => {
228
+ const execute = vi.fn(async () => ({ success: true }));
229
+ const { controller } = await setup({ execute });
230
+ const request = TaskRequestSchema.parse({
231
+ goal: "Run one logical attempt",
232
+ operation: { kind: "system", action: "info" },
233
+ });
234
+ const idempotencyKey = "a".repeat(64);
235
+ const first = controller.plan(request, {
236
+ idempotencyKey,
237
+ attempt: 1,
238
+ });
239
+ const firstResult = await controller.execute(first.id);
240
+ const duplicate = controller.plan(request, {
241
+ idempotencyKey,
242
+ attempt: 2,
243
+ });
244
+ const duplicateResult = await controller.execute(duplicate.id);
245
+ expect(firstResult.task).toMatchObject({
246
+ status: "verified_success",
247
+ idempotencyKey,
248
+ attempt: 1,
249
+ });
250
+ expect(duplicateResult.task).toMatchObject({
251
+ status: "cancelled",
252
+ error: "duplicate_attempt_prevented",
253
+ idempotencyKey,
254
+ attempt: 2,
255
+ });
256
+ expect(execute).toHaveBeenCalledTimes(1);
257
+ });
258
+ it("plans, executes, verifies, and persists a read task", async () => {
259
+ const { controller, store } = await setup();
260
+ const task = controller.plan(TaskRequestSchema.parse({
261
+ goal: "Inspect the system",
262
+ operation: { kind: "system", action: "info" },
263
+ }));
264
+ expect(task.status).toBe("planned");
265
+ const execution = await controller.execute(task.id);
266
+ expect(execution.task.status).toBe("verified_success");
267
+ expect(execution.receipt?.success).toBe(true);
268
+ expect(execution.certificate?.result).toBe("VERIFIED_SUCCESS");
269
+ expect(store.getReceiptsForTask(task.id)).toHaveLength(1);
270
+ });
271
+ it("requires the exact approval for mutation", async () => {
272
+ const { controller } = await setup();
273
+ const task = controller.plan(TaskRequestSchema.parse({
274
+ goal: "Store a memory",
275
+ operation: {
276
+ kind: "memory",
277
+ action: "put",
278
+ scope: "workspace",
279
+ key: "project",
280
+ value: "MELRA",
281
+ },
282
+ requiredEvidence: [
283
+ { type: "result_equals", path: "stored", value: true },
284
+ ],
285
+ }));
286
+ expect(task.status).toBe("awaiting_approval");
287
+ await expect(controller.execute(task.id)).rejects.toThrow("approval_required");
288
+ const result = await controller.execute(task.id, {
289
+ approvalId: task.approval.approvalId,
290
+ phrase: task.approval.phrase,
291
+ });
292
+ expect(result.task.status).toBe("verified_success");
293
+ });
294
+ it("derives evidence for a mutation that declared none", async () => {
295
+ const { controller } = await setup();
296
+ const task = controller.plan(TaskRequestSchema.parse({
297
+ goal: "Write a file",
298
+ operation: {
299
+ kind: "file",
300
+ action: "write",
301
+ path: "result.txt",
302
+ content: "unsafe",
303
+ },
304
+ }));
305
+ // A write has an obvious post-condition, so the task proceeds to approval
306
+ // rather than dead-ending — but it is still held to that post-condition.
307
+ expect(task.status).toBe("awaiting_approval");
308
+ expect(task.request.requiredEvidence).toEqual([
309
+ { type: "file_exists", path: "result.txt" },
310
+ ]);
311
+ });
312
+ it("still blocks a mutation whose evidence cannot be derived", async () => {
313
+ const { controller } = await setup();
314
+ const task = controller.plan(TaskRequestSchema.parse({
315
+ goal: "Run a build",
316
+ operation: {
317
+ kind: "terminal",
318
+ action: "run",
319
+ command: "npm",
320
+ args: ["run", "build"],
321
+ },
322
+ }));
323
+ // Nothing about the request says what the command should leave behind, so
324
+ // the mutation-requires-evidence guarantee still holds.
325
+ expect(task.status).toBe("policy_blocked");
326
+ expect(task.policyDecision.reason).toBe("mutation_requires_evidence");
327
+ });
328
+ it("retries bounded read failures but never loops indefinitely", async () => {
329
+ let attempts = 0;
330
+ const { controller } = await setup({
331
+ async execute() {
332
+ attempts += 1;
333
+ if (attempts < 2)
334
+ throw new Error("transient_read_failure");
335
+ return { success: true };
336
+ },
337
+ });
338
+ const task = controller.plan(TaskRequestSchema.parse({
339
+ goal: "Retry one transient read",
340
+ operation: { kind: "system", action: "info" },
341
+ budget: { maxRetries: 2, maxSteps: 3, maxDurationMs: 5_000 },
342
+ }));
343
+ const result = await controller.execute(task.id);
344
+ expect(result.task.status).toBe("verified_success");
345
+ expect(result.task.attempts).toBe(2);
346
+ expect(attempts).toBe(2);
347
+ });
348
+ it("classifies a generic abort error as budget exhaustion when its timer fires", async () => {
349
+ const { controller } = await setup({
350
+ async execute(_operation, signal) {
351
+ await new Promise((_resolve, reject) => {
352
+ signal?.addEventListener("abort", () => reject(new Error("The operation was aborted")), { once: true });
353
+ });
354
+ return { success: true };
355
+ },
356
+ });
357
+ const task = controller.plan(TaskRequestSchema.parse({
358
+ goal: "Respect a strict execution budget",
359
+ operation: { kind: "system", action: "info" },
360
+ budget: { maxRetries: 0, maxSteps: 1, maxDurationMs: 100 },
361
+ }));
362
+ const result = await controller.execute(task.id);
363
+ expect(result.task.status).toBe("budget_exhausted");
364
+ expect(result.task.error).toBe("task_budget_exhausted");
365
+ expect(result.certificate?.result).toBe("BUDGET_EXHAUSTED");
366
+ });
367
+ it("redacts executor secrets before task or receipt persistence", async () => {
368
+ const { controller, store } = await setup({
369
+ async execute() {
370
+ return {
371
+ success: true,
372
+ stored: true,
373
+ output: "password=hunter2",
374
+ authorization: "Bearer raw-token-value",
375
+ };
376
+ },
377
+ });
378
+ const task = controller.plan(TaskRequestSchema.parse({
379
+ goal: "Persist only redacted evidence",
380
+ operation: { kind: "system", action: "info" },
381
+ requiredEvidence: [
382
+ { type: "result_equals", path: "stored", value: true },
383
+ ],
384
+ }));
385
+ const result = await controller.execute(task.id);
386
+ expect(JSON.stringify(result.task.result)).not.toContain("hunter2");
387
+ expect(JSON.stringify(result.receipt?.observedEffect)).not.toContain("raw-token-value");
388
+ expect(result.output?.output).toBe("password=hunter2");
389
+ expect(result.receipt?.redactions.length).toBeGreaterThan(0);
390
+ expect(JSON.stringify(store.getTask(task.id))).not.toContain("hunter2");
391
+ });
392
+ it("shows the live caller the approval input without retaining it", async () => {
393
+ const { controller, store } = await setup({
394
+ async execute() {
395
+ return { success: true, typed: true };
396
+ },
397
+ });
398
+ const secretInput = "one-time private form value";
399
+ const task = controller.plan(TaskRequestSchema.parse({
400
+ goal: "Type a reviewed value",
401
+ operation: {
402
+ kind: "browser",
403
+ action: "type",
404
+ target: { selector: "#field" },
405
+ value: secretInput,
406
+ },
407
+ requiredEvidence: [
408
+ { type: "result_equals", path: "typed", value: true },
409
+ ],
410
+ }));
411
+ expect(task.request.operation.kind === "browser"
412
+ ? task.request.operation.value
413
+ : undefined).toBe(secretInput);
414
+ expect(JSON.stringify(store.getTask(task.id))).not.toContain(secretInput);
415
+ const execution = await controller.execute(task.id, {
416
+ approvalId: task.approval.approvalId,
417
+ phrase: task.approval.phrase,
418
+ });
419
+ expect(execution.task.status).toBe("verified_success");
420
+ });
421
+ });
422
+ //# sourceMappingURL=task-controller.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"task-controller.test.js","sourceRoot":"","sources":["../src/task-controller.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,18 @@
1
+ export type ToolEffect = "read" | "mutate";
2
+ export interface ToolObservation {
3
+ name: string;
4
+ effect: ToolEffect;
5
+ structuredVerification?: boolean;
6
+ expectationProvided?: boolean;
7
+ }
8
+ export interface VerificationGateState {
9
+ mutated: boolean;
10
+ verifiedAfterMutation: boolean;
11
+ prompted: boolean;
12
+ lastMutator?: string;
13
+ }
14
+ export declare function createVerificationGateState(): VerificationGateState;
15
+ export declare function observeToolCall(state: VerificationGateState, observation: ToolObservation): void;
16
+ export declare function requiresVerification(state: VerificationGateState): boolean;
17
+ export declare function markVerificationPrompted(state: VerificationGateState): void;
18
+ //# sourceMappingURL=verification-gate.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"verification-gate.d.ts","sourceRoot":"","sources":["../src/verification-gate.ts"],"names":[],"mappings":"AAGA,MAAM,MAAM,UAAU,GAAG,MAAM,GAAG,QAAQ,CAAC;AAE3C,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,UAAU,CAAC;IACnB,sBAAsB,CAAC,EAAE,OAAO,CAAC;IACjC,mBAAmB,CAAC,EAAE,OAAO,CAAC;CAC/B;AAED,MAAM,WAAW,qBAAqB;IACpC,OAAO,EAAE,OAAO,CAAC;IACjB,qBAAqB,EAAE,OAAO,CAAC;IAC/B,QAAQ,EAAE,OAAO,CAAC;IAClB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,wBAAgB,2BAA2B,IAAI,qBAAqB,CAMnE;AAED,wBAAgB,eAAe,CAC7B,KAAK,EAAE,qBAAqB,EAC5B,WAAW,EAAE,eAAe,GAC3B,IAAI,CAcN;AAED,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,qBAAqB,GAAG,OAAO,CAE1E;AAED,wBAAgB,wBAAwB,CAAC,KAAK,EAAE,qBAAqB,GAAG,IAAI,CAE3E"}
@@ -0,0 +1,29 @@
1
+ // Copyright 2024-2026 XAGI Labs Private Limited
2
+ // SPDX-License-Identifier: Apache-2.0
3
+ export function createVerificationGateState() {
4
+ return {
5
+ mutated: false,
6
+ verifiedAfterMutation: false,
7
+ prompted: false,
8
+ };
9
+ }
10
+ export function observeToolCall(state, observation) {
11
+ if (observation.effect === "mutate") {
12
+ state.mutated = true;
13
+ state.verifiedAfterMutation = false;
14
+ state.lastMutator = observation.name;
15
+ return;
16
+ }
17
+ if (state.mutated &&
18
+ observation.structuredVerification === true &&
19
+ observation.expectationProvided === true) {
20
+ state.verifiedAfterMutation = true;
21
+ }
22
+ }
23
+ export function requiresVerification(state) {
24
+ return state.mutated && !state.verifiedAfterMutation && !state.prompted;
25
+ }
26
+ export function markVerificationPrompted(state) {
27
+ state.prompted = true;
28
+ }
29
+ //# sourceMappingURL=verification-gate.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"verification-gate.js","sourceRoot":"","sources":["../src/verification-gate.ts"],"names":[],"mappings":"AAAA,gDAAgD;AAChD,sCAAsC;AAkBtC,MAAM,UAAU,2BAA2B;IACzC,OAAO;QACL,OAAO,EAAE,KAAK;QACd,qBAAqB,EAAE,KAAK;QAC5B,QAAQ,EAAE,KAAK;KAChB,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,eAAe,CAC7B,KAA4B,EAC5B,WAA4B;IAE5B,IAAI,WAAW,CAAC,MAAM,KAAK,QAAQ,EAAE,CAAC;QACpC,KAAK,CAAC,OAAO,GAAG,IAAI,CAAC;QACrB,KAAK,CAAC,qBAAqB,GAAG,KAAK,CAAC;QACpC,KAAK,CAAC,WAAW,GAAG,WAAW,CAAC,IAAI,CAAC;QACrC,OAAO;IACT,CAAC;IACD,IACE,KAAK,CAAC,OAAO;QACb,WAAW,CAAC,sBAAsB,KAAK,IAAI;QAC3C,WAAW,CAAC,mBAAmB,KAAK,IAAI,EACxC,CAAC;QACD,KAAK,CAAC,qBAAqB,GAAG,IAAI,CAAC;IACrC,CAAC;AACH,CAAC;AAED,MAAM,UAAU,oBAAoB,CAAC,KAA4B;IAC/D,OAAO,KAAK,CAAC,OAAO,IAAI,CAAC,KAAK,CAAC,qBAAqB,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC;AAC1E,CAAC;AAED,MAAM,UAAU,wBAAwB,CAAC,KAA4B;IACnE,KAAK,CAAC,QAAQ,GAAG,IAAI,CAAC;AACxB,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=verification-gate.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"verification-gate.test.d.ts","sourceRoot":"","sources":["../src/verification-gate.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,42 @@
1
+ // Copyright 2024-2026 XAGI Labs Private Limited
2
+ // SPDX-License-Identifier: Apache-2.0
3
+ import { describe, expect, it } from "vitest";
4
+ import { createVerificationGateState, markVerificationPrompted, observeToolCall, requiresVerification, } from "./verification-gate.js";
5
+ describe("verification gate", () => {
6
+ it("does not gate read-only work", () => {
7
+ const state = createVerificationGateState();
8
+ observeToolCall(state, { name: "read", effect: "read" });
9
+ expect(requiresVerification(state)).toBe(false);
10
+ });
11
+ it("requires structured verification after mutation", () => {
12
+ const state = createVerificationGateState();
13
+ observeToolCall(state, { name: "click", effect: "mutate" });
14
+ expect(requiresVerification(state)).toBe(true);
15
+ observeToolCall(state, {
16
+ name: "verify-text",
17
+ effect: "read",
18
+ structuredVerification: true,
19
+ expectationProvided: true,
20
+ });
21
+ expect(requiresVerification(state)).toBe(false);
22
+ });
23
+ it("resets proof after another mutation", () => {
24
+ const state = createVerificationGateState();
25
+ observeToolCall(state, { name: "click", effect: "mutate" });
26
+ observeToolCall(state, {
27
+ name: "verify-text",
28
+ effect: "read",
29
+ structuredVerification: true,
30
+ expectationProvided: true,
31
+ });
32
+ observeToolCall(state, { name: "type", effect: "mutate" });
33
+ expect(requiresVerification(state)).toBe(true);
34
+ });
35
+ it("prompts at most once per gate state", () => {
36
+ const state = createVerificationGateState();
37
+ observeToolCall(state, { name: "click", effect: "mutate" });
38
+ markVerificationPrompted(state);
39
+ expect(requiresVerification(state)).toBe(false);
40
+ });
41
+ });
42
+ //# sourceMappingURL=verification-gate.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"verification-gate.test.js","sourceRoot":"","sources":["../src/verification-gate.test.ts"],"names":[],"mappings":"AAAA,gDAAgD;AAChD,sCAAsC;AAEtC,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAC9C,OAAO,EACL,2BAA2B,EAC3B,wBAAwB,EACxB,eAAe,EACf,oBAAoB,GACrB,MAAM,wBAAwB,CAAC;AAEhC,QAAQ,CAAC,mBAAmB,EAAE,GAAG,EAAE;IACjC,EAAE,CAAC,8BAA8B,EAAE,GAAG,EAAE;QACtC,MAAM,KAAK,GAAG,2BAA2B,EAAE,CAAC;QAC5C,eAAe,CAAC,KAAK,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;QACzD,MAAM,CAAC,oBAAoB,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAClD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,iDAAiD,EAAE,GAAG,EAAE;QACzD,MAAM,KAAK,GAAG,2BAA2B,EAAE,CAAC;QAC5C,eAAe,CAAC,KAAK,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC,CAAC;QAC5D,MAAM,CAAC,oBAAoB,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC/C,eAAe,CAAC,KAAK,EAAE;YACrB,IAAI,EAAE,aAAa;YACnB,MAAM,EAAE,MAAM;YACd,sBAAsB,EAAE,IAAI;YAC5B,mBAAmB,EAAE,IAAI;SAC1B,CAAC,CAAC;QACH,MAAM,CAAC,oBAAoB,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAClD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,qCAAqC,EAAE,GAAG,EAAE;QAC7C,MAAM,KAAK,GAAG,2BAA2B,EAAE,CAAC;QAC5C,eAAe,CAAC,KAAK,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC,CAAC;QAC5D,eAAe,CAAC,KAAK,EAAE;YACrB,IAAI,EAAE,aAAa;YACnB,MAAM,EAAE,MAAM;YACd,sBAAsB,EAAE,IAAI;YAC5B,mBAAmB,EAAE,IAAI;SAC1B,CAAC,CAAC;QACH,eAAe,CAAC,KAAK,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC,CAAC;QAC3D,MAAM,CAAC,oBAAoB,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACjD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,qCAAqC,EAAE,GAAG,EAAE;QAC7C,MAAM,KAAK,GAAG,2BAA2B,EAAE,CAAC;QAC5C,eAAe,CAAC,KAAK,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC,CAAC;QAC5D,wBAAwB,CAAC,KAAK,CAAC,CAAC;QAChC,MAAM,CAAC,oBAAoB,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAClD,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -0,0 +1,33 @@
1
+ import { type ApprovalResponse, type TaskRecord, type WorkflowDefinition, type WorkflowEvent, type WorkflowRun } from "@melra/protocol";
2
+ import { SqliteStore } from "@melra/storage-sqlite";
3
+ import { PayloadCipher } from "./payload-cipher.js";
4
+ import { TaskController } from "./task-controller.js";
5
+ export interface WorkflowAdvanceResult {
6
+ run: WorkflowRun;
7
+ tasks: TaskRecord[];
8
+ events: WorkflowEvent[];
9
+ }
10
+ export declare class WorkflowController {
11
+ private readonly store;
12
+ private readonly tasks;
13
+ private readonly payloadCipher;
14
+ private readonly advances;
15
+ constructor(store: SqliteStore, tasks: TaskController, payloadCipher: PayloadCipher);
16
+ plan(definition: WorkflowDefinition): WorkflowRun;
17
+ status(workflowId: string): WorkflowRun;
18
+ events(workflowId: string, afterSequence?: number): WorkflowEvent[];
19
+ advance(workflowId: string, approvals?: ApprovalResponse[]): Promise<WorkflowAdvanceResult>;
20
+ private advanceOnce;
21
+ recoverInterrupted(): Promise<WorkflowRun[]>;
22
+ cancel(workflowId: string): WorkflowRun;
23
+ private transition;
24
+ private loadDefinition;
25
+ private replay;
26
+ private advanceNode;
27
+ private runTask;
28
+ private runSequential;
29
+ private runParallel;
30
+ private runLoop;
31
+ private deriveStatus;
32
+ }
33
+ //# sourceMappingURL=workflow-controller.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"workflow-controller.d.ts","sourceRoot":"","sources":["../src/workflow-controller.ts"],"names":[],"mappings":"AAIA,OAAO,EAKL,KAAK,gBAAgB,EACrB,KAAK,UAAU,EAEf,KAAK,kBAAkB,EACvB,KAAK,aAAa,EAGlB,KAAK,WAAW,EACjB,MAAM,iBAAiB,CAAC;AAMzB,OAAO,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AACpD,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACpD,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAYtD,MAAM,WAAW,qBAAqB;IACpC,GAAG,EAAE,WAAW,CAAC;IACjB,KAAK,EAAE,UAAU,EAAE,CAAC;IACpB,MAAM,EAAE,aAAa,EAAE,CAAC;CACzB;AAeD,qBAAa,kBAAkB;IAM3B,OAAO,CAAC,QAAQ,CAAC,KAAK;IACtB,OAAO,CAAC,QAAQ,CAAC,KAAK;IACtB,OAAO,CAAC,QAAQ,CAAC,aAAa;IALhC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAqD;gBAG3D,KAAK,EAAE,WAAW,EAClB,KAAK,EAAE,cAAc,EACrB,aAAa,EAAE,aAAa;IAG/C,IAAI,CAAC,UAAU,EAAE,kBAAkB,GAAG,WAAW;IAiDjD,MAAM,CAAC,UAAU,EAAE,MAAM,GAAG,WAAW;IAMvC,MAAM,CAAC,UAAU,EAAE,MAAM,EAAE,aAAa,SAAI,GAAG,aAAa,EAAE;IAKxD,OAAO,CACX,UAAU,EAAE,MAAM,EAClB,SAAS,GAAE,gBAAgB,EAAO,GACjC,OAAO,CAAC,qBAAqB,CAAC;YAoBnB,WAAW;IAiKnB,kBAAkB,IAAI,OAAO,CAAC,WAAW,EAAE,CAAC;IA0ElD,MAAM,CAAC,UAAU,EAAE,MAAM,GAAG,WAAW;IA+BvC,OAAO,CAAC,UAAU;IAmClB,OAAO,CAAC,cAAc;IActB,OAAO,CAAC,MAAM;YAmBA,WAAW;YAiHX,OAAO;YAwCP,aAAa;YA+Bb,WAAW;YAmCX,OAAO;IAwDrB,OAAO,CAAC,YAAY;CA4CrB"}