@dsh-enhanced/assistant-recovery 0.1.12

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (52) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +178 -0
  3. package/cordis.patch.yml +14 -0
  4. package/lib/attestation.d.ts +18 -0
  5. package/lib/attestation.d.ts.map +1 -0
  6. package/lib/attestation.js +80 -0
  7. package/lib/attestation.js.map +1 -0
  8. package/lib/automation-executor.d.ts +21 -0
  9. package/lib/automation-executor.d.ts.map +1 -0
  10. package/lib/automation-executor.js +141 -0
  11. package/lib/automation-executor.js.map +1 -0
  12. package/lib/catalog.d.ts +16 -0
  13. package/lib/catalog.d.ts.map +1 -0
  14. package/lib/catalog.js +49 -0
  15. package/lib/catalog.js.map +1 -0
  16. package/lib/config.d.ts +34 -0
  17. package/lib/config.d.ts.map +1 -0
  18. package/lib/config.js +101 -0
  19. package/lib/config.js.map +1 -0
  20. package/lib/executor.d.ts +50 -0
  21. package/lib/executor.d.ts.map +1 -0
  22. package/lib/executor.js +413 -0
  23. package/lib/executor.js.map +1 -0
  24. package/lib/index.d.ts +21 -0
  25. package/lib/index.d.ts.map +1 -0
  26. package/lib/index.js +26 -0
  27. package/lib/index.js.map +1 -0
  28. package/lib/port.d.ts +125 -0
  29. package/lib/port.d.ts.map +1 -0
  30. package/lib/port.js +706 -0
  31. package/lib/port.js.map +1 -0
  32. package/lib/service.d.ts +46 -0
  33. package/lib/service.d.ts.map +1 -0
  34. package/lib/service.js +549 -0
  35. package/lib/service.js.map +1 -0
  36. package/lib/sqlite.d.ts +9 -0
  37. package/lib/sqlite.d.ts.map +1 -0
  38. package/lib/sqlite.js +247 -0
  39. package/lib/sqlite.js.map +1 -0
  40. package/lib/store.d.ts +79 -0
  41. package/lib/store.d.ts.map +1 -0
  42. package/lib/store.js +806 -0
  43. package/lib/store.js.map +1 -0
  44. package/lib/types.d.ts +157 -0
  45. package/lib/types.d.ts.map +1 -0
  46. package/lib/types.js +3 -0
  47. package/lib/types.js.map +1 -0
  48. package/lib/version.d.ts +2 -0
  49. package/lib/version.d.ts.map +1 -0
  50. package/lib/version.js +2 -0
  51. package/lib/version.js.map +1 -0
  52. package/package.json +96 -0
package/lib/config.js ADDED
@@ -0,0 +1,101 @@
1
+ import { isAbsolute, resolve } from 'node:path';
2
+ import Schema from '@deepseek-ai/schemastery';
3
+ import { RECOVERY_CATALOG_DIGEST } from './catalog.js';
4
+ const recoveryJobSchema = Schema.object({
5
+ id: Schema.string().required(),
6
+ activationState: Schema.union(['active', 'paused', 'preview']).default('paused'),
7
+ activationNonce: Schema.string().required(),
8
+ catalogDigest: Schema.string().required(),
9
+ workspace: Schema.string().required(),
10
+ preset: Schema.string().required(),
11
+ principal: Schema.string().required(),
12
+ ownerRouteId: Schema.string().required(),
13
+ cron: Schema.string().required(),
14
+ timezone: Schema.string().required(),
15
+ budgetId: Schema.string(),
16
+ budgetAmount: Schema.number().step(1).min(1).max(10_000_000),
17
+ });
18
+ export const ConfigSchema = Schema.object({
19
+ databasePath: Schema.string().required(),
20
+ jobs: Schema.array(recoveryJobSchema).default([]),
21
+ maxStepDurationMs: Schema.number().step(1).min(100).max(60_000).default(10_000),
22
+ });
23
+ function hasControlCharacter(value) {
24
+ return [...value].some((character) => {
25
+ const point = character.codePointAt(0);
26
+ return point <= 0x1f || point === 0x7f;
27
+ });
28
+ }
29
+ function text(value, field, maximumBytes) {
30
+ const normalized = value.normalize('NFC').trim();
31
+ if (normalized === '' || Buffer.byteLength(normalized, 'utf8') > maximumBytes || hasControlCharacter(normalized)) {
32
+ throw new Error(`assistant-recovery: ${field} must contain bounded printable text`);
33
+ }
34
+ return normalized;
35
+ }
36
+ function normalizeJob(value, index) {
37
+ const parsed = recoveryJobSchema(value);
38
+ const workspaceInput = text(parsed.workspace, `jobs[${index}].workspace`, 4_096);
39
+ if (!isAbsolute(workspaceInput))
40
+ throw new Error(`assistant-recovery: jobs[${index}].workspace must be absolute`);
41
+ const workspace = resolve(workspaceInput);
42
+ const catalogDigest = text(parsed.catalogDigest, `jobs[${index}].catalogDigest`, 64).toLowerCase();
43
+ if (catalogDigest !== RECOVERY_CATALOG_DIGEST) {
44
+ throw new Error(`assistant-recovery: jobs[${index}].catalogDigest does not match the compiled runbook`);
45
+ }
46
+ try {
47
+ new Intl.DateTimeFormat('en', { timeZone: parsed.timezone }).format(0);
48
+ }
49
+ catch {
50
+ throw new Error(`assistant-recovery: jobs[${index}].timezone is not a valid IANA timezone`);
51
+ }
52
+ if ((parsed.budgetId === undefined) !== (parsed.budgetAmount === undefined)) {
53
+ throw new Error(`assistant-recovery: jobs[${index}] budgetId and budgetAmount must be supplied together`);
54
+ }
55
+ return Object.freeze({
56
+ ...parsed,
57
+ id: text(parsed.id, `jobs[${index}].id`, 200),
58
+ activationNonce: text(parsed.activationNonce, `jobs[${index}].activationNonce`, 200),
59
+ catalogDigest,
60
+ workspace,
61
+ preset: text(parsed.preset, `jobs[${index}].preset`, 200),
62
+ principal: text(parsed.principal, `jobs[${index}].principal`, 500),
63
+ ownerRouteId: text(parsed.ownerRouteId, `jobs[${index}].ownerRouteId`, 200),
64
+ cron: text(parsed.cron, `jobs[${index}].cron`, 200),
65
+ timezone: text(parsed.timezone, `jobs[${index}].timezone`, 200),
66
+ ...(parsed.budgetId === undefined ? {} : {
67
+ budgetId: text(parsed.budgetId, `jobs[${index}].budgetId`, 200),
68
+ budgetAmount: parsed.budgetAmount,
69
+ }),
70
+ });
71
+ }
72
+ export function normalizeRecoveryConfig(input) {
73
+ let parsed;
74
+ try {
75
+ parsed = ConfigSchema(input);
76
+ }
77
+ catch (error) {
78
+ throw new Error(`assistant-recovery: invalid configuration: ${String(error)}`, { cause: error });
79
+ }
80
+ const databasePathInput = text(parsed.databasePath, 'databasePath', 4_096);
81
+ if (!isAbsolute(databasePathInput))
82
+ throw new Error('assistant-recovery: databasePath must be absolute');
83
+ const databasePath = resolve(databasePathInput);
84
+ if (parsed.jobs.length > 100)
85
+ throw new Error('assistant-recovery: at most 100 jobs are allowed');
86
+ const jobs = parsed.jobs.map(normalizeJob);
87
+ if (new Set(jobs.map(job => job.id)).size !== jobs.length) {
88
+ throw new Error('assistant-recovery: job ids must be unique');
89
+ }
90
+ if (new Set(jobs.map(job => job.activationNonce)).size !== jobs.length) {
91
+ throw new Error('assistant-recovery: activation nonces must be unique');
92
+ }
93
+ for (const [index, job] of jobs.entries()) {
94
+ if (job.activationState !== 'paused' && job.budgetId === undefined) {
95
+ throw new Error(`assistant-recovery: jobs[${index}] preview/active recovery requires a budget tuple`);
96
+ }
97
+ }
98
+ return Object.freeze({ databasePath, jobs: Object.freeze(jobs), maxStepDurationMs: parsed.maxStepDurationMs });
99
+ }
100
+ export const Config = ConfigSchema;
101
+ //# sourceMappingURL=config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,50 @@
1
+ import { RecoveryStore } from './store.js';
2
+ import type { RecoveryRunInput, RecoveryStepAction, RecoveryStepId, StoredRecoveryRun, StoredRecoveryStep } from './types.js';
3
+ export type RecoveryPortSideEffectState = 'none' | 'possible';
4
+ export declare class RecoveryPortError extends Error {
5
+ readonly code: string;
6
+ readonly sideEffectState: RecoveryPortSideEffectState;
7
+ constructor(code: string, sideEffectState: RecoveryPortSideEffectState, message?: string);
8
+ }
9
+ export interface RecoveryStepPlan {
10
+ action: RecoveryStepAction;
11
+ beforeDigest: string;
12
+ }
13
+ export interface RecoveryActionReceipt {
14
+ status: 'noop' | 'succeeded';
15
+ resultCode: string;
16
+ afterDigest: string;
17
+ }
18
+ export interface RecoveryExecutionContext extends RecoveryRunInput {
19
+ runId: string;
20
+ }
21
+ /**
22
+ * Host-only adapter. Planning is read-only; every mutation receives the exact
23
+ * durable idempotency key before it may cross into another service.
24
+ */
25
+ export interface RecoveryRunbookPort {
26
+ plan(context: RecoveryExecutionContext, stepId: RecoveryStepId, signal: AbortSignal): Promise<RecoveryStepPlan>;
27
+ execute(context: RecoveryExecutionContext, stepId: RecoveryStepId, action: RecoveryStepAction, idempotencyKey: string, signal: AbortSignal): Promise<RecoveryActionReceipt>;
28
+ }
29
+ export interface RecoveryExecutorInput extends Omit<RecoveryRunInput, 'catalogDigest'> {
30
+ catalogDigest?: string;
31
+ signal: AbortSignal;
32
+ }
33
+ export interface RecoveryExecutorResult {
34
+ status: 'failed' | 'succeeded' | 'unknown';
35
+ resultCode: string;
36
+ run: StoredRecoveryRun;
37
+ steps: readonly StoredRecoveryStep[];
38
+ }
39
+ export declare class RecoveryExecutor {
40
+ private readonly store;
41
+ private readonly port;
42
+ private readonly maxStepDurationMs;
43
+ constructor(store: RecoveryStore, port: RecoveryRunbookPort, maxStepDurationMs: number);
44
+ execute(input: RecoveryExecutorInput): Promise<RecoveryExecutorResult>;
45
+ private result;
46
+ private operationBudget;
47
+ private settleExpiredStep;
48
+ private settleExpiredRun;
49
+ }
50
+ //# sourceMappingURL=executor.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"executor.d.ts","sourceRoot":"","sources":["../src/executor.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,aAAa,EAAsB,MAAM,YAAY,CAAA;AAC9D,OAAO,KAAK,EACV,gBAAgB,EAChB,kBAAkB,EAClB,cAAc,EACd,iBAAiB,EACjB,kBAAkB,EACnB,MAAM,YAAY,CAAA;AAEnB,MAAM,MAAM,2BAA2B,GAAG,MAAM,GAAG,UAAU,CAAA;AAE7D,qBAAa,iBAAkB,SAAQ,KAAK;IAExC,QAAQ,CAAC,IAAI,EAAE,MAAM;IACrB,QAAQ,CAAC,eAAe,EAAE,2BAA2B;gBAD5C,IAAI,EAAE,MAAM,EACZ,eAAe,EAAE,2BAA2B,EACrD,OAAO,SAAO;CAKjB;AAED,MAAM,WAAW,gBAAgB;IAC/B,MAAM,EAAE,kBAAkB,CAAA;IAC1B,YAAY,EAAE,MAAM,CAAA;CACrB;AAED,MAAM,WAAW,qBAAqB;IACpC,MAAM,EAAE,MAAM,GAAG,WAAW,CAAA;IAC5B,UAAU,EAAE,MAAM,CAAA;IAClB,WAAW,EAAE,MAAM,CAAA;CACpB;AAED,MAAM,WAAW,wBAAyB,SAAQ,gBAAgB;IAChE,KAAK,EAAE,MAAM,CAAA;CACd;AAED;;;GAGG;AACH,MAAM,WAAW,mBAAmB;IAClC,IAAI,CACF,OAAO,EAAE,wBAAwB,EACjC,MAAM,EAAE,cAAc,EACtB,MAAM,EAAE,WAAW,GAClB,OAAO,CAAC,gBAAgB,CAAC,CAAA;IAC5B,OAAO,CACL,OAAO,EAAE,wBAAwB,EACjC,MAAM,EAAE,cAAc,EACtB,MAAM,EAAE,kBAAkB,EAC1B,cAAc,EAAE,MAAM,EACtB,MAAM,EAAE,WAAW,GAClB,OAAO,CAAC,qBAAqB,CAAC,CAAA;CAClC;AAED,MAAM,WAAW,qBAAsB,SAAQ,IAAI,CAAC,gBAAgB,EAAE,eAAe,CAAC;IACpF,aAAa,CAAC,EAAE,MAAM,CAAA;IACtB,MAAM,EAAE,WAAW,CAAA;CACpB;AAED,MAAM,WAAW,sBAAsB;IACrC,MAAM,EAAE,QAAQ,GAAG,WAAW,GAAG,SAAS,CAAA;IAC1C,UAAU,EAAE,MAAM,CAAA;IAClB,GAAG,EAAE,iBAAiB,CAAA;IACtB,KAAK,EAAE,SAAS,kBAAkB,EAAE,CAAA;CACrC;AAoHD,qBAAa,gBAAgB;IAEzB,OAAO,CAAC,QAAQ,CAAC,KAAK;IACtB,OAAO,CAAC,QAAQ,CAAC,IAAI;IACrB,OAAO,CAAC,QAAQ,CAAC,iBAAiB;gBAFjB,KAAK,EAAE,aAAa,EACpB,IAAI,EAAE,mBAAmB,EACzB,iBAAiB,EAAE,MAAM;IAOtC,OAAO,CAAC,KAAK,EAAE,qBAAqB,GAAG,OAAO,CAAC,sBAAsB,CAAC;IA6P5E,OAAO,CAAC,MAAM;IAUd,OAAO,CAAC,eAAe;IAcvB,OAAO,CAAC,iBAAiB;IA2BzB,OAAO,CAAC,gBAAgB;CAUzB"}
@@ -0,0 +1,413 @@
1
+ import { createHash } from 'node:crypto';
2
+ import { RECOVERY_CATALOG, RECOVERY_CATALOG_DIGEST } from './catalog.js';
3
+ import { RecoveryStore, RecoveryStoreError } from './store.js';
4
+ export class RecoveryPortError extends Error {
5
+ code;
6
+ sideEffectState;
7
+ constructor(code, sideEffectState, message = code) {
8
+ super(message);
9
+ this.code = code;
10
+ this.sideEffectState = sideEffectState;
11
+ this.name = 'RecoveryPortError';
12
+ }
13
+ }
14
+ const DIGEST = /^[a-f\d]{64}$/u;
15
+ const CODE = /^[a-z\d][a-z\d.-]{0,63}$/u;
16
+ const UNKNOWN_STATE_DIGEST = createHash('sha256').update('assistant-recovery:unknown-state:v1').digest('hex');
17
+ function stableCode(value, fallback) {
18
+ if (typeof value !== 'string')
19
+ return fallback;
20
+ const normalized = value.normalize('NFC').trim().toLowerCase();
21
+ return CODE.test(normalized) ? normalized : fallback;
22
+ }
23
+ function errorCode(error, fallback) {
24
+ return error instanceof RecoveryPortError ? stableCode(error.code, fallback) : fallback;
25
+ }
26
+ function stateDigest(value, field, sideEffectState) {
27
+ if (typeof value !== 'string' || !DIGEST.test(value)) {
28
+ throw new RecoveryPortError(`${field}-invalid`, sideEffectState);
29
+ }
30
+ return value;
31
+ }
32
+ function receiptCode(value, sideEffectState) {
33
+ const normalized = stableCode(value, '');
34
+ if (normalized === '')
35
+ throw new RecoveryPortError('result-code-invalid', sideEffectState);
36
+ return normalized;
37
+ }
38
+ function isMutation(action) {
39
+ return !['noop', 'verify-authority', 'verify-health'].includes(action.kind);
40
+ }
41
+ function isRequiredVerification(stepId) {
42
+ return stepId === 'authority-admission' || stepId === 'verification';
43
+ }
44
+ function terminalStatus(step) {
45
+ if (step.status === 'failed')
46
+ return 'failed';
47
+ if (step.status === 'unknown')
48
+ return 'unknown';
49
+ return undefined;
50
+ }
51
+ async function bounded(input) {
52
+ if (input.parentSignal.aborted)
53
+ throw new RecoveryPortError('execution-cancelled', 'none');
54
+ const controller = new AbortController();
55
+ const abort = () => controller.abort(input.parentSignal.reason);
56
+ input.parentSignal.addEventListener('abort', abort, { once: true });
57
+ let timeout;
58
+ const timeoutPromise = new Promise((_resolve, reject) => {
59
+ timeout = setTimeout(() => {
60
+ controller.abort(new Error('assistant-recovery step timed out'));
61
+ const error = new Error('assistant-recovery step timed out');
62
+ error.recoveryTimeout = true;
63
+ if (input.deadlineLimited)
64
+ error.recoveryDeadline = true;
65
+ reject(error);
66
+ }, input.timeoutMs);
67
+ });
68
+ let cancelWaiter;
69
+ const cancelledPromise = new Promise((_resolve, reject) => {
70
+ if (input.settleAfterCancellation)
71
+ return;
72
+ if (input.parentSignal.aborted) {
73
+ reject(new RecoveryPortError('execution-cancelled', 'none'));
74
+ return;
75
+ }
76
+ cancelWaiter = () => {
77
+ const error = new Error('assistant-recovery execution cancelled');
78
+ error.recoveryCancelled = true;
79
+ reject(error);
80
+ };
81
+ input.parentSignal.addEventListener('abort', cancelWaiter, { once: true });
82
+ });
83
+ // Promise.race attaches a rejection observer to the operation. A late result
84
+ // after timeout is deliberately ignored and cannot mutate the durable run.
85
+ const operation = Promise.resolve().then(() => input.operation(controller.signal));
86
+ try {
87
+ return await Promise.race(input.settleAfterCancellation
88
+ ? [operation, timeoutPromise]
89
+ : [operation, timeoutPromise, cancelledPromise]);
90
+ }
91
+ finally {
92
+ if (timeout !== undefined)
93
+ clearTimeout(timeout);
94
+ input.parentSignal.removeEventListener('abort', abort);
95
+ if (cancelWaiter !== undefined)
96
+ input.parentSignal.removeEventListener('abort', cancelWaiter);
97
+ }
98
+ }
99
+ function isTimeout(error) {
100
+ return error instanceof Error && error.recoveryTimeout === true;
101
+ }
102
+ function isDeadlineTimeout(error) {
103
+ return isTimeout(error) && error.recoveryDeadline === true;
104
+ }
105
+ function isCancelled(error) {
106
+ return error instanceof Error && error.recoveryCancelled === true;
107
+ }
108
+ export class RecoveryExecutor {
109
+ store;
110
+ port;
111
+ maxStepDurationMs;
112
+ constructor(store, port, maxStepDurationMs) {
113
+ this.store = store;
114
+ this.port = port;
115
+ this.maxStepDurationMs = maxStepDurationMs;
116
+ if (!Number.isSafeInteger(maxStepDurationMs) || maxStepDurationMs < 100 || maxStepDurationMs > 60_000) {
117
+ throw new Error('assistant-recovery: maxStepDurationMs must be an integer from 100 to 60000');
118
+ }
119
+ }
120
+ async execute(input) {
121
+ const begun = this.store.beginRun({
122
+ occurrenceId: input.occurrenceId,
123
+ automationId: input.automationId,
124
+ definitionHash: input.definitionHash,
125
+ executionMode: input.executionMode,
126
+ targetScope: input.targetScope,
127
+ principal: input.principal,
128
+ ownerRouteId: input.ownerRouteId,
129
+ activationNonce: input.activationNonce,
130
+ activationPlanDigest: input.activationPlanDigest,
131
+ catalogDigest: input.catalogDigest ?? RECOVERY_CATALOG_DIGEST,
132
+ });
133
+ let run = begun.run;
134
+ if (run.status !== 'running')
135
+ return this.result(run);
136
+ const context = Object.freeze({
137
+ occurrenceId: run.occurrenceId,
138
+ automationId: run.automationId,
139
+ definitionHash: run.definitionHash,
140
+ executionMode: run.executionMode,
141
+ targetScope: run.targetScope,
142
+ principal: run.principal,
143
+ ownerRouteId: run.ownerRouteId,
144
+ activationNonce: run.activationNonce,
145
+ activationPlanDigest: run.activationPlanDigest,
146
+ catalogDigest: run.catalogDigest,
147
+ runId: run.id,
148
+ });
149
+ for (const catalogStep of RECOVERY_CATALOG) {
150
+ let step = this.store.getStep(run.id, catalogStep.id);
151
+ const resumedIntent = step?.status === 'started';
152
+ if (step !== undefined && step.status !== 'started') {
153
+ const failed = terminalStatus(step);
154
+ if (failed !== undefined) {
155
+ run = this.store.completeRun({
156
+ runId: run.id,
157
+ expectedVersion: run.version,
158
+ status: failed,
159
+ resultCode: stableCode(step.resultCode, `step-${failed}`),
160
+ });
161
+ return this.result(run);
162
+ }
163
+ continue;
164
+ }
165
+ if (step === undefined) {
166
+ const planBudget = this.operationBudget(run.deadlineAt);
167
+ if (planBudget.remainingMs <= 0) {
168
+ return this.settleExpiredRun(run);
169
+ }
170
+ let plan;
171
+ try {
172
+ plan = await bounded({
173
+ parentSignal: input.signal,
174
+ timeoutMs: planBudget.timeoutMs,
175
+ deadlineLimited: planBudget.deadlineLimited,
176
+ operation: signal => this.port.plan(context, catalogStep.id, signal),
177
+ });
178
+ plan = { ...plan, beforeDigest: stateDigest(plan.beforeDigest, 'before-digest', 'none') };
179
+ }
180
+ catch (error) {
181
+ if (isDeadlineTimeout(error)
182
+ || this.store.deadlineRemainingMs(run.deadlineAt) <= 0) {
183
+ return this.settleExpiredRun(run);
184
+ }
185
+ const code = isTimeout(error)
186
+ ? 'planning-timeout'
187
+ : isCancelled(error)
188
+ ? 'planning-cancelled'
189
+ : errorCode(error, 'planning-failed');
190
+ try {
191
+ step = this.store.beginStep({
192
+ runId: run.id,
193
+ stepId: catalogStep.id,
194
+ action: { kind: 'noop', reasonCode: code },
195
+ beforeDigest: UNKNOWN_STATE_DIGEST,
196
+ }).step;
197
+ }
198
+ catch (storeError) {
199
+ if (storeError instanceof RecoveryStoreError && storeError.code === 'deadline-expired') {
200
+ return this.settleExpiredRun(run);
201
+ }
202
+ throw storeError;
203
+ }
204
+ this.store.completeStep({
205
+ runId: run.id,
206
+ stepId: catalogStep.id,
207
+ expectedVersion: step.version,
208
+ status: 'failed',
209
+ beforeDigest: step.beforeDigest,
210
+ afterDigest: UNKNOWN_STATE_DIGEST,
211
+ resultCode: code,
212
+ });
213
+ run = this.store.completeRun({
214
+ runId: run.id,
215
+ expectedVersion: run.version,
216
+ status: 'failed',
217
+ resultCode: code,
218
+ });
219
+ return this.result(run);
220
+ }
221
+ if (this.store.deadlineRemainingMs(run.deadlineAt) <= 0) {
222
+ return this.settleExpiredRun(run);
223
+ }
224
+ try {
225
+ step = this.store.beginStep({
226
+ runId: run.id,
227
+ stepId: catalogStep.id,
228
+ action: plan.action,
229
+ beforeDigest: plan.beforeDigest,
230
+ }).step;
231
+ }
232
+ catch (error) {
233
+ if (error instanceof RecoveryStoreError && error.code === 'deadline-expired') {
234
+ return this.settleExpiredRun(run);
235
+ }
236
+ throw error;
237
+ }
238
+ }
239
+ const actionBudget = this.operationBudget(run.deadlineAt, step.deadlineAt);
240
+ if (actionBudget.remainingMs <= 0) {
241
+ return this.settleExpiredStep(run, step);
242
+ }
243
+ if (step.action.kind === 'noop') {
244
+ const required = isRequiredVerification(catalogStep.id);
245
+ this.store.completeStep({
246
+ runId: run.id,
247
+ stepId: catalogStep.id,
248
+ expectedVersion: step.version,
249
+ status: required ? 'failed' : 'noop',
250
+ beforeDigest: step.beforeDigest,
251
+ afterDigest: step.beforeDigest,
252
+ resultCode: required ? 'required-verification-missing' : step.action.reasonCode,
253
+ });
254
+ if (required) {
255
+ run = this.store.completeRun({
256
+ runId: run.id,
257
+ expectedVersion: run.version,
258
+ status: 'failed',
259
+ resultCode: 'required-verification-missing',
260
+ });
261
+ return this.result(run);
262
+ }
263
+ continue;
264
+ }
265
+ if (context.executionMode === 'preview' && isMutation(step.action)) {
266
+ this.store.completeStep({
267
+ runId: run.id,
268
+ stepId: catalogStep.id,
269
+ expectedVersion: step.version,
270
+ status: 'noop',
271
+ beforeDigest: step.beforeDigest,
272
+ afterDigest: step.beforeDigest,
273
+ resultCode: 'preview-suppressed',
274
+ });
275
+ continue;
276
+ }
277
+ let receipt;
278
+ try {
279
+ receipt = await bounded({
280
+ parentSignal: input.signal,
281
+ timeoutMs: actionBudget.timeoutMs,
282
+ deadlineLimited: actionBudget.deadlineLimited,
283
+ settleAfterCancellation: isMutation(step.action),
284
+ operation: signal => this.port.execute(context, catalogStep.id, step.action, step.idempotencyKey, signal),
285
+ });
286
+ receipt = {
287
+ ...receipt,
288
+ resultCode: receiptCode(receipt.resultCode, isMutation(step.action) ? 'possible' : 'none'),
289
+ afterDigest: stateDigest(receipt.afterDigest, 'after-digest', isMutation(step.action) ? 'possible' : 'none'),
290
+ };
291
+ }
292
+ catch (error) {
293
+ const mutating = isMutation(step.action);
294
+ const knownNoEffect = error instanceof RecoveryPortError && error.sideEffectState === 'none';
295
+ // A durable started mutation may be resuming after the prior process
296
+ // crossed the external boundary and crashed before recording its
297
+ // receipt. Even a newly proven pre-effect refusal cannot prove that the
298
+ // earlier call had no effect; only a successful idempotent replay can
299
+ // settle it as known.
300
+ const deadlineExpired = isDeadlineTimeout(error);
301
+ const ambiguous = mutating && (deadlineExpired || resumedIntent || !knownNoEffect);
302
+ const status = ambiguous ? 'unknown' : 'failed';
303
+ const code = deadlineExpired
304
+ ? (ambiguous ? 'action-deadline-expired-ambiguous' : 'action-deadline-expired')
305
+ : isTimeout(error)
306
+ ? (ambiguous ? 'action-timeout-ambiguous' : 'action-timeout')
307
+ : isCancelled(error)
308
+ ? (ambiguous ? 'action-cancelled-ambiguous' : 'action-cancelled')
309
+ : errorCode(error, ambiguous ? 'action-ambiguous' : 'action-failed');
310
+ this.store.completeStep({
311
+ runId: run.id,
312
+ stepId: catalogStep.id,
313
+ expectedVersion: step.version,
314
+ status,
315
+ beforeDigest: step.beforeDigest,
316
+ afterDigest: UNKNOWN_STATE_DIGEST,
317
+ resultCode: code,
318
+ });
319
+ run = this.store.completeRun({
320
+ runId: run.id,
321
+ expectedVersion: run.version,
322
+ status,
323
+ resultCode: code,
324
+ });
325
+ return this.result(run);
326
+ }
327
+ // Durable settlement is intentionally outside the port exception block.
328
+ // If the SQLite commit itself fails after an external action, do not
329
+ // misclassify that storage error and overwrite a possibly committed
330
+ // receipt with a contradictory action failure. A restart will observe
331
+ // either the started intent or the exact terminal receipt and resume.
332
+ const requiredNoop = isRequiredVerification(catalogStep.id) && receipt.status !== 'succeeded';
333
+ this.store.completeStep({
334
+ runId: run.id,
335
+ stepId: catalogStep.id,
336
+ expectedVersion: step.version,
337
+ status: requiredNoop ? 'failed' : receipt.status,
338
+ beforeDigest: step.beforeDigest,
339
+ afterDigest: receipt.afterDigest,
340
+ resultCode: requiredNoop ? 'required-verification-noop' : receipt.resultCode,
341
+ });
342
+ if (requiredNoop) {
343
+ run = this.store.completeRun({
344
+ runId: run.id,
345
+ expectedVersion: run.version,
346
+ status: 'failed',
347
+ resultCode: 'required-verification-noop',
348
+ });
349
+ return this.result(run);
350
+ }
351
+ }
352
+ run = this.store.completeRun({
353
+ runId: run.id,
354
+ expectedVersion: run.version,
355
+ status: 'succeeded',
356
+ resultCode: context.executionMode === 'preview' ? 'preview-verified' : 'runbook-complete',
357
+ });
358
+ return this.result(run);
359
+ }
360
+ result(run) {
361
+ if (run.status === 'running')
362
+ throw new Error('assistant-recovery: cannot expose a non-terminal executor result');
363
+ return Object.freeze({
364
+ status: run.status,
365
+ resultCode: run.resultCode,
366
+ run,
367
+ steps: Object.freeze(this.store.listSteps(run.id)),
368
+ });
369
+ }
370
+ operationBudget(...deadlines) {
371
+ const deadlineAt = Math.min(...deadlines);
372
+ const remainingMs = this.store.deadlineRemainingMs(deadlineAt);
373
+ return Object.freeze({
374
+ remainingMs,
375
+ timeoutMs: Math.max(1, Math.min(this.maxStepDurationMs, remainingMs)),
376
+ deadlineLimited: remainingMs <= this.maxStepDurationMs,
377
+ });
378
+ }
379
+ settleExpiredStep(run, step) {
380
+ const ambiguous = isMutation(step.action);
381
+ const status = ambiguous ? 'unknown' : 'failed';
382
+ const code = ambiguous
383
+ ? 'action-deadline-expired-ambiguous'
384
+ : 'action-deadline-expired';
385
+ this.store.completeStep({
386
+ runId: run.id,
387
+ stepId: step.stepId,
388
+ expectedVersion: step.version,
389
+ status,
390
+ beforeDigest: step.beforeDigest,
391
+ afterDigest: UNKNOWN_STATE_DIGEST,
392
+ resultCode: code,
393
+ });
394
+ const completed = this.store.completeRun({
395
+ runId: run.id,
396
+ expectedVersion: run.version,
397
+ status,
398
+ resultCode: code,
399
+ });
400
+ return this.result(completed);
401
+ }
402
+ settleExpiredRun(run) {
403
+ const code = 'run-deadline-expired';
404
+ const completed = this.store.completeRun({
405
+ runId: run.id,
406
+ expectedVersion: run.version,
407
+ status: 'failed',
408
+ resultCode: code,
409
+ });
410
+ return this.result(completed);
411
+ }
412
+ }
413
+ //# sourceMappingURL=executor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"executor.js","sourceRoot":"","sources":["../src/executor.ts"],"names":[],"mappings":"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"}
package/lib/index.d.ts ADDED
@@ -0,0 +1,21 @@
1
+ import type { Context } from '@deepseek-ai/cordis';
2
+ import { AssistantRecoveryService, Config } from './service.js';
3
+ import type { Config as ConfigType } from './config.js';
4
+ import { version } from './version.js';
5
+ export declare const name = "dsh-enhanced-assistant-recovery";
6
+ export declare const inject: string[];
7
+ export { AssistantRecoveryService, Config, version };
8
+ export type { ConfigType as AssistantRecoveryConfig };
9
+ export * from './attestation.js';
10
+ export * from './automation-executor.js';
11
+ export * from './catalog.js';
12
+ export { ConfigSchema, normalizeRecoveryConfig, } from './config.js';
13
+ export type { NormalizedConfig, NormalizedRecoveryJob, RecoveryActivationState, RecoveryJobConfig, } from './config.js';
14
+ export * from './executor.js';
15
+ export * from './port.js';
16
+ export { AssistantRecoveryError, recoveryActivationPlanDigest, recoveryAutomationDefinition, recoveryAutomationId, } from './service.js';
17
+ export * from './store.js';
18
+ export * from './types.js';
19
+ export declare function apply(ctx: Context, config: ConfigType): void;
20
+ export default AssistantRecoveryService;
21
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAA;AAClD,OAAO,EAAE,wBAAwB,EAAE,MAAM,EAAE,MAAM,cAAc,CAAA;AAC/D,OAAO,KAAK,EAAE,MAAM,IAAI,UAAU,EAAE,MAAM,aAAa,CAAA;AACvD,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAA;AAEtC,eAAO,MAAM,IAAI,oCAAoC,CAAA;AACrD,eAAO,MAAM,MAAM,UAOlB,CAAA;AACD,OAAO,EAAE,wBAAwB,EAAE,MAAM,EAAE,OAAO,EAAE,CAAA;AACpD,YAAY,EAAE,UAAU,IAAI,uBAAuB,EAAE,CAAA;AACrD,cAAc,kBAAkB,CAAA;AAChC,cAAc,0BAA0B,CAAA;AACxC,cAAc,cAAc,CAAA;AAC5B,OAAO,EACL,YAAY,EACZ,uBAAuB,GACxB,MAAM,aAAa,CAAA;AACpB,YAAY,EACV,gBAAgB,EAChB,qBAAqB,EACrB,uBAAuB,EACvB,iBAAiB,GAClB,MAAM,aAAa,CAAA;AACpB,cAAc,eAAe,CAAA;AAC7B,cAAc,WAAW,CAAA;AACzB,OAAO,EACL,sBAAsB,EACtB,4BAA4B,EAC5B,4BAA4B,EAC5B,oBAAoB,GACrB,MAAM,cAAc,CAAA;AACrB,cAAc,YAAY,CAAA;AAC1B,cAAc,YAAY,CAAA;AAE1B,wBAAgB,KAAK,CAAC,GAAG,EAAE,OAAO,EAAE,MAAM,EAAE,UAAU,GAAG,IAAI,CAE5D;AAED,eAAe,wBAAwB,CAAA"}