@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
@@ -221,8 +221,8 @@ var init_config = __esm({
221
221
  rerankerAutoTrigger: {
222
222
  enabled: true,
223
223
  broadQueryMinCardinality: 5e4,
224
- fetchTopK: 150,
225
- returnTopK: 5
224
+ fetchTopK: 200,
225
+ returnTopK: 20
226
226
  }
227
227
  },
228
228
  graphRagEnabled: true,
@@ -2827,7 +2827,7 @@ async function ensureSchema() {
2827
2827
  ON session_kills(agent_id);
2828
2828
  `);
2829
2829
  await client.execute(`
2830
- CREATE TABLE IF NOT EXISTS global_procedures (
2830
+ CREATE TABLE IF NOT EXISTS company_procedures (
2831
2831
  id TEXT PRIMARY KEY,
2832
2832
  title TEXT NOT NULL,
2833
2833
  content TEXT NOT NULL,
@@ -2838,6 +2838,73 @@ async function ensureSchema() {
2838
2838
  updated_at TEXT NOT NULL
2839
2839
  )
2840
2840
  `);
2841
+ const legacyProcedureObject = await client.execute({
2842
+ sql: "SELECT type FROM sqlite_master WHERE name = 'global_procedures'",
2843
+ args: []
2844
+ });
2845
+ const legacyProcedureType = legacyProcedureObject.rows[0]?.type == null ? null : String(legacyProcedureObject.rows[0].type);
2846
+ if (legacyProcedureType === "table") {
2847
+ await client.execute(`
2848
+ INSERT OR IGNORE INTO company_procedures
2849
+ (id, title, content, priority, domain, active, created_at, updated_at)
2850
+ SELECT id, title, content, priority, domain, active, created_at, updated_at
2851
+ FROM global_procedures
2852
+ `);
2853
+ await client.executeMultiple(`
2854
+ CREATE TRIGGER IF NOT EXISTS global_procedures_mirror_insert
2855
+ AFTER INSERT ON global_procedures
2856
+ BEGIN
2857
+ INSERT OR IGNORE INTO company_procedures
2858
+ (id, title, content, priority, domain, active, created_at, updated_at)
2859
+ VALUES
2860
+ (NEW.id, NEW.title, NEW.content, NEW.priority, NEW.domain, NEW.active, NEW.created_at, NEW.updated_at);
2861
+ END;
2862
+
2863
+ CREATE TRIGGER IF NOT EXISTS global_procedures_mirror_update
2864
+ AFTER UPDATE ON global_procedures
2865
+ BEGIN
2866
+ UPDATE company_procedures
2867
+ SET title = NEW.title,
2868
+ content = NEW.content,
2869
+ priority = NEW.priority,
2870
+ domain = NEW.domain,
2871
+ active = NEW.active,
2872
+ created_at = NEW.created_at,
2873
+ updated_at = NEW.updated_at
2874
+ WHERE id = OLD.id;
2875
+ END;
2876
+ `);
2877
+ } else {
2878
+ await client.execute(`
2879
+ CREATE VIEW IF NOT EXISTS global_procedures AS
2880
+ SELECT id, title, content, priority, domain, active, created_at, updated_at
2881
+ FROM company_procedures
2882
+ `);
2883
+ await client.executeMultiple(`
2884
+ CREATE TRIGGER IF NOT EXISTS global_procedures_insert
2885
+ INSTEAD OF INSERT ON global_procedures
2886
+ BEGIN
2887
+ INSERT INTO company_procedures
2888
+ (id, title, content, priority, domain, active, created_at, updated_at)
2889
+ VALUES
2890
+ (NEW.id, NEW.title, NEW.content, NEW.priority, NEW.domain, NEW.active, NEW.created_at, NEW.updated_at);
2891
+ END;
2892
+
2893
+ CREATE TRIGGER IF NOT EXISTS global_procedures_update
2894
+ INSTEAD OF UPDATE ON global_procedures
2895
+ BEGIN
2896
+ UPDATE company_procedures
2897
+ SET title = NEW.title,
2898
+ content = NEW.content,
2899
+ priority = NEW.priority,
2900
+ domain = NEW.domain,
2901
+ active = NEW.active,
2902
+ created_at = NEW.created_at,
2903
+ updated_at = NEW.updated_at
2904
+ WHERE id = OLD.id;
2905
+ END;
2906
+ `);
2907
+ }
2841
2908
  await client.executeMultiple(`
2842
2909
  CREATE TABLE IF NOT EXISTS conversations (
2843
2910
  id TEXT PRIMARY KEY,
@@ -2977,6 +3044,51 @@ async function ensureSchema() {
2977
3044
  VALUES (new.rowid, new.content_text, new.sender_name, new.agent_response);
2978
3045
  END;
2979
3046
  `);
3047
+ await client.executeMultiple(`
3048
+ CREATE TABLE IF NOT EXISTS memory_cards (
3049
+ id TEXT PRIMARY KEY,
3050
+ memory_id TEXT NOT NULL,
3051
+ agent_id TEXT NOT NULL,
3052
+ session_id TEXT NOT NULL,
3053
+ project_name TEXT,
3054
+ timestamp TEXT NOT NULL,
3055
+ card_type TEXT NOT NULL,
3056
+ subject TEXT,
3057
+ predicate TEXT,
3058
+ object TEXT,
3059
+ content TEXT NOT NULL,
3060
+ source_ref TEXT,
3061
+ confidence REAL DEFAULT 0.6,
3062
+ active INTEGER DEFAULT 1,
3063
+ created_at TEXT NOT NULL
3064
+ );
3065
+
3066
+ CREATE INDEX IF NOT EXISTS idx_memory_cards_agent
3067
+ ON memory_cards(agent_id, active, timestamp);
3068
+
3069
+ CREATE INDEX IF NOT EXISTS idx_memory_cards_memory
3070
+ ON memory_cards(memory_id);
3071
+
3072
+ CREATE VIRTUAL TABLE IF NOT EXISTS memory_cards_fts
3073
+ USING fts5(content, subject, predicate, object, content='memory_cards', content_rowid='rowid');
3074
+
3075
+ CREATE TRIGGER IF NOT EXISTS memory_cards_fts_ai AFTER INSERT ON memory_cards BEGIN
3076
+ INSERT INTO memory_cards_fts(rowid, content, subject, predicate, object)
3077
+ VALUES (new.rowid, new.content, new.subject, new.predicate, new.object);
3078
+ END;
3079
+
3080
+ CREATE TRIGGER IF NOT EXISTS memory_cards_fts_ad AFTER DELETE ON memory_cards BEGIN
3081
+ INSERT INTO memory_cards_fts(memory_cards_fts, rowid, content, subject, predicate, object)
3082
+ VALUES('delete', old.rowid, old.content, old.subject, old.predicate, old.object);
3083
+ END;
3084
+
3085
+ CREATE TRIGGER IF NOT EXISTS memory_cards_fts_au AFTER UPDATE ON memory_cards BEGIN
3086
+ INSERT INTO memory_cards_fts(memory_cards_fts, rowid, content, subject, predicate, object)
3087
+ VALUES('delete', old.rowid, old.content, old.subject, old.predicate, old.object);
3088
+ INSERT INTO memory_cards_fts(rowid, content, subject, predicate, object)
3089
+ VALUES (new.rowid, new.content, new.subject, new.predicate, new.object);
3090
+ END;
3091
+ `);
2980
3092
  try {
2981
3093
  await client.execute({
2982
3094
  sql: `ALTER TABLE memories ADD COLUMN tier INTEGER DEFAULT 3`,
@@ -4329,7 +4441,7 @@ var init_platform_procedures = __esm({
4329
4441
  title: "MCP tools \u2014 advanced (triggers, skills, orchestration)",
4330
4442
  domain: "tool-use",
4331
4443
  priority: "p1",
4332
- 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."
4444
+ 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."
4333
4445
  }
4334
4446
  ];
4335
4447
  PLATFORM_PROCEDURE_TITLES = new Set(
@@ -4350,7 +4462,7 @@ import { randomUUID as randomUUID3 } from "crypto";
4350
4462
  async function loadGlobalProcedures() {
4351
4463
  const client = getClient();
4352
4464
  const result = await client.execute({
4353
- sql: "SELECT * FROM global_procedures WHERE active = 1 ORDER BY priority ASC, created_at ASC",
4465
+ sql: "SELECT * FROM company_procedures WHERE active = 1 ORDER BY priority ASC, created_at ASC",
4354
4466
  args: []
4355
4467
  });
4356
4468
  const allRows = result.rows;
@@ -4379,7 +4491,7 @@ async function storeGlobalProcedure(input2) {
4379
4491
  const now = (/* @__PURE__ */ new Date()).toISOString();
4380
4492
  const client = getClient();
4381
4493
  await client.execute({
4382
- sql: `INSERT INTO global_procedures (id, title, content, priority, domain, active, created_at, updated_at)
4494
+ sql: `INSERT INTO company_procedures (id, title, content, priority, domain, active, created_at, updated_at)
4383
4495
  VALUES (?, ?, ?, ?, ?, 1, ?, ?)`,
4384
4496
  args: [id, input2.title, input2.content, input2.priority ?? "p0", input2.domain ?? null, now, now]
4385
4497
  });
@@ -4390,7 +4502,7 @@ async function deactivateGlobalProcedure(id) {
4390
4502
  const now = (/* @__PURE__ */ new Date()).toISOString();
4391
4503
  const client = getClient();
4392
4504
  const result = await client.execute({
4393
- sql: "UPDATE global_procedures SET active = 0, updated_at = ? WHERE id = ?",
4505
+ sql: "UPDATE company_procedures SET active = 0, updated_at = ? WHERE id = ?",
4394
4506
  args: [now, id]
4395
4507
  });
4396
4508
  await loadGlobalProcedures();
@@ -4409,6 +4521,164 @@ ${p.content}`).join("\n\n");
4409
4521
  }
4410
4522
  });
4411
4523
 
4524
+ // src/lib/memory-cards.ts
4525
+ var memory_cards_exports = {};
4526
+ __export(memory_cards_exports, {
4527
+ extractMemoryCards: () => extractMemoryCards,
4528
+ insertMemoryCardsForBatch: () => insertMemoryCardsForBatch,
4529
+ searchMemoryCards: () => searchMemoryCards
4530
+ });
4531
+ import { createHash as createHash2 } from "crypto";
4532
+ function stableId(memoryId, type, content) {
4533
+ return createHash2("sha256").update(`${memoryId}:${type}:${content}`).digest("hex").slice(0, 32);
4534
+ }
4535
+ function cleanText(text) {
4536
+ return text.replace(/```[\s\S]*?```/g, " ").replace(/<[^>]+>/g, " ").replace(/\s+/g, " ").trim();
4537
+ }
4538
+ function splitSentences(text) {
4539
+ return cleanText(text).split(/(?<=[.!?])\s+|\n+/).map((s) => s.trim()).filter((s) => s.length >= 24 && s.length <= MAX_SENTENCE_CHARS);
4540
+ }
4541
+ function inferCardType(sentence, toolName) {
4542
+ const lower = sentence.toLowerCase();
4543
+ if (toolName === "store_decision" || /\b(decided|decision|adr|approved|rejected)\b/.test(lower)) return "decision";
4544
+ if (/\b(prefers|preference|likes|dislikes|wants|doesn't want|does not want)\b/.test(lower)) return "preference";
4545
+ if (/\b(changed|updated|replaced|now|no longer|instead|supersedes)\b/.test(lower)) return "belief_update";
4546
+ if (toolName && ["Read", "Write", "Edit", "Bash"].includes(toolName)) return "code";
4547
+ if (/\b(meeting|deadline|shipped|launched|completed|failed|blocked|assigned|created)\b/.test(lower)) return "event";
4548
+ return "fact";
4549
+ }
4550
+ function extractSubject(sentence, agentId) {
4551
+ const explicit = sentence.match(/\b([A-Z][a-zA-Z0-9_-]{2,}(?:\s+[A-Z][a-zA-Z0-9_-]{2,})?)\b/);
4552
+ return explicit?.[1] ?? agentId;
4553
+ }
4554
+ function predicateFor(type) {
4555
+ switch (type) {
4556
+ case "preference":
4557
+ return "prefers";
4558
+ case "belief_update":
4559
+ return "updated";
4560
+ case "decision":
4561
+ return "decided";
4562
+ case "event":
4563
+ return "happened";
4564
+ case "code":
4565
+ return "implemented";
4566
+ default:
4567
+ return "states";
4568
+ }
4569
+ }
4570
+ function extractMemoryCards(row) {
4571
+ const sentences = splitSentences(row.raw_text);
4572
+ const cards = [];
4573
+ for (const sentence of sentences) {
4574
+ const type = inferCardType(sentence, row.tool_name);
4575
+ const subject = extractSubject(sentence, row.agent_id);
4576
+ const content = sentence.length > MAX_SENTENCE_CHARS ? `${sentence.slice(0, MAX_SENTENCE_CHARS - 1)}\u2026` : sentence;
4577
+ cards.push({
4578
+ id: stableId(row.id, type, content),
4579
+ memory_id: row.id,
4580
+ agent_id: row.agent_id,
4581
+ session_id: row.session_id,
4582
+ project_name: row.project_name ?? null,
4583
+ timestamp: row.timestamp,
4584
+ card_type: type,
4585
+ subject,
4586
+ predicate: predicateFor(type),
4587
+ object: content,
4588
+ content,
4589
+ source_ref: row.id,
4590
+ confidence: type === "fact" ? 0.55 : 0.65
4591
+ });
4592
+ if (cards.length >= MAX_CARDS_PER_MEMORY) break;
4593
+ }
4594
+ return cards;
4595
+ }
4596
+ async function insertMemoryCardsForBatch(rows) {
4597
+ const cards = rows.flatMap(extractMemoryCards);
4598
+ if (cards.length === 0) return 0;
4599
+ const now = (/* @__PURE__ */ new Date()).toISOString();
4600
+ const client = getClient();
4601
+ const stmts = cards.map((card) => ({
4602
+ sql: `INSERT OR IGNORE INTO memory_cards
4603
+ (id, memory_id, agent_id, session_id, project_name, timestamp, card_type,
4604
+ subject, predicate, object, content, source_ref, confidence, active, created_at)
4605
+ VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, 1, ?)`,
4606
+ args: [
4607
+ card.id,
4608
+ card.memory_id,
4609
+ card.agent_id,
4610
+ card.session_id,
4611
+ card.project_name,
4612
+ card.timestamp,
4613
+ card.card_type,
4614
+ card.subject,
4615
+ card.predicate,
4616
+ card.object,
4617
+ card.content,
4618
+ card.source_ref,
4619
+ card.confidence,
4620
+ now
4621
+ ]
4622
+ }));
4623
+ await client.batch(stmts, "write");
4624
+ return cards.length;
4625
+ }
4626
+ function buildMatchExpr(queryText) {
4627
+ 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);
4628
+ if (terms.length === 0) return null;
4629
+ return terms.map((t) => `${t}*`).join(terms.length >= 3 ? " AND " : " OR ");
4630
+ }
4631
+ async function searchMemoryCards(queryText, agentId, options) {
4632
+ const limit = options?.limit ?? 10;
4633
+ const matchExpr = buildMatchExpr(queryText);
4634
+ if (!matchExpr) return [];
4635
+ let sql = `SELECT c.id, c.memory_id, c.agent_id, c.session_id, c.project_name,
4636
+ c.timestamp, c.card_type, c.content, c.source_ref, c.confidence
4637
+ FROM memory_cards c
4638
+ JOIN memory_cards_fts fts ON c.rowid = fts.rowid
4639
+ WHERE memory_cards_fts MATCH ?
4640
+ AND c.agent_id = ?
4641
+ AND COALESCE(c.active, 1) = 1`;
4642
+ const args = [matchExpr, agentId];
4643
+ if (options?.projectName) {
4644
+ sql += ` AND c.project_name = ?`;
4645
+ args.push(options.projectName);
4646
+ }
4647
+ if (options?.since) {
4648
+ sql += ` AND c.timestamp >= ?`;
4649
+ args.push(options.since);
4650
+ }
4651
+ sql += ` ORDER BY rank LIMIT ?`;
4652
+ args.push(limit);
4653
+ const result = await getClient().execute({ sql, args });
4654
+ return result.rows.map((row) => ({
4655
+ id: `card:${String(row.id)}`,
4656
+ agent_id: String(row.agent_id),
4657
+ agent_role: "memory_card",
4658
+ session_id: String(row.session_id),
4659
+ timestamp: String(row.timestamp),
4660
+ tool_name: `memory_card:${String(row.card_type)}`,
4661
+ project_name: row.project_name == null ? "" : String(row.project_name),
4662
+ has_error: false,
4663
+ raw_text: `[${String(row.card_type)}] ${String(row.content)}
4664
+ Source memory: ${String(row.source_ref ?? row.memory_id)}`,
4665
+ vector: [],
4666
+ importance: 6,
4667
+ status: "active",
4668
+ confidence: Number(row.confidence ?? 0.6),
4669
+ last_accessed: String(row.timestamp)
4670
+ }));
4671
+ }
4672
+ var MAX_CARDS_PER_MEMORY, MAX_SENTENCE_CHARS;
4673
+ var init_memory_cards = __esm({
4674
+ "src/lib/memory-cards.ts"() {
4675
+ "use strict";
4676
+ init_database();
4677
+ MAX_CARDS_PER_MEMORY = 6;
4678
+ MAX_SENTENCE_CHARS = 360;
4679
+ }
4680
+ });
4681
+
4412
4682
  // src/lib/store.ts
4413
4683
  var store_exports = {};
4414
4684
  __export(store_exports, {
@@ -4747,6 +5017,11 @@ async function flushBatch() {
4747
5017
  const globalClient = getClient();
4748
5018
  const globalStmts = batch.map(buildStmt);
4749
5019
  await globalClient.batch(globalStmts, "write");
5020
+ try {
5021
+ const { insertMemoryCardsForBatch: insertMemoryCardsForBatch2 } = await Promise.resolve().then(() => (init_memory_cards(), memory_cards_exports));
5022
+ await insertMemoryCardsForBatch2(batch);
5023
+ } catch {
5024
+ }
4750
5025
  schedulePostWriteMemoryHygiene(batch.map((row) => row.id));
4751
5026
  _pendingRecords.splice(0, batch.length);
4752
5027
  try {