wicked-crew 0.5.0 → 0.7.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/dist/api/audit.d.ts +70 -0
- package/dist/api/audit.d.ts.map +1 -0
- package/dist/api/audit.js +131 -0
- package/dist/api/audit.js.map +1 -0
- package/dist/api/auth.d.ts +192 -0
- package/dist/api/auth.d.ts.map +1 -0
- package/dist/api/auth.js +515 -0
- package/dist/api/auth.js.map +1 -0
- package/dist/api/gate-cache.d.ts +8 -0
- package/dist/api/gate-cache.d.ts.map +1 -1
- package/dist/api/gate-cache.js +10 -0
- package/dist/api/gate-cache.js.map +1 -1
- package/dist/api/guidance-index.d.ts +39 -0
- package/dist/api/guidance-index.d.ts.map +1 -0
- package/dist/api/guidance-index.js +67 -0
- package/dist/api/guidance-index.js.map +1 -0
- package/dist/api/open-path.d.ts +34 -0
- package/dist/api/open-path.d.ts.map +1 -0
- package/dist/api/open-path.js +101 -0
- package/dist/api/open-path.js.map +1 -0
- package/dist/api/retry-index.d.ts +30 -0
- package/dist/api/retry-index.d.ts.map +1 -0
- package/dist/api/retry-index.js +45 -0
- package/dist/api/retry-index.js.map +1 -0
- package/dist/api/routes.d.ts +164 -1
- package/dist/api/routes.d.ts.map +1 -1
- package/dist/api/routes.js +769 -21
- package/dist/api/routes.js.map +1 -1
- package/dist/api/run-files.d.ts +63 -0
- package/dist/api/run-files.d.ts.map +1 -0
- package/dist/api/run-files.js +271 -0
- package/dist/api/run-files.js.map +1 -0
- package/dist/api/seat-health.d.ts +55 -0
- package/dist/api/seat-health.d.ts.map +1 -0
- package/dist/api/seat-health.js +273 -0
- package/dist/api/seat-health.js.map +1 -0
- package/dist/api/seat-signin.d.ts +27 -0
- package/dist/api/seat-signin.d.ts.map +1 -0
- package/dist/api/seat-signin.js +143 -0
- package/dist/api/seat-signin.js.map +1 -0
- package/dist/api/server.d.ts +190 -3
- package/dist/api/server.d.ts.map +1 -1
- package/dist/api/server.js +365 -11
- package/dist/api/server.js.map +1 -1
- package/dist/api/stall-watchdog.d.ts +62 -0
- package/dist/api/stall-watchdog.d.ts.map +1 -0
- package/dist/api/stall-watchdog.js +138 -0
- package/dist/api/stall-watchdog.js.map +1 -0
- package/dist/cli/index.js +171 -12
- package/dist/cli/index.js.map +1 -1
- package/dist/cli/mcp.d.ts +14 -0
- package/dist/cli/mcp.d.ts.map +1 -0
- package/dist/cli/mcp.js +119 -0
- package/dist/cli/mcp.js.map +1 -0
- package/dist/core/adapter.d.ts +87 -10
- package/dist/core/adapter.d.ts.map +1 -1
- package/dist/core/adapter.js +347 -28
- package/dist/core/adapter.js.map +1 -1
- package/dist/core/bridge-reaper.d.ts +134 -0
- package/dist/core/bridge-reaper.d.ts.map +1 -0
- package/dist/core/bridge-reaper.js +286 -0
- package/dist/core/bridge-reaper.js.map +1 -0
- package/dist/core/deliver.d.ts +118 -0
- package/dist/core/deliver.d.ts.map +1 -0
- package/dist/core/deliver.js +241 -0
- package/dist/core/deliver.js.map +1 -0
- package/dist/core/deliverable-floor.d.ts +103 -0
- package/dist/core/deliverable-floor.d.ts.map +1 -0
- package/dist/core/deliverable-floor.js +173 -0
- package/dist/core/deliverable-floor.js.map +1 -0
- package/dist/core/exec.d.ts +2 -0
- package/dist/core/exec.d.ts.map +1 -1
- package/dist/core/exec.js.map +1 -1
- package/dist/core/types.d.ts +92 -352
- package/dist/core/types.d.ts.map +1 -1
- package/dist/core/types.js +14 -4
- package/dist/core/types.js.map +1 -1
- package/dist/interactive/bridge-pool.d.ts +99 -0
- package/dist/interactive/bridge-pool.d.ts.map +1 -0
- package/dist/interactive/bridge-pool.js +244 -0
- package/dist/interactive/bridge-pool.js.map +1 -0
- package/dist/interactive/bridge-root.d.ts +36 -0
- package/dist/interactive/bridge-root.d.ts.map +1 -0
- package/dist/interactive/bridge-root.js +48 -0
- package/dist/interactive/bridge-root.js.map +1 -0
- package/dist/interactive/chat-events.d.ts +207 -0
- package/dist/interactive/chat-events.d.ts.map +1 -0
- package/dist/interactive/chat-events.js +769 -0
- package/dist/interactive/chat-events.js.map +1 -0
- package/dist/interactive/demo-events.d.ts +283 -0
- package/dist/interactive/demo-events.d.ts.map +1 -0
- package/dist/interactive/demo-events.js +889 -0
- package/dist/interactive/demo-events.js.map +1 -0
- package/dist/interactive/draft-events.d.ts +224 -0
- package/dist/interactive/draft-events.d.ts.map +1 -0
- package/dist/interactive/draft-events.js +793 -0
- package/dist/interactive/draft-events.js.map +1 -0
- package/dist/interactive/edit-events.d.ts +194 -0
- package/dist/interactive/edit-events.d.ts.map +1 -0
- package/dist/interactive/edit-events.js +601 -0
- package/dist/interactive/edit-events.js.map +1 -0
- package/dist/interactive/ledger.d.ts +39 -0
- package/dist/interactive/ledger.d.ts.map +1 -0
- package/dist/interactive/ledger.js +93 -0
- package/dist/interactive/ledger.js.map +1 -0
- package/dist/interactive/proxy-routes.d.ts +39 -0
- package/dist/interactive/proxy-routes.d.ts.map +1 -0
- package/dist/interactive/proxy-routes.js +189 -0
- package/dist/interactive/proxy-routes.js.map +1 -0
- package/dist/interactive/repo-snapshot.d.ts +100 -0
- package/dist/interactive/repo-snapshot.d.ts.map +1 -0
- package/dist/interactive/repo-snapshot.js +289 -0
- package/dist/interactive/repo-snapshot.js.map +1 -0
- package/dist/interactive/ws-relay.d.ts +85 -0
- package/dist/interactive/ws-relay.d.ts.map +1 -0
- package/dist/interactive/ws-relay.js +191 -0
- package/dist/interactive/ws-relay.js.map +1 -0
- package/dist/projects/activity.d.ts +29 -0
- package/dist/projects/activity.d.ts.map +1 -0
- package/dist/projects/activity.js +172 -0
- package/dist/projects/activity.js.map +1 -0
- package/dist/projects/charter.d.ts +28 -0
- package/dist/projects/charter.d.ts.map +1 -0
- package/dist/projects/charter.js +53 -0
- package/dist/projects/charter.js.map +1 -0
- package/dist/projects/events.d.ts +55 -0
- package/dist/projects/events.d.ts.map +1 -0
- package/dist/projects/events.js +141 -0
- package/dist/projects/events.js.map +1 -0
- package/dist/projects/graph-paths.d.ts +92 -0
- package/dist/projects/graph-paths.d.ts.map +1 -0
- package/dist/projects/graph-paths.js +130 -0
- package/dist/projects/graph-paths.js.map +1 -0
- package/dist/projects/graph.d.ts +179 -0
- package/dist/projects/graph.d.ts.map +1 -0
- package/dist/projects/graph.js +775 -0
- package/dist/projects/graph.js.map +1 -0
- package/dist/projects/membership-index.d.ts +25 -0
- package/dist/projects/membership-index.d.ts.map +1 -0
- package/dist/projects/membership-index.js +46 -0
- package/dist/projects/membership-index.js.map +1 -0
- package/dist/projects/routes.d.ts +97 -0
- package/dist/projects/routes.d.ts.map +1 -0
- package/dist/projects/routes.js +510 -0
- package/dist/projects/routes.js.map +1 -0
- package/dist/projects/settings.d.ts +32 -0
- package/dist/projects/settings.d.ts.map +1 -0
- package/dist/projects/settings.js +64 -0
- package/dist/projects/settings.js.map +1 -0
- package/dist/qe/acceptance.d.ts +137 -0
- package/dist/qe/acceptance.d.ts.map +1 -0
- package/dist/qe/acceptance.js +249 -0
- package/dist/qe/acceptance.js.map +1 -0
- package/dist/qe/gate-events.d.ts +111 -0
- package/dist/qe/gate-events.d.ts.map +1 -0
- package/dist/qe/gate-events.js +168 -0
- package/dist/qe/gate-events.js.map +1 -0
- package/dist/qe/ledger.d.ts +100 -0
- package/dist/qe/ledger.d.ts.map +1 -0
- package/dist/qe/ledger.js +154 -0
- package/dist/qe/ledger.js.map +1 -0
- package/dist/studio/assets/index-8p8uwCxG.js +530 -0
- package/dist/studio/assets/index-D6S9zUtO.css +32 -0
- package/dist/studio/index.html +5 -3
- package/package.json +10 -4
- package/dist/studio/assets/index-DaaUU8Ep.css +0 -32
- package/dist/studio/assets/index-Fu5DRC00.js +0 -423
package/dist/api/server.js
CHANGED
|
@@ -6,8 +6,28 @@ import { fileURLToPath } from 'node:url';
|
|
|
6
6
|
import { registerRoutes } from './routes.js';
|
|
7
7
|
import { GateCache } from './gate-cache.js';
|
|
8
8
|
import { ElicitationCache } from './elicitation-cache.js';
|
|
9
|
+
import { registerAuthHooks, resolveAuth } from './auth.js';
|
|
10
|
+
import { AuditLog } from './audit.js';
|
|
11
|
+
import { RetryIndex } from './retry-index.js';
|
|
12
|
+
import { GuidanceIndex } from './guidance-index.js';
|
|
9
13
|
import { registerClient, broadcast } from '../events/bus.js';
|
|
10
14
|
import { TerminalHub, registerTerminalWs } from '../events/terminals.js';
|
|
15
|
+
import { QeGateCache, startQeGateSubscriber } from '../qe/gate-events.js';
|
|
16
|
+
import { startInteractiveDraftSubscriber } from '../interactive/draft-events.js';
|
|
17
|
+
import { startInteractiveEditSubscriber } from '../interactive/edit-events.js';
|
|
18
|
+
import { startInteractiveChatSubscriber } from '../interactive/chat-events.js';
|
|
19
|
+
import { startInteractiveDemoSubscriber } from '../interactive/demo-events.js';
|
|
20
|
+
import { resolveInteractiveRoot } from '../interactive/bridge-root.js';
|
|
21
|
+
import { ProjectSettingsStore } from '../projects/settings.js';
|
|
22
|
+
import { startProjectBus, MEMBERSHIP_ATTACHED, membershipAttachedKey } from '../projects/events.js';
|
|
23
|
+
import { startInteractiveWsRelay, registerInteractiveEventRoutes } from '../interactive/ws-relay.js';
|
|
24
|
+
import { MembershipIndex } from '../projects/membership-index.js';
|
|
25
|
+
import { writeRunEvidencePointer } from '../projects/charter.js';
|
|
26
|
+
import { CoreAdapter } from '../core/adapter.js';
|
|
27
|
+
import { SeatHealthTracker, startSeatHealthProbe } from './seat-health.js';
|
|
28
|
+
import { WorkerStallWatchdog } from './stall-watchdog.js';
|
|
29
|
+
import { applyWorkerConfigRoot } from './seat-signin.js';
|
|
30
|
+
import { DEFAULT_WORKER_STALL_MINUTES } from '../core/types.js';
|
|
11
31
|
// Allow the studio (a separate localhost origin, e.g. :4200) to call the
|
|
12
32
|
// daemon's REST API. Restricted to loopback origins — the daemon only binds
|
|
13
33
|
// 127.0.0.1, so this never widens exposure beyond the local machine.
|
|
@@ -15,7 +35,9 @@ const LOOPBACK_ORIGIN = /^http:\/\/(127\.0\.0\.1|localhost):\d+$/;
|
|
|
15
35
|
/**
|
|
16
36
|
* The bundled studio SPA lives at `dist/studio` next to the compiled server
|
|
17
37
|
* (`dist/api/server.js` → `../studio`). See DES-STUDIO-SERVING-001 §2.3/§3.1
|
|
18
|
-
* and `scripts/bundle-studio.mjs
|
|
38
|
+
* and `scripts/bundle-studio.mjs`, which copies the installed `wicked-studio`
|
|
39
|
+
* package's `dist/` there (the SPA is its own product since the #98 carve —
|
|
40
|
+
* github.com/mikeparcewski/wicked-studio — consumed as a dist artifact).
|
|
19
41
|
*/
|
|
20
42
|
export function defaultStudioRoot() {
|
|
21
43
|
return fileURLToPath(new URL('../studio', import.meta.url));
|
|
@@ -25,23 +47,339 @@ export async function createServer(adapter, options) {
|
|
|
25
47
|
const gateCache = new GateCache();
|
|
26
48
|
const elicitationCache = new ElicitationCache();
|
|
27
49
|
const terminals = new TerminalHub();
|
|
50
|
+
const qeGateCache = new QeGateCache();
|
|
51
|
+
// Per-seat runtime health (crew#274): folded from the single CoreEvent subscription below,
|
|
52
|
+
// surfaced on GET /roster, recovered by the low-frequency probe armed further down.
|
|
53
|
+
const seatHealth = new SeatHealthTracker();
|
|
54
|
+
// The identity/actor seam (task #88). Resolved ONCE, before any hook exists:
|
|
55
|
+
// a malformed token file or a configured-but-unimplemented OIDC block must
|
|
56
|
+
// fail the boot here, never a request mid-flight. In the default local mode
|
|
57
|
+
// this reads no file and installs a hook that only pins the local actor.
|
|
58
|
+
const auth = resolveAuth(options?.auth, (m) => app.log.warn(m));
|
|
59
|
+
if (auth.mode === 'required') {
|
|
60
|
+
app.log.info('auth REQUIRED: bearer tokens enforced on /api/v1 and /ws');
|
|
61
|
+
}
|
|
62
|
+
const audit = new AuditLog(options?.auditPath, (m) => app.log.warn(m));
|
|
63
|
+
app.addHook('onClose', async () => {
|
|
64
|
+
await audit.flush(); // don't lose the trail's tail on shutdown
|
|
65
|
+
});
|
|
66
|
+
// Seat sign-in: export the persisted worker-config root as WICKED_WORKER_HOME at boot (the
|
|
67
|
+
// PUT /settings route re-applies it on every change). The engine reads the env PER SPAWN
|
|
68
|
+
// (acp_runner.rs claude_worker_home), so boot + on-change application is sufficient — no
|
|
69
|
+
// engine restart is ever needed. settings.json is the source of truth: unset/empty deletes
|
|
70
|
+
// the env, restoring the engine default ~/.wicked-worker.
|
|
71
|
+
applyWorkerConfigRoot((await adapter.getSettings()).worker_config_root);
|
|
72
|
+
// The project seam (DES-PROJECT-001): the bus handle for post-commit event emission + the
|
|
73
|
+
// /ws activity bridge, and the run→project index that tags outbound frames (§5.2). Hydrated
|
|
74
|
+
// from the engine so a restarted daemon tags correctly from the first frame. Created BEFORE
|
|
75
|
+
// the interactive seams below: their project-bound launches share the launch route's
|
|
76
|
+
// post-commit half (index tag + membership.attached emit) via `fileRun`.
|
|
77
|
+
const membershipIndex = new MembershipIndex();
|
|
78
|
+
await membershipIndex.hydrate(adapter, (m) => app.log.warn(m));
|
|
79
|
+
// Per-project crew-side settings (DES-MERGE-001 §7.1's `interactiveRoot`). ONE instance,
|
|
80
|
+
// created here so the chat seam's docs-root resolution below and the routes (project PATCH +
|
|
81
|
+
// interactive proxy) all read/write the same store — two instances over one file would let a
|
|
82
|
+
// PATCH land in one while the other keeps serving the stale root.
|
|
83
|
+
const projectSettings = new ProjectSettingsStore();
|
|
84
|
+
// Retry lineage (CREW-UX-3): hydrated from the audit trail — the durable record the launch
|
|
85
|
+
// route writes — so a restarted daemon still echoes `retry_of` on prior runs' DTOs.
|
|
86
|
+
const retryIndex = new RetryIndex();
|
|
87
|
+
await retryIndex.hydrate(audit, (m) => app.log.warn(m));
|
|
88
|
+
// Operator guidance (CREW-UX-7, DES-UX-002 §7.2): same durable pattern — hydrated from the
|
|
89
|
+
// trail's `guidance.set` entries so notes survive a daemon restart.
|
|
90
|
+
const guidanceIndex = new GuidanceIndex();
|
|
91
|
+
await guidanceIndex.hydrate(audit, (m) => app.log.warn(m));
|
|
92
|
+
const projectBus = options?.projectEvents?.disabled === true
|
|
93
|
+
? null
|
|
94
|
+
: await startProjectBus({
|
|
95
|
+
...(options?.projectEvents?.dbPath !== undefined
|
|
96
|
+
? { dbPath: options.projectEvents.dbPath }
|
|
97
|
+
: {}),
|
|
98
|
+
...(options?.projectEvents?.pollIntervalMs !== undefined
|
|
99
|
+
? { pollIntervalMs: options.projectEvents.pollIntervalMs }
|
|
100
|
+
: {}),
|
|
101
|
+
log: (m) => app.log.warn(m),
|
|
102
|
+
});
|
|
103
|
+
if (projectBus !== null) {
|
|
104
|
+
app.log.info('project bus seam armed (wicked.crew.project.* + /ws activity bridge)');
|
|
105
|
+
app.addHook('onClose', async () => {
|
|
106
|
+
await projectBus.stop();
|
|
107
|
+
});
|
|
108
|
+
}
|
|
109
|
+
// The interactive relay seam (DES-MERGE-001 §5.4/§6.1, slice 3): every wicked.interactive.**
|
|
110
|
+
// bus event becomes an `interactiveEvent` frame on the SAME /ws socket the studio already
|
|
111
|
+
// holds, and POST /projects/:id/interactive-events puts a whitelisted UI event back on the bus.
|
|
112
|
+
// Default ON — the merged skin needs it to render a generating doc — with the seam's usual
|
|
113
|
+
// posture: a machine without wicked-bus gets a logged null and boots anyway.
|
|
114
|
+
const interactiveRelay = options?.interactiveWsRelay?.disabled === true
|
|
115
|
+
? null
|
|
116
|
+
: await startInteractiveWsRelay({
|
|
117
|
+
...(options?.interactiveWsRelay?.dbPath !== undefined
|
|
118
|
+
? { dbPath: options.interactiveWsRelay.dbPath }
|
|
119
|
+
: {}),
|
|
120
|
+
...(options?.interactiveWsRelay?.pollIntervalMs !== undefined
|
|
121
|
+
? { pollIntervalMs: options.interactiveWsRelay.pollIntervalMs }
|
|
122
|
+
: {}),
|
|
123
|
+
log: (m) => app.log.warn(m),
|
|
124
|
+
});
|
|
125
|
+
if (interactiveRelay !== null) {
|
|
126
|
+
app.log.info('interactive /ws relay armed (filter wicked.interactive.** → interactiveEvent)');
|
|
127
|
+
app.addHook('onClose', async () => {
|
|
128
|
+
await interactiveRelay.stop();
|
|
129
|
+
});
|
|
130
|
+
}
|
|
131
|
+
/** The post-commit half of a project-FILED launch, shared with the launch route (§2.2/§4):
|
|
132
|
+
* the engine already attached the crew.run membership atomically with the launch — here we
|
|
133
|
+
* tag future /ws frames and announce the attach on the project bus. */
|
|
134
|
+
const fileRun = (runId, projectId) => {
|
|
135
|
+
membershipIndex.set(runId, projectId);
|
|
136
|
+
projectBus?.emit(MEMBERSHIP_ATTACHED,
|
|
137
|
+
// A daemon-internal launcher (the interactive-edit/draft subscribers),
|
|
138
|
+
// not an HTTP caller — the id is set server-side, so it stays honest
|
|
139
|
+
// under the task #88 rule that event actors are never caller-supplied.
|
|
140
|
+
{ project_id: projectId, member: { kind: 'crew.run', ref: runId }, actor: 'interactive' }, membershipAttachedKey(projectId, 'crew.run', runId, Date.now()));
|
|
141
|
+
};
|
|
142
|
+
/** The docs root a project's interactive docs live under — the SAME per-project settings
|
|
143
|
+
* resolution the project routes, the interactive proxy, and the chat seam share
|
|
144
|
+
* (DES-MERGE-001 §7.1/§7.2). Shared by the edit seam (demo-kind gate, CREW-UX-9) and the
|
|
145
|
+
* demo seam (spec install + manifest reads). */
|
|
146
|
+
const interactiveDocsRoot = (projectId) => resolveInteractiveRoot(projectId !== undefined ? projectSettings.get(projectId) : null);
|
|
147
|
+
// Arm the opt-in QE gate-event subscription (crew's bus seam). Failure to
|
|
148
|
+
// arm is LOUD but non-fatal: the acceptance route never depends on the bus.
|
|
149
|
+
if (options?.qeGateEvents?.enabled === true) {
|
|
150
|
+
const { dbPath, pollIntervalMs } = options.qeGateEvents;
|
|
151
|
+
const sub = await startQeGateSubscriber(qeGateCache, {
|
|
152
|
+
...(dbPath !== undefined ? { dbPath } : {}),
|
|
153
|
+
...(pollIntervalMs !== undefined ? { pollIntervalMs } : {}),
|
|
154
|
+
log: (m) => app.log.warn(m),
|
|
155
|
+
});
|
|
156
|
+
if (sub !== null) {
|
|
157
|
+
app.log.info(`qe gate-event subscription armed (filter wicked.qe.**)`);
|
|
158
|
+
app.addHook('onClose', async () => {
|
|
159
|
+
await sub.stop();
|
|
160
|
+
});
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
// Arm the opt-in interactive-draft answering seam (task #86 spike). Same posture as the QE
|
|
164
|
+
// seam: failure to arm is LOUD but non-fatal — interactive's assist loop is the fallback
|
|
165
|
+
// answerer, and this daemon must boot on a machine whose bus is broken. The handle is kept:
|
|
166
|
+
// the chat seam below consults its in-flight docs (CREW-UX-5 per-doc serialization).
|
|
167
|
+
let draftSub = null;
|
|
168
|
+
if (options?.interactiveDraftEvents?.enabled === true) {
|
|
169
|
+
const o = options.interactiveDraftEvents;
|
|
170
|
+
draftSub = await startInteractiveDraftSubscriber(adapter, {
|
|
171
|
+
...(o.dbPath !== undefined ? { dbPath: o.dbPath } : {}),
|
|
172
|
+
...(o.pollIntervalMs !== undefined ? { pollIntervalMs: o.pollIntervalMs } : {}),
|
|
173
|
+
...(o.heartbeatMs !== undefined ? { heartbeatMs: o.heartbeatMs } : {}),
|
|
174
|
+
...(o.ledgerPath !== undefined ? { ledgerPath: o.ledgerPath } : {}),
|
|
175
|
+
...(o.draftDir !== undefined ? { draftDir: o.draftDir } : {}),
|
|
176
|
+
...(o.clisJson !== undefined ? { clisJson: o.clisJson } : {}),
|
|
177
|
+
onRunFiled: fileRun,
|
|
178
|
+
log: (m) => app.log.warn(m),
|
|
179
|
+
});
|
|
180
|
+
if (draftSub !== null) {
|
|
181
|
+
const sub = draftSub;
|
|
182
|
+
app.log.info('interactive-draft subscription armed (filter wicked.interactive.doc.created)');
|
|
183
|
+
app.addHook('onClose', async () => {
|
|
184
|
+
await sub.stop();
|
|
185
|
+
});
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
// Declared BEFORE the edit seam it is probed by: the demo seam arms after (it must, so the
|
|
189
|
+
// per-doc serialization contract can see the edit seam's in-flight set), but the edit seam's
|
|
190
|
+
// demo-kind gate needs to know at EVENT time whether the demo seam actually came up. A
|
|
191
|
+
// closure over this binding reads the settled value; a boolean captured here would not.
|
|
192
|
+
let demoSub = null;
|
|
193
|
+
// Arm the opt-in interactive STRUCTURAL-edit answering seam (task #86 final leg). Same
|
|
194
|
+
// posture as the draft seam: failure to arm is LOUD but non-fatal — interactive's assist
|
|
195
|
+
// loop is the fallback answerer, and this daemon must boot on a machine whose bus is broken.
|
|
196
|
+
let editSub = null;
|
|
197
|
+
if (options?.interactiveEditEvents?.enabled === true) {
|
|
198
|
+
const o = options.interactiveEditEvents;
|
|
199
|
+
editSub = await startInteractiveEditSubscriber(adapter, {
|
|
200
|
+
...(o.dbPath !== undefined ? { dbPath: o.dbPath } : {}),
|
|
201
|
+
...(o.pollIntervalMs !== undefined ? { pollIntervalMs: o.pollIntervalMs } : {}),
|
|
202
|
+
...(o.heartbeatMs !== undefined ? { heartbeatMs: o.heartbeatMs } : {}),
|
|
203
|
+
...(o.ledgerPath !== undefined ? { ledgerPath: o.ledgerPath } : {}),
|
|
204
|
+
...(o.editDir !== undefined ? { editDir: o.editDir } : {}),
|
|
205
|
+
...(o.clisJson !== undefined ? { clisJson: o.clisJson } : {}),
|
|
206
|
+
// The demo-kind gate (CREW-UX-9): a demo doc's step feedback is the demo seam's — but
|
|
207
|
+
// only when that seam is actually up. Probed per event (the demo seam arms below), so an
|
|
208
|
+
// un-armed demo seam gets an honest error status instead of a silent, unanswerable drop.
|
|
209
|
+
resolveDocsRoot: o.resolveDocsRoot ?? interactiveDocsRoot,
|
|
210
|
+
demoSeamArmed: () => demoSub !== null,
|
|
211
|
+
onRunFiled: fileRun,
|
|
212
|
+
log: (m) => app.log.warn(m),
|
|
213
|
+
});
|
|
214
|
+
if (editSub !== null) {
|
|
215
|
+
const sub = editSub;
|
|
216
|
+
app.log.info('interactive-edit subscription armed (filter wicked.interactive.feedback.processed)');
|
|
217
|
+
app.addHook('onClose', async () => {
|
|
218
|
+
await sub.stop();
|
|
219
|
+
});
|
|
220
|
+
}
|
|
221
|
+
}
|
|
222
|
+
// Arm the opt-in interactive DEMO answering seam (CREW-UX-9 — the retired assist agent's
|
|
223
|
+
// Step 8). Same posture as the sibling seams: failure to arm is LOUD but non-fatal — a demo
|
|
224
|
+
// doc then keeps its placeholder, and this daemon must boot on a machine whose bus is
|
|
225
|
+
// broken. Armed beside the edit seam because the two split `feedback.processed` by the doc
|
|
226
|
+
// manifest's kind (demo → re-author the spec here; everything else → structural edit there).
|
|
227
|
+
if (options?.interactiveDemoEvents?.enabled === true) {
|
|
228
|
+
const o = options.interactiveDemoEvents;
|
|
229
|
+
demoSub = await startInteractiveDemoSubscriber(adapter, {
|
|
230
|
+
...(o.dbPath !== undefined ? { dbPath: o.dbPath } : {}),
|
|
231
|
+
...(o.pollIntervalMs !== undefined ? { pollIntervalMs: o.pollIntervalMs } : {}),
|
|
232
|
+
...(o.heartbeatMs !== undefined ? { heartbeatMs: o.heartbeatMs } : {}),
|
|
233
|
+
...(o.ledgerPath !== undefined ? { ledgerPath: o.ledgerPath } : {}),
|
|
234
|
+
...(o.demoDir !== undefined ? { demoDir: o.demoDir } : {}),
|
|
235
|
+
...(o.clisJson !== undefined ? { clisJson: o.clisJson } : {}),
|
|
236
|
+
resolveDocsRoot: o.resolveDocsRoot ?? interactiveDocsRoot,
|
|
237
|
+
onRunFiled: fileRun,
|
|
238
|
+
log: (m) => app.log.warn(m),
|
|
239
|
+
});
|
|
240
|
+
if (demoSub !== null) {
|
|
241
|
+
const sub = demoSub;
|
|
242
|
+
app.log.info('interactive-demo subscription armed (filters wicked.interactive.doc.created + feedback.processed, kind:demo)');
|
|
243
|
+
app.addHook('onClose', async () => {
|
|
244
|
+
await sub.stop();
|
|
245
|
+
});
|
|
246
|
+
}
|
|
247
|
+
}
|
|
248
|
+
// Arm the opt-in interactive CHAT answering seam (CREW-UX-5 — the iteration ask). Same
|
|
249
|
+
// posture again: failure to arm is LOUD but non-fatal. Armed AFTER the sibling seams so the
|
|
250
|
+
// per-doc serialization contract (no draft/edit/chat run races another on one doc) can
|
|
251
|
+
// consult their in-flight sets; docs roots resolve through the SAME per-project settings
|
|
252
|
+
// store the project routes and the interactive proxy share.
|
|
253
|
+
if (options?.interactiveChatEvents?.enabled === true) {
|
|
254
|
+
const o = options.interactiveChatEvents;
|
|
255
|
+
const sub = await startInteractiveChatSubscriber(adapter, {
|
|
256
|
+
...(o.dbPath !== undefined ? { dbPath: o.dbPath } : {}),
|
|
257
|
+
...(o.pollIntervalMs !== undefined ? { pollIntervalMs: o.pollIntervalMs } : {}),
|
|
258
|
+
...(o.heartbeatMs !== undefined ? { heartbeatMs: o.heartbeatMs } : {}),
|
|
259
|
+
...(o.ledgerPath !== undefined ? { ledgerPath: o.ledgerPath } : {}),
|
|
260
|
+
...(o.chatDir !== undefined ? { chatDir: o.chatDir } : {}),
|
|
261
|
+
...(o.clisJson !== undefined ? { clisJson: o.clisJson } : {}),
|
|
262
|
+
...(o.queueSweepMs !== undefined ? { queueSweepMs: o.queueSweepMs } : {}),
|
|
263
|
+
...(o.landingGateMs !== undefined ? { landingGateMs: o.landingGateMs } : {}),
|
|
264
|
+
resolveDocsRoot: o.resolveDocsRoot ??
|
|
265
|
+
((projectId) => resolveInteractiveRoot(projectId !== undefined ? projectSettings.get(projectId) : null)),
|
|
266
|
+
isDocBusy: (documentId) => (draftSub?.inFlightDocs().includes(documentId) ?? false) ||
|
|
267
|
+
(editSub?.inFlightDocs().includes(documentId) ?? false),
|
|
268
|
+
onRunFiled: fileRun,
|
|
269
|
+
log: (m) => app.log.warn(m),
|
|
270
|
+
});
|
|
271
|
+
if (sub !== null) {
|
|
272
|
+
app.log.info('interactive-chat subscription armed (filter wicked.interactive.chat.posted)');
|
|
273
|
+
app.addHook('onClose', async () => {
|
|
274
|
+
await sub.stop();
|
|
275
|
+
});
|
|
276
|
+
}
|
|
277
|
+
}
|
|
278
|
+
// The worker stall watchdog (crew#287). Built BEFORE the single CoreEvent subscription below
|
|
279
|
+
// so every relayed frame stamps its run's liveness clock; armed (sweep interval) further down
|
|
280
|
+
// beside the seat-health probe, under the same test-runner gate. Detection only: its sole
|
|
281
|
+
// outputs are one synthetic `workerStalled` /ws frame per quiet period and a warn log.
|
|
282
|
+
const stallWatchdog = new WorkerStallWatchdog({
|
|
283
|
+
listExecuting: async () => (await adapter.sessionsDetail())
|
|
284
|
+
.filter((v) => v.session.status === 'executing')
|
|
285
|
+
.map((v) => ({ id: v.session.id, ord: v.session.unit_ix })),
|
|
286
|
+
broadcast: (frame) => broadcast(frame),
|
|
287
|
+
stallMinutes: async () => options?.stallWatchdog?.stallMinutes ??
|
|
288
|
+
(await adapter.getSettings()).workerStallMinutes ??
|
|
289
|
+
DEFAULT_WORKER_STALL_MINUTES,
|
|
290
|
+
log: (m) => app.log.warn(m),
|
|
291
|
+
});
|
|
28
292
|
// The daemon's single CoreEvent subscription fans out here: cache gate prompts
|
|
29
293
|
// (§3.3), cache elicitation prompts (DES-002), route terminal frames to their owning
|
|
30
|
-
// per-terminal socket (by id, DES-TERMINAL-001 §6), then forward every frame
|
|
31
|
-
//
|
|
32
|
-
|
|
294
|
+
// per-terminal socket (by id, DES-TERMINAL-001 §6), then forward every frame — tagged
|
|
295
|
+
// with its run's `project_id` when the membership table files it (DES-PROJECT-001
|
|
296
|
+
// §5.2; no new socket, additive field) — to all `/ws` clients (§2.1).
|
|
297
|
+
//
|
|
298
|
+
// Unregistered on close: a process can build more than one server over the same
|
|
299
|
+
// adapter (tests do), and a closed server's caches must stop consuming events —
|
|
300
|
+
// otherwise every discarded server keeps folding state forever (listener leak).
|
|
301
|
+
const stallWatchdogArmed = options?.stallWatchdog?.enabled ??
|
|
302
|
+
!(process.env['VITEST'] !== undefined || process.env['NODE_ENV'] === 'test');
|
|
303
|
+
const offEvent = adapter.onEvent((event) => {
|
|
33
304
|
gateCache.ingest(event);
|
|
34
305
|
elicitationCache.ingest(event);
|
|
306
|
+
seatHealth.ingest(event);
|
|
307
|
+
// Only feed the watchdog when its sweep is (or will be) armed: sweeping is what
|
|
308
|
+
// prunes its per-run maps, so ingesting while disabled grows without bound
|
|
309
|
+
// (Copilot on #301).
|
|
310
|
+
if (stallWatchdogArmed)
|
|
311
|
+
stallWatchdog.ingest(event);
|
|
35
312
|
terminals.route(event);
|
|
36
|
-
|
|
313
|
+
const session = typeof event.session === 'string' ? event.session : undefined;
|
|
314
|
+
const projectId = session !== undefined ? membershipIndex.projectOf(session) : undefined;
|
|
315
|
+
broadcast(projectId !== undefined ? { ...event, project_id: projectId } : event);
|
|
316
|
+
// The foundation record's evidence pointer (§3.2 row 3): a project-bound run that completes
|
|
317
|
+
// gets its run-scope pointer written, best-effort, off the hot path.
|
|
318
|
+
if (event.type === 'sessionCompleted' && session !== undefined && projectId !== undefined) {
|
|
319
|
+
void (async () => {
|
|
320
|
+
try {
|
|
321
|
+
const views = await adapter.sessionsDetail();
|
|
322
|
+
const view = views.find((v) => v.session.id === session);
|
|
323
|
+
const repoRef = view?.session.repo_ref ?? null;
|
|
324
|
+
const repoRoot = repoRef !== null
|
|
325
|
+
? ((await adapter.listRepos()).find((r) => r.id === repoRef)?.root_path ?? null)
|
|
326
|
+
: null;
|
|
327
|
+
// The STORED scope, not a derived spelling: `Project.scope` is the designed tenancy
|
|
328
|
+
// seam (ADR §3.1 — a future `org:<o>/project:<id>` prefix must not strand pointers).
|
|
329
|
+
const project = await adapter.projectGet(projectId);
|
|
330
|
+
await writeRunEvidencePointer(adapter, project?.scope ?? `project:${projectId}`, session, repoRoot, (m) => app.log.warn(m));
|
|
331
|
+
}
|
|
332
|
+
catch (err) {
|
|
333
|
+
app.log.warn(`[projects] evidence-pointer lookup for ${session} failed: ${err instanceof Error ? err.message : String(err)}`);
|
|
334
|
+
}
|
|
335
|
+
})();
|
|
336
|
+
}
|
|
37
337
|
});
|
|
338
|
+
app.addHook('onClose', async () => {
|
|
339
|
+
offEvent();
|
|
340
|
+
});
|
|
341
|
+
// The seat-health recovery probe (crew#274 §3). A plain setInterval, unref'd, torn down on
|
|
342
|
+
// close. Default ON in the daemon, OFF under a test runner — a test suite building servers
|
|
343
|
+
// must never spawn `<cli> --version` children unless it opts in with `enabled: true`.
|
|
344
|
+
const probeCfg = options?.seatHealthProbe;
|
|
345
|
+
const underTestRunner = process.env['VITEST'] !== undefined || process.env['NODE_ENV'] === 'test';
|
|
346
|
+
if (probeCfg?.enabled ?? !underTestRunner) {
|
|
347
|
+
const probe = startSeatHealthProbe(seatHealth, () => CoreAdapter.roster(), {
|
|
348
|
+
...(probeCfg?.intervalMs !== undefined ? { intervalMs: probeCfg.intervalMs } : {}),
|
|
349
|
+
...(probeCfg?.timeoutMs !== undefined ? { timeoutMs: probeCfg.timeoutMs } : {}),
|
|
350
|
+
log: (m) => app.log.warn(m),
|
|
351
|
+
});
|
|
352
|
+
app.addHook('onClose', async () => {
|
|
353
|
+
probe.stop();
|
|
354
|
+
});
|
|
355
|
+
}
|
|
356
|
+
// Arm the stall watchdog's sweep (crew#287). Same gate as the probe: ON in the daemon, OFF
|
|
357
|
+
// under a test runner unless a test opts in — a suite building servers over stub adapters
|
|
358
|
+
// must not have a background interval calling `sessionsDetail()` on them.
|
|
359
|
+
const stallCfg = options?.stallWatchdog;
|
|
360
|
+
if (stallWatchdogArmed) {
|
|
361
|
+
stallWatchdog.start(stallCfg?.sweepIntervalMs);
|
|
362
|
+
app.addHook('onClose', async () => {
|
|
363
|
+
stallWatchdog.stop();
|
|
364
|
+
});
|
|
365
|
+
}
|
|
38
366
|
app.addHook('onRequest', async (req, reply) => {
|
|
39
367
|
const origin = req.headers.origin;
|
|
40
|
-
|
|
368
|
+
// Loopback origins are always allowed (the studio on another localhost
|
|
369
|
+
// port). NON-loopback origins are allowed ONLY when auth is required — the
|
|
370
|
+
// R2 pairing: a hosted skin needs CORS, and CORS beyond the machine is
|
|
371
|
+
// safe exactly when every request must carry a bearer token (no ambient
|
|
372
|
+
// credential exists for a foreign page to ride). An explicit allowlist
|
|
373
|
+
// (`allowedOrigins` / WICKED_CREW_ALLOWED_ORIGINS) narrows it further.
|
|
374
|
+
const allowed = origin !== undefined &&
|
|
375
|
+
(LOOPBACK_ORIGIN.test(origin) ||
|
|
376
|
+
(auth.mode === 'required' &&
|
|
377
|
+
(auth.allowedOrigins === null || auth.allowedOrigins.includes(origin))));
|
|
378
|
+
if (origin && allowed) {
|
|
41
379
|
reply.header('Access-Control-Allow-Origin', origin);
|
|
42
380
|
reply.header('Vary', 'Origin');
|
|
43
|
-
reply.header('Access-Control-Allow-Methods', 'GET,POST,PUT,DELETE,OPTIONS');
|
|
44
|
-
reply.header('Access-Control-Allow-Headers', 'Content-Type');
|
|
381
|
+
reply.header('Access-Control-Allow-Methods', 'GET,POST,PUT,PATCH,DELETE,OPTIONS');
|
|
382
|
+
reply.header('Access-Control-Allow-Headers', 'Content-Type, Authorization');
|
|
45
383
|
}
|
|
46
384
|
if (req.method === 'OPTIONS') {
|
|
47
385
|
await reply.code(204).send();
|
|
@@ -60,13 +398,29 @@ export async function createServer(adapter, options) {
|
|
|
60
398
|
}
|
|
61
399
|
});
|
|
62
400
|
await app.register(fastifyWebsocket);
|
|
401
|
+
// Identity (401) + trust (403) hooks. Ordering is load-bearing twice over:
|
|
402
|
+
// AFTER the CORS hook, so an OPTIONS preflight (which carries no
|
|
403
|
+
// Authorization by design) is answered 204 above and never reaches the token
|
|
404
|
+
// check — and AFTER the websocket plugin, whose own onRequest hook flags
|
|
405
|
+
// upgrade requests (`request.ws`); if auth 401s first, that flag is never
|
|
406
|
+
// set and the plugin's onResponse cleanup skips destroying the raw upgrade
|
|
407
|
+
// socket, which then holds `app.close()` open forever.
|
|
408
|
+
registerAuthHooks(app, auth);
|
|
63
409
|
app.get('/ws', { websocket: true }, (socket) => {
|
|
64
410
|
// Late-join gets no replay; the studio reconciles with a one-shot GET /runs.
|
|
65
411
|
registerClient(socket);
|
|
66
412
|
});
|
|
67
413
|
// One dedicated WS channel per PTY: /ws/terminals/:id (DES-TERMINAL-001 §6).
|
|
68
414
|
registerTerminalWs(app, adapter, terminals);
|
|
69
|
-
registerRoutes(app, adapter, gateCache, elicitationCache
|
|
415
|
+
registerRoutes(app, adapter, gateCache, elicitationCache, qeGateCache, {
|
|
416
|
+
bus: projectBus,
|
|
417
|
+
index: membershipIndex,
|
|
418
|
+
log: (m) => app.log.warn(m),
|
|
419
|
+
settings: projectSettings,
|
|
420
|
+
}, { audit, authMode: auth.mode }, { seatHealth, retryIndex, guidanceIndex });
|
|
421
|
+
// The UI-emittable direction of the interactive seam. Registered unconditionally (a null relay
|
|
422
|
+
// answers 503, not 404) and BEFORE the static/SPA fallback below, like every other API route.
|
|
423
|
+
registerInteractiveEventRoutes(app, interactiveRelay);
|
|
70
424
|
// Serve the bundled studio SPA same-origin (DES-STUDIO-SERVING-001 §3). The
|
|
71
425
|
// API routes, `/ws`, and terminal WS are registered ABOVE and keep winning:
|
|
72
426
|
// static uses `wildcard: false` (only serves files that physically exist),
|
|
@@ -121,8 +475,8 @@ export async function createServer(adapter, options) {
|
|
|
121
475
|
}
|
|
122
476
|
return app;
|
|
123
477
|
}
|
|
124
|
-
export async function startServer(adapter, port = 7701, host = '127.0.0.1') {
|
|
125
|
-
const app = await createServer(adapter);
|
|
478
|
+
export async function startServer(adapter, port = 7701, host = '127.0.0.1', options) {
|
|
479
|
+
const app = await createServer(adapter, options);
|
|
126
480
|
await app.listen({ port, host });
|
|
127
481
|
const addr = app.server.address();
|
|
128
482
|
const boundPort = typeof addr === 'object' && addr ? addr.port : port;
|
package/dist/api/server.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server.js","sourceRoot":"","sources":["../../src/api/server.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"server.js","sourceRoot":"","sources":["../../src/api/server.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
import type { CoreEvent } from '../core/types.js';
|
|
2
|
+
/**
|
|
3
|
+
* The synthetic /ws frame (crew#287). LOCAL type: `wicked-crew-api-types` 0.6.0 does not name
|
|
4
|
+
* it yet — the contract's permissive `CoreEvent` (index signature; DES-STUDIO-001 §5.1) is what
|
|
5
|
+
* lets it ride the wire to consumers today. NOTE for the next api-types release: add this frame
|
|
6
|
+
* (and `SystemSettings.workerStallMinutes`) to the published contract. A `type` alias on
|
|
7
|
+
* purpose, not an `interface`: only anonymous object types satisfy `CoreEvent`'s index
|
|
8
|
+
* signature, which is what lets the frame flow into the CoreEvent-typed broadcast seam.
|
|
9
|
+
*/
|
|
10
|
+
export type WorkerStalledFrame = {
|
|
11
|
+
type: 'workerStalled';
|
|
12
|
+
/** The stalled run's id. */
|
|
13
|
+
session: string;
|
|
14
|
+
/** The current unit ord, when any observed event or the run header named one. */
|
|
15
|
+
ord?: number;
|
|
16
|
+
/** How long the run has been silent when the frame fired, ms. */
|
|
17
|
+
quietForMs: number;
|
|
18
|
+
};
|
|
19
|
+
/** Default sweep cadence — frequent enough that `quietForMs` is at most ~30s stale. */
|
|
20
|
+
export declare const DEFAULT_SWEEP_INTERVAL_MS = 30000;
|
|
21
|
+
/** The slice of a run the sweep needs; the server maps it from `sessionsDetail()`. */
|
|
22
|
+
export interface ExecutingRun {
|
|
23
|
+
id: string;
|
|
24
|
+
/** The run's current unit ord when the caller knows it (`session.unit_ix`). */
|
|
25
|
+
ord?: number;
|
|
26
|
+
}
|
|
27
|
+
export interface StallWatchdogDeps {
|
|
28
|
+
/** Runs whose engine status is `executing`, right now. Read per sweep, never cached. */
|
|
29
|
+
listExecuting: () => Promise<ExecutingRun[]>;
|
|
30
|
+
/** The /ws fan-out for the synthetic frame (`events/bus.ts` `broadcast` in the daemon). */
|
|
31
|
+
broadcast: (frame: WorkerStalledFrame) => void;
|
|
32
|
+
/** Threshold resolver, minutes — read per sweep so a PUT /settings change applies live. */
|
|
33
|
+
stallMinutes?: () => number | Promise<number | undefined> | undefined;
|
|
34
|
+
/** Clock (tests stub it). */
|
|
35
|
+
now?: () => number;
|
|
36
|
+
/** Wired to the daemon's warn logger — a stall is an operator-attention signal. */
|
|
37
|
+
log?: (m: string) => void;
|
|
38
|
+
}
|
|
39
|
+
export declare class WorkerStallWatchdog {
|
|
40
|
+
private readonly deps;
|
|
41
|
+
/** run id → epoch ms of the last engine event observed for it (or the seed, see sweep). */
|
|
42
|
+
private readonly lastEventAt;
|
|
43
|
+
/** run id → last unit ord any of its events named. */
|
|
44
|
+
private readonly lastOrd;
|
|
45
|
+
/** Runs already alerted for the CURRENT quiet period (cleared by any new event). */
|
|
46
|
+
private readonly alerted;
|
|
47
|
+
private readonly now;
|
|
48
|
+
private readonly log;
|
|
49
|
+
private handle;
|
|
50
|
+
private sweeping;
|
|
51
|
+
constructor(deps: StallWatchdogDeps);
|
|
52
|
+
/** Fold one relay frame: any event for a run is proof of life — stamp its clock and RE-ARM. */
|
|
53
|
+
ingest(event: CoreEvent): void;
|
|
54
|
+
/** One detection pass. Public so tests drive it directly; the armed interval calls it too. */
|
|
55
|
+
sweep(): Promise<void>;
|
|
56
|
+
/** Arm the periodic sweep. Unref'd — the daemon's server lifecycle owns shutdown. */
|
|
57
|
+
start(intervalMs?: number): void;
|
|
58
|
+
stop(): void;
|
|
59
|
+
/** Threshold in ms — an unset/invalid setting falls back to the 15-minute default. */
|
|
60
|
+
private thresholdMs;
|
|
61
|
+
}
|
|
62
|
+
//# sourceMappingURL=stall-watchdog.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"stall-watchdog.d.ts","sourceRoot":"","sources":["../../src/api/stall-watchdog.ts"],"names":[],"mappings":"AAoBA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAGlD;;;;;;;GAOG;AACH,MAAM,MAAM,kBAAkB,GAAG;IAC/B,IAAI,EAAE,eAAe,CAAC;IACtB,4BAA4B;IAC5B,OAAO,EAAE,MAAM,CAAC;IAChB,iFAAiF;IACjF,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,iEAAiE;IACjE,UAAU,EAAE,MAAM,CAAC;CACpB,CAAC;AAEF,uFAAuF;AACvF,eAAO,MAAM,yBAAyB,QAAS,CAAC;AAEhD,sFAAsF;AACtF,MAAM,WAAW,YAAY;IAC3B,EAAE,EAAE,MAAM,CAAC;IACX,+EAA+E;IAC/E,GAAG,CAAC,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,iBAAiB;IAChC,wFAAwF;IACxF,aAAa,EAAE,MAAM,OAAO,CAAC,YAAY,EAAE,CAAC,CAAC;IAC7C,2FAA2F;IAC3F,SAAS,EAAE,CAAC,KAAK,EAAE,kBAAkB,KAAK,IAAI,CAAC;IAC/C,2FAA2F;IAC3F,YAAY,CAAC,EAAE,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,GAAG,SAAS,CAAC;IACtE,6BAA6B;IAC7B,GAAG,CAAC,EAAE,MAAM,MAAM,CAAC;IACnB,mFAAmF;IACnF,GAAG,CAAC,EAAE,CAAC,CAAC,EAAE,MAAM,KAAK,IAAI,CAAC;CAC3B;AAED,qBAAa,mBAAmB;IAYlB,OAAO,CAAC,QAAQ,CAAC,IAAI;IAXjC,2FAA2F;IAC3F,OAAO,CAAC,QAAQ,CAAC,WAAW,CAA6B;IACzD,sDAAsD;IACtD,OAAO,CAAC,QAAQ,CAAC,OAAO,CAA6B;IACrD,oFAAoF;IACpF,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAqB;IAC7C,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAe;IACnC,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAsB;IAC1C,OAAO,CAAC,MAAM,CAA+B;IAC7C,OAAO,CAAC,QAAQ,CAAS;gBAEI,IAAI,EAAE,iBAAiB;IAKpD,+FAA+F;IAC/F,MAAM,CAAC,KAAK,EAAE,SAAS,GAAG,IAAI;IAS9B,8FAA8F;IACxF,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAsD5B,qFAAqF;IACrF,KAAK,CAAC,UAAU,SAA4B,GAAG,IAAI;IAUnD,IAAI,IAAI,IAAI;IAKZ,sFAAsF;YACxE,WAAW;CAc1B"}
|