@askexenow/exe-os 0.9.61 → 0.9.63

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 (103) hide show
  1. package/deploy/stack-manifests/v0.9.json +62 -13
  2. package/dist/bin/backfill-conversations.js +210 -2
  3. package/dist/bin/backfill-responses.js +210 -2
  4. package/dist/bin/backfill-vectors.js +47 -2
  5. package/dist/bin/cleanup-stale-review-tasks.js +210 -2
  6. package/dist/bin/cli.js +488 -25
  7. package/dist/bin/exe-agent-config.js +2 -2
  8. package/dist/bin/exe-agent.js +2 -2
  9. package/dist/bin/exe-assign.js +210 -2
  10. package/dist/bin/exe-boot.js +47 -2
  11. package/dist/bin/exe-call.js +2 -2
  12. package/dist/bin/exe-cloud.js +2 -2
  13. package/dist/bin/exe-dispatch.js +210 -2
  14. package/dist/bin/exe-doctor.js +2691 -1212
  15. package/dist/bin/exe-export-behaviors.js +210 -2
  16. package/dist/bin/exe-forget.js +264 -2
  17. package/dist/bin/exe-gateway.js +210 -2
  18. package/dist/bin/exe-heartbeat.js +212 -4
  19. package/dist/bin/exe-kill.js +210 -2
  20. package/dist/bin/exe-launch-agent.js +210 -2
  21. package/dist/bin/exe-link.js +47 -2
  22. package/dist/bin/exe-new-employee.js +113 -3
  23. package/dist/bin/exe-pending-messages.js +210 -2
  24. package/dist/bin/exe-pending-notifications.js +210 -2
  25. package/dist/bin/exe-pending-reviews.js +210 -2
  26. package/dist/bin/exe-rename.js +210 -2
  27. package/dist/bin/exe-review.js +210 -2
  28. package/dist/bin/exe-search.js +234 -3
  29. package/dist/bin/exe-session-cleanup.js +210 -2
  30. package/dist/bin/exe-settings.js +2 -2
  31. package/dist/bin/exe-start-codex.js +322 -4
  32. package/dist/bin/exe-start-opencode.js +336 -4
  33. package/dist/bin/exe-status.js +210 -2
  34. package/dist/bin/exe-team.js +210 -2
  35. package/dist/bin/git-sweep.js +210 -2
  36. package/dist/bin/graph-backfill.js +210 -2
  37. package/dist/bin/graph-export.js +210 -2
  38. package/dist/bin/install.js +113 -3
  39. package/dist/bin/intercom-check.js +210 -2
  40. package/dist/bin/scan-tasks.js +210 -2
  41. package/dist/bin/setup.js +47 -2
  42. package/dist/bin/shard-migrate.js +210 -2
  43. package/dist/bin/stack-update.js +158 -13
  44. package/dist/bin/update.js +2 -2
  45. package/dist/gateway/index.js +210 -2
  46. package/dist/hooks/bug-report-worker.js +321 -44
  47. package/dist/hooks/codex-stop-task-finalizer.js +210 -2
  48. package/dist/hooks/commit-complete.js +210 -2
  49. package/dist/hooks/error-recall.js +234 -3
  50. package/dist/hooks/exe-heartbeat-hook.js +2 -2
  51. package/dist/hooks/ingest-worker.js +2 -2
  52. package/dist/hooks/ingest.js +210 -2
  53. package/dist/hooks/instructions-loaded.js +210 -2
  54. package/dist/hooks/notification.js +210 -2
  55. package/dist/hooks/post-compact.js +210 -2
  56. package/dist/hooks/post-tool-combined.js +234 -3
  57. package/dist/hooks/pre-compact.js +446 -111
  58. package/dist/hooks/pre-tool-use.js +210 -2
  59. package/dist/hooks/prompt-submit.js +234 -3
  60. package/dist/hooks/session-end.js +347 -124
  61. package/dist/hooks/session-start.js +236 -5
  62. package/dist/hooks/stop.js +210 -2
  63. package/dist/hooks/subagent-stop.js +210 -2
  64. package/dist/hooks/summary-worker.js +171 -74
  65. package/dist/index.js +210 -2
  66. package/dist/lib/agent-config.js +2 -2
  67. package/dist/lib/cloud-sync.js +47 -2
  68. package/dist/lib/config.js +2 -2
  69. package/dist/lib/consolidation.js +2 -2
  70. package/dist/lib/database.js +47 -2
  71. package/dist/lib/db-daemon-client.js +2 -2
  72. package/dist/lib/db.js +47 -2
  73. package/dist/lib/device-registry.js +47 -2
  74. package/dist/lib/embedder.js +2 -2
  75. package/dist/lib/employee-templates.js +2 -2
  76. package/dist/lib/employees.js +2 -2
  77. package/dist/lib/exe-daemon-client.js +2 -2
  78. package/dist/lib/exe-daemon.js +592 -10
  79. package/dist/lib/hybrid-search.js +234 -3
  80. package/dist/lib/identity.js +2 -2
  81. package/dist/lib/license.js +2 -2
  82. package/dist/lib/messaging.js +2 -2
  83. package/dist/lib/reminders.js +2 -2
  84. package/dist/lib/schedules.js +47 -2
  85. package/dist/lib/skill-learning.js +2 -2
  86. package/dist/lib/store.js +210 -2
  87. package/dist/lib/task-router.js +2 -2
  88. package/dist/lib/tasks.js +2 -2
  89. package/dist/lib/tmux-routing.js +2 -2
  90. package/dist/lib/token-spend.js +2 -2
  91. package/dist/mcp/server.js +608 -10
  92. package/dist/mcp/tools/complete-reminder.js +2 -2
  93. package/dist/mcp/tools/create-reminder.js +2 -2
  94. package/dist/mcp/tools/create-task.js +2 -2
  95. package/dist/mcp/tools/deactivate-behavior.js +2 -2
  96. package/dist/mcp/tools/list-reminders.js +2 -2
  97. package/dist/mcp/tools/list-tasks.js +2 -2
  98. package/dist/mcp/tools/send-message.js +2 -2
  99. package/dist/mcp/tools/update-task.js +2 -2
  100. package/dist/runtime/index.js +210 -2
  101. package/dist/tui/App.js +210 -2
  102. package/package.json +3 -2
  103. package/stack.release.json +23 -7
package/dist/index.js CHANGED
@@ -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,
@@ -3520,6 +3520,51 @@ async function ensureSchema() {
3520
3520
  VALUES (new.rowid, new.content_text, new.sender_name, new.agent_response);
3521
3521
  END;
3522
3522
  `);
3523
+ await client.executeMultiple(`
3524
+ CREATE TABLE IF NOT EXISTS memory_cards (
3525
+ id TEXT PRIMARY KEY,
3526
+ memory_id TEXT NOT NULL,
3527
+ agent_id TEXT NOT NULL,
3528
+ session_id TEXT NOT NULL,
3529
+ project_name TEXT,
3530
+ timestamp TEXT NOT NULL,
3531
+ card_type TEXT NOT NULL,
3532
+ subject TEXT,
3533
+ predicate TEXT,
3534
+ object TEXT,
3535
+ content TEXT NOT NULL,
3536
+ source_ref TEXT,
3537
+ confidence REAL DEFAULT 0.6,
3538
+ active INTEGER DEFAULT 1,
3539
+ created_at TEXT NOT NULL
3540
+ );
3541
+
3542
+ CREATE INDEX IF NOT EXISTS idx_memory_cards_agent
3543
+ ON memory_cards(agent_id, active, timestamp);
3544
+
3545
+ CREATE INDEX IF NOT EXISTS idx_memory_cards_memory
3546
+ ON memory_cards(memory_id);
3547
+
3548
+ CREATE VIRTUAL TABLE IF NOT EXISTS memory_cards_fts
3549
+ USING fts5(content, subject, predicate, object, content='memory_cards', content_rowid='rowid');
3550
+
3551
+ CREATE TRIGGER IF NOT EXISTS memory_cards_fts_ai AFTER INSERT ON memory_cards BEGIN
3552
+ INSERT INTO memory_cards_fts(rowid, content, subject, predicate, object)
3553
+ VALUES (new.rowid, new.content, new.subject, new.predicate, new.object);
3554
+ END;
3555
+
3556
+ CREATE TRIGGER IF NOT EXISTS memory_cards_fts_ad AFTER DELETE ON memory_cards BEGIN
3557
+ INSERT INTO memory_cards_fts(memory_cards_fts, rowid, content, subject, predicate, object)
3558
+ VALUES('delete', old.rowid, old.content, old.subject, old.predicate, old.object);
3559
+ END;
3560
+
3561
+ CREATE TRIGGER IF NOT EXISTS memory_cards_fts_au AFTER UPDATE ON memory_cards BEGIN
3562
+ INSERT INTO memory_cards_fts(memory_cards_fts, rowid, content, subject, predicate, object)
3563
+ VALUES('delete', old.rowid, old.content, old.subject, old.predicate, old.object);
3564
+ INSERT INTO memory_cards_fts(rowid, content, subject, predicate, object)
3565
+ VALUES (new.rowid, new.content, new.subject, new.predicate, new.object);
3566
+ END;
3567
+ `);
3523
3568
  try {
3524
3569
  await client.execute({
3525
3570
  sql: `ALTER TABLE memories ADD COLUMN tier INTEGER DEFAULT 3`,
@@ -8063,6 +8108,164 @@ ${p.content}`).join("\n\n");
8063
8108
  }
8064
8109
  });
8065
8110
 
8111
+ // src/lib/memory-cards.ts
8112
+ var memory_cards_exports = {};
8113
+ __export(memory_cards_exports, {
8114
+ extractMemoryCards: () => extractMemoryCards,
8115
+ insertMemoryCardsForBatch: () => insertMemoryCardsForBatch,
8116
+ searchMemoryCards: () => searchMemoryCards
8117
+ });
8118
+ import { createHash as createHash2 } from "crypto";
8119
+ function stableId(memoryId, type, content) {
8120
+ return createHash2("sha256").update(`${memoryId}:${type}:${content}`).digest("hex").slice(0, 32);
8121
+ }
8122
+ function cleanText(text) {
8123
+ return text.replace(/```[\s\S]*?```/g, " ").replace(/<[^>]+>/g, " ").replace(/\s+/g, " ").trim();
8124
+ }
8125
+ function splitSentences(text) {
8126
+ return cleanText(text).split(/(?<=[.!?])\s+|\n+/).map((s) => s.trim()).filter((s) => s.length >= 24 && s.length <= MAX_SENTENCE_CHARS);
8127
+ }
8128
+ function inferCardType(sentence, toolName) {
8129
+ const lower = sentence.toLowerCase();
8130
+ if (toolName === "store_decision" || /\b(decided|decision|adr|approved|rejected)\b/.test(lower)) return "decision";
8131
+ if (/\b(prefers|preference|likes|dislikes|wants|doesn't want|does not want)\b/.test(lower)) return "preference";
8132
+ if (/\b(changed|updated|replaced|now|no longer|instead|supersedes)\b/.test(lower)) return "belief_update";
8133
+ if (toolName && ["Read", "Write", "Edit", "Bash"].includes(toolName)) return "code";
8134
+ if (/\b(meeting|deadline|shipped|launched|completed|failed|blocked|assigned|created)\b/.test(lower)) return "event";
8135
+ return "fact";
8136
+ }
8137
+ function extractSubject(sentence, agentId) {
8138
+ const explicit = sentence.match(/\b([A-Z][a-zA-Z0-9_-]{2,}(?:\s+[A-Z][a-zA-Z0-9_-]{2,})?)\b/);
8139
+ return explicit?.[1] ?? agentId;
8140
+ }
8141
+ function predicateFor(type) {
8142
+ switch (type) {
8143
+ case "preference":
8144
+ return "prefers";
8145
+ case "belief_update":
8146
+ return "updated";
8147
+ case "decision":
8148
+ return "decided";
8149
+ case "event":
8150
+ return "happened";
8151
+ case "code":
8152
+ return "implemented";
8153
+ default:
8154
+ return "states";
8155
+ }
8156
+ }
8157
+ function extractMemoryCards(row) {
8158
+ const sentences = splitSentences(row.raw_text);
8159
+ const cards = [];
8160
+ for (const sentence of sentences) {
8161
+ const type = inferCardType(sentence, row.tool_name);
8162
+ const subject = extractSubject(sentence, row.agent_id);
8163
+ const content = sentence.length > MAX_SENTENCE_CHARS ? `${sentence.slice(0, MAX_SENTENCE_CHARS - 1)}\u2026` : sentence;
8164
+ cards.push({
8165
+ id: stableId(row.id, type, content),
8166
+ memory_id: row.id,
8167
+ agent_id: row.agent_id,
8168
+ session_id: row.session_id,
8169
+ project_name: row.project_name ?? null,
8170
+ timestamp: row.timestamp,
8171
+ card_type: type,
8172
+ subject,
8173
+ predicate: predicateFor(type),
8174
+ object: content,
8175
+ content,
8176
+ source_ref: row.id,
8177
+ confidence: type === "fact" ? 0.55 : 0.65
8178
+ });
8179
+ if (cards.length >= MAX_CARDS_PER_MEMORY) break;
8180
+ }
8181
+ return cards;
8182
+ }
8183
+ async function insertMemoryCardsForBatch(rows) {
8184
+ const cards = rows.flatMap(extractMemoryCards);
8185
+ if (cards.length === 0) return 0;
8186
+ const now = (/* @__PURE__ */ new Date()).toISOString();
8187
+ const client = getClient();
8188
+ const stmts = cards.map((card) => ({
8189
+ sql: `INSERT OR IGNORE INTO memory_cards
8190
+ (id, memory_id, agent_id, session_id, project_name, timestamp, card_type,
8191
+ subject, predicate, object, content, source_ref, confidence, active, created_at)
8192
+ VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, 1, ?)`,
8193
+ args: [
8194
+ card.id,
8195
+ card.memory_id,
8196
+ card.agent_id,
8197
+ card.session_id,
8198
+ card.project_name,
8199
+ card.timestamp,
8200
+ card.card_type,
8201
+ card.subject,
8202
+ card.predicate,
8203
+ card.object,
8204
+ card.content,
8205
+ card.source_ref,
8206
+ card.confidence,
8207
+ now
8208
+ ]
8209
+ }));
8210
+ await client.batch(stmts, "write");
8211
+ return cards.length;
8212
+ }
8213
+ function buildMatchExpr(queryText) {
8214
+ 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);
8215
+ if (terms.length === 0) return null;
8216
+ return terms.map((t) => `${t}*`).join(terms.length >= 3 ? " AND " : " OR ");
8217
+ }
8218
+ async function searchMemoryCards(queryText, agentId, options) {
8219
+ const limit = options?.limit ?? 10;
8220
+ const matchExpr = buildMatchExpr(queryText);
8221
+ if (!matchExpr) return [];
8222
+ let sql = `SELECT c.id, c.memory_id, c.agent_id, c.session_id, c.project_name,
8223
+ c.timestamp, c.card_type, c.content, c.source_ref, c.confidence
8224
+ FROM memory_cards c
8225
+ JOIN memory_cards_fts fts ON c.rowid = fts.rowid
8226
+ WHERE memory_cards_fts MATCH ?
8227
+ AND c.agent_id = ?
8228
+ AND COALESCE(c.active, 1) = 1`;
8229
+ const args = [matchExpr, agentId];
8230
+ if (options?.projectName) {
8231
+ sql += ` AND c.project_name = ?`;
8232
+ args.push(options.projectName);
8233
+ }
8234
+ if (options?.since) {
8235
+ sql += ` AND c.timestamp >= ?`;
8236
+ args.push(options.since);
8237
+ }
8238
+ sql += ` ORDER BY rank LIMIT ?`;
8239
+ args.push(limit);
8240
+ const result = await getClient().execute({ sql, args });
8241
+ return result.rows.map((row) => ({
8242
+ id: `card:${String(row.id)}`,
8243
+ agent_id: String(row.agent_id),
8244
+ agent_role: "memory_card",
8245
+ session_id: String(row.session_id),
8246
+ timestamp: String(row.timestamp),
8247
+ tool_name: `memory_card:${String(row.card_type)}`,
8248
+ project_name: row.project_name == null ? "" : String(row.project_name),
8249
+ has_error: false,
8250
+ raw_text: `[${String(row.card_type)}] ${String(row.content)}
8251
+ Source memory: ${String(row.source_ref ?? row.memory_id)}`,
8252
+ vector: [],
8253
+ importance: 6,
8254
+ status: "active",
8255
+ confidence: Number(row.confidence ?? 0.6),
8256
+ last_accessed: String(row.timestamp)
8257
+ }));
8258
+ }
8259
+ var MAX_CARDS_PER_MEMORY, MAX_SENTENCE_CHARS;
8260
+ var init_memory_cards = __esm({
8261
+ "src/lib/memory-cards.ts"() {
8262
+ "use strict";
8263
+ init_database();
8264
+ MAX_CARDS_PER_MEMORY = 6;
8265
+ MAX_SENTENCE_CHARS = 360;
8266
+ }
8267
+ });
8268
+
8066
8269
  // src/lib/store.ts
8067
8270
  var store_exports = {};
8068
8271
  __export(store_exports, {
@@ -8401,6 +8604,11 @@ async function flushBatch() {
8401
8604
  const globalClient = getClient();
8402
8605
  const globalStmts = batch.map(buildStmt);
8403
8606
  await globalClient.batch(globalStmts, "write");
8607
+ try {
8608
+ const { insertMemoryCardsForBatch: insertMemoryCardsForBatch2 } = await Promise.resolve().then(() => (init_memory_cards(), memory_cards_exports));
8609
+ await insertMemoryCardsForBatch2(batch);
8610
+ } catch {
8611
+ }
8404
8612
  schedulePostWriteMemoryHygiene(batch.map((row) => row.id));
8405
8613
  _pendingRecords.splice(0, batch.length);
8406
8614
  try {
@@ -74,8 +74,8 @@ var DEFAULT_CONFIG = {
74
74
  rerankerAutoTrigger: {
75
75
  enabled: true,
76
76
  broadQueryMinCardinality: 5e4,
77
- fetchTopK: 150,
78
- returnTopK: 5
77
+ fetchTopK: 200,
78
+ returnTopK: 20
79
79
  }
80
80
  },
81
81
  graphRagEnabled: true,
@@ -150,8 +150,8 @@ var init_config = __esm({
150
150
  rerankerAutoTrigger: {
151
151
  enabled: true,
152
152
  broadQueryMinCardinality: 5e4,
153
- fetchTopK: 150,
154
- returnTopK: 5
153
+ fetchTopK: 200,
154
+ returnTopK: 20
155
155
  }
156
156
  },
157
157
  graphRagEnabled: true,
@@ -2454,6 +2454,51 @@ async function ensureSchema() {
2454
2454
  VALUES (new.rowid, new.content_text, new.sender_name, new.agent_response);
2455
2455
  END;
2456
2456
  `);
2457
+ await client.executeMultiple(`
2458
+ CREATE TABLE IF NOT EXISTS memory_cards (
2459
+ id TEXT PRIMARY KEY,
2460
+ memory_id TEXT NOT NULL,
2461
+ agent_id TEXT NOT NULL,
2462
+ session_id TEXT NOT NULL,
2463
+ project_name TEXT,
2464
+ timestamp TEXT NOT NULL,
2465
+ card_type TEXT NOT NULL,
2466
+ subject TEXT,
2467
+ predicate TEXT,
2468
+ object TEXT,
2469
+ content TEXT NOT NULL,
2470
+ source_ref TEXT,
2471
+ confidence REAL DEFAULT 0.6,
2472
+ active INTEGER DEFAULT 1,
2473
+ created_at TEXT NOT NULL
2474
+ );
2475
+
2476
+ CREATE INDEX IF NOT EXISTS idx_memory_cards_agent
2477
+ ON memory_cards(agent_id, active, timestamp);
2478
+
2479
+ CREATE INDEX IF NOT EXISTS idx_memory_cards_memory
2480
+ ON memory_cards(memory_id);
2481
+
2482
+ CREATE VIRTUAL TABLE IF NOT EXISTS memory_cards_fts
2483
+ USING fts5(content, subject, predicate, object, content='memory_cards', content_rowid='rowid');
2484
+
2485
+ CREATE TRIGGER IF NOT EXISTS memory_cards_fts_ai AFTER INSERT ON memory_cards BEGIN
2486
+ INSERT INTO memory_cards_fts(rowid, content, subject, predicate, object)
2487
+ VALUES (new.rowid, new.content, new.subject, new.predicate, new.object);
2488
+ END;
2489
+
2490
+ CREATE TRIGGER IF NOT EXISTS memory_cards_fts_ad AFTER DELETE ON memory_cards BEGIN
2491
+ INSERT INTO memory_cards_fts(memory_cards_fts, rowid, content, subject, predicate, object)
2492
+ VALUES('delete', old.rowid, old.content, old.subject, old.predicate, old.object);
2493
+ END;
2494
+
2495
+ CREATE TRIGGER IF NOT EXISTS memory_cards_fts_au AFTER UPDATE ON memory_cards BEGIN
2496
+ INSERT INTO memory_cards_fts(memory_cards_fts, rowid, content, subject, predicate, object)
2497
+ VALUES('delete', old.rowid, old.content, old.subject, old.predicate, old.object);
2498
+ INSERT INTO memory_cards_fts(rowid, content, subject, predicate, object)
2499
+ VALUES (new.rowid, new.content, new.subject, new.predicate, new.object);
2500
+ END;
2501
+ `);
2457
2502
  try {
2458
2503
  await client.execute({
2459
2504
  sql: `ALTER TABLE memories ADD COLUMN tier INTEGER DEFAULT 3`,
@@ -70,8 +70,8 @@ var DEFAULT_CONFIG = {
70
70
  rerankerAutoTrigger: {
71
71
  enabled: true,
72
72
  broadQueryMinCardinality: 5e4,
73
- fetchTopK: 150,
74
- returnTopK: 5
73
+ fetchTopK: 200,
74
+ returnTopK: 20
75
75
  }
76
76
  },
77
77
  graphRagEnabled: true,
@@ -103,8 +103,8 @@ var init_config = __esm({
103
103
  rerankerAutoTrigger: {
104
104
  enabled: true,
105
105
  broadQueryMinCardinality: 5e4,
106
- fetchTopK: 150,
107
- returnTopK: 5
106
+ fetchTopK: 200,
107
+ returnTopK: 20
108
108
  }
109
109
  },
110
110
  graphRagEnabled: true,
@@ -95,8 +95,8 @@ var init_config = __esm({
95
95
  rerankerAutoTrigger: {
96
96
  enabled: true,
97
97
  broadQueryMinCardinality: 5e4,
98
- fetchTopK: 150,
99
- returnTopK: 5
98
+ fetchTopK: 200,
99
+ returnTopK: 20
100
100
  }
101
101
  },
102
102
  graphRagEnabled: true,
@@ -2370,6 +2370,51 @@ async function ensureSchema() {
2370
2370
  VALUES (new.rowid, new.content_text, new.sender_name, new.agent_response);
2371
2371
  END;
2372
2372
  `);
2373
+ await client.executeMultiple(`
2374
+ CREATE TABLE IF NOT EXISTS memory_cards (
2375
+ id TEXT PRIMARY KEY,
2376
+ memory_id TEXT NOT NULL,
2377
+ agent_id TEXT NOT NULL,
2378
+ session_id TEXT NOT NULL,
2379
+ project_name TEXT,
2380
+ timestamp TEXT NOT NULL,
2381
+ card_type TEXT NOT NULL,
2382
+ subject TEXT,
2383
+ predicate TEXT,
2384
+ object TEXT,
2385
+ content TEXT NOT NULL,
2386
+ source_ref TEXT,
2387
+ confidence REAL DEFAULT 0.6,
2388
+ active INTEGER DEFAULT 1,
2389
+ created_at TEXT NOT NULL
2390
+ );
2391
+
2392
+ CREATE INDEX IF NOT EXISTS idx_memory_cards_agent
2393
+ ON memory_cards(agent_id, active, timestamp);
2394
+
2395
+ CREATE INDEX IF NOT EXISTS idx_memory_cards_memory
2396
+ ON memory_cards(memory_id);
2397
+
2398
+ CREATE VIRTUAL TABLE IF NOT EXISTS memory_cards_fts
2399
+ USING fts5(content, subject, predicate, object, content='memory_cards', content_rowid='rowid');
2400
+
2401
+ CREATE TRIGGER IF NOT EXISTS memory_cards_fts_ai AFTER INSERT ON memory_cards BEGIN
2402
+ INSERT INTO memory_cards_fts(rowid, content, subject, predicate, object)
2403
+ VALUES (new.rowid, new.content, new.subject, new.predicate, new.object);
2404
+ END;
2405
+
2406
+ CREATE TRIGGER IF NOT EXISTS memory_cards_fts_ad AFTER DELETE ON memory_cards BEGIN
2407
+ INSERT INTO memory_cards_fts(memory_cards_fts, rowid, content, subject, predicate, object)
2408
+ VALUES('delete', old.rowid, old.content, old.subject, old.predicate, old.object);
2409
+ END;
2410
+
2411
+ CREATE TRIGGER IF NOT EXISTS memory_cards_fts_au AFTER UPDATE ON memory_cards BEGIN
2412
+ INSERT INTO memory_cards_fts(memory_cards_fts, rowid, content, subject, predicate, object)
2413
+ VALUES('delete', old.rowid, old.content, old.subject, old.predicate, old.object);
2414
+ INSERT INTO memory_cards_fts(rowid, content, subject, predicate, object)
2415
+ VALUES (new.rowid, new.content, new.subject, new.predicate, new.object);
2416
+ END;
2417
+ `);
2373
2418
  try {
2374
2419
  await client.execute({
2375
2420
  sql: `ALTER TABLE memories ADD COLUMN tier INTEGER DEFAULT 3`,
@@ -86,8 +86,8 @@ var DEFAULT_CONFIG = {
86
86
  rerankerAutoTrigger: {
87
87
  enabled: true,
88
88
  broadQueryMinCardinality: 5e4,
89
- fetchTopK: 150,
90
- returnTopK: 5
89
+ fetchTopK: 200,
90
+ returnTopK: 20
91
91
  }
92
92
  },
93
93
  graphRagEnabled: true,
package/dist/lib/db.js CHANGED
@@ -95,8 +95,8 @@ var init_config = __esm({
95
95
  rerankerAutoTrigger: {
96
96
  enabled: true,
97
97
  broadQueryMinCardinality: 5e4,
98
- fetchTopK: 150,
99
- returnTopK: 5
98
+ fetchTopK: 200,
99
+ returnTopK: 20
100
100
  }
101
101
  },
102
102
  graphRagEnabled: true,
@@ -2370,6 +2370,51 @@ async function ensureSchema() {
2370
2370
  VALUES (new.rowid, new.content_text, new.sender_name, new.agent_response);
2371
2371
  END;
2372
2372
  `);
2373
+ await client.executeMultiple(`
2374
+ CREATE TABLE IF NOT EXISTS memory_cards (
2375
+ id TEXT PRIMARY KEY,
2376
+ memory_id TEXT NOT NULL,
2377
+ agent_id TEXT NOT NULL,
2378
+ session_id TEXT NOT NULL,
2379
+ project_name TEXT,
2380
+ timestamp TEXT NOT NULL,
2381
+ card_type TEXT NOT NULL,
2382
+ subject TEXT,
2383
+ predicate TEXT,
2384
+ object TEXT,
2385
+ content TEXT NOT NULL,
2386
+ source_ref TEXT,
2387
+ confidence REAL DEFAULT 0.6,
2388
+ active INTEGER DEFAULT 1,
2389
+ created_at TEXT NOT NULL
2390
+ );
2391
+
2392
+ CREATE INDEX IF NOT EXISTS idx_memory_cards_agent
2393
+ ON memory_cards(agent_id, active, timestamp);
2394
+
2395
+ CREATE INDEX IF NOT EXISTS idx_memory_cards_memory
2396
+ ON memory_cards(memory_id);
2397
+
2398
+ CREATE VIRTUAL TABLE IF NOT EXISTS memory_cards_fts
2399
+ USING fts5(content, subject, predicate, object, content='memory_cards', content_rowid='rowid');
2400
+
2401
+ CREATE TRIGGER IF NOT EXISTS memory_cards_fts_ai AFTER INSERT ON memory_cards BEGIN
2402
+ INSERT INTO memory_cards_fts(rowid, content, subject, predicate, object)
2403
+ VALUES (new.rowid, new.content, new.subject, new.predicate, new.object);
2404
+ END;
2405
+
2406
+ CREATE TRIGGER IF NOT EXISTS memory_cards_fts_ad AFTER DELETE ON memory_cards BEGIN
2407
+ INSERT INTO memory_cards_fts(memory_cards_fts, rowid, content, subject, predicate, object)
2408
+ VALUES('delete', old.rowid, old.content, old.subject, old.predicate, old.object);
2409
+ END;
2410
+
2411
+ CREATE TRIGGER IF NOT EXISTS memory_cards_fts_au AFTER UPDATE ON memory_cards BEGIN
2412
+ INSERT INTO memory_cards_fts(memory_cards_fts, rowid, content, subject, predicate, object)
2413
+ VALUES('delete', old.rowid, old.content, old.subject, old.predicate, old.object);
2414
+ INSERT INTO memory_cards_fts(rowid, content, subject, predicate, object)
2415
+ VALUES (new.rowid, new.content, new.subject, new.predicate, new.object);
2416
+ END;
2417
+ `);
2373
2418
  try {
2374
2419
  await client.execute({
2375
2420
  sql: `ALTER TABLE memories ADD COLUMN tier INTEGER DEFAULT 3`,
@@ -95,8 +95,8 @@ var init_config = __esm({
95
95
  rerankerAutoTrigger: {
96
96
  enabled: true,
97
97
  broadQueryMinCardinality: 5e4,
98
- fetchTopK: 150,
99
- returnTopK: 5
98
+ fetchTopK: 200,
99
+ returnTopK: 20
100
100
  }
101
101
  },
102
102
  graphRagEnabled: true,
@@ -2399,6 +2399,51 @@ async function ensureSchema() {
2399
2399
  VALUES (new.rowid, new.content_text, new.sender_name, new.agent_response);
2400
2400
  END;
2401
2401
  `);
2402
+ await client.executeMultiple(`
2403
+ CREATE TABLE IF NOT EXISTS memory_cards (
2404
+ id TEXT PRIMARY KEY,
2405
+ memory_id TEXT NOT NULL,
2406
+ agent_id TEXT NOT NULL,
2407
+ session_id TEXT NOT NULL,
2408
+ project_name TEXT,
2409
+ timestamp TEXT NOT NULL,
2410
+ card_type TEXT NOT NULL,
2411
+ subject TEXT,
2412
+ predicate TEXT,
2413
+ object TEXT,
2414
+ content TEXT NOT NULL,
2415
+ source_ref TEXT,
2416
+ confidence REAL DEFAULT 0.6,
2417
+ active INTEGER DEFAULT 1,
2418
+ created_at TEXT NOT NULL
2419
+ );
2420
+
2421
+ CREATE INDEX IF NOT EXISTS idx_memory_cards_agent
2422
+ ON memory_cards(agent_id, active, timestamp);
2423
+
2424
+ CREATE INDEX IF NOT EXISTS idx_memory_cards_memory
2425
+ ON memory_cards(memory_id);
2426
+
2427
+ CREATE VIRTUAL TABLE IF NOT EXISTS memory_cards_fts
2428
+ USING fts5(content, subject, predicate, object, content='memory_cards', content_rowid='rowid');
2429
+
2430
+ CREATE TRIGGER IF NOT EXISTS memory_cards_fts_ai AFTER INSERT ON memory_cards BEGIN
2431
+ INSERT INTO memory_cards_fts(rowid, content, subject, predicate, object)
2432
+ VALUES (new.rowid, new.content, new.subject, new.predicate, new.object);
2433
+ END;
2434
+
2435
+ CREATE TRIGGER IF NOT EXISTS memory_cards_fts_ad AFTER DELETE ON memory_cards BEGIN
2436
+ INSERT INTO memory_cards_fts(memory_cards_fts, rowid, content, subject, predicate, object)
2437
+ VALUES('delete', old.rowid, old.content, old.subject, old.predicate, old.object);
2438
+ END;
2439
+
2440
+ CREATE TRIGGER IF NOT EXISTS memory_cards_fts_au AFTER UPDATE ON memory_cards BEGIN
2441
+ INSERT INTO memory_cards_fts(memory_cards_fts, rowid, content, subject, predicate, object)
2442
+ VALUES('delete', old.rowid, old.content, old.subject, old.predicate, old.object);
2443
+ INSERT INTO memory_cards_fts(rowid, content, subject, predicate, object)
2444
+ VALUES (new.rowid, new.content, new.subject, new.predicate, new.object);
2445
+ END;
2446
+ `);
2402
2447
  try {
2403
2448
  await client.execute({
2404
2449
  sql: `ALTER TABLE memories ADD COLUMN tier INTEGER DEFAULT 3`,
@@ -246,8 +246,8 @@ var init_config = __esm({
246
246
  rerankerAutoTrigger: {
247
247
  enabled: true,
248
248
  broadQueryMinCardinality: 5e4,
249
- fetchTopK: 150,
250
- returnTopK: 5
249
+ fetchTopK: 200,
250
+ returnTopK: 20
251
251
  }
252
252
  },
253
253
  graphRagEnabled: true,
@@ -68,8 +68,8 @@ var init_config = __esm({
68
68
  rerankerAutoTrigger: {
69
69
  enabled: true,
70
70
  broadQueryMinCardinality: 5e4,
71
- fetchTopK: 150,
72
- returnTopK: 5
71
+ fetchTopK: 200,
72
+ returnTopK: 20
73
73
  }
74
74
  },
75
75
  graphRagEnabled: true,
@@ -89,8 +89,8 @@ var init_config = __esm({
89
89
  rerankerAutoTrigger: {
90
90
  enabled: true,
91
91
  broadQueryMinCardinality: 5e4,
92
- fetchTopK: 150,
93
- returnTopK: 5
92
+ fetchTopK: 200,
93
+ returnTopK: 20
94
94
  }
95
95
  },
96
96
  graphRagEnabled: true,
@@ -86,8 +86,8 @@ var DEFAULT_CONFIG = {
86
86
  rerankerAutoTrigger: {
87
87
  enabled: true,
88
88
  broadQueryMinCardinality: 5e4,
89
- fetchTopK: 150,
90
- returnTopK: 5
89
+ fetchTopK: 200,
90
+ returnTopK: 20
91
91
  }
92
92
  },
93
93
  graphRagEnabled: true,