@askexenow/exe-os 0.9.66 → 0.9.67

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 (99) hide show
  1. package/deploy/stack-manifests/v0.9.json +54 -5
  2. package/dist/bin/age-ontology-load.js +61 -0
  3. package/dist/bin/agentic-ontology-backfill.js +4708 -0
  4. package/dist/bin/agentic-reflection-backfill.js +4144 -0
  5. package/dist/bin/{exe-link.js → agentic-semantic-label.js} +1523 -2275
  6. package/dist/bin/backfill-conversations.js +506 -20
  7. package/dist/bin/backfill-responses.js +506 -20
  8. package/dist/bin/backfill-vectors.js +233 -20
  9. package/dist/bin/bulk-sync-postgres.js +4876 -0
  10. package/dist/bin/cleanup-stale-review-tasks.js +507 -21
  11. package/dist/bin/cli.js +2450 -1530
  12. package/dist/bin/exe-assign.js +506 -20
  13. package/dist/bin/exe-boot.js +410 -60
  14. package/dist/bin/exe-cloud.js +795 -105
  15. package/dist/bin/exe-dispatch.js +516 -22
  16. package/dist/bin/exe-doctor.js +587 -30
  17. package/dist/bin/exe-export-behaviors.js +518 -24
  18. package/dist/bin/exe-forget.js +507 -21
  19. package/dist/bin/exe-gateway.js +571 -25
  20. package/dist/bin/exe-heartbeat.js +518 -24
  21. package/dist/bin/exe-kill.js +507 -21
  22. package/dist/bin/exe-launch-agent.js +2312 -1069
  23. package/dist/bin/exe-new-employee.js +197 -165
  24. package/dist/bin/exe-pending-messages.js +507 -21
  25. package/dist/bin/exe-pending-notifications.js +507 -21
  26. package/dist/bin/exe-pending-reviews.js +507 -21
  27. package/dist/bin/exe-rename.js +507 -21
  28. package/dist/bin/exe-review.js +507 -21
  29. package/dist/bin/exe-search.js +518 -24
  30. package/dist/bin/exe-session-cleanup.js +516 -22
  31. package/dist/bin/exe-settings.js +4 -0
  32. package/dist/bin/exe-start-codex.js +682 -143
  33. package/dist/bin/exe-start-opencode.js +627 -79
  34. package/dist/bin/exe-status.js +507 -21
  35. package/dist/bin/exe-team.js +507 -21
  36. package/dist/bin/git-sweep.js +516 -22
  37. package/dist/bin/graph-backfill.js +558 -21
  38. package/dist/bin/graph-export.js +507 -21
  39. package/dist/bin/graph-layer-benchmark.js +109 -0
  40. package/dist/bin/install.js +305 -288
  41. package/dist/bin/intercom-check.js +516 -22
  42. package/dist/bin/postgres-agentic-reflection-backfill.js +187 -0
  43. package/dist/bin/postgres-agentic-semantic-backfill.js +237 -0
  44. package/dist/bin/scan-tasks.js +516 -22
  45. package/dist/bin/setup.js +412 -62
  46. package/dist/bin/shard-migrate.js +506 -20
  47. package/dist/gateway/index.js +569 -23
  48. package/dist/hooks/bug-report-worker.js +519 -25
  49. package/dist/hooks/codex-stop-task-finalizer.js +516 -22
  50. package/dist/hooks/commit-complete.js +516 -22
  51. package/dist/hooks/error-recall.js +518 -24
  52. package/dist/hooks/ingest.js +516 -22
  53. package/dist/hooks/instructions-loaded.js +507 -21
  54. package/dist/hooks/notification.js +507 -21
  55. package/dist/hooks/post-compact.js +507 -21
  56. package/dist/hooks/post-tool-combined.js +519 -25
  57. package/dist/hooks/pre-compact.js +516 -22
  58. package/dist/hooks/pre-tool-use.js +507 -21
  59. package/dist/hooks/prompt-submit.js +519 -25
  60. package/dist/hooks/session-end.js +516 -22
  61. package/dist/hooks/session-start.js +520 -26
  62. package/dist/hooks/stop.js +517 -23
  63. package/dist/hooks/subagent-stop.js +507 -21
  64. package/dist/hooks/summary-worker.js +411 -61
  65. package/dist/index.js +569 -23
  66. package/dist/lib/cloud-sync.js +391 -53
  67. package/dist/lib/config.js +13 -1
  68. package/dist/lib/consolidation.js +1 -1
  69. package/dist/lib/database.js +124 -0
  70. package/dist/lib/db.js +124 -0
  71. package/dist/lib/device-registry.js +124 -0
  72. package/dist/lib/embedder.js +13 -1
  73. package/dist/lib/exe-daemon.js +2184 -561
  74. package/dist/lib/hybrid-search.js +518 -24
  75. package/dist/lib/identity.js +3 -0
  76. package/dist/lib/keychain.js +178 -22
  77. package/dist/lib/messaging.js +3 -0
  78. package/dist/lib/reminders.js +3 -0
  79. package/dist/lib/schedules.js +233 -20
  80. package/dist/lib/skill-learning.js +16 -1
  81. package/dist/lib/store.js +506 -20
  82. package/dist/lib/tasks.js +16 -1
  83. package/dist/lib/tmux-routing.js +16 -1
  84. package/dist/lib/token-spend.js +3 -0
  85. package/dist/mcp/server.js +1757 -428
  86. package/dist/mcp/tools/complete-reminder.js +3 -0
  87. package/dist/mcp/tools/create-reminder.js +3 -0
  88. package/dist/mcp/tools/create-task.js +16 -1
  89. package/dist/mcp/tools/deactivate-behavior.js +3 -0
  90. package/dist/mcp/tools/list-reminders.js +3 -0
  91. package/dist/mcp/tools/list-tasks.js +3 -0
  92. package/dist/mcp/tools/send-message.js +3 -0
  93. package/dist/mcp/tools/update-task.js +16 -1
  94. package/dist/runtime/index.js +516 -22
  95. package/dist/tui/App.js +594 -29
  96. package/package.json +8 -5
  97. package/src/commands/exe/cloud.md +6 -10
  98. package/stack.release.json +3 -3
  99. package/src/commands/exe/link.md +0 -18
@@ -201,6 +201,10 @@ async function loadConfig() {
201
201
  if (config.dbPath.startsWith("~")) {
202
202
  config.dbPath = config.dbPath.replace(/^~/, os.homedir());
203
203
  }
204
+ const envDbPath = path.join(dir, "memories.db");
205
+ if (process.env.EXE_OS_DIR && config.dbPath !== envDbPath && !existsSync2(config.dbPath) && existsSync2(envDbPath)) {
206
+ config.dbPath = envDbPath;
207
+ }
204
208
  return config;
205
209
  } catch {
206
210
  return { ...DEFAULT_CONFIG, dbPath: path.join(dir, "memories.db") };
@@ -221,7 +225,15 @@ function loadConfigSync() {
221
225
  normalizeSessionLifecycle(migratedCfg);
222
226
  normalizeAutoUpdate(migratedCfg);
223
227
  normalizeOrchestration(migratedCfg);
224
- return { ...DEFAULT_CONFIG, dbPath: path.join(dir, "memories.db"), ...migratedCfg };
228
+ const config = { ...DEFAULT_CONFIG, dbPath: path.join(dir, "memories.db"), ...migratedCfg };
229
+ if (config.dbPath.startsWith("~")) {
230
+ config.dbPath = config.dbPath.replace(/^~/, os.homedir());
231
+ }
232
+ const envDbPath = path.join(dir, "memories.db");
233
+ if (process.env.EXE_OS_DIR && config.dbPath !== envDbPath && !existsSync2(config.dbPath) && existsSync2(envDbPath)) {
234
+ config.dbPath = envDbPath;
235
+ }
236
+ return config;
225
237
  } catch {
226
238
  return { ...DEFAULT_CONFIG, dbPath: path.join(dir, "memories.db") };
227
239
  }
@@ -558,7 +558,7 @@ init_database();
558
558
 
559
559
  // src/lib/keychain.ts
560
560
  import { readFile as readFile3, writeFile as writeFile3, unlink, mkdir as mkdir3, chmod as chmod2 } from "fs/promises";
561
- import { existsSync as existsSync5 } from "fs";
561
+ import { existsSync as existsSync5, statSync } from "fs";
562
562
  import { execSync as execSync2 } from "child_process";
563
563
  import path5 from "path";
564
564
  import os4 from "os";
@@ -1387,6 +1387,9 @@ function getClient() {
1387
1387
  if (_daemonClient && _daemonClient._isDaemonActive()) {
1388
1388
  return _daemonClient;
1389
1389
  }
1390
+ if (!_resilientClient) {
1391
+ return _adapterClient;
1392
+ }
1390
1393
  return _resilientClient;
1391
1394
  }
1392
1395
  async function initDaemonClient() {
@@ -2419,6 +2422,127 @@ async function ensureSchema() {
2419
2422
  VALUES (new.rowid, new.content, new.subject, new.predicate, new.object);
2420
2423
  END;
2421
2424
  `);
2425
+ await client.executeMultiple(`
2426
+ CREATE TABLE IF NOT EXISTS agent_sessions (
2427
+ id TEXT PRIMARY KEY,
2428
+ agent_id TEXT NOT NULL,
2429
+ project_name TEXT,
2430
+ started_at TEXT NOT NULL,
2431
+ last_event_at TEXT NOT NULL,
2432
+ event_count INTEGER NOT NULL DEFAULT 0,
2433
+ properties TEXT DEFAULT '{}'
2434
+ );
2435
+
2436
+ CREATE INDEX IF NOT EXISTS idx_agent_sessions_agent_time
2437
+ ON agent_sessions(agent_id, started_at);
2438
+
2439
+ CREATE TABLE IF NOT EXISTS agent_goals (
2440
+ id TEXT PRIMARY KEY,
2441
+ statement TEXT NOT NULL,
2442
+ owner_agent_id TEXT,
2443
+ project_name TEXT,
2444
+ status TEXT NOT NULL DEFAULT 'open',
2445
+ priority INTEGER NOT NULL DEFAULT 5,
2446
+ success_criteria TEXT,
2447
+ parent_goal_id TEXT,
2448
+ due_at TEXT,
2449
+ achieved_at TEXT,
2450
+ supersedes_id TEXT,
2451
+ created_at TEXT NOT NULL,
2452
+ updated_at TEXT NOT NULL,
2453
+ source_memory_id TEXT
2454
+ );
2455
+
2456
+ CREATE INDEX IF NOT EXISTS idx_agent_goals_project_status
2457
+ ON agent_goals(project_name, status, priority);
2458
+
2459
+ CREATE TABLE IF NOT EXISTS agent_events (
2460
+ id TEXT PRIMARY KEY,
2461
+ event_type TEXT NOT NULL,
2462
+ occurred_at TEXT NOT NULL,
2463
+ sequence_index INTEGER NOT NULL,
2464
+ actor_agent_id TEXT,
2465
+ agent_role TEXT,
2466
+ project_name TEXT,
2467
+ session_id TEXT,
2468
+ task_id TEXT,
2469
+ goal_id TEXT,
2470
+ parent_event_id TEXT,
2471
+ intention TEXT,
2472
+ outcome TEXT,
2473
+ evidence_memory_id TEXT,
2474
+ impact TEXT,
2475
+ payload TEXT DEFAULT '{}',
2476
+ created_at TEXT NOT NULL
2477
+ );
2478
+
2479
+ CREATE INDEX IF NOT EXISTS idx_agent_events_time
2480
+ ON agent_events(occurred_at, sequence_index);
2481
+
2482
+ CREATE INDEX IF NOT EXISTS idx_agent_events_session_seq
2483
+ ON agent_events(session_id, sequence_index);
2484
+
2485
+ CREATE INDEX IF NOT EXISTS idx_agent_events_goal_time
2486
+ ON agent_events(goal_id, occurred_at);
2487
+
2488
+ CREATE INDEX IF NOT EXISTS idx_agent_events_memory
2489
+ ON agent_events(evidence_memory_id);
2490
+
2491
+ CREATE TABLE IF NOT EXISTS agent_goal_links (
2492
+ id TEXT PRIMARY KEY,
2493
+ goal_id TEXT NOT NULL,
2494
+ link_type TEXT NOT NULL,
2495
+ target_id TEXT NOT NULL,
2496
+ target_type TEXT NOT NULL,
2497
+ created_at TEXT NOT NULL
2498
+ );
2499
+
2500
+ CREATE INDEX IF NOT EXISTS idx_agent_goal_links_goal
2501
+ ON agent_goal_links(goal_id, target_type);
2502
+
2503
+ CREATE TABLE IF NOT EXISTS agent_semantic_labels (
2504
+ id TEXT PRIMARY KEY,
2505
+ source_memory_id TEXT NOT NULL,
2506
+ event_id TEXT,
2507
+ labeler TEXT NOT NULL,
2508
+ schema_version INTEGER NOT NULL DEFAULT 1,
2509
+ confidence REAL NOT NULL DEFAULT 0,
2510
+ labels TEXT NOT NULL,
2511
+ created_at TEXT NOT NULL,
2512
+ updated_at TEXT NOT NULL
2513
+ );
2514
+
2515
+ CREATE INDEX IF NOT EXISTS idx_agent_semantic_labels_memory
2516
+ ON agent_semantic_labels(source_memory_id, labeler);
2517
+
2518
+ CREATE INDEX IF NOT EXISTS idx_agent_semantic_labels_event
2519
+ ON agent_semantic_labels(event_id);
2520
+
2521
+ CREATE TABLE IF NOT EXISTS agent_reflection_checkpoints (
2522
+ id TEXT PRIMARY KEY,
2523
+ project_name TEXT,
2524
+ session_id TEXT,
2525
+ window_start_at TEXT NOT NULL,
2526
+ window_end_at TEXT NOT NULL,
2527
+ event_count INTEGER NOT NULL DEFAULT 0,
2528
+ goal_count INTEGER NOT NULL DEFAULT 0,
2529
+ success_count INTEGER NOT NULL DEFAULT 0,
2530
+ failure_count INTEGER NOT NULL DEFAULT 0,
2531
+ risk_count INTEGER NOT NULL DEFAULT 0,
2532
+ summary TEXT NOT NULL,
2533
+ learnings TEXT NOT NULL DEFAULT '[]',
2534
+ next_actions TEXT NOT NULL DEFAULT '[]',
2535
+ evidence_event_ids TEXT NOT NULL DEFAULT '[]',
2536
+ confidence REAL NOT NULL DEFAULT 0,
2537
+ created_at TEXT NOT NULL
2538
+ );
2539
+
2540
+ CREATE INDEX IF NOT EXISTS idx_agent_reflection_project_time
2541
+ ON agent_reflection_checkpoints(project_name, window_end_at);
2542
+
2543
+ CREATE INDEX IF NOT EXISTS idx_agent_reflection_session_time
2544
+ ON agent_reflection_checkpoints(session_id, window_end_at);
2545
+ `);
2422
2546
  try {
2423
2547
  await client.execute({
2424
2548
  sql: `ALTER TABLE memories ADD COLUMN tier INTEGER DEFAULT 3`,
package/dist/lib/db.js CHANGED
@@ -1387,6 +1387,9 @@ function getClient() {
1387
1387
  if (_daemonClient && _daemonClient._isDaemonActive()) {
1388
1388
  return _daemonClient;
1389
1389
  }
1390
+ if (!_resilientClient) {
1391
+ return _adapterClient;
1392
+ }
1390
1393
  return _resilientClient;
1391
1394
  }
1392
1395
  async function initDaemonClient() {
@@ -2419,6 +2422,127 @@ async function ensureSchema() {
2419
2422
  VALUES (new.rowid, new.content, new.subject, new.predicate, new.object);
2420
2423
  END;
2421
2424
  `);
2425
+ await client.executeMultiple(`
2426
+ CREATE TABLE IF NOT EXISTS agent_sessions (
2427
+ id TEXT PRIMARY KEY,
2428
+ agent_id TEXT NOT NULL,
2429
+ project_name TEXT,
2430
+ started_at TEXT NOT NULL,
2431
+ last_event_at TEXT NOT NULL,
2432
+ event_count INTEGER NOT NULL DEFAULT 0,
2433
+ properties TEXT DEFAULT '{}'
2434
+ );
2435
+
2436
+ CREATE INDEX IF NOT EXISTS idx_agent_sessions_agent_time
2437
+ ON agent_sessions(agent_id, started_at);
2438
+
2439
+ CREATE TABLE IF NOT EXISTS agent_goals (
2440
+ id TEXT PRIMARY KEY,
2441
+ statement TEXT NOT NULL,
2442
+ owner_agent_id TEXT,
2443
+ project_name TEXT,
2444
+ status TEXT NOT NULL DEFAULT 'open',
2445
+ priority INTEGER NOT NULL DEFAULT 5,
2446
+ success_criteria TEXT,
2447
+ parent_goal_id TEXT,
2448
+ due_at TEXT,
2449
+ achieved_at TEXT,
2450
+ supersedes_id TEXT,
2451
+ created_at TEXT NOT NULL,
2452
+ updated_at TEXT NOT NULL,
2453
+ source_memory_id TEXT
2454
+ );
2455
+
2456
+ CREATE INDEX IF NOT EXISTS idx_agent_goals_project_status
2457
+ ON agent_goals(project_name, status, priority);
2458
+
2459
+ CREATE TABLE IF NOT EXISTS agent_events (
2460
+ id TEXT PRIMARY KEY,
2461
+ event_type TEXT NOT NULL,
2462
+ occurred_at TEXT NOT NULL,
2463
+ sequence_index INTEGER NOT NULL,
2464
+ actor_agent_id TEXT,
2465
+ agent_role TEXT,
2466
+ project_name TEXT,
2467
+ session_id TEXT,
2468
+ task_id TEXT,
2469
+ goal_id TEXT,
2470
+ parent_event_id TEXT,
2471
+ intention TEXT,
2472
+ outcome TEXT,
2473
+ evidence_memory_id TEXT,
2474
+ impact TEXT,
2475
+ payload TEXT DEFAULT '{}',
2476
+ created_at TEXT NOT NULL
2477
+ );
2478
+
2479
+ CREATE INDEX IF NOT EXISTS idx_agent_events_time
2480
+ ON agent_events(occurred_at, sequence_index);
2481
+
2482
+ CREATE INDEX IF NOT EXISTS idx_agent_events_session_seq
2483
+ ON agent_events(session_id, sequence_index);
2484
+
2485
+ CREATE INDEX IF NOT EXISTS idx_agent_events_goal_time
2486
+ ON agent_events(goal_id, occurred_at);
2487
+
2488
+ CREATE INDEX IF NOT EXISTS idx_agent_events_memory
2489
+ ON agent_events(evidence_memory_id);
2490
+
2491
+ CREATE TABLE IF NOT EXISTS agent_goal_links (
2492
+ id TEXT PRIMARY KEY,
2493
+ goal_id TEXT NOT NULL,
2494
+ link_type TEXT NOT NULL,
2495
+ target_id TEXT NOT NULL,
2496
+ target_type TEXT NOT NULL,
2497
+ created_at TEXT NOT NULL
2498
+ );
2499
+
2500
+ CREATE INDEX IF NOT EXISTS idx_agent_goal_links_goal
2501
+ ON agent_goal_links(goal_id, target_type);
2502
+
2503
+ CREATE TABLE IF NOT EXISTS agent_semantic_labels (
2504
+ id TEXT PRIMARY KEY,
2505
+ source_memory_id TEXT NOT NULL,
2506
+ event_id TEXT,
2507
+ labeler TEXT NOT NULL,
2508
+ schema_version INTEGER NOT NULL DEFAULT 1,
2509
+ confidence REAL NOT NULL DEFAULT 0,
2510
+ labels TEXT NOT NULL,
2511
+ created_at TEXT NOT NULL,
2512
+ updated_at TEXT NOT NULL
2513
+ );
2514
+
2515
+ CREATE INDEX IF NOT EXISTS idx_agent_semantic_labels_memory
2516
+ ON agent_semantic_labels(source_memory_id, labeler);
2517
+
2518
+ CREATE INDEX IF NOT EXISTS idx_agent_semantic_labels_event
2519
+ ON agent_semantic_labels(event_id);
2520
+
2521
+ CREATE TABLE IF NOT EXISTS agent_reflection_checkpoints (
2522
+ id TEXT PRIMARY KEY,
2523
+ project_name TEXT,
2524
+ session_id TEXT,
2525
+ window_start_at TEXT NOT NULL,
2526
+ window_end_at TEXT NOT NULL,
2527
+ event_count INTEGER NOT NULL DEFAULT 0,
2528
+ goal_count INTEGER NOT NULL DEFAULT 0,
2529
+ success_count INTEGER NOT NULL DEFAULT 0,
2530
+ failure_count INTEGER NOT NULL DEFAULT 0,
2531
+ risk_count INTEGER NOT NULL DEFAULT 0,
2532
+ summary TEXT NOT NULL,
2533
+ learnings TEXT NOT NULL DEFAULT '[]',
2534
+ next_actions TEXT NOT NULL DEFAULT '[]',
2535
+ evidence_event_ids TEXT NOT NULL DEFAULT '[]',
2536
+ confidence REAL NOT NULL DEFAULT 0,
2537
+ created_at TEXT NOT NULL
2538
+ );
2539
+
2540
+ CREATE INDEX IF NOT EXISTS idx_agent_reflection_project_time
2541
+ ON agent_reflection_checkpoints(project_name, window_end_at);
2542
+
2543
+ CREATE INDEX IF NOT EXISTS idx_agent_reflection_session_time
2544
+ ON agent_reflection_checkpoints(session_id, window_end_at);
2545
+ `);
2422
2546
  try {
2423
2547
  await client.execute({
2424
2548
  sql: `ALTER TABLE memories ADD COLUMN tier INTEGER DEFAULT 3`,
@@ -1416,6 +1416,9 @@ function getClient() {
1416
1416
  if (_daemonClient && _daemonClient._isDaemonActive()) {
1417
1417
  return _daemonClient;
1418
1418
  }
1419
+ if (!_resilientClient) {
1420
+ return _adapterClient;
1421
+ }
1419
1422
  return _resilientClient;
1420
1423
  }
1421
1424
  async function initDaemonClient() {
@@ -2448,6 +2451,127 @@ async function ensureSchema() {
2448
2451
  VALUES (new.rowid, new.content, new.subject, new.predicate, new.object);
2449
2452
  END;
2450
2453
  `);
2454
+ await client.executeMultiple(`
2455
+ CREATE TABLE IF NOT EXISTS agent_sessions (
2456
+ id TEXT PRIMARY KEY,
2457
+ agent_id TEXT NOT NULL,
2458
+ project_name TEXT,
2459
+ started_at TEXT NOT NULL,
2460
+ last_event_at TEXT NOT NULL,
2461
+ event_count INTEGER NOT NULL DEFAULT 0,
2462
+ properties TEXT DEFAULT '{}'
2463
+ );
2464
+
2465
+ CREATE INDEX IF NOT EXISTS idx_agent_sessions_agent_time
2466
+ ON agent_sessions(agent_id, started_at);
2467
+
2468
+ CREATE TABLE IF NOT EXISTS agent_goals (
2469
+ id TEXT PRIMARY KEY,
2470
+ statement TEXT NOT NULL,
2471
+ owner_agent_id TEXT,
2472
+ project_name TEXT,
2473
+ status TEXT NOT NULL DEFAULT 'open',
2474
+ priority INTEGER NOT NULL DEFAULT 5,
2475
+ success_criteria TEXT,
2476
+ parent_goal_id TEXT,
2477
+ due_at TEXT,
2478
+ achieved_at TEXT,
2479
+ supersedes_id TEXT,
2480
+ created_at TEXT NOT NULL,
2481
+ updated_at TEXT NOT NULL,
2482
+ source_memory_id TEXT
2483
+ );
2484
+
2485
+ CREATE INDEX IF NOT EXISTS idx_agent_goals_project_status
2486
+ ON agent_goals(project_name, status, priority);
2487
+
2488
+ CREATE TABLE IF NOT EXISTS agent_events (
2489
+ id TEXT PRIMARY KEY,
2490
+ event_type TEXT NOT NULL,
2491
+ occurred_at TEXT NOT NULL,
2492
+ sequence_index INTEGER NOT NULL,
2493
+ actor_agent_id TEXT,
2494
+ agent_role TEXT,
2495
+ project_name TEXT,
2496
+ session_id TEXT,
2497
+ task_id TEXT,
2498
+ goal_id TEXT,
2499
+ parent_event_id TEXT,
2500
+ intention TEXT,
2501
+ outcome TEXT,
2502
+ evidence_memory_id TEXT,
2503
+ impact TEXT,
2504
+ payload TEXT DEFAULT '{}',
2505
+ created_at TEXT NOT NULL
2506
+ );
2507
+
2508
+ CREATE INDEX IF NOT EXISTS idx_agent_events_time
2509
+ ON agent_events(occurred_at, sequence_index);
2510
+
2511
+ CREATE INDEX IF NOT EXISTS idx_agent_events_session_seq
2512
+ ON agent_events(session_id, sequence_index);
2513
+
2514
+ CREATE INDEX IF NOT EXISTS idx_agent_events_goal_time
2515
+ ON agent_events(goal_id, occurred_at);
2516
+
2517
+ CREATE INDEX IF NOT EXISTS idx_agent_events_memory
2518
+ ON agent_events(evidence_memory_id);
2519
+
2520
+ CREATE TABLE IF NOT EXISTS agent_goal_links (
2521
+ id TEXT PRIMARY KEY,
2522
+ goal_id TEXT NOT NULL,
2523
+ link_type TEXT NOT NULL,
2524
+ target_id TEXT NOT NULL,
2525
+ target_type TEXT NOT NULL,
2526
+ created_at TEXT NOT NULL
2527
+ );
2528
+
2529
+ CREATE INDEX IF NOT EXISTS idx_agent_goal_links_goal
2530
+ ON agent_goal_links(goal_id, target_type);
2531
+
2532
+ CREATE TABLE IF NOT EXISTS agent_semantic_labels (
2533
+ id TEXT PRIMARY KEY,
2534
+ source_memory_id TEXT NOT NULL,
2535
+ event_id TEXT,
2536
+ labeler TEXT NOT NULL,
2537
+ schema_version INTEGER NOT NULL DEFAULT 1,
2538
+ confidence REAL NOT NULL DEFAULT 0,
2539
+ labels TEXT NOT NULL,
2540
+ created_at TEXT NOT NULL,
2541
+ updated_at TEXT NOT NULL
2542
+ );
2543
+
2544
+ CREATE INDEX IF NOT EXISTS idx_agent_semantic_labels_memory
2545
+ ON agent_semantic_labels(source_memory_id, labeler);
2546
+
2547
+ CREATE INDEX IF NOT EXISTS idx_agent_semantic_labels_event
2548
+ ON agent_semantic_labels(event_id);
2549
+
2550
+ CREATE TABLE IF NOT EXISTS agent_reflection_checkpoints (
2551
+ id TEXT PRIMARY KEY,
2552
+ project_name TEXT,
2553
+ session_id TEXT,
2554
+ window_start_at TEXT NOT NULL,
2555
+ window_end_at TEXT NOT NULL,
2556
+ event_count INTEGER NOT NULL DEFAULT 0,
2557
+ goal_count INTEGER NOT NULL DEFAULT 0,
2558
+ success_count INTEGER NOT NULL DEFAULT 0,
2559
+ failure_count INTEGER NOT NULL DEFAULT 0,
2560
+ risk_count INTEGER NOT NULL DEFAULT 0,
2561
+ summary TEXT NOT NULL,
2562
+ learnings TEXT NOT NULL DEFAULT '[]',
2563
+ next_actions TEXT NOT NULL DEFAULT '[]',
2564
+ evidence_event_ids TEXT NOT NULL DEFAULT '[]',
2565
+ confidence REAL NOT NULL DEFAULT 0,
2566
+ created_at TEXT NOT NULL
2567
+ );
2568
+
2569
+ CREATE INDEX IF NOT EXISTS idx_agent_reflection_project_time
2570
+ ON agent_reflection_checkpoints(project_name, window_end_at);
2571
+
2572
+ CREATE INDEX IF NOT EXISTS idx_agent_reflection_session_time
2573
+ ON agent_reflection_checkpoints(session_id, window_end_at);
2574
+ `);
2451
2575
  try {
2452
2576
  await client.execute({
2453
2577
  sql: `ALTER TABLE memories ADD COLUMN tier INTEGER DEFAULT 3`,
@@ -172,6 +172,10 @@ async function loadConfig() {
172
172
  if (config.dbPath.startsWith("~")) {
173
173
  config.dbPath = config.dbPath.replace(/^~/, os.homedir());
174
174
  }
175
+ const envDbPath = path.join(dir, "memories.db");
176
+ if (process.env.EXE_OS_DIR && config.dbPath !== envDbPath && !existsSync2(config.dbPath) && existsSync2(envDbPath)) {
177
+ config.dbPath = envDbPath;
178
+ }
175
179
  return config;
176
180
  } catch {
177
181
  return { ...DEFAULT_CONFIG, dbPath: path.join(dir, "memories.db") };
@@ -192,7 +196,15 @@ function loadConfigSync() {
192
196
  normalizeSessionLifecycle(migratedCfg);
193
197
  normalizeAutoUpdate(migratedCfg);
194
198
  normalizeOrchestration(migratedCfg);
195
- return { ...DEFAULT_CONFIG, dbPath: path.join(dir, "memories.db"), ...migratedCfg };
199
+ const config = { ...DEFAULT_CONFIG, dbPath: path.join(dir, "memories.db"), ...migratedCfg };
200
+ if (config.dbPath.startsWith("~")) {
201
+ config.dbPath = config.dbPath.replace(/^~/, os.homedir());
202
+ }
203
+ const envDbPath = path.join(dir, "memories.db");
204
+ if (process.env.EXE_OS_DIR && config.dbPath !== envDbPath && !existsSync2(config.dbPath) && existsSync2(envDbPath)) {
205
+ config.dbPath = envDbPath;
206
+ }
207
+ return config;
196
208
  } catch {
197
209
  return { ...DEFAULT_CONFIG, dbPath: path.join(dir, "memories.db") };
198
210
  }