@melra/runtime-core 0.3.0-alpha.14 → 0.3.0-alpha.16

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 CHANGED
@@ -17,7 +17,8 @@ under an `AbortSignal` armed with the duration budget, then verifies.
17
17
  Verification decides success, not the adapter. A task reaches
18
18
  `verified_success` only when the adapter succeeded *and* every declared evidence
19
19
  predicate passed; an adapter that reported success with failing evidence is
20
- `partial`. Retries apply to `read` effects only — mutations and destructive
20
+ `partial`, unless the only unmet evidence is a `semantic` question, which waits
21
+ in `waiting_user` and settles closed at expiry (#54). Retries apply to `read` effects only — mutations and destructive
21
22
  operations run at most once, because a retried delete is a second delete.
22
23
 
23
24
  `WorkflowController` layers a bounded graph over that same pipeline. Nine node
@@ -40,7 +41,7 @@ Workflow durability, briefly:
40
41
  - Definitions and adapter results are sealed with AES-256-GCM bound to record
41
42
  identity and purpose.
42
43
 
43
- Requires Node.js 22 or newer. Full documentation:
44
+ Requires Node.js 22.13 or newer, or 23.4 or newer. Full documentation:
44
45
  [github.com/XAGI-Lab/melra](https://github.com/XAGI-Lab/melra)
45
46
 
46
47
  Apache-2.0
@@ -25,6 +25,16 @@ export interface TaskPlanOptions {
25
25
  */
26
26
  stored?: boolean;
27
27
  }
28
+ /**
29
+ * Fill in `requiredEvidence` for a mutation that declared none.
30
+ *
31
+ * Applied once, where the request is normalized, so the derived predicates flow
32
+ * identically into the policy decision, the sealed payload, the persisted task
33
+ * record, and verification. A caller that declared its own evidence is left
34
+ * untouched — this only replaces an empty list. Exported for `melra policy
35
+ * test`, whose preview must decide on the request the server would.
36
+ */
37
+ export declare function withDefaultEvidence(request: TaskRequest): TaskRequest;
28
38
  /**
29
39
  * A grant's durable draw-down, the way policy wants to read it.
30
40
  *
@@ -40,6 +50,8 @@ export declare class TaskController {
40
50
  private readonly verifier;
41
51
  private readonly payloadCipher;
42
52
  private readonly active;
53
+ /** Each task running here, settled once it has ended (see `settled`). */
54
+ private readonly running;
43
55
  private readonly breaker;
44
56
  /** Whether approvals come only from an operator, out of band. */
45
57
  get enforced(): boolean;
@@ -55,10 +67,12 @@ export declare class TaskController {
55
67
  private readonly capabilityUsage;
56
68
  /**
57
69
  * Draws by tasks between their re-check and their record, per grant and
58
- * task. The durable draw is written only once work is verified, so without
59
- * this two tasks running at once both saw the grant unspent: two operations
60
- * against `maxOperations: 1`, a parallel workflow node overspending
61
- * `dailyMax`.
70
+ * task. The durable draw is written only once the adapter has answered, so
71
+ * without this two tasks running at once both saw the grant unspent: two
72
+ * operations against `maxOperations: 1`, a parallel workflow node
73
+ * overspending `dailyMax`. Let go once the draw is written or the effect is
74
+ * known not to have run; one whose draw failed to write is held until
75
+ * recovery writes it (`drawGrant`).
62
76
  *
63
77
  * ponytail: held in this process. Two servers sharing one database can
64
78
  * still both pass a re-check at the same moment; a durable reservation row
@@ -71,9 +85,25 @@ export declare class TaskController {
71
85
  preflight(request: TaskRequest, options?: {
72
86
  stored?: boolean;
73
87
  }): PolicyDecision;
88
+ /** Refuses a predicate no registered verifier can check, or that it would refuse to. */
89
+ assertVerifiable(predicates: EvidencePredicate[], options?: {
90
+ stored?: boolean;
91
+ }): void;
74
92
  status(taskId: string): TaskRecord;
75
93
  execute(taskId: string, approval?: ApprovalResponse): Promise<ExecutionResult>;
94
+ /**
95
+ * Resolves once a task this controller is running has ended, its outcome
96
+ * recorded: a cancel only signals the adapter to stop. At once for one it
97
+ * is not running.
98
+ */
99
+ settled(taskId: string): Promise<void>;
76
100
  cancel(taskId: string): TaskRecord;
101
+ /**
102
+ * Writes a task out of planned or awaiting_approval, unless a deny or an
103
+ * execute in another process got there after this one read it: that one
104
+ * stands, and this one is refused as it would have been had it read later.
105
+ */
106
+ private leaveUnstarted;
77
107
  verifyPersisted(taskId: string, predicates: EvidencePredicate[]): Promise<{
78
108
  verified: boolean;
79
109
  evidence: EvidenceItem[];
@@ -96,6 +126,16 @@ export declare class TaskController {
96
126
  * provider could not be reached and the task stays exactly where it was.
97
127
  */
98
128
  reconcile(taskId: string): Promise<ExecutionResult>;
129
+ /**
130
+ * Writes a reconcile's answer in one transaction, and only while the task
131
+ * still waits for one. Two reconciles of one task (two melra_execute calls,
132
+ * or the sweep's recovery beside an agent's) each read it parked and ask
133
+ * the provider; written unconditionally, the slower answer, even one that
134
+ * could not reach the provider, overwrote a settle the other had recorded
135
+ * and dropped its receipt. Now the first stands, and the other writes
136
+ * nothing, not even a receipt, and returns the task as it now stands.
137
+ */
138
+ private settleParked;
99
139
  /**
100
140
  * Settle a task as done on evidence gathered after the fact.
101
141
  *
@@ -105,11 +145,51 @@ export declare class TaskController {
105
145
  * or an effect settled this way would be free to run again and free to spend.
106
146
  */
107
147
  private resolveAsVerified;
148
+ /**
149
+ * Draws the grant behind an effect already done, once per task however
150
+ * often asked. Policy is read for the grant id only: this is accounting
151
+ * rather than permission, so a grant that has since run out still pays for
152
+ * what it authorised. Asked as if nothing were drawn, because policy names
153
+ * no grant at all for one that is now exhausted, and the effect then went
154
+ * uncharged. A task that drew one already is left alone: policy read now
155
+ * names the first grant that matches, not the one execute drew once that
156
+ * was spent, and charging it too drew the task twice. Drawn, it lets go
157
+ * of a reservation `execute` held when its own draw failed to write.
158
+ */
159
+ private drawGrant;
160
+ /**
161
+ * Settle a task whose idempotency key is committed to it. A key is
162
+ * committed only once every kernel check held, so whatever stopped the
163
+ * task came after the effect: an interruption, or a write that failed. One
164
+ * with a semantic question commits on entering `waiting_user`, so its
165
+ * commit never says the question was answered: it settles closed, as at
166
+ * expiry (#54).
167
+ */
168
+ private settleCommitted;
108
169
  /**
109
170
  * With `failed`, each task that could not be recovered is recorded there by
110
171
  * id instead of the first failure being thrown at the end.
111
172
  */
112
173
  recoverInterrupted(failed?: Map<string, unknown>): Promise<TaskRecord[]>;
174
+ /**
175
+ * A waiting task whose judgements are past their `expiresAt` settles
176
+ * closed. Re-read and written in one transaction, so a peer settling the
177
+ * same task wins once.
178
+ *
179
+ * ponytail: runs on the startup pass and the 30 s recovery sweep, so a wait
180
+ * can outlive its `expiresAt` by one interval, or until a runtime next opens
181
+ * this data directory; a verdict tool must check `expiresAt` itself.
182
+ */
183
+ private expireJudgements;
184
+ /**
185
+ * No answer is not a yes (#54). A task whose semantic question went
186
+ * unanswered, at expiry or cut off after its commit, settles closed: its
187
+ * effect ran, so a change is `recovery_required` (never `failed`) and a
188
+ * read is `partial`. Nothing runs here, so it writes no receipt: the
189
+ * certificate, replaced, carries the evidence of the task's last one, the
190
+ * live path's or the one recovery wrote.
191
+ */
192
+ private settleUnanswered;
113
193
  private recoverTask;
114
194
  /**
115
195
  * What an approver is shown: the effect contract, minus the challenge and
@@ -163,6 +243,16 @@ export declare class TaskController {
163
243
  receipts: ActionReceipt[];
164
244
  certificate?: ExecutionCertificate;
165
245
  };
246
+ /**
247
+ * A task's certificate, written now for a `verified_success` task whose
248
+ * certificate failed to write after it was recorded: a workflow counts a
249
+ * step done only on its certificate. For a writer of the run, never a
250
+ * read. Only that status, because every other path to it writes the
251
+ * certificate before the task, and `execute`, which does not, writes it
252
+ * only if none is stored: whoever writes first, both hand out the same one.
253
+ * A write that fails again is left for the next writer.
254
+ */
255
+ certify(taskId: string): ExecutionCertificate | undefined;
166
256
  /**
167
257
  * The mode a task's effect ran under: recorded when it started running, or,
168
258
  * for a task that started before that was recorded, the mode on its first
@@ -1 +1 @@
1
- {"version":3,"file":"task-controller.d.ts","sourceRoot":"","sources":["../src/task-controller.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"task-controller.d.ts","sourceRoot":"","sources":["../src/task-controller.ts"],"names":[],"mappings":"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"}