@intentic/machine 1.318.0 → 1.319.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 +52 -4
- package/dist/commands.d.ts.map +1 -1
- package/dist/commands.js +2 -2
- package/dist/commands.js.map +1 -1
- package/dist/device/commands.d.ts +3 -1
- package/dist/device/commands.d.ts.map +1 -1
- package/dist/device/commands.js +2 -2
- package/dist/device/commands.js.map +1 -1
- package/dist/device/connection.d.ts +1 -0
- package/dist/device/connection.d.ts.map +1 -1
- package/dist/device/connection.js +5 -0
- package/dist/device/connection.js.map +1 -1
- package/dist/device/mcp.d.ts.map +1 -1
- package/dist/device/mcp.js +8 -1
- package/dist/device/mcp.js.map +1 -1
- package/dist/device/sandbox-cli.d.ts +3 -0
- package/dist/device/sandbox-cli.d.ts.map +1 -1
- package/dist/device/sandbox-cli.js +42 -0
- package/dist/device/sandbox-cli.js.map +1 -1
- package/dist/device/sandbox-rounds/ic-rounds.d.ts +3 -4
- package/dist/device/sandbox-rounds/ic-rounds.d.ts.map +1 -1
- package/dist/device/sandbox-rounds/ic-rounds.js +6 -0
- package/dist/device/sandbox-rounds/ic-rounds.js.map +1 -1
- package/dist/device/sandbox-rounds/keeper.d.ts +95 -0
- package/dist/device/sandbox-rounds/keeper.d.ts.map +1 -0
- package/dist/device/sandbox-rounds/keeper.js +277 -0
- package/dist/device/sandbox-rounds/keeper.js.map +1 -0
- package/dist/device/sandbox-rounds/swap-records.d.ts +1 -0
- package/dist/device/sandbox-rounds/swap-records.d.ts.map +1 -1
- package/dist/device/sandbox-rounds/swap-records.js +7 -0
- package/dist/device/sandbox-rounds/swap-records.js.map +1 -1
- package/dist/device/tools/sandboxes.d.ts +13 -5
- package/dist/device/tools/sandboxes.d.ts.map +1 -1
- package/dist/device/tools/sandboxes.js +64 -7
- package/dist/device/tools/sandboxes.js.map +1 -1
- package/dist/environments/machine.d.ts +1 -0
- package/dist/environments/machine.d.ts.map +1 -1
- package/dist/environments/machine.js.map +1 -1
- package/dist/resident.d.ts +12 -1
- package/dist/resident.d.ts.map +1 -1
- package/dist/resident.js +45 -14
- package/dist/resident.js.map +1 -1
- package/dist/sync/commands.d.ts +3 -1
- package/dist/sync/commands.d.ts.map +1 -1
- package/dist/sync/commands.js +3 -3
- package/dist/sync/commands.js.map +1 -1
- package/package.json +8 -8
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
import type { Log } from "@intentic/local-agent";
|
|
2
|
+
import { z } from "zod";
|
|
3
|
+
import type { LinkReading } from "../config.js";
|
|
4
|
+
import { type IcRun, type Rounds } from "./ic-rounds.js";
|
|
5
|
+
export declare const UNREACHABLE_AFTER_MS = 60000;
|
|
6
|
+
export declare const FIX_DEADLINE_MS: number;
|
|
7
|
+
export declare const backoffMs: (failures: number) => number;
|
|
8
|
+
export declare const keeperFixArgs: (slug?: string) => string[];
|
|
9
|
+
export declare const FIX_PROGRESS_PREFIX = "intentic-fix:";
|
|
10
|
+
declare const FixCheckSchema: z.ZodObject<{
|
|
11
|
+
id: z.ZodString;
|
|
12
|
+
label: z.ZodString;
|
|
13
|
+
state: z.ZodString;
|
|
14
|
+
problem: z.ZodOptional<z.ZodString>;
|
|
15
|
+
remedy: z.ZodOptional<z.ZodString>;
|
|
16
|
+
fix: z.ZodOptional<z.ZodString>;
|
|
17
|
+
}, z.core.$strip>;
|
|
18
|
+
export type FixCheck = z.infer<typeof FixCheckSchema>;
|
|
19
|
+
declare const FixAnswerSchema: z.ZodObject<{
|
|
20
|
+
slug: z.ZodString;
|
|
21
|
+
report: z.ZodObject<{
|
|
22
|
+
stage: z.ZodString;
|
|
23
|
+
doing: z.ZodOptional<z.ZodString>;
|
|
24
|
+
outcome: z.ZodOptional<z.ZodString>;
|
|
25
|
+
checks: z.ZodDefault<z.ZodArray<z.ZodObject<{
|
|
26
|
+
id: z.ZodString;
|
|
27
|
+
label: z.ZodString;
|
|
28
|
+
state: z.ZodString;
|
|
29
|
+
problem: z.ZodOptional<z.ZodString>;
|
|
30
|
+
remedy: z.ZodOptional<z.ZodString>;
|
|
31
|
+
fix: z.ZodOptional<z.ZodString>;
|
|
32
|
+
}, z.core.$strip>>>;
|
|
33
|
+
}, z.core.$strip>;
|
|
34
|
+
}, z.core.$strip>;
|
|
35
|
+
export type FixAnswer = z.infer<typeof FixAnswerSchema>;
|
|
36
|
+
export interface FixProgress {
|
|
37
|
+
readonly slug: string | undefined;
|
|
38
|
+
readonly doing: string | undefined;
|
|
39
|
+
}
|
|
40
|
+
export declare const fixProgress: (line: string) => FixProgress | undefined;
|
|
41
|
+
export declare const fixAnswers: (output: string) => FixAnswer[];
|
|
42
|
+
export type FixRunReading = {
|
|
43
|
+
readonly unavailable: string;
|
|
44
|
+
} | {
|
|
45
|
+
readonly answers: readonly FixAnswer[];
|
|
46
|
+
};
|
|
47
|
+
export declare const readFixRun: (run: IcRun) => FixRunReading;
|
|
48
|
+
export declare const settled: (answer: FixAnswer) => boolean;
|
|
49
|
+
export declare const verdictLine: (answer: FixAnswer) => string;
|
|
50
|
+
export declare const localSlugOf: (sandboxUrl: string, known: ReadonlySet<string>, loopback: boolean) => string | undefined;
|
|
51
|
+
export interface LinkView {
|
|
52
|
+
readonly url: string;
|
|
53
|
+
readonly reading: LinkReading;
|
|
54
|
+
}
|
|
55
|
+
export declare const unreachableHere: (links: readonly LinkView[], known: ReadonlySet<string>, loopback: ReadonlySet<string>, now: number) => string[];
|
|
56
|
+
export declare const hostedSlugs: (listing: () => Promise<readonly string[]>, records: () => Promise<readonly string[]>) => Promise<string[]>;
|
|
57
|
+
export interface KeeperSeams {
|
|
58
|
+
readonly enabled: () => Promise<boolean>;
|
|
59
|
+
readonly fix: (slug: string | undefined, onLine: (line: string) => void) => Promise<IcRun>;
|
|
60
|
+
readonly listing: () => Promise<readonly string[]>;
|
|
61
|
+
readonly records: () => Promise<readonly string[]>;
|
|
62
|
+
readonly swapping: () => Promise<readonly string[]>;
|
|
63
|
+
readonly links: () => readonly LinkView[];
|
|
64
|
+
readonly loopback: ReadonlySet<string>;
|
|
65
|
+
readonly watching: () => boolean;
|
|
66
|
+
readonly busy: ReadonlySet<string>;
|
|
67
|
+
readonly hold: (slug: string) => () => void;
|
|
68
|
+
readonly now: () => number;
|
|
69
|
+
}
|
|
70
|
+
interface Wait {
|
|
71
|
+
readonly failures: number;
|
|
72
|
+
readonly until: number;
|
|
73
|
+
}
|
|
74
|
+
export interface KeeperState {
|
|
75
|
+
sweepDueAt: number;
|
|
76
|
+
sweepFailures: number;
|
|
77
|
+
unavailable: Wait;
|
|
78
|
+
readonly waits: Map<string, Wait>;
|
|
79
|
+
readonly said: Map<string, string>;
|
|
80
|
+
listed: readonly string[];
|
|
81
|
+
fixing: boolean;
|
|
82
|
+
on: boolean | undefined;
|
|
83
|
+
}
|
|
84
|
+
export declare const newKeeperState: (start: number) => KeeperState;
|
|
85
|
+
export declare const runKeeperRound: (state: KeeperState, seams: KeeperSeams, log: Log) => Promise<void>;
|
|
86
|
+
export interface KeeperWiring {
|
|
87
|
+
readonly links: () => readonly LinkView[];
|
|
88
|
+
readonly loopback: ReadonlySet<string>;
|
|
89
|
+
readonly watching: () => boolean;
|
|
90
|
+
}
|
|
91
|
+
export declare const keeperOn: () => Promise<boolean>;
|
|
92
|
+
export declare const machineKeeperSeams: ({ links, loopback, watching }: KeeperWiring) => KeeperSeams;
|
|
93
|
+
export declare const startKeeper: (log: Log, wiring: KeeperWiring) => Rounds;
|
|
94
|
+
export {};
|
|
95
|
+
//# sourceMappingURL=keeper.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"keeper.d.ts","sourceRoot":"","sources":["../../../src/device/sandbox-rounds/keeper.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,277 @@
|
|
|
1
|
+
import { errorMessage } from "@intentic/base/errors";
|
|
2
|
+
import { z } from "zod";
|
|
3
|
+
import { readMachineConfig } from "../../environments/machine.js";
|
|
4
|
+
import { pairingSlugs } from "../../sync/swap-pause.js";
|
|
5
|
+
import { lastLine, startRounds } from "./ic-rounds.js";
|
|
6
|
+
import { readChannelSlugs, readSwapRecords, swapsUnderway } from "./swap-records.js";
|
|
7
|
+
import { fleet, holdIcFlow, icInFlight, runIc } from "../tools/sandboxes.js";
|
|
8
|
+
const FIRST_SWEEP_MS = 30_000;
|
|
9
|
+
const SWEEP_EVERY_MS = 5 * 60_000;
|
|
10
|
+
const LOOK_EVERY_MS = 10_000;
|
|
11
|
+
export const UNREACHABLE_AFTER_MS = 60_000;
|
|
12
|
+
export const FIX_DEADLINE_MS = 8 * 60_000;
|
|
13
|
+
const BACKOFF_FIRST_MS = 3 * 60_000;
|
|
14
|
+
const BACKOFF_MAX_MS = 30 * 60_000;
|
|
15
|
+
export const backoffMs = (failures) => (failures <= 0 ? 0 : Math.min(BACKOFF_FIRST_MS * 2 ** (failures - 1), BACKOFF_MAX_MS));
|
|
16
|
+
export const keeperFixArgs = (slug) => ["sandbox", "fix", ...(slug === undefined ? [] : [slug]), "--auto", "--json", "--source", "agent"];
|
|
17
|
+
export const FIX_PROGRESS_PREFIX = "intentic-fix:";
|
|
18
|
+
const FixCheckSchema = z.object({
|
|
19
|
+
id: z.string(),
|
|
20
|
+
label: z.string(),
|
|
21
|
+
state: z.string(),
|
|
22
|
+
problem: z.string().optional(),
|
|
23
|
+
remedy: z.string().optional(),
|
|
24
|
+
fix: z.string().optional(),
|
|
25
|
+
});
|
|
26
|
+
const FixReportSchema = z.object({
|
|
27
|
+
stage: z.string(),
|
|
28
|
+
doing: z.string().optional(),
|
|
29
|
+
outcome: z.string().optional(),
|
|
30
|
+
checks: z.array(FixCheckSchema).default([]),
|
|
31
|
+
});
|
|
32
|
+
const FixAnswerSchema = z.object({ slug: z.string(), report: FixReportSchema });
|
|
33
|
+
const FixProgressSchema = z.object({
|
|
34
|
+
slug: z.string().optional(),
|
|
35
|
+
doing: z.string().optional(),
|
|
36
|
+
report: z.object({ doing: z.string().optional() }).optional(),
|
|
37
|
+
});
|
|
38
|
+
const lineAs = (schema, text) => {
|
|
39
|
+
try {
|
|
40
|
+
const parsed = schema.safeParse(JSON.parse(text));
|
|
41
|
+
return parsed.success ? parsed.data : undefined;
|
|
42
|
+
}
|
|
43
|
+
catch {
|
|
44
|
+
return undefined;
|
|
45
|
+
}
|
|
46
|
+
};
|
|
47
|
+
export const fixProgress = (line) => {
|
|
48
|
+
const trimmed = line.trim();
|
|
49
|
+
const parsed = trimmed.startsWith(FIX_PROGRESS_PREFIX) ? lineAs(FixProgressSchema, trimmed.slice(FIX_PROGRESS_PREFIX.length)) : undefined;
|
|
50
|
+
return parsed === undefined ? undefined : { slug: parsed.slug, doing: parsed.report?.doing ?? parsed.doing };
|
|
51
|
+
};
|
|
52
|
+
export const fixAnswers = (output) => output
|
|
53
|
+
.split(/\r?\n/)
|
|
54
|
+
.map((line) => line.trim())
|
|
55
|
+
.filter((line) => line.startsWith("{"))
|
|
56
|
+
.map((line) => lineAs(FixAnswerSchema, line))
|
|
57
|
+
.filter((answer) => answer !== undefined);
|
|
58
|
+
const progressCount = (output) => output.split(/\r?\n/).filter((line) => fixProgress(line) !== undefined).length;
|
|
59
|
+
const refusalOf = (run) => run.output
|
|
60
|
+
.split(/\r?\n/)
|
|
61
|
+
.map((line) => line.trim())
|
|
62
|
+
.find((line) => /^error\b/i.test(line)) ??
|
|
63
|
+
lastLine(run.output)?.trim() ??
|
|
64
|
+
`ic exited with ${run.code} and said nothing`;
|
|
65
|
+
export const readFixRun = (run) => {
|
|
66
|
+
const answers = fixAnswers(run.output);
|
|
67
|
+
if (run.code !== 0 && run.timedOut !== true && answers.length === 0 && progressCount(run.output) === 0) {
|
|
68
|
+
return { unavailable: refusalOf(run) };
|
|
69
|
+
}
|
|
70
|
+
return { answers };
|
|
71
|
+
};
|
|
72
|
+
export const settled = (answer) => answer.report.outcome === "healthy" || answer.report.outcome === "fixed";
|
|
73
|
+
const EXIT_RESTART = 4;
|
|
74
|
+
const leftLine = (slug, check) => {
|
|
75
|
+
const what = `${check.label}: ${check.problem ?? check.state}`;
|
|
76
|
+
if (check.fix === "consent") {
|
|
77
|
+
return `${what} (needs your yes: \`intentic-machine sandbox fix ${slug}\`)`;
|
|
78
|
+
}
|
|
79
|
+
return check.remedy === undefined ? what : `${what} (${check.remedy})`;
|
|
80
|
+
};
|
|
81
|
+
export const verdictLine = (answer) => {
|
|
82
|
+
const outcome = answer.report.outcome ?? answer.report.stage;
|
|
83
|
+
const left = settled(answer) ? [] : answer.report.checks.filter((check) => check.state === "fail" || check.state === "warn");
|
|
84
|
+
return `keeper ${answer.slug}: ${outcome}${left.length === 0 ? "" : ` — ${left.map((check) => leftLine(answer.slug, check)).join("; ")}`}`;
|
|
85
|
+
};
|
|
86
|
+
export const localSlugOf = (sandboxUrl, known, loopback) => {
|
|
87
|
+
const slugs = pairingSlugs(sandboxUrl);
|
|
88
|
+
return slugs.find((slug) => known.has(slug)) ?? (loopback ? slugs[0] : undefined);
|
|
89
|
+
};
|
|
90
|
+
export const unreachableHere = (links, known, loopback, now) => links.flatMap(({ url, reading }) => {
|
|
91
|
+
const since = reading.state === "open" ? undefined : reading.outage?.since;
|
|
92
|
+
const slug = since !== undefined && now - since >= UNREACHABLE_AFTER_MS ? localSlugOf(url, known, loopback.has(url)) : undefined;
|
|
93
|
+
return slug === undefined ? [] : [slug];
|
|
94
|
+
});
|
|
95
|
+
const answeringSlugs = (links) => links.filter(({ reading }) => reading.state === "open").flatMap(({ url }) => pairingSlugs(url));
|
|
96
|
+
const people = (slugs) => slugs.filter((slug) => !slug.startsWith("runner-"));
|
|
97
|
+
export const hostedSlugs = async (listing, records) => {
|
|
98
|
+
const listed = await listing().catch(() => undefined);
|
|
99
|
+
return people(listed ?? (await records()));
|
|
100
|
+
};
|
|
101
|
+
export const newKeeperState = (start) => ({
|
|
102
|
+
sweepDueAt: start + FIRST_SWEEP_MS,
|
|
103
|
+
sweepFailures: 0,
|
|
104
|
+
unavailable: { failures: 0, until: 0 },
|
|
105
|
+
waits: new Map(),
|
|
106
|
+
said: new Map(),
|
|
107
|
+
listed: [],
|
|
108
|
+
fixing: false,
|
|
109
|
+
on: undefined,
|
|
110
|
+
});
|
|
111
|
+
const sayOnce = (state, key, line, log) => {
|
|
112
|
+
if (state.said.get(key) !== line) {
|
|
113
|
+
state.said.set(key, line);
|
|
114
|
+
log(line);
|
|
115
|
+
}
|
|
116
|
+
};
|
|
117
|
+
const readSwitch = async (state, seams, log) => {
|
|
118
|
+
let on;
|
|
119
|
+
try {
|
|
120
|
+
on = await seams.enabled();
|
|
121
|
+
state.said.delete(":switch");
|
|
122
|
+
}
|
|
123
|
+
catch (error) {
|
|
124
|
+
sayOnce(state, ":switch", `keeper: not running while machine.json does not read — ${errorMessage(error)}`, log);
|
|
125
|
+
on = false;
|
|
126
|
+
}
|
|
127
|
+
if (state.on === undefined && !on) {
|
|
128
|
+
log("keeper: off on this machine. `intentic-machine sandbox keeper on` turns it on.");
|
|
129
|
+
}
|
|
130
|
+
else if (state.on !== undefined && on !== state.on) {
|
|
131
|
+
log(on ? "keeper: switched on, looking at this machine's sandboxes now." : "keeper: switched off. `intentic-machine sandbox keeper on` turns it back on.");
|
|
132
|
+
}
|
|
133
|
+
if (on && state.on === false) {
|
|
134
|
+
state.sweepDueAt = seams.now();
|
|
135
|
+
}
|
|
136
|
+
state.on = on;
|
|
137
|
+
return on;
|
|
138
|
+
};
|
|
139
|
+
const minutes = (ms) => `${Math.round(ms / 60_000)} min`;
|
|
140
|
+
const waitAfter = (state, slug, now) => {
|
|
141
|
+
const failures = (state.waits.get(slug)?.failures ?? 0) + 1;
|
|
142
|
+
state.waits.set(slug, { failures, until: now + backoffMs(failures) });
|
|
143
|
+
return backoffMs(failures);
|
|
144
|
+
};
|
|
145
|
+
const noteAnswer = (state, answer, log, now) => {
|
|
146
|
+
const line = verdictLine(answer);
|
|
147
|
+
if (settled(answer)) {
|
|
148
|
+
state.waits.set(answer.slug, { failures: 0, until: now + SWEEP_EVERY_MS });
|
|
149
|
+
if (answer.report.outcome === "fixed") {
|
|
150
|
+
state.said.set(answer.slug, line);
|
|
151
|
+
log(line);
|
|
152
|
+
}
|
|
153
|
+
else {
|
|
154
|
+
sayOnce(state, answer.slug, line, log);
|
|
155
|
+
}
|
|
156
|
+
return;
|
|
157
|
+
}
|
|
158
|
+
const wait = waitAfter(state, answer.slug, now);
|
|
159
|
+
if (state.said.get(answer.slug) !== line) {
|
|
160
|
+
state.said.set(answer.slug, line);
|
|
161
|
+
log(`${line} — looking again in ${minutes(wait)}`);
|
|
162
|
+
}
|
|
163
|
+
};
|
|
164
|
+
const noteRun = (state, run, asked, log, now) => {
|
|
165
|
+
const reading = readFixRun(run);
|
|
166
|
+
if ("unavailable" in reading) {
|
|
167
|
+
const failures = state.unavailable.failures + 1;
|
|
168
|
+
state.unavailable = { failures, until: now + backoffMs(failures) };
|
|
169
|
+
if (state.said.get(":ic") !== reading.unavailable) {
|
|
170
|
+
state.said.set(":ic", reading.unavailable);
|
|
171
|
+
log(`keeper: this machine's ic cannot fix sandboxes (${reading.unavailable}); trying again in ${minutes(backoffMs(failures))}, and less often after that`);
|
|
172
|
+
}
|
|
173
|
+
return false;
|
|
174
|
+
}
|
|
175
|
+
state.unavailable = { failures: 0, until: 0 };
|
|
176
|
+
state.said.delete(":ic");
|
|
177
|
+
for (const answer of reading.answers) {
|
|
178
|
+
noteAnswer(state, answer, log, now);
|
|
179
|
+
}
|
|
180
|
+
if (run.code === EXIT_RESTART) {
|
|
181
|
+
sayOnce(state, ":restart", "keeper: this computer needs a restart or a sign-out to finish what ic started.", log);
|
|
182
|
+
}
|
|
183
|
+
else {
|
|
184
|
+
state.said.delete(":restart");
|
|
185
|
+
}
|
|
186
|
+
const unanswered = asked !== undefined && !reading.answers.some((answer) => answer.slug === asked);
|
|
187
|
+
if (unanswered) {
|
|
188
|
+
const wait = waitAfter(state, asked, now);
|
|
189
|
+
state.said.delete(asked);
|
|
190
|
+
log(`keeper ${asked}: ic gave no verdict (${lastLine(run.output)?.trim() ?? "no output"}) — looking again in ${minutes(wait)}`);
|
|
191
|
+
}
|
|
192
|
+
return !unanswered && reading.answers.every(settled);
|
|
193
|
+
};
|
|
194
|
+
const runFix = async (state, seams, slug, touches, log) => {
|
|
195
|
+
state.fixing = true;
|
|
196
|
+
const releases = touches.map((touched) => seams.hold(touched));
|
|
197
|
+
const doings = new Set();
|
|
198
|
+
const onLine = (line) => {
|
|
199
|
+
const progress = fixProgress(line);
|
|
200
|
+
const doing = progress?.doing;
|
|
201
|
+
const about = progress?.slug ?? slug;
|
|
202
|
+
const said = `keeper${about === undefined ? "" : ` ${about}`}: ${doing ?? ""}`;
|
|
203
|
+
if (doing !== undefined && !doings.has(said)) {
|
|
204
|
+
doings.add(said);
|
|
205
|
+
log(said);
|
|
206
|
+
}
|
|
207
|
+
};
|
|
208
|
+
try {
|
|
209
|
+
return await seams.fix(slug, onLine);
|
|
210
|
+
}
|
|
211
|
+
catch (error) {
|
|
212
|
+
return { code: 127, output: errorMessage(error) };
|
|
213
|
+
}
|
|
214
|
+
finally {
|
|
215
|
+
for (const release of releases) {
|
|
216
|
+
release();
|
|
217
|
+
}
|
|
218
|
+
state.fixing = false;
|
|
219
|
+
}
|
|
220
|
+
};
|
|
221
|
+
const sweep = async (state, seams, known, log) => {
|
|
222
|
+
state.listed = await seams.listing().catch(() => state.listed);
|
|
223
|
+
const touches = [...new Set([...known, ...state.listed])];
|
|
224
|
+
const run = await runFix(state, seams, undefined, touches, log);
|
|
225
|
+
const now = seams.now();
|
|
226
|
+
const clean = noteRun(state, run, undefined, log, now);
|
|
227
|
+
state.sweepFailures = clean ? 0 : state.sweepFailures + 1;
|
|
228
|
+
state.sweepDueAt = now + Math.max(SWEEP_EVERY_MS, backoffMs(state.sweepFailures));
|
|
229
|
+
};
|
|
230
|
+
const dueTarget = async (state, seams, links, known, now) => {
|
|
231
|
+
const candidates = unreachableHere(links, known, seams.loopback, now).filter((slug) => !seams.busy.has(slug) && (state.waits.get(slug)?.until ?? 0) <= now);
|
|
232
|
+
if (candidates.length === 0) {
|
|
233
|
+
return undefined;
|
|
234
|
+
}
|
|
235
|
+
const swapping = new Set(await seams.swapping());
|
|
236
|
+
return candidates.find((slug) => !swapping.has(slug));
|
|
237
|
+
};
|
|
238
|
+
export const runKeeperRound = async (state, seams, log) => {
|
|
239
|
+
if (state.fixing || seams.watching() || !(await readSwitch(state, seams, log)) || seams.now() < state.unavailable.until) {
|
|
240
|
+
return;
|
|
241
|
+
}
|
|
242
|
+
const links = seams.links();
|
|
243
|
+
for (const slug of answeringSlugs(links)) {
|
|
244
|
+
state.waits.delete(slug);
|
|
245
|
+
}
|
|
246
|
+
const known = new Set([...(await seams.records()), ...state.listed]);
|
|
247
|
+
const now = seams.now();
|
|
248
|
+
if (now >= state.sweepDueAt && seams.busy.size === 0) {
|
|
249
|
+
await sweep(state, seams, known, log);
|
|
250
|
+
return;
|
|
251
|
+
}
|
|
252
|
+
const target = await dueTarget(state, seams, links, known, now);
|
|
253
|
+
if (target !== undefined) {
|
|
254
|
+
const run = await runFix(state, seams, target, [target], log);
|
|
255
|
+
noteRun(state, run, target, log, seams.now());
|
|
256
|
+
}
|
|
257
|
+
};
|
|
258
|
+
export const keeperOn = async () => (await readMachineConfig()).sandboxKeeper !== false;
|
|
259
|
+
export const machineKeeperSeams = ({ links, loopback, watching }) => ({
|
|
260
|
+
enabled: keeperOn,
|
|
261
|
+
fix: async (slug, onLine) => await runIc(keeperFixArgs(slug), onLine, {}, { deadlineMs: FIX_DEADLINE_MS }),
|
|
262
|
+
listing: async () => (await fleet()).map((box) => box.slug),
|
|
263
|
+
records: async () => await readChannelSlugs(),
|
|
264
|
+
swapping: async () => swapsUnderway(await readSwapRecords(), Date.now()),
|
|
265
|
+
links,
|
|
266
|
+
loopback,
|
|
267
|
+
watching,
|
|
268
|
+
busy: icInFlight,
|
|
269
|
+
hold: (slug) => holdIcFlow(slug, { moves: true }),
|
|
270
|
+
now: Date.now,
|
|
271
|
+
});
|
|
272
|
+
export const startKeeper = (log, wiring) => {
|
|
273
|
+
const state = newKeeperState(Date.now());
|
|
274
|
+
const seams = machineKeeperSeams(wiring);
|
|
275
|
+
return startRounds("keeper", log, FIRST_SWEEP_MS, () => LOOK_EVERY_MS, async () => await runKeeperRound(state, seams, log));
|
|
276
|
+
};
|
|
277
|
+
//# sourceMappingURL=keeper.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"keeper.js","sourceRoot":"","sources":["../../../src/device/sandbox-rounds/keeper.ts"],"names":[],"mappings":"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"}
|
|
@@ -8,6 +8,7 @@ export interface SwapRecord {
|
|
|
8
8
|
export declare const slugOfRecord: (name: string) => string | undefined;
|
|
9
9
|
export declare const parseSwapRecord: (slug: string, text: string) => SwapRecord;
|
|
10
10
|
export declare const readSwapRecords: (home?: string) => Promise<SwapRecord[]>;
|
|
11
|
+
export declare const readChannelSlugs: (home?: string) => Promise<string[]>;
|
|
11
12
|
export declare const CUTOVER_HOLDS_MS: number;
|
|
12
13
|
export declare const cutoverUnderway: (record: SwapRecord, now: number) => boolean;
|
|
13
14
|
export declare const swapsUnderway: (records: readonly SwapRecord[], now: number) => string[];
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"swap-records.d.ts","sourceRoot":"","sources":["../../../src/device/sandbox-rounds/swap-records.ts"],"names":[],"mappings":"AAUA,eAAO,MAAM,MAAM,SAAS,MAAM,CAAC,UAAU,KAAiB,MAG7D,CAAC;AAIF,MAAM,WAAW,UAAU;IACvB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACpC,QAAQ,CAAC,EAAE,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACjC,QAAQ,CAAC,cAAc,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;CAChD;AAMD,eAAO,MAAM,YAAY,SAAU,MAAM,KAAG,MAAM,GAAG,SAGlC,CAAC;AASpB,eAAO,MAAM,eAAe,SAAU,MAAM,QAAQ,MAAM,KAAG,UAe5D,CAAC;AAIF,eAAO,MAAM,eAAe,UAAgB,MAAM,KAAc,OAAO,CAAC,UAAU,EAAE,CAYnF,CAAC;AAIF,eAAO,MAAM,gBAAgB,QAAc,CAAC;AAI5C,eAAO,MAAM,eAAe,WAAY,UAAU,OAAO,MAAM,KAAG,OACuC,CAAC;AAG1G,eAAO,MAAM,aAAa,YAAa,SAAS,UAAU,EAAE,OAAO,MAAM,KAAG,MAAM,EACO,CAAC"}
|
|
1
|
+
{"version":3,"file":"swap-records.d.ts","sourceRoot":"","sources":["../../../src/device/sandbox-rounds/swap-records.ts"],"names":[],"mappings":"AAUA,eAAO,MAAM,MAAM,SAAS,MAAM,CAAC,UAAU,KAAiB,MAG7D,CAAC;AAIF,MAAM,WAAW,UAAU;IACvB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACpC,QAAQ,CAAC,EAAE,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACjC,QAAQ,CAAC,cAAc,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;CAChD;AAMD,eAAO,MAAM,YAAY,SAAU,MAAM,KAAG,MAAM,GAAG,SAGlC,CAAC;AASpB,eAAO,MAAM,eAAe,SAAU,MAAM,QAAQ,MAAM,KAAG,UAe5D,CAAC;AAIF,eAAO,MAAM,eAAe,UAAgB,MAAM,KAAc,OAAO,CAAC,UAAU,EAAE,CAYnF,CAAC;AAKF,eAAO,MAAM,gBAAgB,UAAgB,MAAM,KAAc,OAAO,CAAC,MAAM,EAAE,CAOhF,CAAC;AAIF,eAAO,MAAM,gBAAgB,QAAc,CAAC;AAI5C,eAAO,MAAM,eAAe,WAAY,UAAU,OAAO,MAAM,KAAG,OACuC,CAAC;AAG1G,eAAO,MAAM,aAAa,YAAa,SAAS,UAAU,EAAE,OAAO,MAAM,KAAG,MAAM,EACO,CAAC"}
|
|
@@ -39,6 +39,13 @@ export const readSwapRecords = async (home = icHome()) => {
|
|
|
39
39
|
}));
|
|
40
40
|
return records.filter((record) => record?.phase !== undefined);
|
|
41
41
|
};
|
|
42
|
+
export const readChannelSlugs = async (home = icHome()) => {
|
|
43
|
+
const names = await readdir(home).catch(() => []);
|
|
44
|
+
return names
|
|
45
|
+
.map(slugOfRecord)
|
|
46
|
+
.filter((slug) => slug !== undefined)
|
|
47
|
+
.toSorted();
|
|
48
|
+
};
|
|
42
49
|
export const CUTOVER_HOLDS_MS = 30 * 60_000;
|
|
43
50
|
export const cutoverUnderway = (record, now) => record.phase === "cutover" && record.at !== undefined && Math.abs(now - record.at) < CUTOVER_HOLDS_MS;
|
|
44
51
|
export const swapsUnderway = (records, now) => records.filter((record) => cutoverUnderway(record, now)).map((record) => record.slug);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"swap-records.js","sourceRoot":"","sources":["../../../src/device/sandbox-rounds/swap-records.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AACrD,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,OAAO,EAAE,MAAM,uBAAuB,CAAC;AAQhD,MAAM,CAAC,MAAM,MAAM,GAAG,CAAC,GAAG,GAAsB,OAAO,CAAC,GAAG,EAAU,EAAE;IACnE,MAAM,GAAG,GAAG,GAAG,CAAC,eAAe,CAAC,CAAC;IACjC,OAAO,GAAG,KAAK,SAAS,IAAI,GAAG,KAAK,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,EAAE,EAAE,WAAW,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC;AAChF,CAAC,CAAC;AAWF,MAAM,aAAa,GAAG,UAAU,CAAC;AACjC,MAAM,aAAa,GAAG,UAAU,CAAC;AAGjC,MAAM,CAAC,MAAM,YAAY,GAAG,CAAC,IAAY,EAAsB,EAAE,CAC7D,IAAI,CAAC,UAAU,CAAC,aAAa,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,aAAa,CAAC,IAAI,IAAI,CAAC,MAAM,GAAG,aAAa,CAAC,MAAM,GAAG,aAAa,CAAC,MAAM;IACvH,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,aAAa,CAAC,MAAM,EAAE,CAAC,aAAa,CAAC,MAAM,CAAC;IACzD,CAAC,CAAC,SAAS,CAAC;AAEpB,MAAM,MAAM,GAAG,CAAC,KAAyB,EAAsB,EAAE;IAC7D,MAAM,MAAM,GAAG,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IAChE,OAAO,MAAM,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC;AAC3E,CAAC,CAAC;AAIF,MAAM,CAAC,MAAM,eAAe,GAAG,CAAC,IAAY,EAAE,IAAY,EAAc,EAAE;IACtE,MAAM,MAAM,GAAG,IAAI,GAAG,EAAkB,CAAC;IACzC,KAAK,MAAM,IAAI,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,EAAE,CAAC;QACrC,MAAM,EAAE,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;QAC7B,IAAI,EAAE,GAAG,CAAC,EAAE,CAAC;YACT,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;QAC7D,CAAC;IACL,CAAC;IACD,MAAM,KAAK,GAAG,MAAM,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC;IACvC,OAAO;QACH,IAAI;QACJ,KAAK,EAAE,KAAK,KAAK,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,KAAK;QACvC,EAAE,EAAE,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;QACjC,cAAc,EAAE,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,iBAAiB,CAAC,CAAC;KACxD,CAAC;AACN,CAAC,CAAC;AAIF,MAAM,CAAC,MAAM,eAAe,GAAG,KAAK,EAAE,IAAI,GAAW,MAAM,EAAE,EAAyB,EAAE;IAEpF,MAAM,KAAK,GAAG,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,GAAa,EAAE,CAAC,EAAE,CAAC,CAAC;IAC5D,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,GAAG,CAC7B,KAAK,CAAC,GAAG,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE;QACrB,MAAM,IAAI,GAAG,YAAY,CAAC,IAAI,CAAC,CAAC;QAEhC,MAAM,IAAI,GAAG,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,MAAM,QAAQ,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,EAAE,MAAM,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC;QAC9G,OAAO,IAAI,KAAK,SAAS,IAAI,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,eAAe,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;IAC9F,CAAC,CAAC,CACL,CAAC;IACF,OAAO,OAAO,CAAC,MAAM,CAAC,CAAC,MAAM,EAAwB,EAAE,CAAC,MAAM,EAAE,KAAK,KAAK,SAAS,CAAC,CAAC;AACzF,CAAC,CAAC;AAIF,MAAM,CAAC,MAAM,gBAAgB,GAAG,EAAE,GAAG,MAAM,CAAC;AAI5C,MAAM,CAAC,MAAM,eAAe,GAAG,CAAC,MAAkB,EAAE,GAAW,EAAW,EAAE,CACxE,MAAM,CAAC,KAAK,KAAK,SAAS,IAAI,MAAM,CAAC,EAAE,KAAK,SAAS,IAAI,IAAI,CAAC,GAAG,CAAC,GAAG,GAAG,MAAM,CAAC,EAAE,CAAC,GAAG,gBAAgB,CAAC;AAG1G,MAAM,CAAC,MAAM,aAAa,GAAG,CAAC,OAA8B,EAAE,GAAW,EAAY,EAAE,CACnF,OAAO,CAAC,MAAM,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,eAAe,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC"}
|
|
1
|
+
{"version":3,"file":"swap-records.js","sourceRoot":"","sources":["../../../src/device/sandbox-rounds/swap-records.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,7 +1,9 @@
|
|
|
1
1
|
import { type DeviceSandbox, type DeviceScopes, type SandboxResourcesAsk, type SandboxShapeFields, type SandboxShapeWhen } from "@intentic/sandbox-contract";
|
|
2
2
|
import { z } from "zod";
|
|
3
3
|
export declare const fleetFrom: (stdout: string) => DeviceSandbox[];
|
|
4
|
-
export declare const fleet: (
|
|
4
|
+
export declare const fleet: ({ current }?: {
|
|
5
|
+
readonly current?: boolean;
|
|
6
|
+
}) => Promise<DeviceSandbox[]>;
|
|
5
7
|
export declare const icInFlight: ReadonlySet<string>;
|
|
6
8
|
export declare const icSwapsInFlight: ReadonlySet<string>;
|
|
7
9
|
export declare const holdIcFlow: (slug: string, { moves }: {
|
|
@@ -45,10 +47,14 @@ export interface LineSplitter {
|
|
|
45
47
|
readonly end: () => void;
|
|
46
48
|
}
|
|
47
49
|
export declare const lineSplitter: (onLine: (line: string) => void) => LineSplitter;
|
|
48
|
-
export
|
|
49
|
-
code: number;
|
|
50
|
-
output: string;
|
|
51
|
-
|
|
50
|
+
export interface IcRun {
|
|
51
|
+
readonly code: number;
|
|
52
|
+
readonly output: string;
|
|
53
|
+
readonly timedOut?: boolean;
|
|
54
|
+
}
|
|
55
|
+
export declare const runIc: (args: readonly string[], onLine: (line: string) => void, env?: Readonly<Record<string, string>>, { deadlineMs }?: {
|
|
56
|
+
readonly deadlineMs?: number;
|
|
57
|
+
}) => Promise<IcRun>;
|
|
52
58
|
export declare const runIcAttached: (args: readonly string[]) => Promise<number>;
|
|
53
59
|
export declare const icFlow: (slug: string, args: readonly string[], onLine: (line: string) => void, { env, moves }: {
|
|
54
60
|
readonly env?: Readonly<Record<string, string>>;
|
|
@@ -77,6 +83,8 @@ export declare const reshapeSandbox: (slug: string, ask: SandboxResourcesAsk | u
|
|
|
77
83
|
export declare const reconnectSandbox: (slug: string, setupCode: string | undefined, platformUrl: string | undefined, scopes: DeviceScopes, onLine: (line: string) => void) => Promise<string>;
|
|
78
84
|
export declare const createSandbox: (slug: string, setupCode: string | undefined, platformUrl: string | undefined, scopes: DeviceScopes, onLine: (line: string) => void) => Promise<string>;
|
|
79
85
|
export declare const removeSandbox: (slug: string, scopes: DeviceScopes, onLine: (line: string) => void) => Promise<string>;
|
|
86
|
+
export declare const icDoctorArgs: (slug: string) => string[];
|
|
87
|
+
export declare const diagnoseSandbox: (slug: string, scopes: DeviceScopes) => Promise<string>;
|
|
80
88
|
export declare const DEFAULT_LOG_LINES = 200;
|
|
81
89
|
export declare const MAX_LOG_LINES = 2000;
|
|
82
90
|
export declare const sandboxLogs: (slug: string, lines: number | undefined, scopes: DeviceScopes) => Promise<string>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sandboxes.d.ts","sourceRoot":"","sources":["../../../src/device/tools/sandboxes.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"sandboxes.d.ts","sourceRoot":"","sources":["../../../src/device/tools/sandboxes.ts"],"names":[],"mappings":"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"}
|
|
@@ -3,6 +3,7 @@ import { mkdtemp, rm, writeFile } from "node:fs/promises";
|
|
|
3
3
|
import { tmpdir } from "node:os";
|
|
4
4
|
import { join } from "node:path";
|
|
5
5
|
import { promisify } from "node:util";
|
|
6
|
+
import { plural } from "@intentic/base/format";
|
|
6
7
|
import { homeDir } from "@intentic/local-agent";
|
|
7
8
|
import { DeviceSandboxSchema, icForgetShapeArgs, icPowerArgs, icShapeArgs, } from "@intentic/sandbox-contract";
|
|
8
9
|
import { z } from "zod";
|
|
@@ -39,8 +40,10 @@ export const fleetFrom = (stdout) => {
|
|
|
39
40
|
}
|
|
40
41
|
return read;
|
|
41
42
|
};
|
|
42
|
-
export const fleet = async () => {
|
|
43
|
-
|
|
43
|
+
export const fleet = async ({ current = true } = {}) => {
|
|
44
|
+
if (current) {
|
|
45
|
+
await ensureCurrentIc();
|
|
46
|
+
}
|
|
44
47
|
const candidates = icCandidates(process.platform, homeDir());
|
|
45
48
|
for (const [index, binary] of candidates.entries()) {
|
|
46
49
|
const answer = await exec(binary, ["sandbox", "list", "--json"], { timeout: LIST_TIMEOUT_MS, maxBuffer: MAX_BUFFER, windowsHide: true }).catch((error) => {
|
|
@@ -203,7 +206,28 @@ export const lineSplitter = (onLine) => {
|
|
|
203
206
|
},
|
|
204
207
|
};
|
|
205
208
|
};
|
|
206
|
-
const
|
|
209
|
+
const spanOf = (ms) => (ms >= 60_000 ? plural(Math.round(ms / 60_000), "minute") : plural(Math.round(ms / 1_000), "second"));
|
|
210
|
+
const STOP_GRACE_MS = 10_000;
|
|
211
|
+
const stopRun = (child) => {
|
|
212
|
+
const pid = child.pid;
|
|
213
|
+
if (pid === undefined) {
|
|
214
|
+
return;
|
|
215
|
+
}
|
|
216
|
+
if (process.platform === "win32") {
|
|
217
|
+
spawn("taskkill", ["/pid", String(pid), "/T", "/F"], { windowsHide: true, stdio: "ignore" }).on("error", () => child.kill());
|
|
218
|
+
return;
|
|
219
|
+
}
|
|
220
|
+
const signal = (name) => {
|
|
221
|
+
try {
|
|
222
|
+
process.kill(-pid, name);
|
|
223
|
+
}
|
|
224
|
+
catch {
|
|
225
|
+
}
|
|
226
|
+
};
|
|
227
|
+
signal("SIGTERM");
|
|
228
|
+
setTimeout(() => signal("SIGKILL"), STOP_GRACE_MS).unref();
|
|
229
|
+
};
|
|
230
|
+
const runStreamed = (binary, args, onLine, env, deadlineMs) => {
|
|
207
231
|
const lines = [];
|
|
208
232
|
const take = (line) => {
|
|
209
233
|
lines.push(line);
|
|
@@ -218,6 +242,20 @@ const runStreamed = (binary, args, onLine, env) => {
|
|
|
218
242
|
return new Promise((resolve) => {
|
|
219
243
|
const child = spawn(binary, [...args], { windowsHide: true, env: { ...process.env, ...env }, detached: process.platform !== "win32" });
|
|
220
244
|
let missing = false;
|
|
245
|
+
let timedOut = false;
|
|
246
|
+
const deadline = deadlineMs === undefined
|
|
247
|
+
? undefined
|
|
248
|
+
: setTimeout(() => {
|
|
249
|
+
timedOut = true;
|
|
250
|
+
stopRun(child);
|
|
251
|
+
}, deadlineMs);
|
|
252
|
+
const answer = (code) => {
|
|
253
|
+
clearTimeout(deadline);
|
|
254
|
+
if (timedOut) {
|
|
255
|
+
lines.push(`ic did not finish within ${spanOf(deadlineMs ?? 0)} and was stopped.`);
|
|
256
|
+
}
|
|
257
|
+
return timedOut ? { code, output: lines.join("\n"), timedOut } : { code, output: lines.join("\n") };
|
|
258
|
+
};
|
|
221
259
|
child.stdout.setEncoding("utf8").on("data", out.push);
|
|
222
260
|
child.stderr.setEncoding("utf8").on("data", err.push);
|
|
223
261
|
child.on("error", (error) => {
|
|
@@ -226,19 +264,20 @@ const runStreamed = (binary, args, onLine, env) => {
|
|
|
226
264
|
if (!missing) {
|
|
227
265
|
take(String(error.message));
|
|
228
266
|
}
|
|
229
|
-
|
|
267
|
+
clearTimeout(deadline);
|
|
268
|
+
resolve(missing ? "missing" : answer(1));
|
|
230
269
|
});
|
|
231
270
|
child.on("close", (code) => {
|
|
232
271
|
flush();
|
|
233
|
-
resolve(missing ? "missing" :
|
|
272
|
+
resolve(missing ? "missing" : answer(code ?? 1));
|
|
234
273
|
});
|
|
235
274
|
});
|
|
236
275
|
};
|
|
237
|
-
export const runIc = async (args, onLine, env = {}) => {
|
|
276
|
+
export const runIc = async (args, onLine, env = {}, { deadlineMs } = {}) => {
|
|
238
277
|
await ensureCurrentIc();
|
|
239
278
|
const candidates = icCandidates(process.platform, homeDir());
|
|
240
279
|
for (const [index, binary] of candidates.entries()) {
|
|
241
|
-
const attempt = await runStreamed(binary, args, onLine, env);
|
|
280
|
+
const attempt = await runStreamed(binary, args, onLine, env, deadlineMs);
|
|
242
281
|
if (attempt !== "missing") {
|
|
243
282
|
return attempt;
|
|
244
283
|
}
|
|
@@ -378,6 +417,24 @@ export const removeSandbox = async (slug, scopes, onLine) => {
|
|
|
378
417
|
}
|
|
379
418
|
return `Removed sandbox "${slug}". Its files and its history are kept for a week — 'ic sandbox restore ${slug}' on this device brings it back.`;
|
|
380
419
|
};
|
|
420
|
+
const ADDRESSABLE_SLUG = /^[A-Za-z0-9][A-Za-z0-9._-]{0,62}$/;
|
|
421
|
+
const DOCTOR_DEADLINE_MS = 2 * 60_000;
|
|
422
|
+
export const icDoctorArgs = (slug) => {
|
|
423
|
+
if (!ADDRESSABLE_SLUG.test(slug)) {
|
|
424
|
+
throw new Error(`"${slug}" is not a sandbox slug; list_sandboxes names them.`);
|
|
425
|
+
}
|
|
426
|
+
return ["sandbox", "doctor", slug, "--json"];
|
|
427
|
+
};
|
|
428
|
+
export const diagnoseSandbox = async (slug, scopes) => {
|
|
429
|
+
if (scopes.shell !== "on") {
|
|
430
|
+
assertScope(scopes, "sandboxes");
|
|
431
|
+
}
|
|
432
|
+
const run = await runIc(icDoctorArgs(slug), () => { }, {}, { deadlineMs: DOCTOR_DEADLINE_MS });
|
|
433
|
+
if (run.code !== 0 && !run.output.includes("{")) {
|
|
434
|
+
throw new Error(`"${slug}" could not be diagnosed on this device.\n\n${run.output}`);
|
|
435
|
+
}
|
|
436
|
+
return run.output;
|
|
437
|
+
};
|
|
381
438
|
export const DEFAULT_LOG_LINES = 200;
|
|
382
439
|
export const MAX_LOG_LINES = 2_000;
|
|
383
440
|
const readLogs = async (slug, lines, scopes) => {
|