agentrinse 0.0.0 → 0.2.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/README.md +165 -83
- package/dist/adapters/artifacts/adapter.d.ts +3 -1
- package/dist/adapters/artifacts/adapter.d.ts.map +1 -1
- package/dist/adapters/artifacts/adapter.js +23 -1
- package/dist/adapters/artifacts/adapter.js.map +1 -1
- package/dist/adapters/git/adapter.d.ts +8 -1
- package/dist/adapters/git/adapter.d.ts.map +1 -1
- package/dist/adapters/git/adapter.js +247 -13
- package/dist/adapters/git/adapter.js.map +1 -1
- package/dist/adapters/git/status.d.ts +14 -0
- package/dist/adapters/git/status.d.ts.map +1 -0
- package/dist/adapters/git/status.js +81 -0
- package/dist/adapters/git/status.js.map +1 -0
- package/dist/adapters/provider-adapter.d.ts +3 -0
- package/dist/adapters/provider-adapter.d.ts.map +1 -1
- package/dist/adapters/provider-adapter.js +16 -0
- package/dist/adapters/provider-adapter.js.map +1 -1
- package/dist/adapters/provider-reachability.d.ts +6 -0
- package/dist/adapters/provider-reachability.d.ts.map +1 -0
- package/dist/adapters/provider-reachability.js +207 -0
- package/dist/adapters/provider-reachability.js.map +1 -0
- package/dist/adapters/provider-specs.d.ts +1 -1
- package/dist/adapters/provider-specs.d.ts.map +1 -1
- package/dist/adapters/registry.d.ts +7 -1
- package/dist/adapters/registry.d.ts.map +1 -1
- package/dist/adapters/registry.js +44 -4
- package/dist/adapters/registry.js.map +1 -1
- package/dist/adapters/runtime/adapter.d.ts +24 -0
- package/dist/adapters/runtime/adapter.d.ts.map +1 -0
- package/dist/adapters/runtime/adapter.js +319 -0
- package/dist/adapters/runtime/adapter.js.map +1 -0
- package/dist/cli.js +2 -1
- package/dist/cli.js.map +1 -1
- package/dist/commands/adapters.d.ts.map +1 -1
- package/dist/commands/adapters.js +1 -0
- package/dist/commands/adapters.js.map +1 -1
- package/dist/commands/apply.d.ts +6 -0
- package/dist/commands/apply.d.ts.map +1 -1
- package/dist/commands/apply.js +37 -13
- package/dist/commands/apply.js.map +1 -1
- package/dist/commands/audit.d.ts +7 -1
- package/dist/commands/audit.d.ts.map +1 -1
- package/dist/commands/audit.js +103 -12
- package/dist/commands/audit.js.map +1 -1
- package/dist/commands/clean.d.ts +61 -0
- package/dist/commands/clean.d.ts.map +1 -0
- package/dist/commands/clean.js +224 -0
- package/dist/commands/clean.js.map +1 -0
- package/dist/commands/completion.d.ts +4 -0
- package/dist/commands/completion.d.ts.map +1 -0
- package/dist/commands/completion.js +95 -0
- package/dist/commands/completion.js.map +1 -0
- package/dist/commands/config.d.ts +17 -0
- package/dist/commands/config.d.ts.map +1 -0
- package/dist/commands/config.js +41 -0
- package/dist/commands/config.js.map +1 -0
- package/dist/commands/doctor.d.ts +28 -0
- package/dist/commands/doctor.d.ts.map +1 -0
- package/dist/commands/doctor.js +582 -0
- package/dist/commands/doctor.js.map +1 -0
- package/dist/commands/history.d.ts +15 -0
- package/dist/commands/history.d.ts.map +1 -0
- package/dist/commands/history.js +30 -0
- package/dist/commands/history.js.map +1 -0
- package/dist/commands/lock.d.ts +21 -0
- package/dist/commands/lock.d.ts.map +1 -0
- package/dist/commands/lock.js +43 -0
- package/dist/commands/lock.js.map +1 -0
- package/dist/commands/plan.d.ts +2 -0
- package/dist/commands/plan.d.ts.map +1 -1
- package/dist/commands/plan.js +9 -2
- package/dist/commands/plan.js.map +1 -1
- package/dist/commands/show.d.ts +20 -0
- package/dist/commands/show.d.ts.map +1 -0
- package/dist/commands/show.js +54 -0
- package/dist/commands/show.js.map +1 -0
- package/dist/config/defaults.d.ts.map +1 -1
- package/dist/config/defaults.js +2 -0
- package/dist/config/defaults.js.map +1 -1
- package/dist/config/load.d.ts +6 -0
- package/dist/config/load.d.ts.map +1 -1
- package/dist/config/load.js +25 -0
- package/dist/config/load.js.map +1 -1
- package/dist/config/path.d.ts +5 -0
- package/dist/config/path.d.ts.map +1 -0
- package/dist/config/path.js +13 -0
- package/dist/config/path.js.map +1 -0
- package/dist/config/schema.d.ts +23 -0
- package/dist/config/schema.d.ts.map +1 -1
- package/dist/config/schema.js +48 -0
- package/dist/config/schema.js.map +1 -1
- package/dist/contracts/doctor.d.ts +35 -0
- package/dist/contracts/doctor.d.ts.map +1 -0
- package/dist/contracts/doctor.js +15 -0
- package/dist/contracts/doctor.js.map +1 -0
- package/dist/contracts/output.d.ts +50 -0
- package/dist/contracts/output.d.ts.map +1 -0
- package/dist/contracts/output.js +23 -0
- package/dist/contracts/output.js.map +1 -0
- package/dist/contracts/run.d.ts +2 -0
- package/dist/contracts/run.d.ts.map +1 -1
- package/dist/contracts/run.js +1 -1
- package/dist/contracts/run.js.map +1 -1
- package/dist/core/apply.d.ts +1 -0
- package/dist/core/apply.d.ts.map +1 -1
- package/dist/core/apply.js +46 -3
- package/dist/core/apply.js.map +1 -1
- package/dist/core/audit.d.ts +21 -0
- package/dist/core/audit.d.ts.map +1 -1
- package/dist/core/audit.js +31 -1
- package/dist/core/audit.js.map +1 -1
- package/dist/core/duration.d.ts +2 -0
- package/dist/core/duration.d.ts.map +1 -0
- package/dist/core/duration.js +21 -0
- package/dist/core/duration.js.map +1 -0
- package/dist/core/interruption.d.ts +5 -0
- package/dist/core/interruption.d.ts.map +1 -0
- package/dist/core/interruption.js +5 -0
- package/dist/core/interruption.js.map +1 -0
- package/dist/core/process-identity.d.ts +24 -0
- package/dist/core/process-identity.d.ts.map +1 -0
- package/dist/core/process-identity.js +104 -0
- package/dist/core/process-identity.js.map +1 -0
- package/dist/core/reachability.d.ts +29 -0
- package/dist/core/reachability.d.ts.map +1 -0
- package/dist/core/reachability.js +121 -0
- package/dist/core/reachability.js.map +1 -0
- package/dist/core/redaction.d.ts +4 -0
- package/dist/core/redaction.d.ts.map +1 -0
- package/dist/core/redaction.js +91 -0
- package/dist/core/redaction.js.map +1 -0
- package/dist/core/safety.d.ts +8 -0
- package/dist/core/safety.d.ts.map +1 -1
- package/dist/core/safety.js +29 -1
- package/dist/core/safety.js.map +1 -1
- package/dist/index.d.ts +3 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -0
- package/dist/index.js.map +1 -1
- package/dist/machine-output.d.ts +21 -0
- package/dist/machine-output.d.ts.map +1 -0
- package/dist/machine-output.js +32 -0
- package/dist/machine-output.js.map +1 -0
- package/dist/main.d.ts.map +1 -1
- package/dist/main.js +232 -7
- package/dist/main.js.map +1 -1
- package/dist/state/json-file.d.ts +6 -1
- package/dist/state/json-file.d.ts.map +1 -1
- package/dist/state/json-file.js +34 -3
- package/dist/state/json-file.js.map +1 -1
- package/dist/state/layout.d.ts +2 -0
- package/dist/state/layout.d.ts.map +1 -1
- package/dist/state/layout.js +2 -0
- package/dist/state/layout.js.map +1 -1
- package/dist/state/lock.d.ts +54 -1
- package/dist/state/lock.d.ts.map +1 -1
- package/dist/state/lock.js +237 -33
- package/dist/state/lock.js.map +1 -1
- package/dist/state/records.d.ts +5 -0
- package/dist/state/records.d.ts.map +1 -0
- package/dist/state/records.js +35 -0
- package/dist/state/records.js.map +1 -0
- package/dist/state/run-journal.d.ts +3 -1
- package/dist/state/run-journal.d.ts.map +1 -1
- package/dist/state/run-journal.js +15 -4
- package/dist/state/run-journal.js.map +1 -1
- package/dist/version.d.ts +1 -1
- package/dist/version.js +1 -1
- package/package.json +3 -2
- package/schemas/command-envelope.schema.json +78 -0
- package/schemas/command-event.schema.json +36 -0
- package/schemas/doctor.schema.json +51 -0
- package/schemas/run.schema.json +1 -1
|
@@ -0,0 +1,582 @@
|
|
|
1
|
+
import { execFile } from "node:child_process";
|
|
2
|
+
import { constants } from "node:fs";
|
|
3
|
+
import { access, lstat, readFile, readdir } from "node:fs/promises";
|
|
4
|
+
import { dirname, join, resolve } from "node:path";
|
|
5
|
+
import { promisify } from "node:util";
|
|
6
|
+
import { PROVIDER_SPECS } from "../adapters/provider-specs.js";
|
|
7
|
+
import { DEFAULT_CONFIG } from "../config/defaults.js";
|
|
8
|
+
import { loadConfigForHome } from "../config/load.js";
|
|
9
|
+
import { cleanupPlanSchema } from "../contracts/plan.js";
|
|
10
|
+
import { auditReportSchema } from "../contracts/report.js";
|
|
11
|
+
import { cleanupRunSchema } from "../contracts/run.js";
|
|
12
|
+
import { doctorReportSchema } from "../contracts/doctor.js";
|
|
13
|
+
import { readJsonFile } from "../state/json-file.js";
|
|
14
|
+
import { resolveStateRoot, stateLayout } from "../state/layout.js";
|
|
15
|
+
import { inspectApplyLock } from "../state/lock.js";
|
|
16
|
+
const execFileAsync = promisify(execFile);
|
|
17
|
+
async function defaultRunCommand(command, args) {
|
|
18
|
+
const result = await execFileAsync(command, args, {
|
|
19
|
+
encoding: "utf8",
|
|
20
|
+
maxBuffer: 2 * 1024 * 1024,
|
|
21
|
+
timeout: 5_000,
|
|
22
|
+
});
|
|
23
|
+
return { stdout: result.stdout, stderr: result.stderr };
|
|
24
|
+
}
|
|
25
|
+
function errorCode(error) {
|
|
26
|
+
return error instanceof Error && "code" in error
|
|
27
|
+
? String(error.code)
|
|
28
|
+
: undefined;
|
|
29
|
+
}
|
|
30
|
+
function errorMessage(error) {
|
|
31
|
+
return error instanceof Error ? error.message : String(error);
|
|
32
|
+
}
|
|
33
|
+
async function nearestExistingPath(path) {
|
|
34
|
+
let candidate = resolve(path);
|
|
35
|
+
for (;;) {
|
|
36
|
+
try {
|
|
37
|
+
await lstat(candidate);
|
|
38
|
+
return candidate;
|
|
39
|
+
}
|
|
40
|
+
catch (error) {
|
|
41
|
+
if (errorCode(error) !== "ENOENT") {
|
|
42
|
+
throw error;
|
|
43
|
+
}
|
|
44
|
+
const parent = dirname(candidate);
|
|
45
|
+
if (parent === candidate) {
|
|
46
|
+
throw error;
|
|
47
|
+
}
|
|
48
|
+
candidate = parent;
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
function reportStatus(checks) {
|
|
53
|
+
if (checks.some((check) => check.status === "error")) {
|
|
54
|
+
return "error";
|
|
55
|
+
}
|
|
56
|
+
return checks.some((check) => check.status === "warning") ? "warning" : "ok";
|
|
57
|
+
}
|
|
58
|
+
function renderDoctor(report) {
|
|
59
|
+
const lines = [`AgentRinse doctor: ${report.status}`, ""];
|
|
60
|
+
for (const check of report.checks) {
|
|
61
|
+
lines.push(`${check.status.padEnd(7)} ${check.id.padEnd(24)} ${check.summary}`);
|
|
62
|
+
if (check.detail !== undefined) {
|
|
63
|
+
lines.push(` ${check.detail}`);
|
|
64
|
+
}
|
|
65
|
+
if (check.remediation !== undefined) {
|
|
66
|
+
lines.push(` remediation: ${check.remediation}`);
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
return `${lines.join("\n")}\n`;
|
|
70
|
+
}
|
|
71
|
+
function platformCheck(platform) {
|
|
72
|
+
if (platform === "darwin") {
|
|
73
|
+
return {
|
|
74
|
+
id: "platform",
|
|
75
|
+
status: "pass",
|
|
76
|
+
summary: "macOS supports audit and safe artifact cleanup",
|
|
77
|
+
};
|
|
78
|
+
}
|
|
79
|
+
if (platform === "linux") {
|
|
80
|
+
return {
|
|
81
|
+
id: "platform",
|
|
82
|
+
status: "pass",
|
|
83
|
+
summary: "Linux supports audit and safe artifact cleanup",
|
|
84
|
+
};
|
|
85
|
+
}
|
|
86
|
+
if (platform === "win32") {
|
|
87
|
+
return {
|
|
88
|
+
id: "platform",
|
|
89
|
+
status: "warning",
|
|
90
|
+
summary: "native Windows is audit-only",
|
|
91
|
+
remediation: "Use WSL for supported safe artifact cleanup.",
|
|
92
|
+
};
|
|
93
|
+
}
|
|
94
|
+
return {
|
|
95
|
+
id: "platform",
|
|
96
|
+
status: "error",
|
|
97
|
+
summary: `platform ${platform} is unsupported`,
|
|
98
|
+
};
|
|
99
|
+
}
|
|
100
|
+
async function configChecks(options, environment) {
|
|
101
|
+
try {
|
|
102
|
+
const loaded = await loadConfigForHome(options.home, options.config, environment);
|
|
103
|
+
return {
|
|
104
|
+
config: loaded.config,
|
|
105
|
+
checks: [
|
|
106
|
+
loaded.exists
|
|
107
|
+
? {
|
|
108
|
+
id: "config",
|
|
109
|
+
status: "pass",
|
|
110
|
+
summary: "configuration is valid",
|
|
111
|
+
detail: loaded.path,
|
|
112
|
+
}
|
|
113
|
+
: {
|
|
114
|
+
id: "config",
|
|
115
|
+
status: "warning",
|
|
116
|
+
summary: "default configuration is in use",
|
|
117
|
+
detail: `No configuration file exists at ${loaded.path}.`,
|
|
118
|
+
remediation: "Run agentrinse config init before configuring cleanup roots.",
|
|
119
|
+
},
|
|
120
|
+
],
|
|
121
|
+
};
|
|
122
|
+
}
|
|
123
|
+
catch (error) {
|
|
124
|
+
return {
|
|
125
|
+
config: structuredClone(DEFAULT_CONFIG),
|
|
126
|
+
checks: [
|
|
127
|
+
{
|
|
128
|
+
id: "config",
|
|
129
|
+
status: "error",
|
|
130
|
+
summary: "configuration could not be loaded",
|
|
131
|
+
detail: errorMessage(error),
|
|
132
|
+
remediation: "Fix the JSON or run agentrinse config init at a new path.",
|
|
133
|
+
},
|
|
134
|
+
],
|
|
135
|
+
};
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
async function stateCheck(root, currentUid) {
|
|
139
|
+
try {
|
|
140
|
+
const existing = await nearestExistingPath(root);
|
|
141
|
+
const stats = await lstat(existing);
|
|
142
|
+
if (!stats.isDirectory() || stats.isSymbolicLink()) {
|
|
143
|
+
return {
|
|
144
|
+
id: "state",
|
|
145
|
+
status: "error",
|
|
146
|
+
summary: "state path resolves through a non-directory or symlink",
|
|
147
|
+
detail: existing,
|
|
148
|
+
};
|
|
149
|
+
}
|
|
150
|
+
if (existing === resolve(root) && currentUid !== undefined && stats.uid !== currentUid) {
|
|
151
|
+
return {
|
|
152
|
+
id: "state",
|
|
153
|
+
status: "error",
|
|
154
|
+
summary: "state directory is not owned by the current user",
|
|
155
|
+
detail: root,
|
|
156
|
+
remediation: "Choose or create a state directory owned by the current user.",
|
|
157
|
+
};
|
|
158
|
+
}
|
|
159
|
+
await access(existing, constants.R_OK | constants.W_OK | constants.X_OK);
|
|
160
|
+
return {
|
|
161
|
+
id: "state",
|
|
162
|
+
status: "pass",
|
|
163
|
+
summary: existing === resolve(root)
|
|
164
|
+
? "state directory is readable and writable"
|
|
165
|
+
: "state directory can be created",
|
|
166
|
+
detail: existing === resolve(root) ? root : `Nearest writable parent: ${existing}`,
|
|
167
|
+
};
|
|
168
|
+
}
|
|
169
|
+
catch (error) {
|
|
170
|
+
return {
|
|
171
|
+
id: "state",
|
|
172
|
+
status: "error",
|
|
173
|
+
summary: "state directory is not usable",
|
|
174
|
+
detail: errorMessage(error),
|
|
175
|
+
remediation: "Choose a readable, writable local state directory.",
|
|
176
|
+
};
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
async function processOwnershipCheck(platform, runCommand, readProcessStat) {
|
|
180
|
+
if (platform === "win32") {
|
|
181
|
+
return {
|
|
182
|
+
id: "process-ownership",
|
|
183
|
+
status: "warning",
|
|
184
|
+
summary: "native Windows process ownership proof is unavailable",
|
|
185
|
+
};
|
|
186
|
+
}
|
|
187
|
+
let procfsError;
|
|
188
|
+
if (platform === "linux") {
|
|
189
|
+
try {
|
|
190
|
+
await readProcessStat();
|
|
191
|
+
}
|
|
192
|
+
catch (error) {
|
|
193
|
+
procfsError = error;
|
|
194
|
+
}
|
|
195
|
+
}
|
|
196
|
+
try {
|
|
197
|
+
await runCommand("lsof", ["-v"]);
|
|
198
|
+
return {
|
|
199
|
+
id: "process-ownership",
|
|
200
|
+
status: "pass",
|
|
201
|
+
summary: platform === "linux" && procfsError === undefined
|
|
202
|
+
? "procfs ownership proof and lsof fallback are available"
|
|
203
|
+
: platform === "linux"
|
|
204
|
+
? "lsof fallback ownership proof is available"
|
|
205
|
+
: "lsof process ownership proof is available",
|
|
206
|
+
...(procfsError === undefined
|
|
207
|
+
? {}
|
|
208
|
+
: { detail: `procfs ownership proof is unavailable: ${errorMessage(procfsError)}` }),
|
|
209
|
+
};
|
|
210
|
+
}
|
|
211
|
+
catch (error) {
|
|
212
|
+
return {
|
|
213
|
+
id: "process-ownership",
|
|
214
|
+
status: "error",
|
|
215
|
+
summary: platform === "linux" && procfsError !== undefined
|
|
216
|
+
? "Linux process ownership proof is unavailable"
|
|
217
|
+
: platform === "linux"
|
|
218
|
+
? "lsof fallback is unavailable"
|
|
219
|
+
: "lsof process ownership proof is unavailable",
|
|
220
|
+
detail: procfsError === undefined
|
|
221
|
+
? errorMessage(error)
|
|
222
|
+
: `procfs: ${errorMessage(procfsError)}; lsof: ${errorMessage(error)}`,
|
|
223
|
+
remediation: "Install lsof before applying cleanup plans.",
|
|
224
|
+
};
|
|
225
|
+
}
|
|
226
|
+
}
|
|
227
|
+
async function recoveryMutexCheck(platform, runCommand) {
|
|
228
|
+
if (platform !== "darwin" && platform !== "linux") {
|
|
229
|
+
return {
|
|
230
|
+
id: "recovery-mutex",
|
|
231
|
+
status: "pass",
|
|
232
|
+
summary: "stale-lock recovery is not available on this platform",
|
|
233
|
+
};
|
|
234
|
+
}
|
|
235
|
+
const command = platform === "darwin" ? "lockf" : "flock";
|
|
236
|
+
try {
|
|
237
|
+
const result = await runCommand("sh", ["-c", `command -v ${command}`]);
|
|
238
|
+
return {
|
|
239
|
+
id: "recovery-mutex",
|
|
240
|
+
status: "pass",
|
|
241
|
+
summary: `${result.stdout.trim() || command} provides crash-safe stale-lock recovery`,
|
|
242
|
+
};
|
|
243
|
+
}
|
|
244
|
+
catch (error) {
|
|
245
|
+
return {
|
|
246
|
+
id: "recovery-mutex",
|
|
247
|
+
status: "error",
|
|
248
|
+
summary: `${command} is unavailable`,
|
|
249
|
+
detail: errorMessage(error),
|
|
250
|
+
remediation: platform === "darwin"
|
|
251
|
+
? "Restore the macOS lockf utility before recovering stale locks."
|
|
252
|
+
: "Install util-linux to provide flock before recovering stale locks.",
|
|
253
|
+
};
|
|
254
|
+
}
|
|
255
|
+
}
|
|
256
|
+
async function gitChecks(config, runCommand) {
|
|
257
|
+
const checks = [];
|
|
258
|
+
try {
|
|
259
|
+
const result = await runCommand("git", ["--version"]);
|
|
260
|
+
const version = result.stdout.trim();
|
|
261
|
+
checks.push({
|
|
262
|
+
id: "git",
|
|
263
|
+
status: "pass",
|
|
264
|
+
summary: version === "" ? "Git is available" : version,
|
|
265
|
+
});
|
|
266
|
+
}
|
|
267
|
+
catch (error) {
|
|
268
|
+
return [
|
|
269
|
+
{
|
|
270
|
+
id: "git",
|
|
271
|
+
status: "error",
|
|
272
|
+
summary: "Git is unavailable",
|
|
273
|
+
detail: errorMessage(error),
|
|
274
|
+
remediation: "Install Git before enabling worktree inventory.",
|
|
275
|
+
},
|
|
276
|
+
];
|
|
277
|
+
}
|
|
278
|
+
const git = config.adapters.git;
|
|
279
|
+
if (git?.enabled !== true) {
|
|
280
|
+
checks.push({
|
|
281
|
+
id: "git:porcelain",
|
|
282
|
+
status: "pass",
|
|
283
|
+
summary: "Git worktree adapter is disabled",
|
|
284
|
+
});
|
|
285
|
+
return checks;
|
|
286
|
+
}
|
|
287
|
+
if (git.root === undefined) {
|
|
288
|
+
checks.push({
|
|
289
|
+
id: "git:porcelain",
|
|
290
|
+
status: "warning",
|
|
291
|
+
summary: "Git worktree adapter has no explicit repository root",
|
|
292
|
+
remediation: "Set adapters.git.root or disable the Git adapter.",
|
|
293
|
+
});
|
|
294
|
+
return checks;
|
|
295
|
+
}
|
|
296
|
+
try {
|
|
297
|
+
await runCommand("git", ["-C", resolve(git.root), "worktree", "list", "--porcelain", "-z"]);
|
|
298
|
+
checks.push({
|
|
299
|
+
id: "git:porcelain",
|
|
300
|
+
status: "pass",
|
|
301
|
+
summary: "Git worktree porcelain is available",
|
|
302
|
+
detail: resolve(git.root),
|
|
303
|
+
});
|
|
304
|
+
}
|
|
305
|
+
catch (error) {
|
|
306
|
+
checks.push({
|
|
307
|
+
id: "git:porcelain",
|
|
308
|
+
status: "error",
|
|
309
|
+
summary: "Git worktree porcelain failed",
|
|
310
|
+
detail: errorMessage(error),
|
|
311
|
+
remediation: "Fix the configured Git root before enabling worktree inventory.",
|
|
312
|
+
});
|
|
313
|
+
}
|
|
314
|
+
return checks;
|
|
315
|
+
}
|
|
316
|
+
async function dockerCheck(enabled, runCommand) {
|
|
317
|
+
try {
|
|
318
|
+
await runCommand("docker", ["--version"]);
|
|
319
|
+
}
|
|
320
|
+
catch (error) {
|
|
321
|
+
return {
|
|
322
|
+
id: "docker",
|
|
323
|
+
status: enabled ? "warning" : "pass",
|
|
324
|
+
summary: enabled ? "Docker CLI is unavailable" : "Docker is not installed (optional)",
|
|
325
|
+
...(enabled
|
|
326
|
+
? {
|
|
327
|
+
detail: errorMessage(error),
|
|
328
|
+
remediation: "Install Docker or disable the Docker adapter.",
|
|
329
|
+
}
|
|
330
|
+
: {}),
|
|
331
|
+
};
|
|
332
|
+
}
|
|
333
|
+
try {
|
|
334
|
+
const [context, version] = await Promise.all([
|
|
335
|
+
runCommand("docker", ["context", "show"]),
|
|
336
|
+
runCommand("docker", ["version", "--format", "{{.Server.Version}}"]),
|
|
337
|
+
]);
|
|
338
|
+
return {
|
|
339
|
+
id: "docker",
|
|
340
|
+
status: "pass",
|
|
341
|
+
summary: `Docker daemon ${version.stdout.trim() || "available"}`,
|
|
342
|
+
detail: `Context: ${context.stdout.trim() || "unknown"}`,
|
|
343
|
+
};
|
|
344
|
+
}
|
|
345
|
+
catch (error) {
|
|
346
|
+
return {
|
|
347
|
+
id: "docker",
|
|
348
|
+
status: enabled ? "warning" : "pass",
|
|
349
|
+
summary: enabled
|
|
350
|
+
? "Docker CLI is installed but its daemon or context is unavailable"
|
|
351
|
+
: "Docker daemon is unavailable (optional)",
|
|
352
|
+
...(enabled
|
|
353
|
+
? {
|
|
354
|
+
detail: errorMessage(error),
|
|
355
|
+
remediation: "Start Docker or disable the Docker adapter.",
|
|
356
|
+
}
|
|
357
|
+
: {}),
|
|
358
|
+
};
|
|
359
|
+
}
|
|
360
|
+
}
|
|
361
|
+
async function moleCheck(platform, runCommand) {
|
|
362
|
+
if (platform !== "darwin") {
|
|
363
|
+
return {
|
|
364
|
+
id: "mole",
|
|
365
|
+
status: "pass",
|
|
366
|
+
summary: "Mole handoff is not applicable on this platform",
|
|
367
|
+
};
|
|
368
|
+
}
|
|
369
|
+
try {
|
|
370
|
+
const result = await runCommand("mo", ["--version"]);
|
|
371
|
+
return {
|
|
372
|
+
id: "mole",
|
|
373
|
+
status: "pass",
|
|
374
|
+
summary: result.stdout.trim() || result.stderr.trim() || "Mole is available",
|
|
375
|
+
detail: "Mole is optional and remains an external handoff.",
|
|
376
|
+
};
|
|
377
|
+
}
|
|
378
|
+
catch {
|
|
379
|
+
return {
|
|
380
|
+
id: "mole",
|
|
381
|
+
status: "pass",
|
|
382
|
+
summary: "Mole is not installed (optional)",
|
|
383
|
+
};
|
|
384
|
+
}
|
|
385
|
+
}
|
|
386
|
+
async function providerChecks(home, config, platform) {
|
|
387
|
+
const checks = [];
|
|
388
|
+
for (const spec of Object.values(PROVIDER_SPECS).sort((left, right) => left.id.localeCompare(right.id))) {
|
|
389
|
+
const configured = config.adapters[spec.id];
|
|
390
|
+
if (configured?.enabled === false) {
|
|
391
|
+
checks.push({
|
|
392
|
+
id: `provider:${spec.id}`,
|
|
393
|
+
status: "pass",
|
|
394
|
+
summary: `${spec.displayName} adapter is disabled`,
|
|
395
|
+
});
|
|
396
|
+
continue;
|
|
397
|
+
}
|
|
398
|
+
const root = resolve(configured?.root ?? spec.defaultRoot(home, platform));
|
|
399
|
+
try {
|
|
400
|
+
const stats = await lstat(root);
|
|
401
|
+
if (!stats.isDirectory() || stats.isSymbolicLink()) {
|
|
402
|
+
checks.push({
|
|
403
|
+
id: `provider:${spec.id}`,
|
|
404
|
+
status: "warning",
|
|
405
|
+
summary: `${spec.displayName} root is not a real directory`,
|
|
406
|
+
detail: root,
|
|
407
|
+
});
|
|
408
|
+
continue;
|
|
409
|
+
}
|
|
410
|
+
await access(root, constants.R_OK | constants.X_OK);
|
|
411
|
+
checks.push({
|
|
412
|
+
id: `provider:${spec.id}`,
|
|
413
|
+
status: "pass",
|
|
414
|
+
summary: `${spec.displayName} root is readable`,
|
|
415
|
+
detail: root,
|
|
416
|
+
});
|
|
417
|
+
}
|
|
418
|
+
catch (error) {
|
|
419
|
+
const missing = errorCode(error) === "ENOENT";
|
|
420
|
+
checks.push({
|
|
421
|
+
id: `provider:${spec.id}`,
|
|
422
|
+
status: configured?.root !== undefined && missing ? "warning" : missing ? "pass" : "error",
|
|
423
|
+
summary: missing
|
|
424
|
+
? `${spec.displayName} root is absent`
|
|
425
|
+
: `${spec.displayName} root is unreadable`,
|
|
426
|
+
detail: root,
|
|
427
|
+
...(configured?.root !== undefined && missing
|
|
428
|
+
? { remediation: "Fix or remove the explicit provider root." }
|
|
429
|
+
: {}),
|
|
430
|
+
});
|
|
431
|
+
}
|
|
432
|
+
}
|
|
433
|
+
return checks;
|
|
434
|
+
}
|
|
435
|
+
async function artifactChecks(config) {
|
|
436
|
+
const checks = [];
|
|
437
|
+
for (const [index, project] of config.artifacts.projects.entries()) {
|
|
438
|
+
const root = resolve(project.root);
|
|
439
|
+
try {
|
|
440
|
+
const stats = await lstat(root);
|
|
441
|
+
if (!stats.isDirectory() || stats.isSymbolicLink()) {
|
|
442
|
+
throw new Error("configured artifact root must be a real directory");
|
|
443
|
+
}
|
|
444
|
+
await access(root, constants.R_OK | constants.W_OK | constants.X_OK);
|
|
445
|
+
checks.push({
|
|
446
|
+
id: `artifact-root:${index}`,
|
|
447
|
+
status: "pass",
|
|
448
|
+
summary: "artifact root supports same-parent isolation",
|
|
449
|
+
detail: root,
|
|
450
|
+
});
|
|
451
|
+
}
|
|
452
|
+
catch (error) {
|
|
453
|
+
checks.push({
|
|
454
|
+
id: `artifact-root:${index}`,
|
|
455
|
+
status: "error",
|
|
456
|
+
summary: "artifact root is not safe for cleanup",
|
|
457
|
+
detail: `${root}: ${errorMessage(error)}`,
|
|
458
|
+
});
|
|
459
|
+
}
|
|
460
|
+
}
|
|
461
|
+
if (checks.length === 0) {
|
|
462
|
+
checks.push({
|
|
463
|
+
id: "artifact-roots",
|
|
464
|
+
status: "pass",
|
|
465
|
+
summary: "no artifact cleanup roots are configured",
|
|
466
|
+
});
|
|
467
|
+
}
|
|
468
|
+
return checks;
|
|
469
|
+
}
|
|
470
|
+
async function schemaDirectoryCheck(id, directory, schema) {
|
|
471
|
+
let names;
|
|
472
|
+
try {
|
|
473
|
+
names = (await readdir(directory)).filter((name) => name.endsWith(".json")).sort();
|
|
474
|
+
}
|
|
475
|
+
catch (error) {
|
|
476
|
+
if (errorCode(error) === "ENOENT") {
|
|
477
|
+
return { id, status: "pass", summary: "no persisted records found" };
|
|
478
|
+
}
|
|
479
|
+
return {
|
|
480
|
+
id,
|
|
481
|
+
status: "error",
|
|
482
|
+
summary: "persisted records could not be listed",
|
|
483
|
+
detail: errorMessage(error),
|
|
484
|
+
};
|
|
485
|
+
}
|
|
486
|
+
const failures = [];
|
|
487
|
+
for (const name of names) {
|
|
488
|
+
try {
|
|
489
|
+
schema.parse(await readJsonFile(join(directory, name)));
|
|
490
|
+
}
|
|
491
|
+
catch {
|
|
492
|
+
failures.push(name);
|
|
493
|
+
}
|
|
494
|
+
}
|
|
495
|
+
return failures.length === 0
|
|
496
|
+
? { id, status: "pass", summary: `${names.length} persisted record(s) are compatible` }
|
|
497
|
+
: {
|
|
498
|
+
id,
|
|
499
|
+
status: "error",
|
|
500
|
+
summary: `${failures.length} persisted record(s) are incompatible`,
|
|
501
|
+
detail: failures.join(", "),
|
|
502
|
+
remediation: "Inspect the records before moving or removing any AgentRinse state.",
|
|
503
|
+
};
|
|
504
|
+
}
|
|
505
|
+
async function lockCheck(locksDirectory, dependencies) {
|
|
506
|
+
let status;
|
|
507
|
+
try {
|
|
508
|
+
status = await inspectApplyLock(locksDirectory, dependencies);
|
|
509
|
+
}
|
|
510
|
+
catch (error) {
|
|
511
|
+
return {
|
|
512
|
+
id: "apply-lock",
|
|
513
|
+
status: "error",
|
|
514
|
+
summary: "apply lock could not be inspected",
|
|
515
|
+
detail: errorMessage(error),
|
|
516
|
+
remediation: "Do not apply or recover until the lock owner can be inspected.",
|
|
517
|
+
};
|
|
518
|
+
}
|
|
519
|
+
if (status.status === "absent") {
|
|
520
|
+
return { id: "apply-lock", status: "pass", summary: "no apply lock is present" };
|
|
521
|
+
}
|
|
522
|
+
if (status.status === "active") {
|
|
523
|
+
return {
|
|
524
|
+
id: "apply-lock",
|
|
525
|
+
status: "warning",
|
|
526
|
+
summary: `an apply run is active (PID ${status.owner.pid})`,
|
|
527
|
+
detail: `run ${status.owner.runId}`,
|
|
528
|
+
};
|
|
529
|
+
}
|
|
530
|
+
if (status.status === "stale") {
|
|
531
|
+
return {
|
|
532
|
+
id: "apply-lock",
|
|
533
|
+
status: "warning",
|
|
534
|
+
summary: "a proven stale apply lock is present",
|
|
535
|
+
detail: status.reason,
|
|
536
|
+
remediation: "Review agentrinse lock status, then run agentrinse lock recover --yes.",
|
|
537
|
+
};
|
|
538
|
+
}
|
|
539
|
+
return {
|
|
540
|
+
id: "apply-lock",
|
|
541
|
+
status: "error",
|
|
542
|
+
summary: `apply lock status is ${status.status}`,
|
|
543
|
+
detail: status.reason,
|
|
544
|
+
remediation: "Do not remove the lock until its owner can be proven stale.",
|
|
545
|
+
};
|
|
546
|
+
}
|
|
547
|
+
export async function executeDoctorCommand(options) {
|
|
548
|
+
const dependencies = options.dependencies ?? {};
|
|
549
|
+
const platform = dependencies.platform ?? process.platform;
|
|
550
|
+
const environment = dependencies.environment ?? process.env;
|
|
551
|
+
const runCommand = dependencies.runCommand ?? defaultRunCommand;
|
|
552
|
+
const root = resolveStateRoot(options.home, options.stateDir, environment);
|
|
553
|
+
const layout = stateLayout(root);
|
|
554
|
+
const loaded = await configChecks(options, environment);
|
|
555
|
+
const checks = [
|
|
556
|
+
platformCheck(platform),
|
|
557
|
+
...loaded.checks,
|
|
558
|
+
await stateCheck(root, dependencies.currentUid?.() ?? process.getuid?.()),
|
|
559
|
+
await processOwnershipCheck(platform, runCommand, dependencies.readProcessStat ?? (() => readFile("/proc/self/stat", "utf8"))),
|
|
560
|
+
await recoveryMutexCheck(platform, runCommand),
|
|
561
|
+
...(await gitChecks(loaded.config, runCommand)),
|
|
562
|
+
await dockerCheck(loaded.config.adapters.docker?.enabled === true, runCommand),
|
|
563
|
+
await moleCheck(platform, runCommand),
|
|
564
|
+
...(await providerChecks(options.home, loaded.config, platform)),
|
|
565
|
+
...(await artifactChecks(loaded.config)),
|
|
566
|
+
await lockCheck(layout.locks, dependencies.lock),
|
|
567
|
+
await schemaDirectoryCheck("schema:audits", layout.audits, auditReportSchema),
|
|
568
|
+
await schemaDirectoryCheck("schema:plans", layout.plans, cleanupPlanSchema),
|
|
569
|
+
await schemaDirectoryCheck("schema:runs", layout.runs, cleanupRunSchema),
|
|
570
|
+
];
|
|
571
|
+
const report = doctorReportSchema.parse({
|
|
572
|
+
schemaVersion: 1,
|
|
573
|
+
generatedAt: (dependencies.now ?? (() => new Date()))().toISOString(),
|
|
574
|
+
status: reportStatus(checks),
|
|
575
|
+
checks,
|
|
576
|
+
});
|
|
577
|
+
return {
|
|
578
|
+
report,
|
|
579
|
+
output: options.json ? `${JSON.stringify(report, null, 2)}\n` : renderDoctor(report),
|
|
580
|
+
};
|
|
581
|
+
}
|
|
582
|
+
//# sourceMappingURL=doctor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"doctor.js","sourceRoot":"","sources":["../../src/commands/doctor.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAC9C,OAAO,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AACpC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,kBAAkB,CAAC;AACpE,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACnD,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AAGtC,OAAO,EAAE,cAAc,EAAE,MAAM,+BAA+B,CAAC;AAC/D,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AAEtD,OAAO,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AACzD,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAC3D,OAAO,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AACvD,OAAO,EAAE,kBAAkB,EAAuC,MAAM,wBAAwB,CAAC;AACjG,OAAO,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AACrD,OAAO,EAAE,gBAAgB,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACnE,OAAO,EAAE,gBAAgB,EAAmC,MAAM,kBAAkB,CAAC;AAErF,MAAM,aAAa,GAAG,SAAS,CAAC,QAAQ,CAAC,CAAC;AA8B1C,KAAK,UAAU,iBAAiB,CAAC,OAAe,EAAE,IAAc;IAC9D,MAAM,MAAM,GAAG,MAAM,aAAa,CAAC,OAAO,EAAE,IAAI,EAAE;QAChD,QAAQ,EAAE,MAAM;QAChB,SAAS,EAAE,CAAC,GAAG,IAAI,GAAG,IAAI;QAC1B,OAAO,EAAE,KAAK;KACf,CAAC,CAAC;IACH,OAAO,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC;AAC1D,CAAC;AAED,SAAS,SAAS,CAAC,KAAc;IAC/B,OAAO,KAAK,YAAY,KAAK,IAAI,MAAM,IAAI,KAAK;QAC9C,CAAC,CAAC,MAAM,CAAE,KAA+B,CAAC,IAAI,CAAC;QAC/C,CAAC,CAAC,SAAS,CAAC;AAChB,CAAC;AAED,SAAS,YAAY,CAAC,KAAc;IAClC,OAAO,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;AAChE,CAAC;AAED,KAAK,UAAU,mBAAmB,CAAC,IAAY;IAC7C,IAAI,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC9B,SAAS,CAAC;QACR,IAAI,CAAC;YACH,MAAM,KAAK,CAAC,SAAS,CAAC,CAAC;YACvB,OAAO,SAAS,CAAC;QACnB,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,SAAS,CAAC,KAAK,CAAC,KAAK,QAAQ,EAAE,CAAC;gBAClC,MAAM,KAAK,CAAC;YACd,CAAC;YACD,MAAM,MAAM,GAAG,OAAO,CAAC,SAAS,CAAC,CAAC;YAClC,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;gBACzB,MAAM,KAAK,CAAC;YACd,CAAC;YACD,SAAS,GAAG,MAAM,CAAC;QACrB,CAAC;IACH,CAAC;AACH,CAAC;AAED,SAAS,YAAY,CAAC,MAAqB;IACzC,IAAI,MAAM,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,MAAM,KAAK,OAAO,CAAC,EAAE,CAAC;QACrD,OAAO,OAAO,CAAC;IACjB,CAAC;IACD,OAAO,MAAM,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC;AAC/E,CAAC;AAED,SAAS,YAAY,CAAC,MAAoB;IACxC,MAAM,KAAK,GAAG,CAAC,sBAAsB,MAAM,CAAC,MAAM,EAAE,EAAE,EAAE,CAAC,CAAC;IAC1D,KAAK,MAAM,KAAK,IAAI,MAAM,CAAC,MAAM,EAAE,CAAC;QAClC,KAAK,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,EAAE,CAAC,MAAM,CAAC,EAAE,CAAC,IAAI,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;QAChF,IAAI,KAAK,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;YAC/B,KAAK,CAAC,IAAI,CAAC,WAAW,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC;QACxC,CAAC;QACD,IAAI,KAAK,CAAC,WAAW,KAAK,SAAS,EAAE,CAAC;YACpC,KAAK,CAAC,IAAI,CAAC,wBAAwB,KAAK,CAAC,WAAW,EAAE,CAAC,CAAC;QAC1D,CAAC;IACH,CAAC;IACD,OAAO,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC;AACjC,CAAC;AAED,SAAS,aAAa,CAAC,QAAyB;IAC9C,IAAI,QAAQ,KAAK,QAAQ,EAAE,CAAC;QAC1B,OAAO;YACL,EAAE,EAAE,UAAU;YACd,MAAM,EAAE,MAAM;YACd,OAAO,EAAE,gDAAgD;SAC1D,CAAC;IACJ,CAAC;IACD,IAAI,QAAQ,KAAK,OAAO,EAAE,CAAC;QACzB,OAAO;YACL,EAAE,EAAE,UAAU;YACd,MAAM,EAAE,MAAM;YACd,OAAO,EAAE,gDAAgD;SAC1D,CAAC;IACJ,CAAC;IACD,IAAI,QAAQ,KAAK,OAAO,EAAE,CAAC;QACzB,OAAO;YACL,EAAE,EAAE,UAAU;YACd,MAAM,EAAE,SAAS;YACjB,OAAO,EAAE,8BAA8B;YACvC,WAAW,EAAE,8CAA8C;SAC5D,CAAC;IACJ,CAAC;IACD,OAAO;QACL,EAAE,EAAE,UAAU;QACd,MAAM,EAAE,OAAO;QACf,OAAO,EAAE,YAAY,QAAQ,iBAAiB;KAC/C,CAAC;AACJ,CAAC;AAED,KAAK,UAAU,YAAY,CACzB,OAA6B,EAC7B,WAA8B;IAE9B,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,iBAAiB,CAAC,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC;QAClF,OAAO;YACL,MAAM,EAAE,MAAM,CAAC,MAAM;YACrB,MAAM,EAAE;gBACN,MAAM,CAAC,MAAM;oBACX,CAAC,CAAC;wBACE,EAAE,EAAE,QAAQ;wBACZ,MAAM,EAAE,MAAM;wBACd,OAAO,EAAE,wBAAwB;wBACjC,MAAM,EAAE,MAAM,CAAC,IAAI;qBACpB;oBACH,CAAC,CAAC;wBACE,EAAE,EAAE,QAAQ;wBACZ,MAAM,EAAE,SAAS;wBACjB,OAAO,EAAE,iCAAiC;wBAC1C,MAAM,EAAE,mCAAmC,MAAM,CAAC,IAAI,GAAG;wBACzD,WAAW,EAAE,8DAA8D;qBAC5E;aACN;SACF,CAAC;IACJ,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO;YACL,MAAM,EAAE,eAAe,CAAC,cAAc,CAAC;YACvC,MAAM,EAAE;gBACN;oBACE,EAAE,EAAE,QAAQ;oBACZ,MAAM,EAAE,OAAO;oBACf,OAAO,EAAE,mCAAmC;oBAC5C,MAAM,EAAE,YAAY,CAAC,KAAK,CAAC;oBAC3B,WAAW,EAAE,2DAA2D;iBACzE;aACF;SACF,CAAC;IACJ,CAAC;AACH,CAAC;AAED,KAAK,UAAU,UAAU,CAAC,IAAY,EAAE,UAAmB;IACzD,IAAI,CAAC;QACH,MAAM,QAAQ,GAAG,MAAM,mBAAmB,CAAC,IAAI,CAAC,CAAC;QACjD,MAAM,KAAK,GAAG,MAAM,KAAK,CAAC,QAAQ,CAAC,CAAC;QACpC,IAAI,CAAC,KAAK,CAAC,WAAW,EAAE,IAAI,KAAK,CAAC,cAAc,EAAE,EAAE,CAAC;YACnD,OAAO;gBACL,EAAE,EAAE,OAAO;gBACX,MAAM,EAAE,OAAO;gBACf,OAAO,EAAE,wDAAwD;gBACjE,MAAM,EAAE,QAAQ;aACjB,CAAC;QACJ,CAAC;QACD,IAAI,QAAQ,KAAK,OAAO,CAAC,IAAI,CAAC,IAAI,UAAU,KAAK,SAAS,IAAI,KAAK,CAAC,GAAG,KAAK,UAAU,EAAE,CAAC;YACvF,OAAO;gBACL,EAAE,EAAE,OAAO;gBACX,MAAM,EAAE,OAAO;gBACf,OAAO,EAAE,kDAAkD;gBAC3D,MAAM,EAAE,IAAI;gBACZ,WAAW,EAAE,+DAA+D;aAC7E,CAAC;QACJ,CAAC;QACD,MAAM,MAAM,CAAC,QAAQ,EAAE,SAAS,CAAC,IAAI,GAAG,SAAS,CAAC,IAAI,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC;QACzE,OAAO;YACL,EAAE,EAAE,OAAO;YACX,MAAM,EAAE,MAAM;YACd,OAAO,EACL,QAAQ,KAAK,OAAO,CAAC,IAAI,CAAC;gBACxB,CAAC,CAAC,0CAA0C;gBAC5C,CAAC,CAAC,gCAAgC;YACtC,MAAM,EAAE,QAAQ,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,4BAA4B,QAAQ,EAAE;SACnF,CAAC;IACJ,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO;YACL,EAAE,EAAE,OAAO;YACX,MAAM,EAAE,OAAO;YACf,OAAO,EAAE,+BAA+B;YACxC,MAAM,EAAE,YAAY,CAAC,KAAK,CAAC;YAC3B,WAAW,EAAE,oDAAoD;SAClE,CAAC;IACJ,CAAC;AACH,CAAC;AAED,KAAK,UAAU,qBAAqB,CAClC,QAAyB,EACzB,UAAuE,EACvE,eAAsC;IAEtC,IAAI,QAAQ,KAAK,OAAO,EAAE,CAAC;QACzB,OAAO;YACL,EAAE,EAAE,mBAAmB;YACvB,MAAM,EAAE,SAAS;YACjB,OAAO,EAAE,uDAAuD;SACjE,CAAC;IACJ,CAAC;IACD,IAAI,WAAoB,CAAC;IACzB,IAAI,QAAQ,KAAK,OAAO,EAAE,CAAC;QACzB,IAAI,CAAC;YACH,MAAM,eAAe,EAAE,CAAC;QAC1B,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,WAAW,GAAG,KAAK,CAAC;QACtB,CAAC;IACH,CAAC;IACD,IAAI,CAAC;QACH,MAAM,UAAU,CAAC,MAAM,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC;QACjC,OAAO;YACL,EAAE,EAAE,mBAAmB;YACvB,MAAM,EAAE,MAAM;YACd,OAAO,EACL,QAAQ,KAAK,OAAO,IAAI,WAAW,KAAK,SAAS;gBAC/C,CAAC,CAAC,wDAAwD;gBAC1D,CAAC,CAAC,QAAQ,KAAK,OAAO;oBACpB,CAAC,CAAC,4CAA4C;oBAC9C,CAAC,CAAC,2CAA2C;YACnD,GAAG,CAAC,WAAW,KAAK,SAAS;gBAC3B,CAAC,CAAC,EAAE;gBACJ,CAAC,CAAC,EAAE,MAAM,EAAE,0CAA0C,YAAY,CAAC,WAAW,CAAC,EAAE,EAAE,CAAC;SACvF,CAAC;IACJ,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO;YACL,EAAE,EAAE,mBAAmB;YACvB,MAAM,EAAE,OAAO;YACf,OAAO,EACL,QAAQ,KAAK,OAAO,IAAI,WAAW,KAAK,SAAS;gBAC/C,CAAC,CAAC,8CAA8C;gBAChD,CAAC,CAAC,QAAQ,KAAK,OAAO;oBACpB,CAAC,CAAC,8BAA8B;oBAChC,CAAC,CAAC,6CAA6C;YACrD,MAAM,EACJ,WAAW,KAAK,SAAS;gBACvB,CAAC,CAAC,YAAY,CAAC,KAAK,CAAC;gBACrB,CAAC,CAAC,WAAW,YAAY,CAAC,WAAW,CAAC,WAAW,YAAY,CAAC,KAAK,CAAC,EAAE;YAC1E,WAAW,EAAE,6CAA6C;SAC3D,CAAC;IACJ,CAAC;AACH,CAAC;AAED,KAAK,UAAU,kBAAkB,CAC/B,QAAyB,EACzB,UAAuE;IAEvE,IAAI,QAAQ,KAAK,QAAQ,IAAI,QAAQ,KAAK,OAAO,EAAE,CAAC;QAClD,OAAO;YACL,EAAE,EAAE,gBAAgB;YACpB,MAAM,EAAE,MAAM;YACd,OAAO,EAAE,uDAAuD;SACjE,CAAC;IACJ,CAAC;IACD,MAAM,OAAO,GAAG,QAAQ,KAAK,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC;IAC1D,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,UAAU,CAAC,IAAI,EAAE,CAAC,IAAI,EAAE,cAAc,OAAO,EAAE,CAAC,CAAC,CAAC;QACvE,OAAO;YACL,EAAE,EAAE,gBAAgB;YACpB,MAAM,EAAE,MAAM;YACd,OAAO,EAAE,GAAG,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,IAAI,OAAO,0CAA0C;SACtF,CAAC;IACJ,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO;YACL,EAAE,EAAE,gBAAgB;YACpB,MAAM,EAAE,OAAO;YACf,OAAO,EAAE,GAAG,OAAO,iBAAiB;YACpC,MAAM,EAAE,YAAY,CAAC,KAAK,CAAC;YAC3B,WAAW,EACT,QAAQ,KAAK,QAAQ;gBACnB,CAAC,CAAC,gEAAgE;gBAClE,CAAC,CAAC,oEAAoE;SAC3E,CAAC;IACJ,CAAC;AACH,CAAC;AAED,KAAK,UAAU,SAAS,CACtB,MAAwB,EACxB,UAAuE;IAEvE,MAAM,MAAM,GAAkB,EAAE,CAAC;IACjC,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,UAAU,CAAC,KAAK,EAAE,CAAC,WAAW,CAAC,CAAC,CAAC;QACtD,MAAM,OAAO,GAAG,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC;QACrC,MAAM,CAAC,IAAI,CAAC;YACV,EAAE,EAAE,KAAK;YACT,MAAM,EAAE,MAAM;YACd,OAAO,EAAE,OAAO,KAAK,EAAE,CAAC,CAAC,CAAC,kBAAkB,CAAC,CAAC,CAAC,OAAO;SACvD,CAAC,CAAC;IACL,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO;YACL;gBACE,EAAE,EAAE,KAAK;gBACT,MAAM,EAAE,OAAO;gBACf,OAAO,EAAE,oBAAoB;gBAC7B,MAAM,EAAE,YAAY,CAAC,KAAK,CAAC;gBAC3B,WAAW,EAAE,iDAAiD;aAC/D;SACF,CAAC;IACJ,CAAC;IAED,MAAM,GAAG,GAAG,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC;IAChC,IAAI,GAAG,EAAE,OAAO,KAAK,IAAI,EAAE,CAAC;QAC1B,MAAM,CAAC,IAAI,CAAC;YACV,EAAE,EAAE,eAAe;YACnB,MAAM,EAAE,MAAM;YACd,OAAO,EAAE,kCAAkC;SAC5C,CAAC,CAAC;QACH,OAAO,MAAM,CAAC;IAChB,CAAC;IACD,IAAI,GAAG,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;QAC3B,MAAM,CAAC,IAAI,CAAC;YACV,EAAE,EAAE,eAAe;YACnB,MAAM,EAAE,SAAS;YACjB,OAAO,EAAE,sDAAsD;YAC/D,WAAW,EAAE,mDAAmD;SACjE,CAAC,CAAC;QACH,OAAO,MAAM,CAAC;IAChB,CAAC;IAED,IAAI,CAAC;QACH,MAAM,UAAU,CAAC,KAAK,EAAE,CAAC,IAAI,EAAE,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,UAAU,EAAE,MAAM,EAAE,aAAa,EAAE,IAAI,CAAC,CAAC,CAAC;QAC5F,MAAM,CAAC,IAAI,CAAC;YACV,EAAE,EAAE,eAAe;YACnB,MAAM,EAAE,MAAM;YACd,OAAO,EAAE,qCAAqC;YAC9C,MAAM,EAAE,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC;SAC1B,CAAC,CAAC;IACL,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,CAAC,IAAI,CAAC;YACV,EAAE,EAAE,eAAe;YACnB,MAAM,EAAE,OAAO;YACf,OAAO,EAAE,+BAA+B;YACxC,MAAM,EAAE,YAAY,CAAC,KAAK,CAAC;YAC3B,WAAW,EAAE,iEAAiE;SAC/E,CAAC,CAAC;IACL,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,KAAK,UAAU,WAAW,CACxB,OAAgB,EAChB,UAAuE;IAEvE,IAAI,CAAC;QACH,MAAM,UAAU,CAAC,QAAQ,EAAE,CAAC,WAAW,CAAC,CAAC,CAAC;IAC5C,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO;YACL,EAAE,EAAE,QAAQ;YACZ,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,MAAM;YACpC,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC,2BAA2B,CAAC,CAAC,CAAC,oCAAoC;YACrF,GAAG,CAAC,OAAO;gBACT,CAAC,CAAC;oBACE,MAAM,EAAE,YAAY,CAAC,KAAK,CAAC;oBAC3B,WAAW,EAAE,+CAA+C;iBAC7D;gBACH,CAAC,CAAC,EAAE,CAAC;SACR,CAAC;IACJ,CAAC;IAED,IAAI,CAAC;QACH,MAAM,CAAC,OAAO,EAAE,OAAO,CAAC,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC;YAC3C,UAAU,CAAC,QAAQ,EAAE,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC;YACzC,UAAU,CAAC,QAAQ,EAAE,CAAC,SAAS,EAAE,UAAU,EAAE,qBAAqB,CAAC,CAAC;SACrE,CAAC,CAAC;QACH,OAAO;YACL,EAAE,EAAE,QAAQ;YACZ,MAAM,EAAE,MAAM;YACd,OAAO,EAAE,iBAAiB,OAAO,CAAC,MAAM,CAAC,IAAI,EAAE,IAAI,WAAW,EAAE;YAChE,MAAM,EAAE,YAAY,OAAO,CAAC,MAAM,CAAC,IAAI,EAAE,IAAI,SAAS,EAAE;SACzD,CAAC;IACJ,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO;YACL,EAAE,EAAE,QAAQ;YACZ,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,MAAM;YACpC,OAAO,EAAE,OAAO;gBACd,CAAC,CAAC,kEAAkE;gBACpE,CAAC,CAAC,yCAAyC;YAC7C,GAAG,CAAC,OAAO;gBACT,CAAC,CAAC;oBACE,MAAM,EAAE,YAAY,CAAC,KAAK,CAAC;oBAC3B,WAAW,EAAE,6CAA6C;iBAC3D;gBACH,CAAC,CAAC,EAAE,CAAC;SACR,CAAC;IACJ,CAAC;AACH,CAAC;AAED,KAAK,UAAU,SAAS,CACtB,QAAyB,EACzB,UAAuE;IAEvE,IAAI,QAAQ,KAAK,QAAQ,EAAE,CAAC;QAC1B,OAAO;YACL,EAAE,EAAE,MAAM;YACV,MAAM,EAAE,MAAM;YACd,OAAO,EAAE,iDAAiD;SAC3D,CAAC;IACJ,CAAC;IACD,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,UAAU,CAAC,IAAI,EAAE,CAAC,WAAW,CAAC,CAAC,CAAC;QACrD,OAAO;YACL,EAAE,EAAE,MAAM;YACV,MAAM,EAAE,MAAM;YACd,OAAO,EAAE,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,IAAI,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,IAAI,mBAAmB;YAC5E,MAAM,EAAE,mDAAmD;SAC5D,CAAC;IACJ,CAAC;IAAC,MAAM,CAAC;QACP,OAAO;YACL,EAAE,EAAE,MAAM;YACV,MAAM,EAAE,MAAM;YACd,OAAO,EAAE,kCAAkC;SAC5C,CAAC;IACJ,CAAC;AACH,CAAC;AAED,KAAK,UAAU,cAAc,CAC3B,IAAY,EACZ,MAAwB,EACxB,QAAyB;IAEzB,MAAM,MAAM,GAAkB,EAAE,CAAC;IACjC,KAAK,MAAM,IAAI,IAAI,MAAM,CAAC,MAAM,CAAC,cAAc,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CACpE,IAAI,CAAC,EAAE,CAAC,aAAa,CAAC,KAAK,CAAC,EAAE,CAAC,CAChC,EAAE,CAAC;QACF,MAAM,UAAU,GAAG,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAC5C,IAAI,UAAU,EAAE,OAAO,KAAK,KAAK,EAAE,CAAC;YAClC,MAAM,CAAC,IAAI,CAAC;gBACV,EAAE,EAAE,YAAY,IAAI,CAAC,EAAE,EAAE;gBACzB,MAAM,EAAE,MAAM;gBACd,OAAO,EAAE,GAAG,IAAI,CAAC,WAAW,sBAAsB;aACnD,CAAC,CAAC;YACH,SAAS;QACX,CAAC;QACD,MAAM,IAAI,GAAG,OAAO,CAAC,UAAU,EAAE,IAAI,IAAI,IAAI,CAAC,WAAW,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC,CAAC;QAC3E,IAAI,CAAC;YACH,MAAM,KAAK,GAAG,MAAM,KAAK,CAAC,IAAI,CAAC,CAAC;YAChC,IAAI,CAAC,KAAK,CAAC,WAAW,EAAE,IAAI,KAAK,CAAC,cAAc,EAAE,EAAE,CAAC;gBACnD,MAAM,CAAC,IAAI,CAAC;oBACV,EAAE,EAAE,YAAY,IAAI,CAAC,EAAE,EAAE;oBACzB,MAAM,EAAE,SAAS;oBACjB,OAAO,EAAE,GAAG,IAAI,CAAC,WAAW,+BAA+B;oBAC3D,MAAM,EAAE,IAAI;iBACb,CAAC,CAAC;gBACH,SAAS;YACX,CAAC;YACD,MAAM,MAAM,CAAC,IAAI,EAAE,SAAS,CAAC,IAAI,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC;YACpD,MAAM,CAAC,IAAI,CAAC;gBACV,EAAE,EAAE,YAAY,IAAI,CAAC,EAAE,EAAE;gBACzB,MAAM,EAAE,MAAM;gBACd,OAAO,EAAE,GAAG,IAAI,CAAC,WAAW,mBAAmB;gBAC/C,MAAM,EAAE,IAAI;aACb,CAAC,CAAC;QACL,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,OAAO,GAAG,SAAS,CAAC,KAAK,CAAC,KAAK,QAAQ,CAAC;YAC9C,MAAM,CAAC,IAAI,CAAC;gBACV,EAAE,EAAE,YAAY,IAAI,CAAC,EAAE,EAAE;gBACzB,MAAM,EAAE,UAAU,EAAE,IAAI,KAAK,SAAS,IAAI,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO;gBAC1F,OAAO,EAAE,OAAO;oBACd,CAAC,CAAC,GAAG,IAAI,CAAC,WAAW,iBAAiB;oBACtC,CAAC,CAAC,GAAG,IAAI,CAAC,WAAW,qBAAqB;gBAC5C,MAAM,EAAE,IAAI;gBACZ,GAAG,CAAC,UAAU,EAAE,IAAI,KAAK,SAAS,IAAI,OAAO;oBAC3C,CAAC,CAAC,EAAE,WAAW,EAAE,2CAA2C,EAAE;oBAC9D,CAAC,CAAC,EAAE,CAAC;aACR,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,KAAK,UAAU,cAAc,CAAC,MAAwB;IACpD,MAAM,MAAM,GAAkB,EAAE,CAAC;IACjC,KAAK,MAAM,CAAC,KAAK,EAAE,OAAO,CAAC,IAAI,MAAM,CAAC,SAAS,CAAC,QAAQ,CAAC,OAAO,EAAE,EAAE,CAAC;QACnE,MAAM,IAAI,GAAG,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;QACnC,IAAI,CAAC;YACH,MAAM,KAAK,GAAG,MAAM,KAAK,CAAC,IAAI,CAAC,CAAC;YAChC,IAAI,CAAC,KAAK,CAAC,WAAW,EAAE,IAAI,KAAK,CAAC,cAAc,EAAE,EAAE,CAAC;gBACnD,MAAM,IAAI,KAAK,CAAC,mDAAmD,CAAC,CAAC;YACvE,CAAC;YACD,MAAM,MAAM,CAAC,IAAI,EAAE,SAAS,CAAC,IAAI,GAAG,SAAS,CAAC,IAAI,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC;YACrE,MAAM,CAAC,IAAI,CAAC;gBACV,EAAE,EAAE,iBAAiB,KAAK,EAAE;gBAC5B,MAAM,EAAE,MAAM;gBACd,OAAO,EAAE,8CAA8C;gBACvD,MAAM,EAAE,IAAI;aACb,CAAC,CAAC;QACL,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,CAAC,IAAI,CAAC;gBACV,EAAE,EAAE,iBAAiB,KAAK,EAAE;gBAC5B,MAAM,EAAE,OAAO;gBACf,OAAO,EAAE,uCAAuC;gBAChD,MAAM,EAAE,GAAG,IAAI,KAAK,YAAY,CAAC,KAAK,CAAC,EAAE;aAC1C,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IACD,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACxB,MAAM,CAAC,IAAI,CAAC;YACV,EAAE,EAAE,gBAAgB;YACpB,MAAM,EAAE,MAAM;YACd,OAAO,EAAE,0CAA0C;SACpD,CAAC,CAAC;IACL,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,KAAK,UAAU,oBAAoB,CACjC,EAAU,EACV,SAAiB,EACjB,MAAkB;IAElB,IAAI,KAAe,CAAC;IACpB,IAAI,CAAC;QACH,KAAK,GAAG,CAAC,MAAM,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;IACrF,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAI,SAAS,CAAC,KAAK,CAAC,KAAK,QAAQ,EAAE,CAAC;YAClC,OAAO,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,4BAA4B,EAAE,CAAC;QACvE,CAAC;QACD,OAAO;YACL,EAAE;YACF,MAAM,EAAE,OAAO;YACf,OAAO,EAAE,uCAAuC;YAChD,MAAM,EAAE,YAAY,CAAC,KAAK,CAAC;SAC5B,CAAC;IACJ,CAAC;IAED,MAAM,QAAQ,GAAa,EAAE,CAAC;IAC9B,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,IAAI,CAAC;YACH,MAAM,CAAC,KAAK,CAAC,MAAM,YAAY,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC;QAC1D,CAAC;QAAC,MAAM,CAAC;YACP,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACtB,CAAC;IACH,CAAC;IACD,OAAO,QAAQ,CAAC,MAAM,KAAK,CAAC;QAC1B,CAAC,CAAC,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,GAAG,KAAK,CAAC,MAAM,qCAAqC,EAAE;QACvF,CAAC,CAAC;YACE,EAAE;YACF,MAAM,EAAE,OAAO;YACf,OAAO,EAAE,GAAG,QAAQ,CAAC,MAAM,uCAAuC;YAClE,MAAM,EAAE,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC;YAC3B,WAAW,EAAE,qEAAqE;SACnF,CAAC;AACR,CAAC;AAED,KAAK,UAAU,SAAS,CACtB,cAAsB,EACtB,YAAyC;IAEzC,IAAI,MAAoD,CAAC;IACzD,IAAI,CAAC;QACH,MAAM,GAAG,MAAM,gBAAgB,CAAC,cAAc,EAAE,YAAY,CAAC,CAAC;IAChE,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO;YACL,EAAE,EAAE,YAAY;YAChB,MAAM,EAAE,OAAO;YACf,OAAO,EAAE,mCAAmC;YAC5C,MAAM,EAAE,YAAY,CAAC,KAAK,CAAC;YAC3B,WAAW,EAAE,gEAAgE;SAC9E,CAAC;IACJ,CAAC;IACD,IAAI,MAAM,CAAC,MAAM,KAAK,QAAQ,EAAE,CAAC;QAC/B,OAAO,EAAE,EAAE,EAAE,YAAY,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,0BAA0B,EAAE,CAAC;IACnF,CAAC;IACD,IAAI,MAAM,CAAC,MAAM,KAAK,QAAQ,EAAE,CAAC;QAC/B,OAAO;YACL,EAAE,EAAE,YAAY;YAChB,MAAM,EAAE,SAAS;YACjB,OAAO,EAAE,+BAA+B,MAAM,CAAC,KAAK,CAAC,GAAG,GAAG;YAC3D,MAAM,EAAE,OAAO,MAAM,CAAC,KAAK,CAAC,KAAK,EAAE;SACpC,CAAC;IACJ,CAAC;IACD,IAAI,MAAM,CAAC,MAAM,KAAK,OAAO,EAAE,CAAC;QAC9B,OAAO;YACL,EAAE,EAAE,YAAY;YAChB,MAAM,EAAE,SAAS;YACjB,OAAO,EAAE,sCAAsC;YAC/C,MAAM,EAAE,MAAM,CAAC,MAAM;YACrB,WAAW,EAAE,wEAAwE;SACtF,CAAC;IACJ,CAAC;IACD,OAAO;QACL,EAAE,EAAE,YAAY;QAChB,MAAM,EAAE,OAAO;QACf,OAAO,EAAE,wBAAwB,MAAM,CAAC,MAAM,EAAE;QAChD,MAAM,EAAE,MAAM,CAAC,MAAM;QACrB,WAAW,EAAE,6DAA6D;KAC3E,CAAC;AACJ,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,oBAAoB,CACxC,OAA6B;IAE7B,MAAM,YAAY,GAAG,OAAO,CAAC,YAAY,IAAI,EAAE,CAAC;IAChD,MAAM,QAAQ,GAAG,YAAY,CAAC,QAAQ,IAAI,OAAO,CAAC,QAAQ,CAAC;IAC3D,MAAM,WAAW,GAAG,YAAY,CAAC,WAAW,IAAI,OAAO,CAAC,GAAG,CAAC;IAC5D,MAAM,UAAU,GAAG,YAAY,CAAC,UAAU,IAAI,iBAAiB,CAAC;IAChE,MAAM,IAAI,GAAG,gBAAgB,CAAC,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,QAAQ,EAAE,WAAW,CAAC,CAAC;IAC3E,MAAM,MAAM,GAAG,WAAW,CAAC,IAAI,CAAC,CAAC;IACjC,MAAM,MAAM,GAAG,MAAM,YAAY,CAAC,OAAO,EAAE,WAAW,CAAC,CAAC;IACxD,MAAM,MAAM,GAAkB;QAC5B,aAAa,CAAC,QAAQ,CAAC;QACvB,GAAG,MAAM,CAAC,MAAM;QAChB,MAAM,UAAU,CAAC,IAAI,EAAE,YAAY,CAAC,UAAU,EAAE,EAAE,IAAI,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC;QACzE,MAAM,qBAAqB,CACzB,QAAQ,EACR,UAAU,EACV,YAAY,CAAC,eAAe,IAAI,CAAC,GAAG,EAAE,CAAC,QAAQ,CAAC,iBAAiB,EAAE,MAAM,CAAC,CAAC,CAC5E;QACD,MAAM,kBAAkB,CAAC,QAAQ,EAAE,UAAU,CAAC;QAC9C,GAAG,CAAC,MAAM,SAAS,CAAC,MAAM,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC;QAC/C,MAAM,WAAW,CAAC,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,EAAE,OAAO,KAAK,IAAI,EAAE,UAAU,CAAC;QAC9E,MAAM,SAAS,CAAC,QAAQ,EAAE,UAAU,CAAC;QACrC,GAAG,CAAC,MAAM,cAAc,CAAC,OAAO,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;QAChE,GAAG,CAAC,MAAM,cAAc,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;QACxC,MAAM,SAAS,CAAC,MAAM,CAAC,KAAK,EAAE,YAAY,CAAC,IAAI,CAAC;QAChD,MAAM,oBAAoB,CAAC,eAAe,EAAE,MAAM,CAAC,MAAM,EAAE,iBAAiB,CAAC;QAC7E,MAAM,oBAAoB,CAAC,cAAc,EAAE,MAAM,CAAC,KAAK,EAAE,iBAAiB,CAAC;QAC3E,MAAM,oBAAoB,CAAC,aAAa,EAAE,MAAM,CAAC,IAAI,EAAE,gBAAgB,CAAC;KACzE,CAAC;IACF,MAAM,MAAM,GAAG,kBAAkB,CAAC,KAAK,CAAC;QACtC,aAAa,EAAE,CAAC;QAChB,WAAW,EAAE,CAAC,YAAY,CAAC,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC,WAAW,EAAE;QACrE,MAAM,EAAE,YAAY,CAAC,MAAM,CAAC;QAC5B,MAAM;KACP,CAAC,CAAC;IACH,OAAO;QACL,MAAM;QACN,MAAM,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,YAAY,CAAC,MAAM,CAAC;KACrF,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { type CleanupRun } from "../contracts/run.js";
|
|
2
|
+
export type HistoryCommandOptions = {
|
|
3
|
+
home: string;
|
|
4
|
+
stateDir?: string | undefined;
|
|
5
|
+
since?: string | undefined;
|
|
6
|
+
json: boolean;
|
|
7
|
+
now?: Date | undefined;
|
|
8
|
+
};
|
|
9
|
+
export type HistoryCommandResult = {
|
|
10
|
+
runs: CleanupRun[];
|
|
11
|
+
output: string;
|
|
12
|
+
};
|
|
13
|
+
export declare function renderHistory(runs: CleanupRun[]): string;
|
|
14
|
+
export declare function executeHistoryCommand(options: HistoryCommandOptions): Promise<HistoryCommandResult>;
|
|
15
|
+
//# sourceMappingURL=history.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"history.d.ts","sourceRoot":"","sources":["../../src/commands/history.ts"],"names":[],"mappings":"AAAA,OAAO,EAAoB,KAAK,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAKxE,MAAM,MAAM,qBAAqB,GAAG;IAClC,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC9B,KAAK,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC3B,IAAI,EAAE,OAAO,CAAC;IACd,GAAG,CAAC,EAAE,IAAI,GAAG,SAAS,CAAC;CACxB,CAAC;AAEF,MAAM,MAAM,oBAAoB,GAAG;IACjC,IAAI,EAAE,UAAU,EAAE,CAAC;IACnB,MAAM,EAAE,MAAM,CAAC;CAChB,CAAC;AAEF,wBAAgB,aAAa,CAAC,IAAI,EAAE,UAAU,EAAE,GAAG,MAAM,CAgBxD;AAED,wBAAsB,qBAAqB,CACzC,OAAO,EAAE,qBAAqB,GAC7B,OAAO,CAAC,oBAAoB,CAAC,CAY/B"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import { cleanupRunSchema } from "../contracts/run.js";
|
|
2
|
+
import { parseDurationMs } from "../core/duration.js";
|
|
3
|
+
import { resolveStateRoot, stateLayout } from "../state/layout.js";
|
|
4
|
+
import { listJsonRecords } from "../state/records.js";
|
|
5
|
+
export function renderHistory(runs) {
|
|
6
|
+
if (runs.length === 0) {
|
|
7
|
+
return "No AgentRinse runs found.\n";
|
|
8
|
+
}
|
|
9
|
+
const lines = ["AgentRinse history", ""];
|
|
10
|
+
for (const run of runs) {
|
|
11
|
+
const applied = run.actions.filter((action) => action.status === "applied").length;
|
|
12
|
+
const failed = run.actions.filter((action) => ["failed", "rolled-back", "partially-applied"].includes(action.status)).length;
|
|
13
|
+
lines.push(`${run.startedAt} ${run.status.padEnd(9)} ${run.runId} applied=${applied} failed=${failed}`);
|
|
14
|
+
}
|
|
15
|
+
return `${lines.join("\n")}\n`;
|
|
16
|
+
}
|
|
17
|
+
export async function executeHistoryCommand(options) {
|
|
18
|
+
const layout = stateLayout(resolveStateRoot(options.home, options.stateDir));
|
|
19
|
+
let runs = await listJsonRecords(layout.runs, cleanupRunSchema);
|
|
20
|
+
if (options.since !== undefined) {
|
|
21
|
+
const cutoff = (options.now ?? new Date()).getTime() - parseDurationMs(options.since);
|
|
22
|
+
runs = runs.filter((run) => Date.parse(run.startedAt) >= cutoff);
|
|
23
|
+
}
|
|
24
|
+
runs.sort((left, right) => right.startedAt.localeCompare(left.startedAt));
|
|
25
|
+
return {
|
|
26
|
+
runs,
|
|
27
|
+
output: options.json ? `${JSON.stringify(runs, null, 2)}\n` : renderHistory(runs),
|
|
28
|
+
};
|
|
29
|
+
}
|
|
30
|
+
//# sourceMappingURL=history.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"history.js","sourceRoot":"","sources":["../../src/commands/history.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAmB,MAAM,qBAAqB,CAAC;AACxE,OAAO,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AACtD,OAAO,EAAE,gBAAgB,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACnE,OAAO,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AAetD,MAAM,UAAU,aAAa,CAAC,IAAkB;IAC9C,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACtB,OAAO,6BAA6B,CAAC;IACvC,CAAC;IAED,MAAM,KAAK,GAAG,CAAC,oBAAoB,EAAE,EAAE,CAAC,CAAC;IACzC,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;QACvB,MAAM,OAAO,GAAG,GAAG,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC,MAAM,CAAC;QACnF,MAAM,MAAM,GAAG,GAAG,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,MAAM,EAAE,EAAE,CAC3C,CAAC,QAAQ,EAAE,aAAa,EAAE,mBAAmB,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,MAAM,CAAC,CACvE,CAAC,MAAM,CAAC;QACT,KAAK,CAAC,IAAI,CACR,GAAG,GAAG,CAAC,SAAS,KAAK,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC,KAAK,aAAa,OAAO,WAAW,MAAM,EAAE,CAC/F,CAAC;IACJ,CAAC;IACD,OAAO,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC;AACjC,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,qBAAqB,CACzC,OAA8B;IAE9B,MAAM,MAAM,GAAG,WAAW,CAAC,gBAAgB,CAAC,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC;IAC7E,IAAI,IAAI,GAAG,MAAM,eAAe,CAAC,MAAM,CAAC,IAAI,EAAE,gBAAgB,CAAC,CAAC;IAChE,IAAI,OAAO,CAAC,KAAK,KAAK,SAAS,EAAE,CAAC;QAChC,MAAM,MAAM,GAAG,CAAC,OAAO,CAAC,GAAG,IAAI,IAAI,IAAI,EAAE,CAAC,CAAC,OAAO,EAAE,GAAG,eAAe,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;QACtF,IAAI,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,SAAS,CAAC,IAAI,MAAM,CAAC,CAAC;IACnE,CAAC;IACD,IAAI,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,SAAS,CAAC,aAAa,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC;IAC1E,OAAO;QACL,IAAI;QACJ,MAAM,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,aAAa,CAAC,IAAI,CAAC;KAClF,CAAC;AACJ,CAAC"}
|