@askexenow/exe-os 0.9.60 → 0.9.62

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 (106) hide show
  1. package/deploy/stack-manifests/v0.9.json +62 -13
  2. package/dist/bin/backfill-conversations.js +282 -7
  3. package/dist/bin/backfill-responses.js +282 -7
  4. package/dist/bin/backfill-vectors.js +119 -7
  5. package/dist/bin/cc-doctor.js +376 -0
  6. package/dist/bin/cleanup-stale-review-tasks.js +282 -7
  7. package/dist/bin/cli.js +455 -77
  8. package/dist/bin/customer-readiness.js +33 -0
  9. package/dist/bin/exe-agent-config.js +2 -2
  10. package/dist/bin/exe-agent.js +3 -3
  11. package/dist/bin/exe-assign.js +282 -7
  12. package/dist/bin/exe-boot.js +125 -13
  13. package/dist/bin/exe-call.js +3 -3
  14. package/dist/bin/exe-cloud.js +2 -2
  15. package/dist/bin/exe-dispatch.js +282 -7
  16. package/dist/bin/exe-doctor.js +119 -7
  17. package/dist/bin/exe-export-behaviors.js +282 -7
  18. package/dist/bin/exe-forget.js +336 -7
  19. package/dist/bin/exe-gateway.js +282 -7
  20. package/dist/bin/exe-heartbeat.js +284 -9
  21. package/dist/bin/exe-kill.js +282 -7
  22. package/dist/bin/exe-launch-agent.js +282 -7
  23. package/dist/bin/exe-link.js +121 -9
  24. package/dist/bin/exe-new-employee.js +50 -21
  25. package/dist/bin/exe-pending-messages.js +282 -7
  26. package/dist/bin/exe-pending-notifications.js +282 -7
  27. package/dist/bin/exe-pending-reviews.js +282 -7
  28. package/dist/bin/exe-rename.js +282 -7
  29. package/dist/bin/exe-review.js +282 -7
  30. package/dist/bin/exe-search.js +306 -8
  31. package/dist/bin/exe-session-cleanup.js +282 -7
  32. package/dist/bin/exe-settings.js +2 -2
  33. package/dist/bin/exe-start-codex.js +326 -21
  34. package/dist/bin/exe-start-opencode.js +304 -10
  35. package/dist/bin/exe-status.js +282 -7
  36. package/dist/bin/exe-team.js +282 -7
  37. package/dist/bin/git-sweep.js +282 -7
  38. package/dist/bin/graph-backfill.js +282 -7
  39. package/dist/bin/graph-export.js +282 -7
  40. package/dist/bin/install.js +58 -33
  41. package/dist/bin/intercom-check.js +282 -7
  42. package/dist/bin/pre-build-guard.js +98 -0
  43. package/dist/bin/scan-tasks.js +282 -7
  44. package/dist/bin/setup.js +122 -10
  45. package/dist/bin/shard-migrate.js +282 -7
  46. package/dist/bin/stack-update.js +79 -11
  47. package/dist/bin/update.js +2 -2
  48. package/dist/gateway/index.js +288 -13
  49. package/dist/hooks/bug-report-worker.js +282 -7
  50. package/dist/hooks/codex-stop-task-finalizer.js +282 -7
  51. package/dist/hooks/commit-complete.js +282 -7
  52. package/dist/hooks/error-recall.js +306 -8
  53. package/dist/hooks/exe-heartbeat-hook.js +2 -2
  54. package/dist/hooks/ingest-worker.js +2 -2
  55. package/dist/hooks/ingest.js +282 -7
  56. package/dist/hooks/instructions-loaded.js +282 -7
  57. package/dist/hooks/notification.js +282 -7
  58. package/dist/hooks/post-compact.js +282 -7
  59. package/dist/hooks/post-tool-combined.js +306 -8
  60. package/dist/hooks/pre-compact.js +282 -7
  61. package/dist/hooks/pre-tool-use.js +282 -7
  62. package/dist/hooks/prompt-submit.js +306 -8
  63. package/dist/hooks/session-end.js +282 -7
  64. package/dist/hooks/session-start.js +308 -10
  65. package/dist/hooks/stop.js +282 -7
  66. package/dist/hooks/subagent-stop.js +282 -7
  67. package/dist/hooks/summary-worker.js +125 -13
  68. package/dist/index.js +288 -13
  69. package/dist/lib/agent-config.js +2 -2
  70. package/dist/lib/cloud-sync.js +121 -9
  71. package/dist/lib/config.js +2 -2
  72. package/dist/lib/consolidation.js +2 -2
  73. package/dist/lib/database.js +115 -3
  74. package/dist/lib/db-daemon-client.js +2 -2
  75. package/dist/lib/db.js +115 -3
  76. package/dist/lib/device-registry.js +115 -3
  77. package/dist/lib/embedder.js +2 -2
  78. package/dist/lib/employee-templates.js +3 -3
  79. package/dist/lib/employees.js +2 -2
  80. package/dist/lib/exe-daemon-client.js +2 -2
  81. package/dist/lib/exe-daemon.js +339 -31
  82. package/dist/lib/hybrid-search.js +306 -8
  83. package/dist/lib/identity.js +2 -2
  84. package/dist/lib/license.js +2 -2
  85. package/dist/lib/messaging.js +2 -2
  86. package/dist/lib/reminders.js +2 -2
  87. package/dist/lib/schedules.js +119 -7
  88. package/dist/lib/skill-learning.js +2 -2
  89. package/dist/lib/store.js +282 -7
  90. package/dist/lib/task-router.js +2 -2
  91. package/dist/lib/tasks.js +2 -2
  92. package/dist/lib/tmux-routing.js +2 -2
  93. package/dist/lib/token-spend.js +2 -2
  94. package/dist/mcp/server.js +339 -31
  95. package/dist/mcp/tools/complete-reminder.js +2 -2
  96. package/dist/mcp/tools/create-reminder.js +2 -2
  97. package/dist/mcp/tools/create-task.js +2 -2
  98. package/dist/mcp/tools/deactivate-behavior.js +2 -2
  99. package/dist/mcp/tools/list-reminders.js +2 -2
  100. package/dist/mcp/tools/list-tasks.js +2 -2
  101. package/dist/mcp/tools/send-message.js +2 -2
  102. package/dist/mcp/tools/update-task.js +2 -2
  103. package/dist/runtime/index.js +282 -7
  104. package/dist/tui/App.js +290 -15
  105. package/package.json +3 -2
  106. package/stack.release.json +23 -7
@@ -210,8 +210,8 @@ var init_config = __esm({
210
210
  rerankerAutoTrigger: {
211
211
  enabled: true,
212
212
  broadQueryMinCardinality: 5e4,
213
- fetchTopK: 150,
214
- returnTopK: 5
213
+ fetchTopK: 200,
214
+ returnTopK: 20
215
215
  }
216
216
  },
217
217
  graphRagEnabled: true,
@@ -2672,7 +2672,7 @@ async function ensureSchema() {
2672
2672
  ON session_kills(agent_id);
2673
2673
  `);
2674
2674
  await client.execute(`
2675
- CREATE TABLE IF NOT EXISTS global_procedures (
2675
+ CREATE TABLE IF NOT EXISTS company_procedures (
2676
2676
  id TEXT PRIMARY KEY,
2677
2677
  title TEXT NOT NULL,
2678
2678
  content TEXT NOT NULL,
@@ -2683,6 +2683,73 @@ async function ensureSchema() {
2683
2683
  updated_at TEXT NOT NULL
2684
2684
  )
2685
2685
  `);
2686
+ const legacyProcedureObject = await client.execute({
2687
+ sql: "SELECT type FROM sqlite_master WHERE name = 'global_procedures'",
2688
+ args: []
2689
+ });
2690
+ const legacyProcedureType = legacyProcedureObject.rows[0]?.type == null ? null : String(legacyProcedureObject.rows[0].type);
2691
+ if (legacyProcedureType === "table") {
2692
+ await client.execute(`
2693
+ INSERT OR IGNORE INTO company_procedures
2694
+ (id, title, content, priority, domain, active, created_at, updated_at)
2695
+ SELECT id, title, content, priority, domain, active, created_at, updated_at
2696
+ FROM global_procedures
2697
+ `);
2698
+ await client.executeMultiple(`
2699
+ CREATE TRIGGER IF NOT EXISTS global_procedures_mirror_insert
2700
+ AFTER INSERT ON global_procedures
2701
+ BEGIN
2702
+ INSERT OR IGNORE INTO company_procedures
2703
+ (id, title, content, priority, domain, active, created_at, updated_at)
2704
+ VALUES
2705
+ (NEW.id, NEW.title, NEW.content, NEW.priority, NEW.domain, NEW.active, NEW.created_at, NEW.updated_at);
2706
+ END;
2707
+
2708
+ CREATE TRIGGER IF NOT EXISTS global_procedures_mirror_update
2709
+ AFTER UPDATE ON global_procedures
2710
+ BEGIN
2711
+ UPDATE company_procedures
2712
+ SET title = NEW.title,
2713
+ content = NEW.content,
2714
+ priority = NEW.priority,
2715
+ domain = NEW.domain,
2716
+ active = NEW.active,
2717
+ created_at = NEW.created_at,
2718
+ updated_at = NEW.updated_at
2719
+ WHERE id = OLD.id;
2720
+ END;
2721
+ `);
2722
+ } else {
2723
+ await client.execute(`
2724
+ CREATE VIEW IF NOT EXISTS global_procedures AS
2725
+ SELECT id, title, content, priority, domain, active, created_at, updated_at
2726
+ FROM company_procedures
2727
+ `);
2728
+ await client.executeMultiple(`
2729
+ CREATE TRIGGER IF NOT EXISTS global_procedures_insert
2730
+ INSTEAD OF INSERT ON global_procedures
2731
+ BEGIN
2732
+ INSERT INTO company_procedures
2733
+ (id, title, content, priority, domain, active, created_at, updated_at)
2734
+ VALUES
2735
+ (NEW.id, NEW.title, NEW.content, NEW.priority, NEW.domain, NEW.active, NEW.created_at, NEW.updated_at);
2736
+ END;
2737
+
2738
+ CREATE TRIGGER IF NOT EXISTS global_procedures_update
2739
+ INSTEAD OF UPDATE ON global_procedures
2740
+ BEGIN
2741
+ UPDATE company_procedures
2742
+ SET title = NEW.title,
2743
+ content = NEW.content,
2744
+ priority = NEW.priority,
2745
+ domain = NEW.domain,
2746
+ active = NEW.active,
2747
+ created_at = NEW.created_at,
2748
+ updated_at = NEW.updated_at
2749
+ WHERE id = OLD.id;
2750
+ END;
2751
+ `);
2752
+ }
2686
2753
  await client.executeMultiple(`
2687
2754
  CREATE TABLE IF NOT EXISTS conversations (
2688
2755
  id TEXT PRIMARY KEY,
@@ -2822,6 +2889,51 @@ async function ensureSchema() {
2822
2889
  VALUES (new.rowid, new.content_text, new.sender_name, new.agent_response);
2823
2890
  END;
2824
2891
  `);
2892
+ await client.executeMultiple(`
2893
+ CREATE TABLE IF NOT EXISTS memory_cards (
2894
+ id TEXT PRIMARY KEY,
2895
+ memory_id TEXT NOT NULL,
2896
+ agent_id TEXT NOT NULL,
2897
+ session_id TEXT NOT NULL,
2898
+ project_name TEXT,
2899
+ timestamp TEXT NOT NULL,
2900
+ card_type TEXT NOT NULL,
2901
+ subject TEXT,
2902
+ predicate TEXT,
2903
+ object TEXT,
2904
+ content TEXT NOT NULL,
2905
+ source_ref TEXT,
2906
+ confidence REAL DEFAULT 0.6,
2907
+ active INTEGER DEFAULT 1,
2908
+ created_at TEXT NOT NULL
2909
+ );
2910
+
2911
+ CREATE INDEX IF NOT EXISTS idx_memory_cards_agent
2912
+ ON memory_cards(agent_id, active, timestamp);
2913
+
2914
+ CREATE INDEX IF NOT EXISTS idx_memory_cards_memory
2915
+ ON memory_cards(memory_id);
2916
+
2917
+ CREATE VIRTUAL TABLE IF NOT EXISTS memory_cards_fts
2918
+ USING fts5(content, subject, predicate, object, content='memory_cards', content_rowid='rowid');
2919
+
2920
+ CREATE TRIGGER IF NOT EXISTS memory_cards_fts_ai AFTER INSERT ON memory_cards BEGIN
2921
+ INSERT INTO memory_cards_fts(rowid, content, subject, predicate, object)
2922
+ VALUES (new.rowid, new.content, new.subject, new.predicate, new.object);
2923
+ END;
2924
+
2925
+ CREATE TRIGGER IF NOT EXISTS memory_cards_fts_ad AFTER DELETE ON memory_cards BEGIN
2926
+ INSERT INTO memory_cards_fts(memory_cards_fts, rowid, content, subject, predicate, object)
2927
+ VALUES('delete', old.rowid, old.content, old.subject, old.predicate, old.object);
2928
+ END;
2929
+
2930
+ CREATE TRIGGER IF NOT EXISTS memory_cards_fts_au AFTER UPDATE ON memory_cards BEGIN
2931
+ INSERT INTO memory_cards_fts(memory_cards_fts, rowid, content, subject, predicate, object)
2932
+ VALUES('delete', old.rowid, old.content, old.subject, old.predicate, old.object);
2933
+ INSERT INTO memory_cards_fts(rowid, content, subject, predicate, object)
2934
+ VALUES (new.rowid, new.content, new.subject, new.predicate, new.object);
2935
+ END;
2936
+ `);
2825
2937
  try {
2826
2938
  await client.execute({
2827
2939
  sql: `ALTER TABLE memories ADD COLUMN tier INTEGER DEFAULT 3`,
@@ -4031,7 +4143,7 @@ var init_platform_procedures = __esm({
4031
4143
  title: "MCP tools \u2014 advanced (triggers, skills, orchestration)",
4032
4144
  domain: "tool-use",
4033
4145
  priority: "p1",
4034
- content: "create_trigger: set up a scheduled recurring agent job (cron). list_triggers: view active triggers. load_skill: load a slash-command skill dynamically. apply_starter_pack: import a pre-built behavior + identity pack for a role. export_orchestration: export full org state (tasks, behaviors, identities) as portable JSON. import_orchestration: import org state into a new instance. deploy_client: deploy a customer client instance. query_company_brain: unified RAG query across all company knowledge. create_reminder: set a text reminder (shown in boot brief). list_reminders: view pending reminders. complete_reminder: mark a reminder done. global_procedure: manage customer-owned company procedures (Layer 0; actions: store, list, deactivate). Legacy aliases: store_global_procedure, list_global_procedures, deactivate_global_procedure."
4146
+ content: "create_trigger: set up a scheduled recurring agent job (cron). list_triggers: view active triggers. load_skill: load a slash-command skill dynamically. apply_starter_pack: import a pre-built behavior + identity pack for a role. export_orchestration: export full org state (tasks, behaviors, identities) as portable JSON. import_orchestration: import org state into a new instance. deploy_client: deploy a customer client instance. query_company_brain: unified RAG query across all company knowledge. create_reminder: set a text reminder (shown in boot brief). list_reminders: view pending reminders. complete_reminder: mark a reminder done. company_procedure: manage customer-owned company procedures (Layer 0; actions: store, list, deactivate). Legacy aliases: global_procedure, store_global_procedure, list_global_procedures, deactivate_global_procedure."
4035
4147
  }
4036
4148
  ];
4037
4149
  PLATFORM_PROCEDURE_TITLES = new Set(
@@ -4052,7 +4164,7 @@ import { randomUUID as randomUUID2 } from "crypto";
4052
4164
  async function loadGlobalProcedures() {
4053
4165
  const client = getClient();
4054
4166
  const result = await client.execute({
4055
- sql: "SELECT * FROM global_procedures WHERE active = 1 ORDER BY priority ASC, created_at ASC",
4167
+ sql: "SELECT * FROM company_procedures WHERE active = 1 ORDER BY priority ASC, created_at ASC",
4056
4168
  args: []
4057
4169
  });
4058
4170
  const allRows = result.rows;
@@ -4081,7 +4193,7 @@ async function storeGlobalProcedure(input2) {
4081
4193
  const now = (/* @__PURE__ */ new Date()).toISOString();
4082
4194
  const client = getClient();
4083
4195
  await client.execute({
4084
- sql: `INSERT INTO global_procedures (id, title, content, priority, domain, active, created_at, updated_at)
4196
+ sql: `INSERT INTO company_procedures (id, title, content, priority, domain, active, created_at, updated_at)
4085
4197
  VALUES (?, ?, ?, ?, ?, 1, ?, ?)`,
4086
4198
  args: [id, input2.title, input2.content, input2.priority ?? "p0", input2.domain ?? null, now, now]
4087
4199
  });
@@ -4092,7 +4204,7 @@ async function deactivateGlobalProcedure(id) {
4092
4204
  const now = (/* @__PURE__ */ new Date()).toISOString();
4093
4205
  const client = getClient();
4094
4206
  const result = await client.execute({
4095
- sql: "UPDATE global_procedures SET active = 0, updated_at = ? WHERE id = ?",
4207
+ sql: "UPDATE company_procedures SET active = 0, updated_at = ? WHERE id = ?",
4096
4208
  args: [now, id]
4097
4209
  });
4098
4210
  await loadGlobalProcedures();
@@ -4111,6 +4223,164 @@ ${p.content}`).join("\n\n");
4111
4223
  }
4112
4224
  });
4113
4225
 
4226
+ // src/lib/memory-cards.ts
4227
+ var memory_cards_exports = {};
4228
+ __export(memory_cards_exports, {
4229
+ extractMemoryCards: () => extractMemoryCards,
4230
+ insertMemoryCardsForBatch: () => insertMemoryCardsForBatch,
4231
+ searchMemoryCards: () => searchMemoryCards
4232
+ });
4233
+ import { createHash as createHash2 } from "crypto";
4234
+ function stableId(memoryId, type, content) {
4235
+ return createHash2("sha256").update(`${memoryId}:${type}:${content}`).digest("hex").slice(0, 32);
4236
+ }
4237
+ function cleanText(text) {
4238
+ return text.replace(/```[\s\S]*?```/g, " ").replace(/<[^>]+>/g, " ").replace(/\s+/g, " ").trim();
4239
+ }
4240
+ function splitSentences(text) {
4241
+ return cleanText(text).split(/(?<=[.!?])\s+|\n+/).map((s) => s.trim()).filter((s) => s.length >= 24 && s.length <= MAX_SENTENCE_CHARS);
4242
+ }
4243
+ function inferCardType(sentence, toolName) {
4244
+ const lower = sentence.toLowerCase();
4245
+ if (toolName === "store_decision" || /\b(decided|decision|adr|approved|rejected)\b/.test(lower)) return "decision";
4246
+ if (/\b(prefers|preference|likes|dislikes|wants|doesn't want|does not want)\b/.test(lower)) return "preference";
4247
+ if (/\b(changed|updated|replaced|now|no longer|instead|supersedes)\b/.test(lower)) return "belief_update";
4248
+ if (toolName && ["Read", "Write", "Edit", "Bash"].includes(toolName)) return "code";
4249
+ if (/\b(meeting|deadline|shipped|launched|completed|failed|blocked|assigned|created)\b/.test(lower)) return "event";
4250
+ return "fact";
4251
+ }
4252
+ function extractSubject(sentence, agentId) {
4253
+ const explicit = sentence.match(/\b([A-Z][a-zA-Z0-9_-]{2,}(?:\s+[A-Z][a-zA-Z0-9_-]{2,})?)\b/);
4254
+ return explicit?.[1] ?? agentId;
4255
+ }
4256
+ function predicateFor(type) {
4257
+ switch (type) {
4258
+ case "preference":
4259
+ return "prefers";
4260
+ case "belief_update":
4261
+ return "updated";
4262
+ case "decision":
4263
+ return "decided";
4264
+ case "event":
4265
+ return "happened";
4266
+ case "code":
4267
+ return "implemented";
4268
+ default:
4269
+ return "states";
4270
+ }
4271
+ }
4272
+ function extractMemoryCards(row) {
4273
+ const sentences = splitSentences(row.raw_text);
4274
+ const cards = [];
4275
+ for (const sentence of sentences) {
4276
+ const type = inferCardType(sentence, row.tool_name);
4277
+ const subject = extractSubject(sentence, row.agent_id);
4278
+ const content = sentence.length > MAX_SENTENCE_CHARS ? `${sentence.slice(0, MAX_SENTENCE_CHARS - 1)}\u2026` : sentence;
4279
+ cards.push({
4280
+ id: stableId(row.id, type, content),
4281
+ memory_id: row.id,
4282
+ agent_id: row.agent_id,
4283
+ session_id: row.session_id,
4284
+ project_name: row.project_name ?? null,
4285
+ timestamp: row.timestamp,
4286
+ card_type: type,
4287
+ subject,
4288
+ predicate: predicateFor(type),
4289
+ object: content,
4290
+ content,
4291
+ source_ref: row.id,
4292
+ confidence: type === "fact" ? 0.55 : 0.65
4293
+ });
4294
+ if (cards.length >= MAX_CARDS_PER_MEMORY) break;
4295
+ }
4296
+ return cards;
4297
+ }
4298
+ async function insertMemoryCardsForBatch(rows) {
4299
+ const cards = rows.flatMap(extractMemoryCards);
4300
+ if (cards.length === 0) return 0;
4301
+ const now = (/* @__PURE__ */ new Date()).toISOString();
4302
+ const client = getClient();
4303
+ const stmts = cards.map((card) => ({
4304
+ sql: `INSERT OR IGNORE INTO memory_cards
4305
+ (id, memory_id, agent_id, session_id, project_name, timestamp, card_type,
4306
+ subject, predicate, object, content, source_ref, confidence, active, created_at)
4307
+ VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, 1, ?)`,
4308
+ args: [
4309
+ card.id,
4310
+ card.memory_id,
4311
+ card.agent_id,
4312
+ card.session_id,
4313
+ card.project_name,
4314
+ card.timestamp,
4315
+ card.card_type,
4316
+ card.subject,
4317
+ card.predicate,
4318
+ card.object,
4319
+ card.content,
4320
+ card.source_ref,
4321
+ card.confidence,
4322
+ now
4323
+ ]
4324
+ }));
4325
+ await client.batch(stmts, "write");
4326
+ return cards.length;
4327
+ }
4328
+ function buildMatchExpr(queryText) {
4329
+ const terms = queryText.toLowerCase().split(/\s+/).filter((t) => t.length >= 3).map((t) => t.replace(/[^a-z0-9_]/g, "")).filter((t) => t.length >= 3).slice(0, 12);
4330
+ if (terms.length === 0) return null;
4331
+ return terms.map((t) => `${t}*`).join(terms.length >= 3 ? " AND " : " OR ");
4332
+ }
4333
+ async function searchMemoryCards(queryText, agentId, options) {
4334
+ const limit = options?.limit ?? 10;
4335
+ const matchExpr = buildMatchExpr(queryText);
4336
+ if (!matchExpr) return [];
4337
+ let sql = `SELECT c.id, c.memory_id, c.agent_id, c.session_id, c.project_name,
4338
+ c.timestamp, c.card_type, c.content, c.source_ref, c.confidence
4339
+ FROM memory_cards c
4340
+ JOIN memory_cards_fts fts ON c.rowid = fts.rowid
4341
+ WHERE memory_cards_fts MATCH ?
4342
+ AND c.agent_id = ?
4343
+ AND COALESCE(c.active, 1) = 1`;
4344
+ const args = [matchExpr, agentId];
4345
+ if (options?.projectName) {
4346
+ sql += ` AND c.project_name = ?`;
4347
+ args.push(options.projectName);
4348
+ }
4349
+ if (options?.since) {
4350
+ sql += ` AND c.timestamp >= ?`;
4351
+ args.push(options.since);
4352
+ }
4353
+ sql += ` ORDER BY rank LIMIT ?`;
4354
+ args.push(limit);
4355
+ const result = await getClient().execute({ sql, args });
4356
+ return result.rows.map((row) => ({
4357
+ id: `card:${String(row.id)}`,
4358
+ agent_id: String(row.agent_id),
4359
+ agent_role: "memory_card",
4360
+ session_id: String(row.session_id),
4361
+ timestamp: String(row.timestamp),
4362
+ tool_name: `memory_card:${String(row.card_type)}`,
4363
+ project_name: row.project_name == null ? "" : String(row.project_name),
4364
+ has_error: false,
4365
+ raw_text: `[${String(row.card_type)}] ${String(row.content)}
4366
+ Source memory: ${String(row.source_ref ?? row.memory_id)}`,
4367
+ vector: [],
4368
+ importance: 6,
4369
+ status: "active",
4370
+ confidence: Number(row.confidence ?? 0.6),
4371
+ last_accessed: String(row.timestamp)
4372
+ }));
4373
+ }
4374
+ var MAX_CARDS_PER_MEMORY, MAX_SENTENCE_CHARS;
4375
+ var init_memory_cards = __esm({
4376
+ "src/lib/memory-cards.ts"() {
4377
+ "use strict";
4378
+ init_database();
4379
+ MAX_CARDS_PER_MEMORY = 6;
4380
+ MAX_SENTENCE_CHARS = 360;
4381
+ }
4382
+ });
4383
+
4114
4384
  // src/lib/store.ts
4115
4385
  var store_exports = {};
4116
4386
  __export(store_exports, {
@@ -4449,6 +4719,11 @@ async function flushBatch() {
4449
4719
  const globalClient = getClient();
4450
4720
  const globalStmts = batch.map(buildStmt);
4451
4721
  await globalClient.batch(globalStmts, "write");
4722
+ try {
4723
+ const { insertMemoryCardsForBatch: insertMemoryCardsForBatch2 } = await Promise.resolve().then(() => (init_memory_cards(), memory_cards_exports));
4724
+ await insertMemoryCardsForBatch2(batch);
4725
+ } catch {
4726
+ }
4452
4727
  schedulePostWriteMemoryHygiene(batch.map((row) => row.id));
4453
4728
  _pendingRecords.splice(0, batch.length);
4454
4729
  try {