@askexenow/exe-os 0.9.38 → 0.9.39

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 (69) hide show
  1. package/dist/bin/backfill-conversations.js +34 -7
  2. package/dist/bin/backfill-responses.js +34 -7
  3. package/dist/bin/backfill-vectors.js +34 -7
  4. package/dist/bin/cleanup-stale-review-tasks.js +35 -8
  5. package/dist/bin/cli.js +72 -42
  6. package/dist/bin/exe-agent.js +11 -3
  7. package/dist/bin/exe-assign.js +34 -7
  8. package/dist/bin/exe-boot.js +48 -18
  9. package/dist/bin/exe-call.js +132 -340
  10. package/dist/bin/exe-dispatch.js +34 -7
  11. package/dist/bin/exe-doctor.js +37 -10
  12. package/dist/bin/exe-export-behaviors.js +36 -9
  13. package/dist/bin/exe-forget.js +34 -7
  14. package/dist/bin/exe-gateway.js +40 -12
  15. package/dist/bin/exe-heartbeat.js +35 -8
  16. package/dist/bin/exe-kill.js +34 -7
  17. package/dist/bin/exe-launch-agent.js +285 -1079
  18. package/dist/bin/exe-new-employee.js +29 -10
  19. package/dist/bin/exe-pending-messages.js +34 -7
  20. package/dist/bin/exe-pending-notifications.js +34 -7
  21. package/dist/bin/exe-pending-reviews.js +34 -7
  22. package/dist/bin/exe-rename.js +41 -13
  23. package/dist/bin/exe-review.js +34 -7
  24. package/dist/bin/exe-search.js +36 -9
  25. package/dist/bin/exe-session-cleanup.js +36 -9
  26. package/dist/bin/exe-start-codex.js +36 -9
  27. package/dist/bin/exe-start-opencode.js +36 -9
  28. package/dist/bin/exe-status.js +35 -8
  29. package/dist/bin/exe-team.js +34 -7
  30. package/dist/bin/git-sweep.js +34 -7
  31. package/dist/bin/graph-backfill.js +34 -7
  32. package/dist/bin/graph-export.js +34 -7
  33. package/dist/bin/install.js +2 -1
  34. package/dist/bin/intercom-check.js +36 -9
  35. package/dist/bin/scan-tasks.js +34 -7
  36. package/dist/bin/setup.js +18 -17
  37. package/dist/bin/shard-migrate.js +34 -7
  38. package/dist/gateway/index.js +38 -10
  39. package/dist/hooks/bug-report-worker.js +38 -10
  40. package/dist/hooks/codex-stop-task-finalizer.js +36 -9
  41. package/dist/hooks/commit-complete.js +34 -7
  42. package/dist/hooks/error-recall.js +36 -9
  43. package/dist/hooks/ingest.js +36 -8
  44. package/dist/hooks/instructions-loaded.js +42 -10
  45. package/dist/hooks/notification.js +34 -7
  46. package/dist/hooks/post-compact.js +34 -7
  47. package/dist/hooks/post-tool-combined.js +37 -10
  48. package/dist/hooks/pre-compact.js +35 -8
  49. package/dist/hooks/pre-tool-use.js +36 -8
  50. package/dist/hooks/prompt-submit.js +41 -13
  51. package/dist/hooks/session-end.js +35 -8
  52. package/dist/hooks/session-start.js +47 -14
  53. package/dist/hooks/stop.js +35 -8
  54. package/dist/hooks/subagent-stop.js +34 -7
  55. package/dist/hooks/summary-worker.js +43 -16
  56. package/dist/index.js +36 -8
  57. package/dist/lib/consolidation.js +2 -1
  58. package/dist/lib/employee-templates.js +2 -1
  59. package/dist/lib/employees.js +2 -1
  60. package/dist/lib/exe-daemon.js +136 -36
  61. package/dist/lib/hybrid-search.js +36 -9
  62. package/dist/lib/identity.js +8 -3
  63. package/dist/lib/schedules.js +34 -7
  64. package/dist/lib/store.js +34 -7
  65. package/dist/mcp/server.js +133 -33
  66. package/dist/mcp/tools/create-task.js +10 -4
  67. package/dist/runtime/index.js +34 -7
  68. package/dist/tui/App.js +40 -11
  69. package/package.json +1 -1
@@ -3283,7 +3283,7 @@ __export(shard_manager_exports, {
3283
3283
  shardExists: () => shardExists
3284
3284
  });
3285
3285
  import path7 from "path";
3286
- import { existsSync as existsSync7, mkdirSync as mkdirSync2, readdirSync } from "fs";
3286
+ import { existsSync as existsSync7, mkdirSync as mkdirSync2, readdirSync, renameSync as renameSync3, statSync as statSync2 } from "fs";
3287
3287
  import { createClient as createClient2 } from "@libsql/client";
3288
3288
  function initShardManager(encryptionKey) {
3289
3289
  _encryptionKey = encryptionKey;
@@ -3305,7 +3305,7 @@ function getShardClient(projectName) {
3305
3305
  if (!_encryptionKey) {
3306
3306
  throw new Error("Shard manager not initialized. Call initShardManager() first.");
3307
3307
  }
3308
- const safeName = projectName.replace(/[^a-zA-Z0-9_-]/g, "_");
3308
+ const safeName = safeShardName(projectName);
3309
3309
  if (!safeName || safeName === "unknown") {
3310
3310
  throw new Error(`Invalid project name for shard: "${projectName}" (resolved to "${safeName}")`);
3311
3311
  }
@@ -3327,9 +3327,12 @@ function getShardClient(projectName) {
3327
3327
  return client;
3328
3328
  }
3329
3329
  function shardExists(projectName) {
3330
- const safeName = projectName.replace(/[^a-zA-Z0-9_-]/g, "_");
3330
+ const safeName = safeShardName(projectName);
3331
3331
  return existsSync7(path7.join(SHARDS_DIR, `${safeName}.db`));
3332
3332
  }
3333
+ function safeShardName(projectName) {
3334
+ return projectName.replace(/[^a-zA-Z0-9_-]/g, "_");
3335
+ }
3333
3336
  function listShards() {
3334
3337
  if (!existsSync7(SHARDS_DIR)) return [];
3335
3338
  return readdirSync(SHARDS_DIR).filter((f) => f.endsWith(".db")).map((f) => f.replace(".db", ""));
@@ -3423,7 +3426,8 @@ async function ensureShardSchema(client) {
3423
3426
  "ALTER TABLE memories ADD COLUMN token_cost REAL",
3424
3427
  "ALTER TABLE memories ADD COLUMN audience TEXT",
3425
3428
  "ALTER TABLE memories ADD COLUMN language_type TEXT",
3426
- "ALTER TABLE memories ADD COLUMN parent_memory_id TEXT"
3429
+ "ALTER TABLE memories ADD COLUMN parent_memory_id TEXT",
3430
+ "ALTER TABLE memories ADD COLUMN deleted_at TEXT"
3427
3431
  ]) {
3428
3432
  try {
3429
3433
  await client.execute(col);
@@ -3519,9 +3523,32 @@ async function ensureShardSchema(client) {
3519
3523
  }
3520
3524
  }
3521
3525
  async function getReadyShardClient(projectName) {
3522
- const client = getShardClient(projectName);
3523
- await ensureShardSchema(client);
3524
- return client;
3526
+ const safeName = safeShardName(projectName);
3527
+ let client = getShardClient(projectName);
3528
+ try {
3529
+ await ensureShardSchema(client);
3530
+ return client;
3531
+ } catch (err) {
3532
+ const message = err instanceof Error ? err.message : String(err);
3533
+ if (!/SQLITE_NOTADB|file is not a database/i.test(message)) throw err;
3534
+ client.close();
3535
+ _shards.delete(safeName);
3536
+ _shardLastAccess.delete(safeName);
3537
+ const dbPath = path7.join(SHARDS_DIR, `${safeName}.db`);
3538
+ if (existsSync7(dbPath)) {
3539
+ const stat = statSync2(dbPath);
3540
+ const stamp = (/* @__PURE__ */ new Date()).toISOString().replace(/[:.]/g, "-");
3541
+ const archivedPath = path7.join(SHARDS_DIR, `${safeName}.db.broken-${stamp}`);
3542
+ renameSync3(dbPath, archivedPath);
3543
+ process.stderr.write(
3544
+ `[shard-manager] Archived unreadable shard ${safeName}: ${archivedPath} (${stat.size} bytes, mtime ${stat.mtime.toISOString()})
3545
+ `
3546
+ );
3547
+ }
3548
+ client = getShardClient(projectName);
3549
+ await ensureShardSchema(client);
3550
+ return client;
3551
+ }
3525
3552
  }
3526
3553
  function evictLRU() {
3527
3554
  let oldest = null;
@@ -4816,7 +4843,7 @@ __export(intercom_queue_exports, {
4816
4843
  queueIntercom: () => queueIntercom,
4817
4844
  readQueue: () => readQueue
4818
4845
  });
4819
- import { readFileSync as readFileSync7, writeFileSync as writeFileSync5, renameSync as renameSync3, existsSync as existsSync10, mkdirSync as mkdirSync4 } from "fs";
4846
+ import { readFileSync as readFileSync7, writeFileSync as writeFileSync5, renameSync as renameSync4, existsSync as existsSync10, mkdirSync as mkdirSync4 } from "fs";
4820
4847
  import path10 from "path";
4821
4848
  import os7 from "os";
4822
4849
  function ensureDir() {
@@ -4835,7 +4862,7 @@ function writeQueue(queue) {
4835
4862
  ensureDir();
4836
4863
  const tmp = `${QUEUE_PATH}.tmp`;
4837
4864
  writeFileSync5(tmp, JSON.stringify(queue, null, 2));
4838
- renameSync3(tmp, QUEUE_PATH);
4865
+ renameSync4(tmp, QUEUE_PATH);
4839
4866
  }
4840
4867
  function queueIntercom(targetSession, reason) {
4841
4868
  const queue = readQueue();
@@ -2678,7 +2678,7 @@ __export(shard_manager_exports, {
2678
2678
  shardExists: () => shardExists
2679
2679
  });
2680
2680
  import path7 from "path";
2681
- import { existsSync as existsSync7, mkdirSync as mkdirSync2, readdirSync } from "fs";
2681
+ import { existsSync as existsSync7, mkdirSync as mkdirSync2, readdirSync, renameSync as renameSync3, statSync as statSync2 } from "fs";
2682
2682
  import { createClient as createClient2 } from "@libsql/client";
2683
2683
  function initShardManager(encryptionKey) {
2684
2684
  _encryptionKey = encryptionKey;
@@ -2700,7 +2700,7 @@ function getShardClient(projectName) {
2700
2700
  if (!_encryptionKey) {
2701
2701
  throw new Error("Shard manager not initialized. Call initShardManager() first.");
2702
2702
  }
2703
- const safeName = projectName.replace(/[^a-zA-Z0-9_-]/g, "_");
2703
+ const safeName = safeShardName(projectName);
2704
2704
  if (!safeName || safeName === "unknown") {
2705
2705
  throw new Error(`Invalid project name for shard: "${projectName}" (resolved to "${safeName}")`);
2706
2706
  }
@@ -2722,9 +2722,12 @@ function getShardClient(projectName) {
2722
2722
  return client;
2723
2723
  }
2724
2724
  function shardExists(projectName) {
2725
- const safeName = projectName.replace(/[^a-zA-Z0-9_-]/g, "_");
2725
+ const safeName = safeShardName(projectName);
2726
2726
  return existsSync7(path7.join(SHARDS_DIR, `${safeName}.db`));
2727
2727
  }
2728
+ function safeShardName(projectName) {
2729
+ return projectName.replace(/[^a-zA-Z0-9_-]/g, "_");
2730
+ }
2728
2731
  function listShards() {
2729
2732
  if (!existsSync7(SHARDS_DIR)) return [];
2730
2733
  return readdirSync(SHARDS_DIR).filter((f) => f.endsWith(".db")).map((f) => f.replace(".db", ""));
@@ -2818,7 +2821,8 @@ async function ensureShardSchema(client) {
2818
2821
  "ALTER TABLE memories ADD COLUMN token_cost REAL",
2819
2822
  "ALTER TABLE memories ADD COLUMN audience TEXT",
2820
2823
  "ALTER TABLE memories ADD COLUMN language_type TEXT",
2821
- "ALTER TABLE memories ADD COLUMN parent_memory_id TEXT"
2824
+ "ALTER TABLE memories ADD COLUMN parent_memory_id TEXT",
2825
+ "ALTER TABLE memories ADD COLUMN deleted_at TEXT"
2822
2826
  ]) {
2823
2827
  try {
2824
2828
  await client.execute(col);
@@ -2914,9 +2918,32 @@ async function ensureShardSchema(client) {
2914
2918
  }
2915
2919
  }
2916
2920
  async function getReadyShardClient(projectName) {
2917
- const client = getShardClient(projectName);
2918
- await ensureShardSchema(client);
2919
- return client;
2921
+ const safeName = safeShardName(projectName);
2922
+ let client = getShardClient(projectName);
2923
+ try {
2924
+ await ensureShardSchema(client);
2925
+ return client;
2926
+ } catch (err) {
2927
+ const message = err instanceof Error ? err.message : String(err);
2928
+ if (!/SQLITE_NOTADB|file is not a database/i.test(message)) throw err;
2929
+ client.close();
2930
+ _shards.delete(safeName);
2931
+ _shardLastAccess.delete(safeName);
2932
+ const dbPath = path7.join(SHARDS_DIR, `${safeName}.db`);
2933
+ if (existsSync7(dbPath)) {
2934
+ const stat = statSync2(dbPath);
2935
+ const stamp = (/* @__PURE__ */ new Date()).toISOString().replace(/[:.]/g, "-");
2936
+ const archivedPath = path7.join(SHARDS_DIR, `${safeName}.db.broken-${stamp}`);
2937
+ renameSync3(dbPath, archivedPath);
2938
+ process.stderr.write(
2939
+ `[shard-manager] Archived unreadable shard ${safeName}: ${archivedPath} (${stat.size} bytes, mtime ${stat.mtime.toISOString()})
2940
+ `
2941
+ );
2942
+ }
2943
+ client = getShardClient(projectName);
2944
+ await ensureShardSchema(client);
2945
+ return client;
2946
+ }
2920
2947
  }
2921
2948
  function evictLRU() {
2922
2949
  let oldest = null;
@@ -4619,7 +4646,7 @@ import {
4619
4646
  existsSync as existsSync8,
4620
4647
  mkdirSync as mkdirSync3,
4621
4648
  readdirSync as readdirSync2,
4622
- statSync as statSync2,
4649
+ statSync as statSync3,
4623
4650
  unlinkSync as unlinkSync3,
4624
4651
  writeFileSync as writeFileSync3
4625
4652
  } from "fs";
@@ -4684,7 +4711,7 @@ function sweepStaleBehaviorExports(now = Date.now()) {
4684
4711
  for (const entry of entries) {
4685
4712
  const filePath = path8.join(BEHAVIORS_EXPORT_DIR, entry);
4686
4713
  try {
4687
- const stat = statSync2(filePath);
4714
+ const stat = statSync3(filePath);
4688
4715
  if (now - stat.mtimeMs > STALE_EXPORT_AGE_MS) {
4689
4716
  unlinkSync3(filePath);
4690
4717
  }
@@ -2678,7 +2678,7 @@ __export(shard_manager_exports, {
2678
2678
  shardExists: () => shardExists
2679
2679
  });
2680
2680
  import path7 from "path";
2681
- import { existsSync as existsSync7, mkdirSync as mkdirSync2, readdirSync } from "fs";
2681
+ import { existsSync as existsSync7, mkdirSync as mkdirSync2, readdirSync, renameSync as renameSync3, statSync as statSync2 } from "fs";
2682
2682
  import { createClient as createClient2 } from "@libsql/client";
2683
2683
  function initShardManager(encryptionKey) {
2684
2684
  _encryptionKey = encryptionKey;
@@ -2700,7 +2700,7 @@ function getShardClient(projectName) {
2700
2700
  if (!_encryptionKey) {
2701
2701
  throw new Error("Shard manager not initialized. Call initShardManager() first.");
2702
2702
  }
2703
- const safeName = projectName.replace(/[^a-zA-Z0-9_-]/g, "_");
2703
+ const safeName = safeShardName(projectName);
2704
2704
  if (!safeName || safeName === "unknown") {
2705
2705
  throw new Error(`Invalid project name for shard: "${projectName}" (resolved to "${safeName}")`);
2706
2706
  }
@@ -2722,9 +2722,12 @@ function getShardClient(projectName) {
2722
2722
  return client;
2723
2723
  }
2724
2724
  function shardExists(projectName) {
2725
- const safeName = projectName.replace(/[^a-zA-Z0-9_-]/g, "_");
2725
+ const safeName = safeShardName(projectName);
2726
2726
  return existsSync7(path7.join(SHARDS_DIR, `${safeName}.db`));
2727
2727
  }
2728
+ function safeShardName(projectName) {
2729
+ return projectName.replace(/[^a-zA-Z0-9_-]/g, "_");
2730
+ }
2728
2731
  function listShards() {
2729
2732
  if (!existsSync7(SHARDS_DIR)) return [];
2730
2733
  return readdirSync(SHARDS_DIR).filter((f) => f.endsWith(".db")).map((f) => f.replace(".db", ""));
@@ -2818,7 +2821,8 @@ async function ensureShardSchema(client) {
2818
2821
  "ALTER TABLE memories ADD COLUMN token_cost REAL",
2819
2822
  "ALTER TABLE memories ADD COLUMN audience TEXT",
2820
2823
  "ALTER TABLE memories ADD COLUMN language_type TEXT",
2821
- "ALTER TABLE memories ADD COLUMN parent_memory_id TEXT"
2824
+ "ALTER TABLE memories ADD COLUMN parent_memory_id TEXT",
2825
+ "ALTER TABLE memories ADD COLUMN deleted_at TEXT"
2822
2826
  ]) {
2823
2827
  try {
2824
2828
  await client.execute(col);
@@ -2914,9 +2918,32 @@ async function ensureShardSchema(client) {
2914
2918
  }
2915
2919
  }
2916
2920
  async function getReadyShardClient(projectName) {
2917
- const client = getShardClient(projectName);
2918
- await ensureShardSchema(client);
2919
- return client;
2921
+ const safeName = safeShardName(projectName);
2922
+ let client = getShardClient(projectName);
2923
+ try {
2924
+ await ensureShardSchema(client);
2925
+ return client;
2926
+ } catch (err) {
2927
+ const message = err instanceof Error ? err.message : String(err);
2928
+ if (!/SQLITE_NOTADB|file is not a database/i.test(message)) throw err;
2929
+ client.close();
2930
+ _shards.delete(safeName);
2931
+ _shardLastAccess.delete(safeName);
2932
+ const dbPath = path7.join(SHARDS_DIR, `${safeName}.db`);
2933
+ if (existsSync7(dbPath)) {
2934
+ const stat = statSync2(dbPath);
2935
+ const stamp = (/* @__PURE__ */ new Date()).toISOString().replace(/[:.]/g, "-");
2936
+ const archivedPath = path7.join(SHARDS_DIR, `${safeName}.db.broken-${stamp}`);
2937
+ renameSync3(dbPath, archivedPath);
2938
+ process.stderr.write(
2939
+ `[shard-manager] Archived unreadable shard ${safeName}: ${archivedPath} (${stat.size} bytes, mtime ${stat.mtime.toISOString()})
2940
+ `
2941
+ );
2942
+ }
2943
+ client = getShardClient(projectName);
2944
+ await ensureShardSchema(client);
2945
+ return client;
2946
+ }
2920
2947
  }
2921
2948
  function evictLRU() {
2922
2949
  let oldest = null;
@@ -4484,7 +4511,7 @@ import {
4484
4511
  existsSync as existsSync8,
4485
4512
  mkdirSync as mkdirSync3,
4486
4513
  readdirSync as readdirSync2,
4487
- statSync as statSync2,
4514
+ statSync as statSync3,
4488
4515
  unlinkSync as unlinkSync3,
4489
4516
  writeFileSync as writeFileSync3
4490
4517
  } from "fs";
@@ -4549,7 +4576,7 @@ function sweepStaleBehaviorExports(now = Date.now()) {
4549
4576
  for (const entry of entries) {
4550
4577
  const filePath = path8.join(BEHAVIORS_EXPORT_DIR, entry);
4551
4578
  try {
4552
- const stat = statSync2(filePath);
4579
+ const stat = statSync3(filePath);
4553
4580
  if (now - stat.mtimeMs > STALE_EXPORT_AGE_MS) {
4554
4581
  unlinkSync3(filePath);
4555
4582
  }
@@ -3272,7 +3272,7 @@ __export(shard_manager_exports, {
3272
3272
  shardExists: () => shardExists
3273
3273
  });
3274
3274
  import path7 from "path";
3275
- import { existsSync as existsSync7, mkdirSync as mkdirSync2, readdirSync } from "fs";
3275
+ import { existsSync as existsSync7, mkdirSync as mkdirSync2, readdirSync, renameSync as renameSync3, statSync as statSync2 } from "fs";
3276
3276
  import { createClient as createClient2 } from "@libsql/client";
3277
3277
  function initShardManager(encryptionKey) {
3278
3278
  _encryptionKey = encryptionKey;
@@ -3294,7 +3294,7 @@ function getShardClient(projectName) {
3294
3294
  if (!_encryptionKey) {
3295
3295
  throw new Error("Shard manager not initialized. Call initShardManager() first.");
3296
3296
  }
3297
- const safeName = projectName.replace(/[^a-zA-Z0-9_-]/g, "_");
3297
+ const safeName = safeShardName(projectName);
3298
3298
  if (!safeName || safeName === "unknown") {
3299
3299
  throw new Error(`Invalid project name for shard: "${projectName}" (resolved to "${safeName}")`);
3300
3300
  }
@@ -3316,9 +3316,12 @@ function getShardClient(projectName) {
3316
3316
  return client;
3317
3317
  }
3318
3318
  function shardExists(projectName) {
3319
- const safeName = projectName.replace(/[^a-zA-Z0-9_-]/g, "_");
3319
+ const safeName = safeShardName(projectName);
3320
3320
  return existsSync7(path7.join(SHARDS_DIR, `${safeName}.db`));
3321
3321
  }
3322
+ function safeShardName(projectName) {
3323
+ return projectName.replace(/[^a-zA-Z0-9_-]/g, "_");
3324
+ }
3322
3325
  function listShards() {
3323
3326
  if (!existsSync7(SHARDS_DIR)) return [];
3324
3327
  return readdirSync(SHARDS_DIR).filter((f) => f.endsWith(".db")).map((f) => f.replace(".db", ""));
@@ -3412,7 +3415,8 @@ async function ensureShardSchema(client) {
3412
3415
  "ALTER TABLE memories ADD COLUMN token_cost REAL",
3413
3416
  "ALTER TABLE memories ADD COLUMN audience TEXT",
3414
3417
  "ALTER TABLE memories ADD COLUMN language_type TEXT",
3415
- "ALTER TABLE memories ADD COLUMN parent_memory_id TEXT"
3418
+ "ALTER TABLE memories ADD COLUMN parent_memory_id TEXT",
3419
+ "ALTER TABLE memories ADD COLUMN deleted_at TEXT"
3416
3420
  ]) {
3417
3421
  try {
3418
3422
  await client.execute(col);
@@ -3508,9 +3512,32 @@ async function ensureShardSchema(client) {
3508
3512
  }
3509
3513
  }
3510
3514
  async function getReadyShardClient(projectName) {
3511
- const client = getShardClient(projectName);
3512
- await ensureShardSchema(client);
3513
- return client;
3515
+ const safeName = safeShardName(projectName);
3516
+ let client = getShardClient(projectName);
3517
+ try {
3518
+ await ensureShardSchema(client);
3519
+ return client;
3520
+ } catch (err) {
3521
+ const message = err instanceof Error ? err.message : String(err);
3522
+ if (!/SQLITE_NOTADB|file is not a database/i.test(message)) throw err;
3523
+ client.close();
3524
+ _shards.delete(safeName);
3525
+ _shardLastAccess.delete(safeName);
3526
+ const dbPath = path7.join(SHARDS_DIR, `${safeName}.db`);
3527
+ if (existsSync7(dbPath)) {
3528
+ const stat = statSync2(dbPath);
3529
+ const stamp = (/* @__PURE__ */ new Date()).toISOString().replace(/[:.]/g, "-");
3530
+ const archivedPath = path7.join(SHARDS_DIR, `${safeName}.db.broken-${stamp}`);
3531
+ renameSync3(dbPath, archivedPath);
3532
+ process.stderr.write(
3533
+ `[shard-manager] Archived unreadable shard ${safeName}: ${archivedPath} (${stat.size} bytes, mtime ${stat.mtime.toISOString()})
3534
+ `
3535
+ );
3536
+ }
3537
+ client = getShardClient(projectName);
3538
+ await ensureShardSchema(client);
3539
+ return client;
3540
+ }
3514
3541
  }
3515
3542
  function evictLRU() {
3516
3543
  let oldest = null;
@@ -4713,7 +4740,7 @@ var init_agent_config = __esm({
4713
4740
  });
4714
4741
 
4715
4742
  // src/lib/intercom-queue.ts
4716
- import { readFileSync as readFileSync6, writeFileSync as writeFileSync4, renameSync as renameSync3, existsSync as existsSync9, mkdirSync as mkdirSync3 } from "fs";
4743
+ import { readFileSync as readFileSync6, writeFileSync as writeFileSync4, renameSync as renameSync4, existsSync as existsSync9, mkdirSync as mkdirSync3 } from "fs";
4717
4744
  import path10 from "path";
4718
4745
  import os7 from "os";
4719
4746
  var QUEUE_PATH, TTL_MS, INTERCOM_LOG;
@@ -3261,7 +3261,7 @@ __export(shard_manager_exports, {
3261
3261
  shardExists: () => shardExists
3262
3262
  });
3263
3263
  import path7 from "path";
3264
- import { existsSync as existsSync7, mkdirSync as mkdirSync2, readdirSync } from "fs";
3264
+ import { existsSync as existsSync7, mkdirSync as mkdirSync2, readdirSync, renameSync as renameSync3, statSync as statSync2 } from "fs";
3265
3265
  import { createClient as createClient2 } from "@libsql/client";
3266
3266
  function initShardManager(encryptionKey) {
3267
3267
  _encryptionKey = encryptionKey;
@@ -3283,7 +3283,7 @@ function getShardClient(projectName) {
3283
3283
  if (!_encryptionKey) {
3284
3284
  throw new Error("Shard manager not initialized. Call initShardManager() first.");
3285
3285
  }
3286
- const safeName = projectName.replace(/[^a-zA-Z0-9_-]/g, "_");
3286
+ const safeName = safeShardName(projectName);
3287
3287
  if (!safeName || safeName === "unknown") {
3288
3288
  throw new Error(`Invalid project name for shard: "${projectName}" (resolved to "${safeName}")`);
3289
3289
  }
@@ -3305,9 +3305,12 @@ function getShardClient(projectName) {
3305
3305
  return client;
3306
3306
  }
3307
3307
  function shardExists(projectName) {
3308
- const safeName = projectName.replace(/[^a-zA-Z0-9_-]/g, "_");
3308
+ const safeName = safeShardName(projectName);
3309
3309
  return existsSync7(path7.join(SHARDS_DIR, `${safeName}.db`));
3310
3310
  }
3311
+ function safeShardName(projectName) {
3312
+ return projectName.replace(/[^a-zA-Z0-9_-]/g, "_");
3313
+ }
3311
3314
  function listShards() {
3312
3315
  if (!existsSync7(SHARDS_DIR)) return [];
3313
3316
  return readdirSync(SHARDS_DIR).filter((f) => f.endsWith(".db")).map((f) => f.replace(".db", ""));
@@ -3401,7 +3404,8 @@ async function ensureShardSchema(client) {
3401
3404
  "ALTER TABLE memories ADD COLUMN token_cost REAL",
3402
3405
  "ALTER TABLE memories ADD COLUMN audience TEXT",
3403
3406
  "ALTER TABLE memories ADD COLUMN language_type TEXT",
3404
- "ALTER TABLE memories ADD COLUMN parent_memory_id TEXT"
3407
+ "ALTER TABLE memories ADD COLUMN parent_memory_id TEXT",
3408
+ "ALTER TABLE memories ADD COLUMN deleted_at TEXT"
3405
3409
  ]) {
3406
3410
  try {
3407
3411
  await client.execute(col);
@@ -3497,9 +3501,32 @@ async function ensureShardSchema(client) {
3497
3501
  }
3498
3502
  }
3499
3503
  async function getReadyShardClient(projectName) {
3500
- const client = getShardClient(projectName);
3501
- await ensureShardSchema(client);
3502
- return client;
3504
+ const safeName = safeShardName(projectName);
3505
+ let client = getShardClient(projectName);
3506
+ try {
3507
+ await ensureShardSchema(client);
3508
+ return client;
3509
+ } catch (err) {
3510
+ const message = err instanceof Error ? err.message : String(err);
3511
+ if (!/SQLITE_NOTADB|file is not a database/i.test(message)) throw err;
3512
+ client.close();
3513
+ _shards.delete(safeName);
3514
+ _shardLastAccess.delete(safeName);
3515
+ const dbPath = path7.join(SHARDS_DIR, `${safeName}.db`);
3516
+ if (existsSync7(dbPath)) {
3517
+ const stat = statSync2(dbPath);
3518
+ const stamp = (/* @__PURE__ */ new Date()).toISOString().replace(/[:.]/g, "-");
3519
+ const archivedPath = path7.join(SHARDS_DIR, `${safeName}.db.broken-${stamp}`);
3520
+ renameSync3(dbPath, archivedPath);
3521
+ process.stderr.write(
3522
+ `[shard-manager] Archived unreadable shard ${safeName}: ${archivedPath} (${stat.size} bytes, mtime ${stat.mtime.toISOString()})
3523
+ `
3524
+ );
3525
+ }
3526
+ client = getShardClient(projectName);
3527
+ await ensureShardSchema(client);
3528
+ return client;
3529
+ }
3503
3530
  }
3504
3531
  function evictLRU() {
3505
3532
  let oldest = null;
@@ -6884,7 +6884,7 @@ __export(shard_manager_exports, {
6884
6884
  shardExists: () => shardExists
6885
6885
  });
6886
6886
  import path19 from "path";
6887
- import { existsSync as existsSync16, mkdirSync as mkdirSync7, readdirSync as readdirSync4 } from "fs";
6887
+ import { existsSync as existsSync16, mkdirSync as mkdirSync7, readdirSync as readdirSync4, renameSync as renameSync4, statSync as statSync2 } from "fs";
6888
6888
  import { createClient as createClient2 } from "@libsql/client";
6889
6889
  function initShardManager(encryptionKey) {
6890
6890
  _encryptionKey = encryptionKey;
@@ -6906,7 +6906,7 @@ function getShardClient(projectName2) {
6906
6906
  if (!_encryptionKey) {
6907
6907
  throw new Error("Shard manager not initialized. Call initShardManager() first.");
6908
6908
  }
6909
- const safeName = projectName2.replace(/[^a-zA-Z0-9_-]/g, "_");
6909
+ const safeName = safeShardName(projectName2);
6910
6910
  if (!safeName || safeName === "unknown") {
6911
6911
  throw new Error(`Invalid project name for shard: "${projectName2}" (resolved to "${safeName}")`);
6912
6912
  }
@@ -6928,9 +6928,12 @@ function getShardClient(projectName2) {
6928
6928
  return client;
6929
6929
  }
6930
6930
  function shardExists(projectName2) {
6931
- const safeName = projectName2.replace(/[^a-zA-Z0-9_-]/g, "_");
6931
+ const safeName = safeShardName(projectName2);
6932
6932
  return existsSync16(path19.join(SHARDS_DIR, `${safeName}.db`));
6933
6933
  }
6934
+ function safeShardName(projectName2) {
6935
+ return projectName2.replace(/[^a-zA-Z0-9_-]/g, "_");
6936
+ }
6934
6937
  function listShards() {
6935
6938
  if (!existsSync16(SHARDS_DIR)) return [];
6936
6939
  return readdirSync4(SHARDS_DIR).filter((f) => f.endsWith(".db")).map((f) => f.replace(".db", ""));
@@ -7024,7 +7027,8 @@ async function ensureShardSchema(client) {
7024
7027
  "ALTER TABLE memories ADD COLUMN token_cost REAL",
7025
7028
  "ALTER TABLE memories ADD COLUMN audience TEXT",
7026
7029
  "ALTER TABLE memories ADD COLUMN language_type TEXT",
7027
- "ALTER TABLE memories ADD COLUMN parent_memory_id TEXT"
7030
+ "ALTER TABLE memories ADD COLUMN parent_memory_id TEXT",
7031
+ "ALTER TABLE memories ADD COLUMN deleted_at TEXT"
7028
7032
  ]) {
7029
7033
  try {
7030
7034
  await client.execute(col);
@@ -7120,9 +7124,32 @@ async function ensureShardSchema(client) {
7120
7124
  }
7121
7125
  }
7122
7126
  async function getReadyShardClient(projectName2) {
7123
- const client = getShardClient(projectName2);
7124
- await ensureShardSchema(client);
7125
- return client;
7127
+ const safeName = safeShardName(projectName2);
7128
+ let client = getShardClient(projectName2);
7129
+ try {
7130
+ await ensureShardSchema(client);
7131
+ return client;
7132
+ } catch (err) {
7133
+ const message = err instanceof Error ? err.message : String(err);
7134
+ if (!/SQLITE_NOTADB|file is not a database/i.test(message)) throw err;
7135
+ client.close();
7136
+ _shards.delete(safeName);
7137
+ _shardLastAccess.delete(safeName);
7138
+ const dbPath = path19.join(SHARDS_DIR, `${safeName}.db`);
7139
+ if (existsSync16(dbPath)) {
7140
+ const stat = statSync2(dbPath);
7141
+ const stamp = (/* @__PURE__ */ new Date()).toISOString().replace(/[:.]/g, "-");
7142
+ const archivedPath = path19.join(SHARDS_DIR, `${safeName}.db.broken-${stamp}`);
7143
+ renameSync4(dbPath, archivedPath);
7144
+ process.stderr.write(
7145
+ `[shard-manager] Archived unreadable shard ${safeName}: ${archivedPath} (${stat.size} bytes, mtime ${stat.mtime.toISOString()})
7146
+ `
7147
+ );
7148
+ }
7149
+ client = getShardClient(projectName2);
7150
+ await ensureShardSchema(client);
7151
+ return client;
7152
+ }
7126
7153
  }
7127
7154
  function evictLRU() {
7128
7155
  let oldest = null;
@@ -2601,7 +2601,7 @@ __export(shard_manager_exports, {
2601
2601
  shardExists: () => shardExists
2602
2602
  });
2603
2603
  import path7 from "path";
2604
- import { existsSync as existsSync7, mkdirSync as mkdirSync2, readdirSync } from "fs";
2604
+ import { existsSync as existsSync7, mkdirSync as mkdirSync2, readdirSync, renameSync as renameSync3, statSync as statSync2 } from "fs";
2605
2605
  import { createClient as createClient2 } from "@libsql/client";
2606
2606
  function initShardManager(encryptionKey) {
2607
2607
  _encryptionKey = encryptionKey;
@@ -2623,7 +2623,7 @@ function getShardClient(projectName) {
2623
2623
  if (!_encryptionKey) {
2624
2624
  throw new Error("Shard manager not initialized. Call initShardManager() first.");
2625
2625
  }
2626
- const safeName = projectName.replace(/[^a-zA-Z0-9_-]/g, "_");
2626
+ const safeName = safeShardName(projectName);
2627
2627
  if (!safeName || safeName === "unknown") {
2628
2628
  throw new Error(`Invalid project name for shard: "${projectName}" (resolved to "${safeName}")`);
2629
2629
  }
@@ -2645,9 +2645,12 @@ function getShardClient(projectName) {
2645
2645
  return client;
2646
2646
  }
2647
2647
  function shardExists(projectName) {
2648
- const safeName = projectName.replace(/[^a-zA-Z0-9_-]/g, "_");
2648
+ const safeName = safeShardName(projectName);
2649
2649
  return existsSync7(path7.join(SHARDS_DIR, `${safeName}.db`));
2650
2650
  }
2651
+ function safeShardName(projectName) {
2652
+ return projectName.replace(/[^a-zA-Z0-9_-]/g, "_");
2653
+ }
2651
2654
  function listShards() {
2652
2655
  if (!existsSync7(SHARDS_DIR)) return [];
2653
2656
  return readdirSync(SHARDS_DIR).filter((f) => f.endsWith(".db")).map((f) => f.replace(".db", ""));
@@ -2741,7 +2744,8 @@ async function ensureShardSchema(client) {
2741
2744
  "ALTER TABLE memories ADD COLUMN token_cost REAL",
2742
2745
  "ALTER TABLE memories ADD COLUMN audience TEXT",
2743
2746
  "ALTER TABLE memories ADD COLUMN language_type TEXT",
2744
- "ALTER TABLE memories ADD COLUMN parent_memory_id TEXT"
2747
+ "ALTER TABLE memories ADD COLUMN parent_memory_id TEXT",
2748
+ "ALTER TABLE memories ADD COLUMN deleted_at TEXT"
2745
2749
  ]) {
2746
2750
  try {
2747
2751
  await client.execute(col);
@@ -2837,9 +2841,32 @@ async function ensureShardSchema(client) {
2837
2841
  }
2838
2842
  }
2839
2843
  async function getReadyShardClient(projectName) {
2840
- const client = getShardClient(projectName);
2841
- await ensureShardSchema(client);
2842
- return client;
2844
+ const safeName = safeShardName(projectName);
2845
+ let client = getShardClient(projectName);
2846
+ try {
2847
+ await ensureShardSchema(client);
2848
+ return client;
2849
+ } catch (err) {
2850
+ const message = err instanceof Error ? err.message : String(err);
2851
+ if (!/SQLITE_NOTADB|file is not a database/i.test(message)) throw err;
2852
+ client.close();
2853
+ _shards.delete(safeName);
2854
+ _shardLastAccess.delete(safeName);
2855
+ const dbPath = path7.join(SHARDS_DIR, `${safeName}.db`);
2856
+ if (existsSync7(dbPath)) {
2857
+ const stat = statSync2(dbPath);
2858
+ const stamp = (/* @__PURE__ */ new Date()).toISOString().replace(/[:.]/g, "-");
2859
+ const archivedPath = path7.join(SHARDS_DIR, `${safeName}.db.broken-${stamp}`);
2860
+ renameSync3(dbPath, archivedPath);
2861
+ process.stderr.write(
2862
+ `[shard-manager] Archived unreadable shard ${safeName}: ${archivedPath} (${stat.size} bytes, mtime ${stat.mtime.toISOString()})
2863
+ `
2864
+ );
2865
+ }
2866
+ client = getShardClient(projectName);
2867
+ await ensureShardSchema(client);
2868
+ return client;
2869
+ }
2843
2870
  }
2844
2871
  function evictLRU() {
2845
2872
  let oldest = null;