chorus-codes 0.8.25 → 0.8.26
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/.next/BUILD_ID +1 -1
- package/.next/app-path-routes-manifest.json +1 -1
- package/.next/build-manifest.json +2 -2
- package/.next/prerender-manifest.json +3 -3
- package/.next/server/app/_global-error/page_client-reference-manifest.js +1 -1
- package/.next/server/app/_global-error.html +1 -1
- package/.next/server/app/_global-error.rsc +1 -1
- package/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
- package/.next/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +1 -1
- package/.next/server/app/_global-error.segments/_global-error.segment.rsc +1 -1
- package/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
- package/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
- package/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
- package/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
- package/.next/server/app/_not-found.html +1 -1
- package/.next/server/app/_not-found.rsc +2 -2
- package/.next/server/app/_not-found.segments/_full.segment.rsc +2 -2
- package/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
- package/.next/server/app/_not-found.segments/_index.segment.rsc +2 -2
- package/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
- package/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
- package/.next/server/app/_not-found.segments/_tree.segment.rsc +2 -2
- package/.next/server/app/connect/page.js +1 -1
- package/.next/server/app/connect/page.js.nft.json +1 -1
- package/.next/server/app/connect/page_client-reference-manifest.js +1 -1
- package/.next/server/app/demo/[scenario]/page.js +1 -1
- package/.next/server/app/demo/[scenario]/page.js.nft.json +1 -1
- package/.next/server/app/demo/[scenario]/page_client-reference-manifest.js +1 -1
- package/.next/server/app/new/page.js +1 -1
- package/.next/server/app/new/page.js.nft.json +1 -1
- package/.next/server/app/new/page_client-reference-manifest.js +1 -1
- package/.next/server/app/new.html +1 -1
- package/.next/server/app/new.rsc +3 -3
- package/.next/server/app/new.segments/_full.segment.rsc +3 -3
- package/.next/server/app/new.segments/_head.segment.rsc +1 -1
- package/.next/server/app/new.segments/_index.segment.rsc +2 -2
- package/.next/server/app/new.segments/_tree.segment.rsc +2 -2
- package/.next/server/app/new.segments/new/__PAGE__.segment.rsc +2 -2
- package/.next/server/app/new.segments/new.segment.rsc +1 -1
- package/.next/server/app/onboarding/page.js +1 -1
- package/.next/server/app/onboarding/page.js.nft.json +1 -1
- package/.next/server/app/onboarding/page_client-reference-manifest.js +1 -1
- package/.next/server/app/onboarding.html +1 -1
- package/.next/server/app/onboarding.rsc +3 -3
- package/.next/server/app/onboarding.segments/_full.segment.rsc +3 -3
- package/.next/server/app/onboarding.segments/_head.segment.rsc +1 -1
- package/.next/server/app/onboarding.segments/_index.segment.rsc +2 -2
- package/.next/server/app/onboarding.segments/_tree.segment.rsc +2 -2
- package/.next/server/app/onboarding.segments/onboarding/__PAGE__.segment.rsc +2 -2
- package/.next/server/app/onboarding.segments/onboarding.segment.rsc +1 -1
- package/.next/server/app/page.js +2 -2
- package/.next/server/app/page.js.nft.json +1 -1
- package/.next/server/app/page_client-reference-manifest.js +1 -1
- package/.next/server/app/personas/page.js +1 -1
- package/.next/server/app/personas/page.js.nft.json +1 -1
- package/.next/server/app/personas/page_client-reference-manifest.js +1 -1
- package/.next/server/app/personas.html +1 -1
- package/.next/server/app/personas.rsc +3 -3
- package/.next/server/app/personas.segments/_full.segment.rsc +3 -3
- package/.next/server/app/personas.segments/_head.segment.rsc +1 -1
- package/.next/server/app/personas.segments/_index.segment.rsc +2 -2
- package/.next/server/app/personas.segments/_tree.segment.rsc +2 -2
- package/.next/server/app/personas.segments/personas/__PAGE__.segment.rsc +2 -2
- package/.next/server/app/personas.segments/personas.segment.rsc +1 -1
- package/.next/server/app/runs/[runId]/page.js +2 -2
- package/.next/server/app/runs/[runId]/page.js.nft.json +1 -1
- package/.next/server/app/runs/[runId]/page_client-reference-manifest.js +1 -1
- package/.next/server/app/runs/page.js +2 -2
- package/.next/server/app/runs/page.js.nft.json +1 -1
- package/.next/server/app/runs/page_client-reference-manifest.js +1 -1
- package/.next/server/app/settings/page.js +3 -3
- package/.next/server/app/settings/page.js.nft.json +1 -1
- package/.next/server/app/settings/page_client-reference-manifest.js +1 -1
- package/.next/server/app/settings/permissions/page.js +1 -1
- package/.next/server/app/settings/permissions/page.js.nft.json +1 -1
- package/.next/server/app/settings/permissions/page_client-reference-manifest.js +1 -1
- package/.next/server/app/settings.html +1 -1
- package/.next/server/app/settings.rsc +3 -3
- package/.next/server/app/settings.segments/_full.segment.rsc +3 -3
- package/.next/server/app/settings.segments/_head.segment.rsc +1 -1
- package/.next/server/app/settings.segments/_index.segment.rsc +2 -2
- package/.next/server/app/settings.segments/_tree.segment.rsc +2 -2
- package/.next/server/app/settings.segments/settings/__PAGE__.segment.rsc +2 -2
- package/.next/server/app/settings.segments/settings.segment.rsc +1 -1
- package/.next/server/app/templates/page.js +2 -2
- package/.next/server/app/templates/page.js.nft.json +1 -1
- package/.next/server/app/templates/page_client-reference-manifest.js +1 -1
- package/.next/server/app/templates.html +1 -1
- package/.next/server/app/templates.rsc +3 -3
- package/.next/server/app/templates.segments/_full.segment.rsc +3 -3
- package/.next/server/app/templates.segments/_head.segment.rsc +1 -1
- package/.next/server/app/templates.segments/_index.segment.rsc +2 -2
- package/.next/server/app/templates.segments/_tree.segment.rsc +2 -2
- package/.next/server/app/templates.segments/templates/__PAGE__.segment.rsc +2 -2
- package/.next/server/app/templates.segments/templates.segment.rsc +1 -1
- package/.next/server/app-paths-manifest.json +1 -1
- package/.next/server/chunks/189.js +1 -0
- package/.next/server/chunks/{144.js → 21.js} +1 -1
- package/.next/server/chunks/{668.js → 313.js} +1 -1
- package/.next/server/chunks/681.js +1 -1
- package/.next/server/middleware-build-manifest.js +1 -1
- package/.next/server/pages/404.html +1 -1
- package/.next/server/pages/500.html +1 -1
- package/.next/server/server-reference-manifest.json +1 -1
- package/.next/static/chunks/249-2e840495c38ee022.js +25 -0
- package/.next/static/chunks/641-2908cb9553b8753a.js +1 -0
- package/.next/static/chunks/690-092c26db4082d49a.js +1 -0
- package/.next/static/chunks/app/connect/{page-a3a0af374f90ad4c.js → page-ad4409761e870bd0.js} +1 -1
- package/.next/static/chunks/app/demo/[scenario]/{page-6a0e4aec4bb96fee.js → page-39673968f543c473.js} +1 -1
- package/.next/static/chunks/app/new/{page-b96d75506030acf8.js → page-b5f609ab9413ac00.js} +1 -1
- package/.next/static/chunks/app/onboarding/{page-4be5a1d944e32672.js → page-8b0850fef487abdc.js} +1 -1
- package/.next/static/chunks/app/{page-35375a7c8b3d117a.js → page-9bdbaad592d0ce56.js} +1 -1
- package/.next/static/chunks/app/personas/{page-3884f8907107a4e6.js → page-440c6033a773100c.js} +1 -1
- package/.next/static/chunks/app/runs/[runId]/{page-b5bcf0c093389207.js → page-ffc36f12f1b63ebe.js} +1 -1
- package/.next/static/chunks/app/runs/{page-376175c1ac803558.js → page-6962ea572c9e4b74.js} +1 -1
- package/.next/static/chunks/app/settings/page-ad7180ee0d142704.js +25 -0
- package/.next/static/chunks/app/settings/permissions/{page-c90795aa9299bbe8.js → page-cd767401ac71a29c.js} +1 -1
- package/.next/static/chunks/app/templates/page-0112ab3c7ab5185d.js +1 -0
- package/.next/static/css/df4972a256406ec7.css +3 -0
- package/.next/trace +20 -20
- package/.next/trace-build +1 -1
- package/dist/daemon/cli-semaphore.js +266 -0
- package/dist/daemon/cli-semaphore.js.map +1 -0
- package/dist/daemon/routes/settings.js +39 -0
- package/dist/daemon/routes/settings.js.map +1 -1
- package/dist/daemon/runner/doer-driver.js +243 -214
- package/dist/daemon/runner/doer-driver.js.map +1 -1
- package/dist/daemon/runner/reviewer-driver.js +299 -255
- package/dist/daemon/runner/reviewer-driver.js.map +1 -1
- package/dist/daemon/runner.js +19 -0
- package/dist/daemon/runner.js.map +1 -1
- package/dist/lib/db/chats.js +28 -0
- package/dist/lib/db/chats.js.map +1 -1
- package/dist/lib/db/connection.js +6 -0
- package/dist/lib/db/connection.js.map +1 -1
- package/dist/lib/db/schema.sql +6 -0
- package/dist/lib/settings/concurrency.js +101 -0
- package/dist/lib/settings/concurrency.js.map +1 -0
- package/package.json +1 -1
- package/.next/server/chunks/946.js +0 -1
- package/.next/static/chunks/116-8bf7e014066cedde.js +0 -25
- package/.next/static/chunks/15-d438a2b057302bed.js +0 -1
- package/.next/static/chunks/641-60721f44faf711b9.js +0 -1
- package/.next/static/chunks/app/settings/page-1792a3e289409b2d.js +0 -25
- package/.next/static/chunks/app/templates/page-1449b0aea2e7cb68.js +0 -1
- package/.next/static/css/d2bb161eb5bee944.css +0 -3
- /package/.next/static/{47MSfijpKVM6q0E0ye9Mr → eOeXty5cBGWg7xnmtF6ST}/_buildManifest.js +0 -0
- /package/.next/static/{47MSfijpKVM6q0E0ye9Mr → eOeXty5cBGWg7xnmtF6ST}/_ssgManifest.js +0 -0
package/.next/trace-build
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
[{"name":"run-webpack","duration":
|
|
1
|
+
[{"name":"run-webpack","duration":10796114,"timestamp":6766667988726,"id":14,"parentId":1,"tags":{},"startTime":1778158038415,"traceId":"96ba550fd6eb03e5"},{"name":"run-typescript","duration":5584072,"timestamp":6766678787710,"id":2118,"parentId":1,"tags":{},"startTime":1778158049214,"traceId":"96ba550fd6eb03e5"},{"name":"static-check","duration":391682,"timestamp":6766684429367,"id":2121,"parentId":1,"tags":{},"startTime":1778158054855,"traceId":"96ba550fd6eb03e5"},{"name":"static-generation","duration":897815,"timestamp":6766685736633,"id":2161,"parentId":1,"tags":{},"startTime":1778158056163,"traceId":"96ba550fd6eb03e5"},{"name":"collect-build-traces","duration":6311220,"timestamp":6766684821443,"id":2158,"parentId":1,"tags":{},"startTime":1778158055247,"traceId":"96ba550fd6eb03e5"},{"name":"telemetry-flush","duration":35,"timestamp":6766691134339,"id":2170,"parentId":1,"tags":{},"startTime":1778158061560,"traceId":"96ba550fd6eb03e5"},{"name":"next-build","duration":23236409,"timestamp":6766667897975,"id":1,"tags":{"buildMode":"default","version":"16.2.4","bundler":"webpack","has-custom-webpack-config":"false","use-build-worker":"true"},"startTime":1778158038324,"traceId":"96ba550fd6eb03e5"}]
|
|
@@ -0,0 +1,266 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Daemon-wide semaphore for local-CLI subprocesses.
|
|
4
|
+
*
|
|
5
|
+
* Two layers, both daemon-process-wide (NOT per-chat):
|
|
6
|
+
*
|
|
7
|
+
* 1. Global cap (`maxParallelCli`) — total number of local-CLI shim
|
|
8
|
+
* processes in flight across all chats.
|
|
9
|
+
*
|
|
10
|
+
* 2. Per-lineage cap (`perCli['opencode-cli']` etc.) — subset cap
|
|
11
|
+
* per binary family.
|
|
12
|
+
*
|
|
13
|
+
* `acquire(lineage)` blocks until BOTH a global slot AND a lineage slot
|
|
14
|
+
* are available, then returns a `release()` function the caller MUST
|
|
15
|
+
* invoke (use try/finally). Releasing returns the slots and wakes the
|
|
16
|
+
* next waiter for whichever queue had backpressure.
|
|
17
|
+
*
|
|
18
|
+
* Settings are read dynamically per acquire so the user can tune the
|
|
19
|
+
* caps in /settings and have it take effect on the next reviewer that
|
|
20
|
+
* tries to start — no daemon restart needed.
|
|
21
|
+
*
|
|
22
|
+
* HTTP-dispatched shims (openrouter, future API-only shims) DO NOT call
|
|
23
|
+
* acquire — they consume zero local CPU/RAM, just network. The
|
|
24
|
+
* semaphore exists to prevent the user's box melting under N parallel
|
|
25
|
+
* subprocess children.
|
|
26
|
+
*/
|
|
27
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
28
|
+
exports._testing = void 0;
|
|
29
|
+
exports.acquire = acquire;
|
|
30
|
+
exports.snapshot = snapshot;
|
|
31
|
+
const concurrency_js_1 = require("../lib/settings/concurrency.js");
|
|
32
|
+
/**
|
|
33
|
+
* Module-level state. The daemon is a singleton process so this is the
|
|
34
|
+
* authoritative cross-chat counter. Tests use `_resetForTests` to clear
|
|
35
|
+
* between cases.
|
|
36
|
+
*/
|
|
37
|
+
let globalInFlight = 0;
|
|
38
|
+
const perCliInFlight = new Map();
|
|
39
|
+
/**
|
|
40
|
+
* FIFO queue of waiters. We don't split per lineage because checking
|
|
41
|
+
* whether a waiter at the head can proceed is cheap (two map lookups +
|
|
42
|
+
* a settings read), and a single FIFO preserves fairness — a waiter
|
|
43
|
+
* that came in first won't be starved by a later arrival of a different
|
|
44
|
+
* lineage that happens to have free capacity.
|
|
45
|
+
*
|
|
46
|
+
* Trade-off: under heavy load with one bottlenecked lineage, the queue
|
|
47
|
+
* head might block on perCli cap while later waiters of other lineages
|
|
48
|
+
* could have run immediately. We accept this — fairness > throughput at
|
|
49
|
+
* the scale chorus operates (single-user, ~10 chats max).
|
|
50
|
+
*/
|
|
51
|
+
const waiters = [];
|
|
52
|
+
function getPerCli(lineage) {
|
|
53
|
+
return perCliInFlight.get(lineage) ?? 0;
|
|
54
|
+
}
|
|
55
|
+
function incPerCli(lineage) {
|
|
56
|
+
perCliInFlight.set(lineage, getPerCli(lineage) + 1);
|
|
57
|
+
}
|
|
58
|
+
function decPerCli(lineage) {
|
|
59
|
+
const next = getPerCli(lineage) - 1;
|
|
60
|
+
if (next <= 0) {
|
|
61
|
+
perCliInFlight.delete(lineage);
|
|
62
|
+
}
|
|
63
|
+
else {
|
|
64
|
+
perCliInFlight.set(lineage, next);
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* Mutex flag preventing reentrant `tryGrantHead` execution. The
|
|
69
|
+
* function does an `await getConcurrency()` (DB read) inside its loop,
|
|
70
|
+
* so two concurrent callers (e.g. two near-simultaneous `release()`
|
|
71
|
+
* events) would otherwise both pass the `waiters.length > 0` check,
|
|
72
|
+
* both hit the await, both resume, and both try to shift the same
|
|
73
|
+
* waiter — leading to undefined access and double-grant. With this
|
|
74
|
+
* flag, the second caller bails immediately; the first caller's loop
|
|
75
|
+
* will pick up any newly-released capacity before exiting.
|
|
76
|
+
*
|
|
77
|
+
* `dirty` is the companion: when a reentrant call bails, it sets
|
|
78
|
+
* `dirty = true` to signal "you have new work to do." The live
|
|
79
|
+
* tryGrantHead checks this in `finally` and re-enters if set. In
|
|
80
|
+
* single-threaded JS this is technically belt-and-suspenders — there
|
|
81
|
+
* is no yield between the live's `while`-exit and `granting = false`
|
|
82
|
+
* for an external push to slip in — but it eliminates any ambiguity
|
|
83
|
+
* under a future refactor that might introduce a yield point in that
|
|
84
|
+
* window, and at most costs one extra tryGrantHead call per drain.
|
|
85
|
+
*/
|
|
86
|
+
let granting = false;
|
|
87
|
+
let dirty = false;
|
|
88
|
+
/**
|
|
89
|
+
* Try to grant the head waiter (and subsequent waiters whose lineage
|
|
90
|
+
* has free capacity). Called after every release and from `acquire()`.
|
|
91
|
+
*
|
|
92
|
+
* Walks from head: if the head can run, grant it and continue. If not
|
|
93
|
+
* (their per-CLI cap is hit), STOP — strict FIFO. We deliberately do
|
|
94
|
+
* NOT skip the head to grant a later waiter of a different lineage,
|
|
95
|
+
* even if that later one has free capacity. Skipping would convert the
|
|
96
|
+
* queue from "fair FIFO" into "lineage-affinity scheduler" which is
|
|
97
|
+
* surprising under load.
|
|
98
|
+
*
|
|
99
|
+
* Errors (e.g. settings DB unavailable) are swallowed and logged —
|
|
100
|
+
* propagating would land as an unhandled rejection in the
|
|
101
|
+
* fire-and-forget call site in `release()`, crashing the daemon and
|
|
102
|
+
* stranding the queue head forever.
|
|
103
|
+
*/
|
|
104
|
+
async function tryGrantHead() {
|
|
105
|
+
if (granting) {
|
|
106
|
+
// A live tryGrantHead is mid-flight; mark dirty so it knows new
|
|
107
|
+
// work arrived and re-runs before clearing the mutex.
|
|
108
|
+
dirty = true;
|
|
109
|
+
return;
|
|
110
|
+
}
|
|
111
|
+
granting = true;
|
|
112
|
+
dirty = false;
|
|
113
|
+
try {
|
|
114
|
+
// Outer drain loop: re-runs the inner grant pass while any reentrant
|
|
115
|
+
// call set `dirty = true`. Without this, an aborted-waiter splice
|
|
116
|
+
// that pokes us mid-grant could be swallowed (the abort's
|
|
117
|
+
// tryGrantHead call sees granting=true, bails, and we'd exit
|
|
118
|
+
// without re-checking the queue).
|
|
119
|
+
do {
|
|
120
|
+
dirty = false;
|
|
121
|
+
while (waiters.length > 0) {
|
|
122
|
+
const config = await (0, concurrency_js_1.getConcurrency)();
|
|
123
|
+
// Defensive recheck — another release may have fired and emptied
|
|
124
|
+
// the queue while we were awaiting the DB read.
|
|
125
|
+
if (waiters.length === 0)
|
|
126
|
+
break;
|
|
127
|
+
if (globalInFlight >= config.maxParallelCli)
|
|
128
|
+
break;
|
|
129
|
+
const head = waiters[0];
|
|
130
|
+
const perCliCap = (0, concurrency_js_1.resolvePerCliCap)(config, head.lineage);
|
|
131
|
+
if (getPerCli(head.lineage) >= perCliCap)
|
|
132
|
+
break;
|
|
133
|
+
waiters.shift();
|
|
134
|
+
globalInFlight++;
|
|
135
|
+
incPerCli(head.lineage);
|
|
136
|
+
head.cleanup?.();
|
|
137
|
+
head.resolve();
|
|
138
|
+
}
|
|
139
|
+
// If a reentrant call marked dirty (e.g. an abort spliced the
|
|
140
|
+
// blocked head, freeing the queue), loop again so the new state
|
|
141
|
+
// gets a chance to grant. Without this we'd exit while leaving
|
|
142
|
+
// an eligible waiter unattended until the next external event.
|
|
143
|
+
} while (dirty);
|
|
144
|
+
}
|
|
145
|
+
catch (err) {
|
|
146
|
+
// Settings DB unreachable, corrupt, or any other unexpected failure.
|
|
147
|
+
// Logged but never re-thrown — the void-call in release() can't
|
|
148
|
+
// catch it, and an unhandled rejection here would crash the daemon
|
|
149
|
+
// AND strand the queue head forever (subsequent releases would
|
|
150
|
+
// re-trigger and silently fail again, creating a permanent
|
|
151
|
+
// semaphore deadlock).
|
|
152
|
+
console.error('[chorus] cli-semaphore tryGrantHead failed:', err);
|
|
153
|
+
}
|
|
154
|
+
finally {
|
|
155
|
+
granting = false;
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
/**
|
|
159
|
+
* Acquire global + per-lineage slots. Blocks until both are free.
|
|
160
|
+
* Returns a release function the caller MUST invoke (typically in a
|
|
161
|
+
* `finally` block) to free the slots and wake the next waiter.
|
|
162
|
+
*
|
|
163
|
+
* Implementation note: every call enqueues, even when there's no
|
|
164
|
+
* contention. Without this, two concurrent callers could both pass the
|
|
165
|
+
* `waiters.length === 0 && globalInFlight < cap` check (separated by
|
|
166
|
+
* the `await getConcurrency()` yield) and both increment, exceeding
|
|
167
|
+
* the cap. Always-enqueue routes everything through `tryGrantHead`'s
|
|
168
|
+
* mutex so increments are atomic w.r.t. the cap check. The extra
|
|
169
|
+
* microtask cost is negligible at chorus's scale.
|
|
170
|
+
*
|
|
171
|
+
* Idempotent on release — calling release() twice is a no-op so a
|
|
172
|
+
* caller that double-frees on an error path doesn't underflow the
|
|
173
|
+
* counters.
|
|
174
|
+
*
|
|
175
|
+
* Cancellation: the optional `signal` lets a caller bail out of a
|
|
176
|
+
* queued wait without leaving a stale waiter blocking the head. On
|
|
177
|
+
* abort, the waiter is removed from the queue and the returned promise
|
|
178
|
+
* rejects. If the slot was already granted before abort fires, the
|
|
179
|
+
* caller is responsible for invoking the release function as usual —
|
|
180
|
+
* we don't auto-release because the caller may already have spawned
|
|
181
|
+
* the subprocess.
|
|
182
|
+
*/
|
|
183
|
+
async function acquire(lineage, signal) {
|
|
184
|
+
return new Promise((resolve, reject) => {
|
|
185
|
+
if (signal?.aborted) {
|
|
186
|
+
reject(signal.reason ?? new Error('aborted'));
|
|
187
|
+
return;
|
|
188
|
+
}
|
|
189
|
+
const waiter = {
|
|
190
|
+
lineage,
|
|
191
|
+
resolve: () => resolve(makeRelease(lineage)),
|
|
192
|
+
reject,
|
|
193
|
+
};
|
|
194
|
+
if (signal) {
|
|
195
|
+
const onAbort = () => {
|
|
196
|
+
const i = waiters.indexOf(waiter);
|
|
197
|
+
if (i >= 0)
|
|
198
|
+
waiters.splice(i, 1);
|
|
199
|
+
// Also re-poke the queue: the aborted waiter may have been
|
|
200
|
+
// blocking later waiters of a different lineage.
|
|
201
|
+
void tryGrantHead();
|
|
202
|
+
reject(signal.reason ?? new Error('aborted'));
|
|
203
|
+
};
|
|
204
|
+
signal.addEventListener('abort', onAbort, { once: true });
|
|
205
|
+
waiter.cleanup = () => signal.removeEventListener('abort', onAbort);
|
|
206
|
+
}
|
|
207
|
+
waiters.push(waiter);
|
|
208
|
+
void tryGrantHead();
|
|
209
|
+
});
|
|
210
|
+
}
|
|
211
|
+
function makeRelease(lineage) {
|
|
212
|
+
let released = false;
|
|
213
|
+
return () => {
|
|
214
|
+
if (released)
|
|
215
|
+
return;
|
|
216
|
+
released = true;
|
|
217
|
+
globalInFlight = Math.max(0, globalInFlight - 1);
|
|
218
|
+
decPerCli(lineage);
|
|
219
|
+
// Don't await — the caller doesn't care, and awaiting would couple
|
|
220
|
+
// every release to the settings read inside tryGrantHead.
|
|
221
|
+
// tryGrantHead has its own try/catch so a DB failure can't surface
|
|
222
|
+
// as an unhandled rejection here.
|
|
223
|
+
void tryGrantHead();
|
|
224
|
+
};
|
|
225
|
+
}
|
|
226
|
+
/**
|
|
227
|
+
* Diagnostic snapshot. Used by /api/v1/diagnostics for the health page.
|
|
228
|
+
*/
|
|
229
|
+
function snapshot() {
|
|
230
|
+
return {
|
|
231
|
+
globalInFlight,
|
|
232
|
+
perCli: Object.fromEntries(perCliInFlight),
|
|
233
|
+
queueDepth: waiters.length,
|
|
234
|
+
};
|
|
235
|
+
}
|
|
236
|
+
/**
|
|
237
|
+
* @internal — for tests only. Resets all in-flight counters and clears
|
|
238
|
+
* the wait queue. Tests use this between cases since the module-level
|
|
239
|
+
* state is otherwise sticky across the whole vitest worker.
|
|
240
|
+
*
|
|
241
|
+
* Pending waiters get rejected with a 'reset' error so a previous
|
|
242
|
+
* test's queued acquire() doesn't leak into the next test as a hung
|
|
243
|
+
* promise. Without this, awaiting a never-rejected acquire from a
|
|
244
|
+
* prior test would silently hang the next test until vitest's timeout.
|
|
245
|
+
*/
|
|
246
|
+
exports._testing = {
|
|
247
|
+
reset: () => {
|
|
248
|
+
globalInFlight = 0;
|
|
249
|
+
perCliInFlight.clear();
|
|
250
|
+
granting = false;
|
|
251
|
+
dirty = false;
|
|
252
|
+
while (waiters.length > 0) {
|
|
253
|
+
const w = waiters.shift();
|
|
254
|
+
if (!w)
|
|
255
|
+
break;
|
|
256
|
+
w.cleanup?.();
|
|
257
|
+
try {
|
|
258
|
+
w.reject(new Error('cli-semaphore reset (tests)'));
|
|
259
|
+
}
|
|
260
|
+
catch {
|
|
261
|
+
/* defensive — never let one waiter's reject handler block another */
|
|
262
|
+
}
|
|
263
|
+
}
|
|
264
|
+
},
|
|
265
|
+
};
|
|
266
|
+
//# sourceMappingURL=cli-semaphore.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli-semaphore.js","sourceRoot":"","sources":["../../src/daemon/cli-semaphore.ts"],"names":[],"mappings":"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"}
|
|
@@ -96,6 +96,45 @@ function registerSettingsRoutes(fastify) {
|
|
|
96
96
|
return (0, api_response_js_1.errorResponse)('validation', message);
|
|
97
97
|
}
|
|
98
98
|
});
|
|
99
|
+
// ─── Concurrency (daemon-wide CLI subprocess caps) ────────────────────
|
|
100
|
+
fastify.get('/settings/concurrency', async () => {
|
|
101
|
+
try {
|
|
102
|
+
const { getConcurrency, CLI_LINEAGES, _defaults } = await import('../../lib/settings/concurrency.js');
|
|
103
|
+
return (0, api_response_js_1.successResponse)({
|
|
104
|
+
...(await getConcurrency()),
|
|
105
|
+
// Surface the canonical CLI list + defaults so the cockpit
|
|
106
|
+
// doesn't have to mirror them. Cockpit renders one input per
|
|
107
|
+
// lineage; missing perCli keys fall through to defaults.
|
|
108
|
+
cliLineages: CLI_LINEAGES,
|
|
109
|
+
defaults: _defaults,
|
|
110
|
+
});
|
|
111
|
+
}
|
|
112
|
+
catch (error) {
|
|
113
|
+
const message = error instanceof Error ? error.message : 'Unknown error';
|
|
114
|
+
return (0, api_response_js_1.errorResponse)('internal', message);
|
|
115
|
+
}
|
|
116
|
+
});
|
|
117
|
+
fastify.put('/settings/concurrency', async (request) => {
|
|
118
|
+
try {
|
|
119
|
+
const { getConcurrency, setConcurrency, ConcurrencySchema } = await import('../../lib/settings/concurrency.js');
|
|
120
|
+
const current = await getConcurrency();
|
|
121
|
+
const body = request.body ?? {};
|
|
122
|
+
// Merge incoming patch with current state — partial PUTs are
|
|
123
|
+
// friendlier to the cockpit (it can save just the changed input
|
|
124
|
+
// without having to round-trip the whole object).
|
|
125
|
+
const merged = {
|
|
126
|
+
maxParallelCli: body.maxParallelCli ?? current.maxParallelCli,
|
|
127
|
+
perCli: { ...current.perCli, ...(body.perCli ?? {}) },
|
|
128
|
+
};
|
|
129
|
+
const validated = ConcurrencySchema.parse(merged);
|
|
130
|
+
await setConcurrency(validated);
|
|
131
|
+
return (0, api_response_js_1.successResponse)(validated);
|
|
132
|
+
}
|
|
133
|
+
catch (error) {
|
|
134
|
+
const message = error instanceof Error ? error.message : 'Unknown error';
|
|
135
|
+
return (0, api_response_js_1.errorResponse)('validation', message);
|
|
136
|
+
}
|
|
137
|
+
});
|
|
99
138
|
// ─── Telemetry (anonymous heartbeat opt-out) ─────────────────────────
|
|
100
139
|
fastify.get('/settings/telemetry', async () => {
|
|
101
140
|
try {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"settings.js","sourceRoot":"","sources":["../../../src/daemon/routes/settings.ts"],"names":[],"mappings":";;AAkBA,
|
|
1
|
+
{"version":3,"file":"settings.js","sourceRoot":"","sources":["../../../src/daemon/routes/settings.ts"],"names":[],"mappings":";;AAkBA,wDA2OC;AAED,oDAiDC;AAxSD,oDAA0D;AAC1D,wDAO4B;AAE5B,SAAgB,sBAAsB,CAAC,OAAwB;IAC7D,wEAAwE;IACxE,OAAO,CAAC,GAAG,CAAiC,WAAW,EAAE,KAAK,IAAI,EAAE;QAClE,IAAI,CAAC;YACH,MAAM,WAAW,GAAG,MAAM,mBAAQ,CAAC,MAAM,EAAE,CAAC;YAC5C,OAAO,IAAA,iCAAe,EAAC,WAAW,CAAC,CAAC;QACtC,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,OAAO,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe,CAAC;YACzE,OAAO,IAAA,+BAAa,EAAC,UAAU,EAAE,OAAO,CAAC,CAAC;QAC5C,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,OAAO,CAAC,GAAG,CAGR,WAAW,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE;QAChC,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC;YAC7B,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC;gBACnD,MAAM,mBAAQ,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;YACjC,CAAC;YACD,OAAO,IAAA,iCAAe,EAAC,MAAM,mBAAQ,CAAC,MAAM,EAAE,CAAC,CAAC;QAClD,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,OAAO,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe,CAAC;YACzE,OAAO,IAAA,+BAAa,EAAC,UAAU,EAAE,OAAO,CAAC,CAAC;QAC5C,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,wEAAwE;IACxE,OAAO,CAAC,GAAG,CACT,uBAAuB,EACvB,KAAK,IAAI,EAAE;QACT,IAAI,CAAC;YACH,MAAM,EAAE,cAAc,EAAE,oBAAoB,EAAE,GAAG,MAAM,MAAM,CAC3D,mCAAmC,CACpC,CAAC;YACF,OAAO,IAAA,iCAAe,EAAC;gBACrB,GAAG,CAAC,MAAM,cAAc,EAAE,CAAC;gBAC3B,mBAAmB,EAAE,oBAAoB;aAC1C,CAAC,CAAC;QACL,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,OAAO,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe,CAAC;YACzE,OAAO,IAAA,+BAAa,EAAC,UAAU,EAAE,OAAO,CAAC,CAAC;QAC5C,CAAC;IACH,CAAC,CACF,CAAC;IAEF,OAAO,CAAC,GAAG,CAOR,uBAAuB,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE;QAC5C,IAAI,CAAC;YACH,MAAM,EAAE,cAAc,EAAE,GAAG,MAAM,MAAM,CAAC,mCAAmC,CAAC,CAAC;YAC7E,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,IAAI,EAAE,CAAC;YAChC,MAAM,IAAI,GAAG,MAAM,cAAc,CAAC;gBAChC,GAAG,CAAC,IAAI,CAAC,cAAc,KAAK,SAAS,IAAI;oBACvC,cAAc,EAAE,IAAI,CAAC,cAAiD;iBACvE,CAAC;gBACF,GAAG,CAAC,IAAI,CAAC,kBAAkB,KAAK,SAAS,IAAI;oBAC3C,kBAAkB,EAAE,IAAI,CAAC,kBAAkB;iBAC5C,CAAC;gBACF,GAAG,CAAC,IAAI,CAAC,aAAa,KAAK,SAAS,IAAI;oBACtC,aAAa,EAAE,IAAI,CAAC,aAAa;iBAClC,CAAC;aACH,CAAC,CAAC;YACH,OAAO,IAAA,iCAAe,EAAC,IAAI,CAAC,CAAC;QAC/B,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,OAAO,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe,CAAC;YACzE,OAAO,IAAA,+BAAa,EAAC,YAAY,EAAE,OAAO,CAAC,CAAC;QAC9C,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,wEAAwE;IACxE,OAAO,CAAC,GAAG,CACT,qBAAqB,EACrB,KAAK,IAAI,EAAE;QACT,IAAI,CAAC;YACH,MAAM,EAAE,YAAY,EAAE,sBAAsB,EAAE,cAAc,EAAE,GAAG,MAAM,MAAM,CAC3E,iCAAiC,CAClC,CAAC;YACF,OAAO,IAAA,iCAAe,EAAC;gBACrB,SAAS,EAAE,MAAM,YAAY,EAAE;gBAC/B,YAAY,EAAE,sBAAsB;gBACpC,kEAAkE;gBAClE,qEAAqE;gBACrE,aAAa,EAAE,cAAc;aAC9B,CAAC,CAAC;QACL,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,OAAO,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe,CAAC;YACzE,OAAO,IAAA,+BAAa,EAAC,UAAU,EAAE,OAAO,CAAC,CAAC;QAC5C,CAAC;IACH,CAAC,CACF,CAAC;IAEF,OAAO,CAAC,GAAG,CAGR,qBAAqB,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE;QAC1C,IAAI,CAAC;YACH,MAAM,EAAE,YAAY,EAAE,GAAG,MAAM,MAAM,CAAC,iCAAiC,CAAC,CAAC;YACzE,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,IAAK,EAAyC,CAAC;YACxE,IAAI,IAAI,CAAC,SAAS,KAAK,UAAU,IAAI,IAAI,CAAC,SAAS,KAAK,MAAM,EAAE,CAAC;gBAC/D,OAAO,IAAA,+BAAa,EAAC,YAAY,EAAE,wCAAwC,CAAC,CAAC;YAC/E,CAAC;YACD,OAAO,IAAA,iCAAe,EAAC,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC;QAC5E,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,OAAO,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe,CAAC;YACzE,OAAO,IAAA,+BAAa,EAAC,YAAY,EAAE,OAAO,CAAC,CAAC;QAC9C,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,yEAAyE;IACzE,OAAO,CAAC,GAAG,CACT,uBAAuB,EACvB,KAAK,IAAI,EAAE;QACT,IAAI,CAAC;YACH,MAAM,EAAE,cAAc,EAAE,YAAY,EAAE,SAAS,EAAE,GAAG,MAAM,MAAM,CAC9D,mCAAmC,CACpC,CAAC;YACF,OAAO,IAAA,iCAAe,EAAC;gBACrB,GAAG,CAAC,MAAM,cAAc,EAAE,CAAC;gBAC3B,2DAA2D;gBAC3D,6DAA6D;gBAC7D,yDAAyD;gBACzD,WAAW,EAAE,YAAY;gBACzB,QAAQ,EAAE,SAAS;aACpB,CAAC,CAAC;QACL,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,OAAO,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe,CAAC;YACzE,OAAO,IAAA,+BAAa,EAAC,UAAU,EAAE,OAAO,CAAC,CAAC;QAC5C,CAAC;IACH,CAAC,CACF,CAAC;IAEF,OAAO,CAAC,GAAG,CAGR,uBAAuB,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE;QAC5C,IAAI,CAAC;YACH,MAAM,EAAE,cAAc,EAAE,cAAc,EAAE,iBAAiB,EAAE,GAAG,MAAM,MAAM,CACxE,mCAAmC,CACpC,CAAC;YACF,MAAM,OAAO,GAAG,MAAM,cAAc,EAAE,CAAC;YACvC,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,IAAI,EAAE,CAAC;YAChC,6DAA6D;YAC7D,gEAAgE;YAChE,kDAAkD;YAClD,MAAM,MAAM,GAAG;gBACb,cAAc,EAAE,IAAI,CAAC,cAAc,IAAI,OAAO,CAAC,cAAc;gBAC7D,MAAM,EAAE,EAAE,GAAG,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC,IAAI,CAAC,MAAM,IAAI,EAAE,CAAC,EAAE;aACtD,CAAC;YACF,MAAM,SAAS,GAAG,iBAAiB,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;YAClD,MAAM,cAAc,CAAC,SAAS,CAAC,CAAC;YAChC,OAAO,IAAA,iCAAe,EAAC,SAAS,CAAC,CAAC;QACpC,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,OAAO,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe,CAAC;YACzE,OAAO,IAAA,+BAAa,EAAC,YAAY,EAAE,OAAO,CAAC,CAAC;QAC9C,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,wEAAwE;IACxE,OAAO,CAAC,GAAG,CACT,qBAAqB,EACrB,KAAK,IAAI,EAAE;QACT,IAAI,CAAC;YACH,MAAM,EAAE,kBAAkB,EAAE,GAAG,MAAM,MAAM,CAAC,wBAAwB,CAAC,CAAC;YACtE,OAAO,IAAA,iCAAe,EAAC,MAAM,kBAAkB,EAAE,CAAC,CAAC;QACrD,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,OAAO,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe,CAAC;YACzE,OAAO,IAAA,+BAAa,EAAC,UAAU,EAAE,OAAO,CAAC,CAAC;QAC5C,CAAC;IACH,CAAC,CACF,CAAC;IAEF,OAAO,CAAC,GAAG,CAGR,qBAAqB,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE;QAC1C,IAAI,CAAC;YACH,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,IAAK,EAA2B,CAAC;YAC1D,IAAI,OAAO,IAAI,CAAC,OAAO,KAAK,SAAS,EAAE,CAAC;gBACtC,OAAO,IAAA,+BAAa,EAAC,YAAY,EAAE,2BAA2B,CAAC,CAAC;YAClE,CAAC;YACD,MAAM,EAAE,mBAAmB,EAAE,GAAG,MAAM,MAAM,CAAC,wBAAwB,CAAC,CAAC;YACvE,OAAO,IAAA,iCAAe,EAAC,MAAM,mBAAmB,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC;QAClE,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,OAAO,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe,CAAC;YACzE,OAAO,IAAA,+BAAa,EAAC,YAAY,EAAE,OAAO,CAAC,CAAC;QAC9C,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,wEAAwE;IACxE,OAAO,CAAC,GAAG,CAAiC,mBAAmB,EAAE,KAAK,IAAI,EAAE;QAC1E,IAAI,CAAC;YACH,MAAM,EAAE,cAAc,EAAE,mBAAmB,EAAE,GAAG,MAAM,MAAM,CAC1D,+BAA+B,CAChC,CAAC;YACF,OAAO,IAAA,iCAAe,EAAC;gBACrB,IAAI,EAAE,MAAM,cAAc,EAAE;gBAC5B,YAAY,EAAE,mBAAmB;aAClC,CAAC,CAAC;QACL,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,OAAO,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe,CAAC;YACzE,OAAO,IAAA,+BAAa,EAAC,UAAU,EAAE,OAAO,CAAC,CAAC;QAC5C,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,OAAO,CAAC,GAAG,CAGR,mBAAmB,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE;QACxC,IAAI,CAAC;YACH,MAAM,EAAE,cAAc,EAAE,GAAG,MAAM,MAAM,CAAC,+BAA+B,CAAC,CAAC;YACzE,MAAM,IAAI,GACR,OAAO,CAAC,IAAI,IAAK,EAAiD,CAAC;YACrE,IACE,IAAI,CAAC,IAAI,KAAK,KAAK;gBACnB,IAAI,CAAC,IAAI,KAAK,cAAc;gBAC5B,IAAI,CAAC,IAAI,KAAK,OAAO,EACrB,CAAC;gBACD,OAAO,IAAA,+BAAa,EAClB,YAAY,EACZ,+CAA+C,CAChD,CAAC;YACJ,CAAC;YACD,OAAO,IAAA,iCAAe,EAAC,EAAE,IAAI,EAAE,MAAM,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACpE,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,OAAO,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe,CAAC;YACzE,OAAO,IAAA,+BAAa,EAAC,YAAY,EAAE,OAAO,CAAC,CAAC;QAC9C,CAAC;IACH,CAAC,CAAC,CAAC;AACL,CAAC;AAED,SAAgB,oBAAoB,CAAC,OAAwB;IAC3D,OAAO,CAAC,GAAG,CAA+C,UAAU,EAAE,KAAK,IAAI,EAAE;QAC/E,IAAI,CAAC;YACH,MAAM,KAAK,GAAG,MAAM,kBAAO,CAAC,IAAI,EAAE,CAAC;YACnC,OAAO,IAAA,iCAAe,EAAC,IAAA,8BAAY,EAAC,KAAK,CAAC,CAAC,CAAC;QAC9C,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,OAAO,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe,CAAC;YACzE,OAAO,IAAA,+BAAa,EAAC,UAAU,EAAE,OAAO,CAAC,CAAC;QAC5C,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,OAAO,CAAC,GAAG,CAIR,oBAAoB,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,EAAE;QAChD,IAAI,CAAC;YACH,MAAM,EAAE,QAAQ,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC;YACpC,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC;YAC3C,IAAI,CAAC,KAAK,IAAI,CAAC,IAAI,EAAE,CAAC;gBACpB,OAAO,IAAA,2BAAS,EAAC,KAAK,EAAE,YAAY,EAAE,6BAA6B,CAAC,CAAC;YACvE,CAAC;YACD,MAAM,kBAAO,CAAC,GAAG,CAAC,QAAQ,EAAE,IAAsC,EAAE,KAAK,EAAE,IAAI,CAAC,CAAC;YACjF,OAAO,IAAA,iCAAe,EAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,UAAU,EAAE,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;QACrE,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,OAAO,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe,CAAC;YACzE,OAAO,IAAA,+BAAa,EAAC,UAAU,EAAE,OAAO,CAAC,CAAC;QAC5C,CAAC;IACH,CAAC,CAAC,CAAC;IAEH;;;;;OAKG;IACH,OAAO,CAAC,MAAM,CAGX,oBAAoB,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE;QACzC,IAAI,CAAC;YACH,MAAM,EAAE,QAAQ,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC;YACpC,MAAM,OAAO,GAAG,MAAM,kBAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;YAC/C,OAAO,IAAA,iCAAe,EAAC,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC,CAAC;QAChD,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,OAAO,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe,CAAC;YACzE,OAAO,IAAA,+BAAa,EAAC,UAAU,EAAE,OAAO,CAAC,CAAC;QAC5C,CAAC;IACH,CAAC,CAAC,CAAC;AACL,CAAC"}
|