@melra/runtime-core 0.3.0-alpha.4 → 0.3.0-alpha.6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +45 -0
- package/dist/circuit-breaker.d.ts +35 -0
- package/dist/circuit-breaker.d.ts.map +1 -0
- package/dist/circuit-breaker.js +56 -0
- package/dist/circuit-breaker.js.map +1 -0
- package/dist/circuit-breaker.test.d.ts +2 -0
- package/dist/circuit-breaker.test.d.ts.map +1 -0
- package/dist/circuit-breaker.test.js +51 -0
- package/dist/circuit-breaker.test.js.map +1 -0
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -0
- package/dist/index.js.map +1 -1
- package/dist/task-controller.d.ts +11 -3
- package/dist/task-controller.d.ts.map +1 -1
- package/dist/task-controller.js +43 -3
- package/dist/task-controller.js.map +1 -1
- package/dist/task-controller.test.js +64 -0
- package/dist/task-controller.test.js.map +1 -1
- package/dist/workflow-controller.d.ts +10 -3
- package/dist/workflow-controller.d.ts.map +1 -1
- package/dist/workflow-controller.js +175 -9
- package/dist/workflow-controller.js.map +1 -1
- package/dist/workflow-controller.test.js +144 -0
- package/dist/workflow-controller.test.js.map +1 -1
- package/dist/workflow-events.d.ts.map +1 -1
- package/dist/workflow-events.js +11 -2
- package/dist/workflow-events.js.map +1 -1
- package/package.json +6 -6
package/README.md
ADDED
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
# @melra/runtime-core
|
|
2
|
+
|
|
3
|
+
The execution core of [MELRA](https://github.com/XAGI-Lab/melra): the task
|
|
4
|
+
controller, the durable workflow controller, verification gating, retry rules,
|
|
5
|
+
and the payload cipher.
|
|
6
|
+
|
|
7
|
+
```bash
|
|
8
|
+
npm install @melra/runtime-core
|
|
9
|
+
```
|
|
10
|
+
|
|
11
|
+
`TaskController` owns the pipeline. `plan()` classifies the operation, evaluates
|
|
12
|
+
policy, persists a `TaskRecord`, and returns any approval challenge — it never
|
|
13
|
+
executes. `execute()` re-evaluates policy, validates the approval, runs the
|
|
14
|
+
adapter under an `AbortSignal` armed with the duration budget, then verifies.
|
|
15
|
+
|
|
16
|
+
Verification decides success, not the adapter. A task reaches
|
|
17
|
+
`verified_success` only when the adapter succeeded *and* every declared evidence
|
|
18
|
+
predicate passed; an adapter that reported success with failing evidence is
|
|
19
|
+
`partial`. Retries apply to `read` effects only — mutations and destructive
|
|
20
|
+
operations run at most once, because a retried delete is a second delete.
|
|
21
|
+
|
|
22
|
+
`WorkflowController` layers a bounded graph over that same pipeline. Nine node
|
|
23
|
+
types (`operation`, `approval`, `condition`, `parallel`, `bounded_loop`,
|
|
24
|
+
`checkpoint`, `compensation`, `human_input`, `delegation`), and every node that
|
|
25
|
+
does work goes through `TaskController` — so policy, approvals, verification, and
|
|
26
|
+
receipts are never bypassed by being inside a workflow.
|
|
27
|
+
|
|
28
|
+
Workflow durability, briefly:
|
|
29
|
+
|
|
30
|
+
- Dependency cycles are rejected at plan time, so `advance` can assume a finite
|
|
31
|
+
graph. Loop bounds are capped by the schema and enforced by an iteration guard.
|
|
32
|
+
- Concurrent advances for one workflow serialize before any adapter runs, and a
|
|
33
|
+
cross-process lease keeps a second server from advancing the same workflow.
|
|
34
|
+
- Effects are deduplicated across restarts by idempotency key. Recovery replays
|
|
35
|
+
committed work rather than rerunning adapters, so a task that committed before
|
|
36
|
+
its projection was written is recovered, not re-executed.
|
|
37
|
+
- Events are append-only and ordered; projections and snapshots are derived. Read
|
|
38
|
+
state through `status()`/`events()`.
|
|
39
|
+
- Definitions and adapter results are sealed with AES-256-GCM bound to record
|
|
40
|
+
identity and purpose.
|
|
41
|
+
|
|
42
|
+
Requires Node.js 22 or newer. Full documentation:
|
|
43
|
+
[github.com/XAGI-Lab/melra](https://github.com/XAGI-Lab/melra)
|
|
44
|
+
|
|
45
|
+
Apache-2.0
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
export interface CircuitBreakerOptions {
|
|
2
|
+
threshold: number;
|
|
3
|
+
cooldownMs: number;
|
|
4
|
+
}
|
|
5
|
+
/**
|
|
6
|
+
* Consecutive-failure breaker keyed on the target an operation names.
|
|
7
|
+
*
|
|
8
|
+
* `budget.maxRetries` covers a blip inside one task and nothing carried further:
|
|
9
|
+
* a workflow whose node keeps failing against the same host, file, or command
|
|
10
|
+
* would spend every remaining step rediscovering that. One breaker instance is
|
|
11
|
+
* shared by the whole controller, so tasks that are unrelated except for their
|
|
12
|
+
* target still trip it together, and a workflow's nodes inherit it because they
|
|
13
|
+
* run through that same controller.
|
|
14
|
+
*
|
|
15
|
+
* `check` reports without recording; `recordFailure` and `recordSuccess` are the
|
|
16
|
+
* writes. Only a failure to reach the target counts. A `partial` clears the
|
|
17
|
+
* count like a success does — the adapter reached the target and the evidence
|
|
18
|
+
* disagreed, which is a verification problem, not an unreachable target — and a
|
|
19
|
+
* cancellation counts neither way, being the operator's doing.
|
|
20
|
+
*
|
|
21
|
+
* ponytail: in-memory, per process. A breaker is a live health signal, so a
|
|
22
|
+
* restart starting closed is the honest default; persist it if operators start
|
|
23
|
+
* asking why a fresh process retries a target they know is down.
|
|
24
|
+
*/
|
|
25
|
+
export declare class CircuitBreaker {
|
|
26
|
+
private readonly options;
|
|
27
|
+
private readonly clock;
|
|
28
|
+
private readonly failures;
|
|
29
|
+
constructor(options: CircuitBreakerOptions, clock?: () => number);
|
|
30
|
+
/** `undefined` when the target may be attempted, else the reason it may not. */
|
|
31
|
+
check(target: string): string | undefined;
|
|
32
|
+
recordFailure(target: string): void;
|
|
33
|
+
recordSuccess(target: string): void;
|
|
34
|
+
}
|
|
35
|
+
//# sourceMappingURL=circuit-breaker.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"circuit-breaker.d.ts","sourceRoot":"","sources":["../src/circuit-breaker.ts"],"names":[],"mappings":"AAGA,MAAM,WAAW,qBAAqB;IACpC,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED;;;;;;;;;;;;;;;;;;;GAmBG;AACH,qBAAa,cAAc;IAIvB,OAAO,CAAC,QAAQ,CAAC,OAAO;IACxB,OAAO,CAAC,QAAQ,CAAC,KAAK;IAJxB,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAA0D;gBAGhE,OAAO,EAAE,qBAAqB,EAC9B,KAAK,GAAE,MAAM,MAAiB;IAGjD,gFAAgF;IAChF,KAAK,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS;IAazC,aAAa,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI;IAMnC,aAAa,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI;CAGpC"}
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
// Copyright 2026 XAGI Labs Private Limited
|
|
2
|
+
// SPDX-License-Identifier: Apache-2.0
|
|
3
|
+
/**
|
|
4
|
+
* Consecutive-failure breaker keyed on the target an operation names.
|
|
5
|
+
*
|
|
6
|
+
* `budget.maxRetries` covers a blip inside one task and nothing carried further:
|
|
7
|
+
* a workflow whose node keeps failing against the same host, file, or command
|
|
8
|
+
* would spend every remaining step rediscovering that. One breaker instance is
|
|
9
|
+
* shared by the whole controller, so tasks that are unrelated except for their
|
|
10
|
+
* target still trip it together, and a workflow's nodes inherit it because they
|
|
11
|
+
* run through that same controller.
|
|
12
|
+
*
|
|
13
|
+
* `check` reports without recording; `recordFailure` and `recordSuccess` are the
|
|
14
|
+
* writes. Only a failure to reach the target counts. A `partial` clears the
|
|
15
|
+
* count like a success does — the adapter reached the target and the evidence
|
|
16
|
+
* disagreed, which is a verification problem, not an unreachable target — and a
|
|
17
|
+
* cancellation counts neither way, being the operator's doing.
|
|
18
|
+
*
|
|
19
|
+
* ponytail: in-memory, per process. A breaker is a live health signal, so a
|
|
20
|
+
* restart starting closed is the honest default; persist it if operators start
|
|
21
|
+
* asking why a fresh process retries a target they know is down.
|
|
22
|
+
*/
|
|
23
|
+
export class CircuitBreaker {
|
|
24
|
+
options;
|
|
25
|
+
clock;
|
|
26
|
+
failures = new Map();
|
|
27
|
+
constructor(options, clock = Date.now) {
|
|
28
|
+
this.options = options;
|
|
29
|
+
this.clock = clock;
|
|
30
|
+
}
|
|
31
|
+
/** `undefined` when the target may be attempted, else the reason it may not. */
|
|
32
|
+
check(target) {
|
|
33
|
+
if (this.options.threshold <= 0)
|
|
34
|
+
return undefined;
|
|
35
|
+
const state = this.failures.get(target);
|
|
36
|
+
if (state === undefined || state.count < this.options.threshold) {
|
|
37
|
+
return undefined;
|
|
38
|
+
}
|
|
39
|
+
// Past the cooldown the next attempt is allowed through as the trial. The
|
|
40
|
+
// count is deliberately left alone: if the trial fails, `recordFailure`
|
|
41
|
+
// re-opens immediately rather than granting another `threshold` attempts.
|
|
42
|
+
if (this.clock() - state.openedAt >= this.options.cooldownMs)
|
|
43
|
+
return undefined;
|
|
44
|
+
return `circuit_open:${target}`;
|
|
45
|
+
}
|
|
46
|
+
recordFailure(target) {
|
|
47
|
+
if (this.options.threshold <= 0)
|
|
48
|
+
return;
|
|
49
|
+
const count = (this.failures.get(target)?.count ?? 0) + 1;
|
|
50
|
+
this.failures.set(target, { count, openedAt: this.clock() });
|
|
51
|
+
}
|
|
52
|
+
recordSuccess(target) {
|
|
53
|
+
this.failures.delete(target);
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
//# sourceMappingURL=circuit-breaker.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"circuit-breaker.js","sourceRoot":"","sources":["../src/circuit-breaker.ts"],"names":[],"mappings":"AAAA,2CAA2C;AAC3C,sCAAsC;AAOtC;;;;;;;;;;;;;;;;;;;GAmBG;AACH,MAAM,OAAO,cAAc;IAIN;IACA;IAJF,QAAQ,GAAG,IAAI,GAAG,EAA+C,CAAC;IAEnF,YACmB,OAA8B,EAC9B,QAAsB,IAAI,CAAC,GAAG;QAD9B,YAAO,GAAP,OAAO,CAAuB;QAC9B,UAAK,GAAL,KAAK,CAAyB;IAC9C,CAAC;IAEJ,gFAAgF;IAChF,KAAK,CAAC,MAAc;QAClB,IAAI,IAAI,CAAC,OAAO,CAAC,SAAS,IAAI,CAAC;YAAE,OAAO,SAAS,CAAC;QAClD,MAAM,KAAK,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;QACxC,IAAI,KAAK,KAAK,SAAS,IAAI,KAAK,CAAC,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,CAAC;YAChE,OAAO,SAAS,CAAC;QACnB,CAAC;QACD,0EAA0E;QAC1E,wEAAwE;QACxE,0EAA0E;QAC1E,IAAI,IAAI,CAAC,KAAK,EAAE,GAAG,KAAK,CAAC,QAAQ,IAAI,IAAI,CAAC,OAAO,CAAC,UAAU;YAAE,OAAO,SAAS,CAAC;QAC/E,OAAO,gBAAgB,MAAM,EAAE,CAAC;IAClC,CAAC;IAED,aAAa,CAAC,MAAc;QAC1B,IAAI,IAAI,CAAC,OAAO,CAAC,SAAS,IAAI,CAAC;YAAE,OAAO;QACxC,MAAM,KAAK,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,KAAK,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC;QAC1D,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,MAAM,EAAE,EAAE,KAAK,EAAE,QAAQ,EAAE,IAAI,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;IAC/D,CAAC;IAED,aAAa,CAAC,MAAc;QAC1B,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;IAC/B,CAAC;CACF"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"circuit-breaker.test.d.ts","sourceRoot":"","sources":["../src/circuit-breaker.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
// Copyright 2026 XAGI Labs Private Limited
|
|
2
|
+
// SPDX-License-Identifier: Apache-2.0
|
|
3
|
+
import { describe, expect, it } from "vitest";
|
|
4
|
+
import { CircuitBreaker } from "./circuit-breaker.js";
|
|
5
|
+
describe("CircuitBreaker", () => {
|
|
6
|
+
const at = (start) => {
|
|
7
|
+
let clock = start;
|
|
8
|
+
return {
|
|
9
|
+
advance: (ms) => {
|
|
10
|
+
clock += ms;
|
|
11
|
+
},
|
|
12
|
+
now: () => clock,
|
|
13
|
+
};
|
|
14
|
+
};
|
|
15
|
+
it("opens on consecutive failures against one target and leaves others alone", () => {
|
|
16
|
+
const clock = at(1_000);
|
|
17
|
+
const breaker = new CircuitBreaker({ threshold: 2, cooldownMs: 500 }, clock.now);
|
|
18
|
+
breaker.recordFailure("https://down.example");
|
|
19
|
+
expect(breaker.check("https://down.example")).toBeUndefined();
|
|
20
|
+
breaker.recordFailure("https://down.example");
|
|
21
|
+
expect(breaker.check("https://down.example")).toBe("circuit_open:https://down.example");
|
|
22
|
+
// Keyed on the target, so an unrelated task is not punished for it.
|
|
23
|
+
expect(breaker.check("https://up.example")).toBeUndefined();
|
|
24
|
+
breaker.recordSuccess("https://down.example");
|
|
25
|
+
expect(breaker.check("https://down.example")).toBeUndefined();
|
|
26
|
+
});
|
|
27
|
+
it("lets one trial through after the cooldown and re-opens if it fails", () => {
|
|
28
|
+
const clock = at(1_000);
|
|
29
|
+
const breaker = new CircuitBreaker({ threshold: 2, cooldownMs: 500 }, clock.now);
|
|
30
|
+
breaker.recordFailure("target");
|
|
31
|
+
breaker.recordFailure("target");
|
|
32
|
+
clock.advance(500);
|
|
33
|
+
expect(breaker.check("target")).toBeUndefined();
|
|
34
|
+
// The trial fails. Without keeping the count, this would hand out another
|
|
35
|
+
// full `threshold` attempts every cooldown instead of re-opening at once.
|
|
36
|
+
breaker.recordFailure("target");
|
|
37
|
+
expect(breaker.check("target")).toBe("circuit_open:target");
|
|
38
|
+
clock.advance(500);
|
|
39
|
+
expect(breaker.check("target")).toBeUndefined();
|
|
40
|
+
breaker.recordSuccess("target");
|
|
41
|
+
breaker.recordFailure("target");
|
|
42
|
+
expect(breaker.check("target")).toBeUndefined();
|
|
43
|
+
});
|
|
44
|
+
it("does nothing at all when switched off", () => {
|
|
45
|
+
const breaker = new CircuitBreaker({ threshold: 0, cooldownMs: 500 });
|
|
46
|
+
for (let index = 0; index < 10; index += 1)
|
|
47
|
+
breaker.recordFailure("target");
|
|
48
|
+
expect(breaker.check("target")).toBeUndefined();
|
|
49
|
+
});
|
|
50
|
+
});
|
|
51
|
+
//# sourceMappingURL=circuit-breaker.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"circuit-breaker.test.js","sourceRoot":"","sources":["../src/circuit-breaker.test.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
CHANGED
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAGA,cAAc,kBAAkB,CAAC;AACjC,cAAc,qBAAqB,CAAC;AACpC,cAAc,sBAAsB,CAAC;AACrC,cAAc,wBAAwB,CAAC;AACvC,cAAc,0BAA0B,CAAC;AACzC,cAAc,sBAAsB,CAAC;AACrC,cAAc,qBAAqB,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAGA,cAAc,sBAAsB,CAAC;AACrC,cAAc,kBAAkB,CAAC;AACjC,cAAc,qBAAqB,CAAC;AACpC,cAAc,sBAAsB,CAAC;AACrC,cAAc,wBAAwB,CAAC;AACvC,cAAc,0BAA0B,CAAC;AACzC,cAAc,sBAAsB,CAAC;AACrC,cAAc,qBAAqB,CAAC"}
|
package/dist/index.js
CHANGED
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,2CAA2C;AAC3C,sCAAsC;AAEtC,cAAc,kBAAkB,CAAC;AACjC,cAAc,qBAAqB,CAAC;AACpC,cAAc,sBAAsB,CAAC;AACrC,cAAc,wBAAwB,CAAC;AACvC,cAAc,0BAA0B,CAAC;AACzC,cAAc,sBAAsB,CAAC;AACrC,cAAc,qBAAqB,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,2CAA2C;AAC3C,sCAAsC;AAEtC,cAAc,sBAAsB,CAAC;AACrC,cAAc,kBAAkB,CAAC;AACjC,cAAc,qBAAqB,CAAC;AACpC,cAAc,sBAAsB,CAAC;AACrC,cAAc,wBAAwB,CAAC;AACvC,cAAc,0BAA0B,CAAC;AACzC,cAAc,sBAAsB,CAAC;AACrC,cAAc,qBAAqB,CAAC"}
|
|
@@ -1,8 +1,9 @@
|
|
|
1
|
-
import type { ApprovalResponse, EvidencePredicate, Operation, PolicyDecision, TaskRecord, TaskRequest } from "@melra/protocol";
|
|
1
|
+
import type { ApprovalResponse, EffectContract, EvidencePredicate, Operation, PolicyDecision, TaskRecord, TaskRequest } from "@melra/protocol";
|
|
2
2
|
import { type LocalPolicy } from "@melra/policy-core";
|
|
3
3
|
import { type ActionReceipt, type EvidenceItem, type ExecutionCertificate } from "@melra/receipt-schema";
|
|
4
4
|
import { SqliteStore } from "@melra/storage-sqlite";
|
|
5
5
|
import { Verifier } from "@melra/verifier-core";
|
|
6
|
+
import { CircuitBreaker } from "./circuit-breaker.js";
|
|
6
7
|
import { PayloadCipher } from "./payload-cipher.js";
|
|
7
8
|
export interface OperationExecutor {
|
|
8
9
|
capabilities?(): ReadonlySet<Operation["kind"]>;
|
|
@@ -25,8 +26,11 @@ export declare class TaskController {
|
|
|
25
26
|
private readonly verifier;
|
|
26
27
|
private readonly payloadCipher;
|
|
27
28
|
private readonly active;
|
|
28
|
-
|
|
29
|
-
|
|
29
|
+
private readonly breaker;
|
|
30
|
+
constructor(store: SqliteStore, policy: LocalPolicy, executor: OperationExecutor, verifier: Verifier, payloadCipher: PayloadCipher, breaker?: CircuitBreaker);
|
|
31
|
+
plan(request: TaskRequest, options?: TaskPlanOptions): TaskRecord & {
|
|
32
|
+
contract: EffectContract;
|
|
33
|
+
};
|
|
30
34
|
preflight(request: TaskRequest): PolicyDecision;
|
|
31
35
|
status(taskId: string): TaskRecord;
|
|
32
36
|
execute(taskId: string, approval?: ApprovalResponse): Promise<ExecutionResult>;
|
|
@@ -35,6 +39,10 @@ export declare class TaskController {
|
|
|
35
39
|
verified: boolean;
|
|
36
40
|
evidence: EvidenceItem[];
|
|
37
41
|
}>;
|
|
42
|
+
verifyStandalone(predicates: EvidencePredicate[]): Promise<{
|
|
43
|
+
verified: boolean;
|
|
44
|
+
evidence: EvidenceItem[];
|
|
45
|
+
}>;
|
|
38
46
|
recoverInterrupted(): Promise<TaskRecord[]>;
|
|
39
47
|
receipts(input: {
|
|
40
48
|
taskId?: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"task-controller.d.ts","sourceRoot":"","sources":["../src/task-controller.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EACV,gBAAgB,EAChB,iBAAiB,EACjB,SAAS,EACT,cAAc,EACd,UAAU,EACV,WAAW,EACZ,MAAM,iBAAiB,CAAC;
|
|
1
|
+
{"version":3,"file":"task-controller.d.ts","sourceRoot":"","sources":["../src/task-controller.ts"],"names":[],"mappings":"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"}
|
package/dist/task-controller.js
CHANGED
|
@@ -1,9 +1,10 @@
|
|
|
1
1
|
// Copyright 2026 XAGI Labs Private Limited
|
|
2
2
|
// SPDX-License-Identifier: Apache-2.0
|
|
3
3
|
import { randomUUID } from "node:crypto";
|
|
4
|
-
import { TaskRequestSchema } from "@melra/protocol";
|
|
4
|
+
import { delegationChain, effectContract, LOCAL_IDENTITY, TaskRequestSchema, } from "@melra/protocol";
|
|
5
5
|
import { classifyOperation, defaultEvidenceFor, evaluatePolicy, validateApproval, } from "@melra/policy-core";
|
|
6
6
|
import { createCertificate, createReceiptId, redactStructuredValue, sha256, } from "@melra/receipt-schema";
|
|
7
|
+
import { CircuitBreaker } from "./circuit-breaker.js";
|
|
7
8
|
function now() {
|
|
8
9
|
return new Date().toISOString();
|
|
9
10
|
}
|
|
@@ -50,12 +51,19 @@ export class TaskController {
|
|
|
50
51
|
verifier;
|
|
51
52
|
payloadCipher;
|
|
52
53
|
active = new Map();
|
|
53
|
-
|
|
54
|
+
breaker;
|
|
55
|
+
constructor(store, policy, executor, verifier, payloadCipher, breaker) {
|
|
54
56
|
this.store = store;
|
|
55
57
|
this.policy = policy;
|
|
56
58
|
this.executor = executor;
|
|
57
59
|
this.verifier = verifier;
|
|
58
60
|
this.payloadCipher = payloadCipher;
|
|
61
|
+
// Unhinged means nothing MELRA judges gets to refuse a call, and a tripped
|
|
62
|
+
// breaker refusing to run is exactly that. `threshold: 0` switches it off at
|
|
63
|
+
// the one place that owns the behaviour rather than branching at each use.
|
|
64
|
+
this.breaker =
|
|
65
|
+
breaker ??
|
|
66
|
+
new CircuitBreaker(policy.unhinged ? { threshold: 0, cooldownMs: 0 } : policy.circuitBreaker);
|
|
59
67
|
}
|
|
60
68
|
plan(request, options = {}) {
|
|
61
69
|
const parsedRequest = withDefaultEvidence(TaskRequestSchema.parse(request));
|
|
@@ -95,7 +103,14 @@ export class TaskController {
|
|
|
95
103
|
if (task.status !== "policy_blocked") {
|
|
96
104
|
this.store.saveTaskPayload(id, this.payloadCipher.seal(parsedRequest, `task:${id}:request`), timestamp);
|
|
97
105
|
}
|
|
98
|
-
|
|
106
|
+
// The plaintext request goes back to the caller with the contract derived
|
|
107
|
+
// from it, so what a caller reads before approving is the same object the
|
|
108
|
+
// execution path will load.
|
|
109
|
+
const planned = { ...task, request: parsedRequest };
|
|
110
|
+
return {
|
|
111
|
+
...planned,
|
|
112
|
+
contract: effectContract(planned, classifyOperation(parsedRequest.operation)),
|
|
113
|
+
};
|
|
99
114
|
}
|
|
100
115
|
preflight(request) {
|
|
101
116
|
const parsed = withDefaultEvidence(TaskRequestSchema.parse(request));
|
|
@@ -163,7 +178,15 @@ export class TaskController {
|
|
|
163
178
|
const classified = classifyOperation(request.operation);
|
|
164
179
|
let timeout;
|
|
165
180
|
let budgetExhausted = false;
|
|
181
|
+
let shortCircuited = false;
|
|
166
182
|
try {
|
|
183
|
+
const opened = this.breaker.check(classified.target);
|
|
184
|
+
if (opened !== undefined) {
|
|
185
|
+
// Thrown rather than returned early so the refusal still produces the
|
|
186
|
+
// receipt and certificate every other terminal outcome produces.
|
|
187
|
+
shortCircuited = true;
|
|
188
|
+
throw new Error(opened);
|
|
189
|
+
}
|
|
167
190
|
timeout = setTimeout(() => {
|
|
168
191
|
budgetExhausted = true;
|
|
169
192
|
controller.abort(new Error("task_budget_exhausted"));
|
|
@@ -177,6 +200,10 @@ export class TaskController {
|
|
|
177
200
|
this.store.saveTaskExecutionResult(task, this.payloadCipher.seal(result, `task:${task.id}:result`));
|
|
178
201
|
const verification = await this.verifier.verify(request.requiredEvidence, result);
|
|
179
202
|
const actionSucceeded = result.success === undefined || result.success === true;
|
|
203
|
+
if (actionSucceeded)
|
|
204
|
+
this.breaker.recordSuccess(classified.target);
|
|
205
|
+
else
|
|
206
|
+
this.breaker.recordFailure(classified.target);
|
|
180
207
|
const evidence = request.requiredEvidence.length === 0
|
|
181
208
|
? [
|
|
182
209
|
{
|
|
@@ -215,6 +242,12 @@ export class TaskController {
|
|
|
215
242
|
const rawMessage = error instanceof Error ? error.message : String(error);
|
|
216
243
|
const message = redactStructuredValue(rawMessage).value;
|
|
217
244
|
const aborted = controller.signal.aborted;
|
|
245
|
+
// A refusal by the breaker is not fresh evidence about the target, and an
|
|
246
|
+
// operator's cancellation is not evidence about it at all. A budget that
|
|
247
|
+
// ran out is: the target did not answer in time.
|
|
248
|
+
if (!shortCircuited && (!aborted || budgetExhausted)) {
|
|
249
|
+
this.breaker.recordFailure(classified.target);
|
|
250
|
+
}
|
|
218
251
|
task.status = aborted
|
|
219
252
|
? budgetExhausted
|
|
220
253
|
? "budget_exhausted"
|
|
@@ -263,6 +296,12 @@ export class TaskController {
|
|
|
263
296
|
: this.payloadCipher.open(sealed, `task:${taskId}:result`);
|
|
264
297
|
return await this.verifier.verify(predicates, result);
|
|
265
298
|
}
|
|
299
|
+
// Verify predicates with no task behind them. A delegation node claims work
|
|
300
|
+
// happened somewhere MELRA did not run it; the claim is only worth what the
|
|
301
|
+
// evidence proves, so it goes through the same verifier as everything else.
|
|
302
|
+
async verifyStandalone(predicates) {
|
|
303
|
+
return await this.verifier.verify(predicates, {});
|
|
304
|
+
}
|
|
266
305
|
async recoverInterrupted() {
|
|
267
306
|
const recovered = [];
|
|
268
307
|
for (const task of this.store.listInterruptedTasks()) {
|
|
@@ -340,6 +379,7 @@ export class TaskController {
|
|
|
340
379
|
receiptId: createReceiptId(),
|
|
341
380
|
taskId: task.id,
|
|
342
381
|
capability,
|
|
382
|
+
principal: delegationChain(request.identity ?? LOCAL_IDENTITY),
|
|
343
383
|
effect,
|
|
344
384
|
policyDecision: {
|
|
345
385
|
outcome: task.policyDecision.outcome,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"task-controller.js","sourceRoot":"","sources":["../src/task-controller.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"task-controller.js","sourceRoot":"","sources":["../src/task-controller.ts"],"names":[],"mappings":"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"}
|
|
@@ -8,6 +8,7 @@ import { TaskRequestSchema, } from "@melra/protocol";
|
|
|
8
8
|
import { createDefaultPolicy } from "@melra/policy-core";
|
|
9
9
|
import { SqliteStore } from "@melra/storage-sqlite";
|
|
10
10
|
import { Verifier } from "@melra/verifier-core";
|
|
11
|
+
import { CircuitBreaker } from "./circuit-breaker.js";
|
|
11
12
|
import { PayloadCipher } from "./payload-cipher.js";
|
|
12
13
|
import { TaskController } from "./task-controller.js";
|
|
13
14
|
const roots = [];
|
|
@@ -325,6 +326,37 @@ describe("TaskController", () => {
|
|
|
325
326
|
expect(task.status).toBe("policy_blocked");
|
|
326
327
|
expect(task.policyDecision.reason).toBe("mutation_requires_evidence");
|
|
327
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
|
+
});
|
|
328
360
|
it("retries bounded read failures but never loops indefinitely", async () => {
|
|
329
361
|
let attempts = 0;
|
|
330
362
|
const { controller } = await setup({
|
|
@@ -419,4 +451,36 @@ describe("TaskController", () => {
|
|
|
419
451
|
expect(execution.task.status).toBe("verified_success");
|
|
420
452
|
});
|
|
421
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
|
+
});
|
|
422
486
|
//# sourceMappingURL=task-controller.test.js.map
|