agent-conveyor 0.1.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 (85) hide show
  1. package/README.md +1123 -0
  2. package/dist/cli/main.d.ts +2 -0
  3. package/dist/cli/main.js +19 -0
  4. package/dist/cli/main.js.map +1 -0
  5. package/dist/cli/program-name.d.ts +2 -0
  6. package/dist/cli/program-name.js +12 -0
  7. package/dist/cli/program-name.js.map +1 -0
  8. package/dist/cli/typescript-runtime.d.ts +52 -0
  9. package/dist/cli/typescript-runtime.js +18009 -0
  10. package/dist/cli/typescript-runtime.js.map +1 -0
  11. package/dist/index.d.ts +37 -0
  12. package/dist/index.js +20 -0
  13. package/dist/index.js.map +1 -0
  14. package/dist/runtime/audit.d.ts +96 -0
  15. package/dist/runtime/audit.js +298 -0
  16. package/dist/runtime/audit.js.map +1 -0
  17. package/dist/runtime/classify.d.ts +8 -0
  18. package/dist/runtime/classify.js +128 -0
  19. package/dist/runtime/classify.js.map +1 -0
  20. package/dist/runtime/codex-session.d.ts +103 -0
  21. package/dist/runtime/codex-session.js +408 -0
  22. package/dist/runtime/codex-session.js.map +1 -0
  23. package/dist/runtime/commands.d.ts +92 -0
  24. package/dist/runtime/commands.js +408 -0
  25. package/dist/runtime/commands.js.map +1 -0
  26. package/dist/runtime/dispatch.d.ts +74 -0
  27. package/dist/runtime/dispatch.js +669 -0
  28. package/dist/runtime/dispatch.js.map +1 -0
  29. package/dist/runtime/export.d.ts +22 -0
  30. package/dist/runtime/export.js +77 -0
  31. package/dist/runtime/export.js.map +1 -0
  32. package/dist/runtime/ingest.d.ts +28 -0
  33. package/dist/runtime/ingest.js +177 -0
  34. package/dist/runtime/ingest.js.map +1 -0
  35. package/dist/runtime/loop-evidence.d.ts +87 -0
  36. package/dist/runtime/loop-evidence.js +448 -0
  37. package/dist/runtime/loop-evidence.js.map +1 -0
  38. package/dist/runtime/manager-config.d.ts +20 -0
  39. package/dist/runtime/manager-config.js +34 -0
  40. package/dist/runtime/manager-config.js.map +1 -0
  41. package/dist/runtime/manager-permissions.d.ts +7 -0
  42. package/dist/runtime/manager-permissions.js +85 -0
  43. package/dist/runtime/manager-permissions.js.map +1 -0
  44. package/dist/runtime/notifications.d.ts +89 -0
  45. package/dist/runtime/notifications.js +208 -0
  46. package/dist/runtime/notifications.js.map +1 -0
  47. package/dist/runtime/replay.d.ts +29 -0
  48. package/dist/runtime/replay.js +331 -0
  49. package/dist/runtime/replay.js.map +1 -0
  50. package/dist/runtime/tasks.d.ts +54 -0
  51. package/dist/runtime/tasks.js +195 -0
  52. package/dist/runtime/tasks.js.map +1 -0
  53. package/dist/runtime/tmux.d.ts +61 -0
  54. package/dist/runtime/tmux.js +189 -0
  55. package/dist/runtime/tmux.js.map +1 -0
  56. package/dist/runtime/visual-diff.d.ts +23 -0
  57. package/dist/runtime/visual-diff.js +234 -0
  58. package/dist/runtime/visual-diff.js.map +1 -0
  59. package/dist/state/database.d.ts +21 -0
  60. package/dist/state/database.js +142 -0
  61. package/dist/state/database.js.map +1 -0
  62. package/dist/state/files.d.ts +38 -0
  63. package/dist/state/files.js +73 -0
  64. package/dist/state/files.js.map +1 -0
  65. package/dist/state/schema-v22.d.ts +1 -0
  66. package/dist/state/schema-v22.js +566 -0
  67. package/dist/state/schema-v22.js.map +1 -0
  68. package/dist/state/sqlite-contract.d.ts +4 -0
  69. package/dist/state/sqlite-contract.js +78 -0
  70. package/dist/state/sqlite-contract.js.map +1 -0
  71. package/dist/state/status.d.ts +12 -0
  72. package/dist/state/status.js +40 -0
  73. package/dist/state/status.js.map +1 -0
  74. package/docs/typescript-migration/cli-contract.md +147 -0
  75. package/docs/typescript-migration/dashboard-contract.md +76 -0
  76. package/docs/typescript-migration/package-install-contract.md +98 -0
  77. package/docs/typescript-migration/qa-gate-matrix.md +103 -0
  78. package/docs/typescript-migration/sqlite-state-contract.md +92 -0
  79. package/docs/typescript-migration/t005-runtime-parity.md +47 -0
  80. package/package.json +88 -0
  81. package/scripts/capture-static-html-screenshot.mjs +88 -0
  82. package/skills/codex-review/SKILL.md +116 -0
  83. package/skills/codex-review/scripts/codex-review +344 -0
  84. package/skills/manage-codex-workers/SKILL.md +696 -0
  85. package/skills/manage-codex-workers/agents/openai.yaml +5 -0
@@ -0,0 +1,234 @@
1
+ import { mkdirSync, readFileSync, writeFileSync } from "node:fs";
2
+ import { dirname } from "node:path";
3
+ import { deflateSync, inflateSync } from "node:zlib";
4
+ export class VisualDiffError extends Error {
5
+ constructor(message) {
6
+ super(message);
7
+ this.name = "VisualDiffError";
8
+ }
9
+ }
10
+ export function computeVisualDiffSync(options) {
11
+ if (!Number.isFinite(options.threshold) || options.threshold < 0 || options.threshold > 1) {
12
+ throw new VisualDiffError("--threshold must be between 0 and 1");
13
+ }
14
+ const reference = readPngRgba(options.referencePath);
15
+ const candidate = readPngRgba(options.candidatePath);
16
+ if (reference.width !== candidate.width || reference.height !== candidate.height) {
17
+ throw new VisualDiffError(`visual diff screenshots must have matching dimensions: reference=${reference.width}x${reference.height} candidate=${candidate.width}x${candidate.height}`);
18
+ }
19
+ const diffPixels = [];
20
+ let changedPixels = 0;
21
+ for (let index = 0; index < reference.pixels.length; index += 1) {
22
+ const referencePixel = reference.pixels[index];
23
+ const candidatePixel = candidate.pixels[index];
24
+ if (!referencePixel || !candidatePixel) {
25
+ throw new VisualDiffError("visual diff pixel buffers are inconsistent");
26
+ }
27
+ if (pixelsEqual(referencePixel, candidatePixel)) {
28
+ diffPixels.push([0, 0, 0, 0]);
29
+ }
30
+ else {
31
+ changedPixels += 1;
32
+ diffPixels.push([255, 0, 0, 255]);
33
+ }
34
+ }
35
+ const totalPixels = reference.width * reference.height;
36
+ const diffScore = totalPixels === 0 ? 0 : changedPixels / totalPixels;
37
+ if (options.diffOutput) {
38
+ writePngRgba(options.diffOutput, reference.width, reference.height, diffPixels);
39
+ }
40
+ const report = {
41
+ below_threshold: diffScore <= options.threshold,
42
+ candidate: options.candidatePath,
43
+ changed_pixels: changedPixels,
44
+ diff_image: options.diffOutput ?? null,
45
+ diff_score: diffScore,
46
+ reference: options.referencePath,
47
+ threshold: options.threshold,
48
+ total_pixels: totalPixels,
49
+ viewport: `${reference.width}x${reference.height}`,
50
+ };
51
+ if (options.reportOutput) {
52
+ mkdirSync(dirname(options.reportOutput), { recursive: true });
53
+ writeFileSync(options.reportOutput, `${JSON.stringify(sortJson(report), null, 2)}\n`);
54
+ }
55
+ return report;
56
+ }
57
+ function readPngRgba(path) {
58
+ let data;
59
+ try {
60
+ data = readFileSync(path);
61
+ }
62
+ catch (error) {
63
+ const message = error instanceof Error ? error.message : String(error);
64
+ throw new VisualDiffError(`unable to read visual diff PNG ${path}: ${message}`);
65
+ }
66
+ if (!data.subarray(0, 8).equals(Buffer.from([0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a]))) {
67
+ throw new VisualDiffError(`unsupported image format for visual diff: ${path} is not a PNG`);
68
+ }
69
+ let offset = 8;
70
+ let width = null;
71
+ let height = null;
72
+ let bitDepth = null;
73
+ let colorType = null;
74
+ const compressed = [];
75
+ while (offset < data.length) {
76
+ if (offset + 8 > data.length) {
77
+ throw new VisualDiffError(`invalid PNG: truncated chunk header in ${path}`);
78
+ }
79
+ const length = data.readUInt32BE(offset);
80
+ const kind = data.subarray(offset + 4, offset + 8).toString("ascii");
81
+ const payloadStart = offset + 8;
82
+ const payloadEnd = payloadStart + length;
83
+ if (payloadEnd + 4 > data.length) {
84
+ throw new VisualDiffError(`invalid PNG: truncated ${kind} chunk in ${path}`);
85
+ }
86
+ const payload = data.subarray(payloadStart, payloadEnd);
87
+ offset = payloadEnd + 4;
88
+ if (kind === "IHDR") {
89
+ width = payload.readUInt32BE(0);
90
+ height = payload.readUInt32BE(4);
91
+ bitDepth = payload.readUInt8(8);
92
+ colorType = payload.readUInt8(9);
93
+ const compression = payload.readUInt8(10);
94
+ const filterMethod = payload.readUInt8(11);
95
+ const interlace = payload.readUInt8(12);
96
+ if (bitDepth !== 8 || !new Set([2, 6]).has(colorType) || compression !== 0 || filterMethod !== 0 || interlace !== 0) {
97
+ throw new VisualDiffError("visual diff supports non-interlaced 8-bit RGB/RGBA PNG screenshots");
98
+ }
99
+ }
100
+ else if (kind === "IDAT") {
101
+ compressed.push(payload);
102
+ }
103
+ else if (kind === "IEND") {
104
+ break;
105
+ }
106
+ }
107
+ if (width === null || height === null || bitDepth === null || colorType === null) {
108
+ throw new VisualDiffError(`invalid PNG: missing IHDR in ${path}`);
109
+ }
110
+ if (width < 1 || height < 1) {
111
+ throw new VisualDiffError(`invalid PNG dimensions in ${path}: width and height must be positive`);
112
+ }
113
+ const channels = colorType === 6 ? 4 : 3;
114
+ const stride = width * channels;
115
+ let raw;
116
+ try {
117
+ raw = inflateSync(Buffer.concat(compressed));
118
+ }
119
+ catch (error) {
120
+ const message = error instanceof Error ? error.message : String(error);
121
+ throw new VisualDiffError(`invalid PNG compression in ${path}: ${message}`);
122
+ }
123
+ const expected = (stride + 1) * height;
124
+ if (raw.length !== expected) {
125
+ throw new VisualDiffError(`invalid PNG scanline length in ${path}`);
126
+ }
127
+ const rows = [];
128
+ let position = 0;
129
+ let previous = Buffer.alloc(stride);
130
+ for (let y = 0; y < height; y += 1) {
131
+ const filterType = raw.readUInt8(position);
132
+ position += 1;
133
+ const scanline = Buffer.from(raw.subarray(position, position + stride));
134
+ position += stride;
135
+ for (let index = 0; index < scanline.length; index += 1) {
136
+ const left = index >= channels ? scanline[index - channels] ?? 0 : 0;
137
+ const up = previous[index] ?? 0;
138
+ const upperLeft = index >= channels ? previous[index - channels] ?? 0 : 0;
139
+ let reconstructed;
140
+ if (filterType === 0) {
141
+ reconstructed = scanline[index] ?? 0;
142
+ }
143
+ else if (filterType === 1) {
144
+ reconstructed = (scanline[index] ?? 0) + left;
145
+ }
146
+ else if (filterType === 2) {
147
+ reconstructed = (scanline[index] ?? 0) + up;
148
+ }
149
+ else if (filterType === 3) {
150
+ reconstructed = (scanline[index] ?? 0) + Math.floor((left + up) / 2);
151
+ }
152
+ else if (filterType === 4) {
153
+ reconstructed = (scanline[index] ?? 0) + paeth(left, up, upperLeft);
154
+ }
155
+ else {
156
+ throw new VisualDiffError(`unsupported PNG filter type ${filterType} in ${path}`);
157
+ }
158
+ scanline[index] = reconstructed & 0xff;
159
+ }
160
+ previous = Buffer.from(scanline);
161
+ rows.push(previous);
162
+ }
163
+ const pixels = [];
164
+ for (const row of rows) {
165
+ for (let index = 0; index < row.length; index += channels) {
166
+ pixels.push([
167
+ row[index] ?? 0,
168
+ row[index + 1] ?? 0,
169
+ row[index + 2] ?? 0,
170
+ channels === 4 ? row[index + 3] ?? 0 : 255,
171
+ ]);
172
+ }
173
+ }
174
+ return { height, pixels, width };
175
+ }
176
+ export function writePngRgba(path, width, height, pixels) {
177
+ const rawRows = [];
178
+ for (let y = 0; y < height; y += 1) {
179
+ const rowPixels = pixels.slice(y * width, y * width + width);
180
+ rawRows.push(Buffer.concat([Buffer.from([0]), Buffer.concat(rowPixels.map((pixel) => Buffer.from(pixel)))]));
181
+ }
182
+ mkdirSync(dirname(path), { recursive: true });
183
+ writeFileSync(path, Buffer.concat([
184
+ Buffer.from([0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a]),
185
+ pngChunk("IHDR", Buffer.concat([uint32(width), uint32(height), Buffer.from([8, 6, 0, 0, 0])])),
186
+ pngChunk("IDAT", deflateSync(Buffer.concat(rawRows))),
187
+ pngChunk("IEND", Buffer.alloc(0)),
188
+ ]));
189
+ }
190
+ function pngChunk(kind, payload) {
191
+ const kindBuffer = Buffer.from(kind, "ascii");
192
+ const checksum = crc32(Buffer.concat([kindBuffer, payload]));
193
+ return Buffer.concat([uint32(payload.length), kindBuffer, payload, uint32(checksum)]);
194
+ }
195
+ function uint32(value) {
196
+ const buffer = Buffer.alloc(4);
197
+ buffer.writeUInt32BE(value >>> 0);
198
+ return buffer;
199
+ }
200
+ function paeth(a, b, c) {
201
+ const p = a + b - c;
202
+ const pa = Math.abs(p - a);
203
+ const pb = Math.abs(p - b);
204
+ const pc = Math.abs(p - c);
205
+ if (pa <= pb && pa <= pc) {
206
+ return a;
207
+ }
208
+ return pb <= pc ? b : c;
209
+ }
210
+ function pixelsEqual(left, right) {
211
+ return left[0] === right[0] && left[1] === right[1] && left[2] === right[2] && left[3] === right[3];
212
+ }
213
+ function crc32(buffer) {
214
+ let crc = 0xffffffff;
215
+ for (const byte of buffer) {
216
+ crc ^= byte;
217
+ for (let bit = 0; bit < 8; bit += 1) {
218
+ crc = (crc >>> 1) ^ (crc & 1 ? 0xedb88320 : 0);
219
+ }
220
+ }
221
+ return (crc ^ 0xffffffff) >>> 0;
222
+ }
223
+ function sortJson(value) {
224
+ if (Array.isArray(value)) {
225
+ return value.map(sortJson);
226
+ }
227
+ if (value !== null && typeof value === "object") {
228
+ return Object.fromEntries(Object.entries(value)
229
+ .sort(([left], [right]) => left.localeCompare(right))
230
+ .map(([key, child]) => [key, sortJson(child)]));
231
+ }
232
+ return value;
233
+ }
234
+ //# sourceMappingURL=visual-diff.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"visual-diff.js","sourceRoot":"","sources":["../../src/runtime/visual-diff.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,21 @@
1
+ import { DatabaseSync } from "node:sqlite";
2
+ export interface DatabaseCheck {
3
+ name: string;
4
+ ok: boolean;
5
+ value?: number | string | null;
6
+ missing?: string[];
7
+ violations?: unknown[];
8
+ }
9
+ export interface DatabaseHealth {
10
+ checks: DatabaseCheck[];
11
+ ok: boolean;
12
+ schema_version: number | null;
13
+ user_version: number;
14
+ }
15
+ export declare class WorkerctlDatabaseError extends Error {
16
+ constructor(message: string);
17
+ }
18
+ export declare function openDatabaseSync(path?: string): DatabaseSync;
19
+ export declare function configureConnectionSync(database: DatabaseSync): void;
20
+ export declare function initializeDatabaseSync(database: DatabaseSync): void;
21
+ export declare function databaseHealthSync(database: DatabaseSync): DatabaseHealth;
@@ -0,0 +1,142 @@
1
+ import { mkdirSync } from "node:fs";
2
+ import { spawnSync } from "node:child_process";
3
+ import { dirname } from "node:path";
4
+ import { DatabaseSync } from "node:sqlite";
5
+ import { defaultDbPath } from "./files.js";
6
+ import { REQUIRED_INDEXES, REQUIRED_TABLES, REQUIRED_TRIGGERS, SCHEMA_VERSION, } from "./sqlite-contract.js";
7
+ import { SCHEMA_V22_SQL } from "./schema-v22.js";
8
+ export class WorkerctlDatabaseError extends Error {
9
+ constructor(message) {
10
+ super(message);
11
+ this.name = "WorkerctlDatabaseError";
12
+ }
13
+ }
14
+ export function openDatabaseSync(path = defaultDbPath()) {
15
+ mkdirSync(dirname(path), { recursive: true });
16
+ const database = new DatabaseSync(path);
17
+ configureConnectionSync(database);
18
+ return database;
19
+ }
20
+ export function configureConnectionSync(database) {
21
+ database.exec("PRAGMA foreign_keys = ON");
22
+ database.exec("PRAGMA journal_mode = WAL");
23
+ database.exec("PRAGMA busy_timeout = 5000");
24
+ const foreignKeys = pragmaNumber(database, "foreign_keys");
25
+ if (foreignKeys !== 1) {
26
+ throw new WorkerctlDatabaseError("SQLite foreign key enforcement is not enabled");
27
+ }
28
+ }
29
+ export function initializeDatabaseSync(database) {
30
+ const userVersion = pragmaNumber(database, "user_version");
31
+ if (userVersion > SCHEMA_VERSION) {
32
+ throw new WorkerctlDatabaseError(`Database schema version ${userVersion} is newer than workerctl supports (${SCHEMA_VERSION})`);
33
+ }
34
+ if (userVersion === SCHEMA_VERSION) {
35
+ return;
36
+ }
37
+ if (userVersion !== 0 || hasUserTables(database)) {
38
+ delegateLegacyMigrationToPython(database, userVersion);
39
+ return;
40
+ }
41
+ database.exec(SCHEMA_V22_SQL);
42
+ const now = new Date().toISOString();
43
+ database.prepare("insert or ignore into schema_migrations(version, applied_at) values (?, ?)").run(SCHEMA_VERSION, now);
44
+ database.exec(`PRAGMA user_version = ${SCHEMA_VERSION}`);
45
+ }
46
+ function delegateLegacyMigrationToPython(database, userVersion) {
47
+ const path = databasePath(database);
48
+ if (!path) {
49
+ throw new WorkerctlDatabaseError(`Migrating existing schema version ${userVersion} requires a file-backed database`);
50
+ }
51
+ const script = `
52
+ from pathlib import Path
53
+ from workerctl import db
54
+ conn = db.connect(Path(${JSON.stringify(path)}))
55
+ try:
56
+ db.initialize_database(conn)
57
+ finally:
58
+ conn.close()
59
+ `;
60
+ const result = spawnSync("python3", ["-c", script], {
61
+ cwd: process.cwd(),
62
+ encoding: "utf8",
63
+ });
64
+ if (result.status !== 0) {
65
+ const detail = (result.stderr || result.stdout || "unknown migration error").trim();
66
+ throw new WorkerctlDatabaseError(`Python legacy migration failed: ${detail}`);
67
+ }
68
+ const migratedVersion = pragmaNumber(database, "user_version");
69
+ if (migratedVersion !== SCHEMA_VERSION) {
70
+ throw new WorkerctlDatabaseError(`Python legacy migration left schema version ${migratedVersion}; expected ${SCHEMA_VERSION}`);
71
+ }
72
+ }
73
+ export function databaseHealthSync(database) {
74
+ const foreignKeys = pragmaNumber(database, "foreign_keys");
75
+ const journalMode = pragmaValue(database, "journal_mode");
76
+ const busyTimeout = pragmaNumber(database, "busy_timeout");
77
+ const userVersion = pragmaNumber(database, "user_version");
78
+ const schemaVersion = database
79
+ .prepare("select max(version) as version from schema_migrations")
80
+ .get();
81
+ const tables = schemaNames(database, "table");
82
+ const indexes = schemaNames(database, "index");
83
+ const triggers = schemaNames(database, "trigger");
84
+ const violations = database.prepare(`
85
+ select "table", rowid, parent, fkid
86
+ from pragma_foreign_key_check
87
+ `).all();
88
+ const checks = [
89
+ { name: "foreign_keys", ok: foreignKeys === 1, value: foreignKeys },
90
+ { name: "journal_mode_wal", ok: String(journalMode).toLowerCase() === "wal", value: journalMode },
91
+ { name: "busy_timeout", ok: busyTimeout >= 5000, value: busyTimeout },
92
+ { name: "schema_version", ok: schemaVersion.version === SCHEMA_VERSION, value: schemaVersion.version },
93
+ { name: "user_version", ok: userVersion === SCHEMA_VERSION, value: userVersion },
94
+ { name: "required_tables", ok: isSubset(REQUIRED_TABLES, tables), missing: missing(REQUIRED_TABLES, tables) },
95
+ { name: "required_indexes", ok: isSubset(REQUIRED_INDEXES, indexes), missing: missing(REQUIRED_INDEXES, indexes) },
96
+ { name: "required_triggers", ok: isSubset(REQUIRED_TRIGGERS, triggers), missing: missing(REQUIRED_TRIGGERS, triggers) },
97
+ { name: "foreign_key_check", ok: violations.length === 0, violations },
98
+ ];
99
+ return {
100
+ checks,
101
+ ok: checks.every((check) => check.ok),
102
+ schema_version: schemaVersion.version,
103
+ user_version: userVersion,
104
+ };
105
+ }
106
+ function hasUserTables(database) {
107
+ const row = database.prepare(`
108
+ select count(*) as count
109
+ from sqlite_master
110
+ where type = 'table'
111
+ and name not like 'sqlite_%'
112
+ `).get();
113
+ return row.count > 0;
114
+ }
115
+ function schemaNames(database, type) {
116
+ const rows = database.prepare(`
117
+ select name
118
+ from sqlite_master
119
+ where type = ?
120
+ and name not like 'sqlite_%'
121
+ `).all(type);
122
+ return new Set(rows.map((row) => row.name));
123
+ }
124
+ function databasePath(database) {
125
+ const row = database.prepare("PRAGMA database_list").get();
126
+ return row.file || null;
127
+ }
128
+ function pragmaNumber(database, name) {
129
+ const value = pragmaValue(database, name);
130
+ return Number(value);
131
+ }
132
+ function pragmaValue(database, name) {
133
+ const row = database.prepare(`PRAGMA ${name}`).get();
134
+ return Object.values(row)[0];
135
+ }
136
+ function missing(required, actual) {
137
+ return [...required].filter((value) => !actual.has(value)).sort();
138
+ }
139
+ function isSubset(required, actual) {
140
+ return missing(required, actual).length === 0;
141
+ }
142
+ //# sourceMappingURL=database.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"database.js","sourceRoot":"","sources":["../../src/state/database.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,38 @@
1
+ export declare class WorkerctlStateError extends Error {
2
+ constructor(message: string);
3
+ }
4
+ export declare function stateRoot(options?: {
5
+ cwd?: string;
6
+ env?: NodeJS.ProcessEnv;
7
+ }): string;
8
+ export declare function validateWorkerName(name: string): void;
9
+ export declare function workerDir(name: string, options?: {
10
+ cwd?: string;
11
+ env?: NodeJS.ProcessEnv;
12
+ }): string;
13
+ export declare function configPath(name: string, options?: {
14
+ cwd?: string;
15
+ env?: NodeJS.ProcessEnv;
16
+ }): string;
17
+ export declare function statusPath(name: string, options?: {
18
+ cwd?: string;
19
+ env?: NodeJS.ProcessEnv;
20
+ }): string;
21
+ export declare function eventsPath(name: string, options?: {
22
+ cwd?: string;
23
+ env?: NodeJS.ProcessEnv;
24
+ }): string;
25
+ export declare function transcriptPath(name: string, options?: {
26
+ cwd?: string;
27
+ env?: NodeJS.ProcessEnv;
28
+ }): string;
29
+ export declare function captureMetaPath(name: string, options?: {
30
+ cwd?: string;
31
+ env?: NodeJS.ProcessEnv;
32
+ }): string;
33
+ export declare function defaultDbPath(options?: {
34
+ cwd?: string;
35
+ env?: NodeJS.ProcessEnv;
36
+ }): string;
37
+ export declare function loadJsonSync<T>(path: string, defaultValue: T): T;
38
+ export declare function writeJsonSync(path: string, payload: unknown): void;
@@ -0,0 +1,73 @@
1
+ import { existsSync, mkdirSync, readFileSync, writeFileSync } from "node:fs";
2
+ import { join } from "node:path";
3
+ const STATE_ROOT_DIR = ".codex-workers";
4
+ export class WorkerctlStateError extends Error {
5
+ constructor(message) {
6
+ super(message);
7
+ this.name = "WorkerctlStateError";
8
+ }
9
+ }
10
+ export function stateRoot(options = {}) {
11
+ const env = options.env ?? process.env;
12
+ if (env.WORKERCTL_STATE_ROOT) {
13
+ return env.WORKERCTL_STATE_ROOT;
14
+ }
15
+ return join(options.cwd ?? process.cwd(), STATE_ROOT_DIR);
16
+ }
17
+ export function validateWorkerName(name) {
18
+ if (!name || !/^[A-Za-z0-9_-]+$/.test(name)) {
19
+ throw new WorkerctlStateError("Worker names may contain only letters, numbers, hyphens, and underscores.");
20
+ }
21
+ }
22
+ export function workerDir(name, options = {}) {
23
+ validateWorkerName(name);
24
+ return join(stateRoot(options), name);
25
+ }
26
+ export function configPath(name, options = {}) {
27
+ return join(workerDir(name, options), "config.json");
28
+ }
29
+ export function statusPath(name, options = {}) {
30
+ return join(workerDir(name, options), "status.json");
31
+ }
32
+ export function eventsPath(name, options = {}) {
33
+ return join(workerDir(name, options), "events.jsonl");
34
+ }
35
+ export function transcriptPath(name, options = {}) {
36
+ return join(workerDir(name, options), "transcript.txt");
37
+ }
38
+ export function captureMetaPath(name, options = {}) {
39
+ return join(workerDir(name, options), "capture-meta.json");
40
+ }
41
+ export function defaultDbPath(options = {}) {
42
+ return join(stateRoot(options), "workerctl.db");
43
+ }
44
+ export function loadJsonSync(path, defaultValue) {
45
+ if (!existsSync(path)) {
46
+ return defaultValue;
47
+ }
48
+ try {
49
+ return JSON.parse(readFileSync(path, "utf8"));
50
+ }
51
+ catch (error) {
52
+ if (error instanceof SyntaxError) {
53
+ throw new WorkerctlStateError(`Invalid JSON in ${path}: ${error.message}`);
54
+ }
55
+ throw error;
56
+ }
57
+ }
58
+ export function writeJsonSync(path, payload) {
59
+ mkdirSync(join(path, ".."), { recursive: true });
60
+ writeFileSync(path, `${JSON.stringify(sortJson(payload), null, 2)}\n`);
61
+ }
62
+ function sortJson(value) {
63
+ if (Array.isArray(value)) {
64
+ return value.map(sortJson);
65
+ }
66
+ if (value && typeof value === "object") {
67
+ return Object.fromEntries(Object.entries(value)
68
+ .sort(([left], [right]) => left.localeCompare(right))
69
+ .map(([key, child]) => [key, sortJson(child)]));
70
+ }
71
+ return value;
72
+ }
73
+ //# sourceMappingURL=files.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"files.js","sourceRoot":"","sources":["../../src/state/files.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ export declare const SCHEMA_V22_SQL: string;