kiokuko-dsh 0.2.21 → 0.2.22

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 (113) hide show
  1. package/dist/dsh/clarification-context.d.ts +24 -0
  2. package/dist/dsh/clarification-context.d.ts.map +1 -0
  3. package/dist/dsh/clarification-context.js +31 -0
  4. package/dist/dsh/clarification-context.js.map +1 -0
  5. package/dist/dsh/coding-question.d.ts +26 -0
  6. package/dist/dsh/coding-question.d.ts.map +1 -0
  7. package/dist/dsh/coding-question.js +48 -0
  8. package/dist/dsh/coding-question.js.map +1 -0
  9. package/dist/dsh/coding-workflow/contracts.d.ts +2 -2
  10. package/dist/dsh/coding-workflow/host.d.ts +2 -4
  11. package/dist/dsh/coding-workflow/host.d.ts.map +1 -1
  12. package/dist/dsh/coding-workflow/host.js +13 -29
  13. package/dist/dsh/coding-workflow/host.js.map +1 -1
  14. package/dist/dsh/coding-workflow/intent.d.ts.map +1 -1
  15. package/dist/dsh/coding-workflow/intent.js +2 -1
  16. package/dist/dsh/coding-workflow/intent.js.map +1 -1
  17. package/dist/dsh/coding-workflow/service.d.ts +6 -6
  18. package/dist/dsh/coding-workflow/service.d.ts.map +1 -1
  19. package/dist/dsh/coding-workflow/service.js +5 -3
  20. package/dist/dsh/coding-workflow/service.js.map +1 -1
  21. package/dist/dsh/guardrail/contracts.d.ts +33 -1
  22. package/dist/dsh/guardrail/contracts.d.ts.map +1 -1
  23. package/dist/dsh/guardrail/contracts.js +1 -1
  24. package/dist/dsh/guardrail/contracts.js.map +1 -1
  25. package/dist/dsh/guardrail/engine.d.ts +2 -0
  26. package/dist/dsh/guardrail/engine.d.ts.map +1 -1
  27. package/dist/dsh/guardrail/engine.js +18 -7
  28. package/dist/dsh/guardrail/engine.js.map +1 -1
  29. package/dist/dsh/guardrail/evidence.d.ts.map +1 -1
  30. package/dist/dsh/guardrail/evidence.js +29 -1
  31. package/dist/dsh/guardrail/evidence.js.map +1 -1
  32. package/dist/dsh/guardrail/service.d.ts +2 -0
  33. package/dist/dsh/guardrail/service.d.ts.map +1 -1
  34. package/dist/dsh/guardrail/service.js +44 -2
  35. package/dist/dsh/guardrail/service.js.map +1 -1
  36. package/dist/dsh/lisp/ci.d.ts +7 -0
  37. package/dist/dsh/lisp/ci.d.ts.map +1 -1
  38. package/dist/dsh/lisp/ci.js +27 -10
  39. package/dist/dsh/lisp/ci.js.map +1 -1
  40. package/dist/dsh/lisp/coding-choice.d.ts +2 -0
  41. package/dist/dsh/lisp/coding-choice.d.ts.map +1 -1
  42. package/dist/dsh/lisp/coding-choice.js +5 -1
  43. package/dist/dsh/lisp/coding-choice.js.map +1 -1
  44. package/dist/dsh/lisp/coding-preparation.d.ts +4 -5
  45. package/dist/dsh/lisp/coding-preparation.d.ts.map +1 -1
  46. package/dist/dsh/lisp/coding-preparation.js +57 -18
  47. package/dist/dsh/lisp/coding-preparation.js.map +1 -1
  48. package/dist/dsh/lisp/manager.d.ts +3 -0
  49. package/dist/dsh/lisp/manager.d.ts.map +1 -1
  50. package/dist/dsh/lisp/manager.js +114 -13
  51. package/dist/dsh/lisp/manager.js.map +1 -1
  52. package/dist/dsh/lisp/surface.d.ts.map +1 -1
  53. package/dist/dsh/lisp/surface.js +36 -18
  54. package/dist/dsh/lisp/surface.js.map +1 -1
  55. package/dist/dsh/lisp/worker.d.ts +10 -2
  56. package/dist/dsh/lisp/worker.d.ts.map +1 -1
  57. package/dist/dsh/lisp/worker.js +21 -11
  58. package/dist/dsh/lisp/worker.js.map +1 -1
  59. package/dist/dsh/managed-operation-journal.d.ts +115 -0
  60. package/dist/dsh/managed-operation-journal.d.ts.map +1 -0
  61. package/dist/dsh/managed-operation-journal.js +336 -0
  62. package/dist/dsh/managed-operation-journal.js.map +1 -0
  63. package/dist/dsh/managed-operation-runner.d.ts +33 -0
  64. package/dist/dsh/managed-operation-runner.d.ts.map +1 -0
  65. package/dist/dsh/managed-operation-runner.js +104 -0
  66. package/dist/dsh/managed-operation-runner.js.map +1 -0
  67. package/dist/dsh/models/vendor/opencode-adapter.d.ts.map +1 -1
  68. package/dist/dsh/models/vendor/opencode-adapter.js +2 -0
  69. package/dist/dsh/models/vendor/opencode-adapter.js.map +1 -1
  70. package/dist/dsh/on-demand-intake.d.ts +5 -0
  71. package/dist/dsh/on-demand-intake.d.ts.map +1 -1
  72. package/dist/dsh/on-demand-intake.js +30 -8
  73. package/dist/dsh/on-demand-intake.js.map +1 -1
  74. package/dist/dsh/owned-execution.d.ts +2 -0
  75. package/dist/dsh/owned-execution.d.ts.map +1 -1
  76. package/dist/dsh/owned-execution.js +242 -110
  77. package/dist/dsh/owned-execution.js.map +1 -1
  78. package/dist/dsh/request-interpretation-guidance.d.ts +26 -0
  79. package/dist/dsh/request-interpretation-guidance.d.ts.map +1 -0
  80. package/dist/dsh/request-interpretation-guidance.js +35 -0
  81. package/dist/dsh/request-interpretation-guidance.js.map +1 -0
  82. package/dist/dsh/task-completion-guidance.d.ts +25 -0
  83. package/dist/dsh/task-completion-guidance.d.ts.map +1 -0
  84. package/dist/dsh/task-completion-guidance.js +36 -0
  85. package/dist/dsh/task-completion-guidance.js.map +1 -0
  86. package/dist/dsh/task-completion-host.d.ts.map +1 -1
  87. package/dist/dsh/task-completion-host.js +17 -7
  88. package/dist/dsh/task-completion-host.js.map +1 -1
  89. package/dist/dsh/task-completion.d.ts +26 -2
  90. package/dist/dsh/task-completion.d.ts.map +1 -1
  91. package/dist/dsh/task-completion.js +27 -13
  92. package/dist/dsh/task-completion.js.map +1 -1
  93. package/dist/enno-oduno/coding-workflow.d.ts +1 -1
  94. package/dist/locale/en.json +1 -1
  95. package/dist/locale/ja.json +1 -1
  96. package/dist/locale/ko.json +1 -1
  97. package/dist/locale/zh-CN.json +1 -1
  98. package/docs/guardrail.md +11 -4
  99. package/docs/lisp-prototype-planning.md +1 -1
  100. package/docs/lisp.md +1 -1
  101. package/docs/managed-operation-journal.md +21 -0
  102. package/guardrail/aarch64-apple-darwin/kiokuko-guardrail +0 -0
  103. package/guardrail/aarch64-apple-darwin/manifest.json +14 -18
  104. package/guardrail/aarch64-unknown-linux-musl/kiokuko-guardrail +0 -0
  105. package/guardrail/aarch64-unknown-linux-musl/manifest.json +14 -16
  106. package/guardrail/build-records.json +198 -0
  107. package/guardrail/manifest.json +25 -137
  108. package/guardrail/x86_64-unknown-linux-musl/kiokuko-guardrail +0 -0
  109. package/guardrail/x86_64-unknown-linux-musl/manifest.json +14 -15
  110. package/migrations/047_managed_operation_journal.sql +21 -0
  111. package/package.json +2 -2
  112. package/scripts/guardrail-artifacts.d.mts +3 -0
  113. package/scripts/guardrail-artifacts.mjs +34 -2
@@ -0,0 +1,336 @@
1
+ import { createHmac, randomBytes, randomUUID } from 'node:crypto';
2
+ import { withImmediateTransaction } from '../db/transaction.js';
3
+ /** Audit of plugin-managed boundaries, not a sandbox or an OS-wide tracer. */
4
+ export const MANAGED_JOURNAL_COVERAGE = Object.freeze(['lisp-process-bridge', 'owned-process', 'owned-file']);
5
+ const defaults = { maxOperations: 100000, maxOperationsPerScope: 4096, maxScopes: 10000, maxSnapshots: 20000, maxRequestBytes: 1048576, retentionMs: 30 * 86400000 };
6
+ const terminal = new Set(['completed', 'denied', 'cancelled-before-dispatch', 'cancelled-confirmed']);
7
+ const states = new Set(['prepared', 'dispatching', 'running', 'completed', 'denied', 'cancelled-before-dispatch', 'cancelled-confirmed', 'unknown']);
8
+ const causes = new Set(['permission-denied', 'cancelled', 'timeout', 'dispatch-error', 'persistence-error', 'recovery', 'host-error']);
9
+ function fail() { throw new Error('Managed operation journal contract violation'); }
10
+ function freeze(value) { if (value && typeof value === 'object') {
11
+ Object.values(value).forEach(freeze);
12
+ Object.freeze(value);
13
+ } ; return value; }
14
+ function exactKeys(value, allowed) { if (Object.keys(value).some(key => !allowed.includes(key)))
15
+ fail(); }
16
+ function boundedText(value) { if (typeof value !== 'string' || value.length < 1 || value.length > 512)
17
+ fail(); }
18
+ /** Typed canonical encoding distinguishes missing, undefined, null and empty values.
19
+ * This keyed private digest is not a claim of anonymous/public-safe secret hashing. */
20
+ export function canonicalJournalRequest(value) {
21
+ const seen = new Set();
22
+ function encode(v, depth) {
23
+ if (depth > 64)
24
+ fail();
25
+ if (v === undefined)
26
+ return ['undefined'];
27
+ if (v === null)
28
+ return ['null'];
29
+ if (typeof v === 'string' || typeof v === 'boolean')
30
+ return [typeof v, v];
31
+ if (typeof v === 'number' && Number.isFinite(v))
32
+ return ['number', Object.is(v, -0) ? '-0' : String(v)];
33
+ if (typeof v !== 'object' || seen.has(v))
34
+ fail();
35
+ seen.add(v);
36
+ let result;
37
+ if (Array.isArray(v))
38
+ result = ['array', Array.from({ length: v.length }, (_, i) => i in v ? encode(v[i], depth + 1) : ['missing'])];
39
+ else {
40
+ if (Object.getPrototypeOf(v) !== Object.prototype && Object.getPrototypeOf(v) !== null)
41
+ fail();
42
+ result = ['object', Object.keys(v).sort().map(key => [key, encode(v[key], depth + 1)])];
43
+ }
44
+ seen.delete(v);
45
+ return result;
46
+ }
47
+ return JSON.stringify(['managed-request-v1', encode(value, 0)]);
48
+ }
49
+ export class ManagedOperationJournal {
50
+ db;
51
+ limits;
52
+ constructor(db, limits = {}) {
53
+ this.db = db;
54
+ this.limits = { ...defaults, ...limits };
55
+ for (const value of Object.values(this.limits))
56
+ if (!Number.isSafeInteger(value) || value < 1)
57
+ fail();
58
+ }
59
+ transaction(fn) { return withImmediateTransaction(this.db, fn); }
60
+ count(table) { return this.db.prepare(`SELECT COUNT(*) AS n FROM ${table}`).get().n; }
61
+ scopeRow(id) {
62
+ const row = this.db.prepare('SELECT scope_json,sealed,collector_complete FROM dsh_managed_scopes WHERE scope_id=?').get(id);
63
+ if (!row)
64
+ fail();
65
+ return row;
66
+ }
67
+ readScope(id) { return freeze(JSON.parse(this.scopeRow(id).scope_json)); }
68
+ createScope(input) {
69
+ boundedText(input.sessionId);
70
+ boundedText(input.parentId);
71
+ boundedText(input.runtimeIdentity);
72
+ if (input.requestId !== undefined)
73
+ boundedText(input.requestId);
74
+ if (input.binding) {
75
+ exactKeys(input.binding, ['taskId', 'unitId', 'workerGeneration', 'protocolBindGeneration', 'leaseAuthorityGeneration', 'leaseRevision']);
76
+ boundedText(input.binding.taskId);
77
+ if (input.binding.unitId !== undefined)
78
+ boundedText(input.binding.unitId);
79
+ for (const key of ['protocolBindGeneration', 'leaseAuthorityGeneration', 'leaseRevision']) {
80
+ const value = input.binding[key];
81
+ if (value !== undefined && (!Number.isSafeInteger(value) || value < 0))
82
+ fail();
83
+ }
84
+ const worker = input.binding.workerGeneration;
85
+ if (worker !== undefined && typeof worker !== 'string' && (!Number.isSafeInteger(worker) || worker < 0))
86
+ fail();
87
+ }
88
+ return this.transaction(() => {
89
+ if (this.count('dsh_managed_scopes') >= this.limits.maxScopes)
90
+ throw new Error('Managed journal scope capacity exceeded');
91
+ const scope = { sessionId: input.sessionId, parentId: input.parentId, runtimeIdentity: input.runtimeIdentity,
92
+ ...(input.requestId !== undefined ? { requestId: input.requestId } : {}), ...(input.binding ? { binding: JSON.parse(JSON.stringify(input.binding)) } : {}),
93
+ scopeId: randomUUID(), createdAt: Date.now(), coverage: MANAGED_JOURNAL_COVERAGE };
94
+ this.db.prepare('INSERT INTO dsh_managed_scopes(scope_id,scope_json,created_at) VALUES(?,?,?)').run(scope.scopeId, JSON.stringify(scope), scope.createdAt);
95
+ return freeze(scope);
96
+ });
97
+ }
98
+ digest(request) {
99
+ const data = canonicalJournalRequest(request);
100
+ if (Buffer.byteLength(data) > this.limits.maxRequestBytes)
101
+ throw new Error('Managed journal request capacity exceeded');
102
+ let key = this.db.prepare('SELECT secret FROM dsh_managed_journal_keys WHERE id=1').get()?.secret;
103
+ if (!key) {
104
+ key = randomBytes(32).toString('hex');
105
+ this.db.prepare('INSERT INTO dsh_managed_journal_keys VALUES(1,?)').run(key);
106
+ }
107
+ return createHmac('sha256', key).update(data).digest('hex');
108
+ }
109
+ prepare(scopeId, input) {
110
+ if (!['native', 'owned'].includes(input.route) || !['process', 'file'].includes(input.kind))
111
+ fail();
112
+ if (input.originalRef !== undefined)
113
+ boundedText(input.originalRef);
114
+ try {
115
+ return this.transaction(() => {
116
+ const row = this.scopeRow(scopeId);
117
+ if (row.sealed || !row.collector_complete)
118
+ throw new Error('Managed scope is sealed or incomplete');
119
+ const scope = JSON.parse(row.scope_json);
120
+ const n = this.db.prepare('SELECT COUNT(*) AS n FROM dsh_managed_operations WHERE scope_id=?').get(scopeId).n;
121
+ if (n >= this.limits.maxOperationsPerScope || this.count('dsh_managed_operations') >= this.limits.maxOperations)
122
+ throw new Error('Managed journal operation capacity exceeded');
123
+ const now = Date.now(), op = { operationId: randomUUID(), scopeId, parentId: scope.parentId, sequence: n + 1,
124
+ route: input.route, kind: input.kind, ...(scope.binding ? { binding: scope.binding } : {}), requestDigest: this.digest(input.request), normalizationVersion: 1,
125
+ runtimeIdentity: scope.runtimeIdentity, ...(input.originalRef ? { originalRef: input.originalRef } : {}), state: 'prepared', delivery: 'pending', createdAt: now, updatedAt: now };
126
+ this.db.prepare('INSERT INTO dsh_managed_operations VALUES(?,?,?,?,?)').run(op.operationId, scopeId, op.sequence, op.state, JSON.stringify(op));
127
+ this.append(op);
128
+ return freeze(op);
129
+ });
130
+ }
131
+ catch (error) {
132
+ // Admission/storage failure must not later appear as a complete zero-operation scope.
133
+ try {
134
+ this.markIncomplete(scopeId);
135
+ }
136
+ catch { /* A still-failing DB cannot issue evidence. */ }
137
+ throw error;
138
+ }
139
+ }
140
+ /** Enrich authority at the host reservation boundary, before any observed result.
141
+ * Evaluation scopes can contain operations from different units; never rewrite scope identity. */
142
+ bindOperation(id, input) {
143
+ boundedText(input.runtimeIdentity);
144
+ boundedText(input.binding.taskId);
145
+ exactKeys(input, ['binding', 'runtimeIdentity', 'bindScope']);
146
+ exactKeys(input.binding, ['taskId', 'unitId', 'workerGeneration', 'protocolBindGeneration', 'leaseAuthorityGeneration', 'leaseRevision']);
147
+ if (input.binding.unitId !== undefined)
148
+ boundedText(input.binding.unitId);
149
+ if (typeof input.binding.workerGeneration === 'string')
150
+ boundedText(input.binding.workerGeneration);
151
+ else if (input.binding.workerGeneration !== undefined && (!Number.isSafeInteger(input.binding.workerGeneration) || input.binding.workerGeneration < 0))
152
+ fail();
153
+ for (const key of ['protocolBindGeneration', 'leaseAuthorityGeneration', 'leaseRevision']) {
154
+ const value = input.binding[key];
155
+ if (value !== undefined && (!Number.isSafeInteger(value) || value < 0))
156
+ fail();
157
+ }
158
+ return this.transaction(() => {
159
+ const op = this.readOperation(id);
160
+ if (op.state !== 'dispatching')
161
+ fail();
162
+ if (op.binding) {
163
+ for (const [key, value] of Object.entries(op.binding))
164
+ if (input.binding[key] !== value)
165
+ fail();
166
+ if (op.binding.protocolBindGeneration !== undefined && op.runtimeIdentity !== input.runtimeIdentity)
167
+ fail();
168
+ }
169
+ if (input.bindScope) {
170
+ const row = this.scopeRow(op.scopeId);
171
+ const count = this.db.prepare('SELECT COUNT(*) AS n FROM dsh_managed_operations WHERE scope_id=?').get(op.scopeId).n;
172
+ if (row.sealed || count !== 1)
173
+ fail();
174
+ const scope = JSON.parse(row.scope_json);
175
+ const bound = { ...scope, binding: JSON.parse(JSON.stringify(input.binding)), runtimeIdentity: input.runtimeIdentity };
176
+ this.db.prepare('UPDATE dsh_managed_scopes SET scope_json=? WHERE scope_id=?').run(JSON.stringify(bound), op.scopeId);
177
+ }
178
+ return this.save({ ...op, binding: JSON.parse(JSON.stringify(input.binding)), runtimeIdentity: input.runtimeIdentity, updatedAt: Date.now() });
179
+ });
180
+ }
181
+ attachOriginalRef(id, originalRef) {
182
+ boundedText(originalRef);
183
+ return this.transaction(() => {
184
+ const op = this.readOperation(id);
185
+ if (op.originalRef && op.originalRef !== originalRef)
186
+ fail();
187
+ if (op.originalRef === originalRef)
188
+ return op;
189
+ return this.save({ ...op, originalRef, updatedAt: Date.now() });
190
+ });
191
+ }
192
+ lookupOriginalOperation(originalRef) {
193
+ boundedText(originalRef);
194
+ const row = this.db.prepare("SELECT operation_json FROM dsh_managed_operations WHERE json_extract(operation_json,'$.originalRef')=?").get(originalRef);
195
+ return row ? freeze(JSON.parse(row.operation_json)) : undefined;
196
+ }
197
+ snapshotForOriginal(originalRef) {
198
+ const op = this.lookupOriginalOperation(originalRef);
199
+ if (!op)
200
+ fail();
201
+ return this.snapshot(op.scopeId);
202
+ }
203
+ readOperation(id) {
204
+ const row = this.db.prepare('SELECT operation_json FROM dsh_managed_operations WHERE operation_id=?').get(id);
205
+ if (!row)
206
+ fail();
207
+ return freeze(JSON.parse(row.operation_json));
208
+ }
209
+ append(op) {
210
+ const n = this.db.prepare('SELECT COUNT(*) AS n FROM dsh_managed_transitions WHERE operation_id=?').get(op.operationId).n;
211
+ if (n >= 128)
212
+ throw new Error('Managed journal transition capacity exceeded');
213
+ this.db.prepare('INSERT INTO dsh_managed_transitions VALUES(?,?,?)').run(op.operationId, n + 1, JSON.stringify(op));
214
+ }
215
+ save(op) {
216
+ this.db.prepare('UPDATE dsh_managed_operations SET state=?,operation_json=? WHERE operation_id=?').run(op.state, JSON.stringify(op), op.operationId);
217
+ this.append(op);
218
+ return freeze(op);
219
+ }
220
+ /** Only the successful claimant may dispatch; replay is observation, never execution. */
221
+ claim(id, request) {
222
+ return this.transaction(() => {
223
+ const op = this.readOperation(id);
224
+ if (arguments.length > 1 && this.digest(request) !== op.requestDigest)
225
+ throw new Error('Managed operation request mismatch');
226
+ if (op.state !== 'prepared')
227
+ return false;
228
+ const row = this.scopeRow(op.scopeId);
229
+ if (row.sealed || !row.collector_complete)
230
+ return false;
231
+ // SQL CAS as well as the write lock: exactly one claimant can dispatch.
232
+ const claimed = { ...op, state: 'dispatching', updatedAt: Date.now() };
233
+ const rowClaim = this.db.prepare("UPDATE dsh_managed_operations SET state='dispatching',operation_json=? WHERE operation_id=? AND state='prepared' RETURNING operation_id").get(JSON.stringify(claimed), id);
234
+ if (!rowClaim)
235
+ return false;
236
+ this.append(claimed);
237
+ return true;
238
+ });
239
+ }
240
+ transition(id, next) {
241
+ exactKeys(next, ['state', 'outcome', 'receiptRef', 'cause']);
242
+ return this.transaction(() => {
243
+ const op = this.readOperation(id);
244
+ if (!states.has(next.state) || next.state === 'prepared' || next.state === 'dispatching')
245
+ fail();
246
+ if (next.cause !== undefined && !causes.has(next.cause))
247
+ fail();
248
+ if (next.receiptRef !== undefined)
249
+ boundedText(next.receiptRef);
250
+ if (next.state === 'completed' ? !['succeeded', 'failed'].includes(next.outcome ?? '') : next.outcome !== undefined)
251
+ fail();
252
+ if (terminal.has(op.state)) {
253
+ if (op.state === next.state && op.outcome === next.outcome && op.receiptRef === next.receiptRef && op.cause === next.cause)
254
+ return op;
255
+ fail();
256
+ }
257
+ if (op.state === 'unknown' && next.state !== 'unknown')
258
+ throw new Error('Managed operation requires explicit reconciliation');
259
+ if (op.state === 'prepared' && !['denied', 'cancelled-before-dispatch', 'unknown'].includes(next.state))
260
+ fail();
261
+ if (op.state === 'running' && ['denied', 'cancelled-before-dispatch'].includes(next.state))
262
+ fail();
263
+ return this.save({ ...op, ...next, updatedAt: Date.now() });
264
+ });
265
+ }
266
+ /** Host must first verify original receipt/process identity. No dispatch occurs here. */
267
+ reconcile(id, next) {
268
+ exactKeys(next, ['state', 'outcome', 'receiptRef', 'cause']);
269
+ return this.transaction(() => {
270
+ const op = this.readOperation(id);
271
+ if (op.state !== 'unknown' || !terminal.has(next.state))
272
+ fail();
273
+ boundedText(next.receiptRef);
274
+ if (next.state === 'completed' ? !['succeeded', 'failed'].includes(next.outcome ?? '') : next.outcome !== undefined)
275
+ fail();
276
+ if (next.cause !== undefined && !causes.has(next.cause))
277
+ fail();
278
+ return this.save({ ...op, ...next, updatedAt: Date.now() });
279
+ });
280
+ }
281
+ setDelivery(id, delivery) {
282
+ if (!['pending', 'delivered', 'not-delivered', 'unknown'].includes(delivery))
283
+ fail();
284
+ return this.transaction(() => { const op = this.readOperation(id); if (op.delivery === delivery)
285
+ return op; return this.save({ ...op, delivery, updatedAt: Date.now() }); });
286
+ }
287
+ markIncomplete(scopeId) { this.transaction(() => { this.scopeRow(scopeId); this.db.prepare('UPDATE dsh_managed_scopes SET collector_complete=0 WHERE scope_id=?').run(scopeId); }); }
288
+ seal(scopeId) { this.transaction(() => { this.scopeRow(scopeId); this.db.prepare('UPDATE dsh_managed_scopes SET sealed=1 WHERE scope_id=?').run(scopeId); }); }
289
+ recover(scopeId) {
290
+ this.transaction(() => {
291
+ this.scopeRow(scopeId);
292
+ for (const row of this.db.prepare("SELECT operation_id FROM dsh_managed_operations WHERE scope_id=? AND state IN ('dispatching','running')").all(scopeId))
293
+ this.transition(row.operation_id, { state: 'unknown', cause: 'recovery' });
294
+ });
295
+ }
296
+ snapshot(scopeId) {
297
+ return this.transaction(() => {
298
+ if (this.count('dsh_managed_snapshots') >= this.limits.maxSnapshots)
299
+ throw new Error('Managed journal snapshot capacity exceeded');
300
+ const row = this.scopeRow(scopeId), operations = this.db.prepare('SELECT operation_json FROM dsh_managed_operations WHERE scope_id=? ORDER BY sequence').all(scopeId).map(r => JSON.parse(r.operation_json));
301
+ const unresolved = operations.filter(op => !terminal.has(op.state)).length;
302
+ const snapshot = { snapshotId: randomUUID(), scopeId, scope: JSON.parse(row.scope_json), sealed: !!row.sealed, collectorComplete: !!row.collector_complete,
303
+ complete: !!row.sealed && !!row.collector_complete && unresolved === 0, unresolved, operations, createdAt: Date.now() };
304
+ this.db.prepare('INSERT INTO dsh_managed_snapshots(snapshot_id,scope_id,snapshot_json,created_at) VALUES(?,?,?,?)').run(snapshot.snapshotId, scopeId, JSON.stringify(snapshot), snapshot.createdAt);
305
+ return freeze(snapshot);
306
+ });
307
+ }
308
+ readSnapshot(id) {
309
+ const row = this.db.prepare('SELECT snapshot_json FROM dsh_managed_snapshots WHERE snapshot_id=?').get(id);
310
+ if (!row)
311
+ fail();
312
+ return freeze(JSON.parse(row.snapshot_json));
313
+ }
314
+ retainSnapshot(id) { this.transaction(() => { this.readSnapshot(id); this.db.prepare('UPDATE dsh_managed_snapshots SET retained=1 WHERE snapshot_id=?').run(id); }); }
315
+ /** Never expire unresolved operations or scopes referenced by retained evidence. */
316
+ prune(now = Date.now()) {
317
+ return this.transaction(() => {
318
+ const rows = this.db.prepare(`WITH RECURSIVE protected(scope_id) AS (
319
+ SELECT scope_id FROM dsh_managed_snapshots WHERE retained=1
320
+ UNION SELECT scope_id FROM dsh_managed_operations WHERE state NOT IN ('completed','denied','cancelled-before-dispatch','cancelled-confirmed')
321
+ UNION SELECT o.scope_id FROM protected p JOIN dsh_managed_scopes c ON c.scope_id=p.scope_id
322
+ JOIN dsh_managed_operations o ON o.operation_id=json_extract(c.scope_json,'$.parentId')
323
+ ) SELECT scope_id FROM dsh_managed_scopes s WHERE sealed=1 AND created_at<?
324
+ AND NOT EXISTS(SELECT 1 FROM protected p WHERE p.scope_id=s.scope_id)
325
+ AND NOT EXISTS(SELECT 1 FROM dsh_managed_operations o WHERE o.scope_id=s.scope_id AND state NOT IN ('completed','denied','cancelled-before-dispatch','cancelled-confirmed'))`).all(now - this.limits.retentionMs);
326
+ for (const row of rows) {
327
+ this.db.prepare('DELETE FROM dsh_managed_transitions WHERE operation_id IN (SELECT operation_id FROM dsh_managed_operations WHERE scope_id=?)').run(row.scope_id);
328
+ this.db.prepare('DELETE FROM dsh_managed_operations WHERE scope_id=?').run(row.scope_id);
329
+ this.db.prepare('DELETE FROM dsh_managed_snapshots WHERE scope_id=?').run(row.scope_id);
330
+ this.db.prepare('DELETE FROM dsh_managed_scopes WHERE scope_id=?').run(row.scope_id);
331
+ }
332
+ return rows.length;
333
+ });
334
+ }
335
+ }
336
+ //# sourceMappingURL=managed-operation-journal.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"managed-operation-journal.js","sourceRoot":"","sources":["../../src/dsh/managed-operation-journal.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,aAAa,CAAA;AAEjE,OAAO,EAAE,wBAAwB,EAAE,MAAM,sBAAsB,CAAA;AAE/D,8EAA8E;AAC9E,MAAM,CAAC,MAAM,wBAAwB,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,qBAAqB,EAAE,eAAe,EAAE,YAAY,CAAU,CAAC,CAAA;AA0BtH,MAAM,QAAQ,GAAkB,EAAC,aAAa,EAAE,MAAM,EAAE,qBAAqB,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,YAAY,EAAE,KAAK,EAAE,eAAe,EAAE,OAAO,EAAE,WAAW,EAAE,EAAE,GAAG,QAAQ,EAAC,CAAA;AACjL,MAAM,QAAQ,GAAG,IAAI,GAAG,CAAe,CAAC,WAAW,EAAE,QAAQ,EAAE,2BAA2B,EAAE,qBAAqB,CAAC,CAAC,CAAA;AACnH,MAAM,MAAM,GAAG,IAAI,GAAG,CAAe,CAAC,UAAU,EAAC,aAAa,EAAC,SAAS,EAAC,WAAW,EAAC,QAAQ,EAAC,2BAA2B,EAAC,qBAAqB,EAAC,SAAS,CAAC,CAAC,CAAA;AAC3J,MAAM,MAAM,GAAG,IAAI,GAAG,CAAe,CAAC,mBAAmB,EAAC,WAAW,EAAC,SAAS,EAAC,gBAAgB,EAAC,mBAAmB,EAAC,UAAU,EAAC,YAAY,CAAC,CAAC,CAAA;AAC9I,SAAS,IAAI,KAAY,MAAM,IAAI,KAAK,CAAC,8CAA8C,CAAC,CAAA,CAAC,CAAC;AAC1F,SAAS,MAAM,CAAI,KAAQ,IAAO,IAAI,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;IAAC,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;IAAC,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAA;AAAC,CAAC,CAAA,CAAC,CAAC,OAAO,KAAK,CAAA,CAAC,CAAC;AACxJ,SAAS,SAAS,CAAC,KAAa,EAAE,OAAiB,IAAU,IAAG,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,GAAG,CAAA,EAAE,CAAA,CAAC,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;IAAE,IAAI,EAAE,CAAA,CAAC,CAAC;AAC9H,SAAS,WAAW,CAAC,KAAc,IAA6B,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,IAAI,KAAK,CAAC,MAAM,GAAG,GAAG;IAAE,IAAI,EAAE,CAAA,CAAC,CAAC;AACjJ;uFACuF;AACvF,MAAM,UAAU,uBAAuB,CAAC,KAAc;IACpD,MAAM,IAAI,GAAG,IAAI,GAAG,EAAU,CAAA;IAC9B,SAAS,MAAM,CAAC,CAAU,EAAE,KAAa;QACvC,IAAI,KAAK,GAAG,EAAE;YAAE,IAAI,EAAE,CAAA;QACtB,IAAI,CAAC,KAAK,SAAS;YAAE,OAAO,CAAC,WAAW,CAAC,CAAA;QACzC,IAAI,CAAC,KAAK,IAAI;YAAE,OAAO,CAAC,MAAM,CAAC,CAAA;QAC/B,IAAI,OAAO,CAAC,KAAK,QAAQ,IAAI,OAAO,CAAC,KAAK,SAAS;YAAE,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,CAAA;QACzE,IAAI,OAAO,CAAC,KAAK,QAAQ,IAAI,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC;YAAE,OAAO,CAAC,QAAQ,EAAE,MAAM,CAAC,EAAE,CAAC,CAAC,EAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAA;QACtG,IAAI,OAAO,CAAC,KAAK,QAAQ,IAAI,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;YAAE,IAAI,EAAE,CAAA;QAChD,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAA;QACX,IAAI,MAAe,CAAA;QACnB,IAAI,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC;YAAE,MAAM,GAAG,CAAC,OAAO,EAAE,KAAK,CAAC,IAAI,CAAC,EAAC,MAAM,EAAC,CAAC,CAAC,MAAM,EAAC,EAAC,CAAC,CAAC,EAAC,CAAC,EAAC,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,EAAC,KAAK,GAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,CAAA;aACtH,CAAC;YACJ,IAAI,MAAM,CAAC,cAAc,CAAC,CAAC,CAAC,KAAK,MAAM,CAAC,SAAS,IAAI,MAAM,CAAC,cAAc,CAAC,CAAC,CAAC,KAAK,IAAI;gBAAE,IAAI,EAAE,CAAA;YAC9F,MAAM,GAAG,CAAC,QAAQ,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,GAAG,EAAE,MAAM,CAAE,CAA4B,CAAC,GAAG,CAAC,EAAC,KAAK,GAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAA;QAClH,CAAC;QACD,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;QAAC,OAAO,MAAM,CAAA;IAC/B,CAAC;IACD,OAAO,IAAI,CAAC,SAAS,CAAC,CAAC,oBAAoB,EAAE,MAAM,CAAC,KAAK,EAAC,CAAC,CAAC,CAAC,CAAC,CAAA;AAChE,CAAC;AAED,MAAM,OAAO,uBAAuB;IAEL;IADpB,MAAM,CAAe;IAC9B,YAA6B,EAAkB,EAAE,SAAiC,EAAE;QAAvD,OAAE,GAAF,EAAE,CAAgB;QAC7C,IAAI,CAAC,MAAM,GAAG,EAAC,GAAG,QAAQ,EAAC,GAAG,MAAM,EAAC,CAAA;QACrC,KAAK,MAAM,KAAK,IAAI,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC;YAAE,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,KAAK,CAAC,IAAI,KAAK,GAAG,CAAC;gBAAE,IAAI,EAAE,CAAA;IACvG,CAAC;IACO,WAAW,CAAI,EAAQ,IAAM,OAAO,wBAAwB,CAAC,IAAI,CAAC,EAAE,EAAC,EAAE,CAAC,CAAA,CAAC,CAAC;IAC1E,KAAK,CAAC,KAAY,IAAW,OAAO,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC,6BAA6B,KAAK,EAAE,CAAC,CAAC,GAAG,EAAe,CAAC,CAAC,CAAA,CAAC,CAAC;IAChH,QAAQ,CAAC,EAAS;QACxB,MAAM,GAAG,GAAC,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC,sFAAsF,CAAC,CAAC,GAAG,CAA8D,EAAE,CAAC,CAAA;QACtL,IAAI,CAAC,GAAG;YAAE,IAAI,EAAE,CAAC;QAAC,OAAO,GAAG,CAAA;IAC9B,CAAC;IACD,SAAS,CAAC,EAAS,IAAiB,OAAO,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,UAAU,CAAiB,CAAC,CAAA,CAAC,CAAC;IAC7G,WAAW,CAAC,KAAyD;QACnE,WAAW,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;QAAC,WAAW,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;QAAC,WAAW,CAAC,KAAK,CAAC,eAAe,CAAC,CAAA;QAC7F,IAAG,KAAK,CAAC,SAAS,KAAK,SAAS;YAAE,WAAW,CAAC,KAAK,CAAC,SAAS,CAAC,CAAA;QAC9D,IAAI,KAAK,CAAC,OAAO,EAAE,CAAC;YAClB,SAAS,CAAC,KAAK,CAAC,OAAO,EAAC,CAAC,QAAQ,EAAC,QAAQ,EAAC,kBAAkB,EAAC,wBAAwB,EAAC,0BAA0B,EAAC,eAAe,CAAC,CAAC,CAAA;YACnI,WAAW,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,CAAA;YACjC,IAAG,KAAK,CAAC,OAAO,CAAC,MAAM,KAAG,SAAS;gBAAE,WAAW,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,CAAA;YACtE,KAAI,MAAM,GAAG,IAAI,CAAC,wBAAwB,EAAC,0BAA0B,EAAC,eAAe,CAAU,EAAE,CAAC;gBAChG,MAAM,KAAK,GAAC,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;gBAAC,IAAG,KAAK,KAAG,SAAS,IAAI,CAAC,CAAC,MAAM,CAAC,aAAa,CAAC,KAAK,CAAC,IAAE,KAAK,GAAC,CAAC,CAAC;oBAAE,IAAI,EAAE,CAAA;YACzG,CAAC;YACD,MAAM,MAAM,GAAC,KAAK,CAAC,OAAO,CAAC,gBAAgB,CAAA;YAC3C,IAAG,MAAM,KAAG,SAAS,IAAI,OAAO,MAAM,KAAG,QAAQ,IAAI,CAAC,CAAC,MAAM,CAAC,aAAa,CAAC,MAAM,CAAC,IAAE,MAAM,GAAC,CAAC,CAAC;gBAAE,IAAI,EAAE,CAAA;QACxG,CAAC;QACD,OAAO,IAAI,CAAC,WAAW,CAAC,GAAE,EAAE;YAC1B,IAAG,IAAI,CAAC,KAAK,CAAC,oBAAoB,CAAC,IAAE,IAAI,CAAC,MAAM,CAAC,SAAS;gBAAE,MAAM,IAAI,KAAK,CAAC,yCAAyC,CAAC,CAAA;YACtH,MAAM,KAAK,GAAc,EAAC,SAAS,EAAC,KAAK,CAAC,SAAS,EAAC,QAAQ,EAAC,KAAK,CAAC,QAAQ,EAAC,eAAe,EAAC,KAAK,CAAC,eAAe;gBAC/G,GAAG,CAAC,KAAK,CAAC,SAAS,KAAG,SAAS,CAAA,CAAC,CAAA,EAAC,SAAS,EAAC,KAAK,CAAC,SAAS,EAAC,CAAA,CAAC,CAAA,EAAE,CAAC,EAAC,GAAG,CAAC,KAAK,CAAC,OAAO,CAAA,CAAC,CAAA,EAAC,OAAO,EAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,EAAC,CAAA,CAAC,CAAA,EAAE,CAAC;gBACzI,OAAO,EAAC,UAAU,EAAE,EAAC,SAAS,EAAC,IAAI,CAAC,GAAG,EAAE,EAAC,QAAQ,EAAC,wBAAwB,EAAC,CAAA;YAC9E,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC,8EAA8E,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,OAAO,EAAC,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,EAAC,KAAK,CAAC,SAAS,CAAC,CAAA;YACxJ,OAAO,MAAM,CAAC,KAAK,CAAC,CAAA;QACtB,CAAC,CAAC,CAAA;IACJ,CAAC;IACO,MAAM,CAAC,OAAe;QAC5B,MAAM,IAAI,GAAC,uBAAuB,CAAC,OAAO,CAAC,CAAA;QAC3C,IAAG,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,GAAC,IAAI,CAAC,MAAM,CAAC,eAAe;YAAE,MAAM,IAAI,KAAK,CAAC,2CAA2C,CAAC,CAAA;QACpH,IAAI,GAAG,GAAC,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC,wDAAwD,CAAC,CAAC,GAAG,EAAmB,EAAE,MAAM,CAAA;QAChH,IAAG,CAAC,GAAG,EAAE,CAAC;YAAC,GAAG,GAAC,WAAW,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;YAAC,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC,kDAAkD,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAA;QAAC,CAAC;QAC9H,OAAO,UAAU,CAAC,QAAQ,EAAC,GAAG,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAA;IAC5D,CAAC;IACD,OAAO,CAAC,OAAc,EAAC,KAAwF;QAC7G,IAAG,CAAC,CAAC,QAAQ,EAAC,OAAO,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,KAAK,CAAC,IAAE,CAAC,CAAC,SAAS,EAAC,MAAM,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC;YAAE,IAAI,EAAE,CAAA;QAC9F,IAAG,KAAK,CAAC,WAAW,KAAG,SAAS;YAAE,WAAW,CAAC,KAAK,CAAC,WAAW,CAAC,CAAA;QAChE,IAAI,CAAC;YAAC,OAAO,IAAI,CAAC,WAAW,CAAC,GAAE,EAAE;gBAChC,MAAM,GAAG,GAAC,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;gBAAC,IAAG,GAAG,CAAC,MAAM,IAAI,CAAC,GAAG,CAAC,kBAAkB;oBAAE,MAAM,IAAI,KAAK,CAAC,uCAAuC,CAAC,CAAA;gBACpI,MAAM,KAAK,GAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,UAAU,CAAiB,CAAA;gBACtD,MAAM,CAAC,GAAC,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC,mEAAmE,CAAC,CAAC,GAAG,CAAa,OAAO,CAAE,CAAC,CAAC,CAAA;gBACxH,IAAG,CAAC,IAAE,IAAI,CAAC,MAAM,CAAC,qBAAqB,IAAI,IAAI,CAAC,KAAK,CAAC,wBAAwB,CAAC,IAAE,IAAI,CAAC,MAAM,CAAC,aAAa;oBAAE,MAAM,IAAI,KAAK,CAAC,6CAA6C,CAAC,CAAA;gBAC1K,MAAM,GAAG,GAAC,IAAI,CAAC,GAAG,EAAE,EAAE,EAAE,GAAkB,EAAC,WAAW,EAAC,UAAU,EAAE,EAAC,OAAO,EAAC,QAAQ,EAAC,KAAK,CAAC,QAAQ,EAAC,QAAQ,EAAC,CAAC,GAAC,CAAC;oBAC9G,KAAK,EAAC,KAAK,CAAC,KAAK,EAAC,IAAI,EAAC,KAAK,CAAC,IAAI,EAAC,GAAG,CAAC,KAAK,CAAC,OAAO,CAAA,CAAC,CAAA,EAAC,OAAO,EAAC,KAAK,CAAC,OAAO,EAAC,CAAA,CAAC,CAAA,EAAE,CAAC,EAAC,aAAa,EAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,EAAC,oBAAoB,EAAC,CAAC;oBAC/I,eAAe,EAAC,KAAK,CAAC,eAAe,EAAC,GAAG,CAAC,KAAK,CAAC,WAAW,CAAA,CAAC,CAAA,EAAC,WAAW,EAAC,KAAK,CAAC,WAAW,EAAC,CAAA,CAAC,CAAA,EAAE,CAAC,EAAC,KAAK,EAAC,UAAU,EAAC,QAAQ,EAAC,SAAS,EAAC,SAAS,EAAC,GAAG,EAAC,SAAS,EAAC,GAAG,EAAC,CAAA;gBAClK,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC,sDAAsD,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,WAAW,EAAC,OAAO,EAAC,EAAE,CAAC,QAAQ,EAAC,EAAE,CAAC,KAAK,EAAC,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC,CAAA;gBAC3I,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;gBAAC,OAAO,MAAM,CAAC,EAAE,CAAC,CAAA;YACpC,CAAC,CAAC,CAAA;QAAC,CAAC;QAAC,OAAM,KAAK,EAAE,CAAC;YACjB,sFAAsF;YACtF,IAAI,CAAC;gBAAC,IAAI,CAAC,cAAc,CAAC,OAAO,CAAC,CAAA;YAAC,CAAC;YAAC,MAAM,CAAC,CAAC,+CAA+C,CAAC,CAAC;YAC9F,MAAM,KAAK,CAAA;QACb,CAAC;IACH,CAAC;IACD;sGACkG;IAClG,aAAa,CAAC,EAAS,EAAC,KAAwE;QAC9F,WAAW,CAAC,KAAK,CAAC,eAAe,CAAC,CAAC;QAAC,WAAW,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,CAAA;QACrE,SAAS,CAAC,KAAK,EAAC,CAAC,SAAS,EAAC,iBAAiB,EAAC,WAAW,CAAC,CAAC,CAAA;QAC1D,SAAS,CAAC,KAAK,CAAC,OAAO,EAAC,CAAC,QAAQ,EAAC,QAAQ,EAAC,kBAAkB,EAAC,wBAAwB,EAAC,0BAA0B,EAAC,eAAe,CAAC,CAAC,CAAA;QACnI,IAAG,KAAK,CAAC,OAAO,CAAC,MAAM,KAAG,SAAS;YAAE,WAAW,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,CAAA;QACtE,IAAG,OAAO,KAAK,CAAC,OAAO,CAAC,gBAAgB,KAAG,QAAQ;YAAE,WAAW,CAAC,KAAK,CAAC,OAAO,CAAC,gBAAgB,CAAC,CAAA;aAC3F,IAAG,KAAK,CAAC,OAAO,CAAC,gBAAgB,KAAG,SAAS,IAAI,CAAC,CAAC,MAAM,CAAC,aAAa,CAAC,KAAK,CAAC,OAAO,CAAC,gBAAgB,CAAC,IAAE,KAAK,CAAC,OAAO,CAAC,gBAAgB,GAAC,CAAC,CAAC;YAAE,IAAI,EAAE,CAAA;QACvJ,KAAI,MAAM,GAAG,IAAI,CAAC,wBAAwB,EAAC,0BAA0B,EAAC,eAAe,CAAU,EAAC,CAAC;YAC/F,MAAM,KAAK,GAAC,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;YAAA,IAAG,KAAK,KAAG,SAAS,IAAI,CAAC,CAAC,MAAM,CAAC,aAAa,CAAC,KAAK,CAAC,IAAE,KAAK,GAAC,CAAC,CAAC;gBAAC,IAAI,EAAE,CAAA;QACvG,CAAC;QACD,OAAO,IAAI,CAAC,WAAW,CAAC,GAAE,EAAE;YAC1B,MAAM,EAAE,GAAC,IAAI,CAAC,aAAa,CAAC,EAAE,CAAC,CAAC;YAAA,IAAG,EAAE,CAAC,KAAK,KAAG,aAAa;gBAAE,IAAI,EAAE,CAAA;YACnE,IAAG,EAAE,CAAC,OAAO,EAAC,CAAC;gBACb,KAAI,MAAM,CAAC,GAAG,EAAC,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC,OAAO,CAAC;oBAAE,IAAG,KAAK,CAAC,OAAO,CAAC,GAA2B,CAAC,KAAG,KAAK;wBAAE,IAAI,EAAE,CAAA;gBAClH,IAAG,EAAE,CAAC,OAAO,CAAC,sBAAsB,KAAG,SAAS,IAAI,EAAE,CAAC,eAAe,KAAG,KAAK,CAAC,eAAe;oBAAE,IAAI,EAAE,CAAA;YACxG,CAAC;YACD,IAAG,KAAK,CAAC,SAAS,EAAC,CAAC;gBAClB,MAAM,GAAG,GAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC,OAAO,CAAC,CAAA;gBACnC,MAAM,KAAK,GAAC,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC,mEAAmE,CAAC,CAAC,GAAG,CAAa,EAAE,CAAC,OAAO,CAAE,CAAC,CAAC,CAAA;gBAC/H,IAAG,GAAG,CAAC,MAAM,IAAI,KAAK,KAAG,CAAC;oBAAE,IAAI,EAAE,CAAA;gBAClC,MAAM,KAAK,GAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,UAAU,CAAiB,CAAA;gBACtD,MAAM,KAAK,GAAC,EAAC,GAAG,KAAK,EAAC,OAAO,EAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,EAAC,eAAe,EAAC,KAAK,CAAC,eAAe,EAAC,CAAA;gBAC9G,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC,6DAA6D,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,EAAC,EAAE,CAAC,OAAO,CAAC,CAAA;YACtH,CAAC;YACD,OAAO,IAAI,CAAC,IAAI,CAAC,EAAC,GAAG,EAAE,EAAC,OAAO,EAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,EAAC,eAAe,EAAC,KAAK,CAAC,eAAe,EAAC,SAAS,EAAC,IAAI,CAAC,GAAG,EAAE,EAAC,CAAC,CAAA;QACxI,CAAC,CAAC,CAAA;IACJ,CAAC;IACD,iBAAiB,CAAC,EAAS,EAAC,WAAkB;QAC5C,WAAW,CAAC,WAAW,CAAC,CAAA;QACxB,OAAO,IAAI,CAAC,WAAW,CAAC,GAAE,EAAE;YAC1B,MAAM,EAAE,GAAC,IAAI,CAAC,aAAa,CAAC,EAAE,CAAC,CAAA;YAC/B,IAAG,EAAE,CAAC,WAAW,IAAI,EAAE,CAAC,WAAW,KAAG,WAAW;gBAAE,IAAI,EAAE,CAAA;YACzD,IAAG,EAAE,CAAC,WAAW,KAAG,WAAW;gBAAE,OAAO,EAAE,CAAA;YAC1C,OAAO,IAAI,CAAC,IAAI,CAAC,EAAC,GAAG,EAAE,EAAC,WAAW,EAAC,SAAS,EAAC,IAAI,CAAC,GAAG,EAAE,EAAC,CAAC,CAAA;QAC5D,CAAC,CAAC,CAAA;IACJ,CAAC;IACD,uBAAuB,CAAC,WAAkB;QACxC,WAAW,CAAC,WAAW,CAAC,CAAA;QACxB,MAAM,GAAG,GAAC,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC,wGAAwG,CAAC,CAAC,GAAG,CAA0B,WAAW,CAAC,CAAA;QAC7K,OAAO,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,cAAc,CAAqB,CAAC,CAAC,CAAC,CAAC,SAAS,CAAA;IACrF,CAAC;IACD,mBAAmB,CAAC,WAAkB;QACpC,MAAM,EAAE,GAAC,IAAI,CAAC,uBAAuB,CAAC,WAAW,CAAC,CAAC;QAAC,IAAG,CAAC,EAAE;YAAE,IAAI,EAAE,CAAC;QAAC,OAAO,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC,OAAO,CAAC,CAAA;IACtG,CAAC;IACD,aAAa,CAAC,EAAS;QACrB,MAAM,GAAG,GAAC,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC,wEAAwE,CAAC,CAAC,GAAG,CAA0B,EAAE,CAAC,CAAA;QACpI,IAAG,CAAC,GAAG;YAAE,IAAI,EAAE,CAAC;QAAC,OAAO,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,cAAc,CAAqB,CAAC,CAAA;IACpF,CAAC;IACO,MAAM,CAAC,EAAmB;QAChC,MAAM,CAAC,GAAC,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC,wEAAwE,CAAC,CAAC,GAAG,CAAa,EAAE,CAAC,WAAW,CAAE,CAAC,CAAC,CAAA;QACpI,IAAG,CAAC,IAAE,GAAG;YAAE,MAAM,IAAI,KAAK,CAAC,8CAA8C,CAAC,CAAA;QAC1E,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC,mDAAmD,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,WAAW,EAAC,CAAC,GAAC,CAAC,EAAC,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC,CAAA;IACjH,CAAC;IACO,IAAI,CAAC,EAAmB;QAC9B,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC,iFAAiF,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,KAAK,EAAC,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC,EAAC,EAAE,CAAC,WAAW,CAAC,CAAA;QAClJ,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;QAAC,OAAO,MAAM,CAAC,EAAE,CAAC,CAAA;IACpC,CAAC;IACD,yFAAyF;IACzF,KAAK,CAAC,EAAS,EAAC,OAAgB;QAC9B,OAAO,IAAI,CAAC,WAAW,CAAC,GAAE,EAAE;YAC1B,MAAM,EAAE,GAAC,IAAI,CAAC,aAAa,CAAC,EAAE,CAAC,CAAA;YAC/B,IAAG,SAAS,CAAC,MAAM,GAAC,CAAC,IAAI,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,KAAG,EAAE,CAAC,aAAa;gBAAE,MAAM,IAAI,KAAK,CAAC,oCAAoC,CAAC,CAAA;YACvH,IAAG,EAAE,CAAC,KAAK,KAAG,UAAU;gBAAE,OAAO,KAAK,CAAA;YACtC,MAAM,GAAG,GAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC,OAAO,CAAC,CAAC;YAAC,IAAG,GAAG,CAAC,MAAM,IAAI,CAAC,GAAG,CAAC,kBAAkB;gBAAE,OAAO,KAAK,CAAA;YAC3F,wEAAwE;YACxE,MAAM,OAAO,GAAkB,EAAC,GAAG,EAAE,EAAC,KAAK,EAAC,aAAa,EAAC,SAAS,EAAC,IAAI,CAAC,GAAG,EAAE,EAAC,CAAA;YAC/E,MAAM,QAAQ,GAAC,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC,yIAAyI,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,EAAC,EAAE,CAAC,CAAA;YACzM,IAAG,CAAC,QAAQ;gBAAE,OAAO,KAAK,CAAA;YAC1B,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;YAAC,OAAO,IAAI,CAAA;QACnC,CAAC,CAAC,CAAA;IACJ,CAAC;IACD,UAAU,CAAC,EAAS,EAAC,IAAsB;QACzC,SAAS,CAAC,IAAI,EAAC,CAAC,OAAO,EAAC,SAAS,EAAC,YAAY,EAAC,OAAO,CAAC,CAAC,CAAA;QACxD,OAAO,IAAI,CAAC,WAAW,CAAC,GAAE,EAAE;YAC1B,MAAM,EAAE,GAAC,IAAI,CAAC,aAAa,CAAC,EAAE,CAAC,CAAA;YAC/B,IAAG,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,IAAI,CAAC,KAAK,KAAG,UAAU,IAAI,IAAI,CAAC,KAAK,KAAG,aAAa;gBAAE,IAAI,EAAE,CAAA;YAC3F,IAAG,IAAI,CAAC,KAAK,KAAG,SAAS,IAAE,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC;gBAAE,IAAI,EAAE,CAAA;YAC1D,IAAG,IAAI,CAAC,UAAU,KAAG,SAAS;gBAAE,WAAW,CAAC,IAAI,CAAC,UAAU,CAAC,CAAA;YAC5D,IAAG,IAAI,CAAC,KAAK,KAAG,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC,WAAW,EAAC,QAAQ,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,OAAO,IAAE,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,KAAG,SAAS;gBAAE,IAAI,EAAE,CAAA;YACnH,IAAG,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC,KAAK,CAAC,EAAE,CAAC;gBAC1B,IAAG,EAAE,CAAC,KAAK,KAAG,IAAI,CAAC,KAAK,IAAI,EAAE,CAAC,OAAO,KAAG,IAAI,CAAC,OAAO,IAAI,EAAE,CAAC,UAAU,KAAG,IAAI,CAAC,UAAU,IAAI,EAAE,CAAC,KAAK,KAAG,IAAI,CAAC,KAAK;oBAAE,OAAO,EAAE,CAAA;gBAC5H,IAAI,EAAE,CAAA;YACR,CAAC;YACD,IAAG,EAAE,CAAC,KAAK,KAAG,SAAS,IAAI,IAAI,CAAC,KAAK,KAAG,SAAS;gBAAE,MAAM,IAAI,KAAK,CAAC,oDAAoD,CAAC,CAAA;YACxH,IAAG,EAAE,CAAC,KAAK,KAAG,UAAU,IAAI,CAAC,CAAC,QAAQ,EAAC,2BAA2B,EAAC,SAAS,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC;gBAAE,IAAI,EAAE,CAAA;YAC1G,IAAG,EAAE,CAAC,KAAK,KAAG,SAAS,IAAI,CAAC,QAAQ,EAAC,2BAA2B,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC;gBAAE,IAAI,EAAE,CAAA;YAC9F,OAAO,IAAI,CAAC,IAAI,CAAC,EAAC,GAAG,EAAE,EAAC,GAAG,IAAI,EAAC,SAAS,EAAC,IAAI,CAAC,GAAG,EAAE,EAAC,CAAC,CAAA;QACxD,CAAC,CAAC,CAAA;IACJ,CAAC;IACD,yFAAyF;IACzF,SAAS,CAAC,EAAS,EAAC,IAA4C;QAC9D,SAAS,CAAC,IAAI,EAAC,CAAC,OAAO,EAAC,SAAS,EAAC,YAAY,EAAC,OAAO,CAAC,CAAC,CAAA;QACxD,OAAO,IAAI,CAAC,WAAW,CAAC,GAAE,EAAE;YAC1B,MAAM,EAAE,GAAC,IAAI,CAAC,aAAa,CAAC,EAAE,CAAC,CAAC;YAAC,IAAG,EAAE,CAAC,KAAK,KAAG,SAAS,IAAE,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC;gBAAE,IAAI,EAAE,CAAA;YAC3F,WAAW,CAAC,IAAI,CAAC,UAAU,CAAC,CAAA;YAC5B,IAAG,IAAI,CAAC,KAAK,KAAG,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC,WAAW,EAAC,QAAQ,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,OAAO,IAAE,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,KAAG,SAAS;gBAAE,IAAI,EAAE,CAAA;YACnH,IAAG,IAAI,CAAC,KAAK,KAAG,SAAS,IAAE,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC;gBAAE,IAAI,EAAE,CAAA;YAC1D,OAAO,IAAI,CAAC,IAAI,CAAC,EAAC,GAAG,EAAE,EAAC,GAAG,IAAI,EAAC,SAAS,EAAC,IAAI,CAAC,GAAG,EAAE,EAAC,CAAC,CAAA;QACxD,CAAC,CAAC,CAAA;IACJ,CAAC;IACD,WAAW,CAAC,EAAS,EAAC,QAAwB;QAC5C,IAAG,CAAC,CAAC,SAAS,EAAC,WAAW,EAAC,eAAe,EAAC,SAAS,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC;YAAE,IAAI,EAAE,CAAA;QAChF,OAAO,IAAI,CAAC,WAAW,CAAC,GAAE,EAAE,GAAC,MAAM,EAAE,GAAC,IAAI,CAAC,aAAa,CAAC,EAAE,CAAC,CAAC,CAAA,IAAG,EAAE,CAAC,QAAQ,KAAG,QAAQ;YAAC,OAAO,EAAE,CAAC,CAAA,OAAO,IAAI,CAAC,IAAI,CAAC,EAAC,GAAG,EAAE,EAAC,QAAQ,EAAC,SAAS,EAAC,IAAI,CAAC,GAAG,EAAE,EAAC,CAAC,CAAA,CAAA,CAAC,CAAC,CAAA;IAC5J,CAAC;IACD,cAAc,CAAC,OAAc,IAAS,IAAI,CAAC,WAAW,CAAC,GAAE,EAAE,GAAC,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAA,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC,qEAAqE,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAA,CAAA,CAAC,CAAC,CAAA,CAAC,CAAC;IAC1L,IAAI,CAAC,OAAc,IAAS,IAAI,CAAC,WAAW,CAAC,GAAE,EAAE,GAAC,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAA,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC,yDAAyD,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAA,CAAA,CAAC,CAAC,CAAA,CAAC,CAAC;IACpK,OAAO,CAAC,OAAc;QACpB,IAAI,CAAC,WAAW,CAAC,GAAE,EAAE;YACnB,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAA;YACtB,KAAI,MAAM,GAAG,IAAI,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC,yGAAyG,CAAC,CAAC,GAAG,CAAwB,OAAO,CAAC;gBAC7K,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,YAAY,EAAC,EAAC,KAAK,EAAC,SAAS,EAAC,KAAK,EAAC,UAAU,EAAC,CAAC,CAAA;QACxE,CAAC,CAAC,CAAA;IACJ,CAAC;IACD,QAAQ,CAAC,OAAc;QACrB,OAAO,IAAI,CAAC,WAAW,CAAC,GAAE,EAAE;YAC1B,IAAG,IAAI,CAAC,KAAK,CAAC,uBAAuB,CAAC,IAAE,IAAI,CAAC,MAAM,CAAC,YAAY;gBAAE,MAAM,IAAI,KAAK,CAAC,4CAA4C,CAAC,CAAA;YAC/H,MAAM,GAAG,GAAC,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAC,UAAU,GAAC,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC,sFAAsF,CAAC,CAAC,GAAG,CAA0B,OAAO,CAAC,CAAC,GAAG,CAAC,CAAC,CAAA,EAAE,CAAA,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,cAAc,CAAqB,CAAC,CAAA;YAClP,MAAM,UAAU,GAAC,UAAU,CAAC,MAAM,CAAC,EAAE,CAAA,EAAE,CAAA,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAA;YACtE,MAAM,QAAQ,GAAwB,EAAC,UAAU,EAAC,UAAU,EAAE,EAAC,OAAO,EAAC,KAAK,EAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,UAAU,CAAC,EAAC,MAAM,EAAC,CAAC,CAAC,GAAG,CAAC,MAAM,EAAC,iBAAiB,EAAC,CAAC,CAAC,GAAG,CAAC,kBAAkB;gBACpK,QAAQ,EAAC,CAAC,CAAC,GAAG,CAAC,MAAM,IAAI,CAAC,CAAC,GAAG,CAAC,kBAAkB,IAAI,UAAU,KAAG,CAAC,EAAC,UAAU,EAAC,UAAU,EAAC,SAAS,EAAC,IAAI,CAAC,GAAG,EAAE,EAAC,CAAA;YACjH,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC,kGAAkG,CAAC,CAAC,GAAG,CAAC,QAAQ,CAAC,UAAU,EAAC,OAAO,EAAC,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,EAAC,QAAQ,CAAC,SAAS,CAAC,CAAA;YAChM,OAAO,MAAM,CAAC,QAAQ,CAAC,CAAA;QACzB,CAAC,CAAC,CAAA;IACJ,CAAC;IACD,YAAY,CAAC,EAAS;QACpB,MAAM,GAAG,GAAC,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC,qEAAqE,CAAC,CAAC,GAAG,CAAyB,EAAE,CAAC,CAAA;QAChI,IAAG,CAAC,GAAG;YAAE,IAAI,EAAE,CAAC;QAAA,OAAO,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,aAAa,CAA2B,CAAC,CAAA;IACxF,CAAC;IACD,cAAc,CAAC,EAAS,IAAS,IAAI,CAAC,WAAW,CAAC,GAAE,EAAE,GAAC,IAAI,CAAC,YAAY,CAAC,EAAE,CAAC,CAAC,CAAA,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC,iEAAiE,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAA,CAAA,CAAC,CAAC,CAAA,CAAC,CAAC;IAC3K,oFAAoF;IACpF,KAAK,CAAC,GAAG,GAAC,IAAI,CAAC,GAAG,EAAE;QAClB,OAAO,IAAI,CAAC,WAAW,CAAC,GAAE,EAAE;YAC1B,MAAM,IAAI,GAAC,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC;;;;;;;qLAOoJ,CAAC,CAAC,GAAG,CAAoB,GAAG,GAAC,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC,CAAA;YACpO,KAAI,MAAM,GAAG,IAAI,IAAI,EAAC,CAAC;gBACrB,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC,8HAA8H,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAA;gBACjK,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC,qDAAqD,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAA;gBACxF,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC,oDAAoD,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAA;gBACvF,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC,iDAAiD,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAA;YACtF,CAAC;YACD,OAAO,IAAI,CAAC,MAAM,CAAA;QACpB,CAAC,CAAC,CAAA;IACJ,CAAC;CACF"}
@@ -0,0 +1,33 @@
1
+ import type { SqliteDatabase } from '../db/adapter.js';
2
+ export interface JournalDatabase {
3
+ <T>(fn: (db: SqliteDatabase) => T): Promise<T>;
4
+ }
5
+ export interface ManagedScope {
6
+ database: JournalDatabase;
7
+ scopeId: string;
8
+ direct?: boolean;
9
+ nested?: boolean;
10
+ parentOperation?: ActiveOperation;
11
+ }
12
+ interface ActiveOperation extends ManagedScope {
13
+ operationId: string;
14
+ kind: 'process' | 'file';
15
+ }
16
+ export declare function managedAdmissionDenied(error: unknown): never;
17
+ export declare const currentManagedOperation: () => ActiveOperation | undefined;
18
+ export declare const isManagedAdmissionDenied: (error: unknown) => boolean;
19
+ /** Receipts are supplied by the host adapter, never by Lisp return values. */
20
+ export declare function observeManagedResult(operation: ActiveOperation, value: unknown): Promise<void>;
21
+ /** A child owns the original receipt; the parent is an explicit bridge reference. */
22
+ export declare function mirrorManagedParent(operation: ActiveOperation): Promise<void>;
23
+ /** No authority is granted here. Existing permission checks remain inside dispatch. */
24
+ export declare function runManagedOperation<T>(scope: ManagedScope, input: {
25
+ route: 'native' | 'owned';
26
+ kind: 'process' | 'file';
27
+ request: unknown;
28
+ originalRef?: string;
29
+ }, dispatch: () => Promise<T>): Promise<T>;
30
+ export declare class ManagedDispatchDenied extends Error {
31
+ }
32
+ export {};
33
+ //# sourceMappingURL=managed-operation-runner.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"managed-operation-runner.d.ts","sourceRoot":"","sources":["../../src/dsh/managed-operation-runner.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAA;AAEtD,MAAM,WAAW,eAAe;IAAG,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,cAAc,KAAK,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAAA;CAAE;AACnF,MAAM,WAAW,YAAY;IAAG,QAAQ,EAAE,eAAe,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,OAAO,CAAC;IAAC,MAAM,CAAC,EAAE,OAAO,CAAC;IAAC,eAAe,CAAC,EAAE,eAAe,CAAA;CAAE;AACnJ,UAAU,eAAgB,SAAQ,YAAY;IAAG,WAAW,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,SAAS,GAAG,MAAM,CAAA;CAAE;AAGhG,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,CAAyF;AACtJ,eAAO,MAAM,uBAAuB,mCAA0B,CAAA;AAC9D,eAAO,MAAM,wBAAwB,GAAI,OAAO,OAAO,KAAG,OAA4H,CAAA;AAEtL,8EAA8E;AAC9E,wBAAsB,oBAAoB,CAAC,SAAS,EAAE,eAAe,EAAE,KAAK,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAsBpG;AAED,qFAAqF;AACrF,wBAAsB,mBAAmB,CAAC,SAAS,EAAE,eAAe,GAAG,OAAO,CAAC,IAAI,CAAC,CAcnF;AAED,uFAAuF;AACvF,wBAAsB,mBAAmB,CAAC,CAAC,EAAE,KAAK,EAAE,YAAY,EAAE,KAAK,EAAE;IAAE,KAAK,EAAE,QAAQ,GAAG,OAAO,CAAC;IAAC,IAAI,EAAE,SAAS,GAAG,MAAM,CAAC;IAAC,OAAO,EAAE,OAAO,CAAC;IAAC,WAAW,CAAC,EAAE,MAAM,CAAA;CAAE,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAgChN;AACD,qBAAa,qBAAsB,SAAQ,KAAK;CAAG"}
@@ -0,0 +1,104 @@
1
+ import { canonicalContentHash } from '../serialization/validate.js';
2
+ import { AsyncLocalStorage } from 'node:async_hooks';
3
+ import { ManagedOperationJournal } from './managed-operation-journal.js';
4
+ const active = new AsyncLocalStorage();
5
+ const deniedBeforeDispatch = new WeakSet();
6
+ export function managedAdmissionDenied(error) { if (error && typeof error === 'object')
7
+ deniedBeforeDispatch.add(error); throw error; }
8
+ export const currentManagedOperation = () => active.getStore();
9
+ export const isManagedAdmissionDenied = (error) => error instanceof ManagedDispatchDenied || !!error && typeof error === 'object' && deniedBeforeDispatch.has(error);
10
+ /** Receipts are supplied by the host adapter, never by Lisp return values. */
11
+ export async function observeManagedResult(operation, value) {
12
+ const result = value, receipt = result?.receipt;
13
+ if (!receipt)
14
+ return; // A projected job ID is not a new process observation.
15
+ const stopped = receipt?.processStopped === true;
16
+ const completed = receipt?.state !== 'denied' && (receipt?.state === 'completed' || receipt?.state === 'cancelled' || (receipt?.route === 'native' && stopped));
17
+ const state = receipt?.state === 'denied' && receipt?.processStarted === false ? 'denied' : completed && (operation.kind === 'file' || stopped)
18
+ ? receipt?.cancelled || receipt?.state === 'cancelled' ? receipt?.processStarted === false ? 'cancelled-before-dispatch' : 'cancelled-confirmed' : 'completed'
19
+ : receipt?.state === 'started' && receipt?.processStarted === true ? 'running' : 'unknown';
20
+ const code = result?.exitCode ?? result?.code ?? receipt?.exitCode;
21
+ await operation.database(db => {
22
+ const journal = new ManagedOperationJournal(db), previous = journal.readOperation(operation.operationId);
23
+ if (['completed', 'cancelled-confirmed', 'denied', 'cancelled-before-dispatch'].includes(previous.state))
24
+ return;
25
+ const next = {
26
+ state: state,
27
+ ...(state === 'completed' ? { outcome: operation.kind === 'file' || code === 0 ? 'succeeded' : 'failed' } : {}),
28
+ ...(typeof receipt?.operationId === 'string' ? { receiptRef: canonicalContentHash(receipt) } : {}),
29
+ };
30
+ if (previous.state === 'unknown' && (state === 'completed' || state === 'cancelled-confirmed' || state === 'cancelled-before-dispatch') && next.receiptRef && previous.originalRef === receipt.operationId)
31
+ journal.reconcile(operation.operationId, { ...next, receiptRef: next.receiptRef });
32
+ else
33
+ journal.transition(operation.operationId, next);
34
+ });
35
+ await mirrorManagedParent(operation);
36
+ }
37
+ /** A child owns the original receipt; the parent is an explicit bridge reference. */
38
+ export async function mirrorManagedParent(operation) {
39
+ const parent = operation.parentOperation;
40
+ if (!parent)
41
+ return;
42
+ await operation.database(db => {
43
+ const journal = new ManagedOperationJournal(db), child = journal.readOperation(operation.operationId);
44
+ if (journal.readScope(child.scopeId).parentId !== parent.operationId)
45
+ throw new Error('Managed parent linkage mismatch');
46
+ const previous = journal.readOperation(parent.operationId);
47
+ if (['completed', 'cancelled-confirmed', 'denied', 'cancelled-before-dispatch'].includes(previous.state))
48
+ return;
49
+ if (child.state === 'prepared' || child.state === 'dispatching')
50
+ return;
51
+ const next = { state: child.state, ...(child.outcome ? { outcome: child.outcome } : {}),
52
+ receiptRef: child.receiptRef ?? canonicalContentHash({ childOperation: child.operationId, state: child.state }), ...(child.cause ? { cause: child.cause } : {}) };
53
+ if (previous.state === 'unknown' && ['completed', 'cancelled-confirmed', 'denied', 'cancelled-before-dispatch'].includes(child.state))
54
+ journal.reconcile(parent.operationId, next);
55
+ else if (previous.state !== 'unknown' || child.state === 'unknown')
56
+ journal.transition(parent.operationId, next);
57
+ });
58
+ }
59
+ /** No authority is granted here. Existing permission checks remain inside dispatch. */
60
+ export async function runManagedOperation(scope, input, dispatch) {
61
+ // Owned adapters reached from an already journaled bridge share the same ID.
62
+ if (active.getStore() && !scope.nested)
63
+ return dispatch();
64
+ const operation = await scope.database(db => {
65
+ const journal = new ManagedOperationJournal(db), owner = journal.readScope(scope.scopeId);
66
+ const unresolvedNative = db.prepare(`SELECT 1 FROM dsh_managed_operations o JOIN dsh_managed_scopes s ON s.scope_id=o.scope_id
67
+ WHERE json_extract(s.scope_json,'$.sessionId')=? AND json_extract(o.operation_json,'$.route')='native'
68
+ AND o.state='unknown' LIMIT 1`).get(owner.sessionId);
69
+ if (unresolvedNative) {
70
+ journal.markIncomplete(scope.scopeId);
71
+ throw new Error('Managed native operation requires reconciliation before another effect');
72
+ }
73
+ return journal.prepare(scope.scopeId, input);
74
+ });
75
+ if (!await scope.database(db => new ManagedOperationJournal(db).claim(operation.operationId)))
76
+ throw new Error('Managed operation already dispatched');
77
+ const context = { ...scope, operationId: operation.operationId, kind: input.kind };
78
+ return active.run(context, async () => {
79
+ let value;
80
+ try {
81
+ value = await dispatch();
82
+ }
83
+ catch (error) {
84
+ // Only a host-tagged pre-dispatch denial proves absence of effects.
85
+ const denied = isManagedAdmissionDenied(error);
86
+ await scope.database(db => {
87
+ const journal = new ManagedOperationJournal(db);
88
+ if (!['completed', 'denied', 'cancelled-before-dispatch', 'cancelled-confirmed'].includes(journal.readOperation(operation.operationId).state))
89
+ journal.transition(operation.operationId, { state: denied ? 'denied' : 'unknown' });
90
+ journal.setDelivery(operation.operationId, 'not-delivered');
91
+ });
92
+ throw error;
93
+ }
94
+ await observeManagedResult(context, value);
95
+ await scope.database(db => { const journal = new ManagedOperationJournal(db); if (journal.readOperation(operation.operationId).state === 'dispatching')
96
+ journal.transition(operation.operationId, { state: 'unknown' }); });
97
+ // This denotes the host adapter return, not semantic consumption by Lisp.
98
+ await scope.database(db => new ManagedOperationJournal(db).setDelivery(operation.operationId, 'delivered'));
99
+ return value;
100
+ });
101
+ }
102
+ export class ManagedDispatchDenied extends Error {
103
+ }
104
+ //# sourceMappingURL=managed-operation-runner.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"managed-operation-runner.js","sourceRoot":"","sources":["../../src/dsh/managed-operation-runner.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"opencode-adapter.d.ts","sourceRoot":"","sources":["../../../../src/dsh/models/vendor/opencode-adapter.ts"],"names":[],"mappings":"AAAA,iFAAiF;AACjF,OAAO,EAAE,UAAU,EAAgC,KAAK,eAAe,EAAE,KAAK,WAAW,EAAqB,KAAK,mBAAmB,EAAE,KAAK,oBAAoB,EAAE,MAAM,sBAAsB,CAAA;AAC/L,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,6BAA6B,CAAA;AAIlE,OAAO,EAAE,KAAK,eAAe,EAAsB,KAAK,aAAa,EAAE,MAAM,uBAAuB,CAAA;AACpG,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAA;AA8CtD,UAAU,OAAO;IACf,QAAQ,EAAE,WAAW,CAAC,aAAa,EAAE,eAAe,CAAC,CAAC;IAAC,KAAK,EAAE,cAAc,CAAA;IAC5E,WAAW,CAAC,EAAE,MAAM,eAAe,GAAG,SAAS,CAAC;IAAC,OAAO,CAAC,EAAE,OAAO,KAAK,CAAA;IACvE,SAAS,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE;QAAE,aAAa,CAAC,EAAE,MAAM,CAAC;QAAC,SAAS,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC,CAAA;IAC1F,IAAI,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,IAAI,CAAA;CAChC;AACD,qBAAa,eAAgB,SAAQ,UAAU;IACjC,OAAO,CAAC,QAAQ,CAAC,OAAO;gBAAP,OAAO,EAAE,OAAO;IAQpC,YAAY,CAAC,QAAQ,EAAE,MAAM;;;;IACtC,OAAO,CAAC,UAAU;IAOH,UAAU,CAAC,QAAQ,EAAE,MAAM;;;;;;IAI1C,OAAO,CAAC,QAAQ;IAID,YAAY,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,WAAW;IAClE,WAAW,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,mBAAmB,CAAC;IAOtG,MAAM,CAAC,OAAO,EAAE,eAAe;YACzB,QAAQ;CAiGxB"}
1
+ {"version":3,"file":"opencode-adapter.d.ts","sourceRoot":"","sources":["../../../../src/dsh/models/vendor/opencode-adapter.ts"],"names":[],"mappings":"AAAA,iFAAiF;AACjF,OAAO,EAAE,UAAU,EAAgC,KAAK,eAAe,EAAE,KAAK,WAAW,EAAqB,KAAK,mBAAmB,EAAE,KAAK,oBAAoB,EAAE,MAAM,sBAAsB,CAAA;AAC/L,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,6BAA6B,CAAA;AAIlE,OAAO,EAAE,KAAK,eAAe,EAAsB,KAAK,aAAa,EAAE,MAAM,uBAAuB,CAAA;AACpG,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAA;AA8CtD,UAAU,OAAO;IACf,QAAQ,EAAE,WAAW,CAAC,aAAa,EAAE,eAAe,CAAC,CAAC;IAAC,KAAK,EAAE,cAAc,CAAA;IAC5E,WAAW,CAAC,EAAE,MAAM,eAAe,GAAG,SAAS,CAAC;IAAC,OAAO,CAAC,EAAE,OAAO,KAAK,CAAA;IACvE,SAAS,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE;QAAE,aAAa,CAAC,EAAE,MAAM,CAAC;QAAC,SAAS,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC,CAAA;IAC1F,IAAI,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,IAAI,CAAA;CAChC;AACD,qBAAa,eAAgB,SAAQ,UAAU;IACjC,OAAO,CAAC,QAAQ,CAAC,OAAO;gBAAP,OAAO,EAAE,OAAO;IAQpC,YAAY,CAAC,QAAQ,EAAE,MAAM;;;;IACtC,OAAO,CAAC,UAAU;IAOH,UAAU,CAAC,QAAQ,EAAE,MAAM;;;;;;IAI1C,OAAO,CAAC,QAAQ;IAID,YAAY,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,WAAW;IAClE,WAAW,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,mBAAmB,CAAC;IAOtG,MAAM,CAAC,OAAO,EAAE,eAAe;YACzB,QAAQ;CAkGxB"}
@@ -257,6 +257,8 @@ export class OpenCodeAdapter extends LlmAdapter {
257
257
  const seconds = Number(retryHeader);
258
258
  const retry = typeof retryHeader === 'string' ? Number.isFinite(seconds) ? seconds * 1000 : Date.parse(retryHeader) - Date.now() : undefined;
259
259
  const requestId = responseHeaders?.['x-request-id'] ?? responseHeaders?.['request-id'];
260
+ if (status !== undefined && status >= 200 && status < 300)
261
+ throw new LlmError(`OpenCode response stream failed after HTTP ${status}`, 'PROTOCOL_ERROR', { status, ...(typeof requestId === 'string' && requestId.trim() ? { requestId: requestId } : {}) });
260
262
  throw new LlmError(`OpenCode request failed${status ? `: HTTP ${status}` : ''}`, status === 401 || status === 403 ? 'AUTH' : status === 429 ? 'RATE_LIMIT' : status && status >= 500 ? 'SERVER' : status ? 'PROVIDER_ERROR' : 'TRANSPORT', { ...(status !== undefined ? { status } : {}), ...(retry !== undefined && retry > 0 ? { providerRetryAfterMs: retry } : {}), ...(typeof requestId === 'string' && requestId.trim() ? { requestId: requestId } : {}) });
261
263
  }
262
264
  finally {