@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
@@ -257,8 +257,8 @@ var init_config = __esm({
257
257
  rerankerAutoTrigger: {
258
258
  enabled: true,
259
259
  broadQueryMinCardinality: 5e4,
260
- fetchTopK: 150,
261
- returnTopK: 5
260
+ fetchTopK: 200,
261
+ returnTopK: 20
262
262
  }
263
263
  },
264
264
  graphRagEnabled: true,
@@ -3085,7 +3085,7 @@ async function ensureSchema() {
3085
3085
  ON session_kills(agent_id);
3086
3086
  `);
3087
3087
  await client.execute(`
3088
- CREATE TABLE IF NOT EXISTS global_procedures (
3088
+ CREATE TABLE IF NOT EXISTS company_procedures (
3089
3089
  id TEXT PRIMARY KEY,
3090
3090
  title TEXT NOT NULL,
3091
3091
  content TEXT NOT NULL,
@@ -3096,6 +3096,73 @@ async function ensureSchema() {
3096
3096
  updated_at TEXT NOT NULL
3097
3097
  )
3098
3098
  `);
3099
+ const legacyProcedureObject = await client.execute({
3100
+ sql: "SELECT type FROM sqlite_master WHERE name = 'global_procedures'",
3101
+ args: []
3102
+ });
3103
+ const legacyProcedureType = legacyProcedureObject.rows[0]?.type == null ? null : String(legacyProcedureObject.rows[0].type);
3104
+ if (legacyProcedureType === "table") {
3105
+ await client.execute(`
3106
+ INSERT OR IGNORE INTO company_procedures
3107
+ (id, title, content, priority, domain, active, created_at, updated_at)
3108
+ SELECT id, title, content, priority, domain, active, created_at, updated_at
3109
+ FROM global_procedures
3110
+ `);
3111
+ await client.executeMultiple(`
3112
+ CREATE TRIGGER IF NOT EXISTS global_procedures_mirror_insert
3113
+ AFTER INSERT ON global_procedures
3114
+ BEGIN
3115
+ INSERT OR IGNORE INTO company_procedures
3116
+ (id, title, content, priority, domain, active, created_at, updated_at)
3117
+ VALUES
3118
+ (NEW.id, NEW.title, NEW.content, NEW.priority, NEW.domain, NEW.active, NEW.created_at, NEW.updated_at);
3119
+ END;
3120
+
3121
+ CREATE TRIGGER IF NOT EXISTS global_procedures_mirror_update
3122
+ AFTER UPDATE ON global_procedures
3123
+ BEGIN
3124
+ UPDATE company_procedures
3125
+ SET title = NEW.title,
3126
+ content = NEW.content,
3127
+ priority = NEW.priority,
3128
+ domain = NEW.domain,
3129
+ active = NEW.active,
3130
+ created_at = NEW.created_at,
3131
+ updated_at = NEW.updated_at
3132
+ WHERE id = OLD.id;
3133
+ END;
3134
+ `);
3135
+ } else {
3136
+ await client.execute(`
3137
+ CREATE VIEW IF NOT EXISTS global_procedures AS
3138
+ SELECT id, title, content, priority, domain, active, created_at, updated_at
3139
+ FROM company_procedures
3140
+ `);
3141
+ await client.executeMultiple(`
3142
+ CREATE TRIGGER IF NOT EXISTS global_procedures_insert
3143
+ INSTEAD OF INSERT ON global_procedures
3144
+ BEGIN
3145
+ INSERT INTO company_procedures
3146
+ (id, title, content, priority, domain, active, created_at, updated_at)
3147
+ VALUES
3148
+ (NEW.id, NEW.title, NEW.content, NEW.priority, NEW.domain, NEW.active, NEW.created_at, NEW.updated_at);
3149
+ END;
3150
+
3151
+ CREATE TRIGGER IF NOT EXISTS global_procedures_update
3152
+ INSTEAD OF UPDATE ON global_procedures
3153
+ BEGIN
3154
+ UPDATE company_procedures
3155
+ SET title = NEW.title,
3156
+ content = NEW.content,
3157
+ priority = NEW.priority,
3158
+ domain = NEW.domain,
3159
+ active = NEW.active,
3160
+ created_at = NEW.created_at,
3161
+ updated_at = NEW.updated_at
3162
+ WHERE id = OLD.id;
3163
+ END;
3164
+ `);
3165
+ }
3099
3166
  await client.executeMultiple(`
3100
3167
  CREATE TABLE IF NOT EXISTS conversations (
3101
3168
  id TEXT PRIMARY KEY,
@@ -3235,6 +3302,51 @@ async function ensureSchema() {
3235
3302
  VALUES (new.rowid, new.content_text, new.sender_name, new.agent_response);
3236
3303
  END;
3237
3304
  `);
3305
+ await client.executeMultiple(`
3306
+ CREATE TABLE IF NOT EXISTS memory_cards (
3307
+ id TEXT PRIMARY KEY,
3308
+ memory_id TEXT NOT NULL,
3309
+ agent_id TEXT NOT NULL,
3310
+ session_id TEXT NOT NULL,
3311
+ project_name TEXT,
3312
+ timestamp TEXT NOT NULL,
3313
+ card_type TEXT NOT NULL,
3314
+ subject TEXT,
3315
+ predicate TEXT,
3316
+ object TEXT,
3317
+ content TEXT NOT NULL,
3318
+ source_ref TEXT,
3319
+ confidence REAL DEFAULT 0.6,
3320
+ active INTEGER DEFAULT 1,
3321
+ created_at TEXT NOT NULL
3322
+ );
3323
+
3324
+ CREATE INDEX IF NOT EXISTS idx_memory_cards_agent
3325
+ ON memory_cards(agent_id, active, timestamp);
3326
+
3327
+ CREATE INDEX IF NOT EXISTS idx_memory_cards_memory
3328
+ ON memory_cards(memory_id);
3329
+
3330
+ CREATE VIRTUAL TABLE IF NOT EXISTS memory_cards_fts
3331
+ USING fts5(content, subject, predicate, object, content='memory_cards', content_rowid='rowid');
3332
+
3333
+ CREATE TRIGGER IF NOT EXISTS memory_cards_fts_ai AFTER INSERT ON memory_cards BEGIN
3334
+ INSERT INTO memory_cards_fts(rowid, content, subject, predicate, object)
3335
+ VALUES (new.rowid, new.content, new.subject, new.predicate, new.object);
3336
+ END;
3337
+
3338
+ CREATE TRIGGER IF NOT EXISTS memory_cards_fts_ad AFTER DELETE ON memory_cards BEGIN
3339
+ INSERT INTO memory_cards_fts(memory_cards_fts, rowid, content, subject, predicate, object)
3340
+ VALUES('delete', old.rowid, old.content, old.subject, old.predicate, old.object);
3341
+ END;
3342
+
3343
+ CREATE TRIGGER IF NOT EXISTS memory_cards_fts_au AFTER UPDATE ON memory_cards BEGIN
3344
+ INSERT INTO memory_cards_fts(memory_cards_fts, rowid, content, subject, predicate, object)
3345
+ VALUES('delete', old.rowid, old.content, old.subject, old.predicate, old.object);
3346
+ INSERT INTO memory_cards_fts(rowid, content, subject, predicate, object)
3347
+ VALUES (new.rowid, new.content, new.subject, new.predicate, new.object);
3348
+ END;
3349
+ `);
3238
3350
  try {
3239
3351
  await client.execute({
3240
3352
  sql: `ALTER TABLE memories ADD COLUMN tier INTEGER DEFAULT 3`,
@@ -7827,7 +7939,7 @@ var init_platform_procedures = __esm({
7827
7939
  title: "MCP tools \u2014 advanced (triggers, skills, orchestration)",
7828
7940
  domain: "tool-use",
7829
7941
  priority: "p1",
7830
- 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."
7942
+ 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."
7831
7943
  }
7832
7944
  ];
7833
7945
  PLATFORM_PROCEDURE_TITLES = new Set(
@@ -7848,7 +7960,7 @@ import { randomUUID as randomUUID3 } from "crypto";
7848
7960
  async function loadGlobalProcedures() {
7849
7961
  const client = getClient();
7850
7962
  const result = await client.execute({
7851
- sql: "SELECT * FROM global_procedures WHERE active = 1 ORDER BY priority ASC, created_at ASC",
7963
+ sql: "SELECT * FROM company_procedures WHERE active = 1 ORDER BY priority ASC, created_at ASC",
7852
7964
  args: []
7853
7965
  });
7854
7966
  const allRows = result.rows;
@@ -7877,7 +7989,7 @@ async function storeGlobalProcedure(input2) {
7877
7989
  const now = (/* @__PURE__ */ new Date()).toISOString();
7878
7990
  const client = getClient();
7879
7991
  await client.execute({
7880
- sql: `INSERT INTO global_procedures (id, title, content, priority, domain, active, created_at, updated_at)
7992
+ sql: `INSERT INTO company_procedures (id, title, content, priority, domain, active, created_at, updated_at)
7881
7993
  VALUES (?, ?, ?, ?, ?, 1, ?, ?)`,
7882
7994
  args: [id, input2.title, input2.content, input2.priority ?? "p0", input2.domain ?? null, now, now]
7883
7995
  });
@@ -7888,7 +8000,7 @@ async function deactivateGlobalProcedure(id) {
7888
8000
  const now = (/* @__PURE__ */ new Date()).toISOString();
7889
8001
  const client = getClient();
7890
8002
  const result = await client.execute({
7891
- sql: "UPDATE global_procedures SET active = 0, updated_at = ? WHERE id = ?",
8003
+ sql: "UPDATE company_procedures SET active = 0, updated_at = ? WHERE id = ?",
7892
8004
  args: [now, id]
7893
8005
  });
7894
8006
  await loadGlobalProcedures();
@@ -7907,6 +8019,164 @@ ${p.content}`).join("\n\n");
7907
8019
  }
7908
8020
  });
7909
8021
 
8022
+ // src/lib/memory-cards.ts
8023
+ var memory_cards_exports = {};
8024
+ __export(memory_cards_exports, {
8025
+ extractMemoryCards: () => extractMemoryCards,
8026
+ insertMemoryCardsForBatch: () => insertMemoryCardsForBatch,
8027
+ searchMemoryCards: () => searchMemoryCards
8028
+ });
8029
+ import { createHash as createHash2 } from "crypto";
8030
+ function stableId(memoryId, type, content) {
8031
+ return createHash2("sha256").update(`${memoryId}:${type}:${content}`).digest("hex").slice(0, 32);
8032
+ }
8033
+ function cleanText(text) {
8034
+ return text.replace(/```[\s\S]*?```/g, " ").replace(/<[^>]+>/g, " ").replace(/\s+/g, " ").trim();
8035
+ }
8036
+ function splitSentences(text) {
8037
+ return cleanText(text).split(/(?<=[.!?])\s+|\n+/).map((s) => s.trim()).filter((s) => s.length >= 24 && s.length <= MAX_SENTENCE_CHARS);
8038
+ }
8039
+ function inferCardType(sentence, toolName) {
8040
+ const lower = sentence.toLowerCase();
8041
+ if (toolName === "store_decision" || /\b(decided|decision|adr|approved|rejected)\b/.test(lower)) return "decision";
8042
+ if (/\b(prefers|preference|likes|dislikes|wants|doesn't want|does not want)\b/.test(lower)) return "preference";
8043
+ if (/\b(changed|updated|replaced|now|no longer|instead|supersedes)\b/.test(lower)) return "belief_update";
8044
+ if (toolName && ["Read", "Write", "Edit", "Bash"].includes(toolName)) return "code";
8045
+ if (/\b(meeting|deadline|shipped|launched|completed|failed|blocked|assigned|created)\b/.test(lower)) return "event";
8046
+ return "fact";
8047
+ }
8048
+ function extractSubject(sentence, agentId) {
8049
+ const explicit = sentence.match(/\b([A-Z][a-zA-Z0-9_-]{2,}(?:\s+[A-Z][a-zA-Z0-9_-]{2,})?)\b/);
8050
+ return explicit?.[1] ?? agentId;
8051
+ }
8052
+ function predicateFor(type) {
8053
+ switch (type) {
8054
+ case "preference":
8055
+ return "prefers";
8056
+ case "belief_update":
8057
+ return "updated";
8058
+ case "decision":
8059
+ return "decided";
8060
+ case "event":
8061
+ return "happened";
8062
+ case "code":
8063
+ return "implemented";
8064
+ default:
8065
+ return "states";
8066
+ }
8067
+ }
8068
+ function extractMemoryCards(row) {
8069
+ const sentences = splitSentences(row.raw_text);
8070
+ const cards = [];
8071
+ for (const sentence of sentences) {
8072
+ const type = inferCardType(sentence, row.tool_name);
8073
+ const subject = extractSubject(sentence, row.agent_id);
8074
+ const content = sentence.length > MAX_SENTENCE_CHARS ? `${sentence.slice(0, MAX_SENTENCE_CHARS - 1)}\u2026` : sentence;
8075
+ cards.push({
8076
+ id: stableId(row.id, type, content),
8077
+ memory_id: row.id,
8078
+ agent_id: row.agent_id,
8079
+ session_id: row.session_id,
8080
+ project_name: row.project_name ?? null,
8081
+ timestamp: row.timestamp,
8082
+ card_type: type,
8083
+ subject,
8084
+ predicate: predicateFor(type),
8085
+ object: content,
8086
+ content,
8087
+ source_ref: row.id,
8088
+ confidence: type === "fact" ? 0.55 : 0.65
8089
+ });
8090
+ if (cards.length >= MAX_CARDS_PER_MEMORY) break;
8091
+ }
8092
+ return cards;
8093
+ }
8094
+ async function insertMemoryCardsForBatch(rows) {
8095
+ const cards = rows.flatMap(extractMemoryCards);
8096
+ if (cards.length === 0) return 0;
8097
+ const now = (/* @__PURE__ */ new Date()).toISOString();
8098
+ const client = getClient();
8099
+ const stmts = cards.map((card) => ({
8100
+ sql: `INSERT OR IGNORE INTO memory_cards
8101
+ (id, memory_id, agent_id, session_id, project_name, timestamp, card_type,
8102
+ subject, predicate, object, content, source_ref, confidence, active, created_at)
8103
+ VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, 1, ?)`,
8104
+ args: [
8105
+ card.id,
8106
+ card.memory_id,
8107
+ card.agent_id,
8108
+ card.session_id,
8109
+ card.project_name,
8110
+ card.timestamp,
8111
+ card.card_type,
8112
+ card.subject,
8113
+ card.predicate,
8114
+ card.object,
8115
+ card.content,
8116
+ card.source_ref,
8117
+ card.confidence,
8118
+ now
8119
+ ]
8120
+ }));
8121
+ await client.batch(stmts, "write");
8122
+ return cards.length;
8123
+ }
8124
+ function buildMatchExpr(queryText) {
8125
+ 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);
8126
+ if (terms.length === 0) return null;
8127
+ return terms.map((t) => `${t}*`).join(terms.length >= 3 ? " AND " : " OR ");
8128
+ }
8129
+ async function searchMemoryCards(queryText, agentId, options) {
8130
+ const limit = options?.limit ?? 10;
8131
+ const matchExpr = buildMatchExpr(queryText);
8132
+ if (!matchExpr) return [];
8133
+ let sql = `SELECT c.id, c.memory_id, c.agent_id, c.session_id, c.project_name,
8134
+ c.timestamp, c.card_type, c.content, c.source_ref, c.confidence
8135
+ FROM memory_cards c
8136
+ JOIN memory_cards_fts fts ON c.rowid = fts.rowid
8137
+ WHERE memory_cards_fts MATCH ?
8138
+ AND c.agent_id = ?
8139
+ AND COALESCE(c.active, 1) = 1`;
8140
+ const args = [matchExpr, agentId];
8141
+ if (options?.projectName) {
8142
+ sql += ` AND c.project_name = ?`;
8143
+ args.push(options.projectName);
8144
+ }
8145
+ if (options?.since) {
8146
+ sql += ` AND c.timestamp >= ?`;
8147
+ args.push(options.since);
8148
+ }
8149
+ sql += ` ORDER BY rank LIMIT ?`;
8150
+ args.push(limit);
8151
+ const result = await getClient().execute({ sql, args });
8152
+ return result.rows.map((row) => ({
8153
+ id: `card:${String(row.id)}`,
8154
+ agent_id: String(row.agent_id),
8155
+ agent_role: "memory_card",
8156
+ session_id: String(row.session_id),
8157
+ timestamp: String(row.timestamp),
8158
+ tool_name: `memory_card:${String(row.card_type)}`,
8159
+ project_name: row.project_name == null ? "" : String(row.project_name),
8160
+ has_error: false,
8161
+ raw_text: `[${String(row.card_type)}] ${String(row.content)}
8162
+ Source memory: ${String(row.source_ref ?? row.memory_id)}`,
8163
+ vector: [],
8164
+ importance: 6,
8165
+ status: "active",
8166
+ confidence: Number(row.confidence ?? 0.6),
8167
+ last_accessed: String(row.timestamp)
8168
+ }));
8169
+ }
8170
+ var MAX_CARDS_PER_MEMORY, MAX_SENTENCE_CHARS;
8171
+ var init_memory_cards = __esm({
8172
+ "src/lib/memory-cards.ts"() {
8173
+ "use strict";
8174
+ init_database();
8175
+ MAX_CARDS_PER_MEMORY = 6;
8176
+ MAX_SENTENCE_CHARS = 360;
8177
+ }
8178
+ });
8179
+
7910
8180
  // src/lib/store.ts
7911
8181
  var store_exports = {};
7912
8182
  __export(store_exports, {
@@ -8245,6 +8515,11 @@ async function flushBatch() {
8245
8515
  const globalClient = getClient();
8246
8516
  const globalStmts = batch.map(buildStmt);
8247
8517
  await globalClient.batch(globalStmts, "write");
8518
+ try {
8519
+ const { insertMemoryCardsForBatch: insertMemoryCardsForBatch2 } = await Promise.resolve().then(() => (init_memory_cards(), memory_cards_exports));
8520
+ await insertMemoryCardsForBatch2(batch);
8521
+ } catch {
8522
+ }
8248
8523
  schedulePostWriteMemoryHygiene(batch.map((row) => row.id));
8249
8524
  _pendingRecords.splice(0, batch.length);
8250
8525
  try {