@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.
Files changed (47) hide show
  1. package/README.md +52 -4
  2. package/dist/commands.d.ts.map +1 -1
  3. package/dist/commands.js +2 -2
  4. package/dist/commands.js.map +1 -1
  5. package/dist/device/commands.d.ts +3 -1
  6. package/dist/device/commands.d.ts.map +1 -1
  7. package/dist/device/commands.js +2 -2
  8. package/dist/device/commands.js.map +1 -1
  9. package/dist/device/connection.d.ts +1 -0
  10. package/dist/device/connection.d.ts.map +1 -1
  11. package/dist/device/connection.js +5 -0
  12. package/dist/device/connection.js.map +1 -1
  13. package/dist/device/mcp.d.ts.map +1 -1
  14. package/dist/device/mcp.js +8 -1
  15. package/dist/device/mcp.js.map +1 -1
  16. package/dist/device/sandbox-cli.d.ts +3 -0
  17. package/dist/device/sandbox-cli.d.ts.map +1 -1
  18. package/dist/device/sandbox-cli.js +42 -0
  19. package/dist/device/sandbox-cli.js.map +1 -1
  20. package/dist/device/sandbox-rounds/ic-rounds.d.ts +3 -4
  21. package/dist/device/sandbox-rounds/ic-rounds.d.ts.map +1 -1
  22. package/dist/device/sandbox-rounds/ic-rounds.js +6 -0
  23. package/dist/device/sandbox-rounds/ic-rounds.js.map +1 -1
  24. package/dist/device/sandbox-rounds/keeper.d.ts +95 -0
  25. package/dist/device/sandbox-rounds/keeper.d.ts.map +1 -0
  26. package/dist/device/sandbox-rounds/keeper.js +277 -0
  27. package/dist/device/sandbox-rounds/keeper.js.map +1 -0
  28. package/dist/device/sandbox-rounds/swap-records.d.ts +1 -0
  29. package/dist/device/sandbox-rounds/swap-records.d.ts.map +1 -1
  30. package/dist/device/sandbox-rounds/swap-records.js +7 -0
  31. package/dist/device/sandbox-rounds/swap-records.js.map +1 -1
  32. package/dist/device/tools/sandboxes.d.ts +13 -5
  33. package/dist/device/tools/sandboxes.d.ts.map +1 -1
  34. package/dist/device/tools/sandboxes.js +64 -7
  35. package/dist/device/tools/sandboxes.js.map +1 -1
  36. package/dist/environments/machine.d.ts +1 -0
  37. package/dist/environments/machine.d.ts.map +1 -1
  38. package/dist/environments/machine.js.map +1 -1
  39. package/dist/resident.d.ts +12 -1
  40. package/dist/resident.d.ts.map +1 -1
  41. package/dist/resident.js +45 -14
  42. package/dist/resident.js.map +1 -1
  43. package/dist/sync/commands.d.ts +3 -1
  44. package/dist/sync/commands.d.ts.map +1 -1
  45. package/dist/sync/commands.js +3 -3
  46. package/dist/sync/commands.js.map +1 -1
  47. 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: () => Promise<DeviceSandbox[]>;
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 declare const runIc: (args: readonly string[], onLine: (line: string) => void, env?: Readonly<Record<string, string>>) => Promise<{
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":"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"}
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
- await ensureCurrentIc();
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 runStreamed = (binary, args, onLine, env) => {
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
- resolve(missing ? "missing" : { code: 1, output: lines.join("\n") });
267
+ clearTimeout(deadline);
268
+ resolve(missing ? "missing" : answer(1));
230
269
  });
231
270
  child.on("close", (code) => {
232
271
  flush();
233
- resolve(missing ? "missing" : { code: code ?? 1, output: lines.join("\n") });
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) => {