@sensigo/realm 0.7.0 → 0.8.0

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.
@@ -0,0 +1,45 @@
1
+ import { WorkflowError } from '../types/workflow-error.js';
2
+ /**
3
+ * Decide what to do when an idempotency key matches an existing run, per the caller's policy.
4
+ * Returns `'reuse'` (return the existing run, `created:false`) or `'supersede'` (mint a fresh run,
5
+ * `created:true`); throws a `WorkflowError` for the `fail` / `reject` policies. Pure — no I/O.
6
+ *
7
+ * Defaults (`reuse` / `use_existing`) reproduce PR 1 behavior exactly.
8
+ */
9
+ export function decideIdempotencyPolicy(matched, options) {
10
+ const onTerminalMatch = options.onTerminalMatch ?? 'reuse';
11
+ const onLiveMatch = options.onLiveMatch ?? 'use_existing';
12
+ if (!matched.terminal_state) {
13
+ // Live match (running / gate_waiting).
14
+ if (onLiveMatch === 'fail') {
15
+ throw new WorkflowError(`Idempotency key for workflow '${matched.workflow_id}' is owned by an active run '${matched.id}' (phase '${matched.run_phase}').`, {
16
+ code: 'STATE_RUN_ALREADY_ACTIVE',
17
+ category: 'STATE',
18
+ agentAction: 'report_to_user',
19
+ retryable: false,
20
+ details: { existingRunId: matched.id, run_phase: matched.run_phase },
21
+ });
22
+ }
23
+ return 'reuse'; // use_existing
24
+ }
25
+ // Terminal match.
26
+ switch (onTerminalMatch) {
27
+ case 'reject':
28
+ throw new WorkflowError(`Idempotency key for workflow '${matched.workflow_id}' was already used by run '${matched.id}' (terminal phase '${matched.run_phase}').`, {
29
+ code: 'STATE_IDEMPOTENCY_KEY_USED',
30
+ category: 'STATE',
31
+ agentAction: 'report_to_user',
32
+ retryable: false,
33
+ details: { existingRunId: matched.id, run_phase: matched.run_phase },
34
+ });
35
+ case 'rerun':
36
+ return 'supersede';
37
+ case 'rerun_if_failed':
38
+ // completed ⇒ reuse (benign skip — closed-ticket re-run use case); else supersede.
39
+ return matched.run_phase === 'completed' ? 'reuse' : 'supersede';
40
+ case 'reuse':
41
+ default:
42
+ return 'reuse';
43
+ }
44
+ }
45
+ //# sourceMappingURL=idempotency-policy.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"idempotency-policy.js","sourceRoot":"","sources":["../../src/store/idempotency-policy.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,aAAa,EAAE,MAAM,4BAA4B,CAAC;AAK3D;;;;;;GAMG;AACH,MAAM,UAAU,uBAAuB,CACrC,OAA+E,EAC/E,OAAkE;IAElE,MAAM,eAAe,GAAG,OAAO,CAAC,eAAe,IAAI,OAAO,CAAC;IAC3D,MAAM,WAAW,GAAG,OAAO,CAAC,WAAW,IAAI,cAAc,CAAC;IAE1D,IAAI,CAAC,OAAO,CAAC,cAAc,EAAE,CAAC;QAC5B,uCAAuC;QACvC,IAAI,WAAW,KAAK,MAAM,EAAE,CAAC;YAC3B,MAAM,IAAI,aAAa,CACrB,iCAAiC,OAAO,CAAC,WAAW,gCAAgC,OAAO,CAAC,EAAE,aAAa,OAAO,CAAC,SAAS,KAAK,EACjI;gBACE,IAAI,EAAE,0BAA0B;gBAChC,QAAQ,EAAE,OAAO;gBACjB,WAAW,EAAE,gBAAgB;gBAC7B,SAAS,EAAE,KAAK;gBAChB,OAAO,EAAE,EAAE,aAAa,EAAE,OAAO,CAAC,EAAE,EAAE,SAAS,EAAE,OAAO,CAAC,SAAS,EAAE;aACrE,CACF,CAAC;QACJ,CAAC;QACD,OAAO,OAAO,CAAC,CAAC,eAAe;IACjC,CAAC;IAED,kBAAkB;IAClB,QAAQ,eAAe,EAAE,CAAC;QACxB,KAAK,QAAQ;YACX,MAAM,IAAI,aAAa,CACrB,iCAAiC,OAAO,CAAC,WAAW,8BAA8B,OAAO,CAAC,EAAE,sBAAsB,OAAO,CAAC,SAAS,KAAK,EACxI;gBACE,IAAI,EAAE,4BAA4B;gBAClC,QAAQ,EAAE,OAAO;gBACjB,WAAW,EAAE,gBAAgB;gBAC7B,SAAS,EAAE,KAAK;gBAChB,OAAO,EAAE,EAAE,aAAa,EAAE,OAAO,CAAC,EAAE,EAAE,SAAS,EAAE,OAAO,CAAC,SAAS,EAAE;aACrE,CACF,CAAC;QACJ,KAAK,OAAO;YACV,OAAO,WAAW,CAAC;QACrB,KAAK,iBAAiB;YACpB,mFAAmF;YACnF,OAAO,OAAO,CAAC,SAAS,KAAK,WAAW,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,WAAW,CAAC;QACnE,KAAK,OAAO,CAAC;QACb;YACE,OAAO,OAAO,CAAC;IACnB,CAAC;AACH,CAAC"}
@@ -1,14 +1,62 @@
1
1
  import type { RunRecord } from '../types/run-record.js';
2
2
  import type { WorkflowDefinition } from '../types/workflow-definition.js';
3
3
  import type { RunStore, CreateRunOptions } from './store-interface.js';
4
+ /** Summary returned by {@link JsonFileStore.reconcileKeys}. */
5
+ export interface ReconcileSummary {
6
+ /** Number of distinct (workflow_id, idempotency_key) groups encountered. */
7
+ groups: number;
8
+ /** Number of pointers written (or, in dry-run, that would be written). */
9
+ keysWritten: number;
10
+ /** Pointers already pointing at the canonical run (no write needed). */
11
+ keysUnchanged: number;
12
+ /** True when no files were written. */
13
+ dryRun: boolean;
14
+ /** Groups that had more than one run sharing the same key. */
15
+ duplicateGroups: Array<{
16
+ workflow_id: string;
17
+ key: string;
18
+ canonical_run_id: string;
19
+ other_run_ids: string[];
20
+ }>;
21
+ /** Data-integrity finding: groups with more than one *live* (non-terminal) run. */
22
+ multipleLiveGroups: Array<{
23
+ workflow_id: string;
24
+ key: string;
25
+ canonical_run_id: string;
26
+ extra_live_run_ids: string[];
27
+ }>;
28
+ }
4
29
  export declare class JsonFileStore implements RunStore {
5
30
  private readonly runsDir;
6
31
  constructor(runsDir?: string);
7
32
  /** The directory where run JSON files are stored. */
8
33
  get runsDirPath(): string;
9
34
  private filePath;
35
+ /** Directory holding the idempotency-key pointer index. Invisible to `list()` (no `.json` suffix). */
36
+ private keysDir;
37
+ /** Pointer file path for one (workflowId, key) pair. */
38
+ private keyPath;
10
39
  private ensureDir;
11
- create(options: CreateRunOptions): Promise<RunRecord>;
40
+ private ensureKeysDir;
41
+ /** Read a pointer file; returns undefined if absent or unparseable (self-heals via reclaim/fallback). */
42
+ private readPointer;
43
+ /** Write (or overwrite) a pointer file for `run` under `key`. params_hash is derived from the owned run. */
44
+ private writePointer;
45
+ /** Build and persist a brand-new run record (today's path, factored out). */
46
+ private writeFreshRun;
47
+ /** Find the canonical pre-existing run for (workflowId, key) via the legacy `idempotency_key` field. */
48
+ private findCanonicalLegacyRun;
49
+ create(options: CreateRunOptions): Promise<{
50
+ run: RunRecord;
51
+ created: boolean;
52
+ }>;
53
+ /**
54
+ * Supersede the current key owner with a fresh run (must be called under the per-key lock):
55
+ * run file FIRST, then an atomic pointer overwrite to the successor (PR 1 ordering). The
56
+ * superseded run stays on disk by id (auditable); `pickCanonical` prefers the newer successor,
57
+ * so a lost pointer self-heals to the new run.
58
+ */
59
+ private supersede;
12
60
  get(runId: string): Promise<RunRecord>;
13
61
  update(record: RunRecord): Promise<RunRecord>;
14
62
  claimStep(runId: string, stepName: string, definition: WorkflowDefinition): Promise<RunRecord>;
@@ -17,8 +65,23 @@ export declare class JsonFileStore implements RunStore {
17
65
  * Used for importing records fetched from a remote store.
18
66
  * Idempotent: if the record already exists with the same version, this is a no-op.
19
67
  * Does NOT increment version or apply the optimistic lock — this is an import, not an update.
68
+ * When the record carries an idempotency_key, the key pointer is registered/repointed
69
+ * (closing the import back door): a conflict with a different *live* owner throws.
20
70
  */
21
71
  save(record: RunRecord): Promise<void>;
72
+ /**
73
+ * Register (or repoint) the idempotency-key pointer for an imported record, under the
74
+ * per-key lock. If the key is already owned by a DIFFERENT live run, refuse and throw
75
+ * (a missing or terminal prior owner is safely repointed).
76
+ */
77
+ private registerImportedKey;
78
+ /**
79
+ * Eager migration: build the key pointer index from the legacy `idempotency_key` field on
80
+ * existing runs. Groups runs by (workflow_id, key), writes the pointer to the canonical run
81
+ * (see {@link pickCanonical}). Idempotent (re-running writes nothing new), reversible (only
82
+ * touches `keys/`; never mutates or deletes run files).
83
+ */
84
+ reconcileKeys(workflowId?: string, dryRun?: boolean): Promise<ReconcileSummary>;
22
85
  list(workflowId?: string): Promise<RunRecord[]>;
23
86
  }
24
87
  //# sourceMappingURL=json-file-store.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"json-file-store.d.ts","sourceRoot":"","sources":["../../src/store/json-file-store.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAC;AACxD,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,iCAAiC,CAAC;AAE1E,OAAO,KAAK,EAAE,QAAQ,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AAKvE,qBAAa,aAAc,YAAW,QAAQ;IAC5C,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAS;gBAErB,OAAO,CAAC,EAAE,MAAM;IAI5B,qDAAqD;IACrD,IAAI,WAAW,IAAI,MAAM,CAExB;IAED,OAAO,CAAC,QAAQ;YAIF,SAAS;IAIjB,MAAM,CAAC,OAAO,EAAE,gBAAgB,GAAG,OAAO,CAAC,SAAS,CAAC;IAiCrD,GAAG,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,CAAC;IAgCtC,MAAM,CAAC,MAAM,EAAE,SAAS,GAAG,OAAO,CAAC,SAAS,CAAC;IA0C7C,SAAS,CACb,KAAK,EAAE,MAAM,EACb,QAAQ,EAAE,MAAM,EAChB,UAAU,EAAE,kBAAkB,GAC7B,OAAO,CAAC,SAAS,CAAC;IAoErB;;;;;OAKG;IACG,IAAI,CAAC,MAAM,EAAE,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC;IAyBtC,IAAI,CAAC,UAAU,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,EAAE,CAAC;CAiBtD"}
1
+ {"version":3,"file":"json-file-store.d.ts","sourceRoot":"","sources":["../../src/store/json-file-store.ts"],"names":[],"mappings":"AASA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAC;AACxD,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,iCAAiC,CAAC;AAE1E,OAAO,KAAK,EAAE,QAAQ,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AAuBvE,+DAA+D;AAC/D,MAAM,WAAW,gBAAgB;IAC/B,4EAA4E;IAC5E,MAAM,EAAE,MAAM,CAAC;IACf,0EAA0E;IAC1E,WAAW,EAAE,MAAM,CAAC;IACpB,wEAAwE;IACxE,aAAa,EAAE,MAAM,CAAC;IACtB,uCAAuC;IACvC,MAAM,EAAE,OAAO,CAAC;IAChB,8DAA8D;IAC9D,eAAe,EAAE,KAAK,CAAC;QACrB,WAAW,EAAE,MAAM,CAAC;QACpB,GAAG,EAAE,MAAM,CAAC;QACZ,gBAAgB,EAAE,MAAM,CAAC;QACzB,aAAa,EAAE,MAAM,EAAE,CAAC;KACzB,CAAC,CAAC;IACH,mFAAmF;IACnF,kBAAkB,EAAE,KAAK,CAAC;QACxB,WAAW,EAAE,MAAM,CAAC;QACpB,GAAG,EAAE,MAAM,CAAC;QACZ,gBAAgB,EAAE,MAAM,CAAC;QACzB,kBAAkB,EAAE,MAAM,EAAE,CAAC;KAC9B,CAAC,CAAC;CACJ;AA2BD,qBAAa,aAAc,YAAW,QAAQ;IAC5C,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAS;gBAErB,OAAO,CAAC,EAAE,MAAM;IAI5B,qDAAqD;IACrD,IAAI,WAAW,IAAI,MAAM,CAExB;IAED,OAAO,CAAC,QAAQ;IAIhB,sGAAsG;IACtG,OAAO,CAAC,OAAO;IAIf,wDAAwD;IACxD,OAAO,CAAC,OAAO;YAKD,SAAS;YAIT,aAAa;IAI3B,yGAAyG;YAC3F,WAAW;IASzB,4GAA4G;YAC9F,YAAY;IAW1B,6EAA6E;YAC/D,aAAa;IAwB3B,wGAAwG;YAC1F,sBAAsB;IAS9B,MAAM,CAAC,OAAO,EAAE,gBAAgB,GAAG,OAAO,CAAC;QAAE,GAAG,EAAE,SAAS,CAAC;QAAC,OAAO,EAAE,OAAO,CAAA;KAAE,CAAC;IA6DtF;;;;;OAKG;YACW,SAAS;IAUjB,GAAG,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,CAAC;IAgCtC,MAAM,CAAC,MAAM,EAAE,SAAS,GAAG,OAAO,CAAC,SAAS,CAAC;IA0C7C,SAAS,CACb,KAAK,EAAE,MAAM,EACb,QAAQ,EAAE,MAAM,EAChB,UAAU,EAAE,kBAAkB,GAC7B,OAAO,CAAC,SAAS,CAAC;IAoErB;;;;;;;OAOG;IACG,IAAI,CAAC,MAAM,EAAE,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC;IA2B5C;;;;OAIG;YACW,mBAAmB;IA8BjC;;;;;OAKG;IACG,aAAa,CAAC,UAAU,CAAC,EAAE,MAAM,EAAE,MAAM,UAAQ,GAAG,OAAO,CAAC,gBAAgB,CAAC;IA4D7E,IAAI,CAAC,UAAU,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,EAAE,CAAC;CAiBtD"}
@@ -2,13 +2,43 @@
2
2
  // Uses proper-lockfile to prevent concurrent writes.
3
3
  import { mkdir, readFile, writeFile, readdir } from 'node:fs/promises';
4
4
  import { existsSync } from 'node:fs';
5
+ import { createHash } from 'node:crypto';
5
6
  import { join } from 'node:path';
6
7
  import { homedir } from 'node:os';
7
8
  import { v4 as uuidv4 } from 'uuid';
8
9
  import lockfile from 'proper-lockfile';
9
10
  import { WorkflowError } from '../types/workflow-error.js';
10
11
  import { findEligibleSteps, deriveRunPhase } from '../engine/eligibility.js';
12
+ import { hashParams } from './params-hash.js';
13
+ import { decideIdempotencyPolicy } from './idempotency-policy.js';
11
14
  const DEFAULT_RUNS_DIR = join(homedir(), '.realm', 'runs');
15
+ /** Bounded per-key lock retry policy — used for the resolve-or-claim critical section. */
16
+ const KEY_LOCK_RETRIES = { retries: 10, minTimeout: 50 };
17
+ /**
18
+ * Newest-first comparator: by `created_at` descending, tie-broken by lexicographically
19
+ * greatest `id`. Used to deterministically pick a canonical run for a key.
20
+ */
21
+ function compareCanonical(a, b) {
22
+ if (a.created_at !== b.created_at)
23
+ return a.created_at < b.created_at ? 1 : -1;
24
+ return a.id < b.id ? 1 : -1;
25
+ }
26
+ /**
27
+ * Canonical-pick rule (decision on record): exactly one live (non-terminal) run → it;
28
+ * multiple live → newest live by created_at (the rest are reported as extraLive); else
29
+ * the newest terminal by created_at (tie-break: greatest id).
30
+ */
31
+ function pickCanonical(runs) {
32
+ const live = runs.filter((r) => !r.terminal_state);
33
+ if (live.length === 1)
34
+ return { canonical: live[0], extraLive: [] };
35
+ if (live.length > 1) {
36
+ const sorted = [...live].sort(compareCanonical);
37
+ return { canonical: sorted[0], extraLive: sorted.slice(1) };
38
+ }
39
+ const sorted = [...runs].sort(compareCanonical);
40
+ return { canonical: sorted[0], extraLive: [] };
41
+ }
12
42
  export class JsonFileStore {
13
43
  runsDir;
14
44
  constructor(runsDir) {
@@ -21,18 +51,45 @@ export class JsonFileStore {
21
51
  filePath(runId) {
22
52
  return join(this.runsDir, `${runId}.json`);
23
53
  }
54
+ /** Directory holding the idempotency-key pointer index. Invisible to `list()` (no `.json` suffix). */
55
+ keysDir() {
56
+ return join(this.runsDir, 'keys');
57
+ }
58
+ /** Pointer file path for one (workflowId, key) pair. */
59
+ keyPath(workflowId, key) {
60
+ const hash = createHash('sha256').update(`${workflowId}\0${key}`).digest('hex');
61
+ return join(this.keysDir(), `${hash}.json`);
62
+ }
24
63
  async ensureDir() {
25
64
  await mkdir(this.runsDir, { recursive: true });
26
65
  }
27
- async create(options) {
28
- await this.ensureDir();
29
- // Idempotency check: if a key is supplied, return the existing run if one matches.
30
- if (options.idempotencyKey !== undefined) {
31
- const existing = await this.list(options.workflowId);
32
- const match = existing.find((r) => r.idempotency_key === options.idempotencyKey);
33
- if (match !== undefined)
34
- return match;
66
+ async ensureKeysDir() {
67
+ await mkdir(this.keysDir(), { recursive: true });
68
+ }
69
+ /** Read a pointer file; returns undefined if absent or unparseable (self-heals via reclaim/fallback). */
70
+ async readPointer(keyPath) {
71
+ if (!existsSync(keyPath))
72
+ return undefined;
73
+ try {
74
+ return JSON.parse(await readFile(keyPath, 'utf8'));
75
+ }
76
+ catch {
77
+ return undefined;
35
78
  }
79
+ }
80
+ /** Write (or overwrite) a pointer file for `run` under `key`. params_hash is derived from the owned run. */
81
+ async writePointer(keyPath, run, key) {
82
+ const pointer = {
83
+ run_id: run.id,
84
+ workflow_id: run.workflow_id,
85
+ key,
86
+ params_hash: hashParams(run.params),
87
+ updated_at: new Date().toISOString(),
88
+ };
89
+ await writeFile(keyPath, JSON.stringify(pointer, null, 2), 'utf8');
90
+ }
91
+ /** Build and persist a brand-new run record (today's path, factored out). */
92
+ async writeFreshRun(options) {
36
93
  const now = new Date().toISOString();
37
94
  const record = {
38
95
  id: uuidv4(),
@@ -55,6 +112,83 @@ export class JsonFileStore {
55
112
  await writeFile(this.filePath(record.id), JSON.stringify(record, null, 2), 'utf8');
56
113
  return record;
57
114
  }
115
+ /** Find the canonical pre-existing run for (workflowId, key) via the legacy `idempotency_key` field. */
116
+ async findCanonicalLegacyRun(workflowId, key) {
117
+ const matches = (await this.list(workflowId)).filter((r) => r.idempotency_key === key);
118
+ if (matches.length === 0)
119
+ return undefined;
120
+ return pickCanonical(matches).canonical;
121
+ }
122
+ async create(options) {
123
+ await this.ensureDir();
124
+ // No idempotency key → always a fresh run.
125
+ if (options.idempotencyKey === undefined) {
126
+ const run = await this.writeFreshRun(options);
127
+ return { run, created: true };
128
+ }
129
+ await this.ensureKeysDir();
130
+ const key = options.idempotencyKey;
131
+ const keyPath = this.keyPath(options.workflowId, key);
132
+ // Per-key mutual exclusion for the whole resolve-or-claim critical section.
133
+ // realpath:false lets us lock a key path whose pointer file does not exist yet.
134
+ const release = await lockfile.lock(keyPath, {
135
+ realpath: false,
136
+ retries: KEY_LOCK_RETRIES,
137
+ });
138
+ try {
139
+ const pointer = await this.readPointer(keyPath);
140
+ if (pointer !== undefined) {
141
+ // (b) Pointer present → load the target run.
142
+ const target = await this.get(pointer.run_id).catch((err) => {
143
+ if (err instanceof WorkflowError && err.code === 'STATE_RUN_NOT_FOUND')
144
+ return undefined;
145
+ throw err;
146
+ });
147
+ if (target !== undefined) {
148
+ // (b') Apply the re-encounter policy to the matched run (PR 2). decideIdempotencyPolicy
149
+ // is called directly here (not inside a nested async helper) so a `reject`/`fail` throw
150
+ // is synchronous within this try — avoiding a transiently-orphaned rejected promise.
151
+ if (decideIdempotencyPolicy(target, options) === 'reuse') {
152
+ return { run: target, created: false };
153
+ }
154
+ return await this.supersede(options, keyPath, key);
155
+ }
156
+ // target missing → crash-orphan pointer; fall through to reclaim (d).
157
+ }
158
+ else {
159
+ // (c) Pointer absent → lazy legacy fallback (self-migrates pre-existing data and
160
+ // recovers run-written-but-pointer-not crash orphans, which still carry the field).
161
+ const canonical = await this.findCanonicalLegacyRun(options.workflowId, key);
162
+ if (canonical !== undefined) {
163
+ // A legacy match runs through the same policy.
164
+ if (decideIdempotencyPolicy(canonical, options) === 'reuse') {
165
+ // Migrate the adopted run into the pointer index (PR 1 behavior).
166
+ await this.writePointer(keyPath, canonical, key);
167
+ return { run: canonical, created: false };
168
+ }
169
+ return await this.supersede(options, keyPath, key);
170
+ }
171
+ }
172
+ // (d) Fresh claim / reclaim: run file FIRST, then pointer (overwrite on reclaim).
173
+ const run = await this.writeFreshRun(options);
174
+ await this.writePointer(keyPath, run, key);
175
+ return { run, created: true };
176
+ }
177
+ finally {
178
+ await release();
179
+ }
180
+ }
181
+ /**
182
+ * Supersede the current key owner with a fresh run (must be called under the per-key lock):
183
+ * run file FIRST, then an atomic pointer overwrite to the successor (PR 1 ordering). The
184
+ * superseded run stays on disk by id (auditable); `pickCanonical` prefers the newer successor,
185
+ * so a lost pointer self-heals to the new run.
186
+ */
187
+ async supersede(options, keyPath, key) {
188
+ const run = await this.writeFreshRun(options);
189
+ await this.writePointer(keyPath, run, key);
190
+ return { run, created: true };
191
+ }
58
192
  async get(runId) {
59
193
  const path = this.filePath(runId);
60
194
  if (!existsSync(path)) {
@@ -179,6 +313,8 @@ export class JsonFileStore {
179
313
  * Used for importing records fetched from a remote store.
180
314
  * Idempotent: if the record already exists with the same version, this is a no-op.
181
315
  * Does NOT increment version or apply the optimistic lock — this is an import, not an update.
316
+ * When the record carries an idempotency_key, the key pointer is registered/repointed
317
+ * (closing the import back door): a conflict with a different *live* owner throws.
182
318
  */
183
319
  async save(record) {
184
320
  await this.ensureDir();
@@ -200,7 +336,105 @@ export class JsonFileStore {
200
336
  },
201
337
  });
202
338
  }
339
+ // Run file FIRST (consistent with create()), then register the key pointer.
203
340
  await writeFile(path, JSON.stringify(record, null, 2), 'utf8');
341
+ await this.registerImportedKey(record);
342
+ }
343
+ /**
344
+ * Register (or repoint) the idempotency-key pointer for an imported record, under the
345
+ * per-key lock. If the key is already owned by a DIFFERENT live run, refuse and throw
346
+ * (a missing or terminal prior owner is safely repointed).
347
+ */
348
+ async registerImportedKey(record) {
349
+ if (record.idempotency_key === undefined)
350
+ return;
351
+ await this.ensureKeysDir();
352
+ const key = record.idempotency_key;
353
+ const keyPath = this.keyPath(record.workflow_id, key);
354
+ const release = await lockfile.lock(keyPath, { realpath: false, retries: KEY_LOCK_RETRIES });
355
+ try {
356
+ const pointer = await this.readPointer(keyPath);
357
+ if (pointer !== undefined && pointer.run_id !== record.id) {
358
+ const owner = await this.get(pointer.run_id).catch(() => undefined);
359
+ if (owner !== undefined && !owner.terminal_state) {
360
+ throw new WorkflowError(`Idempotency key for workflow '${record.workflow_id}' is already owned by a different live run '${owner.id}'; refusing to repoint to imported run '${record.id}'.`, {
361
+ code: 'STATE_RUN_DIVERGED',
362
+ category: 'STATE',
363
+ agentAction: 'report_to_user',
364
+ retryable: false,
365
+ details: { runId: record.id, existingOwnerRunId: owner.id },
366
+ });
367
+ }
368
+ // owner missing or terminal → safe to repoint to the imported record.
369
+ }
370
+ await this.writePointer(keyPath, record, key);
371
+ }
372
+ finally {
373
+ await release();
374
+ }
375
+ }
376
+ /**
377
+ * Eager migration: build the key pointer index from the legacy `idempotency_key` field on
378
+ * existing runs. Groups runs by (workflow_id, key), writes the pointer to the canonical run
379
+ * (see {@link pickCanonical}). Idempotent (re-running writes nothing new), reversible (only
380
+ * touches `keys/`; never mutates or deletes run files).
381
+ */
382
+ async reconcileKeys(workflowId, dryRun = false) {
383
+ await this.ensureDir();
384
+ if (!dryRun)
385
+ await this.ensureKeysDir();
386
+ const groups = new Map();
387
+ for (const run of await this.list(workflowId)) {
388
+ if (run.idempotency_key === undefined)
389
+ continue;
390
+ const gk = `${run.workflow_id}\0${run.idempotency_key}`;
391
+ const arr = groups.get(gk);
392
+ if (arr === undefined)
393
+ groups.set(gk, [run]);
394
+ else
395
+ arr.push(run);
396
+ }
397
+ const summary = {
398
+ groups: groups.size,
399
+ keysWritten: 0,
400
+ keysUnchanged: 0,
401
+ dryRun,
402
+ duplicateGroups: [],
403
+ multipleLiveGroups: [],
404
+ };
405
+ for (const runs of groups.values()) {
406
+ const { canonical, extraLive } = pickCanonical(runs);
407
+ const key = canonical.idempotency_key;
408
+ const keyPath = this.keyPath(canonical.workflow_id, key);
409
+ if (runs.length > 1) {
410
+ summary.duplicateGroups.push({
411
+ workflow_id: canonical.workflow_id,
412
+ key,
413
+ canonical_run_id: canonical.id,
414
+ other_run_ids: runs.filter((r) => r.id !== canonical.id).map((r) => r.id),
415
+ });
416
+ }
417
+ if (extraLive.length > 0) {
418
+ summary.multipleLiveGroups.push({
419
+ workflow_id: canonical.workflow_id,
420
+ key,
421
+ canonical_run_id: canonical.id,
422
+ extra_live_run_ids: extraLive.map((r) => r.id),
423
+ });
424
+ }
425
+ const existing = await this.readPointer(keyPath);
426
+ const unchanged = existing !== undefined &&
427
+ existing.run_id === canonical.id &&
428
+ existing.params_hash === hashParams(canonical.params);
429
+ if (unchanged) {
430
+ summary.keysUnchanged++;
431
+ continue;
432
+ }
433
+ summary.keysWritten++;
434
+ if (!dryRun)
435
+ await this.writePointer(keyPath, canonical, key);
436
+ }
437
+ return summary;
204
438
  }
205
439
  async list(workflowId) {
206
440
  await this.ensureDir();
@@ -1 +1 @@
1
- {"version":3,"file":"json-file-store.js","sourceRoot":"","sources":["../../src/store/json-file-store.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"json-file-store.js","sourceRoot":"","sources":["../../src/store/json-file-store.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ /**
2
+ * Produce a canonical JSON string: object keys sorted recursively so that two
3
+ * params objects that are deeply equal (regardless of key insertion order) yield
4
+ * the same string. `undefined` is treated as `null` in arrays and omitted in
5
+ * objects, matching `JSON.stringify` semantics.
6
+ */
7
+ export declare function canonicalJson(value: unknown): string;
8
+ /** sha256 hex of the canonical JSON of a params object. Stable across key ordering. */
9
+ export declare function hashParams(params: Record<string, unknown>): string;
10
+ //# sourceMappingURL=params-hash.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"params-hash.d.ts","sourceRoot":"","sources":["../../src/store/params-hash.ts"],"names":[],"mappings":"AAKA;;;;;GAKG;AACH,wBAAgB,aAAa,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CAapD;AAED,uFAAuF;AACvF,wBAAgB,UAAU,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,CAElE"}
@@ -0,0 +1,30 @@
1
+ // Canonical, dependency-free hashing of a params object for idempotency identity.
2
+ // Used by the run store's pointer index and by the MCP tools to detect a key↔payload
3
+ // mismatch on an idempotency re-encounter.
4
+ import { createHash } from 'node:crypto';
5
+ /**
6
+ * Produce a canonical JSON string: object keys sorted recursively so that two
7
+ * params objects that are deeply equal (regardless of key insertion order) yield
8
+ * the same string. `undefined` is treated as `null` in arrays and omitted in
9
+ * objects, matching `JSON.stringify` semantics.
10
+ */
11
+ export function canonicalJson(value) {
12
+ if (value === undefined)
13
+ return 'null';
14
+ if (value === null || typeof value !== 'object') {
15
+ return JSON.stringify(value);
16
+ }
17
+ if (Array.isArray(value)) {
18
+ return `[${value.map((v) => canonicalJson(v)).join(',')}]`;
19
+ }
20
+ const obj = value;
21
+ const keys = Object.keys(obj)
22
+ .filter((k) => obj[k] !== undefined)
23
+ .sort();
24
+ return `{${keys.map((k) => `${JSON.stringify(k)}:${canonicalJson(obj[k])}`).join(',')}}`;
25
+ }
26
+ /** sha256 hex of the canonical JSON of a params object. Stable across key ordering. */
27
+ export function hashParams(params) {
28
+ return createHash('sha256').update(canonicalJson(params)).digest('hex');
29
+ }
30
+ //# sourceMappingURL=params-hash.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"params-hash.js","sourceRoot":"","sources":["../../src/store/params-hash.ts"],"names":[],"mappings":"AAAA,kFAAkF;AAClF,qFAAqF;AACrF,2CAA2C;AAC3C,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAEzC;;;;;GAKG;AACH,MAAM,UAAU,aAAa,CAAC,KAAc;IAC1C,IAAI,KAAK,KAAK,SAAS;QAAE,OAAO,MAAM,CAAC;IACvC,IAAI,KAAK,KAAK,IAAI,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QAChD,OAAO,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;IAC/B,CAAC;IACD,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;QACzB,OAAO,IAAI,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC;IAC7D,CAAC;IACD,MAAM,GAAG,GAAG,KAAgC,CAAC;IAC7C,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC;SAC1B,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,SAAS,CAAC;SACnC,IAAI,EAAE,CAAC;IACV,OAAO,IAAI,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,aAAa,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC;AAC3F,CAAC;AAED,uFAAuF;AACvF,MAAM,UAAU,UAAU,CAAC,MAA+B;IACxD,OAAO,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;AAC1E,CAAC"}
@@ -8,10 +8,39 @@ export interface CreateRunOptions {
8
8
  idempotencyKey?: string;
9
9
  /** ID of the parent run that spawned this run via start_run_batch. */
10
10
  parentRunId?: string;
11
+ /**
12
+ * Policy when the idempotency key matches a **terminal** run (`completed`/`failed`/`aborted`/`abandoned`).
13
+ * - `reuse` *(default)* — return the existing run (`created:false`).
14
+ * - `reject` — throw `STATE_IDEMPOTENCY_KEY_USED`.
15
+ * - `rerun_if_failed` — supersede a `failed`/`aborted`/`abandoned` match (mint a fresh run, `created:true`);
16
+ * a `completed` match is reused (benign skip).
17
+ * - `rerun` — always supersede the matched run and mint a fresh run (`created:true`).
18
+ */
19
+ onTerminalMatch?: 'reuse' | 'reject' | 'rerun_if_failed' | 'rerun';
20
+ /**
21
+ * Policy when the idempotency key matches a **non-terminal** run (`running`/`gate_waiting`).
22
+ * - `use_existing` *(default)* — return the live run (`created:false`).
23
+ * - `fail` — throw `STATE_RUN_ALREADY_ACTIVE`.
24
+ */
25
+ onLiveMatch?: 'use_existing' | 'fail';
11
26
  }
12
27
  export interface RunStore {
13
- /** Create a new run record. Returns the created record. */
14
- create(options: CreateRunOptions): Promise<RunRecord>;
28
+ /**
29
+ * Create a new run record, or — when an `idempotencyKey` is supplied and a run with the
30
+ * same `(workflowId, idempotencyKey)` already exists — return that existing run instead.
31
+ *
32
+ * Returns `{ run, created }`:
33
+ * - `created: true` — a new run record was written.
34
+ * - `created: false` — an existing run matched the idempotency key and is returned unchanged
35
+ * (nothing is re-driven; callers inspect `run.run_phase` to decide what to surface).
36
+ *
37
+ * NOTE (breaking, 0.8.0): this previously returned `Promise<RunRecord>`. External store
38
+ * implementations (e.g. the cloud Postgres store) must update to the `{ run, created }` shape.
39
+ */
40
+ create(options: CreateRunOptions): Promise<{
41
+ run: RunRecord;
42
+ created: boolean;
43
+ }>;
15
44
  /** Get a run record by ID. Throws WorkflowError(STATE_RUN_NOT_FOUND) if not found. */
16
45
  get(runId: string): Promise<RunRecord>;
17
46
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"store-interface.d.ts","sourceRoot":"","sources":["../../src/store/store-interface.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAC;AACxD,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,iCAAiC,CAAC;AAE1E,MAAM,WAAW,gBAAgB;IAC/B,UAAU,EAAE,MAAM,CAAC;IACnB,eAAe,EAAE,MAAM,CAAC;IACxB,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAChC,gIAAgI;IAChI,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,sEAAsE;IACtE,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,QAAQ;IACvB,2DAA2D;IAC3D,MAAM,CAAC,OAAO,EAAE,gBAAgB,GAAG,OAAO,CAAC,SAAS,CAAC,CAAC;IAEtD,sFAAsF;IACtF,GAAG,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,CAAC,CAAC;IAEvC;;;;OAIG;IACH,MAAM,CAAC,MAAM,EAAE,SAAS,GAAG,OAAO,CAAC,SAAS,CAAC,CAAC;IAE9C,+DAA+D;IAC/D,IAAI,CAAC,UAAU,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,EAAE,CAAC,CAAC;IAEhD;;;;;;;;;OASG;IACH,SAAS,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,UAAU,EAAE,kBAAkB,GAAG,OAAO,CAAC,SAAS,CAAC,CAAC;CAChG"}
1
+ {"version":3,"file":"store-interface.d.ts","sourceRoot":"","sources":["../../src/store/store-interface.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAC;AACxD,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,iCAAiC,CAAC;AAE1E,MAAM,WAAW,gBAAgB;IAC/B,UAAU,EAAE,MAAM,CAAC;IACnB,eAAe,EAAE,MAAM,CAAC;IACxB,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAChC,gIAAgI;IAChI,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,sEAAsE;IACtE,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB;;;;;;;OAOG;IACH,eAAe,CAAC,EAAE,OAAO,GAAG,QAAQ,GAAG,iBAAiB,GAAG,OAAO,CAAC;IACnE;;;;OAIG;IACH,WAAW,CAAC,EAAE,cAAc,GAAG,MAAM,CAAC;CACvC;AAED,MAAM,WAAW,QAAQ;IACvB;;;;;;;;;;;OAWG;IACH,MAAM,CAAC,OAAO,EAAE,gBAAgB,GAAG,OAAO,CAAC;QAAE,GAAG,EAAE,SAAS,CAAC;QAAC,OAAO,EAAE,OAAO,CAAA;KAAE,CAAC,CAAC;IAEjF,sFAAsF;IACtF,GAAG,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,CAAC,CAAC;IAEvC;;;;OAIG;IACH,MAAM,CAAC,MAAM,EAAE,SAAS,GAAG,OAAO,CAAC,SAAS,CAAC,CAAC;IAE9C,+DAA+D;IAC/D,IAAI,CAAC,UAAU,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,EAAE,CAAC,CAAC;IAEhD;;;;;;;;;OASG;IACH,SAAS,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,UAAU,EAAE,kBAAkB,GAAG,OAAO,CAAC,SAAS,CAAC,CAAC;CAChG"}
@@ -1,4 +1,4 @@
1
- import type { EvidenceSnapshot } from './run-record.js';
1
+ import type { EvidenceSnapshot, RunPhase } from './run-record.js';
2
2
  import type { AgentAction, ErrorCode } from './workflow-error.js';
3
3
  export interface NextAction {
4
4
  instruction: {
@@ -78,6 +78,12 @@ export interface ResponseEnvelope {
78
78
  retry_after?: number;
79
79
  /** Current state orientation. Always populated — describes what just happened and what state the run is in. */
80
80
  context_hint: string;
81
+ /**
82
+ * Derived phase of the run at the time of this response. Present whenever a run is loaded
83
+ * (sourced from `run.run_phase`); absent only on pre-execution error envelopes where no run
84
+ * could be loaded (`buildPreExecutionErrorEnvelope` / `errorEnvelope`).
85
+ */
86
+ run_phase?: RunPhase;
81
87
  /** Steps available for execution. Empty array means terminal or blocked — check status and run_phase. */
82
88
  next_actions: NextAction[];
83
89
  blocked_reason?: BlockedReason;
@@ -1 +1 @@
1
- {"version":3,"file":"response-envelope.d.ts","sourceRoot":"","sources":["../../src/types/response-envelope.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AACxD,OAAO,KAAK,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AAElE,MAAM,WAAW,UAAU;IACzB,WAAW,EAAE;QACX,IAAI,EAAE,MAAM,CAAC;QACb,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;QAChC;;;;WAIG;QACH,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;KACpC,GAAG,IAAI,CAAC;IACT,cAAc,EAAE,MAAM,CAAC;IACvB,6FAA6F;IAC7F,WAAW,EAAE,MAAM,CAAC;IACpB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,8GAA8G;IAC9G,YAAY,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACvC,2EAA2E;IAC3E,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,MAAM,SAAS,GAAG,IAAI,GAAG,OAAO,GAAG,SAAS,GAAG,kBAAkB,CAAC;AAExE,MAAM,WAAW,aAAa;IAC5B,mDAAmD;IACnD,cAAc,EAAE,MAAM,EAAE,CAAC;IACzB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,QAAQ;IACvB,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACjC,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,2HAA2H;IAC3H,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,yGAAyG;IACzG,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,4EAA4E;IAC5E,aAAa,CAAC,EAAE;QAAE,OAAO,EAAE,MAAM,EAAE,CAAA;KAAE,CAAC;CACvC;AAED,MAAM,WAAW,gBAAgB;IAC/B,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,yHAAyH;IACzH,WAAW,EAAE,MAAM,CAAC;IACpB;;;;;;;OAOG;IACH,MAAM,EAAE,SAAS,CAAC;IAClB,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC9B,8FAA8F;IAC9F,QAAQ,EAAE,gBAAgB,EAAE,CAAC;IAC7B,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB;;;OAGG;IACH,UAAU,CAAC,EAAE,SAAS,CAAC;IACvB;;;OAGG;IACH,aAAa,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACxC,YAAY,CAAC,EAAE,WAAW,CAAC;IAC3B;;;;OAIG;IACH,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,+GAA+G;IAC/G,YAAY,EAAE,MAAM,CAAC;IACrB,yGAAyG;IACzG,YAAY,EAAE,UAAU,EAAE,CAAC;IAC3B,cAAc,CAAC,EAAE,aAAa,CAAC;IAC/B,IAAI,CAAC,EAAE,QAAQ,CAAC;IAChB;;;;OAIG;IACH,kBAAkB,CAAC,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAC;QAAC,YAAY,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CACxF"}
1
+ {"version":3,"file":"response-envelope.d.ts","sourceRoot":"","sources":["../../src/types/response-envelope.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,gBAAgB,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AAClE,OAAO,KAAK,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AAElE,MAAM,WAAW,UAAU;IACzB,WAAW,EAAE;QACX,IAAI,EAAE,MAAM,CAAC;QACb,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;QAChC;;;;WAIG;QACH,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;KACpC,GAAG,IAAI,CAAC;IACT,cAAc,EAAE,MAAM,CAAC;IACvB,6FAA6F;IAC7F,WAAW,EAAE,MAAM,CAAC;IACpB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,8GAA8G;IAC9G,YAAY,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACvC,2EAA2E;IAC3E,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,MAAM,SAAS,GAAG,IAAI,GAAG,OAAO,GAAG,SAAS,GAAG,kBAAkB,CAAC;AAExE,MAAM,WAAW,aAAa;IAC5B,mDAAmD;IACnD,cAAc,EAAE,MAAM,EAAE,CAAC;IACzB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,QAAQ;IACvB,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACjC,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,2HAA2H;IAC3H,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,yGAAyG;IACzG,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,4EAA4E;IAC5E,aAAa,CAAC,EAAE;QAAE,OAAO,EAAE,MAAM,EAAE,CAAA;KAAE,CAAC;CACvC;AAED,MAAM,WAAW,gBAAgB;IAC/B,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,yHAAyH;IACzH,WAAW,EAAE,MAAM,CAAC;IACpB;;;;;;;OAOG;IACH,MAAM,EAAE,SAAS,CAAC;IAClB,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC9B,8FAA8F;IAC9F,QAAQ,EAAE,gBAAgB,EAAE,CAAC;IAC7B,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB;;;OAGG;IACH,UAAU,CAAC,EAAE,SAAS,CAAC;IACvB;;;OAGG;IACH,aAAa,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACxC,YAAY,CAAC,EAAE,WAAW,CAAC;IAC3B;;;;OAIG;IACH,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,+GAA+G;IAC/G,YAAY,EAAE,MAAM,CAAC;IACrB;;;;OAIG;IACH,SAAS,CAAC,EAAE,QAAQ,CAAC;IACrB,yGAAyG;IACzG,YAAY,EAAE,UAAU,EAAE,CAAC;IAC3B,cAAc,CAAC,EAAE,aAAa,CAAC;IAC/B,IAAI,CAAC,EAAE,QAAQ,CAAC;IAChB;;;;OAIG;IACH,kBAAkB,CAAC,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAC;QAAC,YAAY,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CACxF"}