@revisium/orchestrator 0.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +20 -0
- package/bin/revo.js +2 -0
- package/control-plane/bootstrap.config.json +931 -0
- package/dist/app.module.js +28 -0
- package/dist/app.module.js.map +1 -0
- package/dist/cli/commands/bootstrap.js +39 -0
- package/dist/cli/commands/bootstrap.js.map +1 -0
- package/dist/cli/commands/dev.js +143 -0
- package/dist/cli/commands/dev.js.map +1 -0
- package/dist/cli/commands/inbox.js +288 -0
- package/dist/cli/commands/inbox.js.map +1 -0
- package/dist/cli/commands/mcp.js +16 -0
- package/dist/cli/commands/mcp.js.map +1 -0
- package/dist/cli/commands/playbook.js +74 -0
- package/dist/cli/commands/playbook.js.map +1 -0
- package/dist/cli/commands/poll-workflow-state.js +144 -0
- package/dist/cli/commands/poll-workflow-state.js.map +1 -0
- package/dist/cli/commands/revisium-context.js +23 -0
- package/dist/cli/commands/revisium-context.js.map +1 -0
- package/dist/cli/commands/revisium-helpers.js +61 -0
- package/dist/cli/commands/revisium-helpers.js.map +1 -0
- package/dist/cli/commands/revisium.js +89 -0
- package/dist/cli/commands/revisium.js.map +1 -0
- package/dist/cli/commands/run.js +426 -0
- package/dist/cli/commands/run.js.map +1 -0
- package/dist/cli/commands/work.js +149 -0
- package/dist/cli/commands/work.js.map +1 -0
- package/dist/cli/config.js +2 -0
- package/dist/cli/config.js.map +1 -0
- package/dist/cli/index.js +32 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/cli/live-guard.js +49 -0
- package/dist/cli/live-guard.js.map +1 -0
- package/dist/cli/needs-host.js +78 -0
- package/dist/cli/needs-host.js.map +1 -0
- package/dist/cli/program.js +37 -0
- package/dist/cli/program.js.map +1 -0
- package/dist/config.js +102 -0
- package/dist/config.js.map +1 -0
- package/dist/control-plane/client-transport.js +146 -0
- package/dist/control-plane/client-transport.js.map +1 -0
- package/dist/control-plane/data-access.js +99 -0
- package/dist/control-plane/data-access.js.map +1 -0
- package/dist/control-plane/definitions.js +120 -0
- package/dist/control-plane/definitions.js.map +1 -0
- package/dist/control-plane/errors.js +13 -0
- package/dist/control-plane/errors.js.map +1 -0
- package/dist/control-plane/inbox.js +261 -0
- package/dist/control-plane/inbox.js.map +1 -0
- package/dist/control-plane/index.js +6 -0
- package/dist/control-plane/index.js.map +1 -0
- package/dist/control-plane/json-fields.js +68 -0
- package/dist/control-plane/json-fields.js.map +1 -0
- package/dist/control-plane/resolve-cwd.js +75 -0
- package/dist/control-plane/resolve-cwd.js.map +1 -0
- package/dist/control-plane/steps.js +381 -0
- package/dist/control-plane/steps.js.map +1 -0
- package/dist/control-plane/tables.js +13 -0
- package/dist/control-plane/tables.js.map +1 -0
- package/dist/control-plane/versioned-meaning.js +53 -0
- package/dist/control-plane/versioned-meaning.js.map +1 -0
- package/dist/engine/dbos.module.js +18 -0
- package/dist/engine/dbos.module.js.map +1 -0
- package/dist/engine/dbos.service.js +296 -0
- package/dist/engine/dbos.service.js.map +1 -0
- package/dist/engine/ensure-postgres.js +80 -0
- package/dist/engine/ensure-postgres.js.map +1 -0
- package/dist/engine/types.js +2 -0
- package/dist/engine/types.js.map +1 -0
- package/dist/host/ensure-revisium.js +269 -0
- package/dist/host/ensure-revisium.js.map +1 -0
- package/dist/host/host.lifecycle.js +75 -0
- package/dist/host/host.lifecycle.js.map +1 -0
- package/dist/mcp/mcp-capabilities.js +47 -0
- package/dist/mcp/mcp-capabilities.js.map +1 -0
- package/dist/mcp/mcp-facade.service.js +130 -0
- package/dist/mcp/mcp-facade.service.js.map +1 -0
- package/dist/mcp/mcp-stdio.service.js +48 -0
- package/dist/mcp/mcp-stdio.service.js.map +1 -0
- package/dist/mcp/mcp-tools.js +264 -0
- package/dist/mcp/mcp-tools.js.map +1 -0
- package/dist/mcp/mcp.module.js +21 -0
- package/dist/mcp/mcp.module.js.map +1 -0
- package/dist/package-info.js +10 -0
- package/dist/package-info.js.map +1 -0
- package/dist/pipeline/await-human.js +62 -0
- package/dist/pipeline/await-human.js.map +1 -0
- package/dist/pipeline/develop-task.workflow.js +497 -0
- package/dist/pipeline/develop-task.workflow.js.map +1 -0
- package/dist/pipeline/pipeline.module.js +34 -0
- package/dist/pipeline/pipeline.module.js.map +1 -0
- package/dist/playbook/catalog-loader.js +145 -0
- package/dist/playbook/catalog-loader.js.map +1 -0
- package/dist/playbook/errors.js +14 -0
- package/dist/playbook/errors.js.map +1 -0
- package/dist/playbook/import-mapper.js +186 -0
- package/dist/playbook/import-mapper.js.map +1 -0
- package/dist/playbook/manifest.js +60 -0
- package/dist/playbook/manifest.js.map +1 -0
- package/dist/playbook/playbook-installer.js +51 -0
- package/dist/playbook/playbook-installer.js.map +1 -0
- package/dist/playbook/prompt-composer.js +34 -0
- package/dist/playbook/prompt-composer.js.map +1 -0
- package/dist/playbook/source-resolver.js +105 -0
- package/dist/playbook/source-resolver.js.map +1 -0
- package/dist/poller/pr-readiness-core.js +656 -0
- package/dist/poller/pr-readiness-core.js.map +1 -0
- package/dist/poller/pr-readiness.js +91 -0
- package/dist/poller/pr-readiness.js.map +1 -0
- package/dist/revisium/inbox.service.js +67 -0
- package/dist/revisium/inbox.service.js.map +1 -0
- package/dist/revisium/playbooks.service.js +99 -0
- package/dist/revisium/playbooks.service.js.map +1 -0
- package/dist/revisium/revisium.module.js +55 -0
- package/dist/revisium/revisium.module.js.map +1 -0
- package/dist/revisium/roles.service.js +79 -0
- package/dist/revisium/roles.service.js.map +1 -0
- package/dist/revisium/run.service.js +182 -0
- package/dist/revisium/run.service.js.map +1 -0
- package/dist/revisium/tokens.js +7 -0
- package/dist/revisium/tokens.js.map +1 -0
- package/dist/run/append-event.js +112 -0
- package/dist/run/append-event.js.map +1 -0
- package/dist/run/cancel-run.js +47 -0
- package/dist/run/cancel-run.js.map +1 -0
- package/dist/run/create-run.js +208 -0
- package/dist/run/create-run.js.map +1 -0
- package/dist/run/fail-run.js +20 -0
- package/dist/run/fail-run.js.map +1 -0
- package/dist/run/inspect-run.js +287 -0
- package/dist/run/inspect-run.js.map +1 -0
- package/dist/run/terminal-run-status.js +45 -0
- package/dist/run/terminal-run-status.js.map +1 -0
- package/dist/runners/claude-code.service.js +48 -0
- package/dist/runners/claude-code.service.js.map +1 -0
- package/dist/runners/gh-identity.js +108 -0
- package/dist/runners/gh-identity.js.map +1 -0
- package/dist/runners/integrator.js +417 -0
- package/dist/runners/integrator.js.map +1 -0
- package/dist/runners/runner.module.js +40 -0
- package/dist/runners/runner.module.js.map +1 -0
- package/dist/runners/tokens.js +7 -0
- package/dist/runners/tokens.js.map +1 -0
- package/dist/task-control-plane/pr-readiness.service.js +33 -0
- package/dist/task-control-plane/pr-readiness.service.js.map +1 -0
- package/dist/task-control-plane/task-control-plane-api.service.js +440 -0
- package/dist/task-control-plane/task-control-plane-api.service.js.map +1 -0
- package/dist/task-control-plane/task-control-plane.module.js +23 -0
- package/dist/task-control-plane/task-control-plane.module.js.map +1 -0
- package/dist/worker/build-context.js +39 -0
- package/dist/worker/build-context.js.map +1 -0
- package/dist/worker/claude-code-runner.js +135 -0
- package/dist/worker/claude-code-runner.js.map +1 -0
- package/dist/worker/git-worktree-manager.js +84 -0
- package/dist/worker/git-worktree-manager.js.map +1 -0
- package/dist/worker/loop.js +122 -0
- package/dist/worker/loop.js.map +1 -0
- package/dist/worker/process-executor.js +62 -0
- package/dist/worker/process-executor.js.map +1 -0
- package/dist/worker/result-envelope.js +134 -0
- package/dist/worker/result-envelope.js.map +1 -0
- package/dist/worker/runner-dispatch.js +20 -0
- package/dist/worker/runner-dispatch.js.map +1 -0
- package/dist/worker/runner.js +2 -0
- package/dist/worker/runner.js.map +1 -0
- package/dist/worker/script-runner.js +28 -0
- package/dist/worker/script-runner.js.map +1 -0
- package/dist/worker/stub-runner.js +59 -0
- package/dist/worker/stub-runner.js.map +1 -0
- package/dist/worker/worker-id.js +18 -0
- package/dist/worker/worker-id.js.map +1 -0
- package/dist/worker/worktree-manager.js +7 -0
- package/dist/worker/worktree-manager.js.map +1 -0
- package/package.json +66 -0
- package/revisium.config.json +10 -0
|
@@ -0,0 +1,426 @@
|
|
|
1
|
+
import { ControlPlaneError } from '../../control-plane/index.js';
|
|
2
|
+
import { CreateRunWorkflowError } from '../../run/create-run.js';
|
|
3
|
+
import { formatRunList, formatRunDetail, formatEventList, formatEventListVerbose, formatAttemptList } from '../../run/inspect-run.js';
|
|
4
|
+
import { withRevisiumService } from './revisium-context.js';
|
|
5
|
+
import { sanitizeWorkflowID } from './dev.js';
|
|
6
|
+
import { pollWorkflowState } from './poll-workflow-state.js';
|
|
7
|
+
import { assertNoStubLive, warnLiveCost } from '../live-guard.js';
|
|
8
|
+
/**
|
|
9
|
+
* Lazily resolve PipelineService from the Nest app context (F10: no static pipeline import).
|
|
10
|
+
* Dynamic import: only loads pipeline code on the host path.
|
|
11
|
+
*/
|
|
12
|
+
async function resolvePipelineService(app) {
|
|
13
|
+
const { PipelineService } = await import('../../pipeline/develop-task.workflow.js');
|
|
14
|
+
return app.get(PipelineService);
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* runPollWorkflowState — thin wrapper that opens an InboxService context and
|
|
18
|
+
* delegates to the shared pollWorkflowState helper (poll-workflow-state.ts).
|
|
19
|
+
*
|
|
20
|
+
* Extracted to a local wrapper so runStart can call pollWorkflowState without
|
|
21
|
+
* holding an open Nest context for the full start flow.
|
|
22
|
+
*/
|
|
23
|
+
async function runPollWorkflowState(runId, dbosService, pollOpts = {}) {
|
|
24
|
+
const { InboxService: InboxServiceClass } = await import('../../revisium/inbox.service.js');
|
|
25
|
+
const { RunService: RunServiceClass } = await import('../../revisium/run.service.js');
|
|
26
|
+
// 0008 #2: surface the run_failed reason on a FAILURE terminal status. The reader opens its own
|
|
27
|
+
// short-lived Revisium context per call (the poll loop only reads it once, on the terminal tick).
|
|
28
|
+
const readFailure = (id) => withRevisiumService(RunServiceClass, (svc) => svc.getRunFailure(id));
|
|
29
|
+
await withRevisiumService(InboxServiceClass, (inboxSvc) => pollWorkflowState(runId, dbosService, inboxSvc, { ...pollOpts, readFailure }));
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* runStartCore — testable core of `run start`.
|
|
33
|
+
*
|
|
34
|
+
* Exported for unit tests (C1 pattern): tests inject fake RunStartDeps and assert the
|
|
35
|
+
* EXACT runnerMode forwarded to startDevelopTask without creating a NestJS context.
|
|
36
|
+
* Production: called by runStart after building deps from the live app context.
|
|
37
|
+
*/
|
|
38
|
+
export async function runStartCore(safeRunId, options, deps) {
|
|
39
|
+
// Validate flag combination: --stub + --live is an error
|
|
40
|
+
if (!assertNoStubLive(options.stub ?? false, options.live ?? false))
|
|
41
|
+
return;
|
|
42
|
+
// E12: pre-check the run exists in Revisium before enqueueing.
|
|
43
|
+
const runRow = await deps.getRun(safeRunId);
|
|
44
|
+
if (!runRow) {
|
|
45
|
+
console.error(`run not found: ${safeRunId}`);
|
|
46
|
+
process.exitCode = 1;
|
|
47
|
+
return;
|
|
48
|
+
}
|
|
49
|
+
// Emit cost/effect warning BEFORE enqueue (live mode).
|
|
50
|
+
if (options.live)
|
|
51
|
+
warnLiveCost();
|
|
52
|
+
const existingStatus = await deps.getWorkflowStatus(safeRunId);
|
|
53
|
+
// Map flags to runnerMode (M1):
|
|
54
|
+
// --live → 'live'; default or --stub → 'script'
|
|
55
|
+
const runnerMode = options.live ? 'live' : 'script';
|
|
56
|
+
const handle = await deps.startDevelopTask(safeRunId, { runnerMode });
|
|
57
|
+
if (existingStatus !== null) {
|
|
58
|
+
console.log('note: this run was already started — the runner cannot be changed after the first start.');
|
|
59
|
+
console.log(' to use a different runner, create a new run with a new runId.');
|
|
60
|
+
console.log(`workflow: ${handle.workflowID}`);
|
|
61
|
+
}
|
|
62
|
+
else {
|
|
63
|
+
console.log(`workflow: ${handle.workflowID}`);
|
|
64
|
+
if (options.stub) {
|
|
65
|
+
console.log('stub: --stub is active (zero-cost run via stub runner).');
|
|
66
|
+
}
|
|
67
|
+
if (options.live) {
|
|
68
|
+
console.log('live: --live is active (real Claude + real git/gh integrator).');
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
// 0004 §3.6: poll for parked or terminal state; thread --wait through to the viewer.
|
|
72
|
+
console.log('awaiting settled state (parked or terminal)…');
|
|
73
|
+
await deps.pollState(safeRunId, { wait: options.wait ?? false });
|
|
74
|
+
}
|
|
75
|
+
/**
|
|
76
|
+
* run start <id> [--stub]
|
|
77
|
+
*
|
|
78
|
+
* Host-requiring: enqueues the developTask DBOS workflow for the given runId.
|
|
79
|
+
* `--stub` forces zero-cost stub runner via the durable runnerOverride arg (B4).
|
|
80
|
+
*
|
|
81
|
+
* B10: start is idempotent by workflowID=runId. `--stub` only takes effect on the FIRST
|
|
82
|
+
* start; a subsequent `run start --stub` on an already-started run returns the existing
|
|
83
|
+
* handle and does NOT switch the runner (DBOS does not overwrite persisted args).
|
|
84
|
+
* To switch, create a NEW run (new runId) and start that with --stub.
|
|
85
|
+
*
|
|
86
|
+
* 0004 §3.6: no longer blocks on waitForWorkflowResult (the workflow parks at recv).
|
|
87
|
+
* Instead, polls getWorkflowStatus (terminal) + listInbox (parked) and returns once settled.
|
|
88
|
+
* The workflow's DBOS checkpoint persists; shutting down the host while parked is safe.
|
|
89
|
+
*/
|
|
90
|
+
async function runStart(runId, options, app) {
|
|
91
|
+
if (!app) {
|
|
92
|
+
console.error('run start requires the host context — invoke via the host path');
|
|
93
|
+
process.exitCode = 1;
|
|
94
|
+
return;
|
|
95
|
+
}
|
|
96
|
+
// E11: validate the runId before any enqueue.
|
|
97
|
+
let safeRunId;
|
|
98
|
+
try {
|
|
99
|
+
safeRunId = sanitizeWorkflowID(runId);
|
|
100
|
+
}
|
|
101
|
+
catch (err) {
|
|
102
|
+
console.error(err.message);
|
|
103
|
+
process.exitCode = 1;
|
|
104
|
+
return;
|
|
105
|
+
}
|
|
106
|
+
try {
|
|
107
|
+
// Build live deps from the Nest app context and withRevisiumService.
|
|
108
|
+
const { RunService: RunServiceClass } = await import('../../revisium/run.service.js');
|
|
109
|
+
const { DbosService: DbosServiceClass } = await import('../../engine/dbos.service.js');
|
|
110
|
+
const dbosService = app.get(DbosServiceClass);
|
|
111
|
+
const pipeline = await resolvePipelineService(app);
|
|
112
|
+
const deps = {
|
|
113
|
+
getRun: (id) => withRevisiumService(RunServiceClass, (svc) => svc.getRun(id)),
|
|
114
|
+
getWorkflowStatus: (id) => dbosService.getWorkflowStatus(id),
|
|
115
|
+
startDevelopTask: (id, opts) => pipeline.startDevelopTask(id, opts),
|
|
116
|
+
pollState: (id, pollOpts) => runPollWorkflowState(id, dbosService, pollOpts),
|
|
117
|
+
};
|
|
118
|
+
await runStartCore(safeRunId, options, deps);
|
|
119
|
+
}
|
|
120
|
+
catch (error) {
|
|
121
|
+
reportRunCliError(error);
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
/**
|
|
125
|
+
* reportRunCliError — shared error reporter for the `run` subcommands.
|
|
126
|
+
* Prints a uniform Error line (+ hint for ControlPlaneError) and sets exitCode=1.
|
|
127
|
+
* Extracted to remove the catch-block duplication the per-command handlers shared.
|
|
128
|
+
*/
|
|
129
|
+
export function reportRunCliError(error) {
|
|
130
|
+
if (error instanceof ControlPlaneError) {
|
|
131
|
+
console.error(`Error: ${formatCause(error)}`);
|
|
132
|
+
printHint(error, false);
|
|
133
|
+
}
|
|
134
|
+
else if (error instanceof Error) {
|
|
135
|
+
console.error(`Error: ${error.message}`);
|
|
136
|
+
}
|
|
137
|
+
else {
|
|
138
|
+
console.error(`Error: ${String(error)}`);
|
|
139
|
+
}
|
|
140
|
+
process.exitCode = 1;
|
|
141
|
+
}
|
|
142
|
+
export function formatCause(error) {
|
|
143
|
+
if (error instanceof ControlPlaneError) {
|
|
144
|
+
const status = error.status === undefined ? '' : ` status=${error.status}`;
|
|
145
|
+
return `${error.code}${status}: ${error.message}`;
|
|
146
|
+
}
|
|
147
|
+
if (error instanceof Error)
|
|
148
|
+
return error.message;
|
|
149
|
+
return String(error);
|
|
150
|
+
}
|
|
151
|
+
export function printHint(error, createdRows) {
|
|
152
|
+
if (error.code === 'DAEMON_NOT_RUNNING') {
|
|
153
|
+
console.error('Run: ./bin/revo.js revisium start');
|
|
154
|
+
}
|
|
155
|
+
if (error.code === 'BOOTSTRAP_NOT_APPLIED' && !createdRows) {
|
|
156
|
+
console.error('Run: ./bin/revo.js bootstrap --commit');
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
function parsePriority(value) {
|
|
160
|
+
const priority = Number(value);
|
|
161
|
+
if (!Number.isFinite(priority) || !Number.isInteger(priority)) {
|
|
162
|
+
throw new TypeError(`Invalid priority: ${value}`);
|
|
163
|
+
}
|
|
164
|
+
return priority;
|
|
165
|
+
}
|
|
166
|
+
function parseLimit(value, flag) {
|
|
167
|
+
if (value === undefined)
|
|
168
|
+
return undefined;
|
|
169
|
+
const n = Number(value);
|
|
170
|
+
if (!Number.isFinite(n) || !Number.isInteger(n) || n < 1) {
|
|
171
|
+
throw new Error(`Invalid ${flag}: ${value} (must be a positive integer)`);
|
|
172
|
+
}
|
|
173
|
+
return n;
|
|
174
|
+
}
|
|
175
|
+
/**
|
|
176
|
+
* withRunService — thin wrapper around the shared withRevisiumService helper.
|
|
177
|
+
* Opens exactly ONE Nest context per invocation and closes it in finally.
|
|
178
|
+
*/
|
|
179
|
+
async function withRunService(fn) {
|
|
180
|
+
const { RunService: RunServiceClass } = await import('../../revisium/run.service.js');
|
|
181
|
+
return withRevisiumService(RunServiceClass, fn);
|
|
182
|
+
}
|
|
183
|
+
/**
|
|
184
|
+
* createRunCore — testable core of `run create`.
|
|
185
|
+
*
|
|
186
|
+
* Exported for unit tests (mirrors C1 pattern from runStartCore): tests inject fake
|
|
187
|
+
* CreateRunDeps and assert the correct error paths WITHOUT creating a NestJS context.
|
|
188
|
+
* Production: called by createRun after building the real deps.
|
|
189
|
+
*
|
|
190
|
+
* Key invariant (B+C fix): ALL start-mode preconditions are validated BEFORE any write.
|
|
191
|
+
* If validation fails, NO run is created and process.exitCode is set to 1.
|
|
192
|
+
* (a) --start without app → host-required error, return, zero writes.
|
|
193
|
+
* (b) --start --stub --live → contradiction error (via assertNoStubLive), return, zero writes.
|
|
194
|
+
* Only after both checks pass is createRunFn called, then runStart exactly once.
|
|
195
|
+
*
|
|
196
|
+
* Cost-guard: live is only forwarded to runStart which maps it → 'live' runnerMode; the
|
|
197
|
+
* throwing claudeCode runner is never reached without explicit --live (0005 guard intact).
|
|
198
|
+
*/
|
|
199
|
+
export async function createRunCore(options, deps) {
|
|
200
|
+
// Validate start-mode preconditions BEFORE any write (B+C fix: no orphan drafts).
|
|
201
|
+
if (options.start) {
|
|
202
|
+
if (!deps.app) {
|
|
203
|
+
console.error('run create --start requires the host context — invoke via the host path');
|
|
204
|
+
process.exitCode = 1;
|
|
205
|
+
return;
|
|
206
|
+
}
|
|
207
|
+
// assertNoStubLive returns false and sets exitCode=1 on contradiction.
|
|
208
|
+
if (!assertNoStubLive(options.stub ?? false, options.live ?? false)) {
|
|
209
|
+
return;
|
|
210
|
+
}
|
|
211
|
+
}
|
|
212
|
+
// Validation passed (or non-start path) — proceed with the write.
|
|
213
|
+
const result = await deps.createRunFn({
|
|
214
|
+
title: options.title,
|
|
215
|
+
repo: options.repo,
|
|
216
|
+
description: options.description,
|
|
217
|
+
scope: options.scope,
|
|
218
|
+
priority: parsePriority(options.priority),
|
|
219
|
+
role: options.role,
|
|
220
|
+
});
|
|
221
|
+
console.log(`created run ${result.runId}`);
|
|
222
|
+
console.log(`task ${result.taskId}`);
|
|
223
|
+
console.log(`step ${result.stepId} ${result.status}`);
|
|
224
|
+
console.log(`event ${result.eventId}`);
|
|
225
|
+
console.log('status: ready (draft only, not committed)');
|
|
226
|
+
// --start: chain into runStart exactly once (no inline second enqueue).
|
|
227
|
+
if (options.start) {
|
|
228
|
+
await deps.runStart(result.runId, {
|
|
229
|
+
stub: options.stub,
|
|
230
|
+
live: options.live,
|
|
231
|
+
wait: options.wait,
|
|
232
|
+
});
|
|
233
|
+
}
|
|
234
|
+
}
|
|
235
|
+
async function createRun(options, app) {
|
|
236
|
+
try {
|
|
237
|
+
const deps = {
|
|
238
|
+
createRunFn: (input) => withRunService((svc) => svc.createRun(input)),
|
|
239
|
+
runStart: (runId, startOpts) => runStart(runId, startOpts, app),
|
|
240
|
+
app,
|
|
241
|
+
};
|
|
242
|
+
await createRunCore(options, deps);
|
|
243
|
+
}
|
|
244
|
+
catch (error) {
|
|
245
|
+
if (error instanceof CreateRunWorkflowError) {
|
|
246
|
+
console.error(`Error: ${error.message}: ${formatCause(error.cause)}`);
|
|
247
|
+
if (Object.keys(error.createdIds).length > 0) {
|
|
248
|
+
console.error(`created before failure: ${JSON.stringify(error.createdIds)}`);
|
|
249
|
+
}
|
|
250
|
+
if (error.cause instanceof ControlPlaneError) {
|
|
251
|
+
printHint(error.cause, Object.keys(error.createdIds).length > 0);
|
|
252
|
+
}
|
|
253
|
+
process.exitCode = 1;
|
|
254
|
+
}
|
|
255
|
+
else {
|
|
256
|
+
reportRunCliError(error);
|
|
257
|
+
}
|
|
258
|
+
}
|
|
259
|
+
}
|
|
260
|
+
async function runList(options) {
|
|
261
|
+
try {
|
|
262
|
+
const limit = parseLimit(options.limit, '--limit');
|
|
263
|
+
const runs = await withRunService((svc) => svc.listRuns({ status: options.status, limit }));
|
|
264
|
+
if (options.json) {
|
|
265
|
+
process.stdout.write(JSON.stringify(runs, null, 2) + '\n');
|
|
266
|
+
}
|
|
267
|
+
else {
|
|
268
|
+
console.log(formatRunList(runs));
|
|
269
|
+
}
|
|
270
|
+
}
|
|
271
|
+
catch (error) {
|
|
272
|
+
reportRunCliError(error);
|
|
273
|
+
}
|
|
274
|
+
}
|
|
275
|
+
async function runShow(runId, options) {
|
|
276
|
+
try {
|
|
277
|
+
const detail = await withRunService((svc) => svc.showRun(runId));
|
|
278
|
+
if (!detail) {
|
|
279
|
+
console.error(`run not found: ${runId}`);
|
|
280
|
+
process.exitCode = 1;
|
|
281
|
+
return;
|
|
282
|
+
}
|
|
283
|
+
if (options.json) {
|
|
284
|
+
process.stdout.write(JSON.stringify(detail, null, 2) + '\n');
|
|
285
|
+
}
|
|
286
|
+
else {
|
|
287
|
+
console.log(formatRunDetail(detail));
|
|
288
|
+
}
|
|
289
|
+
}
|
|
290
|
+
catch (error) {
|
|
291
|
+
reportRunCliError(error);
|
|
292
|
+
}
|
|
293
|
+
}
|
|
294
|
+
async function runEvents(runId, options) {
|
|
295
|
+
try {
|
|
296
|
+
const limit = parseLimit(options.limit, '--limit');
|
|
297
|
+
// Both reads happen inside ONE Nest context (C2 fix: no two separate withRunService calls).
|
|
298
|
+
await withRunService(async (svc) => {
|
|
299
|
+
const found = await svc.getRun(runId);
|
|
300
|
+
if (!found) {
|
|
301
|
+
console.error(`run not found: ${runId}`);
|
|
302
|
+
process.exitCode = 1;
|
|
303
|
+
return;
|
|
304
|
+
}
|
|
305
|
+
const events = await svc.listRunEvents(runId, { type: options.type, limit });
|
|
306
|
+
if (options.json) {
|
|
307
|
+
process.stdout.write(JSON.stringify(events, null, 2) + '\n');
|
|
308
|
+
}
|
|
309
|
+
else if (options.verbose) {
|
|
310
|
+
console.log(formatEventListVerbose(events));
|
|
311
|
+
}
|
|
312
|
+
else {
|
|
313
|
+
console.log(formatEventList(events));
|
|
314
|
+
}
|
|
315
|
+
});
|
|
316
|
+
}
|
|
317
|
+
catch (error) {
|
|
318
|
+
reportRunCliError(error);
|
|
319
|
+
}
|
|
320
|
+
}
|
|
321
|
+
/**
|
|
322
|
+
* run log <runId> — per-attempt observability dump (0008 #4).
|
|
323
|
+
* Reads the previously-unused attempts table: output summary, verdict, model, tokens, cost,
|
|
324
|
+
* duration, iteration, status — closing the dogfood's "agent output not surfaced" gap.
|
|
325
|
+
*/
|
|
326
|
+
async function runLog(runId, options) {
|
|
327
|
+
try {
|
|
328
|
+
const limit = parseLimit(options.limit, '--limit');
|
|
329
|
+
await withRunService(async (svc) => {
|
|
330
|
+
const found = await svc.getRun(runId);
|
|
331
|
+
if (!found) {
|
|
332
|
+
console.error(`run not found: ${runId}`);
|
|
333
|
+
process.exitCode = 1;
|
|
334
|
+
return;
|
|
335
|
+
}
|
|
336
|
+
const attempts = await svc.listRunAttempts(runId, { limit });
|
|
337
|
+
if (options.json) {
|
|
338
|
+
process.stdout.write(JSON.stringify(attempts, null, 2) + '\n');
|
|
339
|
+
}
|
|
340
|
+
else {
|
|
341
|
+
console.log(formatAttemptList(attempts));
|
|
342
|
+
}
|
|
343
|
+
});
|
|
344
|
+
}
|
|
345
|
+
catch (error) {
|
|
346
|
+
reportRunCliError(error);
|
|
347
|
+
}
|
|
348
|
+
}
|
|
349
|
+
async function runCancel(runId) {
|
|
350
|
+
try {
|
|
351
|
+
const result = await withRunService((svc) => svc.cancelRun(runId));
|
|
352
|
+
if (!result) {
|
|
353
|
+
console.error(`run not found: ${runId}`);
|
|
354
|
+
process.exitCode = 1;
|
|
355
|
+
return;
|
|
356
|
+
}
|
|
357
|
+
if (result.previousStatus === 'cancelled') {
|
|
358
|
+
console.log(`run ${result.runId} already cancelled`);
|
|
359
|
+
}
|
|
360
|
+
else {
|
|
361
|
+
console.log(`cancelled run ${result.runId} (was ${result.previousStatus})`);
|
|
362
|
+
}
|
|
363
|
+
}
|
|
364
|
+
catch (error) {
|
|
365
|
+
reportRunCliError(error);
|
|
366
|
+
}
|
|
367
|
+
}
|
|
368
|
+
export function registerRun(program, app) {
|
|
369
|
+
const run = program.command('run').description('Manage orchestrator runs');
|
|
370
|
+
run
|
|
371
|
+
.command('start')
|
|
372
|
+
.description('Start the pipeline workflow for a run (host-requiring)')
|
|
373
|
+
.argument('<runId>', 'Run ID to start')
|
|
374
|
+
.option('--stub', 'Use zero-cost stub runner (dev/test only)', false)
|
|
375
|
+
.option('--live', 'Use the REAL Claude runner AND the real git/gh integrator — THIS WILL CALL claude, INCUR COST, AND PUSH/OPEN A PR', false)
|
|
376
|
+
.option('--wait', 'Keep a live viewer attached through step transitions until the run parks at a gate or finishes', false)
|
|
377
|
+
.action((runId, options) => runStart(runId, options, app));
|
|
378
|
+
run
|
|
379
|
+
.command('create')
|
|
380
|
+
.requiredOption('--title <title>', 'Run title')
|
|
381
|
+
.requiredOption('--repo <path-or-name>', 'Repository path or name')
|
|
382
|
+
.option('--description <text>', 'Run description')
|
|
383
|
+
.option('--scope <text>', 'Run scope')
|
|
384
|
+
.option('--priority <n>', 'Run priority', '0')
|
|
385
|
+
.option('--role <name>', 'Initial step role (architect|developer|reviewer|integrator|pr-watcher)', 'architect')
|
|
386
|
+
.option('--start', 'Immediately start the pipeline workflow after creating the run (host-requiring)', false)
|
|
387
|
+
.option('--wait', 'After starting, keep a live viewer attached until the run parks at a gate or finishes', false)
|
|
388
|
+
.option('--stub', 'With --start: use the zero-cost stub runner (default behavior)', false)
|
|
389
|
+
.option('--live', 'With --start: use the REAL Claude runner + real git/gh integrator (cost + PR)', false)
|
|
390
|
+
.action((options) => createRun(options, app));
|
|
391
|
+
run
|
|
392
|
+
.command('list')
|
|
393
|
+
.description('List runs')
|
|
394
|
+
.option('--status <status>', 'Filter by status')
|
|
395
|
+
.option('--limit <n>', 'Maximum number of results')
|
|
396
|
+
.option('--json', 'Output as JSON', false)
|
|
397
|
+
.action(runList);
|
|
398
|
+
run
|
|
399
|
+
.command('show')
|
|
400
|
+
.description('Show run details')
|
|
401
|
+
.argument('<runId>', 'Run ID')
|
|
402
|
+
.option('--json', 'Output as JSON', false)
|
|
403
|
+
.action(runShow);
|
|
404
|
+
run
|
|
405
|
+
.command('events')
|
|
406
|
+
.description('List events for a run')
|
|
407
|
+
.argument('<runId>', 'Run ID')
|
|
408
|
+
.option('--type <type>', 'Filter by event type')
|
|
409
|
+
.option('--limit <n>', 'Maximum number of results')
|
|
410
|
+
.option('--json', 'Output as JSON', false)
|
|
411
|
+
.option('--verbose', 'Expand each event payload (agent output, verdict, reason)', false)
|
|
412
|
+
.action(runEvents);
|
|
413
|
+
run
|
|
414
|
+
.command('log')
|
|
415
|
+
.description('Show per-attempt log for a run (output, verdict, model, tokens, cost, duration)')
|
|
416
|
+
.argument('<runId>', 'Run ID')
|
|
417
|
+
.option('--limit <n>', 'Maximum number of results')
|
|
418
|
+
.option('--json', 'Output as JSON', false)
|
|
419
|
+
.action(runLog);
|
|
420
|
+
run
|
|
421
|
+
.command('cancel')
|
|
422
|
+
.description('Cancel a run')
|
|
423
|
+
.argument('<runId>', 'Run ID')
|
|
424
|
+
.action(runCancel);
|
|
425
|
+
}
|
|
426
|
+
//# sourceMappingURL=run.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"run.js","sourceRoot":"","sources":["../../../src/cli/commands/run.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,149 @@
|
|
|
1
|
+
import { ControlPlaneError, createControlPlaneDataAccess, loadRole, loadModelProfile } from '../../control-plane/index.js';
|
|
2
|
+
import { makeResolveCwd as sharedMakeResolveCwd } from '../../control-plane/resolve-cwd.js';
|
|
3
|
+
import { stubRunAgent } from '../../worker/stub-runner.js';
|
|
4
|
+
import { createClaudeCodeRunner } from '../../worker/claude-code-runner.js';
|
|
5
|
+
import { GitWorktreeManager } from '../../worker/git-worktree-manager.js';
|
|
6
|
+
import { createRunAgent } from '../../worker/runner-dispatch.js';
|
|
7
|
+
import { createScriptRunner } from '../../worker/script-runner.js';
|
|
8
|
+
import { spawnExecutor } from '../../worker/process-executor.js';
|
|
9
|
+
import { runWorker } from '../../worker/loop.js';
|
|
10
|
+
import { resolveWorkerId } from '../../worker/worker-id.js';
|
|
11
|
+
import { warnLiveCost, requireLiveFlag } from '../live-guard.js';
|
|
12
|
+
function formatCause(error) {
|
|
13
|
+
if (error instanceof ControlPlaneError) {
|
|
14
|
+
const status = error.status === undefined ? '' : ` status=${error.status}`;
|
|
15
|
+
return `${error.code}${status}: ${error.message}`;
|
|
16
|
+
}
|
|
17
|
+
if (error instanceof Error)
|
|
18
|
+
return error.message;
|
|
19
|
+
return String(error);
|
|
20
|
+
}
|
|
21
|
+
function printHint(error) {
|
|
22
|
+
if (error.code === 'DAEMON_NOT_RUNNING') {
|
|
23
|
+
console.error('Run: revo revisium start');
|
|
24
|
+
}
|
|
25
|
+
if (error.code === 'BOOTSTRAP_NOT_APPLIED') {
|
|
26
|
+
console.error('Run: revo bootstrap --commit');
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* makeResolveCwd — delegates to the shared resolve-cwd module (B1 fix).
|
|
31
|
+
* Kept here for backward compatibility with existing call sites in workCommand.
|
|
32
|
+
* Now accepts absolute existing dirs (the external target repo case), rejects
|
|
33
|
+
* non-existent/non-dir paths, and guards relative '../..' traversal.
|
|
34
|
+
*/
|
|
35
|
+
export function makeResolveCwd(da, base = process.cwd()) {
|
|
36
|
+
return sharedMakeResolveCwd(da, base);
|
|
37
|
+
}
|
|
38
|
+
export async function workCommand(options) {
|
|
39
|
+
const roles = options.roles ? options.roles.split(',').map((r) => r.trim()).filter(Boolean) : ['architect', 'developer'];
|
|
40
|
+
if (roles.length === 0) {
|
|
41
|
+
console.error('Error: --roles produced an empty list; provide at least one role name');
|
|
42
|
+
process.exitCode = 1;
|
|
43
|
+
return;
|
|
44
|
+
}
|
|
45
|
+
const runnerMode = options.runner ?? 'stub';
|
|
46
|
+
if (runnerMode !== 'stub' && runnerMode !== 'auto') {
|
|
47
|
+
console.error(`Error: --runner must be 'stub' or 'auto', got: ${runnerMode}`);
|
|
48
|
+
process.exitCode = 1;
|
|
49
|
+
return;
|
|
50
|
+
}
|
|
51
|
+
if (options.live && runnerMode !== 'auto') {
|
|
52
|
+
console.error('Error: --live requires --runner auto');
|
|
53
|
+
process.exitCode = 1;
|
|
54
|
+
return;
|
|
55
|
+
}
|
|
56
|
+
if (options.worktrees && runnerMode === 'stub') {
|
|
57
|
+
console.warn('--worktrees has no effect with --runner stub');
|
|
58
|
+
}
|
|
59
|
+
const runnerTimeoutMs = options.runnerTimeoutMs === undefined ? 600000 : Number(options.runnerTimeoutMs);
|
|
60
|
+
if (!Number.isFinite(runnerTimeoutMs) || runnerTimeoutMs <= 0) {
|
|
61
|
+
console.error(`Error: --runner-timeout-ms must be a positive number, got: ${String(options.runnerTimeoutMs)}`);
|
|
62
|
+
process.exitCode = 1;
|
|
63
|
+
return;
|
|
64
|
+
}
|
|
65
|
+
const workerId = resolveWorkerId(options.workerId);
|
|
66
|
+
const idleSleepMs = options.idleSleep === undefined ? 5000 : Number(options.idleSleep);
|
|
67
|
+
if (!Number.isFinite(idleSleepMs) || idleSleepMs < 0) {
|
|
68
|
+
console.error(`Error: --idle-sleep must be a non-negative number, got: ${String(options.idleSleep)}`);
|
|
69
|
+
process.exitCode = 1;
|
|
70
|
+
return;
|
|
71
|
+
}
|
|
72
|
+
const once = options.once ?? false;
|
|
73
|
+
// Cost guard: fail fast BEFORE connecting to Revisium.
|
|
74
|
+
// --runner auto requires --live. Check here so tests don't need a live Revisium daemon.
|
|
75
|
+
if (runnerMode === 'auto') {
|
|
76
|
+
if (!requireLiveFlag(options.live ?? false, 'auto'))
|
|
77
|
+
return;
|
|
78
|
+
// Emit cost warning immediately so the user sees it before any daemon connection.
|
|
79
|
+
warnLiveCost();
|
|
80
|
+
}
|
|
81
|
+
const abortController = new AbortController();
|
|
82
|
+
process.once('SIGINT', () => {
|
|
83
|
+
console.log('\nStopping after current step…');
|
|
84
|
+
abortController.abort();
|
|
85
|
+
});
|
|
86
|
+
try {
|
|
87
|
+
const da = createControlPlaneDataAccess();
|
|
88
|
+
await da.assertReady();
|
|
89
|
+
// The injected runAgent is the ONLY thing that changes between modes — runWorker/WorkerDeps and
|
|
90
|
+
// the loop are untouched (invariant 2). stub stays the default (zero cost; real claude is opt-in).
|
|
91
|
+
let runAgent;
|
|
92
|
+
if (runnerMode === 'auto') {
|
|
93
|
+
const { run: prReadinessRun } = await import('../../poller/pr-readiness.js');
|
|
94
|
+
const scriptRunner = createScriptRunner({ scripts: { 'ci-poller': { run: prReadinessRun } } });
|
|
95
|
+
runAgent = createRunAgent({
|
|
96
|
+
claudeCode: createClaudeCodeRunner({
|
|
97
|
+
executor: spawnExecutor,
|
|
98
|
+
resolveCwd: makeResolveCwd(da),
|
|
99
|
+
timeoutMs: runnerTimeoutMs,
|
|
100
|
+
worktreeManager: options.worktrees ? new GitWorktreeManager() : undefined,
|
|
101
|
+
}),
|
|
102
|
+
script: scriptRunner,
|
|
103
|
+
});
|
|
104
|
+
}
|
|
105
|
+
else {
|
|
106
|
+
runAgent = stubRunAgent;
|
|
107
|
+
}
|
|
108
|
+
await runWorker({
|
|
109
|
+
da,
|
|
110
|
+
loadRole: (name) => loadRole(name),
|
|
111
|
+
loadModelProfile: (level) => loadModelProfile(level),
|
|
112
|
+
runAgent,
|
|
113
|
+
}, {
|
|
114
|
+
workerId,
|
|
115
|
+
roles,
|
|
116
|
+
once,
|
|
117
|
+
idleSleepMs,
|
|
118
|
+
signal: abortController.signal,
|
|
119
|
+
});
|
|
120
|
+
}
|
|
121
|
+
catch (error) {
|
|
122
|
+
if (error instanceof ControlPlaneError) {
|
|
123
|
+
console.error(`Error: ${formatCause(error)}`);
|
|
124
|
+
printHint(error);
|
|
125
|
+
}
|
|
126
|
+
else if (error instanceof Error) {
|
|
127
|
+
console.error(`Error: ${error.message}`);
|
|
128
|
+
}
|
|
129
|
+
else {
|
|
130
|
+
console.error(`Error: ${String(error)}`);
|
|
131
|
+
}
|
|
132
|
+
process.exitCode = 1;
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
export function registerWork(program) {
|
|
136
|
+
program
|
|
137
|
+
.command('work')
|
|
138
|
+
.description('Run the worker loop. --runner stub (default, zero-cost) or auto (real claude-code dispatch)')
|
|
139
|
+
.option('--once', 'Process one step then exit; exit immediately when idle')
|
|
140
|
+
.option('--roles <csv>', 'Comma-separated list of roles to claim', 'architect,developer')
|
|
141
|
+
.option('--worker-id <id>', 'Override the stable worker identity')
|
|
142
|
+
.option('--idle-sleep <ms>', 'Milliseconds to sleep when no step is available', '5000')
|
|
143
|
+
.option('--runner <mode>', "Runner mode: 'stub' (default, zero-cost) or 'auto' (real claude-code dispatch)", 'stub')
|
|
144
|
+
.option('--runner-timeout-ms <n>', 'Timeout in ms for the real (auto) runner', '600000')
|
|
145
|
+
.option('--worktrees', 'Use per-step git worktrees with --runner auto (git-level isolation only; npm install and port bindings are NOT isolated)')
|
|
146
|
+
.option('--live', 'Use the REAL Claude runner AND the real git/gh integrator — THIS WILL CALL claude, INCUR COST, AND PUSH/OPEN A PR (requires --runner auto)', false)
|
|
147
|
+
.action(workCommand);
|
|
148
|
+
}
|
|
149
|
+
//# sourceMappingURL=work.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"work.js","sourceRoot":"","sources":["../../../src/cli/commands/work.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/cli/config.ts"],"names":[],"mappings":"AAAA,cAAc,cAAc,CAAC"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import 'reflect-metadata';
|
|
2
|
+
import { isMcpCommand, needsHost } from './needs-host.js';
|
|
3
|
+
import { buildProgram } from './program.js';
|
|
4
|
+
const argv = process.argv;
|
|
5
|
+
if (needsHost(argv)) {
|
|
6
|
+
// Host path: dev:ping, dev:status (and future run/work when they move onto DBOS).
|
|
7
|
+
// Nest/DBOS/AppModule are imported lazily so the host-free path never loads them.
|
|
8
|
+
const mcpCommand = isMcpCommand(argv);
|
|
9
|
+
if (mcpCommand) {
|
|
10
|
+
process.env.REVO_MCP_STDIO = '1';
|
|
11
|
+
}
|
|
12
|
+
else {
|
|
13
|
+
delete process.env.REVO_MCP_STDIO;
|
|
14
|
+
}
|
|
15
|
+
const { NestFactory } = await import('@nestjs/core');
|
|
16
|
+
const { AppModule } = await import('../app.module.js');
|
|
17
|
+
const app = await NestFactory.createApplicationContext(AppModule, { logger: mcpCommand ? false : ['error', 'warn'] });
|
|
18
|
+
try {
|
|
19
|
+
await buildProgram(app).parseAsync(argv);
|
|
20
|
+
}
|
|
21
|
+
finally {
|
|
22
|
+
// onApplicationShutdown → DBOS.shutdown() only; daemon is NOT stopped (Round 3).
|
|
23
|
+
await app.close();
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
else {
|
|
27
|
+
// Host-free path: revisium start/stop/status/logs, bootstrap, run, work,
|
|
28
|
+
// --help, --version, empty/unknown commands.
|
|
29
|
+
// Nest/DBOS are NOT loaded here — fast and safe for daemon-management commands.
|
|
30
|
+
await buildProgram().parseAsync(argv);
|
|
31
|
+
}
|
|
32
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":"AAAA,OAAO,kBAAkB,CAAC;AAC1B,OAAO,EAAE,YAAY,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAC1D,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAE5C,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC;AAE1B,IAAI,SAAS,CAAC,IAAI,CAAC,EAAE,CAAC;IACpB,kFAAkF;IAClF,kFAAkF;IAClF,MAAM,UAAU,GAAG,YAAY,CAAC,IAAI,CAAC,CAAC;IACtC,IAAI,UAAU,EAAE,CAAC;QACf,OAAO,CAAC,GAAG,CAAC,cAAc,GAAG,GAAG,CAAC;IACnC,CAAC;SAAM,CAAC;QACN,OAAO,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC;IACpC,CAAC;IACD,MAAM,EAAE,WAAW,EAAE,GAAG,MAAM,MAAM,CAAC,cAAc,CAAC,CAAC;IACrD,MAAM,EAAE,SAAS,EAAE,GAAG,MAAM,MAAM,CAAC,kBAAkB,CAAC,CAAC;IACvD,MAAM,GAAG,GAAG,MAAM,WAAW,CAAC,wBAAwB,CAAC,SAAS,EAAE,EAAE,MAAM,EAAE,UAAU,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,OAAO,EAAE,MAAM,CAAC,EAAE,CAAC,CAAC;IACtH,IAAI,CAAC;QACH,MAAM,YAAY,CAAC,GAAG,CAAC,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;IAC3C,CAAC;YAAS,CAAC;QACT,iFAAiF;QACjF,MAAM,GAAG,CAAC,KAAK,EAAE,CAAC;IACpB,CAAC;AACH,CAAC;KAAM,CAAC;IACN,yEAAyE;IACzE,6CAA6C;IAC7C,gFAAgF;IAChF,MAAM,YAAY,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;AACxC,CAAC"}
|