openplanr 1.13.2 → 1.14.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.
- package/README.md +46 -4
- package/dist/cli/commands/artifact.d.ts.map +1 -1
- package/dist/cli/commands/artifact.js +17 -6
- package/dist/cli/commands/artifact.js.map +1 -1
- package/dist/cli/commands/operate.d.ts +3 -0
- package/dist/cli/commands/operate.d.ts.map +1 -0
- package/dist/cli/commands/operate.js +568 -0
- package/dist/cli/commands/operate.js.map +1 -0
- package/dist/cli/index.js +42 -2
- package/dist/cli/index.js.map +1 -1
- package/dist/services/ai-service.d.ts +9 -2
- package/dist/services/ai-service.d.ts.map +1 -1
- package/dist/services/ai-service.js +14 -6
- package/dist/services/ai-service.js.map +1 -1
- package/dist/services/artifact-pipeline-service.d.ts +1 -0
- package/dist/services/artifact-pipeline-service.d.ts.map +1 -1
- package/dist/services/artifact-pipeline-service.js.map +1 -1
- package/dist/services/delta-apply-service.js +1 -1
- package/dist/services/delta-apply-service.js.map +1 -1
- package/dist/services/operate/advisors.d.ts +219 -0
- package/dist/services/operate/advisors.d.ts.map +1 -0
- package/dist/services/operate/advisors.js +745 -0
- package/dist/services/operate/advisors.js.map +1 -0
- package/dist/services/operate/artifact-route-generation.d.ts +111 -0
- package/dist/services/operate/artifact-route-generation.d.ts.map +1 -0
- package/dist/services/operate/artifact-route-generation.js +459 -0
- package/dist/services/operate/artifact-route-generation.js.map +1 -0
- package/dist/services/operate/artifacts.d.ts +26 -0
- package/dist/services/operate/artifacts.d.ts.map +1 -0
- package/dist/services/operate/artifacts.js +92 -0
- package/dist/services/operate/artifacts.js.map +1 -0
- package/dist/services/operate/canonical.d.ts +18 -0
- package/dist/services/operate/canonical.d.ts.map +1 -0
- package/dist/services/operate/canonical.js +157 -0
- package/dist/services/operate/canonical.js.map +1 -0
- package/dist/services/operate/config.d.ts +56 -0
- package/dist/services/operate/config.d.ts.map +1 -0
- package/dist/services/operate/config.js +644 -0
- package/dist/services/operate/config.js.map +1 -0
- package/dist/services/operate/consolidation.d.ts +18 -0
- package/dist/services/operate/consolidation.d.ts.map +1 -0
- package/dist/services/operate/consolidation.js +539 -0
- package/dist/services/operate/consolidation.js.map +1 -0
- package/dist/services/operate/doctor.d.ts +12 -0
- package/dist/services/operate/doctor.d.ts.map +1 -0
- package/dist/services/operate/doctor.js +307 -0
- package/dist/services/operate/doctor.js.map +1 -0
- package/dist/services/operate/engine.d.ts +53 -0
- package/dist/services/operate/engine.d.ts.map +1 -0
- package/dist/services/operate/engine.js +1097 -0
- package/dist/services/operate/engine.js.map +1 -0
- package/dist/services/operate/event-store.d.ts +57 -0
- package/dist/services/operate/event-store.d.ts.map +1 -0
- package/dist/services/operate/event-store.js +232 -0
- package/dist/services/operate/event-store.js.map +1 -0
- package/dist/services/operate/evidence-cache.d.ts +17 -0
- package/dist/services/operate/evidence-cache.d.ts.map +1 -0
- package/dist/services/operate/evidence-cache.js +96 -0
- package/dist/services/operate/evidence-cache.js.map +1 -0
- package/dist/services/operate/evidence-import.d.ts +40 -0
- package/dist/services/operate/evidence-import.d.ts.map +1 -0
- package/dist/services/operate/evidence-import.js +340 -0
- package/dist/services/operate/evidence-import.js.map +1 -0
- package/dist/services/operate/evidence-readiness.d.ts +8 -0
- package/dist/services/operate/evidence-readiness.d.ts.map +1 -0
- package/dist/services/operate/evidence-readiness.js +78 -0
- package/dist/services/operate/evidence-readiness.js.map +1 -0
- package/dist/services/operate/evidence.d.ts +71 -0
- package/dist/services/operate/evidence.d.ts.map +1 -0
- package/dist/services/operate/evidence.js +1022 -0
- package/dist/services/operate/evidence.js.map +1 -0
- package/dist/services/operate/ids.d.ts +7 -0
- package/dist/services/operate/ids.d.ts.map +1 -0
- package/dist/services/operate/ids.js +23 -0
- package/dist/services/operate/ids.js.map +1 -0
- package/dist/services/operate/index.d.ts +14 -0
- package/dist/services/operate/index.d.ts.map +1 -0
- package/dist/services/operate/index.js +881 -0
- package/dist/services/operate/index.js.map +1 -0
- package/dist/services/operate/journal.d.ts +34 -0
- package/dist/services/operate/journal.d.ts.map +1 -0
- package/dist/services/operate/journal.js +229 -0
- package/dist/services/operate/journal.js.map +1 -0
- package/dist/services/operate/legacy-import-service.d.ts +58 -0
- package/dist/services/operate/legacy-import-service.d.ts.map +1 -0
- package/dist/services/operate/legacy-import-service.js +922 -0
- package/dist/services/operate/legacy-import-service.js.map +1 -0
- package/dist/services/operate/lifecycle.d.ts +88 -0
- package/dist/services/operate/lifecycle.d.ts.map +1 -0
- package/dist/services/operate/lifecycle.js +556 -0
- package/dist/services/operate/lifecycle.js.map +1 -0
- package/dist/services/operate/lock-service.d.ts +37 -0
- package/dist/services/operate/lock-service.d.ts.map +1 -0
- package/dist/services/operate/lock-service.js +208 -0
- package/dist/services/operate/lock-service.js.map +1 -0
- package/dist/services/operate/maintenance.d.ts +38 -0
- package/dist/services/operate/maintenance.d.ts.map +1 -0
- package/dist/services/operate/maintenance.js +699 -0
- package/dist/services/operate/maintenance.js.map +1 -0
- package/dist/services/operate/outcomes.d.ts +48 -0
- package/dist/services/operate/outcomes.d.ts.map +1 -0
- package/dist/services/operate/outcomes.js +312 -0
- package/dist/services/operate/outcomes.js.map +1 -0
- package/dist/services/operate/pipeline-handoff.d.ts +138 -0
- package/dist/services/operate/pipeline-handoff.d.ts.map +1 -0
- package/dist/services/operate/pipeline-handoff.js +175 -0
- package/dist/services/operate/pipeline-handoff.js.map +1 -0
- package/dist/services/operate/projection-persistence.d.ts +55 -0
- package/dist/services/operate/projection-persistence.d.ts.map +1 -0
- package/dist/services/operate/projection-persistence.js +393 -0
- package/dist/services/operate/projection-persistence.js.map +1 -0
- package/dist/services/operate/projection.d.ts +4 -0
- package/dist/services/operate/projection.d.ts.map +1 -0
- package/dist/services/operate/projection.js +128 -0
- package/dist/services/operate/projection.js.map +1 -0
- package/dist/services/operate/protocol.d.ts +60 -0
- package/dist/services/operate/protocol.d.ts.map +1 -0
- package/dist/services/operate/protocol.js +62 -0
- package/dist/services/operate/protocol.js.map +1 -0
- package/dist/services/operate/read-only-providers.d.ts +38 -0
- package/dist/services/operate/read-only-providers.d.ts.map +1 -0
- package/dist/services/operate/read-only-providers.js +286 -0
- package/dist/services/operate/read-only-providers.js.map +1 -0
- package/dist/services/operate/redaction.d.ts +47 -0
- package/dist/services/operate/redaction.d.ts.map +1 -0
- package/dist/services/operate/redaction.js +279 -0
- package/dist/services/operate/redaction.js.map +1 -0
- package/dist/services/operate/reducer.d.ts +10 -0
- package/dist/services/operate/reducer.d.ts.map +1 -0
- package/dist/services/operate/reducer.js +11 -0
- package/dist/services/operate/reducer.js.map +1 -0
- package/dist/services/operate/routes.d.ts +49 -0
- package/dist/services/operate/routes.d.ts.map +1 -0
- package/dist/services/operate/routes.js +996 -0
- package/dist/services/operate/routes.js.map +1 -0
- package/dist/services/operate/shipment-observer.d.ts +14 -0
- package/dist/services/operate/shipment-observer.d.ts.map +1 -0
- package/dist/services/operate/shipment-observer.js +321 -0
- package/dist/services/operate/shipment-observer.js.map +1 -0
- package/dist/services/operate/stalled-item-service.d.ts +18 -0
- package/dist/services/operate/stalled-item-service.d.ts.map +1 -0
- package/dist/services/operate/stalled-item-service.js +121 -0
- package/dist/services/operate/stalled-item-service.js.map +1 -0
- package/dist/services/operate/subprocess-env.d.ts +4 -0
- package/dist/services/operate/subprocess-env.d.ts.map +1 -0
- package/dist/services/operate/subprocess-env.js +45 -0
- package/dist/services/operate/subprocess-env.js.map +1 -0
- package/dist/services/operate/types.d.ts +729 -0
- package/dist/services/operate/types.d.ts.map +1 -0
- package/dist/services/operate/types.js +13 -0
- package/dist/services/operate/types.js.map +1 -0
- package/dist/services/operate/workspace.d.ts +59 -0
- package/dist/services/operate/workspace.d.ts.map +1 -0
- package/dist/services/operate/workspace.js +316 -0
- package/dist/services/operate/workspace.js.map +1 -0
- package/dist/services/runtime-manager-service.d.ts.map +1 -1
- package/dist/services/runtime-manager-service.js +71 -2
- package/dist/services/runtime-manager-service.js.map +1 -1
- package/package.json +10 -4
|
@@ -0,0 +1,556 @@
|
|
|
1
|
+
import { randomUUID } from 'node:crypto';
|
|
2
|
+
import { readFile } from 'node:fs/promises';
|
|
3
|
+
import path from 'node:path';
|
|
4
|
+
import { readStoredOperatingArtifactGeneration } from './artifact-route-generation.js';
|
|
5
|
+
import { canonicalDigest } from './canonical.js';
|
|
6
|
+
import { operatingProjectKey, validateOperatingConfiguration } from './config.js';
|
|
7
|
+
import { OperatingEventStore } from './event-store.js';
|
|
8
|
+
import { withOperatingLock } from './lock-service.js';
|
|
9
|
+
import { renderOperatingBrief, selectCycleState } from './projection.js';
|
|
10
|
+
import { persistOperatingProjections } from './projection-persistence.js';
|
|
11
|
+
import { sanitizeGeneratedPlainText } from './redaction.js';
|
|
12
|
+
import { applyOperatingRoute, readOperatingRoute, rollbackOperatingRoute } from './routes.js';
|
|
13
|
+
import { overdueOperatingDecisionIds } from './stalled-item-service.js';
|
|
14
|
+
import { OperateError, } from './types.js';
|
|
15
|
+
import { resolveOperatingPaths } from './workspace.js';
|
|
16
|
+
function stateCollection(state, collection) {
|
|
17
|
+
if (collection === 'cycles')
|
|
18
|
+
return state.cycles;
|
|
19
|
+
if (collection === 'findings')
|
|
20
|
+
return state.findings;
|
|
21
|
+
if (collection === 'decisions')
|
|
22
|
+
return state.decisions;
|
|
23
|
+
if (collection === 'gaps')
|
|
24
|
+
return state.dataGaps;
|
|
25
|
+
if (collection === 'routes')
|
|
26
|
+
return state.routes;
|
|
27
|
+
if (collection === 'evidence')
|
|
28
|
+
return state.evidenceSources;
|
|
29
|
+
return [];
|
|
30
|
+
}
|
|
31
|
+
export async function readOperatingCollection(input) {
|
|
32
|
+
const store = new OperatingEventStore(input.projectRoot, { localRoot: input.localRoot });
|
|
33
|
+
const state = await store.state();
|
|
34
|
+
if (input.collection === 'migrations') {
|
|
35
|
+
const directory = resolveOperatingPaths(input.projectRoot, {
|
|
36
|
+
localRoot: input.localRoot,
|
|
37
|
+
}).migrations;
|
|
38
|
+
const { readdir } = await import('node:fs/promises');
|
|
39
|
+
const records = await Promise.all((await readdir(directory).catch(() => []))
|
|
40
|
+
.filter((name) => name.endsWith('.json'))
|
|
41
|
+
.sort()
|
|
42
|
+
.map((name) => readFile(path.join(directory, name), 'utf8')
|
|
43
|
+
.then((raw) => JSON.parse(raw))
|
|
44
|
+
.catch(() => null)));
|
|
45
|
+
const valid = records.filter((record) => Boolean(record));
|
|
46
|
+
return input.id ? (valid.find((record) => record.id === input.id) ?? null) : valid;
|
|
47
|
+
}
|
|
48
|
+
if (input.collection === 'routes' && input.id) {
|
|
49
|
+
return readOperatingRoute(input.projectRoot, input.id).catch((error) => {
|
|
50
|
+
if (error.code === 'ENOENT')
|
|
51
|
+
return null;
|
|
52
|
+
throw error;
|
|
53
|
+
});
|
|
54
|
+
}
|
|
55
|
+
const records = stateCollection(state, input.collection);
|
|
56
|
+
if (!input.id)
|
|
57
|
+
return records;
|
|
58
|
+
const idField = input.collection === 'evidence' ? 'id' : 'id';
|
|
59
|
+
return records.find((record) => record[idField] === input.id) ?? null;
|
|
60
|
+
}
|
|
61
|
+
export async function readOperatingReview(input) {
|
|
62
|
+
const store = new OperatingEventStore(input.projectRoot, { localRoot: input.localRoot });
|
|
63
|
+
const state = selectCycleState(await store.state(), input.cycleId);
|
|
64
|
+
if (input.cycleId && state.cycles.length === 0) {
|
|
65
|
+
throw new OperateError('E_OPERATE_STATE_INVALID', `Unknown operating cycle ${input.cycleId}.`);
|
|
66
|
+
}
|
|
67
|
+
return input.brief ? renderOperatingBrief(state) : state;
|
|
68
|
+
}
|
|
69
|
+
async function mutateEvent(input) {
|
|
70
|
+
const store = new OperatingEventStore(input.projectRoot, { localRoot: input.localRoot });
|
|
71
|
+
const initial = await store.replay();
|
|
72
|
+
return withOperatingLock(input.projectRoot, {
|
|
73
|
+
projectKey: operatingProjectKey(input.projectRoot),
|
|
74
|
+
expectedEventHead: initial.eventHead,
|
|
75
|
+
currentEventHead: initial.eventHead,
|
|
76
|
+
localRoot: input.localRoot,
|
|
77
|
+
}, async (lock) => {
|
|
78
|
+
const lockedReplay = await store.replay();
|
|
79
|
+
lock.assertEventHead(lockedReplay.eventHead);
|
|
80
|
+
if (input.validateState) {
|
|
81
|
+
await input.validateState(await store.state());
|
|
82
|
+
}
|
|
83
|
+
const event = await store.append({
|
|
84
|
+
type: input.type,
|
|
85
|
+
cycleId: input.cycleId,
|
|
86
|
+
entityId: input.entityId,
|
|
87
|
+
payload: input.payload,
|
|
88
|
+
evidenceRefs: input.evidenceRefs,
|
|
89
|
+
correlationId: randomUUID(),
|
|
90
|
+
timestamp: input.timestamp,
|
|
91
|
+
expectedHead: initial.eventHead.hash,
|
|
92
|
+
actor: { kind: 'human', id: 'operate-cli' },
|
|
93
|
+
});
|
|
94
|
+
const eventHead = { sequence: event.sequence, hash: event.eventHash };
|
|
95
|
+
await lock.advanceEventHead(initial.eventHead, eventHead);
|
|
96
|
+
const state = await store.state();
|
|
97
|
+
await store.writeCheckpoint(state);
|
|
98
|
+
await persistOperatingProjections({
|
|
99
|
+
projectRoot: input.projectRoot,
|
|
100
|
+
localRoot: input.localRoot,
|
|
101
|
+
state,
|
|
102
|
+
revalidateEventHead: async () => (await store.replay()).eventHead,
|
|
103
|
+
});
|
|
104
|
+
return { eventHead, state };
|
|
105
|
+
});
|
|
106
|
+
}
|
|
107
|
+
/**
|
|
108
|
+
* Marks elapsed decision deadlines as due for explicit owner review. This
|
|
109
|
+
* transition deliberately carries no selected option and executes no default.
|
|
110
|
+
*/
|
|
111
|
+
export async function reconcileOperatingDecisionDeadlines(input) {
|
|
112
|
+
const store = new OperatingEventStore(input.projectRoot, { localRoot: input.localRoot });
|
|
113
|
+
const initial = await store.replay();
|
|
114
|
+
const now = input.now ?? new Date();
|
|
115
|
+
const due = overdueOperatingDecisionIds(await store.state(), now);
|
|
116
|
+
if (due.length === 0)
|
|
117
|
+
return { transitioned: 0, state: await store.state() };
|
|
118
|
+
return withOperatingLock(input.projectRoot, {
|
|
119
|
+
projectKey: operatingProjectKey(input.projectRoot),
|
|
120
|
+
expectedEventHead: initial.eventHead,
|
|
121
|
+
currentEventHead: initial.eventHead,
|
|
122
|
+
localRoot: input.localRoot,
|
|
123
|
+
}, async (lock) => {
|
|
124
|
+
const lockedReplay = await store.replay();
|
|
125
|
+
lock.assertEventHead(lockedReplay.eventHead);
|
|
126
|
+
const lockedState = await store.state();
|
|
127
|
+
const lockedDue = overdueOperatingDecisionIds(lockedState, now);
|
|
128
|
+
let head = lockedReplay.eventHead;
|
|
129
|
+
for (const decisionId of lockedDue) {
|
|
130
|
+
const decision = lockedState.decisions.find((record) => record.id === decisionId);
|
|
131
|
+
const event = await store.append({
|
|
132
|
+
type: 'decision.default-due',
|
|
133
|
+
cycleId: String(decision?.cycleId),
|
|
134
|
+
entityId: decisionId,
|
|
135
|
+
payload: {},
|
|
136
|
+
correlationId: `deadline-${decisionId}`,
|
|
137
|
+
timestamp: now.toISOString(),
|
|
138
|
+
expectedHead: head.hash,
|
|
139
|
+
actor: { kind: 'engine', id: 'openplanr-deadline-reconciler' },
|
|
140
|
+
});
|
|
141
|
+
const next = { sequence: event.sequence, hash: event.eventHash };
|
|
142
|
+
await lock.advanceEventHead(head, next);
|
|
143
|
+
head = next;
|
|
144
|
+
}
|
|
145
|
+
const state = await store.state();
|
|
146
|
+
await store.writeCheckpoint(state);
|
|
147
|
+
await persistOperatingProjections({
|
|
148
|
+
projectRoot: input.projectRoot,
|
|
149
|
+
localRoot: input.localRoot,
|
|
150
|
+
state,
|
|
151
|
+
revalidateEventHead: async () => (await store.replay()).eventHead,
|
|
152
|
+
});
|
|
153
|
+
return { transitioned: lockedDue.length, state };
|
|
154
|
+
});
|
|
155
|
+
}
|
|
156
|
+
export async function transitionOperatingCycle(input) {
|
|
157
|
+
if (!input.confirmed) {
|
|
158
|
+
throw new OperateError('E_OPERATE_AUTHORITY_REQUIRED', `Cycle ${input.action} requires explicit confirmation.`);
|
|
159
|
+
}
|
|
160
|
+
const store = new OperatingEventStore(input.projectRoot, { localRoot: input.localRoot });
|
|
161
|
+
const state = await store.state();
|
|
162
|
+
const cycle = state.cycles.find((record) => record.id === input.cycleId);
|
|
163
|
+
if (!cycle) {
|
|
164
|
+
throw new OperateError('E_OPERATE_STATE_INVALID', `Unknown cycle ${input.cycleId}.`);
|
|
165
|
+
}
|
|
166
|
+
if (input.action === 'recover') {
|
|
167
|
+
const { recoverOperatingTransactions } = await import('./journal.js');
|
|
168
|
+
const recovered = await recoverOperatingTransactions(input.projectRoot, {
|
|
169
|
+
localRoot: input.localRoot,
|
|
170
|
+
});
|
|
171
|
+
if (cycle.state !== 'blocked' && cycle.state !== 'failed') {
|
|
172
|
+
const currentState = await store.state();
|
|
173
|
+
await persistOperatingProjections({
|
|
174
|
+
projectRoot: input.projectRoot,
|
|
175
|
+
localRoot: input.localRoot,
|
|
176
|
+
state: currentState,
|
|
177
|
+
revalidateEventHead: async () => (await store.replay()).eventHead,
|
|
178
|
+
});
|
|
179
|
+
return { cycle, recoveredTransactions: recovered };
|
|
180
|
+
}
|
|
181
|
+
const next = cycle.state === 'blocked' ? 'collecting' : 'preparing';
|
|
182
|
+
const changed = await mutateEvent({
|
|
183
|
+
projectRoot: input.projectRoot,
|
|
184
|
+
localRoot: input.localRoot,
|
|
185
|
+
cycleId: input.cycleId,
|
|
186
|
+
type: `cycle.${next}`,
|
|
187
|
+
entityId: input.cycleId,
|
|
188
|
+
payload: { patch: { health: 'partial' }, recoveredTransactions: recovered },
|
|
189
|
+
});
|
|
190
|
+
return { ...changed, recoveredTransactions: recovered };
|
|
191
|
+
}
|
|
192
|
+
const type = input.action === 'resume'
|
|
193
|
+
? 'cycle.collecting'
|
|
194
|
+
: input.action === 'cancel'
|
|
195
|
+
? 'cycle.cancelled'
|
|
196
|
+
: 'cycle.closed';
|
|
197
|
+
return mutateEvent({
|
|
198
|
+
projectRoot: input.projectRoot,
|
|
199
|
+
localRoot: input.localRoot,
|
|
200
|
+
cycleId: input.cycleId,
|
|
201
|
+
type,
|
|
202
|
+
entityId: input.cycleId,
|
|
203
|
+
payload: input.action === 'close' ? { patch: { completedAt: new Date().toISOString() } } : {},
|
|
204
|
+
validateState: input.action === 'close'
|
|
205
|
+
? (lockedState) => {
|
|
206
|
+
const lockedCycle = lockedState.cycles.find((record) => record.id === input.cycleId);
|
|
207
|
+
if (lockedCycle?.state !== 'reviewable') {
|
|
208
|
+
throw new OperateError('E_OPERATE_STATE_INVALID', `Cycle ${input.cycleId} must be reviewable before it can close.`);
|
|
209
|
+
}
|
|
210
|
+
assertOperatingCycleDisposable(lockedState, input.cycleId);
|
|
211
|
+
}
|
|
212
|
+
: undefined,
|
|
213
|
+
});
|
|
214
|
+
}
|
|
215
|
+
/**
|
|
216
|
+
* A non-quiet operating cycle may close only after every surfaced finding has
|
|
217
|
+
* either reached a terminal governance state or had its accepted route
|
|
218
|
+
* applied, and every owner decision has reached a terminal state.
|
|
219
|
+
*/
|
|
220
|
+
export function assertOperatingCycleDisposable(state, cycleId) {
|
|
221
|
+
const findings = state.findings.filter((finding) => finding.cycleId === cycleId && finding.parked !== true);
|
|
222
|
+
const decisions = state.decisions.filter((decision) => decision.cycleId === cycleId);
|
|
223
|
+
if (findings.length === 0 && decisions.length === 0)
|
|
224
|
+
return;
|
|
225
|
+
const appliedFindingIds = new Set(state.routes
|
|
226
|
+
.filter((route) => route.cycleId === cycleId && route.state === 'applied')
|
|
227
|
+
.flatMap((route) => Array.isArray(route.findingIds)
|
|
228
|
+
? route.findingIds.filter((id) => typeof id === 'string')
|
|
229
|
+
: []));
|
|
230
|
+
const terminalFindingStates = new Set(['done', 'rejected', 'superseded']);
|
|
231
|
+
const blockingFindings = findings
|
|
232
|
+
.filter((finding) => !terminalFindingStates.has(String(finding.status)) && !appliedFindingIds.has(finding.id))
|
|
233
|
+
.map((finding) => ({ id: finding.id, status: finding.status }))
|
|
234
|
+
.sort((left, right) => left.id.localeCompare(right.id));
|
|
235
|
+
const terminalDecisionStates = new Set(['closed', 'superseded']);
|
|
236
|
+
const blockingDecisions = decisions
|
|
237
|
+
.filter((decision) => !terminalDecisionStates.has(String(decision.status)))
|
|
238
|
+
.map((decision) => ({ id: decision.id, status: decision.status }))
|
|
239
|
+
.sort((left, right) => left.id.localeCompare(right.id));
|
|
240
|
+
if (blockingFindings.length === 0 && blockingDecisions.length === 0)
|
|
241
|
+
return;
|
|
242
|
+
throw new OperateError('E_OPERATE_CYCLE_NOT_DISPOSED', `Cycle ${cycleId} still has governed work that must be disposed before it can close.`, {
|
|
243
|
+
blockingFindings,
|
|
244
|
+
blockingDecisions,
|
|
245
|
+
recoveryCommands: [
|
|
246
|
+
...blockingFindings.map(({ id }) => `planr operate findings accept ${id} --yes && planr operate routes apply <route-id> --yes`),
|
|
247
|
+
...blockingFindings.map(({ id }) => `planr operate findings reject ${id} --reason <reason> --yes`),
|
|
248
|
+
...blockingDecisions.map(({ id }) => `planr operate decisions decide ${id} --option <option> --yes`),
|
|
249
|
+
],
|
|
250
|
+
});
|
|
251
|
+
}
|
|
252
|
+
function scoreAmendment(finding, values, timestamp) {
|
|
253
|
+
const prior = {
|
|
254
|
+
impact: Number(finding.impact),
|
|
255
|
+
confidence: Number(finding.confidence),
|
|
256
|
+
ease: Number(finding.ease),
|
|
257
|
+
};
|
|
258
|
+
const next = { ...prior };
|
|
259
|
+
for (const key of ['impact', 'confidence', 'ease']) {
|
|
260
|
+
if (values[key] === undefined)
|
|
261
|
+
continue;
|
|
262
|
+
const score = Number(values[key]);
|
|
263
|
+
if (!Number.isInteger(score) || score < 1 || score > 5) {
|
|
264
|
+
throw new OperateError('E_OPERATE_CONFIG_INVALID', `${key} amendment must be an integer from 1 to 5.`);
|
|
265
|
+
}
|
|
266
|
+
next[key] = score;
|
|
267
|
+
}
|
|
268
|
+
const ceiling = Number(finding.confidenceCeiling ?? finding.confidence);
|
|
269
|
+
if (next.confidence > ceiling) {
|
|
270
|
+
throw new OperateError('E_OPERATE_CONFIG_INVALID', `Confidence amendment ${next.confidence} exceeds the evidence ceiling ${ceiling}.`);
|
|
271
|
+
}
|
|
272
|
+
const reason = sanitizeGeneratedPlainText(values.reason?.trim() || 'Accepted without changing the evidence-bounded score.').slice(0, 2_048);
|
|
273
|
+
return {
|
|
274
|
+
patch: { score: next.impact * next.confidence * next.ease },
|
|
275
|
+
scoreAmendment: {
|
|
276
|
+
prior,
|
|
277
|
+
next,
|
|
278
|
+
reason,
|
|
279
|
+
actor: { kind: 'human', id: 'operate-cli' },
|
|
280
|
+
timestamp,
|
|
281
|
+
},
|
|
282
|
+
};
|
|
283
|
+
}
|
|
284
|
+
export async function governOperatingFinding(input) {
|
|
285
|
+
if (!input.confirmed) {
|
|
286
|
+
throw new OperateError('E_OPERATE_AUTHORITY_REQUIRED', `Finding ${input.action} requires explicit confirmation.`);
|
|
287
|
+
}
|
|
288
|
+
const store = new OperatingEventStore(input.projectRoot, { localRoot: input.localRoot });
|
|
289
|
+
const state = await store.state();
|
|
290
|
+
const finding = state.findings.find((record) => record.id === input.findingId);
|
|
291
|
+
if (!finding) {
|
|
292
|
+
throw new OperateError('E_OPERATE_STATE_INVALID', `Unknown finding ${input.findingId}.`);
|
|
293
|
+
}
|
|
294
|
+
if (input.action !== 'accept' && !input.reason?.trim()) {
|
|
295
|
+
throw new OperateError('E_OPERATE_AUTHORITY_REQUIRED', `${input.action} requires an audit reason.`);
|
|
296
|
+
}
|
|
297
|
+
const timestamp = new Date().toISOString();
|
|
298
|
+
const acceptedScore = input.action === 'accept' ? scoreAmendment(finding, input, timestamp) : null;
|
|
299
|
+
const patch = acceptedScore?.patch ?? {};
|
|
300
|
+
const findingResult = await mutateEvent({
|
|
301
|
+
projectRoot: input.projectRoot,
|
|
302
|
+
localRoot: input.localRoot,
|
|
303
|
+
cycleId: String(finding.cycleId),
|
|
304
|
+
type: `finding.${input.action === 'accept' ? 'accepted' : input.action === 'reject' ? 'rejected' : 'superseded'}`,
|
|
305
|
+
entityId: input.findingId,
|
|
306
|
+
payload: input.action === 'accept'
|
|
307
|
+
? {
|
|
308
|
+
patch,
|
|
309
|
+
scoreAmendment: acceptedScore?.scoreAmendment,
|
|
310
|
+
}
|
|
311
|
+
: {
|
|
312
|
+
patch,
|
|
313
|
+
reason: sanitizeGeneratedPlainText(input.reason?.trim() ?? '').slice(0, 2_048),
|
|
314
|
+
},
|
|
315
|
+
evidenceRefs: Array.isArray(finding.evidenceRefs) ? finding.evidenceRefs : [],
|
|
316
|
+
timestamp,
|
|
317
|
+
});
|
|
318
|
+
if (input.action !== 'accept')
|
|
319
|
+
return findingResult;
|
|
320
|
+
let acceptedRoute = null;
|
|
321
|
+
for (const candidate of findingResult.state.routes) {
|
|
322
|
+
const full = await readOperatingRoute(input.projectRoot, String(candidate.id)).catch(() => null);
|
|
323
|
+
if (!full?.actions.some((action) => action.findingId === input.findingId))
|
|
324
|
+
continue;
|
|
325
|
+
acceptedRoute = full;
|
|
326
|
+
if (candidate.state === 'proposed') {
|
|
327
|
+
await mutateEvent({
|
|
328
|
+
projectRoot: input.projectRoot,
|
|
329
|
+
localRoot: input.localRoot,
|
|
330
|
+
cycleId: full.cycleId,
|
|
331
|
+
type: 'route.accepted',
|
|
332
|
+
entityId: full.id,
|
|
333
|
+
payload: {
|
|
334
|
+
routeDigest: full.routeDigest,
|
|
335
|
+
confirmationDigest: full.previewDigest,
|
|
336
|
+
},
|
|
337
|
+
evidenceRefs: full.actions.flatMap((action) => action.evidenceRefs),
|
|
338
|
+
});
|
|
339
|
+
}
|
|
340
|
+
}
|
|
341
|
+
return {
|
|
342
|
+
finding: input.findingId,
|
|
343
|
+
accepted: true,
|
|
344
|
+
routeId: acceptedRoute?.id ?? null,
|
|
345
|
+
routePreviewDigest: acceptedRoute?.previewDigest ?? null,
|
|
346
|
+
};
|
|
347
|
+
}
|
|
348
|
+
export async function decideOperatingDecision(input) {
|
|
349
|
+
if (!input.confirmed || !input.value.trim()) {
|
|
350
|
+
throw new OperateError('E_OPERATE_AUTHORITY_REQUIRED', 'A decision requires --yes and a non-empty value.');
|
|
351
|
+
}
|
|
352
|
+
const store = new OperatingEventStore(input.projectRoot, {
|
|
353
|
+
localRoot: input.localRoot,
|
|
354
|
+
});
|
|
355
|
+
const state = await store.state();
|
|
356
|
+
const decision = state.decisions.find((record) => record.id === input.decisionId);
|
|
357
|
+
if (!decision) {
|
|
358
|
+
throw new OperateError('E_OPERATE_STATE_INVALID', `Unknown decision ${input.decisionId}.`);
|
|
359
|
+
}
|
|
360
|
+
const selectedOption = sanitizeGeneratedPlainText(input.value.trim()).slice(0, 8_192);
|
|
361
|
+
const reason = input.reason?.trim()
|
|
362
|
+
? sanitizeGeneratedPlainText(input.reason.trim()).slice(0, 2_048)
|
|
363
|
+
: null;
|
|
364
|
+
let answeredHead;
|
|
365
|
+
if (decision.status === 'answered') {
|
|
366
|
+
if (decision.selectedOption !== selectedOption) {
|
|
367
|
+
throw new OperateError('E_OPERATE_STATE_INVALID', `Decision ${input.decisionId} was already answered with a different option.`);
|
|
368
|
+
}
|
|
369
|
+
const answeredEvent = [...(await store.replay()).events]
|
|
370
|
+
.reverse()
|
|
371
|
+
.find((event) => event.type === 'decision.answered' && event.entityId === input.decisionId);
|
|
372
|
+
if (!answeredEvent) {
|
|
373
|
+
throw new OperateError('E_OPERATE_STATE_INVALID', `Decision ${input.decisionId} is answered but its answer event is missing.`);
|
|
374
|
+
}
|
|
375
|
+
answeredHead = { sequence: answeredEvent.sequence, hash: answeredEvent.eventHash };
|
|
376
|
+
}
|
|
377
|
+
else {
|
|
378
|
+
const answered = await mutateEvent({
|
|
379
|
+
projectRoot: input.projectRoot,
|
|
380
|
+
localRoot: input.localRoot,
|
|
381
|
+
cycleId: String(decision.cycleId),
|
|
382
|
+
type: 'decision.answered',
|
|
383
|
+
entityId: input.decisionId,
|
|
384
|
+
payload: {
|
|
385
|
+
patch: { selectedOption },
|
|
386
|
+
reason,
|
|
387
|
+
},
|
|
388
|
+
validateState: (lockedState) => {
|
|
389
|
+
const lockedDecision = lockedState.decisions.find((record) => record.id === input.decisionId);
|
|
390
|
+
if (!lockedDecision || !['open', 'default-due'].includes(String(lockedDecision.status))) {
|
|
391
|
+
throw new OperateError('E_OPERATE_STATE_INVALID', `Decision ${input.decisionId} is no longer available to answer.`);
|
|
392
|
+
}
|
|
393
|
+
},
|
|
394
|
+
});
|
|
395
|
+
answeredHead = answered.eventHead;
|
|
396
|
+
}
|
|
397
|
+
return mutateEvent({
|
|
398
|
+
projectRoot: input.projectRoot,
|
|
399
|
+
localRoot: input.localRoot,
|
|
400
|
+
cycleId: String(decision.cycleId),
|
|
401
|
+
type: 'decision.closed',
|
|
402
|
+
entityId: input.decisionId,
|
|
403
|
+
payload: { patch: { selectedOption }, answeredHead },
|
|
404
|
+
validateState: (lockedState) => {
|
|
405
|
+
const lockedDecision = lockedState.decisions.find((record) => record.id === input.decisionId);
|
|
406
|
+
if (lockedDecision?.status !== 'answered' ||
|
|
407
|
+
lockedDecision.selectedOption !== selectedOption) {
|
|
408
|
+
throw new OperateError('E_OPERATE_STATE_INVALID', `Decision ${input.decisionId} is not awaiting closure for the selected option.`);
|
|
409
|
+
}
|
|
410
|
+
},
|
|
411
|
+
});
|
|
412
|
+
}
|
|
413
|
+
export async function answerOperatingGap(input) {
|
|
414
|
+
if (!input.confirmed || !input.value.trim()) {
|
|
415
|
+
throw new OperateError('E_OPERATE_AUTHORITY_REQUIRED', 'A gap answer requires --yes and a non-empty value.');
|
|
416
|
+
}
|
|
417
|
+
const state = await new OperatingEventStore(input.projectRoot, {
|
|
418
|
+
localRoot: input.localRoot,
|
|
419
|
+
}).state();
|
|
420
|
+
const gap = state.dataGaps.find((record) => record.id === input.gapId);
|
|
421
|
+
if (!gap)
|
|
422
|
+
throw new OperateError('E_OPERATE_STATE_INVALID', `Unknown gap ${input.gapId}.`);
|
|
423
|
+
const answer = sanitizeGeneratedPlainText(input.value.trim()).slice(0, 8_192);
|
|
424
|
+
return mutateEvent({
|
|
425
|
+
projectRoot: input.projectRoot,
|
|
426
|
+
localRoot: input.localRoot,
|
|
427
|
+
cycleId: String(gap.cycleId),
|
|
428
|
+
type: 'gap.answered',
|
|
429
|
+
entityId: input.gapId,
|
|
430
|
+
payload: { patch: { answer } },
|
|
431
|
+
});
|
|
432
|
+
}
|
|
433
|
+
/**
|
|
434
|
+
* A human answer is not evidence by itself. Verification requires explicit
|
|
435
|
+
* evidence identifiers, then records verified and closed transitions before a
|
|
436
|
+
* resumed cycle may rely on newly collected provider evidence.
|
|
437
|
+
*/
|
|
438
|
+
export async function verifyOperatingGap(input) {
|
|
439
|
+
const evidenceRefs = [...new Set(input.evidenceRefs)].sort();
|
|
440
|
+
if (!input.confirmed || evidenceRefs.length === 0) {
|
|
441
|
+
throw new OperateError('E_OPERATE_AUTHORITY_REQUIRED', 'Gap verification requires --yes and at least one verified evidence reference.');
|
|
442
|
+
}
|
|
443
|
+
const state = await new OperatingEventStore(input.projectRoot, {
|
|
444
|
+
localRoot: input.localRoot,
|
|
445
|
+
}).state();
|
|
446
|
+
const gap = state.dataGaps.find((record) => record.id === input.gapId);
|
|
447
|
+
if (!gap || gap.status !== 'answered') {
|
|
448
|
+
throw new OperateError('E_OPERATE_STATE_INVALID', `Gap ${input.gapId} must be answered before it can be verified.`);
|
|
449
|
+
}
|
|
450
|
+
const verified = await mutateEvent({
|
|
451
|
+
projectRoot: input.projectRoot,
|
|
452
|
+
localRoot: input.localRoot,
|
|
453
|
+
cycleId: String(gap.cycleId),
|
|
454
|
+
type: 'gap.verified',
|
|
455
|
+
entityId: input.gapId,
|
|
456
|
+
payload: {},
|
|
457
|
+
evidenceRefs,
|
|
458
|
+
});
|
|
459
|
+
return mutateEvent({
|
|
460
|
+
projectRoot: input.projectRoot,
|
|
461
|
+
localRoot: input.localRoot,
|
|
462
|
+
cycleId: String(gap.cycleId),
|
|
463
|
+
type: 'gap.closed',
|
|
464
|
+
entityId: input.gapId,
|
|
465
|
+
payload: {},
|
|
466
|
+
evidenceRefs,
|
|
467
|
+
}).then((closed) => ({ verified, closed }));
|
|
468
|
+
}
|
|
469
|
+
export async function applyOrRollbackRoute(input) {
|
|
470
|
+
const route = await readOperatingRoute(input.projectRoot, input.routeId);
|
|
471
|
+
if (input.action === 'apply') {
|
|
472
|
+
const projected = (await new OperatingEventStore(input.projectRoot, {
|
|
473
|
+
localRoot: input.localRoot,
|
|
474
|
+
}).state()).routes.find((record) => record.id === input.routeId);
|
|
475
|
+
const destination = await import('./routes.js').then(({ routeDestinationDigest }) => routeDestinationDigest(input.projectRoot, route));
|
|
476
|
+
const isAgentArtifact = route.actions[0]?.kind === 'create-cycle-artifact';
|
|
477
|
+
const generated = isAgentArtifact
|
|
478
|
+
? await readStoredOperatingArtifactGeneration({
|
|
479
|
+
projectRoot: input.projectRoot,
|
|
480
|
+
localRoot: input.localRoot,
|
|
481
|
+
route,
|
|
482
|
+
})
|
|
483
|
+
: null;
|
|
484
|
+
const awaitingPlan = projected?.state === 'prepared' &&
|
|
485
|
+
['create-spec', 'create-instrumentation-spec'].includes(String(route.actions[0]?.kind));
|
|
486
|
+
const awaitingArtifactReview = projected?.state === 'prepared' && generated?.state === 'generated';
|
|
487
|
+
const preview = {
|
|
488
|
+
route,
|
|
489
|
+
previewDigest: awaitingArtifactReview && generated.exactPreviewDigest
|
|
490
|
+
? generated.exactPreviewDigest
|
|
491
|
+
: route.previewDigest,
|
|
492
|
+
destinationDigest: destination,
|
|
493
|
+
destinationMatches: awaitingPlan || (isAgentArtifact && projected?.state === 'prepared')
|
|
494
|
+
? null
|
|
495
|
+
: destination === route.destinationDigest,
|
|
496
|
+
phase: awaitingPlan
|
|
497
|
+
? 'complete-plan-handoff'
|
|
498
|
+
: awaitingArtifactReview
|
|
499
|
+
? 'commit-generated-artifact'
|
|
500
|
+
: isAgentArtifact
|
|
501
|
+
? 'generate-artifact'
|
|
502
|
+
: 'prepare-route',
|
|
503
|
+
writesCommitted: false,
|
|
504
|
+
...(awaitingArtifactReview
|
|
505
|
+
? {
|
|
506
|
+
artifact: {
|
|
507
|
+
destination: generated.session.destination,
|
|
508
|
+
content: generated.content,
|
|
509
|
+
outputDigest: generated.session.outputDigest,
|
|
510
|
+
attempts: generated.attempts,
|
|
511
|
+
},
|
|
512
|
+
}
|
|
513
|
+
: {}),
|
|
514
|
+
};
|
|
515
|
+
if (input.preview)
|
|
516
|
+
return preview;
|
|
517
|
+
if (!input.confirmed) {
|
|
518
|
+
throw new OperateError('E_OPERATE_ROUTE_CONFIRMATION_REQUIRED', 'Review the route preview, then confirm the exact preview digest.', preview);
|
|
519
|
+
}
|
|
520
|
+
if (!input.previewDigest) {
|
|
521
|
+
throw new OperateError('E_OPERATE_ROUTE_CONFIRMATION_REQUIRED', `Preview this route and provide --preview-digest ${preview.previewDigest}.`, { previewDigest: preview.previewDigest, route });
|
|
522
|
+
}
|
|
523
|
+
if (!awaitingPlan && destination !== route.destinationDigest) {
|
|
524
|
+
throw new OperateError('E_OPERATE_ROUTE_DRIFT', 'A route destination changed after preview.');
|
|
525
|
+
}
|
|
526
|
+
const config = await validateOperatingConfiguration(input.projectRoot);
|
|
527
|
+
return applyOperatingRoute({
|
|
528
|
+
projectRoot: input.projectRoot,
|
|
529
|
+
route,
|
|
530
|
+
config,
|
|
531
|
+
confirmationDigest: input.previewDigest,
|
|
532
|
+
localRoot: input.localRoot,
|
|
533
|
+
});
|
|
534
|
+
}
|
|
535
|
+
if (!input.confirmed) {
|
|
536
|
+
throw new OperateError('E_OPERATE_ROUTE_CONFIRMATION_REQUIRED', 'Route rollback requires explicit confirmation.');
|
|
537
|
+
}
|
|
538
|
+
const state = await new OperatingEventStore(input.projectRoot, {
|
|
539
|
+
localRoot: input.localRoot,
|
|
540
|
+
}).state();
|
|
541
|
+
const projected = state.routes.find((record) => record.id === input.routeId);
|
|
542
|
+
if (!projected?.transactionId) {
|
|
543
|
+
throw new OperateError('E_OPERATE_TRANSACTION_INVALID', `Route ${input.routeId} has no applied transaction to roll back.`);
|
|
544
|
+
}
|
|
545
|
+
return rollbackOperatingRoute({
|
|
546
|
+
projectRoot: input.projectRoot,
|
|
547
|
+
route,
|
|
548
|
+
transactionId: String(projected.transactionId),
|
|
549
|
+
recoveryId: `RCV-${canonicalDigest({
|
|
550
|
+
routeId: input.routeId,
|
|
551
|
+
transactionId: projected.transactionId,
|
|
552
|
+
}).slice(7, 31)}`,
|
|
553
|
+
localRoot: input.localRoot,
|
|
554
|
+
});
|
|
555
|
+
}
|
|
556
|
+
//# sourceMappingURL=lifecycle.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"lifecycle.js","sourceRoot":"","sources":["../../../src/services/operate/lifecycle.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import { type OperatingEventHead, type OperatingLockRecord } from './types.js';
|
|
2
|
+
export interface OperatingLock {
|
|
3
|
+
readonly record: OperatingLockRecord;
|
|
4
|
+
readonly path: string;
|
|
5
|
+
assertEventHead(currentEventHead: OperatingEventHead): void;
|
|
6
|
+
advanceEventHead(currentEventHead: OperatingEventHead, nextEventHead: OperatingEventHead): Promise<void>;
|
|
7
|
+
heartbeat(currentEventHead: OperatingEventHead, now?: Date): Promise<void>;
|
|
8
|
+
release(): Promise<void>;
|
|
9
|
+
}
|
|
10
|
+
export interface AcquireLockOptions {
|
|
11
|
+
projectKey: string;
|
|
12
|
+
name?: string;
|
|
13
|
+
now?: Date;
|
|
14
|
+
leaseDurationMs?: number;
|
|
15
|
+
expectedEventHead: OperatingEventHead;
|
|
16
|
+
currentEventHead: OperatingEventHead;
|
|
17
|
+
localRoot?: string;
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Returns null where the platform offers no `ps` — notably Windows. Callers
|
|
21
|
+
* treat a null identity as "cannot corroborate", so lock ownership falls back
|
|
22
|
+
* to the lease and heartbeat rather than to a fabricated identity.
|
|
23
|
+
*/
|
|
24
|
+
export declare function readProcessStartIdentity(pid: number): Promise<string | null>;
|
|
25
|
+
export declare function readOperatingLock(lockPath: string): Promise<OperatingLockRecord>;
|
|
26
|
+
export declare function acquireOperatingLock(projectRoot: string, options: AcquireLockOptions): Promise<OperatingLock>;
|
|
27
|
+
export declare function recoverStaleOperatingLock(projectRoot: string, options: {
|
|
28
|
+
projectKey: string;
|
|
29
|
+
name?: string;
|
|
30
|
+
expectedNonce: string;
|
|
31
|
+
expectedProcessStartedAt?: string;
|
|
32
|
+
now?: Date;
|
|
33
|
+
localRoot?: string;
|
|
34
|
+
processIdentityReader?: (pid: number) => Promise<string | null>;
|
|
35
|
+
}): Promise<void>;
|
|
36
|
+
export declare function withOperatingLock<T>(projectRoot: string, options: AcquireLockOptions, operation: (lock: OperatingLock) => Promise<T>): Promise<T>;
|
|
37
|
+
//# sourceMappingURL=lock-service.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"lock-service.d.ts","sourceRoot":"","sources":["../../../src/services/operate/lock-service.ts"],"names":[],"mappings":"AASA,OAAO,EAAgB,KAAK,kBAAkB,EAAE,KAAK,mBAAmB,EAAE,MAAM,YAAY,CAAC;AAQ7F,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,MAAM,EAAE,mBAAmB,CAAC;IACrC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,eAAe,CAAC,gBAAgB,EAAE,kBAAkB,GAAG,IAAI,CAAC;IAC5D,gBAAgB,CACd,gBAAgB,EAAE,kBAAkB,EACpC,aAAa,EAAE,kBAAkB,GAChC,OAAO,CAAC,IAAI,CAAC,CAAC;IACjB,SAAS,CAAC,gBAAgB,EAAE,kBAAkB,EAAE,GAAG,CAAC,EAAE,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC3E,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CAC1B;AAED,MAAM,WAAW,kBAAkB;IACjC,UAAU,EAAE,MAAM,CAAC;IACnB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,GAAG,CAAC,EAAE,IAAI,CAAC;IACX,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,iBAAiB,EAAE,kBAAkB,CAAC;IACtC,gBAAgB,EAAE,kBAAkB,CAAC;IACrC,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AA+BD;;;;GAIG;AACH,wBAAsB,wBAAwB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAYlF;AAgBD,wBAAsB,iBAAiB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,mBAAmB,CAAC,CAmBtF;AAED,wBAAsB,oBAAoB,CACxC,WAAW,EAAE,MAAM,EACnB,OAAO,EAAE,kBAAkB,GAC1B,OAAO,CAAC,aAAa,CAAC,CA0FxB;AAED,wBAAsB,yBAAyB,CAC7C,WAAW,EAAE,MAAM,EACnB,OAAO,EAAE;IACP,UAAU,EAAE,MAAM,CAAC;IACnB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,aAAa,EAAE,MAAM,CAAC;IACtB,wBAAwB,CAAC,EAAE,MAAM,CAAC;IAClC,GAAG,CAAC,EAAE,IAAI,CAAC;IACX,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,qBAAqB,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;CACjE,GACA,OAAO,CAAC,IAAI,CAAC,CAsDf;AAED,wBAAsB,iBAAiB,CAAC,CAAC,EACvC,WAAW,EAAE,MAAM,EACnB,OAAO,EAAE,kBAAkB,EAC3B,SAAS,EAAE,CAAC,IAAI,EAAE,aAAa,KAAK,OAAO,CAAC,CAAC,CAAC,GAC7C,OAAO,CAAC,CAAC,CAAC,CAOZ"}
|