@revisium/orchestrator 0.1.0-alpha.6 → 0.1.0-alpha.8
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/cli/commands/doctor-report.js +34 -3
- package/dist/cli/commands/doctor-report.js.map +1 -1
- package/dist/cli/commands/lifecycle.js +125 -4
- package/dist/cli/commands/lifecycle.js.map +1 -1
- package/dist/cli/commands/process-tree.js +45 -0
- package/dist/cli/commands/process-tree.js.map +1 -0
- package/dist/host/daemon.js +21 -3
- package/dist/host/daemon.js.map +1 -1
- package/dist/host/dbos-identity.js +42 -0
- package/dist/host/dbos-identity.js.map +1 -0
- package/dist/host/ensure-host.js +18 -7
- package/dist/host/ensure-host.js.map +1 -1
- package/dist/host/host-runtime.js +20 -0
- package/dist/host/host-runtime.js.map +1 -1
- package/dist/host/queue-ownership.js +70 -0
- package/dist/host/queue-ownership.js.map +1 -0
- package/dist/host/queue-poller-census.js +47 -0
- package/dist/host/queue-poller-census.js.map +1 -0
- package/dist/worker/claude-code-runner.js +59 -4
- package/dist/worker/claude-code-runner.js.map +1 -1
- package/dist/worker/result-envelope.js +46 -0
- package/dist/worker/result-envelope.js.map +1 -1
- package/package.json +1 -1
|
@@ -9,11 +9,42 @@
|
|
|
9
9
|
* inside the process that should have removed it). The two doctors are complementary, not duplicates.
|
|
10
10
|
*/
|
|
11
11
|
export function buildDoctorReport(o) {
|
|
12
|
-
|
|
12
|
+
const issues = [];
|
|
13
|
+
// Daemon-zoo signal: a process not tracked by host.json/runtime.json holds a profile port. The
|
|
14
|
+
// advisory-lock singleton (slice 139) stops new duplicates, but pre-existing/orphan ones must be seen.
|
|
15
|
+
for (const owner of o.unexpectedPortOwners ?? []) {
|
|
16
|
+
issues.push(`Unexpected process (pid ${owner.pid}) on the ${owner.label} port ${owner.port} — an untracked or ` +
|
|
17
|
+
'duplicate daemon. Run `revo stop` to reap the profile, then `revo start`.');
|
|
18
|
+
}
|
|
19
|
+
// Stale-code daemon: the live daemon is a different build than this CLI/installation.
|
|
20
|
+
if (o.versionMismatch && o.versionMismatch.running !== o.versionMismatch.current) {
|
|
21
|
+
issues.push(`Running daemon is version ${o.versionMismatch.running} but this build is ${o.versionMismatch.current} — ` +
|
|
22
|
+
'run `revo restart` to replace the stale daemon.');
|
|
23
|
+
}
|
|
24
|
+
// Rogue queue pollers: a legacy/duplicate daemon connected to the dbos DB under a foreign executor id.
|
|
25
|
+
// The advisory lock can't coordinate it and port-based stop can't see it; reap the stale process.
|
|
26
|
+
const rogues = o.queuePollerRogues ?? [];
|
|
27
|
+
if (rogues.length > 0) {
|
|
28
|
+
const byExecutor = new Map();
|
|
29
|
+
for (const r of rogues)
|
|
30
|
+
byExecutor.set(r.executorId, [...(byExecutor.get(r.executorId) ?? []), r.pid]);
|
|
31
|
+
for (const [executorId, pids] of byExecutor) {
|
|
32
|
+
issues.push(`DBOS queue database has ${pids.length} connection(s) from a foreign executor "${executorId}" ` +
|
|
33
|
+
`(backend pid${pids.length === 1 ? '' : 's'} ${pids.join(', ')}) — a stale/duplicate daemon polling ` +
|
|
34
|
+
'dev-tasks. The advisory lock cannot evict an outbound poller; reap the stale revo process ' +
|
|
35
|
+
'(`pkill -f "revo mcp"` / `pkill -f "revo __daemon"`), then `revo restart`.');
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
else if (o.rogueCensusUnavailable) {
|
|
39
|
+
issues.push('Could not census the DBOS queue database for duplicate pollers (DB unreachable or insufficient ' +
|
|
40
|
+
'privilege) — single-ownership could not be verified.');
|
|
41
|
+
}
|
|
42
|
+
// Nothing recorded on either tier → the stack is simply down (unless a rogue process was flagged above).
|
|
13
43
|
if (!o.host.present && !o.standalone.present) {
|
|
14
|
-
|
|
44
|
+
if (issues.length === 0)
|
|
45
|
+
return { ok: false, issues: ['Stack is not running. Run `revo start`.'] };
|
|
46
|
+
return { ok: false, issues };
|
|
15
47
|
}
|
|
16
|
-
const issues = [];
|
|
17
48
|
// Host tier — the single DBOS owner and the GraphQL/MCP front door.
|
|
18
49
|
if (o.host.present && !o.host.alive) {
|
|
19
50
|
issues.push(`Stale host.json: recorded pid ${o.host.pid} is not alive. Run \`revo stop\` to clear it, then \`revo start\`.`);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"doctor-report.js","sourceRoot":"","sources":["../../../src/cli/commands/doctor-report.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;
|
|
1
|
+
{"version":3,"file":"doctor-report.js","sourceRoot":"","sources":["../../../src/cli/commands/doctor-report.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,10 +1,48 @@
|
|
|
1
|
+
import pg from 'pg';
|
|
1
2
|
import { closeSync, existsSync, openSync, readSync, statSync } from 'node:fs';
|
|
3
|
+
import { execFileSync } from 'node:child_process';
|
|
2
4
|
import { baseUrl, getConfig, isAlive, isHealthy, readRuntime, removeRuntime, } from '../config.js';
|
|
3
5
|
import { killTree, tailLines, waitForExit } from './revisium-helpers.js';
|
|
4
6
|
import { buildDoctorReport } from './doctor-report.js';
|
|
7
|
+
import { isPidWithin } from './process-tree.js';
|
|
8
|
+
import { classifyQueuePollerRogues } from '../../host/queue-poller-census.js';
|
|
9
|
+
import { dbosExecutorId } from '../../host/dbos-identity.js';
|
|
10
|
+
import { resolveDbosDbName } from '../../engine/ensure-postgres.js';
|
|
5
11
|
import { ensureHost, expectedGraphqlPort, isGraphqlHealthy } from '../../host/ensure-host.js';
|
|
6
12
|
import { runHostDaemon } from '../../host/daemon.js';
|
|
7
|
-
import { isHostRunning, readHostRuntime, removeHostRuntime } from '../../host/host-runtime.js';
|
|
13
|
+
import { hostCodeVersion, isHostRunning, readHostRuntime, removeHostRuntime, } from '../../host/host-runtime.js';
|
|
14
|
+
// Resolve lsof to a FIXED absolute path — never via $PATH (S4036: a writable PATH entry could shadow
|
|
15
|
+
// the binary). null if lsof isn't installed, in which case port-owner detection/reaping degrade to no-op.
|
|
16
|
+
const LSOF_PATH = ['/usr/sbin/lsof', '/usr/bin/lsof', '/bin/lsof'].find((p) => existsSync(p)) ?? null;
|
|
17
|
+
/** PID listening on a local TCP port (via lsof), or null. Best-effort — null on any failure. */
|
|
18
|
+
function listenerPid(port) {
|
|
19
|
+
if (LSOF_PATH === null)
|
|
20
|
+
return null;
|
|
21
|
+
try {
|
|
22
|
+
const out = execFileSync(LSOF_PATH, ['-nP', `-tiTCP:${port}`, '-sTCP:LISTEN'], {
|
|
23
|
+
encoding: 'utf8',
|
|
24
|
+
stdio: ['ignore', 'pipe', 'ignore'],
|
|
25
|
+
}).trim();
|
|
26
|
+
const pid = Number(out.split(/\r?\n/)[0]);
|
|
27
|
+
return Number.isInteger(pid) && pid > 0 ? pid : null;
|
|
28
|
+
}
|
|
29
|
+
catch {
|
|
30
|
+
return null; // no listener / lsof error
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
/** The four ports a profile's stack uses (host GraphQL+MCP, standalone HTTP+Postgres), deduped. */
|
|
34
|
+
function profilePortList(host, standalone) {
|
|
35
|
+
const cfg = getConfig();
|
|
36
|
+
const gql = host?.graphqlPort ?? expectedGraphqlPort();
|
|
37
|
+
return [
|
|
38
|
+
...new Set([
|
|
39
|
+
gql,
|
|
40
|
+
host?.mcpPort ?? gql + 1,
|
|
41
|
+
standalone?.httpPort ?? cfg.preferredPort,
|
|
42
|
+
standalone?.pgPort ?? cfg.preferredPgPort,
|
|
43
|
+
]),
|
|
44
|
+
];
|
|
45
|
+
}
|
|
8
46
|
const DEFAULT_LOG_LINES = 50;
|
|
9
47
|
/** A --profile flag sets REVO_PROFILE so the resolved profile flows to the daemon child via env. */
|
|
10
48
|
function applyProfileEnv(options) {
|
|
@@ -43,21 +81,36 @@ async function stopProcess(pid) {
|
|
|
43
81
|
/** `revo stop` — stop the host daemon first (it owns DBOS), then the standalone Revisium daemon. */
|
|
44
82
|
async function stopStack(options) {
|
|
45
83
|
applyProfileEnv(options);
|
|
84
|
+
const host = readHostRuntime();
|
|
85
|
+
const standalone = readRuntime();
|
|
86
|
+
const ports = profilePortList(host, standalone);
|
|
46
87
|
let stopped = false;
|
|
47
88
|
// Host first (it owns DBOS); then the standalone daemon underneath it.
|
|
48
|
-
const host = readHostRuntime();
|
|
49
89
|
if (host && isAlive(host.pid)) {
|
|
50
90
|
await stopProcess(host.pid);
|
|
51
91
|
stopped = true;
|
|
52
92
|
}
|
|
53
93
|
removeHostRuntime();
|
|
54
|
-
const standalone = readRuntime();
|
|
55
94
|
if (standalone && isAlive(standalone.pid)) {
|
|
56
95
|
await stopProcess(standalone.pid);
|
|
57
96
|
stopped = true;
|
|
58
97
|
}
|
|
59
98
|
removeRuntime();
|
|
60
|
-
|
|
99
|
+
// Reap any orphan/duplicate still holding a profile port (slice 139) — a daemon/standalone NOT
|
|
100
|
+
// tracked by host.json/runtime.json. Without this, `revo stop` leaves a zoo that can silently serve
|
|
101
|
+
// runs off the shared DBOS queue.
|
|
102
|
+
let reaped = 0;
|
|
103
|
+
for (const port of ports) {
|
|
104
|
+
const pid = listenerPid(port);
|
|
105
|
+
if (pid !== null && isAlive(pid)) {
|
|
106
|
+
await stopProcess(pid);
|
|
107
|
+
reaped += 1;
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
if (reaped > 0)
|
|
111
|
+
console.log(`stopped (reaped ${reaped} orphan process${reaped === 1 ? '' : 'es'})`);
|
|
112
|
+
else
|
|
113
|
+
console.log(stopped ? 'stopped' : 'not running');
|
|
61
114
|
}
|
|
62
115
|
/** `revo status` — summarize the stack: profile, data dir, host daemon, and Revisium health. */
|
|
63
116
|
async function statusStack(options) {
|
|
@@ -89,6 +142,36 @@ async function restartStack(options) {
|
|
|
89
142
|
await stopStack(options);
|
|
90
143
|
await startStack(options);
|
|
91
144
|
}
|
|
145
|
+
/**
|
|
146
|
+
* Census the profile's `dbos` database for FOREIGN DBOS queue pollers (slice 140) — a legacy/duplicate
|
|
147
|
+
* daemon polling `dev-tasks` under an executor id that is not this profile's pinned owner. Connects to
|
|
148
|
+
* the maintenance `postgres` db (pg_stat_activity is cluster-wide) and inspects `dbos_transact_%`
|
|
149
|
+
* connections on the dbos db. Best-effort: returns `unavailable:true` when the DB is unreachable or the
|
|
150
|
+
* role can't see other backends, so `doctor` warns rather than falsely reporting "clean".
|
|
151
|
+
*/
|
|
152
|
+
async function censusQueuePollers(profile, pgPort) {
|
|
153
|
+
const client = new pg.Client(`postgresql://revisium:password@localhost:${pgPort}/postgres`);
|
|
154
|
+
try {
|
|
155
|
+
await client.connect();
|
|
156
|
+
// Without privilege to see OTHER backends, pg_stat_activity hides their application_name → a silent
|
|
157
|
+
// empty roster. Superuser OR pg_read_all_stats membership both suffice; anything less is reported as
|
|
158
|
+
// "unavailable", never as "no rogues".
|
|
159
|
+
const cap = await client.query(`SELECT (current_setting('is_superuser') = 'on'
|
|
160
|
+
OR pg_has_role(current_user, 'pg_read_all_stats', 'MEMBER')) AS can_see`);
|
|
161
|
+
if (cap.rows[0]?.['can_see'] !== true)
|
|
162
|
+
return { rogues: [], unavailable: true };
|
|
163
|
+
const res = await client.query(`SELECT pid, application_name AS app, backend_start AS started
|
|
164
|
+
FROM pg_stat_activity WHERE datname = $1 AND application_name LIKE 'dbos_transact_%'`, [resolveDbosDbName()]);
|
|
165
|
+
const rogues = classifyQueuePollerRogues(res.rows.map((r) => ({ pid: Number(r['pid']), applicationName: String(r['app']), backendStart: r['started'] })), dbosExecutorId(profile)).map((r) => ({ pid: r.pid, executorId: r.executorId, applicationName: r.applicationName }));
|
|
166
|
+
return { rogues, unavailable: false };
|
|
167
|
+
}
|
|
168
|
+
catch {
|
|
169
|
+
return { rogues: [], unavailable: true };
|
|
170
|
+
}
|
|
171
|
+
finally {
|
|
172
|
+
await client.end().catch(() => undefined);
|
|
173
|
+
}
|
|
174
|
+
}
|
|
92
175
|
/** `revo doctor` — diagnose the stack as a pure client: process/port/profile/stale-file health. */
|
|
93
176
|
async function doctorStack(options) {
|
|
94
177
|
applyProfileEnv(options);
|
|
@@ -99,6 +182,40 @@ async function doctorStack(options) {
|
|
|
99
182
|
const standalone = readRuntime();
|
|
100
183
|
const standaloneAlive = standalone !== null && isAlive(standalone.pid);
|
|
101
184
|
const standaloneHealthy = standalone !== null && standaloneAlive && (await isHealthy(standalone.httpPort));
|
|
185
|
+
// Detect untracked/duplicate daemons on the profile ports + a stale-version daemon (slice 139): a
|
|
186
|
+
// listener whose pid isn't the tracked host/standalone is an orphan or a second daemon (the zoo).
|
|
187
|
+
const gql = host?.graphqlPort ?? expectedGraphqlPort();
|
|
188
|
+
const portChecks = [
|
|
189
|
+
{ label: 'GraphQL', port: gql, expected: host?.pid ?? null },
|
|
190
|
+
{ label: 'MCP', port: host?.mcpPort ?? gql + 1, expected: host?.pid ?? null },
|
|
191
|
+
{ label: 'standalone HTTP', port: standalone?.httpPort ?? getConfig().preferredPort, expected: standalone?.pid ?? null },
|
|
192
|
+
{ label: 'Postgres', port: standalone?.pgPort ?? getConfig().preferredPgPort, expected: standalone?.pid ?? null },
|
|
193
|
+
];
|
|
194
|
+
const unexpectedPortOwners = [];
|
|
195
|
+
for (const check of portChecks) {
|
|
196
|
+
const pid = listenerPid(check.port);
|
|
197
|
+
if (pid === null)
|
|
198
|
+
continue;
|
|
199
|
+
// Legitimate = the tracked pid ITSELF or one of its descendants. The standalone tier is a process
|
|
200
|
+
// tree (launcher → HTTP-binding worker → embedded Postgres), so the actual port owner is usually a
|
|
201
|
+
// child of the tracked launcher pid, not the launcher itself. Exact equality here mis-flagged the
|
|
202
|
+
// healthy stack as a rogue daemon (dogfood, alpha.7). Only a listener OUTSIDE the tracked tree —
|
|
203
|
+
// or any listener when nothing is tracked (expected === null) — is a real orphan/second daemon.
|
|
204
|
+
const owned = check.expected !== null && isPidWithin(pid, new Set([check.expected]));
|
|
205
|
+
if (!owned) {
|
|
206
|
+
unexpectedPortOwners.push({ label: check.label, port: check.port, pid });
|
|
207
|
+
}
|
|
208
|
+
}
|
|
209
|
+
const versionMismatch = host?.version !== undefined ? { running: host.version, current: hostCodeVersion() } : undefined;
|
|
210
|
+
// Rogue queue-poller census — only when the standalone (and thus its Postgres) is alive; a foreign
|
|
211
|
+
// executor connected to the dbos DB is a legacy/duplicate daemon the lock can't stop (slice 140).
|
|
212
|
+
let queuePollerRogues;
|
|
213
|
+
let rogueCensusUnavailable;
|
|
214
|
+
if (standalone && standaloneAlive) {
|
|
215
|
+
const census = await censusQueuePollers(profile, standalone.pgPort);
|
|
216
|
+
queuePollerRogues = census.rogues;
|
|
217
|
+
rogueCensusUnavailable = census.unavailable;
|
|
218
|
+
}
|
|
102
219
|
const report = buildDoctorReport({
|
|
103
220
|
host: {
|
|
104
221
|
present: host !== null,
|
|
@@ -114,6 +231,10 @@ async function doctorStack(options) {
|
|
|
114
231
|
pid: standalone?.pid ?? null,
|
|
115
232
|
port: standalone?.httpPort ?? null,
|
|
116
233
|
},
|
|
234
|
+
unexpectedPortOwners,
|
|
235
|
+
versionMismatch,
|
|
236
|
+
queuePollerRogues,
|
|
237
|
+
rogueCensusUnavailable,
|
|
117
238
|
});
|
|
118
239
|
console.log(`Profile: ${profile}`);
|
|
119
240
|
console.log(`Data dir: ${dataDir}`);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"lifecycle.js","sourceRoot":"","sources":["../../../src/cli/commands/lifecycle.ts"],"names":[],"mappings":"AAUA,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAC9E,OAAO,EACL,OAAO,EACP,SAAS,EACT,OAAO,EACP,SAAS,EACT,WAAW,EACX,aAAa,GACd,MAAM,cAAc,CAAC;AACtB,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AACzE,OAAO,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AACvD,OAAO,EAAE,UAAU,EAAE,mBAAmB,EAAE,gBAAgB,EAAE,MAAM,2BAA2B,CAAC;AAC9F,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,aAAa,EAAE,eAAe,EAAE,iBAAiB,EAAE,MAAM,4BAA4B,CAAC;AAE/F,MAAM,iBAAiB,GAAG,EAAE,CAAC;AAI7B,oGAAoG;AACpG,SAAS,eAAe,CAAC,OAAuB;IAC9C,IAAI,OAAO,CAAC,OAAO;QAAE,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC,GAAG,OAAO,CAAC,OAAO,CAAC;AACrE,CAAC;AAED,kGAAkG;AAClG,KAAK,UAAU,UAAU,CAAC,OAAuB;IAC/C,eAAe,CAAC,OAAO,CAAC,CAAC;IACzB,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,GAAG,SAAS,EAAE,CAAC;IACzC,IAAI,CAAC;QACH,MAAM,EAAE,OAAO,EAAE,cAAc,EAAE,GAAG,MAAM,UAAU,EAAE,CAAC;QACvD,MAAM,UAAU,GAAG,WAAW,EAAE,CAAC;QACjC,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC,CAAC,iCAAiC,OAAO,GAAG,CAAC,CAAC,CAAC,yBAAyB,OAAO,GAAG,CAAC,CAAC;QAChH,OAAO,CAAC,GAAG,CAAC,oBAAoB,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC;QAC/C,OAAO,CAAC,GAAG,CAAC,YAAY,OAAO,CAAC,OAAO,CAAC,WAAW,CAAC,UAAU,CAAC,CAAC;QAChE,IAAI,UAAU;YAAE,OAAO,CAAC,GAAG,CAAC,aAAa,OAAO,CAAC,UAAU,CAAC,QAAQ,CAAC,QAAQ,UAAU,CAAC,MAAM,GAAG,CAAC,CAAC;QACnG,OAAO,CAAC,GAAG,CAAC,aAAa,OAAO,EAAE,CAAC,CAAC;IACtC,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,CAAC,KAAK,CAAC,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC;QAChE,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;IACvB,CAAC;AACH,CAAC;AAED,iGAAiG;AACjG,KAAK,UAAU,WAAW,CAAC,GAAW;IACpC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC;QAAE,OAAO;IAC1B,QAAQ,CAAC,GAAG,EAAE,SAAS,CAAC,CAAC;IACzB,IAAI,CAAC,CAAC,MAAM,WAAW,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC,EAAE,CAAC;QACtC,QAAQ,CAAC,GAAG,EAAE,SAAS,CAAC,CAAC;QACzB,MAAM,WAAW,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;IAChC,CAAC;AACH,CAAC;AAED,oGAAoG;AACpG,KAAK,UAAU,SAAS,CAAC,OAAuB;IAC9C,eAAe,CAAC,OAAO,CAAC,CAAC;IACzB,IAAI,OAAO,GAAG,KAAK,CAAC;IAEpB,uEAAuE;IACvE,MAAM,IAAI,GAAG,eAAe,EAAE,CAAC;IAC/B,IAAI,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;QAC9B,MAAM,WAAW,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAC5B,OAAO,GAAG,IAAI,CAAC;IACjB,CAAC;IACD,iBAAiB,EAAE,CAAC;IAEpB,MAAM,UAAU,GAAG,WAAW,EAAE,CAAC;IACjC,IAAI,UAAU,IAAI,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;QAC1C,MAAM,WAAW,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC;QAClC,OAAO,GAAG,IAAI,CAAC;IACjB,CAAC;IACD,aAAa,EAAE,CAAC;IAEhB,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC;AACnD,CAAC;AAED,gGAAgG;AAChG,KAAK,UAAU,WAAW,CAAC,OAAuB;IAChD,eAAe,CAAC,OAAO,CAAC,CAAC;IACzB,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,GAAG,SAAS,EAAE,CAAC;IACzC,OAAO,CAAC,GAAG,CAAC,YAAY,OAAO,EAAE,CAAC,CAAC;IACnC,OAAO,CAAC,GAAG,CAAC,aAAa,OAAO,EAAE,CAAC,CAAC;IAEpC,MAAM,IAAI,GAAG,eAAe,EAAE,CAAC;IAC/B,IAAI,IAAI,IAAI,aAAa,EAAE,EAAE,CAAC;QAC5B,MAAM,OAAO,GAAG,MAAM,gBAAgB,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;QACzD,OAAO,CAAC,GAAG,CAAC,6BAA6B,IAAI,CAAC,GAAG,eAAe,OAAO,CAAC,IAAI,CAAC,WAAW,CAAC,YAAY,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS,EAAE,CAAC,CAAC;IACrI,CAAC;SAAM,CAAC;QACN,OAAO,CAAC,GAAG,CAAC,sCAAsC,mBAAmB,EAAE,GAAG,CAAC,CAAC;IAC9E,CAAC;IAED,MAAM,UAAU,GAAG,WAAW,EAAE,CAAC;IACjC,IAAI,UAAU,IAAI,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;QAC1C,MAAM,OAAO,GAAG,MAAM,SAAS,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC;QACrD,OAAO,CAAC,GAAG,CAAC,0BAA0B,UAAU,CAAC,GAAG,QAAQ,OAAO,CAAC,UAAU,CAAC,QAAQ,CAAC,OAAO,UAAU,CAAC,MAAM,aAAa,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS,EAAE,CAAC,CAAC;IAC7J,CAAC;SAAM,CAAC;QACN,OAAO,CAAC,GAAG,CAAC,mBAAmB,CAAC,CAAC;IACnC,CAAC;AACH,CAAC;AAED,sGAAsG;AACtG,KAAK,UAAU,YAAY,CAAC,OAAuB;IACjD,eAAe,CAAC,OAAO,CAAC,CAAC;IACzB,OAAO,CAAC,GAAG,CAAC,wBAAwB,CAAC,CAAC;IACtC,MAAM,SAAS,CAAC,OAAO,CAAC,CAAC;IACzB,MAAM,UAAU,CAAC,OAAO,CAAC,CAAC;AAC5B,CAAC;AAED,mGAAmG;AACnG,KAAK,UAAU,WAAW,CAAC,OAAuB;IAChD,eAAe,CAAC,OAAO,CAAC,CAAC;IACzB,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,GAAG,SAAS,EAAE,CAAC;IAEzC,MAAM,IAAI,GAAG,eAAe,EAAE,CAAC;IAC/B,MAAM,SAAS,GAAG,IAAI,KAAK,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IACrD,MAAM,WAAW,GAAG,IAAI,KAAK,IAAI,IAAI,SAAS,IAAI,CAAC,MAAM,gBAAgB,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC;IAE7F,MAAM,UAAU,GAAG,WAAW,EAAE,CAAC;IACjC,MAAM,eAAe,GAAG,UAAU,KAAK,IAAI,IAAI,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC;IACvE,MAAM,iBAAiB,GAAG,UAAU,KAAK,IAAI,IAAI,eAAe,IAAI,CAAC,MAAM,SAAS,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC,CAAC;IAE3G,MAAM,MAAM,GAAG,iBAAiB,CAAC;QAC/B,IAAI,EAAE;YACJ,OAAO,EAAE,IAAI,KAAK,IAAI;YACtB,KAAK,EAAE,SAAS;YAChB,OAAO,EAAE,WAAW;YACpB,GAAG,EAAE,IAAI,EAAE,GAAG,IAAI,IAAI;YACtB,IAAI,EAAE,IAAI,EAAE,WAAW,IAAI,IAAI;SAChC;QACD,UAAU,EAAE;YACV,OAAO,EAAE,UAAU,KAAK,IAAI;YAC5B,KAAK,EAAE,eAAe;YACtB,OAAO,EAAE,iBAAiB;YAC1B,GAAG,EAAE,UAAU,EAAE,GAAG,IAAI,IAAI;YAC5B,IAAI,EAAE,UAAU,EAAE,QAAQ,IAAI,IAAI;SACnC;KACF,CAAC,CAAC;IAEH,OAAO,CAAC,GAAG,CAAC,YAAY,OAAO,EAAE,CAAC,CAAC;IACnC,OAAO,CAAC,GAAG,CAAC,aAAa,OAAO,EAAE,CAAC,CAAC;IACpC,IAAI,MAAM,CAAC,EAAE,EAAE,CAAC;QACd,OAAO,CAAC,GAAG,CAAC,wBAAwB,CAAC,CAAC;QACtC,OAAO;IACT,CAAC;IACD,KAAK,MAAM,KAAK,IAAI,MAAM,CAAC,MAAM;QAAE,OAAO,CAAC,GAAG,CAAC,KAAK,KAAK,EAAE,CAAC,CAAC;IAC7D,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;AACvB,CAAC;AAKD,iGAAiG;AACjG,SAAS,iBAAiB,CAAC,MAA0B;IACnD,MAAM,EAAE,OAAO,EAAE,WAAW,EAAE,GAAG,SAAS,EAAE,CAAC;IAC7C,MAAM,IAAI,GAAc,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,WAAW,EAAE,CAAC;IAC7D,MAAM,UAAU,GAAc,EAAE,KAAK,EAAE,YAAY,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC;IACrE,IAAI,MAAM,KAAK,MAAM;QAAE,OAAO,CAAC,IAAI,CAAC,CAAC;IACrC,IAAI,MAAM,KAAK,YAAY;QAAE,OAAO,CAAC,UAAU,CAAC,CAAC;IACjD,OAAO,CAAC,IAAI,EAAE,UAAU,CAAC,CAAC;AAC5B,CAAC;AAED,oGAAoG;AACpG,KAAK,UAAU,SAAS,CAAC,MAA0B,EAAE,OAAoB;IACvE,eAAe,CAAC,OAAO,CAAC,CAAC;IACzB,IAAI,MAAM,KAAK,SAAS,IAAI,MAAM,KAAK,MAAM,IAAI,MAAM,KAAK,YAAY,EAAE,CAAC;QACzE,OAAO,CAAC,KAAK,CAAC,wBAAwB,MAAM,gCAAgC,CAAC,CAAC;QAC9E,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;QACrB,OAAO;IACT,CAAC;IACD,MAAM,SAAS,GAAG,MAAM,CAAC,OAAO,CAAC,KAAK,IAAI,iBAAiB,CAAC,CAAC;IAC7D,MAAM,KAAK,GAAG,MAAM,CAAC,SAAS,CAAC,SAAS,CAAC,IAAI,SAAS,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,iBAAiB,CAAC;IAC3F,MAAM,OAAO,GAAG,iBAAiB,CAAC,MAAM,CAAC,CAAC;IAE1C,KAAK,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,IAAI,OAAO,EAAE,CAAC;QACtC,MAAM,IAAI,GAAG,SAAS,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;QACpC,OAAO,CAAC,GAAG,CAAC,QAAQ,KAAK,KAAK,IAAI,MAAM,CAAC,CAAC;QAC1C,OAAO,CAAC,GAAG,CAAC,IAAI,KAAK,EAAE,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;QACjD,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAClB,CAAC;IAED,IAAI,OAAO,CAAC,MAAM;QAAE,MAAM,UAAU,CAAC,OAAO,CAAC,CAAC;AAChD,CAAC;AAED;;;;GAIG;AACH,KAAK,UAAU,UAAU,CAAC,OAAoB;IAC5C,MAAM,OAAO,GAAG,IAAI,GAAG,EAAkB,CAAC;IAC1C,KAAK,MAAM,EAAE,IAAI,EAAE,IAAI,OAAO;QAAE,OAAO,CAAC,GAAG,CAAC,IAAI,EAAE,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAE9F,SAAS,CAAC;QACR,KAAK,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,IAAI,OAAO,EAAE,CAAC;YACtC,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC;gBAAE,SAAS;YAChC,MAAM,IAAI,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC;YACjC,MAAM,IAAI,GAAG,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACpC,IAAI,IAAI,GAAG,IAAI,EAAE,CAAC;gBAChB,MAAM,EAAE,GAAG,QAAQ,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;gBAC/B,IAAI,CAAC;oBACH,MAAM,GAAG,GAAG,MAAM,CAAC,KAAK,CAAC,IAAI,GAAG,IAAI,CAAC,CAAC;oBACtC,QAAQ,CAAC,EAAE,EAAE,GAAG,EAAE,CAAC,EAAE,GAAG,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;oBACvC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,WAAW,CAAC,KAAK,EAAE,GAAG,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;gBACjE,CAAC;wBAAS,CAAC;oBACT,SAAS,CAAC,EAAE,CAAC,CAAC;gBAChB,CAAC;YACH,CAAC;YACD,OAAO,CAAC,GAAG,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;QAC1B,CAAC;QACD,MAAM,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC,CAAC;IAC3D,CAAC;AACH,CAAC;AAED,wGAAwG;AACxG,SAAS,WAAW,CAAC,KAAa,EAAE,KAAa;IAC/C,OAAO,KAAK;SACT,KAAK,CAAC,IAAI,CAAC;SACX,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,IAAI,KAAK,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,KAAK,KAAK,IAAI,EAAE,CAAC,CAAC;SAC1D,IAAI,CAAC,IAAI,CAAC,CAAC;AAChB,CAAC;AAED,kHAAkH;AAClH,MAAM,UAAU,iBAAiB,CAAC,OAAgB;IAChD,OAAO;SACJ,OAAO,CAAC,OAAO,CAAC;SAChB,WAAW,CAAC,0DAA0D,CAAC;SACvE,MAAM,CAAC,kBAAkB,EAAE,+BAA+B,CAAC;SAC3D,MAAM,CAAC,CAAC,OAAuB,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,CAAC;IAE5D,OAAO;SACJ,OAAO,CAAC,MAAM,CAAC;SACf,WAAW,CAAC,0DAA0D,CAAC;SACvE,MAAM,CAAC,kBAAkB,EAAE,+BAA+B,CAAC;SAC3D,MAAM,CAAC,CAAC,OAAuB,EAAE,EAAE,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC;IAE3D,OAAO;SACJ,OAAO,CAAC,QAAQ,CAAC;SACjB,WAAW,CAAC,yDAAyD,CAAC;SACtE,MAAM,CAAC,kBAAkB,EAAE,+BAA+B,CAAC;SAC3D,MAAM,CAAC,CAAC,OAAuB,EAAE,EAAE,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC,CAAC;IAE7D,OAAO;SACJ,OAAO,CAAC,SAAS,CAAC;SAClB,WAAW,CAAC,2CAA2C,CAAC;SACxD,MAAM,CAAC,kBAAkB,EAAE,+BAA+B,CAAC;SAC3D,MAAM,CAAC,CAAC,OAAuB,EAAE,EAAE,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC,CAAC;IAE9D,OAAO;SACJ,OAAO,CAAC,QAAQ,CAAC;SACjB,WAAW,CAAC,uDAAuD,CAAC;SACpE,MAAM,CAAC,kBAAkB,EAAE,+BAA+B,CAAC;SAC3D,MAAM,CAAC,CAAC,OAAuB,EAAE,EAAE,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC,CAAC;IAE7D,OAAO;SACJ,OAAO,CAAC,eAAe,CAAC;SACxB,WAAW,CAAC,0DAA0D,CAAC;SACvE,MAAM,CAAC,kBAAkB,EAAE,+BAA+B,CAAC;SAC3D,MAAM,CAAC,qBAAqB,EAAE,4BAA4B,EAAE,MAAM,CAAC,iBAAiB,CAAC,CAAC;SACtF,MAAM,CAAC,cAAc,EAAE,yCAAyC,CAAC;SACjE,MAAM,CAAC,CAAC,MAA0B,EAAE,OAAoB,EAAE,EAAE,CAAC,SAAS,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;IAE5F,8FAA8F;IAC9F,OAAO;SACJ,OAAO,CAAC,UAAU,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC;SACrC,WAAW,CAAC,4EAA4E,CAAC;SACzF,MAAM,CAAC,GAAG,EAAE,CAAC,aAAa,EAAE,CAAC,CAAC;AACnC,CAAC"}
|
|
1
|
+
{"version":3,"file":"lifecycle.js","sourceRoot":"","sources":["../../../src/cli/commands/lifecycle.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Process-tree ancestry — used by `revo doctor` to decide whether a port's listener belongs to the
|
|
3
|
+
* tracked stack. A profile's standalone tier is NOT a single pid: the tracked launcher forks a worker
|
|
4
|
+
* that binds the HTTP port and spawns embedded Postgres, so the actual port owners are *descendants*
|
|
5
|
+
* of the tracked pid. Exact-pid equality therefore mis-flags the legitimate stack as a rogue daemon;
|
|
6
|
+
* ancestry-walking is the correct test.
|
|
7
|
+
*/
|
|
8
|
+
import { execFileSync } from 'node:child_process';
|
|
9
|
+
import { existsSync } from 'node:fs';
|
|
10
|
+
// Resolve ps to a FIXED absolute path — never via $PATH (S4036: a writable PATH entry could shadow
|
|
11
|
+
// the binary). null if ps is unavailable, in which case ancestry checks degrade to "not within".
|
|
12
|
+
const PS_PATH = ['/bin/ps', '/usr/bin/ps'].find((p) => existsSync(p)) ?? null;
|
|
13
|
+
/** Parent pid of `pid` via ps, or null (no such process / ps unavailable). Best-effort. */
|
|
14
|
+
export function parentPid(pid) {
|
|
15
|
+
if (PS_PATH === null)
|
|
16
|
+
return null;
|
|
17
|
+
try {
|
|
18
|
+
const out = execFileSync(PS_PATH, ['-o', 'ppid=', '-p', String(pid)], {
|
|
19
|
+
encoding: 'utf8',
|
|
20
|
+
stdio: ['ignore', 'pipe', 'ignore'],
|
|
21
|
+
}).trim();
|
|
22
|
+
const ppid = Number(out);
|
|
23
|
+
return Number.isInteger(ppid) && ppid > 0 ? ppid : null;
|
|
24
|
+
}
|
|
25
|
+
catch {
|
|
26
|
+
return null; // process gone / ps error
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* True if `pid` is one of `ancestors`, or descends from one — walking the parent chain via `getParent`.
|
|
31
|
+
* `getParent` is injectable so the traversal is unit-testable without real processes; production passes
|
|
32
|
+
* `parentPid`. Bounded by `maxHops` (and stops at init, pid ≤ 1) so a missing/cyclic chain can't loop.
|
|
33
|
+
*/
|
|
34
|
+
export function isPidWithin(pid, ancestors, getParent = parentPid, maxHops = 32) {
|
|
35
|
+
let current = pid;
|
|
36
|
+
for (let hops = 0; current !== null && hops <= maxHops; hops += 1) {
|
|
37
|
+
if (ancestors.has(current))
|
|
38
|
+
return true;
|
|
39
|
+
if (current <= 1)
|
|
40
|
+
return false; // reached init (or invalid) — not within the tracked tree
|
|
41
|
+
current = getParent(current);
|
|
42
|
+
}
|
|
43
|
+
return false; // exhausted hops / chain broke before reaching an ancestor
|
|
44
|
+
}
|
|
45
|
+
//# sourceMappingURL=process-tree.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"process-tree.js","sourceRoot":"","sources":["../../../src/cli/commands/process-tree.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAErC,mGAAmG;AACnG,iGAAiG;AACjG,MAAM,OAAO,GAAG,CAAC,SAAS,EAAE,aAAa,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC;AAE9E,2FAA2F;AAC3F,MAAM,UAAU,SAAS,CAAC,GAAW;IACnC,IAAI,OAAO,KAAK,IAAI;QAAE,OAAO,IAAI,CAAC;IAClC,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,YAAY,CAAC,OAAO,EAAE,CAAC,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,CAAC,GAAG,CAAC,CAAC,EAAE;YACpE,QAAQ,EAAE,MAAM;YAChB,KAAK,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,CAAC;SACpC,CAAC,CAAC,IAAI,EAAE,CAAC;QACV,MAAM,IAAI,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC;QACzB,OAAO,MAAM,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,IAAI,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC;IAC1D,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC,CAAC,0BAA0B;IACzC,CAAC;AACH,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,WAAW,CACzB,GAAW,EACX,SAA8B,EAC9B,YAA0C,SAAS,EACnD,OAAO,GAAG,EAAE;IAEZ,IAAI,OAAO,GAAkB,GAAG,CAAC;IACjC,KAAK,IAAI,IAAI,GAAG,CAAC,EAAE,OAAO,KAAK,IAAI,IAAI,IAAI,IAAI,OAAO,EAAE,IAAI,IAAI,CAAC,EAAE,CAAC;QAClE,IAAI,SAAS,CAAC,GAAG,CAAC,OAAO,CAAC;YAAE,OAAO,IAAI,CAAC;QACxC,IAAI,OAAO,IAAI,CAAC;YAAE,OAAO,KAAK,CAAC,CAAC,0DAA0D;QAC1F,OAAO,GAAG,SAAS,CAAC,OAAO,CAAC,CAAC;IAC/B,CAAC;IACD,OAAO,KAAK,CAAC,CAAC,2DAA2D;AAC3E,CAAC"}
|
package/dist/host/daemon.js
CHANGED
|
@@ -6,7 +6,8 @@ import { createDaemonInstaller, seedDefaultPlaybook, seedDefaultPlaybookBestEffo
|
|
|
6
6
|
import { McpFacadeService } from '../mcp/mcp-facade.service.js';
|
|
7
7
|
import { McpHttpService } from '../mcp/mcp-http.service.js';
|
|
8
8
|
import { TaskControlPlaneApiService } from '../task-control-plane/task-control-plane-api.service.js';
|
|
9
|
-
import { removeHostRuntimeIfMatches, writeHostRuntime } from './host-runtime.js';
|
|
9
|
+
import { hostCodeVersion, removeHostRuntimeIfMatches, writeHostRuntime } from './host-runtime.js';
|
|
10
|
+
import { acquireQueueOwnership } from './queue-ownership.js';
|
|
10
11
|
/** MCP endpoint port: REVO_MCP_PORT, else the GraphQL port + 1 (kept in the profile band). */
|
|
11
12
|
function resolveMcpPort(graphqlPort) {
|
|
12
13
|
const env = process.env['REVO_MCP_PORT'];
|
|
@@ -17,6 +18,16 @@ export async function runHostDaemon() {
|
|
|
17
18
|
// 1. Standalone up first, then 2. all control-plane writes via fresh client scopes — BEFORE the
|
|
18
19
|
// service layer (startGraphqlHost) caches its read scope, so same-boot reads see a ready control-plane.
|
|
19
20
|
const { runtime } = await ensureRevisium();
|
|
21
|
+
// Singleton gate (slice 139): exactly ONE host daemon per profile may own + poll the dev-tasks
|
|
22
|
+
// queue. Acquired here — BEFORE DBOS.launch()/queue polling (startGraphqlHost) — so a daemon that
|
|
23
|
+
// lost a concurrent cold-start race exits cleanly without ever touching the queue; ensureHost then
|
|
24
|
+
// attaches to the winner via host.json. Crash-safe: the connection-scoped advisory lock frees itself
|
|
25
|
+
// if this process dies.
|
|
26
|
+
const ownership = await acquireQueueOwnership(getConfig().profile, runtime.pgPort);
|
|
27
|
+
if (!ownership.owned) {
|
|
28
|
+
console.error(`[host] profile "${getConfig().profile}" is already owned by another daemon — exiting; the owner serves the queue.`);
|
|
29
|
+
process.exit(0);
|
|
30
|
+
}
|
|
20
31
|
await bootstrapControlPlane(runtime.httpPort);
|
|
21
32
|
await seedDefaultPlaybookBestEffort(() => seedDefaultPlaybook(createDaemonInstaller(() => listInstalledPlaybooks(runtime.httpPort))));
|
|
22
33
|
// 3. Now bring up the Nest/GraphQL/DBOS layer (HostLifecycle re-ensures Revisium = no-op).
|
|
@@ -40,6 +51,7 @@ export async function runHostDaemon() {
|
|
|
40
51
|
mcpPort,
|
|
41
52
|
startedAt,
|
|
42
53
|
profile: getConfig().profile,
|
|
54
|
+
version: hostCodeVersion(),
|
|
43
55
|
});
|
|
44
56
|
const runningMcp = mcpServer;
|
|
45
57
|
let closing = false;
|
|
@@ -52,8 +64,13 @@ export async function runHostDaemon() {
|
|
|
52
64
|
.close() // → HostLifecycle.onApplicationShutdown → DBOS.shutdown()
|
|
53
65
|
.catch(() => undefined)
|
|
54
66
|
.finally(() => {
|
|
55
|
-
|
|
56
|
-
|
|
67
|
+
ownership
|
|
68
|
+
.release() // free the dev-tasks ownership lock for the next daemon
|
|
69
|
+
.catch(() => undefined)
|
|
70
|
+
.finally(() => {
|
|
71
|
+
removeHostRuntimeIfMatches(snapshot);
|
|
72
|
+
process.exit(0);
|
|
73
|
+
});
|
|
57
74
|
});
|
|
58
75
|
};
|
|
59
76
|
process.on('SIGTERM', shutdown);
|
|
@@ -62,6 +79,7 @@ export async function runHostDaemon() {
|
|
|
62
79
|
catch (err) {
|
|
63
80
|
mcpServer?.close();
|
|
64
81
|
await started.app.close().catch(() => undefined);
|
|
82
|
+
await ownership.release().catch(() => undefined);
|
|
65
83
|
throw err;
|
|
66
84
|
}
|
|
67
85
|
}
|
package/dist/host/daemon.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"daemon.js","sourceRoot":"","sources":["../../src/host/daemon.ts"],"names":[],"mappings":"AAqBA,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AACzC,OAAO,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAC3D,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACtD,OAAO,EAAE,qBAAqB,EAAE,sBAAsB,EAAE,MAAM,+BAA+B,CAAC;AAC9F,OAAO,EACL,qBAAqB,EACrB,mBAAmB,EACnB,6BAA6B,GAC9B,MAAM,2CAA2C,CAAC;AACnD,OAAO,EAAE,gBAAgB,EAAE,MAAM,8BAA8B,CAAC;AAChE,OAAO,EAAE,cAAc,EAAE,MAAM,4BAA4B,CAAC;AAC5D,OAAO,EAAE,0BAA0B,EAAE,MAAM,yDAAyD,CAAC;AACrG,OAAO,EAAE,0BAA0B,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;
|
|
1
|
+
{"version":3,"file":"daemon.js","sourceRoot":"","sources":["../../src/host/daemon.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Pinned DBOS identity for the host daemon (slice 140, Part A Layer 2).
|
|
3
|
+
*
|
|
4
|
+
* DBOS derives two identifiers from the environment AT IMPORT TIME (dbos-sdk `utils.js` `globalParams`
|
|
5
|
+
* is a module-level literal: `executorID = process.env.DBOS__VMID || 'local'`,
|
|
6
|
+
* `appVersion = process.env.DBOS__APPVERSION || ''`). Left unset, every daemon is `executorID='local'`
|
|
7
|
+
* with a source-MD5 appVersion — indistinguishable in `pg_stat_activity` and brittle across releases.
|
|
8
|
+
* We pin both, so:
|
|
9
|
+
* - executorID = `revo-<profile>` makes each daemon's DBOS connections self-identifying in
|
|
10
|
+
* `pg_stat_activity.application_name` (`dbos_transact_<executorID>_<appVersion>`), which is the
|
|
11
|
+
* ONLY way `revo doctor` can see a rogue/legacy poller that holds no inbound port.
|
|
12
|
+
* - appVersion = a value WE control, decoupled from the npm release version. DBOS recovery keys on
|
|
13
|
+
* a HARD `application_version` equality, so a per-release version would strand in-flight PENDING
|
|
14
|
+
* work on every alpha bump. Pinning a stable workflow version keeps recovery working across a
|
|
15
|
+
* routine upgrade; it is bumped ONLY when the durable workflow/step SOURCE actually changes.
|
|
16
|
+
*
|
|
17
|
+
* Because `globalParams` is read at import time, the pin must be present in the daemon process's
|
|
18
|
+
* environment from the start — it is applied to the detached child's env in `ensure-host.spawnDaemon`,
|
|
19
|
+
* never mutated after the dbos-sdk module has loaded.
|
|
20
|
+
*/
|
|
21
|
+
/**
|
|
22
|
+
* Pinned DBOS `appVersion`. NOT the npm package version — bump this ONLY when the durable DBOS
|
|
23
|
+
* workflow/step function SOURCE changes (which moves the recovery/dequeue version boundary). A routine
|
|
24
|
+
* release that does not touch workflow-step code keeps this value so in-flight work recovers cleanly.
|
|
25
|
+
*/
|
|
26
|
+
export const DBOS_WORKFLOW_VERSION = '1';
|
|
27
|
+
/** Stable per-profile DBOS executor id (`revo-<profile>`) — the owner identity the census matches on. */
|
|
28
|
+
export function dbosExecutorId(profile) {
|
|
29
|
+
return `revo-${profile}`;
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* The `DBOS__VMID` / `DBOS__APPVERSION` env pin for a profile's daemon. An explicitly-SET value in
|
|
33
|
+
* `env` wins (so a custom layout / test can override) — including an explicit empty string, hence `??`
|
|
34
|
+
* not `||`; only an absent (undefined) var falls back to the pinned defaults.
|
|
35
|
+
*/
|
|
36
|
+
export function dbosEnvPin(profile, env = process.env) {
|
|
37
|
+
return {
|
|
38
|
+
DBOS__VMID: env['DBOS__VMID'] ?? dbosExecutorId(profile),
|
|
39
|
+
DBOS__APPVERSION: env['DBOS__APPVERSION'] ?? DBOS_WORKFLOW_VERSION,
|
|
40
|
+
};
|
|
41
|
+
}
|
|
42
|
+
//# sourceMappingURL=dbos-identity.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dbos-identity.js","sourceRoot":"","sources":["../../src/host/dbos-identity.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAEH;;;;GAIG;AACH,MAAM,CAAC,MAAM,qBAAqB,GAAG,GAAG,CAAC;AAEzC,yGAAyG;AACzG,MAAM,UAAU,cAAc,CAAC,OAAe;IAC5C,OAAO,QAAQ,OAAO,EAAE,CAAC;AAC3B,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,UAAU,CACxB,OAAe,EACf,MAAyB,OAAO,CAAC,GAAG;IAEpC,OAAO;QACL,UAAU,EAAE,GAAG,CAAC,YAAY,CAAC,IAAI,cAAc,CAAC,OAAO,CAAC;QACxD,gBAAgB,EAAE,GAAG,CAAC,kBAAkB,CAAC,IAAI,qBAAqB;KACnE,CAAC;AACJ,CAAC"}
|
package/dist/host/ensure-host.js
CHANGED
|
@@ -11,7 +11,8 @@
|
|
|
11
11
|
import { spawn } from 'node:child_process';
|
|
12
12
|
import { closeSync, openSync } from 'node:fs';
|
|
13
13
|
import { getConfig, isAlive, resolveDefaultGraphqlPort } from '../config.js';
|
|
14
|
-
import { isHostRunning, readHostRuntime, removeHostRuntime, } from './host-runtime.js';
|
|
14
|
+
import { hostCodeVersion, isHostRunning, readHostRuntime, removeHostRuntime, } from './host-runtime.js';
|
|
15
|
+
import { dbosEnvPin } from './dbos-identity.js';
|
|
15
16
|
const DEFAULT_TIMEOUT_MS = 120_000;
|
|
16
17
|
/** Budget to let an alive-but-not-yet-healthy daemon finish booting before giving up. */
|
|
17
18
|
const DEFAULT_RECHECK_MS = 20_000;
|
|
@@ -69,8 +70,11 @@ export function daemonSpawnArgv(entry = process.argv[1]) {
|
|
|
69
70
|
function spawnDaemon() {
|
|
70
71
|
const out = openSync(getConfig().hostLogFile, 'a');
|
|
71
72
|
const [cmd, args] = daemonSpawnArgv();
|
|
72
|
-
// env inheritance carries the resolved profile (REVO_PROFILE / REVO_* knobs) to the daemon
|
|
73
|
-
|
|
73
|
+
// env inheritance carries the resolved profile (REVO_PROFILE / REVO_* knobs) to the daemon, PLUS the
|
|
74
|
+
// pinned DBOS identity (DBOS__VMID/DBOS__APPVERSION). dbos-sdk reads those at IMPORT time, so they
|
|
75
|
+
// must be in the child's env from the start — set here, never mutated after launch (slice 140).
|
|
76
|
+
const env = { ...process.env, ...dbosEnvPin(getConfig().profile, process.env) };
|
|
77
|
+
const child = spawn(cmd, args, { detached: true, stdio: ['ignore', out, out], env });
|
|
74
78
|
closeSync(out);
|
|
75
79
|
if (!child.pid)
|
|
76
80
|
throw new Error('Failed to spawn Revo host daemon: spawn returned no pid');
|
|
@@ -83,6 +87,13 @@ export async function ensureHost(options = {}) {
|
|
|
83
87
|
const existing = readHostRuntime();
|
|
84
88
|
if (existing && isHostRunning()) {
|
|
85
89
|
if (await isGraphqlHealthy(existing.graphqlPort)) {
|
|
90
|
+
// Version-check (slice 139): surface a daemon running a DIFFERENT build than this install so it
|
|
91
|
+
// can't silently serve stale behavior. We warn (not auto-kill) to avoid disrupting in-flight runs;
|
|
92
|
+
// `revo restart` (or `doctor`) replaces it. A 0.0.0 dev checkout doesn't change version → no warn.
|
|
93
|
+
if (existing.version !== undefined && existing.version !== hostCodeVersion()) {
|
|
94
|
+
console.warn(`[host] attached to a daemon running version ${existing.version}, but this build is ` +
|
|
95
|
+
`${hostCodeVersion()} — run \`revo restart\` to replace the stale daemon.`);
|
|
96
|
+
}
|
|
86
97
|
return { runtime: existing, alreadyRunning: true };
|
|
87
98
|
}
|
|
88
99
|
// Alive but not ready — likely mid-boot/bootstrap. Wait; never spawn a duplicate (port collision).
|
|
@@ -93,10 +104,10 @@ export async function ensureHost(options = {}) {
|
|
|
93
104
|
`${existing.graphqlPort}. Stop it with \`revo stop\` and retry.`);
|
|
94
105
|
}
|
|
95
106
|
// No live daemon — clear a stale host.json (dead pid), then spawn a fresh detached one.
|
|
96
|
-
//
|
|
97
|
-
//
|
|
98
|
-
//
|
|
99
|
-
//
|
|
107
|
+
// The check-then-spawn is not atomic, but the daemon's advisory-lock singleton (slice 139,
|
|
108
|
+
// queue-ownership.ts) makes a concurrent cold-start safe: if two ensureHost() callers both spawn
|
|
109
|
+
// `__daemon`, only one wins the per-profile lock and lives; the loser exits before DBOS/queue, and
|
|
110
|
+
// every waiter observes the winner's host.json via waitForReady.
|
|
100
111
|
if (existing)
|
|
101
112
|
removeHostRuntime();
|
|
102
113
|
spawnDaemon();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ensure-host.js","sourceRoot":"","sources":["../../src/host/ensure-host.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AACH,OAAO,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AAC3C,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAC9C,OAAO,EAAE,SAAS,EAAE,OAAO,EAAE,yBAAyB,EAAE,MAAM,cAAc,CAAC;AAC7E,OAAO,EACL,aAAa,EACb,eAAe,EACf,iBAAiB,GAElB,MAAM,mBAAmB,CAAC;
|
|
1
|
+
{"version":3,"file":"ensure-host.js","sourceRoot":"","sources":["../../src/host/ensure-host.ts"],"names":[],"mappings":"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"}
|
|
@@ -10,7 +10,27 @@
|
|
|
10
10
|
*/
|
|
11
11
|
import { existsSync, readFileSync, rmSync, writeFileSync } from 'node:fs';
|
|
12
12
|
import { join } from 'node:path';
|
|
13
|
+
import { fileURLToPath } from 'node:url';
|
|
13
14
|
import { getConfig, isAlive } from '../config.js';
|
|
15
|
+
let cachedCodeVersion;
|
|
16
|
+
/**
|
|
17
|
+
* This build's package version (e.g. `0.1.0-alpha.7`). Recorded in host.json so `ensureHost`/`doctor`
|
|
18
|
+
* can detect a stale daemon running a DIFFERENT build than the current install (slice 139). A `0.0.0`
|
|
19
|
+
* dev checkout does not change across rebuilds, so dev relies on `revo restart`; released builds differ.
|
|
20
|
+
*/
|
|
21
|
+
export function hostCodeVersion() {
|
|
22
|
+
if (cachedCodeVersion === undefined) {
|
|
23
|
+
try {
|
|
24
|
+
const pkgPath = fileURLToPath(new URL('../../package.json', import.meta.url));
|
|
25
|
+
const pkg = JSON.parse(readFileSync(pkgPath, 'utf8'));
|
|
26
|
+
cachedCodeVersion = typeof pkg.version === 'string' ? pkg.version : 'unknown';
|
|
27
|
+
}
|
|
28
|
+
catch {
|
|
29
|
+
cachedCodeVersion = 'unknown';
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
return cachedCodeVersion;
|
|
33
|
+
}
|
|
14
34
|
export function hostRuntimeFile() {
|
|
15
35
|
return join(getConfig().dataDir, 'host.json');
|
|
16
36
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"host-runtime.js","sourceRoot":"","sources":["../../src/host/host-runtime.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AACH,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAC1E,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,SAAS,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;
|
|
1
|
+
{"version":3,"file":"host-runtime.js","sourceRoot":"","sources":["../../src/host/host-runtime.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AACH,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAC1E,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,EAAE,SAAS,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAalD,IAAI,iBAAqC,CAAC;AAE1C;;;;GAIG;AACH,MAAM,UAAU,eAAe;IAC7B,IAAI,iBAAiB,KAAK,SAAS,EAAE,CAAC;QACpC,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,aAAa,CAAC,IAAI,GAAG,CAAC,oBAAoB,EAAE,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;YAC9E,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,OAAO,EAAE,MAAM,CAAC,CAA0B,CAAC;YAC/E,iBAAiB,GAAG,OAAO,GAAG,CAAC,OAAO,KAAK,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC;QAChF,CAAC;QAAC,MAAM,CAAC;YACP,iBAAiB,GAAG,SAAS,CAAC;QAChC,CAAC;IACH,CAAC;IACD,OAAO,iBAAiB,CAAC;AAC3B,CAAC;AAKD,MAAM,UAAU,eAAe;IAC7B,OAAO,IAAI,CAAC,SAAS,EAAE,CAAC,OAAO,EAAE,WAAW,CAAC,CAAC;AAChD,CAAC;AAED,MAAM,UAAU,eAAe;IAC7B,MAAM,IAAI,GAAG,eAAe,EAAE,CAAC;IAC/B,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC;QAAE,OAAO,IAAI,CAAC;IACnC,IAAI,CAAC;QACH,OAAO,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,IAAI,EAAE,MAAM,CAAC,CAAqB,CAAC;IACpE,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,KAAuB;IACtD,aAAa,CAAC,eAAe,EAAE,EAAE,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;AACnE,CAAC;AAED,MAAM,UAAU,iBAAiB;IAC/B,MAAM,IAAI,GAAG,eAAe,EAAE,CAAC;IAC/B,IAAI,UAAU,CAAC,IAAI,CAAC;QAAE,MAAM,CAAC,IAAI,CAAC,CAAC;AACrC,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,0BAA0B,CAAC,QAA6B;IACtE,MAAM,OAAO,GAAG,eAAe,EAAE,CAAC;IAClC,IAAI,OAAO,EAAE,GAAG,KAAK,QAAQ,CAAC,GAAG,IAAI,OAAO,EAAE,SAAS,KAAK,QAAQ,CAAC,SAAS,EAAE,CAAC;QAC/E,iBAAiB,EAAE,CAAC;IACtB,CAAC;AACH,CAAC;AAED,8FAA8F;AAC9F,MAAM,UAAU,aAAa;IAC3B,MAAM,OAAO,GAAG,eAAe,EAAE,CAAC;IAClC,OAAO,OAAO,KAAK,IAAI,IAAI,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;AAClD,CAAC"}
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Daemon singleton gate (slice 139, hardened slice 140). Exactly ONE host daemon per profile may own —
|
|
3
|
+
* and therefore poll — the `dev-tasks` WorkflowQueue. Ownership is a connection-scoped Postgres
|
|
4
|
+
* ADVISORY LOCK:
|
|
5
|
+
*
|
|
6
|
+
* - Advisory locks are DATABASE-scoped, NOT cluster-global (PG: "Advisory locks are local to each
|
|
7
|
+
* database"). The gate works only because every contending daemon connects to the SAME fixed
|
|
8
|
+
* maintenance `postgres` database, so they all contend in one shared per-database lock namespace.
|
|
9
|
+
* We use `postgres` because it exists right after `ensureRevisium` — before the per-profile `dbos`
|
|
10
|
+
* database is created — letting the daemon decide "am I the owner?" BEFORE DBOS.launch() and before
|
|
11
|
+
* the queue worker starts polling. INVARIANT: all contenders MUST take this lock on the identical
|
|
12
|
+
* database. NEVER probe this lock key from another database (e.g. `dbos`) expecting a conflict — it
|
|
13
|
+
* would silently NOT conflict and could mint a second owner.
|
|
14
|
+
* - The key is a FULL 64-bit value derived from the lock name via md5 (`('x'||substr(md5(name),1,16))
|
|
15
|
+
* ::bit(64)::bigint`), not `hashtext(...)::bigint` — `hashtext` is only 32 bits, so distinct
|
|
16
|
+
* profile names could hash-collide and wrongly block a different profile's daemon. md5's 64 bits
|
|
17
|
+
* make a cross-profile collision negligible.
|
|
18
|
+
* - The lock is held on a DEDICATED, long-lived connection for the daemon's whole life. It
|
|
19
|
+
* auto-releases when that connection ends — on graceful shutdown OR on a hard crash — so a dead
|
|
20
|
+
* owner never blocks a successor. (Verified by experiment: a second connection's
|
|
21
|
+
* `pg_try_advisory_lock` returns false while held, and true again once the holder disconnects.)
|
|
22
|
+
*
|
|
23
|
+
* A daemon that does NOT win the lock lost a concurrent cold-start race (e.g. several `revo mcp`
|
|
24
|
+
* bridges spawning at once) and exits; ensureHost then attaches to the winner via host.json. This
|
|
25
|
+
* closes the "concurrent cold-start spawns multiple daemons" hole that let stale daemons accumulate.
|
|
26
|
+
* It does NOT, however, coordinate LEGACY hosts that predate the lock — those are detected by the
|
|
27
|
+
* `pg_stat_activity` census (queue-poller-census.ts) and evicted by `revo doctor`/`stop` (slice 140).
|
|
28
|
+
*/
|
|
29
|
+
import pg from 'pg';
|
|
30
|
+
/**
|
|
31
|
+
* SQL expression that turns the text lock name (bound as `$1`) into a full 64-bit advisory-lock key.
|
|
32
|
+
* `md5` yields 128 bits of hex; the first 16 hex chars are reinterpreted as a signed bigint. Shared by
|
|
33
|
+
* lock + unlock so they always target the identical key.
|
|
34
|
+
*/
|
|
35
|
+
const LOCK_KEY_EXPR = `('x' || substr(md5($1), 1, 16))::bit(64)::bigint`;
|
|
36
|
+
/** Stable advisory-lock identity for a profile's dev-tasks queue ownership. */
|
|
37
|
+
export function ownershipLockName(profile) {
|
|
38
|
+
return `revo:dev-tasks:${profile}`;
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* Try to become the sole dev-tasks owner for `profile`. Returns `{owned:false}` (and closes its probe
|
|
42
|
+
* connection) when another live daemon already holds it. When `{owned:true}`, the returned connection
|
|
43
|
+
* stays open holding the lock until `release()` (or process death) frees it.
|
|
44
|
+
*/
|
|
45
|
+
export async function acquireQueueOwnership(profile, pgPort, deps = {}) {
|
|
46
|
+
const url = `postgresql://revisium:password@localhost:${pgPort}/postgres`;
|
|
47
|
+
const name = ownershipLockName(profile);
|
|
48
|
+
const createClient = deps.createClient ?? ((u) => new pg.Client(u));
|
|
49
|
+
const client = createClient(url);
|
|
50
|
+
await client.connect();
|
|
51
|
+
const res = await client.query(`SELECT pg_try_advisory_lock(${LOCK_KEY_EXPR}) AS owned`, [name]);
|
|
52
|
+
const owned = res.rows[0]?.owned === true;
|
|
53
|
+
if (!owned) {
|
|
54
|
+
await client.end().catch(() => undefined);
|
|
55
|
+
return { owned: false, release: async () => undefined };
|
|
56
|
+
}
|
|
57
|
+
// Keep `client` reachable (via this closure) so its socket — and the lock — is held for the daemon's
|
|
58
|
+
// life. The OS frees the connection (and thus the lock) on crash; release() does it gracefully.
|
|
59
|
+
const release = async () => {
|
|
60
|
+
try {
|
|
61
|
+
await client.query(`SELECT pg_advisory_unlock(${LOCK_KEY_EXPR})`, [name]);
|
|
62
|
+
}
|
|
63
|
+
catch {
|
|
64
|
+
// best-effort; ending the connection releases the lock regardless
|
|
65
|
+
}
|
|
66
|
+
await client.end().catch(() => undefined);
|
|
67
|
+
};
|
|
68
|
+
return { owned: true, release };
|
|
69
|
+
}
|
|
70
|
+
//# sourceMappingURL=queue-ownership.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"queue-ownership.js","sourceRoot":"","sources":["../../src/host/queue-ownership.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;AACH,OAAO,EAAE,MAAM,IAAI,CAAC;AAEpB;;;;GAIG;AACH,MAAM,aAAa,GAAG,kDAAkD,CAAC;AAqBzE,+EAA+E;AAC/E,MAAM,UAAU,iBAAiB,CAAC,OAAe;IAC/C,OAAO,kBAAkB,OAAO,EAAE,CAAC;AACrC,CAAC;AAED;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,qBAAqB,CACzC,OAAe,EACf,MAAc,EACd,OAA6B,EAAE;IAE/B,MAAM,GAAG,GAAG,4CAA4C,MAAM,WAAW,CAAC;IAC1E,MAAM,IAAI,GAAG,iBAAiB,CAAC,OAAO,CAAC,CAAC;IACxC,MAAM,YAAY,GAAG,IAAI,CAAC,YAAY,IAAI,CAAC,CAAC,CAAS,EAAE,EAAE,CAAC,IAAI,EAAE,CAAC,MAAM,CAAC,CAAC,CAA+B,CAAC,CAAC;IAC1G,MAAM,MAAM,GAAG,YAAY,CAAC,GAAG,CAAC,CAAC;IACjC,MAAM,MAAM,CAAC,OAAO,EAAE,CAAC;IAEvB,MAAM,GAAG,GAAG,MAAM,MAAM,CAAC,KAAK,CAAC,+BAA+B,aAAa,YAAY,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC;IACjG,MAAM,KAAK,GAAG,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,KAAK,KAAK,IAAI,CAAC;IAE1C,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,MAAM,MAAM,CAAC,GAAG,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC;QAC1C,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,IAAI,EAAE,CAAC,SAAS,EAAE,CAAC;IAC1D,CAAC;IAED,qGAAqG;IACrG,gGAAgG;IAChG,MAAM,OAAO,GAAG,KAAK,IAAmB,EAAE;QACxC,IAAI,CAAC;YACH,MAAM,MAAM,CAAC,KAAK,CAAC,6BAA6B,aAAa,GAAG,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC;QAC5E,CAAC;QAAC,MAAM,CAAC;YACP,kEAAkE;QACpE,CAAC;QACD,MAAM,MAAM,CAAC,GAAG,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC;IAC5C,CAAC,CAAC;IACF,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC;AAClC,CAAC"}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Queue-poller census (slice 140, Part A Layer 3 — detection half, pure).
|
|
3
|
+
*
|
|
4
|
+
* The advisory lock (queue-ownership.ts) only coordinates daemons that CALL it. A legacy/old-version
|
|
5
|
+
* host that predates the lock — or a `revo mcp` from before the thin-bridge era that is itself a full
|
|
6
|
+
* DBOS host — still connects to the `dbos` database and polls the `dev-tasks` queue, ignoring the lock.
|
|
7
|
+
* It has no inbound listening port, so the port-based `revo stop`/`doctor` cannot see it. The ONE
|
|
8
|
+
* control plane shared with code we do not control is the database itself: every DBOS system-DB
|
|
9
|
+
* connection is stamped `application_name = dbos_transact_<executorID>_<appVersion>` (visible in
|
|
10
|
+
* `pg_stat_activity`). A connection whose executor id is NOT this profile's pinned owner is a rogue.
|
|
11
|
+
*
|
|
12
|
+
* This module is the pure classifier (unit-tested); the live `pg_stat_activity` query lives in the IO
|
|
13
|
+
* layer (lifecycle.ts). Classification keys on the executor-id segment ONLY: `application_name` is
|
|
14
|
+
* capped at 63 bytes by Postgres, so a long suffix can truncate the appVersion — we therefore never
|
|
15
|
+
* trust the parsed version for identity (the owner's true version comes from host.json elsewhere).
|
|
16
|
+
*/
|
|
17
|
+
const STAMP_PREFIX = 'dbos_transact_';
|
|
18
|
+
/**
|
|
19
|
+
* Parse the executor id out of `dbos_transact_<executorID>_<appVersion>` — the segment between the
|
|
20
|
+
* fixed prefix and the LAST underscore (the appVersion separator). Returns null when the string is not
|
|
21
|
+
* a DBOS stamp. Robust to a truncated/empty appVersion segment (we only need the executor id); pinned
|
|
22
|
+
* revo executor ids (`revo-<profile>`) and `local` contain no underscore, so the last-underscore split
|
|
23
|
+
* is unambiguous for the identities we classify.
|
|
24
|
+
*/
|
|
25
|
+
export function parseExecutorId(applicationName) {
|
|
26
|
+
if (!applicationName.startsWith(STAMP_PREFIX))
|
|
27
|
+
return null;
|
|
28
|
+
const rest = applicationName.slice(STAMP_PREFIX.length); // <executorID>_<appVersion>
|
|
29
|
+
const sep = rest.lastIndexOf('_');
|
|
30
|
+
const executorId = sep < 0 ? rest : rest.slice(0, sep);
|
|
31
|
+
return executorId.length > 0 ? executorId : null;
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Foreign DBOS pollers among `backends` — any connection whose parsed executor id differs from the
|
|
35
|
+
* profile's pinned owner. Report-only data; the caller decides how to surface or evict it.
|
|
36
|
+
*/
|
|
37
|
+
export function classifyQueuePollerRogues(backends, ownerExecutorId) {
|
|
38
|
+
const rogues = [];
|
|
39
|
+
for (const b of backends) {
|
|
40
|
+
const executorId = parseExecutorId(b.applicationName);
|
|
41
|
+
if (executorId === null || executorId === ownerExecutorId)
|
|
42
|
+
continue;
|
|
43
|
+
rogues.push({ pid: b.pid, executorId, applicationName: b.applicationName, backendStart: b.backendStart });
|
|
44
|
+
}
|
|
45
|
+
return rogues;
|
|
46
|
+
}
|
|
47
|
+
//# sourceMappingURL=queue-poller-census.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"queue-poller-census.js","sourceRoot":"","sources":["../../src/host/queue-poller-census.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAEH,MAAM,YAAY,GAAG,gBAAgB,CAAC;AAmBtC;;;;;;GAMG;AACH,MAAM,UAAU,eAAe,CAAC,eAAuB;IACrD,IAAI,CAAC,eAAe,CAAC,UAAU,CAAC,YAAY,CAAC;QAAE,OAAO,IAAI,CAAC;IAC3D,MAAM,IAAI,GAAG,eAAe,CAAC,KAAK,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC,CAAC,4BAA4B;IACrF,MAAM,GAAG,GAAG,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC;IAClC,MAAM,UAAU,GAAG,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;IACvD,OAAO,UAAU,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC;AACnD,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,yBAAyB,CACvC,QAAsC,EACtC,eAAuB;IAEvB,MAAM,MAAM,GAAkB,EAAE,CAAC;IACjC,KAAK,MAAM,CAAC,IAAI,QAAQ,EAAE,CAAC;QACzB,MAAM,UAAU,GAAG,eAAe,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC;QACtD,IAAI,UAAU,KAAK,IAAI,IAAI,UAAU,KAAK,eAAe;YAAE,SAAS;QACpE,MAAM,CAAC,IAAI,CAAC,EAAE,GAAG,EAAE,CAAC,CAAC,GAAG,EAAE,UAAU,EAAE,eAAe,EAAE,CAAC,CAAC,eAAe,EAAE,YAAY,EAAE,CAAC,CAAC,YAAY,EAAE,CAAC,CAAC;IAC5G,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { RunAgentError } from './runner.js';
|
|
2
|
-
import { AGENT_RESULT_SCHEMA, STRUCTURED_RESULT_NOTE, agentResultFromStructured, parseTransportEnvelope, } from './result-envelope.js';
|
|
2
|
+
import { AGENT_RESULT_SCHEMA, STRUCTURED_RESULT_NOTE, agentResultFromStructured, extractTerminalResult, parseTransportEnvelope, } from './result-envelope.js';
|
|
3
3
|
import { boundedPreview, buildAttemptResult, buildUsageCosts, runnerError, tail } from './runner-common.js';
|
|
4
4
|
const DEFAULT_TIMEOUT_MS = 600_000;
|
|
5
5
|
const DEFAULT_COMMAND = 'claude';
|
|
@@ -61,13 +61,40 @@ function readParamNum(params, ...keys) {
|
|
|
61
61
|
}
|
|
62
62
|
return undefined;
|
|
63
63
|
}
|
|
64
|
+
// Summarize one stream-json event into a short, redaction-safe preview for the observability feed.
|
|
65
|
+
// Assistant turns surface their text + tool names; tool results are marked; anything else by type.
|
|
66
|
+
function streamEventPreview(evt) {
|
|
67
|
+
const message = evt.message;
|
|
68
|
+
const content = message?.content;
|
|
69
|
+
if (Array.isArray(content)) {
|
|
70
|
+
const parts = content.map((raw) => {
|
|
71
|
+
const block = raw;
|
|
72
|
+
if (block.type === 'text' && typeof block.text === 'string')
|
|
73
|
+
return block.text;
|
|
74
|
+
if (block.type === 'tool_use' && typeof block.name === 'string')
|
|
75
|
+
return `[tool_use:${block.name}]`;
|
|
76
|
+
if (block.type === 'tool_result')
|
|
77
|
+
return '[tool_result]';
|
|
78
|
+
return `[${String(block.type)}]`;
|
|
79
|
+
});
|
|
80
|
+
const joined = parts.join(' ').trim();
|
|
81
|
+
return joined.length > 0 ? joined.slice(0, 500) : undefined;
|
|
82
|
+
}
|
|
83
|
+
if (typeof evt.result === 'string')
|
|
84
|
+
return evt.result.slice(0, 500);
|
|
85
|
+
return undefined;
|
|
86
|
+
}
|
|
64
87
|
// CLI invocation — the only place flags are assembled. EXACT flag set is confirmed by the manual
|
|
65
88
|
// Step-6 smoke before --runner defaults to auto. The permission mode keeps the headless run
|
|
66
89
|
// non-interactive: a tool not in allowedTools is auto-denied (no TTY can prompt in -p mode).
|
|
67
90
|
// 0008 #5: permissionMode is now per-role DATA (was hardcoded 'default'); model_profiles.params
|
|
68
91
|
// (previously unused "{}") is threaded in — a configured maxTurns maps to claude's --max-turns.
|
|
69
92
|
function buildArgs(modelId, allowedTools, permissionMode, params) {
|
|
70
|
-
|
|
93
|
+
// stream-json (NOT json): claude emits a JSONL transcript — one event per turn (assistant text,
|
|
94
|
+
// tool_use, tool_result) plus a terminal `result` line — so the runner can stream live per-turn
|
|
95
|
+
// observability AND still extract the final structured result. `--verbose` is required by claude
|
|
96
|
+
// for stream-json in `-p` mode. Confirmed by experiment before this change (slice 128).
|
|
97
|
+
const args = ['-p', '--model', modelId, '--output-format', 'stream-json', '--verbose', '--permission-mode', permissionMode];
|
|
71
98
|
// Constrain the final message to the agent-result schema -> a reliable `verdict` in structured_output.
|
|
72
99
|
// No prose fallback is accepted.
|
|
73
100
|
args.push('--json-schema', AGENT_RESULT_SCHEMA);
|
|
@@ -112,6 +139,26 @@ export function createClaudeCodeRunner(deps) {
|
|
|
112
139
|
timeoutMs,
|
|
113
140
|
});
|
|
114
141
|
reporter?.started();
|
|
142
|
+
// stream-json arrives as JSONL; buffer partial chunks and report ONE observability event per
|
|
143
|
+
// COMPLETE line — this is the live per-turn transcript. The terminal `result` line is skipped
|
|
144
|
+
// here and reported below via reportTransportMetadata (after extraction), to avoid duplication.
|
|
145
|
+
let stdoutLineBuffer = '';
|
|
146
|
+
const reportStreamLine = (line) => {
|
|
147
|
+
const trimmed = line.trim();
|
|
148
|
+
if (trimmed === '')
|
|
149
|
+
return;
|
|
150
|
+
let evt;
|
|
151
|
+
try {
|
|
152
|
+
evt = JSON.parse(trimmed);
|
|
153
|
+
}
|
|
154
|
+
catch {
|
|
155
|
+
return; // a partial or non-JSON line — ignore
|
|
156
|
+
}
|
|
157
|
+
const type = typeof evt.type === 'string' ? evt.type : 'event';
|
|
158
|
+
if (type === 'result')
|
|
159
|
+
return;
|
|
160
|
+
reporter?.parsed({ type, preview: streamEventPreview(evt) });
|
|
161
|
+
};
|
|
115
162
|
const req = {
|
|
116
163
|
command,
|
|
117
164
|
args,
|
|
@@ -121,7 +168,12 @@ export function createClaudeCodeRunner(deps) {
|
|
|
121
168
|
onSpawn: (pid) => reporter?.spawned(pid),
|
|
122
169
|
onStdoutChunk: (chunk) => {
|
|
123
170
|
processArtifact?.appendStdout(chunk);
|
|
124
|
-
|
|
171
|
+
stdoutLineBuffer += chunk;
|
|
172
|
+
let nl;
|
|
173
|
+
while ((nl = stdoutLineBuffer.indexOf('\n')) >= 0) {
|
|
174
|
+
reportStreamLine(stdoutLineBuffer.slice(0, nl));
|
|
175
|
+
stdoutLineBuffer = stdoutLineBuffer.slice(nl + 1);
|
|
176
|
+
}
|
|
125
177
|
},
|
|
126
178
|
onStderrChunk: (chunk) => {
|
|
127
179
|
processArtifact?.appendStderr(chunk);
|
|
@@ -129,6 +181,9 @@ export function createClaudeCodeRunner(deps) {
|
|
|
129
181
|
},
|
|
130
182
|
};
|
|
131
183
|
const result = await deps.executor(req);
|
|
184
|
+
// Flush a trailing partial line (the result line normally ends in \n, so this is usually empty).
|
|
185
|
+
if (stdoutLineBuffer.trim() !== '')
|
|
186
|
+
reportStreamLine(stdoutLineBuffer);
|
|
132
187
|
const processSnapshot = processArtifact?.finish({ code: result.code, timedOut: result.timedOut });
|
|
133
188
|
// Timeout / process failure → throw; the loop's catch → failStep returns the step to ready
|
|
134
189
|
// (backoff) or dead at the attempt cap. No loop change needed.
|
|
@@ -140,7 +195,7 @@ export function createClaudeCodeRunner(deps) {
|
|
|
140
195
|
reporter?.failed(`claude-code runner exited with code ${String(result.code)}`, { exitCode: result.code });
|
|
141
196
|
throw runnerError(`claude-code runner exited with code ${String(result.code)}: ${tail(result.stderr || result.stdout)}`, processSnapshot);
|
|
142
197
|
}
|
|
143
|
-
const transport = parseTransportEnvelope(result.stdout);
|
|
198
|
+
const transport = parseTransportEnvelope(extractTerminalResult(result.stdout));
|
|
144
199
|
reporter?.parsed({ type: 'result', preview: transport.text });
|
|
145
200
|
reportTransportMetadata(reporter, transport);
|
|
146
201
|
if (transport.isError) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"claude-code-runner.js","sourceRoot":"","sources":["../../src/worker/claude-code-runner.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"claude-code-runner.js","sourceRoot":"","sources":["../../src/worker/claude-code-runner.ts"],"names":[],"mappings":"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"}
|
|
@@ -105,6 +105,52 @@ export function parseTransportEnvelope(stdout) {
|
|
|
105
105
|
structuredOutput: obj.structured_output,
|
|
106
106
|
};
|
|
107
107
|
}
|
|
108
|
+
/**
|
|
109
|
+
* Reduce the runner's stdout to the single terminal `result` JSON object, then hand it to
|
|
110
|
+
* parseTransportEnvelope. Handles BOTH shapes:
|
|
111
|
+
* - legacy `--output-format json` → the whole stdout is one `{...}` object;
|
|
112
|
+
* - `--output-format stream-json` → a JSONL stream (system/assistant/user/… lines) whose LAST
|
|
113
|
+
* line is `{"type":"result",...}`.
|
|
114
|
+
* Confirmed by experiment (2026-06-23): under stream-json the terminal result still carries
|
|
115
|
+
* `structured_output`, `usage`, and `total_cost_usd`, so verdict/cost extraction is unchanged.
|
|
116
|
+
* Throws when no result object is present (the runner maps that to a lesson-bearing failure).
|
|
117
|
+
*/
|
|
118
|
+
export function extractTerminalResult(stdout) {
|
|
119
|
+
const trimmed = stdout.trim();
|
|
120
|
+
if (trimmed === '')
|
|
121
|
+
throw new Error('claude -p produced no output (no result envelope)');
|
|
122
|
+
// Legacy single-object form: the whole stdout parses as one object. Accept only a terminal
|
|
123
|
+
// result (`type` 'result' or absent — the legacy `--output-format json` blob is `type:'result'`);
|
|
124
|
+
// a lone non-result stream event (e.g. `{"type":"assistant",…}`) must fall through so the JSONL
|
|
125
|
+
// scan reports the clear "no result event" error rather than failing later on a missing result.
|
|
126
|
+
try {
|
|
127
|
+
const whole = JSON.parse(trimmed);
|
|
128
|
+
if (whole !== null && typeof whole === 'object' && !Array.isArray(whole)) {
|
|
129
|
+
const type = whole.type;
|
|
130
|
+
if (type === undefined || type === 'result')
|
|
131
|
+
return trimmed;
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
catch {
|
|
135
|
+
// Not a single object → fall through to the JSONL scan.
|
|
136
|
+
}
|
|
137
|
+
// stream-json: the terminal result is the LAST line with `"type":"result"`.
|
|
138
|
+
const lines = trimmed.split(/\r?\n/);
|
|
139
|
+
for (let i = lines.length - 1; i >= 0; i--) {
|
|
140
|
+
const line = lines[i].trim();
|
|
141
|
+
if (line === '')
|
|
142
|
+
continue;
|
|
143
|
+
try {
|
|
144
|
+
const obj = JSON.parse(line);
|
|
145
|
+
if (obj !== null && typeof obj === 'object' && obj.type === 'result')
|
|
146
|
+
return line;
|
|
147
|
+
}
|
|
148
|
+
catch {
|
|
149
|
+
// skip a partial/non-JSON line
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
throw new Error('claude -p stream contained no result event (transport envelope)');
|
|
153
|
+
}
|
|
108
154
|
// Map each raw nextSteps entry to NewStepSpec. Require role/kind/input; default taskId and
|
|
109
155
|
// modelProfile from the current step so the agent never needs to know IDs. Throw a lesson-bearing
|
|
110
156
|
// error (naming the index) on a malformed entry.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"result-envelope.js","sourceRoot":"","sources":["../../src/worker/result-envelope.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"result-envelope.js","sourceRoot":"","sources":["../../src/worker/result-envelope.ts"],"names":[],"mappings":"AAGA,+FAA+F;AAC/F,mGAAmG;AACnG,6FAA6F;AAC7F,MAAM,CAAC,MAAM,mBAAmB,GAAG,IAAI,CAAC,SAAS,CAAC;IAChD,IAAI,EAAE,QAAQ;IACd,oBAAoB,EAAE,KAAK;IAC3B,UAAU,EAAE;QACV,OAAO,EAAE;YACP,IAAI,EAAE,QAAQ;YACd,SAAS,EAAE,CAAC;YACZ,WAAW,EAAE,kGAAkG;SAChH;QACD,MAAM,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,yEAAyE,EAAE;QAClH,SAAS,EAAE,EAAE,WAAW,EAAE,oEAAoE,EAAE;QAChG,SAAS,EAAE;YACT,IAAI,EAAE,OAAO;YACb,WAAW,EAAE,uEAAuE;YACpF,KAAK,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;SAC1B;QACD,UAAU,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,WAAW,EAAE,yDAAyD,EAAE;QACvG,MAAM,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,6CAA6C,EAAE;KACvF;IACD,QAAQ,EAAE,CAAC,SAAS,EAAE,QAAQ,CAAC;CAChC,CAAC,CAAC;AAEH,wGAAwG;AACxG,MAAM,CAAC,MAAM,sBAAsB,GAAG;;;;;;CAMrC,CAAC;AAEF,iGAAiG;AACjG,MAAM,UAAU,yBAAyB,CAAC,UAAmB;IAC3D,IAAI,UAAU,KAAK,SAAS,EAAE,CAAC;QAC7B,MAAM,IAAI,SAAS,CAAC,mDAAmD,CAAC,CAAC;IAC3E,CAAC;IACD,IAAI,UAAU,KAAK,IAAI,IAAI,OAAO,UAAU,KAAK,QAAQ,IAAI,KAAK,CAAC,OAAO,CAAC,UAAU,CAAC,EAAE,CAAC;QACvF,MAAM,IAAI,SAAS,CAAC,2CAA2C,CAAC,CAAC;IACnE,CAAC;IACD,MAAM,CAAC,GAAG,UAAqC,CAAC;IAChD,IAAI,OAAO,CAAC,CAAC,OAAO,KAAK,QAAQ,IAAI,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACnE,MAAM,IAAI,SAAS,CAAC,4DAA4D,CAAC,CAAC;IACpF,CAAC;IACD,IAAI,OAAO,CAAC,CAAC,MAAM,KAAK,QAAQ,EAAE,CAAC;QACjC,MAAM,IAAI,SAAS,CAAC,wDAAwD,CAAC,CAAC;IAChF,CAAC;IACD,IAAI,YAAY,IAAI,CAAC,IAAI,OAAO,CAAC,CAAC,UAAU,KAAK,SAAS,EAAE,CAAC;QAC3D,MAAM,IAAI,SAAS,CAAC,mEAAmE,CAAC,CAAC;IAC3F,CAAC;IACD,IAAI,QAAQ,IAAI,CAAC,IAAI,CAAC,CAAC,MAAM,KAAK,IAAI,IAAI,OAAO,CAAC,CAAC,MAAM,KAAK,QAAQ,EAAE,CAAC;QACvE,MAAM,IAAI,SAAS,CAAC,8DAA8D,CAAC,CAAC;IACtF,CAAC;IACD,IAAI,WAAW,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC,EAAE,CAAC;QACpD,MAAM,IAAI,SAAS,CAAC,iEAAiE,CAAC,CAAC;IACzF,CAAC;IACD,OAAO;QACL,MAAM,EAAE,CAAC,CAAC,MAAM;QAChB,OAAO,EAAE,CAAC,CAAC,OAAO;QAClB,SAAS,EAAE,CAAC,CAAC,SAAS;QACtB,SAAS,EAAE,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE;QACxD,UAAU,EAAE,CAAC,CAAC,UAAU,KAAK,IAAI;QACjC,MAAM,EAAE,OAAO,CAAC,CAAC,MAAM,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS;KAC5D,CAAC;AACJ,CAAC;AAwBD,SAAS,UAAU,CAAC,KAAc;IAChC,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC;AACjF,CAAC;AAED,SAAS,aAAa,CAAC,GAA4B;IACjD,IAAI,OAAO,GAAG,CAAC,MAAM,KAAK,QAAQ;QAAE,OAAO,GAAG,CAAC,MAAM,CAAC;IACtD,IAAI,OAAO,GAAG,CAAC,IAAI,KAAK,QAAQ;QAAE,OAAO,GAAG,CAAC,IAAI,CAAC;IAClD,OAAO,EAAE,CAAC;AACZ,CAAC;AAED,SAAS,kBAAkB,CAAC,KAAc;IACxC,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC;AAC3E,CAAC;AAED,gGAAgG;AAChG,kEAAkE;AAClE,MAAM,UAAU,sBAAsB,CAAC,MAAc;IACnD,IAAI,MAAe,CAAC;IACpB,IAAI,CAAC;QACH,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;IAC9B,CAAC;IAAC,MAAM,CAAC;QACP,MAAM,IAAI,KAAK,CAAC,8DAA8D,CAAC,CAAC;IAClF,CAAC;IACD,IAAI,MAAM,KAAK,IAAI,IAAI,OAAO,MAAM,KAAK,QAAQ,EAAE,CAAC;QAClD,MAAM,IAAI,KAAK,CAAC,8DAA8D,CAAC,CAAC;IAClF,CAAC;IACD,MAAM,GAAG,GAAG,MAAiC,CAAC;IAC9C,MAAM,KAAK,GACT,GAAG,CAAC,KAAK,KAAK,IAAI,IAAI,OAAO,GAAG,CAAC,KAAK,KAAK,QAAQ;QACjD,CAAC,CAAE,GAAG,CAAC,KAAiC;QACxC,CAAC,CAAC,SAAS,CAAC;IAChB,OAAO;QACL,IAAI,EAAE,aAAa,CAAC,GAAG,CAAC;QACxB,OAAO,EAAE,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC;QAC9B,iBAAiB,EAAE,GAAG,CAAC,kBAAkB;QACzC,cAAc,EAAE,kBAAkB,CAAC,GAAG,CAAC,eAAe,CAAC;QACvD,SAAS,EAAE,kBAAkB,CAAC,GAAG,CAAC,UAAU,CAAC;QAC7C,OAAO,EAAE,UAAU,CAAC,GAAG,CAAC,cAAc,CAAC,IAAI,UAAU,CAAC,GAAG,CAAC,QAAQ,CAAC;QACnE,WAAW,EAAE,UAAU,CAAC,KAAK,EAAE,YAAY,CAAC;QAC5C,YAAY,EAAE,UAAU,CAAC,KAAK,EAAE,aAAa,CAAC;QAC9C,gBAAgB,EAAE,GAAG,CAAC,iBAAiB;KACxC,CAAC;AACJ,CAAC;AAED;;;;;;;;;GASG;AACH,MAAM,UAAU,qBAAqB,CAAC,MAAc;IAClD,MAAM,OAAO,GAAG,MAAM,CAAC,IAAI,EAAE,CAAC;IAC9B,IAAI,OAAO,KAAK,EAAE;QAAE,MAAM,IAAI,KAAK,CAAC,mDAAmD,CAAC,CAAC;IACzF,2FAA2F;IAC3F,kGAAkG;IAClG,gGAAgG;IAChG,gGAAgG;IAChG,IAAI,CAAC;QACH,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QAClC,IAAI,KAAK,KAAK,IAAI,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;YACzE,MAAM,IAAI,GAAI,KAAiC,CAAC,IAAI,CAAC;YACrD,IAAI,IAAI,KAAK,SAAS,IAAI,IAAI,KAAK,QAAQ;gBAAE,OAAO,OAAO,CAAC;QAC9D,CAAC;IACH,CAAC;IAAC,MAAM,CAAC;QACP,wDAAwD;IAC1D,CAAC;IACD,4EAA4E;IAC5E,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;IACrC,KAAK,IAAI,CAAC,GAAG,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;QAC3C,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;QAC7B,IAAI,IAAI,KAAK,EAAE;YAAE,SAAS;QAC1B,IAAI,CAAC;YACH,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAA4B,CAAC;YACxD,IAAI,GAAG,KAAK,IAAI,IAAI,OAAO,GAAG,KAAK,QAAQ,IAAI,GAAG,CAAC,IAAI,KAAK,QAAQ;gBAAE,OAAO,IAAI,CAAC;QACpF,CAAC;QAAC,MAAM,CAAC;YACP,+BAA+B;QACjC,CAAC;IACH,CAAC;IACD,MAAM,IAAI,KAAK,CAAC,iEAAiE,CAAC,CAAC;AACrF,CAAC;AAED,2FAA2F;AAC3F,kGAAkG;AAClG,iDAAiD;AACjD,MAAM,UAAU,kBAAkB,CAAC,GAAc,EAAE,IAAU;IAC3D,OAAO,GAAG,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,CAAC,EAAE,EAAE;QAC1B,IAAI,KAAK,KAAK,IAAI,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;YAChD,MAAM,IAAI,KAAK,CAAC,0BAA0B,CAAC,oBAAoB,CAAC,CAAC;QACnE,CAAC;QACD,MAAM,CAAC,GAAG,KAAgC,CAAC;QAC3C,IAAI,OAAO,CAAC,CAAC,IAAI,KAAK,QAAQ,IAAI,CAAC,CAAC,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACtD,MAAM,IAAI,KAAK,CAAC,0BAA0B,CAAC,2BAA2B,CAAC,CAAC;QAC1E,CAAC;QACD,IAAI,OAAO,CAAC,CAAC,IAAI,KAAK,QAAQ,IAAI,CAAC,CAAC,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACtD,MAAM,IAAI,KAAK,CAAC,0BAA0B,CAAC,2BAA2B,CAAC,CAAC;QAC1E,CAAC;QACD,IAAI,CAAC,CAAC,OAAO,IAAI,CAAC,CAAC,EAAE,CAAC;YACpB,MAAM,IAAI,KAAK,CAAC,0BAA0B,CAAC,4BAA4B,CAAC,CAAC;QAC3E,CAAC;QACD,MAAM,IAAI,GAAgB;YACxB,MAAM,EAAE,OAAO,CAAC,CAAC,MAAM,KAAK,QAAQ,IAAI,CAAC,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM;YACpF,IAAI,EAAE,CAAC,CAAC,IAAI;YACZ,IAAI,EAAE,CAAC,CAAC,IAAI;YACZ,KAAK,EAAE,CAAC,CAAC,KAAK;YACd,YAAY,EACV,OAAO,CAAC,CAAC,YAAY,KAAK,QAAQ,IAAI,CAAC,CAAC,YAAY,CAAC,MAAM,GAAG,CAAC;gBAC7D,CAAC,CAAC,CAAC,CAAC,YAAY;gBAChB,CAAC,CAAC,IAAI,CAAC,YAAY;SACxB,CAAC;QACF,IAAI,OAAO,CAAC,CAAC,QAAQ,KAAK,QAAQ;YAAE,IAAI,CAAC,QAAQ,GAAG,CAAC,CAAC,QAAQ,CAAC;QAC/D,IAAI,OAAO,CAAC,CAAC,WAAW,KAAK,QAAQ;YAAE,IAAI,CAAC,WAAW,GAAG,CAAC,CAAC,WAAW,CAAC;QACxE,IAAI,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC;YAAE,IAAI,CAAC,SAAS,GAAG,CAAC,CAAC,SAAS,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;QACzE,IAAI,OAAO,CAAC,CAAC,QAAQ,KAAK,QAAQ;YAAE,IAAI,CAAC,QAAQ,GAAG,CAAC,CAAC,QAAQ,CAAC;QAC/D,OAAO,IAAI,CAAC;IACd,CAAC,CAAC,CAAC;AACL,CAAC"}
|