@askexenow/exe-os 0.8.0 → 0.8.1

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 (90) hide show
  1. package/README.md +178 -79
  2. package/dist/bin/backfill-responses.js +160 -8
  3. package/dist/bin/backfill-vectors.js +130 -1
  4. package/dist/bin/cleanup-stale-review-tasks.js +130 -1
  5. package/dist/bin/cli.js +10111 -7540
  6. package/dist/bin/exe-agent.js +159 -1
  7. package/dist/bin/exe-assign.js +235 -16
  8. package/dist/bin/exe-boot.js +344 -472
  9. package/dist/bin/exe-call.js +145 -1
  10. package/dist/bin/exe-cloud.js +11 -0
  11. package/dist/bin/exe-dispatch.js +37 -24
  12. package/dist/bin/exe-doctor.js +130 -1
  13. package/dist/bin/exe-export-behaviors.js +150 -7
  14. package/dist/bin/exe-forget.js +822 -665
  15. package/dist/bin/exe-gateway.js +470 -62
  16. package/dist/bin/exe-heartbeat.js +133 -2
  17. package/dist/bin/exe-kill.js +150 -7
  18. package/dist/bin/exe-launch-agent.js +150 -7
  19. package/dist/bin/exe-new-employee.js +756 -224
  20. package/dist/bin/exe-pending-messages.js +132 -2
  21. package/dist/bin/exe-pending-notifications.js +130 -1
  22. package/dist/bin/exe-pending-reviews.js +132 -2
  23. package/dist/bin/exe-review.js +160 -8
  24. package/dist/bin/exe-search.js +2473 -2008
  25. package/dist/bin/exe-session-cleanup.js +238 -51
  26. package/dist/bin/exe-settings.js +11 -0
  27. package/dist/bin/exe-status.js +130 -1
  28. package/dist/bin/exe-team.js +130 -1
  29. package/dist/bin/git-sweep.js +272 -16
  30. package/dist/bin/graph-backfill.js +150 -7
  31. package/dist/bin/graph-export.js +150 -7
  32. package/dist/bin/install.js +5 -0
  33. package/dist/bin/scan-tasks.js +238 -19
  34. package/dist/bin/setup.js +1776 -10
  35. package/dist/bin/shard-migrate.js +150 -7
  36. package/dist/bin/update.js +9 -6
  37. package/dist/bin/wiki-sync.js +150 -7
  38. package/dist/gateway/index.js +470 -62
  39. package/dist/hooks/bug-report-worker.js +195 -35
  40. package/dist/hooks/commit-complete.js +272 -16
  41. package/dist/hooks/error-recall.js +2313 -1847
  42. package/dist/hooks/exe-heartbeat-hook.js +5 -0
  43. package/dist/hooks/ingest-worker.js +330 -58
  44. package/dist/hooks/ingest.js +11 -0
  45. package/dist/hooks/instructions-loaded.js +199 -10
  46. package/dist/hooks/notification.js +199 -10
  47. package/dist/hooks/post-compact.js +199 -10
  48. package/dist/hooks/pre-compact.js +199 -10
  49. package/dist/hooks/pre-tool-use.js +199 -10
  50. package/dist/hooks/prompt-ingest-worker.js +179 -14
  51. package/dist/hooks/prompt-submit.js +781 -285
  52. package/dist/hooks/response-ingest-worker.js +1900 -1405
  53. package/dist/hooks/session-end.js +456 -12
  54. package/dist/hooks/session-start.js +2188 -1724
  55. package/dist/hooks/stop.js +200 -10
  56. package/dist/hooks/subagent-stop.js +199 -10
  57. package/dist/hooks/summary-worker.js +604 -334
  58. package/dist/index.js +554 -61
  59. package/dist/lib/cloud-sync.js +5 -0
  60. package/dist/lib/config.js +13 -0
  61. package/dist/lib/consolidation.js +5 -0
  62. package/dist/lib/database.js +104 -0
  63. package/dist/lib/device-registry.js +109 -0
  64. package/dist/lib/embedder.js +13 -0
  65. package/dist/lib/employee-templates.js +53 -26
  66. package/dist/lib/employees.js +5 -0
  67. package/dist/lib/exe-daemon-client.js +5 -0
  68. package/dist/lib/exe-daemon.js +493 -79
  69. package/dist/lib/file-grep.js +20 -4
  70. package/dist/lib/hybrid-search.js +1435 -190
  71. package/dist/lib/identity-templates.js +126 -5
  72. package/dist/lib/identity.js +5 -0
  73. package/dist/lib/license.js +5 -0
  74. package/dist/lib/messaging.js +37 -24
  75. package/dist/lib/schedules.js +130 -1
  76. package/dist/lib/skill-learning.js +11 -0
  77. package/dist/lib/status-brief.js +5 -0
  78. package/dist/lib/store.js +199 -10
  79. package/dist/lib/task-router.js +72 -6
  80. package/dist/lib/tasks.js +179 -50
  81. package/dist/lib/tmux-routing.js +179 -46
  82. package/dist/mcp/server.js +2129 -1855
  83. package/dist/mcp/tools/create-task.js +86 -36
  84. package/dist/mcp/tools/deactivate-behavior.js +5 -0
  85. package/dist/mcp/tools/list-tasks.js +39 -11
  86. package/dist/mcp/tools/send-message.js +37 -24
  87. package/dist/mcp/tools/update-task.js +153 -38
  88. package/dist/runtime/index.js +451 -59
  89. package/dist/tui/App.js +454 -59
  90. package/package.json +1 -1
@@ -81,6 +81,11 @@ function normalizeSessionLifecycle(raw) {
81
81
  const userSL = raw.sessionLifecycle ?? {};
82
82
  raw.sessionLifecycle = { ...defaultSL, ...userSL };
83
83
  }
84
+ function normalizeAutoUpdate(raw) {
85
+ const defaultAU = DEFAULT_CONFIG.autoUpdate;
86
+ const userAU = raw.autoUpdate ?? {};
87
+ raw.autoUpdate = { ...defaultAU, ...userAU };
88
+ }
84
89
  async function loadConfig() {
85
90
  const dir = process.env.EXE_OS_DIR ?? process.env.EXE_MEM_DIR ?? EXE_AI_DIR;
86
91
  await mkdir(dir, { recursive: true });
@@ -103,6 +108,7 @@ async function loadConfig() {
103
108
  }
104
109
  normalizeScalingRoadmap(migratedCfg);
105
110
  normalizeSessionLifecycle(migratedCfg);
111
+ normalizeAutoUpdate(migratedCfg);
106
112
  const config = { ...DEFAULT_CONFIG, dbPath: path.join(dir, "memories.db"), ...migratedCfg };
107
113
  if (config.dbPath.startsWith("~")) {
108
114
  config.dbPath = config.dbPath.replace(/^~/, os.homedir());
@@ -178,6 +184,11 @@ var init_config = __esm({
178
184
  idleKillTicksRequired: 3,
179
185
  idleKillIntercomAckWindowMs: 1e4,
180
186
  maxAutoInstances: 10
187
+ },
188
+ autoUpdate: {
189
+ checkOnBoot: true,
190
+ autoInstall: false,
191
+ checkIntervalMs: 24 * 60 * 60 * 1e3
181
192
  }
182
193
  };
183
194
  CONFIG_MIGRATIONS = [
@@ -311,13 +322,27 @@ async function ensureShardSchema(client) {
311
322
  "ALTER TABLE memories ADD COLUMN document_id TEXT",
312
323
  "ALTER TABLE memories ADD COLUMN user_id TEXT",
313
324
  "ALTER TABLE memories ADD COLUMN char_offset INTEGER",
314
- "ALTER TABLE memories ADD COLUMN page_number INTEGER"
325
+ "ALTER TABLE memories ADD COLUMN page_number INTEGER",
326
+ // Source provenance columns (must match database.ts)
327
+ "ALTER TABLE memories ADD COLUMN source_path TEXT",
328
+ "ALTER TABLE memories ADD COLUMN source_type TEXT DEFAULT 'text'",
329
+ "ALTER TABLE memories ADD COLUMN tier INTEGER DEFAULT 3",
330
+ "ALTER TABLE memories ADD COLUMN supersedes_id TEXT"
315
331
  ]) {
316
332
  try {
317
333
  await client.execute(col);
318
334
  } catch {
319
335
  }
320
336
  }
337
+ for (const idx of [
338
+ "CREATE INDEX IF NOT EXISTS idx_memories_tier ON memories(tier)",
339
+ "CREATE INDEX IF NOT EXISTS idx_memories_supersedes ON memories(supersedes_id) WHERE supersedes_id IS NOT NULL"
340
+ ]) {
341
+ try {
342
+ await client.execute(idx);
343
+ } catch {
344
+ }
345
+ }
321
346
  try {
322
347
  await client.execute("CREATE INDEX IF NOT EXISTS idx_memories_status ON memories(status)");
323
348
  } catch {
@@ -659,6 +684,27 @@ async function ensureSchema() {
659
684
  });
660
685
  } catch {
661
686
  }
687
+ try {
688
+ await client.execute({
689
+ sql: `ALTER TABLE tasks ADD COLUMN checkpoint TEXT`,
690
+ args: []
691
+ });
692
+ } catch {
693
+ }
694
+ try {
695
+ await client.execute({
696
+ sql: `ALTER TABLE tasks ADD COLUMN checkpoint_count INTEGER NOT NULL DEFAULT 0`,
697
+ args: []
698
+ });
699
+ } catch {
700
+ }
701
+ try {
702
+ await client.execute({
703
+ sql: `ALTER TABLE tasks ADD COLUMN complexity TEXT NOT NULL DEFAULT 'standard'`,
704
+ args: []
705
+ });
706
+ } catch {
707
+ }
662
708
  try {
663
709
  await client.execute({
664
710
  sql: `ALTER TABLE memories ADD COLUMN task_id TEXT`,
@@ -1069,6 +1115,15 @@ async function ensureSchema() {
1069
1115
  } catch {
1070
1116
  }
1071
1117
  }
1118
+ for (const col of [
1119
+ "ALTER TABLE memories ADD COLUMN source_path TEXT",
1120
+ "ALTER TABLE memories ADD COLUMN source_type TEXT DEFAULT 'text'"
1121
+ ]) {
1122
+ try {
1123
+ await client.execute(col);
1124
+ } catch {
1125
+ }
1126
+ }
1072
1127
  await client.executeMultiple(`
1073
1128
  CREATE INDEX IF NOT EXISTS idx_memories_workspace
1074
1129
  ON memories(workspace_id);
@@ -1133,6 +1188,34 @@ async function ensureSchema() {
1133
1188
  CREATE INDEX IF NOT EXISTS idx_conversations_channel
1134
1189
  ON conversations(channel_id);
1135
1190
  `);
1191
+ try {
1192
+ await client.execute({
1193
+ sql: `ALTER TABLE tasks ADD COLUMN budget_tokens INTEGER`,
1194
+ args: []
1195
+ });
1196
+ } catch {
1197
+ }
1198
+ try {
1199
+ await client.execute({
1200
+ sql: `ALTER TABLE tasks ADD COLUMN budget_fallback_model TEXT`,
1201
+ args: []
1202
+ });
1203
+ } catch {
1204
+ }
1205
+ try {
1206
+ await client.execute({
1207
+ sql: `ALTER TABLE tasks ADD COLUMN tokens_used INTEGER DEFAULT 0`,
1208
+ args: []
1209
+ });
1210
+ } catch {
1211
+ }
1212
+ try {
1213
+ await client.execute({
1214
+ sql: `ALTER TABLE tasks ADD COLUMN tokens_warned_at INTEGER`,
1215
+ args: []
1216
+ });
1217
+ } catch {
1218
+ }
1136
1219
  await client.executeMultiple(`
1137
1220
  CREATE VIRTUAL TABLE IF NOT EXISTS conversations_fts USING fts5(
1138
1221
  content_text,
@@ -1159,6 +1242,52 @@ async function ensureSchema() {
1159
1242
  VALUES (new.rowid, new.content_text, new.sender_name, new.agent_response);
1160
1243
  END;
1161
1244
  `);
1245
+ try {
1246
+ await client.execute({
1247
+ sql: `ALTER TABLE memories ADD COLUMN tier INTEGER DEFAULT 3`,
1248
+ args: []
1249
+ });
1250
+ } catch {
1251
+ }
1252
+ try {
1253
+ await client.execute(
1254
+ `CREATE INDEX IF NOT EXISTS idx_memories_tier ON memories(tier)`
1255
+ );
1256
+ } catch {
1257
+ }
1258
+ try {
1259
+ await client.execute({
1260
+ sql: `UPDATE memories SET tier = 1 WHERE tool_name = 'commit_to_long_term_memory' AND importance >= 8 AND tier = 3`,
1261
+ args: []
1262
+ });
1263
+ await client.execute({
1264
+ sql: `UPDATE memories SET tier = 2 WHERE tool_name IN ('store_memory', 'manual') AND importance >= 5 AND tier = 3`,
1265
+ args: []
1266
+ });
1267
+ } catch {
1268
+ }
1269
+ try {
1270
+ await client.execute({
1271
+ sql: `ALTER TABLE memories ADD COLUMN supersedes_id TEXT`,
1272
+ args: []
1273
+ });
1274
+ } catch {
1275
+ }
1276
+ try {
1277
+ await client.execute(
1278
+ `CREATE INDEX IF NOT EXISTS idx_memories_supersedes ON memories(supersedes_id) WHERE supersedes_id IS NOT NULL`
1279
+ );
1280
+ } catch {
1281
+ }
1282
+ for (const col of [
1283
+ "ALTER TABLE tasks ADD COLUMN checkpoint TEXT",
1284
+ "ALTER TABLE tasks ADD COLUMN checkpoint_count INTEGER DEFAULT 0"
1285
+ ]) {
1286
+ try {
1287
+ await client.execute(col);
1288
+ } catch {
1289
+ }
1290
+ }
1162
1291
  }
1163
1292
 
1164
1293
  // src/lib/keychain.ts
@@ -1250,6 +1379,11 @@ async function initStore(options) {
1250
1379
  const vResult = await client.execute("SELECT MAX(version) as max_v FROM memories");
1251
1380
  _nextVersion = (Number(vResult.rows[0]?.max_v) || 0) + 1;
1252
1381
  }
1382
+ function classifyTier(record) {
1383
+ if (record.tool_name === "commit_to_long_term_memory" && (record.importance ?? 0) >= 8) return 1;
1384
+ if (["store_memory", "manual"].includes(record.tool_name ?? "") && (record.importance ?? 0) >= 5) return 2;
1385
+ return 3;
1386
+ }
1253
1387
  async function writeMemory(record) {
1254
1388
  if (record.vector !== null && record.vector.length !== EMBEDDING_DIM) {
1255
1389
  throw new Error(
@@ -1277,7 +1411,11 @@ async function writeMemory(record) {
1277
1411
  document_id: record.document_id ?? null,
1278
1412
  user_id: record.user_id ?? null,
1279
1413
  char_offset: record.char_offset ?? null,
1280
- page_number: record.page_number ?? null
1414
+ page_number: record.page_number ?? null,
1415
+ source_path: record.source_path ?? null,
1416
+ source_type: record.source_type ?? null,
1417
+ tier: record.tier ?? classifyTier(record),
1418
+ supersedes_id: record.supersedes_id ?? null
1281
1419
  };
1282
1420
  _pendingRecords.push(dbRow);
1283
1421
  if (_flushTimer === null) {
@@ -1309,20 +1447,26 @@ async function flushBatch() {
1309
1447
  const userId = row.user_id ?? null;
1310
1448
  const charOffset = row.char_offset ?? null;
1311
1449
  const pageNumber = row.page_number ?? null;
1450
+ const sourcePath = row.source_path ?? null;
1451
+ const sourceType = row.source_type ?? null;
1452
+ const tier = row.tier ?? 3;
1453
+ const supersedesId = row.supersedes_id ?? null;
1312
1454
  return {
1313
1455
  sql: hasVector ? `INSERT OR IGNORE INTO memories
1314
1456
  (id, agent_id, agent_role, session_id, timestamp,
1315
1457
  tool_name, project_name,
1316
1458
  has_error, raw_text, vector, version, task_id, importance, status,
1317
1459
  confidence, last_accessed,
1318
- workspace_id, document_id, user_id, char_offset, page_number)
1319
- VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, vector32(?), ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)` : `INSERT OR IGNORE INTO memories
1460
+ workspace_id, document_id, user_id, char_offset, page_number,
1461
+ source_path, source_type, tier, supersedes_id)
1462
+ VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, vector32(?), ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)` : `INSERT OR IGNORE INTO memories
1320
1463
  (id, agent_id, agent_role, session_id, timestamp,
1321
1464
  tool_name, project_name,
1322
1465
  has_error, raw_text, vector, version, task_id, importance, status,
1323
1466
  confidence, last_accessed,
1324
- workspace_id, document_id, user_id, char_offset, page_number)
1325
- VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, NULL, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`,
1467
+ workspace_id, document_id, user_id, char_offset, page_number,
1468
+ source_path, source_type, tier, supersedes_id)
1469
+ VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, NULL, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`,
1326
1470
  args: hasVector ? [
1327
1471
  row.id,
1328
1472
  row.agent_id,
@@ -1344,7 +1488,11 @@ async function flushBatch() {
1344
1488
  documentId,
1345
1489
  userId,
1346
1490
  charOffset,
1347
- pageNumber
1491
+ pageNumber,
1492
+ sourcePath,
1493
+ sourceType,
1494
+ tier,
1495
+ supersedesId
1348
1496
  ] : [
1349
1497
  row.id,
1350
1498
  row.agent_id,
@@ -1365,7 +1513,11 @@ async function flushBatch() {
1365
1513
  documentId,
1366
1514
  userId,
1367
1515
  charOffset,
1368
- pageNumber
1516
+ pageNumber,
1517
+ sourcePath,
1518
+ sourceType,
1519
+ tier,
1520
+ supersedesId
1369
1521
  ]
1370
1522
  };
1371
1523
  };