@askexenow/exe-os 0.9.65 → 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 (113) 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} +1532 -2173
  6. package/dist/bin/backfill-conversations.js +528 -20
  7. package/dist/bin/backfill-responses.js +528 -20
  8. package/dist/bin/backfill-vectors.js +255 -20
  9. package/dist/bin/bulk-sync-postgres.js +4876 -0
  10. package/dist/bin/cleanup-stale-review-tasks.js +529 -21
  11. package/dist/bin/cli.js +3471 -1491
  12. package/dist/bin/exe-agent-config.js +4 -0
  13. package/dist/bin/exe-agent.js +16 -0
  14. package/dist/bin/exe-assign.js +528 -20
  15. package/dist/bin/exe-boot.js +492 -54
  16. package/dist/bin/exe-call.js +16 -0
  17. package/dist/bin/exe-cloud.js +7415 -518
  18. package/dist/bin/exe-dispatch.js +540 -22
  19. package/dist/bin/exe-doctor.js +3404 -1225
  20. package/dist/bin/exe-export-behaviors.js +542 -24
  21. package/dist/bin/exe-forget.js +529 -21
  22. package/dist/bin/exe-gateway.js +595 -25
  23. package/dist/bin/exe-heartbeat.js +541 -24
  24. package/dist/bin/exe-kill.js +529 -21
  25. package/dist/bin/exe-launch-agent.js +2334 -1067
  26. package/dist/bin/exe-new-employee.js +324 -166
  27. package/dist/bin/exe-pending-messages.js +529 -21
  28. package/dist/bin/exe-pending-notifications.js +529 -21
  29. package/dist/bin/exe-pending-reviews.js +529 -21
  30. package/dist/bin/exe-rename.js +529 -21
  31. package/dist/bin/exe-review.js +529 -21
  32. package/dist/bin/exe-search.js +542 -24
  33. package/dist/bin/exe-session-cleanup.js +540 -22
  34. package/dist/bin/exe-settings.js +14 -0
  35. package/dist/bin/exe-start-codex.js +817 -144
  36. package/dist/bin/exe-start-opencode.js +776 -80
  37. package/dist/bin/exe-status.js +529 -21
  38. package/dist/bin/exe-team.js +529 -21
  39. package/dist/bin/git-sweep.js +540 -22
  40. package/dist/bin/graph-backfill.js +580 -21
  41. package/dist/bin/graph-export.js +529 -21
  42. package/dist/bin/graph-layer-benchmark.js +109 -0
  43. package/dist/bin/install.js +420 -289
  44. package/dist/bin/intercom-check.js +540 -22
  45. package/dist/bin/postgres-agentic-reflection-backfill.js +187 -0
  46. package/dist/bin/postgres-agentic-semantic-backfill.js +237 -0
  47. package/dist/bin/scan-tasks.js +540 -22
  48. package/dist/bin/setup.js +790 -206
  49. package/dist/bin/shard-migrate.js +528 -20
  50. package/dist/bin/update.js +4 -0
  51. package/dist/gateway/index.js +593 -23
  52. package/dist/hooks/bug-report-worker.js +651 -64
  53. package/dist/hooks/codex-stop-task-finalizer.js +540 -22
  54. package/dist/hooks/commit-complete.js +540 -22
  55. package/dist/hooks/error-recall.js +542 -24
  56. package/dist/hooks/exe-heartbeat-hook.js +4 -0
  57. package/dist/hooks/ingest-worker.js +4 -0
  58. package/dist/hooks/ingest.js +539 -22
  59. package/dist/hooks/instructions-loaded.js +529 -21
  60. package/dist/hooks/notification.js +529 -21
  61. package/dist/hooks/post-compact.js +529 -21
  62. package/dist/hooks/post-tool-combined.js +543 -25
  63. package/dist/hooks/pre-compact.js +772 -127
  64. package/dist/hooks/pre-tool-use.js +529 -21
  65. package/dist/hooks/prompt-submit.js +543 -25
  66. package/dist/hooks/session-end.js +673 -140
  67. package/dist/hooks/session-start.js +662 -26
  68. package/dist/hooks/stop.js +540 -23
  69. package/dist/hooks/subagent-stop.js +529 -21
  70. package/dist/hooks/summary-worker.js +571 -126
  71. package/dist/index.js +593 -23
  72. package/dist/lib/agent-config.js +4 -0
  73. package/dist/lib/cloud-sync.js +408 -47
  74. package/dist/lib/config.js +25 -1
  75. package/dist/lib/consolidation.js +5 -1
  76. package/dist/lib/database.js +128 -0
  77. package/dist/lib/db-daemon-client.js +4 -0
  78. package/dist/lib/db.js +128 -0
  79. package/dist/lib/device-registry.js +128 -0
  80. package/dist/lib/embedder.js +25 -1
  81. package/dist/lib/employee-templates.js +16 -0
  82. package/dist/lib/employees.js +4 -0
  83. package/dist/lib/exe-daemon-client.js +4 -0
  84. package/dist/lib/exe-daemon.js +3158 -930
  85. package/dist/lib/hybrid-search.js +542 -24
  86. package/dist/lib/identity.js +7 -0
  87. package/dist/lib/keychain.js +178 -22
  88. package/dist/lib/license.js +4 -0
  89. package/dist/lib/messaging.js +7 -0
  90. package/dist/lib/reminders.js +7 -0
  91. package/dist/lib/schedules.js +255 -20
  92. package/dist/lib/skill-learning.js +28 -1
  93. package/dist/lib/status-brief.js +39 -0
  94. package/dist/lib/store.js +528 -20
  95. package/dist/lib/task-router.js +4 -0
  96. package/dist/lib/tasks.js +28 -1
  97. package/dist/lib/tmux-routing.js +28 -1
  98. package/dist/lib/token-spend.js +7 -0
  99. package/dist/mcp/server.js +2739 -813
  100. package/dist/mcp/tools/complete-reminder.js +7 -0
  101. package/dist/mcp/tools/create-reminder.js +7 -0
  102. package/dist/mcp/tools/create-task.js +28 -1
  103. package/dist/mcp/tools/deactivate-behavior.js +7 -0
  104. package/dist/mcp/tools/list-reminders.js +7 -0
  105. package/dist/mcp/tools/list-tasks.js +7 -0
  106. package/dist/mcp/tools/send-message.js +7 -0
  107. package/dist/mcp/tools/update-task.js +28 -1
  108. package/dist/runtime/index.js +540 -22
  109. package/dist/tui/App.js +618 -29
  110. package/package.json +9 -5
  111. package/src/commands/exe/cloud.md +11 -8
  112. package/stack.release.json +3 -3
  113. package/src/commands/exe/link.md +0 -17
@@ -101,6 +101,10 @@ var DEFAULT_CONFIG = {
101
101
  checkOnBoot: true,
102
102
  autoInstall: false,
103
103
  checkIntervalMs: 24 * 60 * 60 * 1e3
104
+ },
105
+ orchestration: {
106
+ phase: "phase_1_coo",
107
+ phaseSetBy: "default"
104
108
  }
105
109
  };
106
110
  function migrateLegacyConfig(raw) {
@@ -163,6 +167,11 @@ function normalizeAutoUpdate(raw) {
163
167
  const userAU = raw.autoUpdate ?? {};
164
168
  raw.autoUpdate = { ...defaultAU, ...userAU };
165
169
  }
170
+ function normalizeOrchestration(raw) {
171
+ const defaultOrg = DEFAULT_CONFIG.orchestration;
172
+ const userOrg = raw.orchestration ?? {};
173
+ raw.orchestration = { ...defaultOrg, ...userOrg };
174
+ }
166
175
  async function loadConfig() {
167
176
  const dir = process.env.EXE_OS_DIR ?? process.env.EXE_MEM_DIR ?? EXE_AI_DIR;
168
177
  await ensurePrivateDir(dir);
@@ -187,10 +196,15 @@ async function loadConfig() {
187
196
  normalizeScalingRoadmap(migratedCfg);
188
197
  normalizeSessionLifecycle(migratedCfg);
189
198
  normalizeAutoUpdate(migratedCfg);
199
+ normalizeOrchestration(migratedCfg);
190
200
  const config = { ...DEFAULT_CONFIG, dbPath: path.join(dir, "memories.db"), ...migratedCfg };
191
201
  if (config.dbPath.startsWith("~")) {
192
202
  config.dbPath = config.dbPath.replace(/^~/, os.homedir());
193
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
+ }
194
208
  return config;
195
209
  } catch {
196
210
  return { ...DEFAULT_CONFIG, dbPath: path.join(dir, "memories.db") };
@@ -210,7 +224,16 @@ function loadConfigSync() {
210
224
  normalizeScalingRoadmap(migratedCfg);
211
225
  normalizeSessionLifecycle(migratedCfg);
212
226
  normalizeAutoUpdate(migratedCfg);
213
- return { ...DEFAULT_CONFIG, dbPath: path.join(dir, "memories.db"), ...migratedCfg };
227
+ normalizeOrchestration(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;
214
237
  } catch {
215
238
  return { ...DEFAULT_CONFIG, dbPath: path.join(dir, "memories.db") };
216
239
  }
@@ -231,6 +254,7 @@ async function loadConfigFrom(configPath) {
231
254
  normalizeScalingRoadmap(migratedCfg);
232
255
  normalizeSessionLifecycle(migratedCfg);
233
256
  normalizeAutoUpdate(migratedCfg);
257
+ normalizeOrchestration(migratedCfg);
234
258
  return { ...DEFAULT_CONFIG, ...migratedCfg };
235
259
  } catch {
236
260
  return { ...DEFAULT_CONFIG };
@@ -134,6 +134,10 @@ var init_config = __esm({
134
134
  checkOnBoot: true,
135
135
  autoInstall: false,
136
136
  checkIntervalMs: 24 * 60 * 60 * 1e3
137
+ },
138
+ orchestration: {
139
+ phase: "phase_1_coo",
140
+ phaseSetBy: "default"
137
141
  }
138
142
  };
139
143
  }
@@ -554,7 +558,7 @@ init_database();
554
558
 
555
559
  // src/lib/keychain.ts
556
560
  import { readFile as readFile3, writeFile as writeFile3, unlink, mkdir as mkdir3, chmod as chmod2 } from "fs/promises";
557
- import { existsSync as existsSync5 } from "fs";
561
+ import { existsSync as existsSync5, statSync } from "fs";
558
562
  import { execSync as execSync2 } from "child_process";
559
563
  import path5 from "path";
560
564
  import os4 from "os";
@@ -126,6 +126,10 @@ var init_config = __esm({
126
126
  checkOnBoot: true,
127
127
  autoInstall: false,
128
128
  checkIntervalMs: 24 * 60 * 60 * 1e3
129
+ },
130
+ orchestration: {
131
+ phase: "phase_1_coo",
132
+ phaseSetBy: "default"
129
133
  }
130
134
  };
131
135
  }
@@ -1383,6 +1387,9 @@ function getClient() {
1383
1387
  if (_daemonClient && _daemonClient._isDaemonActive()) {
1384
1388
  return _daemonClient;
1385
1389
  }
1390
+ if (!_resilientClient) {
1391
+ return _adapterClient;
1392
+ }
1386
1393
  return _resilientClient;
1387
1394
  }
1388
1395
  async function initDaemonClient() {
@@ -2415,6 +2422,127 @@ async function ensureSchema() {
2415
2422
  VALUES (new.rowid, new.content, new.subject, new.predicate, new.object);
2416
2423
  END;
2417
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
+ `);
2418
2546
  try {
2419
2547
  await client.execute({
2420
2548
  sql: `ALTER TABLE memories ADD COLUMN tier INTEGER DEFAULT 3`,
@@ -117,6 +117,10 @@ var DEFAULT_CONFIG = {
117
117
  checkOnBoot: true,
118
118
  autoInstall: false,
119
119
  checkIntervalMs: 24 * 60 * 60 * 1e3
120
+ },
121
+ orchestration: {
122
+ phase: "phase_1_coo",
123
+ phaseSetBy: "default"
120
124
  }
121
125
  };
122
126
 
package/dist/lib/db.js CHANGED
@@ -126,6 +126,10 @@ var init_config = __esm({
126
126
  checkOnBoot: true,
127
127
  autoInstall: false,
128
128
  checkIntervalMs: 24 * 60 * 60 * 1e3
129
+ },
130
+ orchestration: {
131
+ phase: "phase_1_coo",
132
+ phaseSetBy: "default"
129
133
  }
130
134
  };
131
135
  }
@@ -1383,6 +1387,9 @@ function getClient() {
1383
1387
  if (_daemonClient && _daemonClient._isDaemonActive()) {
1384
1388
  return _daemonClient;
1385
1389
  }
1390
+ if (!_resilientClient) {
1391
+ return _adapterClient;
1392
+ }
1386
1393
  return _resilientClient;
1387
1394
  }
1388
1395
  async function initDaemonClient() {
@@ -2415,6 +2422,127 @@ async function ensureSchema() {
2415
2422
  VALUES (new.rowid, new.content, new.subject, new.predicate, new.object);
2416
2423
  END;
2417
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
+ `);
2418
2546
  try {
2419
2547
  await client.execute({
2420
2548
  sql: `ALTER TABLE memories ADD COLUMN tier INTEGER DEFAULT 3`,
@@ -126,6 +126,10 @@ var init_config = __esm({
126
126
  checkOnBoot: true,
127
127
  autoInstall: false,
128
128
  checkIntervalMs: 24 * 60 * 60 * 1e3
129
+ },
130
+ orchestration: {
131
+ phase: "phase_1_coo",
132
+ phaseSetBy: "default"
129
133
  }
130
134
  };
131
135
  }
@@ -1412,6 +1416,9 @@ function getClient() {
1412
1416
  if (_daemonClient && _daemonClient._isDaemonActive()) {
1413
1417
  return _daemonClient;
1414
1418
  }
1419
+ if (!_resilientClient) {
1420
+ return _adapterClient;
1421
+ }
1415
1422
  return _resilientClient;
1416
1423
  }
1417
1424
  async function initDaemonClient() {
@@ -2444,6 +2451,127 @@ async function ensureSchema() {
2444
2451
  VALUES (new.rowid, new.content, new.subject, new.predicate, new.object);
2445
2452
  END;
2446
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
+ `);
2447
2575
  try {
2448
2576
  await client.execute({
2449
2577
  sql: `ALTER TABLE memories ADD COLUMN tier INTEGER DEFAULT 3`,
@@ -138,6 +138,11 @@ function normalizeAutoUpdate(raw) {
138
138
  const userAU = raw.autoUpdate ?? {};
139
139
  raw.autoUpdate = { ...defaultAU, ...userAU };
140
140
  }
141
+ function normalizeOrchestration(raw) {
142
+ const defaultOrg = DEFAULT_CONFIG.orchestration;
143
+ const userOrg = raw.orchestration ?? {};
144
+ raw.orchestration = { ...defaultOrg, ...userOrg };
145
+ }
141
146
  async function loadConfig() {
142
147
  const dir = process.env.EXE_OS_DIR ?? process.env.EXE_MEM_DIR ?? EXE_AI_DIR;
143
148
  await ensurePrivateDir(dir);
@@ -162,10 +167,15 @@ async function loadConfig() {
162
167
  normalizeScalingRoadmap(migratedCfg);
163
168
  normalizeSessionLifecycle(migratedCfg);
164
169
  normalizeAutoUpdate(migratedCfg);
170
+ normalizeOrchestration(migratedCfg);
165
171
  const config = { ...DEFAULT_CONFIG, dbPath: path.join(dir, "memories.db"), ...migratedCfg };
166
172
  if (config.dbPath.startsWith("~")) {
167
173
  config.dbPath = config.dbPath.replace(/^~/, os.homedir());
168
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
+ }
169
179
  return config;
170
180
  } catch {
171
181
  return { ...DEFAULT_CONFIG, dbPath: path.join(dir, "memories.db") };
@@ -185,7 +195,16 @@ function loadConfigSync() {
185
195
  normalizeScalingRoadmap(migratedCfg);
186
196
  normalizeSessionLifecycle(migratedCfg);
187
197
  normalizeAutoUpdate(migratedCfg);
188
- return { ...DEFAULT_CONFIG, dbPath: path.join(dir, "memories.db"), ...migratedCfg };
198
+ normalizeOrchestration(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;
189
208
  } catch {
190
209
  return { ...DEFAULT_CONFIG, dbPath: path.join(dir, "memories.db") };
191
210
  }
@@ -206,6 +225,7 @@ async function loadConfigFrom(configPath) {
206
225
  normalizeScalingRoadmap(migratedCfg);
207
226
  normalizeSessionLifecycle(migratedCfg);
208
227
  normalizeAutoUpdate(migratedCfg);
228
+ normalizeOrchestration(migratedCfg);
209
229
  return { ...DEFAULT_CONFIG, ...migratedCfg };
210
230
  } catch {
211
231
  return { ...DEFAULT_CONFIG };
@@ -277,6 +297,10 @@ var init_config = __esm({
277
297
  checkOnBoot: true,
278
298
  autoInstall: false,
279
299
  checkIntervalMs: 24 * 60 * 60 * 1e3
300
+ },
301
+ orchestration: {
302
+ phase: "phase_1_coo",
303
+ phaseSetBy: "default"
280
304
  }
281
305
  };
282
306
  CONFIG_MIGRATIONS = [
@@ -99,6 +99,10 @@ var init_config = __esm({
99
99
  checkOnBoot: true,
100
100
  autoInstall: false,
101
101
  checkIntervalMs: 24 * 60 * 60 * 1e3
102
+ },
103
+ orchestration: {
104
+ phase: "phase_1_coo",
105
+ phaseSetBy: "default"
102
106
  }
103
107
  };
104
108
  }
@@ -169,6 +173,12 @@ var PLATFORM_PROCEDURES = [
169
173
  priority: "p0",
170
174
  content: "Founder -> coordinator (the executive agent, internally routed as 'COO') -> CTO/CMO. CTO -> engineers. CMO -> content production. Never skip levels: the coordinator does not bypass managers for specialist work. Specialists report to their manager. If you need cross-team info, use ask_team_memory \u2014 don't read other agents' task folders. Each level owns dispatch downward and review upward."
171
175
  },
176
+ {
177
+ title: "Customer orchestration maturity \u2014 recommend, never trap",
178
+ domain: "workflow",
179
+ priority: "p1",
180
+ content: "New customers start best in Phase 1: founder \u2194 coordinator/Chief of Staff, building company context. Suggest Phase 2 executives when domain work repeats; suggest Phase 3 parallel execution only when review/permission gates are ready. This is guidance, not a blocker: users may jump phases anytime. Never overwrite their phase, role titles, identities, or custom org design."
181
+ },
172
182
  {
173
183
  title: "Single dispatch path \u2014 create_task only",
174
184
  domain: "workflow",
@@ -227,6 +237,12 @@ var PLATFORM_PROCEDURES = [
227
237
  priority: "p0",
228
238
  content: "exe-build-adv is MANDATORY for ALL work touching 3+ files. Run /exe-build-adv --auto BEFORE implementation. Pipeline: Spec \u2192 AC \u2192 Tests \u2192 Evaluate \u2192 Fix. No multi-file feature ships without pipeline artifacts. No exceptions \u2014 managers reject work without them."
229
239
  },
240
+ {
241
+ title: "Commit discipline \u2014 never leave verified work floating",
242
+ domain: "workflow",
243
+ priority: "p1",
244
+ content: "After any code-change batch passes typecheck/tests/build, run git status, summarize changed files, and commit with a clear message before ending the session. If work must remain uncommitted for review/dogfood, explicitly say so, list the files, and state the blocker. Never imply work is complete while verified changes are still floating locally."
245
+ },
230
246
  {
231
247
  title: "Desktop and TUI are the same product",
232
248
  domain: "architecture",
@@ -120,6 +120,10 @@ var init_config = __esm({
120
120
  checkOnBoot: true,
121
121
  autoInstall: false,
122
122
  checkIntervalMs: 24 * 60 * 60 * 1e3
123
+ },
124
+ orchestration: {
125
+ phase: "phase_1_coo",
126
+ phaseSetBy: "default"
123
127
  }
124
128
  };
125
129
  }
@@ -117,6 +117,10 @@ var DEFAULT_CONFIG = {
117
117
  checkOnBoot: true,
118
118
  autoInstall: false,
119
119
  checkIntervalMs: 24 * 60 * 60 * 1e3
120
+ },
121
+ orchestration: {
122
+ phase: "phase_1_coo",
123
+ phaseSetBy: "default"
120
124
  }
121
125
  };
122
126