@melra/runtime-core 0.3.0-alpha.10 → 0.3.0-alpha.12

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 (41) hide show
  1. package/dist/task-controller.d.ts +41 -1
  2. package/dist/task-controller.d.ts.map +1 -1
  3. package/dist/task-controller.js +202 -32
  4. package/dist/task-controller.js.map +1 -1
  5. package/dist/workflow-controller.d.ts +12 -0
  6. package/dist/workflow-controller.d.ts.map +1 -1
  7. package/dist/workflow-controller.js +95 -11
  8. package/dist/workflow-controller.js.map +1 -1
  9. package/package.json +8 -8
  10. package/dist/circuit-breaker.test.d.ts +0 -2
  11. package/dist/circuit-breaker.test.d.ts.map +0 -1
  12. package/dist/circuit-breaker.test.js +0 -51
  13. package/dist/circuit-breaker.test.js.map +0 -1
  14. package/dist/payload-cipher.test.d.ts +0 -2
  15. package/dist/payload-cipher.test.d.ts.map +0 -1
  16. package/dist/payload-cipher.test.js +0 -33
  17. package/dist/payload-cipher.test.js.map +0 -1
  18. package/dist/retry-guard.test.d.ts +0 -2
  19. package/dist/retry-guard.test.d.ts.map +0 -1
  20. package/dist/retry-guard.test.js +0 -45
  21. package/dist/retry-guard.test.js.map +0 -1
  22. package/dist/task-controller.test.d.ts +0 -2
  23. package/dist/task-controller.test.d.ts.map +0 -1
  24. package/dist/task-controller.test.js +0 -486
  25. package/dist/task-controller.test.js.map +0 -1
  26. package/dist/verification-gate.test.d.ts +0 -2
  27. package/dist/verification-gate.test.d.ts.map +0 -1
  28. package/dist/verification-gate.test.js +0 -42
  29. package/dist/verification-gate.test.js.map +0 -1
  30. package/dist/workflow-controller.test.d.ts +0 -2
  31. package/dist/workflow-controller.test.d.ts.map +0 -1
  32. package/dist/workflow-controller.test.js +0 -785
  33. package/dist/workflow-controller.test.js.map +0 -1
  34. package/dist/workflow-events.test.d.ts +0 -2
  35. package/dist/workflow-events.test.d.ts.map +0 -1
  36. package/dist/workflow-events.test.js +0 -113
  37. package/dist/workflow-events.test.js.map +0 -1
  38. package/dist/workflow-graph.test.d.ts +0 -2
  39. package/dist/workflow-graph.test.d.ts.map +0 -1
  40. package/dist/workflow-graph.test.js +0 -169
  41. package/dist/workflow-graph.test.js.map +0 -1
@@ -1,486 +0,0 @@
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 { CircuitBreaker } from "./circuit-breaker.js";
12
- import { PayloadCipher } from "./payload-cipher.js";
13
- import { TaskController } from "./task-controller.js";
14
- const roots = [];
15
- const stores = [];
16
- afterEach(async () => {
17
- stores.splice(0).forEach((store) => store.close());
18
- await Promise.all(roots.splice(0).map((root) => rm(root, { recursive: true, force: true })));
19
- });
20
- async function setup(executor = {
21
- async execute() {
22
- return { success: true, stored: true, value: "verified" };
23
- },
24
- }) {
25
- const root = await mkdtemp(join(tmpdir(), "melra-controller-"));
26
- roots.push(root);
27
- const store = new SqliteStore(":memory:");
28
- stores.push(store);
29
- const controller = await createController(store, root, Buffer.alloc(32, 7), executor);
30
- return { controller, store };
31
- }
32
- async function createController(store, root, key, executor) {
33
- return new TaskController(store, createDefaultPolicy(root), executor, await Verifier.create(root), new PayloadCipher(key));
34
- }
35
- describe("TaskController", () => {
36
- it("executes a planned task after restart with the same key", async () => {
37
- const root = await mkdtemp(join(tmpdir(), "melra-controller-restart-"));
38
- roots.push(root);
39
- const databasePath = join(root, "melra.sqlite");
40
- const key = Buffer.alloc(32, 21);
41
- const executor = {
42
- execute: vi.fn(async () => ({ success: true, value: "verified" })),
43
- };
44
- const storeA = new SqliteStore(databasePath);
45
- stores.push(storeA);
46
- const controllerA = await createController(storeA, root, key, executor);
47
- const request = TaskRequestSchema.parse({
48
- goal: "Inspect the runtime after restart",
49
- operation: { kind: "system", action: "info" },
50
- });
51
- const planned = controllerA.plan(request);
52
- storeA.close();
53
- stores.splice(stores.indexOf(storeA), 1);
54
- const storeB = new SqliteStore(databasePath);
55
- stores.push(storeB);
56
- const controllerB = await createController(storeB, root, key, executor);
57
- const result = await controllerB.execute(planned.id);
58
- expect(result.task.status).toBe("verified_success");
59
- expect(executor.execute).toHaveBeenCalledWith(request.operation, expect.any(AbortSignal));
60
- });
61
- it("keeps exact requests out of SQLite and rejects the wrong key", async () => {
62
- const root = await mkdtemp(join(tmpdir(), "melra-controller-sealed-"));
63
- roots.push(root);
64
- const databasePath = join(root, "melra.sqlite");
65
- const storeA = new SqliteStore(databasePath);
66
- stores.push(storeA);
67
- const controllerA = await createController(storeA, root, Buffer.alloc(32, 23), { async execute() { return { success: true }; } });
68
- const planned = controllerA.plan(TaskRequestSchema.parse({
69
- goal: "one-time-secret",
70
- operation: { kind: "system", action: "info" },
71
- }));
72
- storeA.close();
73
- stores.splice(stores.indexOf(storeA), 1);
74
- expect((await readFile(databasePath)).toString()).not.toContain("one-time-secret");
75
- const storeB = new SqliteStore(databasePath);
76
- stores.push(storeB);
77
- const controllerB = await createController(storeB, root, Buffer.alloc(32, 29), { async execute() { return { success: true }; } });
78
- await expect(controllerB.execute(planned.id)).rejects.toThrow("task_payload_authentication_failed");
79
- });
80
- it("verifies an authenticated persisted adapter result", async () => {
81
- const { controller } = await setup();
82
- const planned = controller.plan(TaskRequestSchema.parse({
83
- goal: "Persist a result for later workflow conditions",
84
- operation: { kind: "system", action: "info" },
85
- }));
86
- await controller.execute(planned.id);
87
- await expect(controller.verifyPersisted(planned.id, [
88
- { type: "result_equals", path: "value", value: "verified" },
89
- ])).resolves.toMatchObject({ verified: true });
90
- });
91
- it("preflights installed capabilities without persisting a task", async () => {
92
- const { controller, store } = await setup({
93
- capabilities() {
94
- return new Set(["file"]);
95
- },
96
- async execute() {
97
- return { success: true };
98
- },
99
- });
100
- const request = TaskRequestSchema.parse({
101
- goal: "Require an installed system adapter",
102
- operation: { kind: "system", action: "info" },
103
- });
104
- expect(() => controller.preflight(request)).toThrow("operation_capability_unavailable:system");
105
- expect(store.listTasks()).toEqual([]);
106
- });
107
- it("rejects an approval whose stored action digest no longer matches", async () => {
108
- const { controller, store } = await setup();
109
- const planned = controller.plan(TaskRequestSchema.parse({
110
- goal: "Store a governed memory",
111
- operation: {
112
- kind: "memory",
113
- action: "put",
114
- key: "project",
115
- value: "MELRA",
116
- },
117
- requiredEvidence: [
118
- { type: "result_equals", path: "stored", value: true },
119
- ],
120
- }));
121
- const stored = store.getTask(planned.id);
122
- stored.approval = {
123
- ...stored.approval,
124
- actionDigest: "0".repeat(64),
125
- };
126
- store.saveTask(stored);
127
- await expect(controller.execute(planned.id, {
128
- approvalId: stored.approval.approvalId,
129
- phrase: stored.approval.phrase,
130
- })).rejects.toThrow("approval_action_digest_mismatch");
131
- });
132
- it("uses rechecked policy rather than a stale stored allow decision", async () => {
133
- const execute = vi.fn(async () => ({ success: true, stored: true }));
134
- const { controller, store } = await setup({ execute });
135
- const planned = controller.plan(TaskRequestSchema.parse({
136
- goal: "Store a governed memory",
137
- operation: {
138
- kind: "memory",
139
- action: "put",
140
- key: "project",
141
- value: "MELRA",
142
- },
143
- requiredEvidence: [
144
- { type: "result_equals", path: "stored", value: true },
145
- ],
146
- }));
147
- const stored = store.getTask(planned.id);
148
- stored.policyDecision = {
149
- ...stored.policyDecision,
150
- outcome: "allow",
151
- reason: "stale projection",
152
- };
153
- store.saveTask(stored);
154
- await expect(controller.execute(planned.id)).rejects.toThrow("approval_required");
155
- expect(execute).not.toHaveBeenCalled();
156
- });
157
- it("recovers interrupted reads for retry and quarantines mutations", async () => {
158
- const execute = vi.fn(async () => ({ success: true }));
159
- const { controller, store } = await setup({ execute });
160
- const read = controller.plan(TaskRequestSchema.parse({
161
- goal: "Recover an interrupted read",
162
- operation: { kind: "system", action: "info" },
163
- }));
164
- const mutation = controller.plan(TaskRequestSchema.parse({
165
- goal: "Recover an interrupted mutation",
166
- operation: {
167
- kind: "memory",
168
- action: "put",
169
- key: "project",
170
- value: "MELRA",
171
- },
172
- requiredEvidence: [
173
- { type: "result_equals", path: "stored", value: true },
174
- ],
175
- }));
176
- for (const item of [read, mutation]) {
177
- const stored = store.getTask(item.id);
178
- stored.status = "running";
179
- store.saveTask(stored);
180
- }
181
- const recovered = await controller.recoverInterrupted();
182
- expect(recovered).toHaveLength(2);
183
- expect(store.getTask(read.id)).toMatchObject({
184
- status: "planned",
185
- error: "interrupted_read_ready_for_retry",
186
- });
187
- expect(store.getTask(mutation.id)).toMatchObject({
188
- status: "recovery_required",
189
- error: "interrupted_mutation_requires_reconciliation",
190
- });
191
- expect(execute).not.toHaveBeenCalled();
192
- });
193
- it("reconciles a verifying file mutation from independent evidence", async () => {
194
- const execute = vi.fn(async () => ({ success: true }));
195
- const { controller, store } = await setup({ execute });
196
- const root = roots.at(-1);
197
- const planned = controller.plan(TaskRequestSchema.parse({
198
- goal: "Recover an already completed file write",
199
- operation: {
200
- kind: "file",
201
- action: "write",
202
- path: "recovered.txt",
203
- content: "complete",
204
- },
205
- requiredEvidence: [
206
- { type: "file_exists", path: "recovered.txt" },
207
- ],
208
- }), {
209
- idempotencyKey: "b".repeat(64),
210
- attempt: 1,
211
- });
212
- await writeFile(join(root, "recovered.txt"), "complete");
213
- const interrupted = store.getTask(planned.id);
214
- interrupted.status = "verifying";
215
- store.saveTask(interrupted);
216
- const [recovered] = await controller.recoverInterrupted();
217
- expect(recovered).toMatchObject({
218
- id: planned.id,
219
- status: "verified_success",
220
- });
221
- expect(controller.receipts({ taskId: planned.id }).certificate?.result).toBe("VERIFIED_SUCCESS");
222
- expect(store.getIdempotencyCommit("b".repeat(64))).toMatchObject({
223
- taskId: planned.id,
224
- attempt: 1,
225
- });
226
- expect(execute).not.toHaveBeenCalled();
227
- });
228
- it("prevents an already committed idempotency key from executing again", async () => {
229
- const execute = vi.fn(async () => ({ success: true }));
230
- const { controller } = await setup({ execute });
231
- const request = TaskRequestSchema.parse({
232
- goal: "Run one logical attempt",
233
- operation: { kind: "system", action: "info" },
234
- });
235
- const idempotencyKey = "a".repeat(64);
236
- const first = controller.plan(request, {
237
- idempotencyKey,
238
- attempt: 1,
239
- });
240
- const firstResult = await controller.execute(first.id);
241
- const duplicate = controller.plan(request, {
242
- idempotencyKey,
243
- attempt: 2,
244
- });
245
- const duplicateResult = await controller.execute(duplicate.id);
246
- expect(firstResult.task).toMatchObject({
247
- status: "verified_success",
248
- idempotencyKey,
249
- attempt: 1,
250
- });
251
- expect(duplicateResult.task).toMatchObject({
252
- status: "cancelled",
253
- error: "duplicate_attempt_prevented",
254
- idempotencyKey,
255
- attempt: 2,
256
- });
257
- expect(execute).toHaveBeenCalledTimes(1);
258
- });
259
- it("plans, executes, verifies, and persists a read task", async () => {
260
- const { controller, store } = await setup();
261
- const task = controller.plan(TaskRequestSchema.parse({
262
- goal: "Inspect the system",
263
- operation: { kind: "system", action: "info" },
264
- }));
265
- expect(task.status).toBe("planned");
266
- const execution = await controller.execute(task.id);
267
- expect(execution.task.status).toBe("verified_success");
268
- expect(execution.receipt?.success).toBe(true);
269
- expect(execution.certificate?.result).toBe("VERIFIED_SUCCESS");
270
- expect(store.getReceiptsForTask(task.id)).toHaveLength(1);
271
- });
272
- it("requires the exact approval for mutation", async () => {
273
- const { controller } = await setup();
274
- const task = controller.plan(TaskRequestSchema.parse({
275
- goal: "Store a memory",
276
- operation: {
277
- kind: "memory",
278
- action: "put",
279
- scope: "workspace",
280
- key: "project",
281
- value: "MELRA",
282
- },
283
- requiredEvidence: [
284
- { type: "result_equals", path: "stored", value: true },
285
- ],
286
- }));
287
- expect(task.status).toBe("awaiting_approval");
288
- await expect(controller.execute(task.id)).rejects.toThrow("approval_required");
289
- const result = await controller.execute(task.id, {
290
- approvalId: task.approval.approvalId,
291
- phrase: task.approval.phrase,
292
- });
293
- expect(result.task.status).toBe("verified_success");
294
- });
295
- it("derives evidence for a mutation that declared none", async () => {
296
- const { controller } = await setup();
297
- const task = controller.plan(TaskRequestSchema.parse({
298
- goal: "Write a file",
299
- operation: {
300
- kind: "file",
301
- action: "write",
302
- path: "result.txt",
303
- content: "unsafe",
304
- },
305
- }));
306
- // A write has an obvious post-condition, so the task proceeds to approval
307
- // rather than dead-ending — but it is still held to that post-condition.
308
- expect(task.status).toBe("awaiting_approval");
309
- expect(task.request.requiredEvidence).toEqual([
310
- { type: "file_exists", path: "result.txt" },
311
- ]);
312
- });
313
- it("still blocks a mutation whose evidence cannot be derived", async () => {
314
- const { controller } = await setup();
315
- const task = controller.plan(TaskRequestSchema.parse({
316
- goal: "Run a build",
317
- operation: {
318
- kind: "terminal",
319
- action: "run",
320
- command: "npm",
321
- args: ["run", "build"],
322
- },
323
- }));
324
- // Nothing about the request says what the command should leave behind, so
325
- // the mutation-requires-evidence guarantee still holds.
326
- expect(task.status).toBe("policy_blocked");
327
- expect(task.policyDecision.reason).toBe("mutation_requires_evidence");
328
- });
329
- it("stops calling an adapter that keeps failing, and still receipts the refusal", async () => {
330
- const root = await mkdtemp(join(tmpdir(), "melra-controller-breaker-"));
331
- roots.push(root);
332
- const store = new SqliteStore(":memory:");
333
- stores.push(store);
334
- let calls = 0;
335
- const controller = new TaskController(store, createDefaultPolicy(root), {
336
- async execute() {
337
- calls += 1;
338
- throw new Error("target_unreachable");
339
- },
340
- }, await Verifier.create(root), new PayloadCipher(Buffer.alloc(32, 9)), new CircuitBreaker({ threshold: 2, cooldownMs: 60_000 }));
341
- const run = async () => {
342
- const task = controller.plan(TaskRequestSchema.parse({
343
- goal: "Ask an unreachable target",
344
- operation: { kind: "system", action: "info" },
345
- budget: { maxSteps: 1, maxDurationMs: 5_000, maxRetries: 0 },
346
- }));
347
- return (await controller.execute(task.id)).task;
348
- };
349
- expect((await run()).status).toBe("failed");
350
- expect((await run()).status).toBe("failed");
351
- const refused = await run();
352
- // The point of the breaker: the third task never reaches the adapter.
353
- expect(calls).toBe(2);
354
- expect(refused.status).toBe("failed");
355
- expect(refused.error).toContain("circuit_open:local-system");
356
- // A refusal is still a governed outcome, so it owes the caller the same
357
- // receipt and certificate any other terminal task produces.
358
- expect(controller.receipts({ taskId: refused.id }).receipts).toHaveLength(1);
359
- });
360
- it("retries bounded read failures but never loops indefinitely", async () => {
361
- let attempts = 0;
362
- const { controller } = await setup({
363
- async execute() {
364
- attempts += 1;
365
- if (attempts < 2)
366
- throw new Error("transient_read_failure");
367
- return { success: true };
368
- },
369
- });
370
- const task = controller.plan(TaskRequestSchema.parse({
371
- goal: "Retry one transient read",
372
- operation: { kind: "system", action: "info" },
373
- budget: { maxRetries: 2, maxSteps: 3, maxDurationMs: 5_000 },
374
- }));
375
- const result = await controller.execute(task.id);
376
- expect(result.task.status).toBe("verified_success");
377
- expect(result.task.attempts).toBe(2);
378
- expect(attempts).toBe(2);
379
- });
380
- it("classifies a generic abort error as budget exhaustion when its timer fires", async () => {
381
- const { controller } = await setup({
382
- async execute(_operation, signal) {
383
- await new Promise((_resolve, reject) => {
384
- signal?.addEventListener("abort", () => reject(new Error("The operation was aborted")), { once: true });
385
- });
386
- return { success: true };
387
- },
388
- });
389
- const task = controller.plan(TaskRequestSchema.parse({
390
- goal: "Respect a strict execution budget",
391
- operation: { kind: "system", action: "info" },
392
- budget: { maxRetries: 0, maxSteps: 1, maxDurationMs: 100 },
393
- }));
394
- const result = await controller.execute(task.id);
395
- expect(result.task.status).toBe("budget_exhausted");
396
- expect(result.task.error).toBe("task_budget_exhausted");
397
- expect(result.certificate?.result).toBe("BUDGET_EXHAUSTED");
398
- });
399
- it("redacts executor secrets before task or receipt persistence", async () => {
400
- const { controller, store } = await setup({
401
- async execute() {
402
- return {
403
- success: true,
404
- stored: true,
405
- output: "password=hunter2",
406
- authorization: "Bearer raw-token-value",
407
- };
408
- },
409
- });
410
- const task = controller.plan(TaskRequestSchema.parse({
411
- goal: "Persist only redacted evidence",
412
- operation: { kind: "system", action: "info" },
413
- requiredEvidence: [
414
- { type: "result_equals", path: "stored", value: true },
415
- ],
416
- }));
417
- const result = await controller.execute(task.id);
418
- expect(JSON.stringify(result.task.result)).not.toContain("hunter2");
419
- expect(JSON.stringify(result.receipt?.observedEffect)).not.toContain("raw-token-value");
420
- expect(result.output?.output).toBe("password=hunter2");
421
- expect(result.receipt?.redactions.length).toBeGreaterThan(0);
422
- expect(JSON.stringify(store.getTask(task.id))).not.toContain("hunter2");
423
- });
424
- it("shows the live caller the approval input without retaining it", async () => {
425
- const { controller, store } = await setup({
426
- async execute() {
427
- return { success: true, typed: true };
428
- },
429
- });
430
- const secretInput = "one-time private form value";
431
- const task = controller.plan(TaskRequestSchema.parse({
432
- goal: "Type a reviewed value",
433
- operation: {
434
- kind: "browser",
435
- action: "type",
436
- target: { selector: "#field" },
437
- value: secretInput,
438
- },
439
- requiredEvidence: [
440
- { type: "result_equals", path: "typed", value: true },
441
- ],
442
- }));
443
- expect(task.request.operation.kind === "browser"
444
- ? task.request.operation.value
445
- : undefined).toBe(secretInput);
446
- expect(JSON.stringify(store.getTask(task.id))).not.toContain(secretInput);
447
- const execution = await controller.execute(task.id, {
448
- approvalId: task.approval.approvalId,
449
- phrase: task.approval.phrase,
450
- });
451
- expect(execution.task.status).toBe("verified_success");
452
- });
453
- });
454
- describe("effect contract and principal", () => {
455
- it("returns the contract with the plan and stamps the chain on the receipt", async () => {
456
- const { controller } = await setup();
457
- const identity = {
458
- principal: { kind: "agent", id: "claude-code" },
459
- onBehalfOf: [{ kind: "human", id: "dheeraj" }],
460
- };
461
- const task = controller.plan(TaskRequestSchema.parse({
462
- goal: "Read a file",
463
- operation: { kind: "file", action: "read", path: "notes.txt" },
464
- identity,
465
- }));
466
- expect(task.contract).toMatchObject({
467
- taskId: task.id,
468
- capability: "file.read",
469
- effect: "read",
470
- identity,
471
- metadata: { goal: "Read a file" },
472
- });
473
- const execution = await controller.execute(task.id);
474
- expect(execution.receipt?.principal).toBe("human:dheeraj/agent:claude-code");
475
- });
476
- it("records the local principal when the caller declares none", async () => {
477
- const { controller } = await setup();
478
- const task = controller.plan(TaskRequestSchema.parse({
479
- goal: "Read a file",
480
- operation: { kind: "file", action: "read", path: "notes.txt" },
481
- }));
482
- const execution = await controller.execute(task.id);
483
- expect(execution.receipt?.principal).toBe("agent:local");
484
- });
485
- });
486
- //# sourceMappingURL=task-controller.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"task-controller.test.js","sourceRoot":"","sources":["../src/task-controller.test.ts"],"names":[],"mappings":"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"}
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=verification-gate.test.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"verification-gate.test.d.ts","sourceRoot":"","sources":["../src/verification-gate.test.ts"],"names":[],"mappings":""}
@@ -1,42 +0,0 @@
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
@@ -1 +0,0 @@
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"}
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=workflow-controller.test.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"workflow-controller.test.d.ts","sourceRoot":"","sources":["../src/workflow-controller.test.ts"],"names":[],"mappings":""}