@automagik/omni 2.260520.15 → 2.260520.16

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.
@@ -1 +1 @@
1
- {"version":3,"file":"doctor.d.ts","sourceRoot":"","sources":["../../src/commands/doctor.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"doctor.d.ts","sourceRoot":"","sources":["../../src/commands/doctor.ts"],"names":[],"mappings":"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"}
package/dist/index.js CHANGED
@@ -4660,6 +4660,271 @@ var require_cli_spinners = __commonJS((exports, module) => {
4660
4660
  module.exports = spinners;
4661
4661
  });
4662
4662
 
4663
+ // src/lib/embedded-canonical-migration.ts
4664
+ var exports_embedded_canonical_migration = {};
4665
+ __export(exports_embedded_canonical_migration, {
4666
+ migrateUnmountedEmbeddedToCanonical: () => migrateUnmountedEmbeddedToCanonical,
4667
+ compareEmbeddedVsCanonicalCounts: () => compareEmbeddedVsCanonicalCounts,
4668
+ EMBEDDED_PGSERVE_DATA_DIR: () => EMBEDDED_PGSERVE_DATA_DIR
4669
+ });
4670
+ import { spawn, spawnSync as spawnSync2 } from "child_process";
4671
+ import { existsSync as existsSync9, mkdtempSync } from "fs";
4672
+ import { createServer } from "net";
4673
+ import { homedir as homedir7, tmpdir } from "os";
4674
+ import { join as join11 } from "path";
4675
+ import { setTimeout as sleep2 } from "timers/promises";
4676
+ function defaultLog(line) {
4677
+ process.stdout.write(`${line}
4678
+ `);
4679
+ }
4680
+ function findAutopgPostgresBinary() {
4681
+ const autopgRoot = join11(homedir7(), ".local", "share", "autopg");
4682
+ if (!existsSync9(autopgRoot))
4683
+ return null;
4684
+ let bestPath = null;
4685
+ for (const entry of safeReaddir(autopgRoot)) {
4686
+ const candidate = join11(autopgRoot, entry, "postgres", "bin", "postgres");
4687
+ if (existsSync9(candidate))
4688
+ bestPath = candidate;
4689
+ }
4690
+ return bestPath;
4691
+ }
4692
+ function safeReaddir(path) {
4693
+ try {
4694
+ const { readdirSync: readdirSync2 } = __require("fs");
4695
+ return readdirSync2(path);
4696
+ } catch {
4697
+ return [];
4698
+ }
4699
+ }
4700
+ async function findFreePort() {
4701
+ return new Promise((resolve, reject) => {
4702
+ const server = createServer();
4703
+ server.unref();
4704
+ server.on("error", reject);
4705
+ server.listen(0, "127.0.0.1", () => {
4706
+ const addr = server.address();
4707
+ if (!addr || typeof addr === "string") {
4708
+ server.close();
4709
+ reject(new Error("failed to discover free port"));
4710
+ return;
4711
+ }
4712
+ const port = addr.port;
4713
+ server.close(() => resolve(port));
4714
+ });
4715
+ });
4716
+ }
4717
+ async function spawnTempPostmaster(binary, dataDir, port, log) {
4718
+ const socketDir = mkdtempSync(join11(tmpdir(), "omni-migrate-pg-"));
4719
+ log(` spawning temp postmaster: pid=\u2026 port=${port} socket=${socketDir}`);
4720
+ const child = spawn(binary, [
4721
+ "-D",
4722
+ dataDir,
4723
+ "-p",
4724
+ String(port),
4725
+ "-c",
4726
+ "listen_addresses=127.0.0.1",
4727
+ "-c",
4728
+ `unix_socket_directories=${socketDir}`
4729
+ ], {
4730
+ stdio: ["ignore", "pipe", "pipe"],
4731
+ detached: false
4732
+ });
4733
+ let started = false;
4734
+ let crashed = null;
4735
+ child.stderr?.on("data", (chunk) => {
4736
+ const line = chunk.toString("utf-8");
4737
+ if (!started && /database system is ready to accept connections/.test(line))
4738
+ started = true;
4739
+ });
4740
+ child.on("exit", (code) => {
4741
+ if (!started) {
4742
+ crashed = new Error(`temp postmaster exited with code ${code} before ready`);
4743
+ }
4744
+ });
4745
+ for (let i = 0;i < 200; i++) {
4746
+ if (started)
4747
+ break;
4748
+ if (crashed)
4749
+ throw crashed;
4750
+ await sleep2(100);
4751
+ }
4752
+ if (!started) {
4753
+ child.kill("SIGTERM");
4754
+ throw new Error("temp postmaster failed to become ready within 20s");
4755
+ }
4756
+ log(` temp postmaster ready (pid=${child.pid})`);
4757
+ return {
4758
+ pid: child.pid ?? -1,
4759
+ socketDir,
4760
+ async stop() {
4761
+ log(" stopping temp postmaster (SIGTERM)");
4762
+ child.kill("SIGTERM");
4763
+ await new Promise((resolve) => {
4764
+ const onExit2 = () => resolve();
4765
+ child.once("exit", onExit2);
4766
+ setTimeout(() => {
4767
+ child.kill("SIGKILL");
4768
+ onExit2();
4769
+ }, 1e4);
4770
+ });
4771
+ }
4772
+ };
4773
+ }
4774
+ function psqlCapture(args) {
4775
+ const result = spawnSync2("psql", args, {
4776
+ encoding: "utf-8",
4777
+ env: { ...process.env, PGPASSWORD: "postgres" },
4778
+ timeout: 60000
4779
+ });
4780
+ if (result.status !== 0) {
4781
+ throw new Error(`psql exited ${result.status}: ${result.stderr?.trim() ?? ""}`);
4782
+ }
4783
+ return result.stdout ?? "";
4784
+ }
4785
+ async function copyTable(table, srcArgs, dstArgs, log) {
4786
+ const src = spawn("psql", [...srcArgs, "-c", `\\copy public.${table} TO STDOUT`], {
4787
+ stdio: ["ignore", "pipe", "pipe"],
4788
+ env: { ...process.env, PGPASSWORD: "postgres" }
4789
+ });
4790
+ const dst = spawn("psql", [...dstArgs, "-c", `SET session_replication_role='replica';`, "-c", `\\copy public.${table} FROM STDIN`], {
4791
+ stdio: ["pipe", "pipe", "pipe"],
4792
+ env: { ...process.env, PGPASSWORD: "postgres" }
4793
+ });
4794
+ if (!src.stdout || !dst.stdin)
4795
+ throw new Error(`copy stream not available for ${table}`);
4796
+ src.stdout.pipe(dst.stdin);
4797
+ let dstErr = "";
4798
+ dst.stderr?.on("data", (b) => {
4799
+ dstErr += b.toString("utf-8");
4800
+ });
4801
+ const srcExited = new Promise((resolve) => src.once("exit", (code) => resolve(code ?? -1)));
4802
+ const dstExited = new Promise((resolve) => dst.once("exit", (code) => resolve(code ?? -1)));
4803
+ const [sc, dc] = await Promise.all([srcExited, dstExited]);
4804
+ if (sc !== 0 || dc !== 0) {
4805
+ throw new Error(`copy ${table} failed (src=${sc} dst=${dc}): ${dstErr.trim()}`);
4806
+ }
4807
+ log(` copied ${table}`);
4808
+ }
4809
+ function resetSequences(dstArgs, log) {
4810
+ const script = `
4811
+ SELECT format(
4812
+ 'SELECT setval(%L::regclass, GREATEST(COALESCE((SELECT max(%I) FROM %I.%I), 1), 1));',
4813
+ pg_get_serial_sequence(c.table_schema || '.' || c.table_name, c.column_name),
4814
+ c.column_name, c.table_schema, c.table_name
4815
+ )
4816
+ FROM information_schema.columns c
4817
+ WHERE pg_get_serial_sequence(c.table_schema || '.' || c.table_name, c.column_name) IS NOT NULL
4818
+ AND c.table_schema = 'public';
4819
+ `.trim();
4820
+ const lines = psqlCapture([...dstArgs, "-tAc", script]).split(`
4821
+ `).map((l) => l.trim()).filter(Boolean);
4822
+ if (lines.length === 0)
4823
+ return;
4824
+ log(` resetting ${lines.length} sequence(s)`);
4825
+ psqlCapture([...dstArgs, "-c", lines.join(`
4826
+ `)]);
4827
+ }
4828
+ async function compareEmbeddedVsCanonicalCounts(opts = {}) {
4829
+ const canonicalPort = opts.canonicalPort ?? 5432;
4830
+ if (!existsSync9(EMBEDDED_DIR) || !existsSync9(join11(EMBEDDED_DIR, "PG_VERSION"))) {
4831
+ return { kind: "skipped", reason: "embedded dir absent" };
4832
+ }
4833
+ const binary = findAutopgPostgresBinary();
4834
+ if (!binary)
4835
+ return { kind: "skipped", reason: "autopg postgres binary not found" };
4836
+ const tempPort = await findFreePort();
4837
+ let temp = null;
4838
+ try {
4839
+ temp = await spawnTempPostmaster(binary, EMBEDDED_DIR, tempPort, () => {});
4840
+ const srcArgs = ["-h", "127.0.0.1", "-p", String(tempPort), "-U", "postgres", "-d", "omni"];
4841
+ const dstArgs = ["-h", "127.0.0.1", "-p", String(canonicalPort), "-U", "postgres", "-d", "omni"];
4842
+ const tablesRaw = psqlCapture([
4843
+ ...srcArgs,
4844
+ "-tAc",
4845
+ `SELECT tablename FROM pg_tables WHERE schemaname='public' ORDER BY tablename`
4846
+ ]);
4847
+ const tables = tablesRaw.split(`
4848
+ `).map((s) => s.trim()).filter(Boolean);
4849
+ if (tables.length === 0)
4850
+ return { kind: "skipped", reason: "embedded has no public tables" };
4851
+ const divergent = [];
4852
+ let totalExtra = 0;
4853
+ for (const t of tables) {
4854
+ try {
4855
+ const em = Number.parseInt(psqlCapture([...srcArgs, "-tAc", `SELECT count(*) FROM public.${t}`]).trim(), 10);
4856
+ const ca = Number.parseInt(psqlCapture([...dstArgs, "-tAc", `SELECT count(*) FROM public.${t}`]).trim(), 10);
4857
+ if (Number.isFinite(em) && Number.isFinite(ca) && em > ca) {
4858
+ divergent.push(t);
4859
+ totalExtra += em - ca;
4860
+ }
4861
+ } catch {
4862
+ divergent.push(t);
4863
+ }
4864
+ }
4865
+ if (divergent.length === 0)
4866
+ return { kind: "in-sync" };
4867
+ return { kind: "embedded-has-more", divergentTables: divergent, embeddedRows: totalExtra };
4868
+ } catch (err) {
4869
+ return { kind: "skipped", reason: err instanceof Error ? err.message : String(err) };
4870
+ } finally {
4871
+ if (temp)
4872
+ await temp.stop();
4873
+ }
4874
+ }
4875
+ async function migrateUnmountedEmbeddedToCanonical(opts = {}) {
4876
+ const log = opts.log ?? defaultLog;
4877
+ const canonicalPort = opts.canonicalPort ?? 5432;
4878
+ if (!existsSync9(EMBEDDED_DIR)) {
4879
+ return { status: "skipped", reason: "no embedded data dir" };
4880
+ }
4881
+ if (!existsSync9(join11(EMBEDDED_DIR, "PG_VERSION"))) {
4882
+ return { status: "skipped", reason: "embedded dir missing PG_VERSION" };
4883
+ }
4884
+ const binary = findAutopgPostgresBinary();
4885
+ if (!binary) {
4886
+ return { status: "skipped", reason: "autopg postgres binary not found \u2014 install autopg first" };
4887
+ }
4888
+ log(` using postgres binary: ${binary}`);
4889
+ const tempPort = await findFreePort();
4890
+ const t0 = Date.now();
4891
+ const temp = await spawnTempPostmaster(binary, EMBEDDED_DIR, tempPort, log);
4892
+ try {
4893
+ const srcBaseArgs = ["-h", "127.0.0.1", "-p", String(tempPort), "-U", "postgres", "-d", "omni"];
4894
+ const dstBaseArgs = ["-h", "127.0.0.1", "-p", String(canonicalPort), "-U", "postgres", "-d", "omni"];
4895
+ const tablesRaw = psqlCapture([
4896
+ ...srcBaseArgs,
4897
+ "-tAc",
4898
+ `SELECT tablename FROM pg_tables WHERE schemaname='public' ORDER BY tablename`
4899
+ ]);
4900
+ const tables = tablesRaw.split(`
4901
+ `).map((s) => s.trim()).filter(Boolean);
4902
+ if (tables.length === 0) {
4903
+ return { status: "skipped", reason: "embedded omni has no public tables" };
4904
+ }
4905
+ log(` ${tables.length} tables to migrate`);
4906
+ const truncateList = tables.map((t) => `public.${t}`).join(",");
4907
+ psqlCapture([
4908
+ ...dstBaseArgs,
4909
+ "-c",
4910
+ `SET session_replication_role='replica'; TRUNCATE ${truncateList} RESTART IDENTITY CASCADE;`
4911
+ ]);
4912
+ log(" truncated canonical (CASCADE)");
4913
+ for (const t of tables) {
4914
+ await copyTable(t, srcBaseArgs, dstBaseArgs, log);
4915
+ }
4916
+ resetSequences(dstBaseArgs, log);
4917
+ return { status: "migrated", tables: tables.length, durationMs: Date.now() - t0 };
4918
+ } finally {
4919
+ await temp.stop();
4920
+ }
4921
+ }
4922
+ var EMBEDDED_DIR, EMBEDDED_PGSERVE_DATA_DIR;
4923
+ var init_embedded_canonical_migration = __esm(() => {
4924
+ EMBEDDED_DIR = join11(homedir7(), ".omni", "data", "pgserve");
4925
+ EMBEDDED_PGSERVE_DATA_DIR = EMBEDDED_DIR;
4926
+ });
4927
+
4663
4928
  // ../../node_modules/.bun/qrcode-terminal@0.12.0/node_modules/qrcode-terminal/vendor/QRCode/QRMode.js
4664
4929
  var require_QRMode = __commonJS((exports, module) => {
4665
4930
  module.exports = {
@@ -124067,7 +124332,7 @@ import { fileURLToPath } from "url";
124067
124332
  // package.json
124068
124333
  var package_default = {
124069
124334
  name: "@automagik/omni",
124070
- version: "2.260520.15",
124335
+ version: "2.260520.16",
124071
124336
  description: "LLM-optimized CLI for Omni",
124072
124337
  type: "module",
124073
124338
  bin: {
@@ -129286,216 +129551,8 @@ function formatBytes(n) {
129286
129551
  return `${(n / 1024 / 1024 / 1024).toFixed(2)} GB`;
129287
129552
  }
129288
129553
 
129289
- // src/lib/embedded-canonical-migration.ts
129290
- import { spawn, spawnSync as spawnSync2 } from "child_process";
129291
- import { existsSync as existsSync9, mkdtempSync } from "fs";
129292
- import { createServer } from "net";
129293
- import { homedir as homedir7, tmpdir } from "os";
129294
- import { join as join11 } from "path";
129295
- import { setTimeout as sleep2 } from "timers/promises";
129296
- var EMBEDDED_DIR = join11(homedir7(), ".omni", "data", "pgserve");
129297
- function defaultLog(line) {
129298
- process.stdout.write(`${line}
129299
- `);
129300
- }
129301
- function findAutopgPostgresBinary() {
129302
- const autopgRoot = join11(homedir7(), ".local", "share", "autopg");
129303
- if (!existsSync9(autopgRoot))
129304
- return null;
129305
- let bestPath = null;
129306
- for (const entry of safeReaddir(autopgRoot)) {
129307
- const candidate = join11(autopgRoot, entry, "postgres", "bin", "postgres");
129308
- if (existsSync9(candidate))
129309
- bestPath = candidate;
129310
- }
129311
- return bestPath;
129312
- }
129313
- function safeReaddir(path) {
129314
- try {
129315
- const { readdirSync: readdirSync2 } = __require("fs");
129316
- return readdirSync2(path);
129317
- } catch {
129318
- return [];
129319
- }
129320
- }
129321
- async function findFreePort() {
129322
- return new Promise((resolve, reject) => {
129323
- const server = createServer();
129324
- server.unref();
129325
- server.on("error", reject);
129326
- server.listen(0, "127.0.0.1", () => {
129327
- const addr = server.address();
129328
- if (!addr || typeof addr === "string") {
129329
- server.close();
129330
- reject(new Error("failed to discover free port"));
129331
- return;
129332
- }
129333
- const port = addr.port;
129334
- server.close(() => resolve(port));
129335
- });
129336
- });
129337
- }
129338
- async function spawnTempPostmaster(binary, dataDir, port, log) {
129339
- const socketDir = mkdtempSync(join11(tmpdir(), "omni-migrate-pg-"));
129340
- log(` spawning temp postmaster: pid=\u2026 port=${port} socket=${socketDir}`);
129341
- const child = spawn(binary, [
129342
- "-D",
129343
- dataDir,
129344
- "-p",
129345
- String(port),
129346
- "-c",
129347
- "listen_addresses=127.0.0.1",
129348
- "-c",
129349
- `unix_socket_directories=${socketDir}`
129350
- ], {
129351
- stdio: ["ignore", "pipe", "pipe"],
129352
- detached: false
129353
- });
129354
- let started = false;
129355
- let crashed = null;
129356
- child.stderr?.on("data", (chunk) => {
129357
- const line = chunk.toString("utf-8");
129358
- if (!started && /database system is ready to accept connections/.test(line))
129359
- started = true;
129360
- });
129361
- child.on("exit", (code) => {
129362
- if (!started) {
129363
- crashed = new Error(`temp postmaster exited with code ${code} before ready`);
129364
- }
129365
- });
129366
- for (let i = 0;i < 200; i++) {
129367
- if (started)
129368
- break;
129369
- if (crashed)
129370
- throw crashed;
129371
- await sleep2(100);
129372
- }
129373
- if (!started) {
129374
- child.kill("SIGTERM");
129375
- throw new Error("temp postmaster failed to become ready within 20s");
129376
- }
129377
- log(` temp postmaster ready (pid=${child.pid})`);
129378
- return {
129379
- pid: child.pid ?? -1,
129380
- socketDir,
129381
- async stop() {
129382
- log(" stopping temp postmaster (SIGTERM)");
129383
- child.kill("SIGTERM");
129384
- await new Promise((resolve) => {
129385
- const onExit2 = () => resolve();
129386
- child.once("exit", onExit2);
129387
- setTimeout(() => {
129388
- child.kill("SIGKILL");
129389
- onExit2();
129390
- }, 1e4);
129391
- });
129392
- }
129393
- };
129394
- }
129395
- function psqlCapture(args) {
129396
- const result = spawnSync2("psql", args, {
129397
- encoding: "utf-8",
129398
- env: { ...process.env, PGPASSWORD: "postgres" },
129399
- timeout: 60000
129400
- });
129401
- if (result.status !== 0) {
129402
- throw new Error(`psql exited ${result.status}: ${result.stderr?.trim() ?? ""}`);
129403
- }
129404
- return result.stdout ?? "";
129405
- }
129406
- async function copyTable(table, srcArgs, dstArgs, log) {
129407
- const src = spawn("psql", [...srcArgs, "-c", `\\copy public.${table} TO STDOUT`], {
129408
- stdio: ["ignore", "pipe", "pipe"],
129409
- env: { ...process.env, PGPASSWORD: "postgres" }
129410
- });
129411
- const dst = spawn("psql", [...dstArgs, "-c", `SET session_replication_role='replica';`, "-c", `\\copy public.${table} FROM STDIN`], {
129412
- stdio: ["pipe", "pipe", "pipe"],
129413
- env: { ...process.env, PGPASSWORD: "postgres" }
129414
- });
129415
- if (!src.stdout || !dst.stdin)
129416
- throw new Error(`copy stream not available for ${table}`);
129417
- src.stdout.pipe(dst.stdin);
129418
- let dstErr = "";
129419
- dst.stderr?.on("data", (b) => {
129420
- dstErr += b.toString("utf-8");
129421
- });
129422
- const srcExited = new Promise((resolve) => src.once("exit", (code) => resolve(code ?? -1)));
129423
- const dstExited = new Promise((resolve) => dst.once("exit", (code) => resolve(code ?? -1)));
129424
- const [sc, dc] = await Promise.all([srcExited, dstExited]);
129425
- if (sc !== 0 || dc !== 0) {
129426
- throw new Error(`copy ${table} failed (src=${sc} dst=${dc}): ${dstErr.trim()}`);
129427
- }
129428
- log(` copied ${table}`);
129429
- }
129430
- function resetSequences(dstArgs, log) {
129431
- const script = `
129432
- SELECT format(
129433
- 'SELECT setval(%L::regclass, GREATEST(COALESCE((SELECT max(%I) FROM %I.%I), 1), 1));',
129434
- pg_get_serial_sequence(c.table_schema || '.' || c.table_name, c.column_name),
129435
- c.column_name, c.table_schema, c.table_name
129436
- )
129437
- FROM information_schema.columns c
129438
- WHERE pg_get_serial_sequence(c.table_schema || '.' || c.table_name, c.column_name) IS NOT NULL
129439
- AND c.table_schema = 'public';
129440
- `.trim();
129441
- const lines = psqlCapture([...dstArgs, "-tAc", script]).split(`
129442
- `).map((l) => l.trim()).filter(Boolean);
129443
- if (lines.length === 0)
129444
- return;
129445
- log(` resetting ${lines.length} sequence(s)`);
129446
- psqlCapture([...dstArgs, "-c", lines.join(`
129447
- `)]);
129448
- }
129449
- async function migrateUnmountedEmbeddedToCanonical(opts = {}) {
129450
- const log = opts.log ?? defaultLog;
129451
- const canonicalPort = opts.canonicalPort ?? 5432;
129452
- if (!existsSync9(EMBEDDED_DIR)) {
129453
- return { status: "skipped", reason: "no embedded data dir" };
129454
- }
129455
- if (!existsSync9(join11(EMBEDDED_DIR, "PG_VERSION"))) {
129456
- return { status: "skipped", reason: "embedded dir missing PG_VERSION" };
129457
- }
129458
- const binary = findAutopgPostgresBinary();
129459
- if (!binary) {
129460
- return { status: "skipped", reason: "autopg postgres binary not found \u2014 install autopg first" };
129461
- }
129462
- log(` using postgres binary: ${binary}`);
129463
- const tempPort = await findFreePort();
129464
- const t0 = Date.now();
129465
- const temp = await spawnTempPostmaster(binary, EMBEDDED_DIR, tempPort, log);
129466
- try {
129467
- const srcBaseArgs = ["-h", "127.0.0.1", "-p", String(tempPort), "-U", "postgres", "-d", "omni"];
129468
- const dstBaseArgs = ["-h", "127.0.0.1", "-p", String(canonicalPort), "-U", "postgres", "-d", "omni"];
129469
- const tablesRaw = psqlCapture([
129470
- ...srcBaseArgs,
129471
- "-tAc",
129472
- `SELECT tablename FROM pg_tables WHERE schemaname='public' ORDER BY tablename`
129473
- ]);
129474
- const tables = tablesRaw.split(`
129475
- `).map((s) => s.trim()).filter(Boolean);
129476
- if (tables.length === 0) {
129477
- return { status: "skipped", reason: "embedded omni has no public tables" };
129478
- }
129479
- log(` ${tables.length} tables to migrate`);
129480
- const truncateList = tables.map((t) => `public.${t}`).join(",");
129481
- psqlCapture([
129482
- ...dstBaseArgs,
129483
- "-c",
129484
- `SET session_replication_role='replica'; TRUNCATE ${truncateList} RESTART IDENTITY CASCADE;`
129485
- ]);
129486
- log(" truncated canonical (CASCADE)");
129487
- for (const t of tables) {
129488
- await copyTable(t, srcBaseArgs, dstBaseArgs, log);
129489
- }
129490
- resetSequences(dstBaseArgs, log);
129491
- return { status: "migrated", tables: tables.length, durationMs: Date.now() - t0 };
129492
- } finally {
129493
- await temp.stop();
129494
- }
129495
- }
129496
- var EMBEDDED_PGSERVE_DATA_DIR = EMBEDDED_DIR;
129497
-
129498
129554
  // src/commands/doctor.ts
129555
+ init_embedded_canonical_migration();
129499
129556
  init_output();
129500
129557
 
129501
129558
  // src/server-bundle.ts
@@ -129778,25 +129835,30 @@ async function checkEmbeddedDataOrphaned(deps) {
129778
129835
  };
129779
129836
  }
129780
129837
  try {
129781
- const resp = await fetch(`http://127.0.0.1:${serverConfig.port}/api/v2/health`, {
129782
- signal: AbortSignal.timeout(2000)
129783
- });
129784
- const body = await resp.json();
129785
- const total = body?.instances?.total ?? 0;
129786
- if (total === 0) {
129838
+ const { existsSync: fsExists } = await import("fs");
129839
+ if (!fsExists(EMBEDDED_PGSERVE_DATA_DIR)) {
129840
+ return { id: "embedded-data-orphaned", level: "OK", detail: "no embedded data to compare" };
129841
+ }
129842
+ const { compareEmbeddedVsCanonicalCounts: compareEmbeddedVsCanonicalCounts2 } = await Promise.resolve().then(() => (init_embedded_canonical_migration(), exports_embedded_canonical_migration));
129843
+ const cmp = await compareEmbeddedVsCanonicalCounts2({ canonicalPort: 5432 });
129844
+ if (cmp.kind === "embedded-has-more") {
129787
129845
  return {
129788
129846
  id: "embedded-data-orphaned",
129789
129847
  level: "FAIL",
129790
- detail: `embedded dir at ${EMBEDDED_PGSERVE_DATA_DIR} holds data but canonical omni is empty \u2014 run \`omni doctor --fix\` to migrate`
129848
+ detail: `embedded has ${cmp.embeddedRows} rows in ${cmp.divergentTables.length} tables canonical lacks (${cmp.divergentTables.slice(0, 3).join(", ")}${cmp.divergentTables.length > 3 ? "\u2026" : ""}) \u2014 run \`omni doctor --fix\` to migrate`
129791
129849
  };
129792
129850
  }
129793
129851
  return {
129794
129852
  id: "embedded-data-orphaned",
129795
129853
  level: "OK",
129796
- detail: `canonical omni already has ${total} instance(s)`
129854
+ detail: cmp.kind === "in-sync" ? "embedded \u2194 canonical row counts match" : `compare unavailable: ${cmp.reason}`
129855
+ };
129856
+ } catch (err) {
129857
+ return {
129858
+ id: "embedded-data-orphaned",
129859
+ level: "OK",
129860
+ detail: `compare unavailable: ${err instanceof Error ? err.message : String(err)}`
129797
129861
  };
129798
- } catch {
129799
- return { id: "embedded-data-orphaned", level: "OK", detail: "health endpoint unreachable \u2014 defer" };
129800
129862
  }
129801
129863
  }
129802
129864
  async function fixEmbeddedDataOrphaned(_deps) {
@@ -70,6 +70,33 @@ export interface MigrateOptions {
70
70
  * so callers can present an actionable diagnostic without aborting the
71
71
  * larger --fix run.
72
72
  */
73
+ /**
74
+ * Result of comparing embedded vs canonical row counts. Used by the
75
+ * doctor `embedded-data-orphaned` check to detect partial migrations
76
+ * (e.g. Baileys re-attach copies instance rows but the bulk historical
77
+ * tables stay empty until the ETL runs).
78
+ */
79
+ export type CompareResult = {
80
+ kind: 'in-sync';
81
+ } | {
82
+ kind: 'embedded-has-more';
83
+ divergentTables: string[];
84
+ embeddedRows: number;
85
+ } | {
86
+ kind: 'skipped';
87
+ reason: string;
88
+ };
89
+ export interface CompareOptions {
90
+ canonicalPort?: number;
91
+ }
92
+ /**
93
+ * Count rows in every public table on both the embedded data dir and the
94
+ * canonical postmaster, return which tables have MORE rows on embedded.
95
+ * Boots a temp postmaster against the embedded dir (5s ready window),
96
+ * runs two count queries, shuts it down. Best-effort: any spawn / query
97
+ * failure returns `{ kind: 'skipped' }`.
98
+ */
99
+ export declare function compareEmbeddedVsCanonicalCounts(opts?: CompareOptions): Promise<CompareResult>;
73
100
  export declare function migrateUnmountedEmbeddedToCanonical(opts?: MigrateOptions): Promise<MigrationResult>;
74
101
  /** Re-export the constant so callers / tests can probe the same path. */
75
102
  export declare const EMBEDDED_PGSERVE_DATA_DIR: string;
@@ -1 +1 @@
1
- {"version":3,"file":"embedded-canonical-migration.d.ts","sourceRoot":"","sources":["../../src/lib/embedded-canonical-migration.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAgDG;AAWH,MAAM,MAAM,eAAe,GACvB;IAAE,MAAM,EAAE,UAAU,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,MAAM,CAAA;CAAE,GAC1D;IAAE,MAAM,EAAE,SAAS,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC;AAE1C,MAAM,WAAW,cAAc;IAC7B,2EAA2E;IAC3E,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,0EAA0E;IAC1E,GAAG,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;CAC9B;AA0MD;;;;;;;;GAQG;AACH,wBAAsB,mCAAmC,CAAC,IAAI,GAAE,cAAmB,GAAG,OAAO,CAAC,eAAe,CAAC,CA+D7G;AAED,yEAAyE;AACzE,eAAO,MAAM,yBAAyB,QAAe,CAAC"}
1
+ {"version":3,"file":"embedded-canonical-migration.d.ts","sourceRoot":"","sources":["../../src/lib/embedded-canonical-migration.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAgDG;AAWH,MAAM,MAAM,eAAe,GACvB;IAAE,MAAM,EAAE,UAAU,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,MAAM,CAAA;CAAE,GAC1D;IAAE,MAAM,EAAE,SAAS,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC;AAE1C,MAAM,WAAW,cAAc;IAC7B,2EAA2E;IAC3E,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,0EAA0E;IAC1E,GAAG,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;CAC9B;AA0MD;;;;;;;;GAQG;AACH;;;;;GAKG;AACH,MAAM,MAAM,aAAa,GACrB;IAAE,IAAI,EAAE,SAAS,CAAA;CAAE,GACnB;IAAE,IAAI,EAAE,mBAAmB,CAAC;IAAC,eAAe,EAAE,MAAM,EAAE,CAAC;IAAC,YAAY,EAAE,MAAM,CAAA;CAAE,GAC9E;IAAE,IAAI,EAAE,SAAS,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC;AAExC,MAAM,WAAW,cAAc;IAC7B,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAED;;;;;;GAMG;AACH,wBAAsB,gCAAgC,CAAC,IAAI,GAAE,cAAmB,GAAG,OAAO,CAAC,aAAa,CAAC,CAiDxG;AAED,wBAAsB,mCAAmC,CAAC,IAAI,GAAE,cAAmB,GAAG,OAAO,CAAC,eAAe,CAAC,CA+D7G;AAED,yEAAyE;AACzE,eAAO,MAAM,yBAAyB,QAAe,CAAC"}
@@ -230137,7 +230137,7 @@ var init_sentry_scrub = __esm(() => {
230137
230137
  var require_package8 = __commonJS((exports, module) => {
230138
230138
  module.exports = {
230139
230139
  name: "@omni/api",
230140
- version: "2.260520.15",
230140
+ version: "2.260520.16",
230141
230141
  type: "module",
230142
230142
  exports: {
230143
230143
  ".": {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@automagik/omni",
3
- "version": "2.260520.15",
3
+ "version": "2.260520.16",
4
4
  "description": "LLM-optimized CLI for Omni",
5
5
  "type": "module",
6
6
  "bin": {