wicked-crew 0.7.45 → 0.7.47
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/dist/api/capture.d.ts +2 -2
- package/dist/api/delivery-index.d.ts +21 -0
- package/dist/api/delivery-index.d.ts.map +1 -1
- package/dist/api/delivery-index.js +36 -0
- package/dist/api/delivery-index.js.map +1 -1
- package/dist/api/elicitation-cache.d.ts +12 -0
- package/dist/api/elicitation-cache.d.ts.map +1 -1
- package/dist/api/elicitation-cache.js +17 -1
- package/dist/api/elicitation-cache.js.map +1 -1
- package/dist/api/eval-sample.d.ts +6 -6
- package/dist/api/governance-steering.d.ts.map +1 -1
- package/dist/api/governance-steering.js +1 -0
- package/dist/api/governance-steering.js.map +1 -1
- package/dist/api/mcp.d.ts +10 -10
- package/dist/api/policy-landing.d.ts +55 -0
- package/dist/api/policy-landing.d.ts.map +1 -0
- package/dist/api/policy-landing.js +174 -0
- package/dist/api/policy-landing.js.map +1 -0
- package/dist/api/recording.d.ts +228 -0
- package/dist/api/recording.d.ts.map +1 -0
- package/dist/api/recording.js +1140 -0
- package/dist/api/recording.js.map +1 -0
- package/dist/api/roster-standing.d.ts.map +1 -1
- package/dist/api/roster-standing.js +5 -1
- package/dist/api/roster-standing.js.map +1 -1
- package/dist/api/routes.d.ts +31 -39
- package/dist/api/routes.d.ts.map +1 -1
- package/dist/api/routes.js +264 -104
- package/dist/api/routes.js.map +1 -1
- package/dist/api/run-timing-index.d.ts +17 -0
- package/dist/api/run-timing-index.d.ts.map +1 -1
- package/dist/api/run-timing-index.js +43 -1
- package/dist/api/run-timing-index.js.map +1 -1
- package/dist/api/seat-health.d.ts +35 -0
- package/dist/api/seat-health.d.ts.map +1 -1
- package/dist/api/seat-health.js +72 -0
- package/dist/api/seat-health.js.map +1 -1
- package/dist/api/seat-standing.d.ts +2 -2
- package/dist/api/seat-standing.d.ts.map +1 -1
- package/dist/api/seat-standing.js +27 -7
- package/dist/api/seat-standing.js.map +1 -1
- package/dist/api/server.d.ts +12 -0
- package/dist/api/server.d.ts.map +1 -1
- package/dist/api/server.js +74 -1
- package/dist/api/server.js.map +1 -1
- package/dist/api/testing.d.ts +4 -4
- package/dist/api/testing.d.ts.map +1 -1
- package/dist/api/testing.js +3 -0
- package/dist/api/testing.js.map +1 -1
- package/dist/api/watch-routes.d.ts +30 -0
- package/dist/api/watch-routes.d.ts.map +1 -0
- package/dist/api/watch-routes.js +104 -0
- package/dist/api/watch-routes.js.map +1 -0
- package/dist/campaigns/routes.d.ts +2 -2
- package/dist/cli/index.d.ts.map +1 -1
- package/dist/cli/index.js +4 -1
- package/dist/cli/index.js.map +1 -1
- package/dist/core/adapter.d.ts +36 -0
- package/dist/core/adapter.d.ts.map +1 -1
- package/dist/core/adapter.js +177 -5
- package/dist/core/adapter.js.map +1 -1
- package/dist/core/run-identity.js +1 -1
- package/dist/core/run-identity.js.map +1 -1
- package/dist/core/walkthrough-root.d.ts +21 -0
- package/dist/core/walkthrough-root.d.ts.map +1 -0
- package/dist/core/walkthrough-root.js +66 -0
- package/dist/core/walkthrough-root.js.map +1 -0
- package/dist/decisions/derive.d.ts +79 -0
- package/dist/decisions/derive.d.ts.map +1 -0
- package/dist/decisions/derive.js +282 -0
- package/dist/decisions/derive.js.map +1 -0
- package/dist/decisions/events.d.ts +23 -0
- package/dist/decisions/events.d.ts.map +1 -0
- package/dist/decisions/events.js +22 -0
- package/dist/decisions/events.js.map +1 -0
- package/dist/decisions/ingest.d.ts +28 -0
- package/dist/decisions/ingest.d.ts.map +1 -0
- package/dist/decisions/ingest.js +92 -0
- package/dist/decisions/ingest.js.map +1 -0
- package/dist/decisions/land.d.ts +100 -0
- package/dist/decisions/land.d.ts.map +1 -0
- package/dist/decisions/land.js +466 -0
- package/dist/decisions/land.js.map +1 -0
- package/dist/decisions/ledger.d.ts +60 -0
- package/dist/decisions/ledger.d.ts.map +1 -0
- package/dist/decisions/ledger.js +246 -0
- package/dist/decisions/ledger.js.map +1 -0
- package/dist/decisions/routes.d.ts +10 -0
- package/dist/decisions/routes.d.ts.map +1 -0
- package/dist/decisions/routes.js +141 -0
- package/dist/decisions/routes.js.map +1 -0
- package/dist/decisions/types.d.ts +120 -0
- package/dist/decisions/types.d.ts.map +1 -0
- package/dist/decisions/types.js +19 -0
- package/dist/decisions/types.js.map +1 -0
- package/dist/interactive/draft-events.d.ts.map +1 -1
- package/dist/interactive/draft-events.js +1 -0
- package/dist/interactive/draft-events.js.map +1 -1
- package/dist/projects/events.d.ts.map +1 -1
- package/dist/projects/events.js +2 -1
- package/dist/projects/events.js.map +1 -1
- package/dist/projects/state-home-preflight.d.ts.map +1 -1
- package/dist/projects/state-home-preflight.js +3 -0
- package/dist/projects/state-home-preflight.js.map +1 -1
- package/dist/projects/state-home-registry.d.ts.map +1 -1
- package/dist/projects/state-home-registry.js +2 -0
- package/dist/projects/state-home-registry.js.map +1 -1
- package/dist/projects/state-home.d.ts +6 -0
- package/dist/projects/state-home.d.ts.map +1 -1
- package/dist/projects/state-home.js +28 -1
- package/dist/projects/state-home.js.map +1 -1
- package/dist/qe/acceptance.d.ts +45 -4
- package/dist/qe/acceptance.d.ts.map +1 -1
- package/dist/qe/acceptance.js +93 -4
- package/dist/qe/acceptance.js.map +1 -1
- package/dist/qe/ledger.d.ts +20 -0
- package/dist/qe/ledger.d.ts.map +1 -1
- package/dist/qe/ledger.js +34 -0
- package/dist/qe/ledger.js.map +1 -1
- package/dist/qe/walkthrough-acceptance.d.ts +82 -0
- package/dist/qe/walkthrough-acceptance.d.ts.map +1 -0
- package/dist/qe/walkthrough-acceptance.js +248 -0
- package/dist/qe/walkthrough-acceptance.js.map +1 -0
- package/dist/skills/base-skill.d.ts.map +1 -1
- package/dist/skills/base-skill.js +3 -2
- package/dist/skills/base-skill.js.map +1 -1
- package/dist/skills/plugin-source.d.ts +19 -1
- package/dist/skills/plugin-source.d.ts.map +1 -1
- package/dist/skills/plugin-source.js +31 -2
- package/dist/skills/plugin-source.js.map +1 -1
- package/dist/skills/runtime.d.ts +11 -2
- package/dist/skills/runtime.d.ts.map +1 -1
- package/dist/skills/runtime.js +29 -1
- package/dist/skills/runtime.js.map +1 -1
- package/dist/skills/store.d.ts +14 -1
- package/dist/skills/store.d.ts.map +1 -1
- package/dist/skills/store.js +19 -5
- package/dist/skills/store.js.map +1 -1
- package/dist/standing-orders/routes.d.ts +4 -4
- package/dist/standing-orders/store.d.ts +2 -2
- package/dist/watch/checks/check-failed.d.ts +24 -0
- package/dist/watch/checks/check-failed.d.ts.map +1 -0
- package/dist/watch/checks/check-failed.js +56 -0
- package/dist/watch/checks/check-failed.js.map +1 -0
- package/dist/watch/checks/deliver-audit.d.ts +19 -0
- package/dist/watch/checks/deliver-audit.d.ts.map +1 -0
- package/dist/watch/checks/deliver-audit.js +129 -0
- package/dist/watch/checks/deliver-audit.js.map +1 -0
- package/dist/watch/checks/index.d.ts +8 -0
- package/dist/watch/checks/index.d.ts.map +1 -0
- package/dist/watch/checks/index.js +19 -0
- package/dist/watch/checks/index.js.map +1 -0
- package/dist/watch/checks/lag.d.ts +24 -0
- package/dist/watch/checks/lag.d.ts.map +1 -0
- package/dist/watch/checks/lag.js +55 -0
- package/dist/watch/checks/lag.js.map +1 -0
- package/dist/watch/checks/quiet-after-claim.d.ts +17 -0
- package/dist/watch/checks/quiet-after-claim.d.ts.map +1 -0
- package/dist/watch/checks/quiet-after-claim.js +89 -0
- package/dist/watch/checks/quiet-after-claim.js.map +1 -0
- package/dist/watch/checks/ungated.d.ts +12 -0
- package/dist/watch/checks/ungated.d.ts.map +1 -0
- package/dist/watch/checks/ungated.js +64 -0
- package/dist/watch/checks/ungated.js.map +1 -0
- package/dist/watch/emit.d.ts +122 -0
- package/dist/watch/emit.d.ts.map +1 -0
- package/dist/watch/emit.js +443 -0
- package/dist/watch/emit.js.map +1 -0
- package/dist/watch/events.d.ts +21 -0
- package/dist/watch/events.d.ts.map +1 -0
- package/dist/watch/events.js +21 -0
- package/dist/watch/events.js.map +1 -0
- package/dist/watch/keys.d.ts +15 -0
- package/dist/watch/keys.d.ts.map +1 -0
- package/dist/watch/keys.js +23 -0
- package/dist/watch/keys.js.map +1 -0
- package/dist/watch/lanes.d.ts +41 -0
- package/dist/watch/lanes.d.ts.map +1 -0
- package/dist/watch/lanes.js +73 -0
- package/dist/watch/lanes.js.map +1 -0
- package/dist/watch/loader.d.ts +47 -0
- package/dist/watch/loader.d.ts.map +1 -0
- package/dist/watch/loader.js +178 -0
- package/dist/watch/loader.js.map +1 -0
- package/dist/watch/registry.d.ts +137 -0
- package/dist/watch/registry.d.ts.map +1 -0
- package/dist/watch/registry.js +530 -0
- package/dist/watch/registry.js.map +1 -0
- package/dist/watch/ring.d.ts +32 -0
- package/dist/watch/ring.d.ts.map +1 -0
- package/dist/watch/ring.js +90 -0
- package/dist/watch/ring.js.map +1 -0
- package/dist/watch/router.d.ts +25 -0
- package/dist/watch/router.d.ts.map +1 -0
- package/dist/watch/router.js +87 -0
- package/dist/watch/router.js.map +1 -0
- package/dist/watch/sources.d.ts +42 -0
- package/dist/watch/sources.d.ts.map +1 -0
- package/dist/watch/sources.js +104 -0
- package/dist/watch/sources.js.map +1 -0
- package/dist/watch/types.d.ts +110 -0
- package/dist/watch/types.d.ts.map +1 -0
- package/dist/watch/types.js +6 -0
- package/dist/watch/types.js.map +1 -0
- package/endpoint-manifest.json +178 -1
- package/package.json +3 -2
- package/watch/entries/deliver-audit.json +17 -0
- package/watch/entries/quiet-after-claim.json +16 -0
- package/watch/entries/registry-check-failed.json +12 -0
- package/watch/entries/registry-lagging.json +12 -0
- package/watch/entries/ungated.json +13 -0
- package/dist/api/demo.d.ts +0 -90
- package/dist/api/demo.d.ts.map +0 -1
- package/dist/api/demo.js +0 -492
- package/dist/api/demo.js.map +0 -1
|
@@ -0,0 +1,466 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The ONE landing path for decisions (DES-decision-capture §4.5, DC-S4a): `remember()` and its
|
|
3
|
+
* siblings `undo` / `dismiss` / `widen` / `same`, plus the act-on-route step `ingest` hands over.
|
|
4
|
+
*
|
|
5
|
+
* Every landing — auto, the chip, Needs You, and `POST /proposals/:id/approve` of a proposal this
|
|
6
|
+
* ledger filed — goes through `remember()`, and the human check lives INSIDE it (actor kind
|
|
7
|
+
* `human` ∧ trust ≥ operator), so no route branch can skip it. Words, actor and ORIGIN come from
|
|
8
|
+
* the ledger, never from a proposal payload (which carries only the decision id).
|
|
9
|
+
*/
|
|
10
|
+
import { randomUUID } from 'node:crypto';
|
|
11
|
+
import { trustAtLeast } from '../api/auth.js';
|
|
12
|
+
import { landPolicyRule, policyProposalToRule } from '../api/policy-landing.js';
|
|
13
|
+
import { DECISION_DISMISSED, DECISION_OFFERED, DECISION_REMEMBERED, DECISION_RESTATED, DECISION_UNDONE, DECISION_WIDENED, decisionFact, } from './events.js';
|
|
14
|
+
/** A refusal with its HTTP status (403 human check, 404 unknown, 409 wrong state, 502 upstream). */
|
|
15
|
+
export class DecisionError extends Error {
|
|
16
|
+
status;
|
|
17
|
+
constructor(status, message) {
|
|
18
|
+
super(message);
|
|
19
|
+
this.status = status;
|
|
20
|
+
this.name = 'DecisionError';
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
function message(err) {
|
|
24
|
+
return err instanceof Error ? err.message : String(err);
|
|
25
|
+
}
|
|
26
|
+
/** `dec_` + a uuid v7-shaped id: a 48-bit ms timestamp prefix so ids sort by time. */
|
|
27
|
+
export function newDecisionId(now = Date.now()) {
|
|
28
|
+
const hex = randomUUID().replace(/-/g, '');
|
|
29
|
+
const ts = Math.max(0, Math.floor(now)).toString(16).padStart(12, '0').slice(-12);
|
|
30
|
+
const raw = `${ts}7${hex.slice(13, 16)}${((parseInt(hex.charAt(16), 16) & 0x3) | 0x8).toString(16)}${hex.slice(17, 32)}`;
|
|
31
|
+
return `dec_${raw.slice(0, 8)}-${raw.slice(8, 12)}-${raw.slice(12, 16)}-${raw.slice(16, 20)}-${raw.slice(20, 32)}`;
|
|
32
|
+
}
|
|
33
|
+
export class DecisionService {
|
|
34
|
+
deps;
|
|
35
|
+
constructor(deps) {
|
|
36
|
+
this.deps = deps;
|
|
37
|
+
}
|
|
38
|
+
get mode() {
|
|
39
|
+
return this.deps.mode;
|
|
40
|
+
}
|
|
41
|
+
inFlight = new Set();
|
|
42
|
+
/** Per-decision serialization: two concurrent writes on one decision never both land (codex). */
|
|
43
|
+
locks = new Map();
|
|
44
|
+
async locked(id, work) {
|
|
45
|
+
const prev = this.locks.get(id) ?? Promise.resolve();
|
|
46
|
+
const next = prev.catch(() => undefined).then(work);
|
|
47
|
+
const tail = next.catch(() => undefined);
|
|
48
|
+
this.locks.set(id, tail);
|
|
49
|
+
try {
|
|
50
|
+
return await next;
|
|
51
|
+
}
|
|
52
|
+
finally {
|
|
53
|
+
if (this.locks.get(id) === tail)
|
|
54
|
+
this.locks.delete(id);
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
/** Run host-side work off the request path (`void`), tracked so tests and shutdown can await it. */
|
|
58
|
+
track(work) {
|
|
59
|
+
const p = work.catch((err) => this.log(`[decisions] ${message(err)}`)).finally(() => this.inFlight.delete(p));
|
|
60
|
+
this.inFlight.add(p);
|
|
61
|
+
}
|
|
62
|
+
/** Resolves once every tracked host recording has settled. */
|
|
63
|
+
async idle() {
|
|
64
|
+
while (this.inFlight.size > 0)
|
|
65
|
+
await Promise.all([...this.inFlight]);
|
|
66
|
+
}
|
|
67
|
+
now() {
|
|
68
|
+
return this.deps.now?.() ?? Date.now();
|
|
69
|
+
}
|
|
70
|
+
log(msg) {
|
|
71
|
+
this.deps.log?.(msg);
|
|
72
|
+
}
|
|
73
|
+
requireHuman(actor) {
|
|
74
|
+
if (actor.kind !== 'human' || !trustAtLeast(actor, 'operator')) {
|
|
75
|
+
throw new DecisionError(403, `only a human operator can decide what is remembered (you are ${actor.kind}/${actor.trust})`);
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
requireRecord(id) {
|
|
79
|
+
const record = this.deps.ledger.record(id);
|
|
80
|
+
if (record === null)
|
|
81
|
+
throw new DecisionError(404, `decision ${id} is not in the ledger`);
|
|
82
|
+
return record;
|
|
83
|
+
}
|
|
84
|
+
viewOf(id) {
|
|
85
|
+
const view = this.deps.ledger.view(id);
|
|
86
|
+
if (view === null)
|
|
87
|
+
throw new DecisionError(404, `decision ${id} is not in the ledger`);
|
|
88
|
+
return view;
|
|
89
|
+
}
|
|
90
|
+
async fact(type, payload, key) {
|
|
91
|
+
const emit = this.deps.emit;
|
|
92
|
+
if (emit === null || emit === undefined)
|
|
93
|
+
return;
|
|
94
|
+
const f = decisionFact(type, payload, key);
|
|
95
|
+
try {
|
|
96
|
+
await emit(f.type, f.payload, f.key);
|
|
97
|
+
}
|
|
98
|
+
catch (err) {
|
|
99
|
+
this.log(`[decisions] emit ${type} failed: ${message(err)}`);
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
changed(id) {
|
|
103
|
+
const view = this.deps.ledger.view(id);
|
|
104
|
+
if (view === null || this.deps.broadcast === undefined)
|
|
105
|
+
return;
|
|
106
|
+
this.deps.broadcast({
|
|
107
|
+
type: 'decisionChanged',
|
|
108
|
+
id,
|
|
109
|
+
state: view.state,
|
|
110
|
+
...(view.rule_id !== undefined ? { rule_id: view.rule_id } : {}),
|
|
111
|
+
project_id: view.project_id,
|
|
112
|
+
});
|
|
113
|
+
}
|
|
114
|
+
outcome(o) {
|
|
115
|
+
this.deps.ledger.appendOutcome({ op: 'outcome', at: this.now(), ...o });
|
|
116
|
+
this.changed(o.id);
|
|
117
|
+
}
|
|
118
|
+
/** The in-force rules for a project (this project's and the global ones). Fail-soft: `[]` + a log. */
|
|
119
|
+
async inForce(projectId) {
|
|
120
|
+
const { adapter } = this.deps;
|
|
121
|
+
try {
|
|
122
|
+
if (adapter.projectRulesSupported() && typeof adapter.considerRules === 'function') {
|
|
123
|
+
const c = await adapter.considerRules({ projects: projectId !== null ? [projectId] : [] });
|
|
124
|
+
return c.in_force.map(toInForce);
|
|
125
|
+
}
|
|
126
|
+
const all = await adapter.listConformanceRules();
|
|
127
|
+
return all.filter((r) => r.retired !== true && r.targets?.project === undefined).map(toInForce);
|
|
128
|
+
}
|
|
129
|
+
catch (err) {
|
|
130
|
+
this.log(`[decisions] could not read the in-force rules: ${message(err)}`);
|
|
131
|
+
return [];
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
// ── Acting on a fresh record (mode `on` only) ───────────────────────────────────────────────
|
|
135
|
+
/** Act on a record's route. Never throws: a failure is a `landing_failed` outcome + a log. */
|
|
136
|
+
async act(record) {
|
|
137
|
+
if (this.deps.mode !== 'on')
|
|
138
|
+
return;
|
|
139
|
+
try {
|
|
140
|
+
switch (record.route) {
|
|
141
|
+
case 'auto':
|
|
142
|
+
// Auto needs `auth=required` NOW as well as at record time: a daemon restarted under
|
|
143
|
+
// auth=off re-drives the record as an offer, never a silent landing (codex on DC-S4a).
|
|
144
|
+
if (this.deps.authMode === 'required') {
|
|
145
|
+
await this.remember(record.id, record.origin.actor, { how: 'auto' });
|
|
146
|
+
}
|
|
147
|
+
else {
|
|
148
|
+
await this.offer(record);
|
|
149
|
+
}
|
|
150
|
+
return;
|
|
151
|
+
case 'offer':
|
|
152
|
+
case 'conflict':
|
|
153
|
+
case 'maybe-restated':
|
|
154
|
+
await this.offer(record);
|
|
155
|
+
return;
|
|
156
|
+
case 'restated':
|
|
157
|
+
this.outcome({ id: record.id, state: 'restated', by: { id: 'crew', kind: 'system' }, ...(record.rule_ref !== undefined ? { restates_rule_id: record.rule_ref } : {}) });
|
|
158
|
+
await this.fact(DECISION_RESTATED, { decision_id: record.id, rule_id: record.rule_ref ?? null }, `restated:${record.id}`);
|
|
159
|
+
return;
|
|
160
|
+
default:
|
|
161
|
+
return;
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
catch (err) {
|
|
165
|
+
const error = message(err);
|
|
166
|
+
this.log(`[decisions] ${record.route} for ${record.id} failed: ${error}`);
|
|
167
|
+
if (this.deps.ledger.view(record.id)?.state === 'recorded') {
|
|
168
|
+
this.outcome({ id: record.id, state: 'landing_failed', by: { id: 'crew', kind: 'system' }, error });
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
/** Re-drive records whose route asks for an action but which have no outcome (a restart mid-landing). */
|
|
173
|
+
async redrive() {
|
|
174
|
+
if (this.deps.mode !== 'on')
|
|
175
|
+
return 0;
|
|
176
|
+
const pending = this.deps.ledger.pending();
|
|
177
|
+
for (const record of pending)
|
|
178
|
+
await this.act(record);
|
|
179
|
+
return pending.length;
|
|
180
|
+
}
|
|
181
|
+
/** The review-queue proposal already filed for a decision (idempotent re-drive), or `null`. */
|
|
182
|
+
async proposalFor(decisionId) {
|
|
183
|
+
const listed = (await this.deps.estateTool('proposal.list', {}));
|
|
184
|
+
for (const p of listed.proposals ?? []) {
|
|
185
|
+
const payload = p.payload;
|
|
186
|
+
if (payload?.decision?.id === decisionId)
|
|
187
|
+
return { id: p.id, state: p.state ?? 'pending' };
|
|
188
|
+
}
|
|
189
|
+
return null;
|
|
190
|
+
}
|
|
191
|
+
async submitProposal(record, statement, steeringType, project) {
|
|
192
|
+
const existing = await this.proposalFor(record.id);
|
|
193
|
+
if (existing !== null)
|
|
194
|
+
return existing.id;
|
|
195
|
+
const submitted = (await this.deps.estateTool('proposal.submit', {
|
|
196
|
+
kind_type: `policy:${steeringType}`,
|
|
197
|
+
// The payload carries ONLY the decision id beside the rule text: estate proposals are writable
|
|
198
|
+
// by anyone, so crew reads words, actor and ORIGIN from its own ledger (§4.2.4).
|
|
199
|
+
payload: { rule: statement, severity: 'warn', capture: 'decision', decision: { id: record.id } },
|
|
200
|
+
facets: project !== undefined ? { project } : {},
|
|
201
|
+
}));
|
|
202
|
+
if (typeof submitted?.id !== 'string' || submitted.id === '') {
|
|
203
|
+
throw new DecisionError(502, 'proposal.submit returned no id');
|
|
204
|
+
}
|
|
205
|
+
return submitted.id;
|
|
206
|
+
}
|
|
207
|
+
/** File the decision into the review queue (the chip + its Needs You row are the same object). */
|
|
208
|
+
async offer(record) {
|
|
209
|
+
return this.locked(record.id, () => this.offerLocked(record));
|
|
210
|
+
}
|
|
211
|
+
async offerLocked(record) {
|
|
212
|
+
const current = this.viewOf(record.id);
|
|
213
|
+
if (current.proposal_id !== undefined)
|
|
214
|
+
return current.proposal_id;
|
|
215
|
+
if (record.derived.statement === null)
|
|
216
|
+
throw new DecisionError(409, `decision ${record.id} has no rule to offer`);
|
|
217
|
+
const project = record.derived.scope === 'project' && record.project_id !== null ? record.project_id : undefined;
|
|
218
|
+
const proposalId = await this.submitProposal(record, record.derived.statement, record.derived.steering_type, project);
|
|
219
|
+
this.outcome({ id: record.id, state: 'offered', by: { id: 'crew', kind: 'system' }, proposal_id: proposalId });
|
|
220
|
+
await this.fact(DECISION_OFFERED, { decision_id: record.id, proposal_id: proposalId }, `offered:${record.id}`);
|
|
221
|
+
return proposalId;
|
|
222
|
+
}
|
|
223
|
+
// ── The landing ─────────────────────────────────────────────────────────────────────────────
|
|
224
|
+
async remember(id, actor, opts) {
|
|
225
|
+
this.requireHuman(actor);
|
|
226
|
+
return this.locked(id, () => this.rememberLocked(id, actor, opts));
|
|
227
|
+
}
|
|
228
|
+
async rememberLocked(id, actor, opts) {
|
|
229
|
+
const record = this.requireRecord(id);
|
|
230
|
+
const view = this.viewOf(id);
|
|
231
|
+
if (view.state === 'remembered' && view.rule_id !== undefined && view.proposal_id !== undefined) {
|
|
232
|
+
return { rule_id: view.rule_id, proposal_id: view.proposal_id, ...(view.edits?.scope !== 'everywhere' && record.project_id !== null && record.derived.scope === 'project' ? { project: record.project_id } : {}) };
|
|
233
|
+
}
|
|
234
|
+
if (view.state !== 'recorded' && view.state !== 'offered' && view.state !== 'landing_failed') {
|
|
235
|
+
throw new DecisionError(409, `decision ${id} is ${view.state}; it cannot be remembered`);
|
|
236
|
+
}
|
|
237
|
+
if (opts.how === 'auto' && (record.route !== 'auto' || record.origin.auth_mode !== 'required' || this.deps.authMode !== 'required')) {
|
|
238
|
+
throw new DecisionError(409, `decision ${id} is not auto-eligible (route ${record.route}, auth ${record.origin.auth_mode})`);
|
|
239
|
+
}
|
|
240
|
+
const edits = opts.edits ?? {};
|
|
241
|
+
const statement = (edits.statement ?? record.derived.statement ?? '').trim();
|
|
242
|
+
if (statement === '')
|
|
243
|
+
throw new DecisionError(409, `decision ${id} has no rule to remember`);
|
|
244
|
+
const scope = edits.scope ?? record.derived.scope;
|
|
245
|
+
if (scope === 'project' && record.project_id === null) {
|
|
246
|
+
throw new DecisionError(400, `decision ${id} has no project — choose scope "everywhere" or file it in a project`);
|
|
247
|
+
}
|
|
248
|
+
const project = scope === 'project' ? (record.project_id ?? undefined) : undefined;
|
|
249
|
+
const steeringType = edits.steering_type ?? record.derived.steering_type;
|
|
250
|
+
const supersedes = record.route === 'conflict' && record.rule_ref !== undefined ? [record.rule_ref] : [];
|
|
251
|
+
let proposalId;
|
|
252
|
+
try {
|
|
253
|
+
proposalId = view.proposal_id ?? (await this.submitProposal(record, statement, steeringType, project));
|
|
254
|
+
await this.approve(proposalId);
|
|
255
|
+
}
|
|
256
|
+
catch (err) {
|
|
257
|
+
if (err instanceof DecisionError)
|
|
258
|
+
throw err;
|
|
259
|
+
throw new DecisionError(502, `the review queue (estate) refused the landing: ${message(err)}`);
|
|
260
|
+
}
|
|
261
|
+
const built = policyProposalToRule(proposalId, `policy:${steeringType}`, { rule: statement, severity: 'warn' }, project !== undefined ? { project } : {});
|
|
262
|
+
if ('error' in built)
|
|
263
|
+
throw new DecisionError(400, built.error);
|
|
264
|
+
const rule = {
|
|
265
|
+
...built.rule,
|
|
266
|
+
provenance: { ...built.rule.provenance, source_kinds: ['operator-words'] },
|
|
267
|
+
...(supersedes.length > 0 ? { supersedes } : {}),
|
|
268
|
+
};
|
|
269
|
+
const landing = await landPolicyRule({ adapter: this.deps.adapter, audit: this.deps.audit }, { rule, steeringType: built.steeringType }, actor, {
|
|
270
|
+
via: 'decision',
|
|
271
|
+
proposalId,
|
|
272
|
+
decisionId: id,
|
|
273
|
+
how: opts.how,
|
|
274
|
+
});
|
|
275
|
+
if (landing.outcome !== 'landed' || landing.ruleId === undefined) {
|
|
276
|
+
const error = landing.error ?? 'the landing failed';
|
|
277
|
+
this.outcome({ id, state: 'landing_failed', by: byOf(actor), proposal_id: proposalId, error });
|
|
278
|
+
throw new DecisionError(502, error);
|
|
279
|
+
}
|
|
280
|
+
for (const old of supersedes) {
|
|
281
|
+
try {
|
|
282
|
+
await this.deps.adapter.retireConformanceRule(old);
|
|
283
|
+
}
|
|
284
|
+
catch (err) {
|
|
285
|
+
this.log(`[decisions] retiring superseded rule ${old} failed: ${message(err)}`);
|
|
286
|
+
}
|
|
287
|
+
}
|
|
288
|
+
const editsRecorded = {
|
|
289
|
+
...(edits.statement !== undefined && edits.statement !== record.derived.statement ? { statement: edits.statement } : {}),
|
|
290
|
+
...(edits.scope !== undefined && edits.scope !== record.derived.scope ? { scope: edits.scope } : {}),
|
|
291
|
+
...(edits.steering_type !== undefined && edits.steering_type !== record.derived.steering_type ? { steering_type: edits.steering_type } : {}),
|
|
292
|
+
};
|
|
293
|
+
this.outcome({
|
|
294
|
+
id,
|
|
295
|
+
state: 'remembered',
|
|
296
|
+
how: opts.how,
|
|
297
|
+
by: byOf(actor),
|
|
298
|
+
proposal_id: proposalId,
|
|
299
|
+
rule_id: landing.ruleId,
|
|
300
|
+
...(Object.keys(editsRecorded).length > 0 ? { edits: editsRecorded } : {}),
|
|
301
|
+
});
|
|
302
|
+
const at = this.now();
|
|
303
|
+
await this.fact(DECISION_REMEMBERED, { decision_id: id, rule_id: landing.ruleId, how: opts.how, scope, project_id: project ?? null }, `remembered:${id}:${at}`);
|
|
304
|
+
return { rule_id: landing.ruleId, proposal_id: proposalId, ...(project !== undefined ? { project } : {}) };
|
|
305
|
+
}
|
|
306
|
+
async isApproved(proposalId) {
|
|
307
|
+
const listed = (await this.deps.estateTool('proposal.list', { state: 'approved' }));
|
|
308
|
+
return (listed.proposals ?? []).some((p) => p.id === proposalId);
|
|
309
|
+
}
|
|
310
|
+
/** Approve a proposal; one already approved (a re-drive after a crash) is not an error. */
|
|
311
|
+
async approve(proposalId) {
|
|
312
|
+
try {
|
|
313
|
+
await this.deps.estateTool('proposal.approve', { id: proposalId });
|
|
314
|
+
}
|
|
315
|
+
catch (err) {
|
|
316
|
+
if (await this.isApproved(proposalId))
|
|
317
|
+
return;
|
|
318
|
+
throw err;
|
|
319
|
+
}
|
|
320
|
+
}
|
|
321
|
+
async undo(id, actor) {
|
|
322
|
+
this.requireHuman(actor);
|
|
323
|
+
return this.locked(id, () => this.undoLocked(id, actor));
|
|
324
|
+
}
|
|
325
|
+
async undoLocked(id, actor) {
|
|
326
|
+
const view = this.viewOf(id);
|
|
327
|
+
if (view.state !== 'remembered' || view.rule_id === undefined) {
|
|
328
|
+
throw new DecisionError(409, `decision ${id} is ${view.state}; only a remembered decision can be undone`);
|
|
329
|
+
}
|
|
330
|
+
try {
|
|
331
|
+
await this.deps.adapter.retireConformanceRule(view.rule_id);
|
|
332
|
+
}
|
|
333
|
+
catch (err) {
|
|
334
|
+
throw new DecisionError(502, `retiring rule ${view.rule_id} failed: ${message(err)}`);
|
|
335
|
+
}
|
|
336
|
+
this.deps.audit.record('governance.rule.retired', actor, { detail: { id: view.rule_id, via: 'decision-undo', decisionId: id } });
|
|
337
|
+
this.outcome({ id, state: 'undone', by: byOf(actor), rule_id: view.rule_id, reason: 'undone' });
|
|
338
|
+
await this.fact(DECISION_UNDONE, { decision_id: id, rule_id: view.rule_id }, `undone:${id}:${this.now()}`);
|
|
339
|
+
}
|
|
340
|
+
async dismiss(id, actor, reason) {
|
|
341
|
+
this.requireHuman(actor);
|
|
342
|
+
return this.locked(id, () => this.dismissLocked(id, actor, reason));
|
|
343
|
+
}
|
|
344
|
+
async dismissLocked(id, actor, reason) {
|
|
345
|
+
const view = this.viewOf(id);
|
|
346
|
+
if (view.state === 'remembered' || view.state === 'undone' || view.state === 'widened' || view.state === 'dismissed') {
|
|
347
|
+
throw new DecisionError(409, `decision ${id} is ${view.state}; it cannot be dismissed`);
|
|
348
|
+
}
|
|
349
|
+
if (view.proposal_id !== undefined) {
|
|
350
|
+
try {
|
|
351
|
+
await this.deps.estateTool('proposal.reject', { id: view.proposal_id });
|
|
352
|
+
}
|
|
353
|
+
catch (err) {
|
|
354
|
+
// A failed landing leaves its proposal approved (estate rejects only pending ones): the
|
|
355
|
+
// decision is still dismissable — nothing landed (codex on DC-S4a).
|
|
356
|
+
const approved = view.state === 'landing_failed' && (await this.isApproved(view.proposal_id).catch(() => false));
|
|
357
|
+
if (!approved)
|
|
358
|
+
throw new DecisionError(502, `the review queue (estate) refused the dismissal: ${message(err)}`);
|
|
359
|
+
}
|
|
360
|
+
}
|
|
361
|
+
this.outcome({ id, state: 'dismissed', by: byOf(actor), reason, ...(view.proposal_id !== undefined ? { proposal_id: view.proposal_id } : {}) });
|
|
362
|
+
await this.fact(DECISION_DISMISSED, { decision_id: id, reason }, `dismissed:${id}`);
|
|
363
|
+
}
|
|
364
|
+
/** B7 "Same as your rule '…'? · Same · New rule" — resolves a `maybe-restated` decision. */
|
|
365
|
+
async same(id, actor, same) {
|
|
366
|
+
this.requireHuman(actor);
|
|
367
|
+
if (!same) {
|
|
368
|
+
const record = this.requireRecord(id);
|
|
369
|
+
if (record.route !== 'maybe-restated') {
|
|
370
|
+
throw new DecisionError(409, `decision ${id} is not waiting on "same or new" (route ${record.route})`);
|
|
371
|
+
}
|
|
372
|
+
return { rule_id: (await this.remember(id, actor, { how: 'chip' })).rule_id };
|
|
373
|
+
}
|
|
374
|
+
return this.locked(id, () => this.sameLocked(id, actor));
|
|
375
|
+
}
|
|
376
|
+
async sameLocked(id, actor) {
|
|
377
|
+
const record = this.requireRecord(id);
|
|
378
|
+
const view = this.viewOf(id);
|
|
379
|
+
if (record.route !== 'maybe-restated' || (view.state !== 'recorded' && view.state !== 'offered')) {
|
|
380
|
+
throw new DecisionError(409, `decision ${id} is not waiting on "same or new" (route ${record.route}, ${view.state})`);
|
|
381
|
+
}
|
|
382
|
+
if (view.proposal_id !== undefined) {
|
|
383
|
+
try {
|
|
384
|
+
await this.deps.estateTool('proposal.reject', { id: view.proposal_id });
|
|
385
|
+
}
|
|
386
|
+
catch (err) {
|
|
387
|
+
throw new DecisionError(502, `the review queue (estate) refused: ${message(err)}`);
|
|
388
|
+
}
|
|
389
|
+
}
|
|
390
|
+
this.outcome({ id, state: 'restated', by: byOf(actor), ...(record.rule_ref !== undefined ? { restates_rule_id: record.rule_ref } : {}) });
|
|
391
|
+
await this.fact(DECISION_RESTATED, { decision_id: id, rule_id: record.rule_ref ?? null }, `restated:${id}`);
|
|
392
|
+
return record.rule_ref !== undefined ? { rule_id: record.rule_ref } : {};
|
|
393
|
+
}
|
|
394
|
+
/** B8: one project-less successor that supersedes the same rule in every project. */
|
|
395
|
+
async widen(id, actor) {
|
|
396
|
+
this.requireHuman(actor);
|
|
397
|
+
const record = this.requireRecord(id);
|
|
398
|
+
if (record.derived.key === null)
|
|
399
|
+
throw new DecisionError(409, `decision ${id} has no rule to widen`);
|
|
400
|
+
const remembered = this.deps.ledger.rememberedWithKey(record.derived.key);
|
|
401
|
+
const projects = [...new Set(remembered.map((r) => r.record.project_id).filter((p) => p !== null))];
|
|
402
|
+
if (projects.length < 2) {
|
|
403
|
+
throw new DecisionError(409, `decision ${id} is remembered in ${projects.length} project(s); widening needs 2`);
|
|
404
|
+
}
|
|
405
|
+
const supersedes = [...new Set(remembered.map((r) => r.rule_id))].sort();
|
|
406
|
+
// The EFFECTIVE rule the operator remembered (an edit at Remember wins over the derivation).
|
|
407
|
+
const clicked = this.viewOf(id);
|
|
408
|
+
const statement = clicked.edits?.statement ?? record.derived.statement ?? '';
|
|
409
|
+
const steeringType = clicked.edits?.steering_type ?? record.derived.steering_type;
|
|
410
|
+
let proposalId;
|
|
411
|
+
try {
|
|
412
|
+
const submitted = (await this.deps.estateTool('proposal.submit', {
|
|
413
|
+
kind_type: `policy:${steeringType}`,
|
|
414
|
+
payload: { rule: statement, severity: 'warn', capture: 'decision', decision: { id }, widens: supersedes.length },
|
|
415
|
+
facets: {},
|
|
416
|
+
}));
|
|
417
|
+
if (typeof submitted?.id !== 'string' || submitted.id === '')
|
|
418
|
+
throw new Error('proposal.submit returned no id');
|
|
419
|
+
proposalId = submitted.id;
|
|
420
|
+
await this.approve(proposalId);
|
|
421
|
+
}
|
|
422
|
+
catch (err) {
|
|
423
|
+
throw new DecisionError(502, `the review queue (estate) refused the widening: ${message(err)}`);
|
|
424
|
+
}
|
|
425
|
+
const built = policyProposalToRule(proposalId, `policy:${steeringType}`, { rule: statement, severity: 'warn' }, {});
|
|
426
|
+
if ('error' in built)
|
|
427
|
+
throw new DecisionError(400, built.error);
|
|
428
|
+
const rule = {
|
|
429
|
+
...built.rule,
|
|
430
|
+
provenance: { ...built.rule.provenance, source_kinds: ['operator-words'] },
|
|
431
|
+
supersedes,
|
|
432
|
+
};
|
|
433
|
+
const landing = await landPolicyRule({ adapter: this.deps.adapter, audit: this.deps.audit }, { rule, steeringType: built.steeringType }, actor, {
|
|
434
|
+
via: 'decision-widen',
|
|
435
|
+
proposalId,
|
|
436
|
+
decisionId: id,
|
|
437
|
+
});
|
|
438
|
+
if (landing.outcome !== 'landed' || landing.ruleId === undefined) {
|
|
439
|
+
throw new DecisionError(502, landing.error ?? 'the widening failed to land');
|
|
440
|
+
}
|
|
441
|
+
for (const old of supersedes) {
|
|
442
|
+
try {
|
|
443
|
+
await this.deps.adapter.retireConformanceRule(old);
|
|
444
|
+
}
|
|
445
|
+
catch (err) {
|
|
446
|
+
this.log(`[decisions] retiring superseded rule ${old} failed: ${message(err)}`);
|
|
447
|
+
}
|
|
448
|
+
}
|
|
449
|
+
for (const r of remembered) {
|
|
450
|
+
this.outcome({ id: r.record.id, state: 'widened', by: byOf(actor), rule_id: landing.ruleId, proposal_id: proposalId });
|
|
451
|
+
}
|
|
452
|
+
await this.fact(DECISION_WIDENED, { decision_id: id, rule_id: landing.ruleId, superseded_count: supersedes.length }, `widened:${id}:${this.now()}`);
|
|
453
|
+
return { rule_id: landing.ruleId };
|
|
454
|
+
}
|
|
455
|
+
}
|
|
456
|
+
function byOf(actor) {
|
|
457
|
+
return { id: actor.id, kind: actor.kind === 'human' ? 'human' : 'system' };
|
|
458
|
+
}
|
|
459
|
+
function toInForce(rule) {
|
|
460
|
+
return {
|
|
461
|
+
id: rule.id,
|
|
462
|
+
statement: rule.statement,
|
|
463
|
+
...(rule.targets?.project !== undefined ? { project: rule.targets.project } : {}),
|
|
464
|
+
};
|
|
465
|
+
}
|
|
466
|
+
//# sourceMappingURL=land.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"land.js","sourceRoot":"","sources":["../../src/decisions/land.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The decision ledger AT REST (DES-decision-capture §4.2.1, DC-S4a).
|
|
3
|
+
*
|
|
4
|
+
* One append-only JSONL file per project at `<state home>/decisions/<projectId|_unscoped>.jsonl`:
|
|
5
|
+
* the directory 0700, each file 0600 — the posture of the chat transcripts (`chat-transcripts.ts`).
|
|
6
|
+
* The words live HERE and nowhere else crew writes (never the bus, logs or `/diagnostics`).
|
|
7
|
+
* Registered in `tests/fixtures/state-home-subtrees.json` as `decisions` (crew half) — the core half,
|
|
8
|
+
* the worker Read fence, shipped with wicked-core-ts 0.7.35 — so a worker cannot read the operator's
|
|
9
|
+
* words through the file system.
|
|
10
|
+
*
|
|
11
|
+
* Reads fold `record` + `outcome` lines into a {@link DecisionView}; the in-memory index is built
|
|
12
|
+
* once at first use and kept current by `append`.
|
|
13
|
+
*/
|
|
14
|
+
import type { DecisionOutcome, DecisionRecord, DecisionView } from './types.js';
|
|
15
|
+
/** The state-home entry (`<state home>/decisions/`) — the name the fixture registers. */
|
|
16
|
+
export declare const DECISIONS_DIRNAME = "decisions";
|
|
17
|
+
export declare function defaultDecisionsDir(): string;
|
|
18
|
+
export interface DecisionFilter {
|
|
19
|
+
project?: string;
|
|
20
|
+
chat?: string;
|
|
21
|
+
run?: string;
|
|
22
|
+
state?: DecisionView['state'];
|
|
23
|
+
since?: number;
|
|
24
|
+
}
|
|
25
|
+
export declare class DecisionLedger {
|
|
26
|
+
private readonly dir;
|
|
27
|
+
private loaded;
|
|
28
|
+
private readonly byId;
|
|
29
|
+
/** decision key → ids, in record order (recurrence + widen). */
|
|
30
|
+
private readonly byKey;
|
|
31
|
+
/** estate proposal id → decision id (B12: answering either one resolves both). */
|
|
32
|
+
private readonly byProposal;
|
|
33
|
+
constructor(dir?: string);
|
|
34
|
+
private fileFor;
|
|
35
|
+
private load;
|
|
36
|
+
private index;
|
|
37
|
+
private write;
|
|
38
|
+
appendRecord(record: DecisionRecord): void;
|
|
39
|
+
appendOutcome(outcome: DecisionOutcome): void;
|
|
40
|
+
record(id: string): DecisionRecord | null;
|
|
41
|
+
outcomes(id: string): DecisionOutcome[];
|
|
42
|
+
/** The decision a review-queue proposal was filed for, or `null` (an ordinary proposal). */
|
|
43
|
+
decisionForProposal(proposalId: string): string | null;
|
|
44
|
+
/** Prior records with this key: how often, since when, and in which projects. */
|
|
45
|
+
recurrence(key: string): {
|
|
46
|
+
count: number;
|
|
47
|
+
first_at: number;
|
|
48
|
+
projects: string[];
|
|
49
|
+
} | null;
|
|
50
|
+
/** Remembered, not undone decisions with this key, newest outcome last. */
|
|
51
|
+
rememberedWithKey(key: string): Array<{
|
|
52
|
+
record: DecisionRecord;
|
|
53
|
+
rule_id: string;
|
|
54
|
+
}>;
|
|
55
|
+
/** Records whose route asks for an action but carry no outcome yet (the restart re-drive). */
|
|
56
|
+
pending(): DecisionRecord[];
|
|
57
|
+
view(id: string): DecisionView | null;
|
|
58
|
+
list(filter?: DecisionFilter): DecisionView[];
|
|
59
|
+
}
|
|
60
|
+
//# sourceMappingURL=ledger.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ledger.d.ts","sourceRoot":"","sources":["../../src/decisions/ledger.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAMH,OAAO,KAAK,EAAgB,eAAe,EAAE,cAAc,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAE9F,yFAAyF;AACzF,eAAO,MAAM,iBAAiB,cAAc,CAAC;AAK7C,wBAAgB,mBAAmB,IAAI,MAAM,CAE5C;AAED,MAAM,WAAW,cAAc;IAC7B,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,KAAK,CAAC,EAAE,YAAY,CAAC,OAAO,CAAC,CAAC;IAC9B,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAOD,qBAAa,cAAc;IACzB,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAS;IAC7B,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,QAAQ,CAAC,IAAI,CAA6B;IAClD,gEAAgE;IAChE,OAAO,CAAC,QAAQ,CAAC,KAAK,CAA+B;IACrD,kFAAkF;IAClF,OAAO,CAAC,QAAQ,CAAC,UAAU,CAA6B;gBAE5C,GAAG,GAAE,MAA8B;IAI/C,OAAO,CAAC,OAAO;IAKf,OAAO,CAAC,IAAI;IAsBZ,OAAO,CAAC,KAAK;IAiBb,OAAO,CAAC,KAAK;IAQb,YAAY,CAAC,MAAM,EAAE,cAAc,GAAG,IAAI;IAM1C,aAAa,CAAC,OAAO,EAAE,eAAe,GAAG,IAAI;IAQ7C,MAAM,CAAC,EAAE,EAAE,MAAM,GAAG,cAAc,GAAG,IAAI;IAKzC,QAAQ,CAAC,EAAE,EAAE,MAAM,GAAG,eAAe,EAAE;IAKvC,4FAA4F;IAC5F,mBAAmB,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI;IAKtD,iFAAiF;IACjF,UAAU,CAAC,GAAG,EAAE,MAAM,GAAG;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,EAAE,CAAA;KAAE,GAAG,IAAI;IASvF,2EAA2E;IAC3E,iBAAiB,CAAC,GAAG,EAAE,MAAM,GAAG,KAAK,CAAC;QAAE,MAAM,EAAE,cAAc,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC;IAYlF,8FAA8F;IAC9F,OAAO,IAAI,cAAc,EAAE;IAO3B,IAAI,CAAC,EAAE,EAAE,MAAM,GAAG,YAAY,GAAG,IAAI;IAOrC,IAAI,CAAC,MAAM,GAAE,cAAmB,GAAG,YAAY,EAAE;CAelD"}
|