@wascartech/devbot 2.1.0 → 2.1.1

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.
@@ -113,6 +113,12 @@ export function devcontainerVolumeArgs(podmanVolume) {
113
113
  // $XDG_CONFIG_HOME/containers (now the out-of-tree xdg volume — still worth
114
114
  // overriding so the inner runtime's config never mixes with opencode's). The
115
115
  // referenced file is created by ensurePodmanStore.
116
+ //
117
+ // This does NOT cover containers.conf: podman still scans
118
+ // $XDG_CONFIG_HOME/containers/containers.conf.d before reading the storage
119
+ // override. The runtime path in docker/devbot-shell redirects XDG_CONFIG_HOME
120
+ // (and the other XDG dirs) to $HOME/agent for that reason; the runner must keep
121
+ // passing opencode's sealed xdg home to the container itself.
116
122
  export function devcontainerEnvArgs() {
117
123
  return [
118
124
  "--env", `CONTAINERS_STORAGE_CONF=${PODMAN_STORE_DIR}/storage.conf`,
@@ -134,6 +140,9 @@ export function devcontainerPromptSection() {
134
140
  "",
135
141
  "- Build and run the project's own images, or pull service images (postgres, redis, etc.), then `podman network create` a private network so containers resolve each other by name.",
136
142
  "- Prefer a repo `compose.yaml`/`docker-compose.yml` via `podman compose` when one exists; otherwise use raw `podman`.",
143
+ "- The runtime is preconfigured for the agent UID: do not set `XDG_*`, use `sudo`, or add `--privileged`, `--isolation=chroot`, or `--storage-driver` flags.",
144
+ "- Debian/Ubuntu images that run `apt-get update && apt-get install` build normally; no sandbox-specific Dockerfile line is needed.",
145
+ "- A `podman` failure with `containers.conf.d: permission denied`, or an apt build failing with `setgroups 65534 failed` / `setegid 65534 failed` (errno EINVAL 22), is a DevBot sandbox bug to report. Do not add sandbox-specific configuration such as `APT::Sandbox::User` to the project.",
137
146
  "- The container store lives in a separate volume outside `/workspace`, so container artifacts are never part of the git diff and must not be committed.",
138
147
  "- Stop long-running containers when you're done (`podman rm -f <name>`); they are reaped when this run exits.",
139
148
  ].join("\n");
@@ -1 +1 @@
1
- {"version":3,"file":"devcontainer.js","sourceRoot":"","sources":["../src/devcontainer.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"devcontainer.js","sourceRoot":"","sources":["../src/devcontainer.ts"],"names":[],"mappings":"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"}
package/dist/migrate.js CHANGED
@@ -8,66 +8,431 @@ import { log } from "./logger.js";
8
8
  // migration is a numbered .sql file in migrations/ applied in order inside a
9
9
  // transaction; schema_migrations records the applied version. Fail-closed: a
10
10
  // half-applied migration aborts boot so a never half-schema serves requests.
11
+ //
12
+ // Additive migrations (ALTER TABLE ... ADD COLUMN plus the IF NOT EXISTS forms)
13
+ // are safe to replay against a schema that is ahead of schema_migrations: an
14
+ // existing column with the declared shape is skipped, a missing one is added,
15
+ // and the version is recorded only after every declared effect is present.
11
16
  const MODULE_DIR = dirname(fileURLToPath(import.meta.url));
12
17
  const MIGRATIONS_DIR = join(MODULE_DIR, "..", "migrations");
18
+ const IDENT = '(?:"[^"]+"|`[^`]+`|\\[[^\\]]+\\]|[A-Za-z_][A-Za-z0-9_$]*)';
19
+ const QUALIFIED_IDENT = `${IDENT}(?:\\s*\\.\\s*${IDENT})?`;
20
+ const ADD_COLUMN = new RegExp(`^ALTER\\s+TABLE\\s+(${QUALIFIED_IDENT})\\s+ADD\\s+(?:COLUMN\\s+)?(${IDENT})\\s+([\\s\\S]+)$`, "i");
21
+ const CREATE_TABLE = new RegExp(`^CREATE\\s+TABLE\\s+IF\\s+NOT\\s+EXISTS\\s+(${QUALIFIED_IDENT})`, "i");
22
+ const CREATE_INDEX = new RegExp(`^CREATE\\s+(?:UNIQUE\\s+)?INDEX\\s+IF\\s+NOT\\s+EXISTS\\s+(${QUALIFIED_IDENT})`, "i");
23
+ const CONSTRAINT_KEYWORDS = [
24
+ "PRIMARY",
25
+ "NOT",
26
+ "NULL",
27
+ "UNIQUE",
28
+ "CHECK",
29
+ "DEFAULT",
30
+ "COLLATE",
31
+ "REFERENCES",
32
+ "GENERATED",
33
+ "AS",
34
+ ];
35
+ const NOT_COLUMN_KEYWORDS = new Set(["CONSTRAINT", "PRIMARY", "UNIQUE", "FOREIGN", "CHECK"]);
13
36
  function loadMigrations() {
14
37
  let names;
15
38
  try {
16
- names = readdirSync(MIGRATIONS_DIR).filter((n) => n.endsWith(".sql"));
39
+ names = readdirSync(MIGRATIONS_DIR).filter((name) => name.endsWith(".sql"));
17
40
  }
18
41
  catch {
19
42
  return [];
20
43
  }
21
44
  return names
22
45
  .map((filename) => {
23
- const m = /^(\d+)_.+\.sql$/.exec(filename);
24
- if (!m)
46
+ const match = /^(\d+)_.+\.sql$/.exec(filename);
47
+ if (!match)
25
48
  return null;
26
- const version = Number(m[1]);
49
+ const version = Number(match[1]);
27
50
  const sql = readFileSync(join(MIGRATIONS_DIR, filename), "utf8");
28
51
  return { version, filename, sql };
29
52
  })
30
- .filter((m) => m !== null)
53
+ .filter((migration) => migration !== null)
31
54
  .sort((a, b) => a.version - b.version);
32
55
  }
33
- function appliedVersion() {
34
- db.exec(`
56
+ function splitStatements(sql) {
57
+ const statements = [];
58
+ let current = "";
59
+ let quote = null;
60
+ let i = 0;
61
+ while (i < sql.length) {
62
+ const ch = sql[i];
63
+ const next = sql[i + 1];
64
+ if (quote !== null) {
65
+ current += ch;
66
+ if (ch === quote) {
67
+ if (next === quote) {
68
+ current += next;
69
+ i += 2;
70
+ continue;
71
+ }
72
+ quote = null;
73
+ }
74
+ i++;
75
+ continue;
76
+ }
77
+ if (ch === "-" && next === "-") {
78
+ i += 2;
79
+ while (i < sql.length && sql[i] !== "\n")
80
+ i++;
81
+ current += " ";
82
+ continue;
83
+ }
84
+ if (ch === "/" && next === "*") {
85
+ i += 2;
86
+ while (i < sql.length && !(sql[i] === "*" && sql[i + 1] === "/"))
87
+ i++;
88
+ i += 2;
89
+ current += " ";
90
+ continue;
91
+ }
92
+ if (ch === "'" || ch === '"' || ch === "`") {
93
+ quote = ch;
94
+ current += ch;
95
+ i++;
96
+ continue;
97
+ }
98
+ if (ch === "[") {
99
+ quote = "]";
100
+ current += ch;
101
+ i++;
102
+ continue;
103
+ }
104
+ if (ch === ";") {
105
+ const statement = current.trim();
106
+ if (statement)
107
+ statements.push(statement);
108
+ current = "";
109
+ i++;
110
+ continue;
111
+ }
112
+ current += ch;
113
+ i++;
114
+ }
115
+ const statement = current.trim();
116
+ if (statement)
117
+ statements.push(statement);
118
+ return statements;
119
+ }
120
+ function lastIdentPart(raw) {
121
+ let quote = null;
122
+ let lastDot = -1;
123
+ for (let i = 0; i < raw.length; i++) {
124
+ const ch = raw[i];
125
+ if (quote !== null) {
126
+ if (ch === quote)
127
+ quote = null;
128
+ continue;
129
+ }
130
+ if (ch === "'" || ch === '"' || ch === "`") {
131
+ quote = ch;
132
+ continue;
133
+ }
134
+ if (ch === "[") {
135
+ quote = "]";
136
+ continue;
137
+ }
138
+ if (ch === ".")
139
+ lastDot = i;
140
+ }
141
+ return unquoteIdent(raw.slice(lastDot + 1));
142
+ }
143
+ function unquoteIdent(raw) {
144
+ const value = raw.trim();
145
+ if (value.length < 2)
146
+ return value;
147
+ const first = value[0];
148
+ const last = value[value.length - 1];
149
+ if ((first === '"' && last === '"') || (first === "'" && last === "'") || (first === "`" && last === "`")) {
150
+ return value.slice(1, -1).replaceAll(first + first, first);
151
+ }
152
+ if (first === "[" && last === "]")
153
+ return value.slice(1, -1).replaceAll("]]", "]");
154
+ return value;
155
+ }
156
+ function parseAdditive(sql) {
157
+ const statements = splitStatements(sql);
158
+ if (statements.length === 0)
159
+ return null;
160
+ const effects = [];
161
+ for (const statement of statements) {
162
+ const add = ADD_COLUMN.exec(statement);
163
+ if (add) {
164
+ const table = lastIdentPart(add[1]);
165
+ const column = lastIdentPart(add[2]);
166
+ const definition = add[3].trim();
167
+ if (!definition || NOT_COLUMN_KEYWORDS.has(column.toUpperCase()))
168
+ return null;
169
+ effects.push({ kind: "column", sql: statement, table, column, definition });
170
+ continue;
171
+ }
172
+ const table = CREATE_TABLE.exec(statement);
173
+ if (table) {
174
+ effects.push({ kind: "table", sql: statement, name: lastIdentPart(table[1]) });
175
+ continue;
176
+ }
177
+ const index = CREATE_INDEX.exec(statement);
178
+ if (index) {
179
+ effects.push({ kind: "index", sql: statement, name: lastIdentPart(index[1]) });
180
+ continue;
181
+ }
182
+ return null;
183
+ }
184
+ return effects;
185
+ }
186
+ function topLevelIndex(sql, words) {
187
+ let quote = null;
188
+ let depth = 0;
189
+ for (let i = 0; i < sql.length; i++) {
190
+ const ch = sql[i];
191
+ if (quote !== null) {
192
+ if (ch === quote) {
193
+ if (sql[i + 1] === quote) {
194
+ i++;
195
+ continue;
196
+ }
197
+ quote = null;
198
+ }
199
+ continue;
200
+ }
201
+ if (ch === "'" || ch === '"' || ch === "`") {
202
+ quote = ch;
203
+ continue;
204
+ }
205
+ if (ch === "[") {
206
+ quote = "]";
207
+ continue;
208
+ }
209
+ if (ch === "(") {
210
+ depth++;
211
+ continue;
212
+ }
213
+ if (ch === ")") {
214
+ depth = Math.max(0, depth - 1);
215
+ continue;
216
+ }
217
+ if (depth !== 0 || !/[A-Za-z_]/.test(ch))
218
+ continue;
219
+ let end = i + 1;
220
+ while (end < sql.length && /[A-Za-z0-9_$]/.test(sql[end]))
221
+ end++;
222
+ if (words.includes(sql.slice(i, end).toUpperCase()))
223
+ return i;
224
+ i = end - 1;
225
+ }
226
+ return -1;
227
+ }
228
+ function parseDefault(definition) {
229
+ const at = topLevelIndex(definition, ["DEFAULT"]);
230
+ if (at === -1)
231
+ return null;
232
+ let i = at + "DEFAULT".length;
233
+ while (i < definition.length && /\s/.test(definition[i]))
234
+ i++;
235
+ if (i >= definition.length)
236
+ return null;
237
+ const start = i;
238
+ const first = definition[i];
239
+ if (first === "'" || first === '"' || first === "`") {
240
+ i++;
241
+ while (i < definition.length) {
242
+ if (definition[i] === first) {
243
+ if (definition[i + 1] === first) {
244
+ i += 2;
245
+ continue;
246
+ }
247
+ i++;
248
+ break;
249
+ }
250
+ i++;
251
+ }
252
+ return normalizeSql(definition.slice(start, i));
253
+ }
254
+ if (first === "(") {
255
+ let depth = 0;
256
+ while (i < definition.length) {
257
+ const ch = definition[i];
258
+ if (ch === "(")
259
+ depth++;
260
+ else if (ch === ")") {
261
+ depth--;
262
+ if (depth === 0) {
263
+ i++;
264
+ break;
265
+ }
266
+ }
267
+ i++;
268
+ }
269
+ return normalizeSql(definition.slice(start, i));
270
+ }
271
+ while (i < definition.length && !/[\s,)]/.test(definition[i]))
272
+ i++;
273
+ return normalizeSql(definition.slice(start, i));
274
+ }
275
+ function normalizeSql(value) {
276
+ return value.trim().replace(/\s+/g, " ");
277
+ }
278
+ function parseColumnShape(definition) {
279
+ const typeEnd = topLevelIndex(definition, CONSTRAINT_KEYWORDS);
280
+ return {
281
+ type: normalizeSql(typeEnd === -1 ? definition : definition.slice(0, typeEnd)).toUpperCase(),
282
+ notNull: topLevelIndex(definition, ["NOT"]) !== -1,
283
+ default: parseDefault(definition),
284
+ };
285
+ }
286
+ function quoteIdent(name) {
287
+ return `"${name.replaceAll('"', '""')}"`;
288
+ }
289
+ function columnState(database, effect) {
290
+ const rows = database.prepare(`PRAGMA table_info(${quoteIdent(effect.table)})`).all();
291
+ const row = rows.find((candidate) => candidate.name.toLowerCase() === effect.column.toLowerCase());
292
+ if (!row)
293
+ return "missing";
294
+ const expected = parseColumnShape(effect.definition);
295
+ const compatible = normalizeSql(row.type).toUpperCase() === expected.type &&
296
+ (row.notnull === 1) === expected.notNull &&
297
+ normalizeSql(row.dflt_value ?? "") === normalizeSql(expected.default ?? "");
298
+ return compatible ? "compatible" : "incompatible";
299
+ }
300
+ function objectExists(database, type, name) {
301
+ const row = database
302
+ .prepare("SELECT 1 AS ok FROM sqlite_master WHERE type = ? AND name = ? COLLATE NOCASE")
303
+ .get(type, name);
304
+ return row !== undefined;
305
+ }
306
+ function applyAdditiveMigration(database, effects) {
307
+ let skipped = 0;
308
+ let executed = 0;
309
+ for (const effect of effects) {
310
+ if (effect.kind === "column") {
311
+ const state = columnState(database, effect);
312
+ if (state === "compatible") {
313
+ skipped++;
314
+ continue;
315
+ }
316
+ if (state === "incompatible") {
317
+ throw new Error(`column ${effect.table}.${effect.column} exists with an incompatible definition`);
318
+ }
319
+ database.exec(effect.sql);
320
+ executed++;
321
+ continue;
322
+ }
323
+ database.exec(effect.sql);
324
+ executed++;
325
+ }
326
+ for (const effect of effects) {
327
+ if (effect.kind === "column") {
328
+ const state = columnState(database, effect);
329
+ if (state === "missing") {
330
+ throw new Error(`migration did not create column ${effect.table}.${effect.column}`);
331
+ }
332
+ if (state === "incompatible") {
333
+ throw new Error(`column ${effect.table}.${effect.column} exists with an incompatible definition`);
334
+ }
335
+ continue;
336
+ }
337
+ if (!objectExists(database, effect.kind, effect.name)) {
338
+ throw new Error(`migration did not create ${effect.kind} ${effect.name}`);
339
+ }
340
+ }
341
+ return { skipped, executed };
342
+ }
343
+ function appliedVersions(database) {
344
+ database.exec(`
35
345
  CREATE TABLE IF NOT EXISTS schema_migrations (
36
346
  version INTEGER PRIMARY KEY,
37
347
  applied_at INTEGER NOT NULL
38
348
  )
39
349
  `);
40
- const row = db.prepare("SELECT MAX(version) AS v FROM schema_migrations").get();
41
- return row?.v ?? 0;
350
+ const rows = database.prepare("SELECT version FROM schema_migrations").all();
351
+ return new Set(rows.map((row) => row.version));
42
352
  }
43
- export function migrate() {
44
- const last = appliedVersion();
45
- const all = loadMigrations();
46
- const pending = all.filter((m) => m.version > last);
47
- if (pending.length === 0) {
48
- log.debug("migrations up to date", { applied: last });
49
- return;
353
+ export function unrecordedBelowMax(applied, migrations) {
354
+ if (applied.size === 0)
355
+ return [];
356
+ const max = Math.max(...applied);
357
+ const missing = new Set();
358
+ for (const migration of migrations) {
359
+ if (migration.version < max && !applied.has(migration.version))
360
+ missing.add(migration.version);
361
+ }
362
+ return [...missing].sort((a, b) => a - b);
363
+ }
364
+ function migrateOne(database, migration) {
365
+ const started = Date.now();
366
+ try {
367
+ database.exec("BEGIN");
368
+ let skipped = 0;
369
+ let executed = 0;
370
+ if (migration.effects !== null) {
371
+ const result = applyAdditiveMigration(database, migration.effects);
372
+ skipped = result.skipped;
373
+ executed = result.executed;
374
+ }
375
+ else {
376
+ database.exec(migration.sql);
377
+ executed = 1;
378
+ }
379
+ database.prepare("INSERT INTO schema_migrations (version, applied_at) VALUES (?, ?)").run(migration.version, Math.floor(Date.now() / 1000));
380
+ database.exec("COMMIT");
381
+ log.info("migration applied", {
382
+ version: migration.version,
383
+ file: migration.filename,
384
+ ms: Date.now() - started,
385
+ skippedColumns: skipped,
386
+ executedStatements: executed,
387
+ adopted: skipped > 0 && executed === 0,
388
+ });
50
389
  }
51
- log.info("applying migrations", { from: last, to: pending[pending.length - 1].version, count: pending.length });
52
- for (const m of pending) {
53
- const t0 = Date.now();
390
+ catch (e) {
54
391
  try {
55
- db.exec("BEGIN");
56
- db.exec(m.sql);
57
- db.prepare("INSERT INTO schema_migrations (version, applied_at) VALUES (?, ?)").run(m.version, Math.floor(Date.now() / 1000));
58
- db.exec("COMMIT");
59
- log.info("migration applied", { version: m.version, file: m.filename, ms: Date.now() - t0 });
392
+ database.exec("ROLLBACK");
60
393
  }
61
- catch (e) {
62
- db.exec("ROLLBACK");
63
- log.error("migration failed, aborting boot", { version: m.version, file: m.filename, err: e instanceof Error ? e.message : String(e) });
64
- throw new Error(`migration ${m.version} (${m.filename}) failed: ${e instanceof Error ? e.message : String(e)}`);
394
+ catch {
395
+ // BEGIN may have failed before a transaction was active.
65
396
  }
397
+ log.error("migration failed, aborting boot", {
398
+ version: migration.version,
399
+ file: migration.filename,
400
+ err: e instanceof Error ? e.message : String(e),
401
+ });
402
+ throw new Error(`migration ${migration.version} (${migration.filename}) failed: ${e instanceof Error ? e.message : String(e)}`);
66
403
  }
67
404
  }
405
+ export function runMigrations(database, migrations = loadMigrations()) {
406
+ const applied = appliedVersions(database);
407
+ const last = applied.size === 0 ? 0 : Math.max(...applied);
408
+ const pending = migrations
409
+ .filter((migration) => !applied.has(migration.version))
410
+ .sort((a, b) => a.version - b.version)
411
+ .map((migration) => ({ ...migration, effects: parseAdditive(migration.sql) }));
412
+ if (pending.length === 0) {
413
+ log.debug("migrations up to date", { applied: last });
414
+ return;
415
+ }
416
+ const missing = unrecordedBelowMax(applied, migrations);
417
+ if (missing.length > 0) {
418
+ const filenames = new Map(migrations.map((migration) => [migration.version, migration.filename]));
419
+ log.warn("schema_migrations has unrecorded versions below the applied max", {
420
+ max: last,
421
+ missing: missing.map((version) => ({ version, filename: filenames.get(version) })),
422
+ });
423
+ }
424
+ const pendingLast = pending[pending.length - 1].version;
425
+ log.info("applying migrations", { from: last, to: pendingLast, count: pending.length });
426
+ for (const migration of pending)
427
+ migrateOne(database, migration);
428
+ }
429
+ export function migrate() {
430
+ runMigrations(db);
431
+ }
68
432
  export function migrationStatus() {
69
- const last = appliedVersion();
70
433
  const all = loadMigrations();
71
- return { applied: last, pending: all.filter((m) => m.version > last).length };
434
+ const applied = appliedVersions(db);
435
+ const appliedCount = all.filter((migration) => applied.has(migration.version)).length;
436
+ return { appliedCount, pendingCount: all.length - appliedCount };
72
437
  }
73
438
  //# sourceMappingURL=migrate.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"migrate.js","sourceRoot":"","sources":["../src/migrate.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"migrate.js","sourceRoot":"","sources":["../src/migrate.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@wascartech/devbot",
3
- "version": "2.1.0",
3
+ "version": "2.1.1",
4
4
  "private": false,
5
5
  "type": "module",
6
6
  "author": "Adrien Jussak <adrien.jussak@wascar.tech>",
@@ -51,6 +51,7 @@
51
51
  "test:queue-store": "node --experimental-sqlite --test --import tsx scripts/check-queue-store.ts",
52
52
  "test:idempotency": "node --experimental-sqlite --test --import tsx scripts/check-idempotency.ts",
53
53
  "test:migrate": "node --experimental-sqlite --test --import tsx scripts/check-migrate.ts",
54
+ "test:migrate-replay": "node --experimental-sqlite --test --import tsx scripts/check-migrate-replay.ts",
54
55
  "test:dispatch": "node --experimental-sqlite --test --import tsx scripts/check-dispatch.ts",
55
56
  "test:webhook-e2e": "node --experimental-sqlite --test --import tsx scripts/check-webhook-e2e.ts",
56
57
  "test:mr-content": "node --experimental-sqlite --test --import tsx scripts/check-mr-content.ts",