@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 {
@@ -650,6 +675,27 @@ async function ensureSchema() {
650
675
  });
651
676
  } catch {
652
677
  }
678
+ try {
679
+ await client.execute({
680
+ sql: `ALTER TABLE tasks ADD COLUMN checkpoint TEXT`,
681
+ args: []
682
+ });
683
+ } catch {
684
+ }
685
+ try {
686
+ await client.execute({
687
+ sql: `ALTER TABLE tasks ADD COLUMN checkpoint_count INTEGER NOT NULL DEFAULT 0`,
688
+ args: []
689
+ });
690
+ } catch {
691
+ }
692
+ try {
693
+ await client.execute({
694
+ sql: `ALTER TABLE tasks ADD COLUMN complexity TEXT NOT NULL DEFAULT 'standard'`,
695
+ args: []
696
+ });
697
+ } catch {
698
+ }
653
699
  try {
654
700
  await client.execute({
655
701
  sql: `ALTER TABLE memories ADD COLUMN task_id TEXT`,
@@ -1060,6 +1106,15 @@ async function ensureSchema() {
1060
1106
  } catch {
1061
1107
  }
1062
1108
  }
1109
+ for (const col of [
1110
+ "ALTER TABLE memories ADD COLUMN source_path TEXT",
1111
+ "ALTER TABLE memories ADD COLUMN source_type TEXT DEFAULT 'text'"
1112
+ ]) {
1113
+ try {
1114
+ await client.execute(col);
1115
+ } catch {
1116
+ }
1117
+ }
1063
1118
  await client.executeMultiple(`
1064
1119
  CREATE INDEX IF NOT EXISTS idx_memories_workspace
1065
1120
  ON memories(workspace_id);
@@ -1124,6 +1179,34 @@ async function ensureSchema() {
1124
1179
  CREATE INDEX IF NOT EXISTS idx_conversations_channel
1125
1180
  ON conversations(channel_id);
1126
1181
  `);
1182
+ try {
1183
+ await client.execute({
1184
+ sql: `ALTER TABLE tasks ADD COLUMN budget_tokens INTEGER`,
1185
+ args: []
1186
+ });
1187
+ } catch {
1188
+ }
1189
+ try {
1190
+ await client.execute({
1191
+ sql: `ALTER TABLE tasks ADD COLUMN budget_fallback_model TEXT`,
1192
+ args: []
1193
+ });
1194
+ } catch {
1195
+ }
1196
+ try {
1197
+ await client.execute({
1198
+ sql: `ALTER TABLE tasks ADD COLUMN tokens_used INTEGER DEFAULT 0`,
1199
+ args: []
1200
+ });
1201
+ } catch {
1202
+ }
1203
+ try {
1204
+ await client.execute({
1205
+ sql: `ALTER TABLE tasks ADD COLUMN tokens_warned_at INTEGER`,
1206
+ args: []
1207
+ });
1208
+ } catch {
1209
+ }
1127
1210
  await client.executeMultiple(`
1128
1211
  CREATE VIRTUAL TABLE IF NOT EXISTS conversations_fts USING fts5(
1129
1212
  content_text,
@@ -1150,6 +1233,52 @@ async function ensureSchema() {
1150
1233
  VALUES (new.rowid, new.content_text, new.sender_name, new.agent_response);
1151
1234
  END;
1152
1235
  `);
1236
+ try {
1237
+ await client.execute({
1238
+ sql: `ALTER TABLE memories ADD COLUMN tier INTEGER DEFAULT 3`,
1239
+ args: []
1240
+ });
1241
+ } catch {
1242
+ }
1243
+ try {
1244
+ await client.execute(
1245
+ `CREATE INDEX IF NOT EXISTS idx_memories_tier ON memories(tier)`
1246
+ );
1247
+ } catch {
1248
+ }
1249
+ try {
1250
+ await client.execute({
1251
+ sql: `UPDATE memories SET tier = 1 WHERE tool_name = 'commit_to_long_term_memory' AND importance >= 8 AND tier = 3`,
1252
+ args: []
1253
+ });
1254
+ await client.execute({
1255
+ sql: `UPDATE memories SET tier = 2 WHERE tool_name IN ('store_memory', 'manual') AND importance >= 5 AND tier = 3`,
1256
+ args: []
1257
+ });
1258
+ } catch {
1259
+ }
1260
+ try {
1261
+ await client.execute({
1262
+ sql: `ALTER TABLE memories ADD COLUMN supersedes_id TEXT`,
1263
+ args: []
1264
+ });
1265
+ } catch {
1266
+ }
1267
+ try {
1268
+ await client.execute(
1269
+ `CREATE INDEX IF NOT EXISTS idx_memories_supersedes ON memories(supersedes_id) WHERE supersedes_id IS NOT NULL`
1270
+ );
1271
+ } catch {
1272
+ }
1273
+ for (const col of [
1274
+ "ALTER TABLE tasks ADD COLUMN checkpoint TEXT",
1275
+ "ALTER TABLE tasks ADD COLUMN checkpoint_count INTEGER DEFAULT 0"
1276
+ ]) {
1277
+ try {
1278
+ await client.execute(col);
1279
+ } catch {
1280
+ }
1281
+ }
1153
1282
  }
1154
1283
 
1155
1284
  // src/lib/keychain.ts
@@ -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 {
@@ -650,6 +675,27 @@ async function ensureSchema() {
650
675
  });
651
676
  } catch {
652
677
  }
678
+ try {
679
+ await client.execute({
680
+ sql: `ALTER TABLE tasks ADD COLUMN checkpoint TEXT`,
681
+ args: []
682
+ });
683
+ } catch {
684
+ }
685
+ try {
686
+ await client.execute({
687
+ sql: `ALTER TABLE tasks ADD COLUMN checkpoint_count INTEGER NOT NULL DEFAULT 0`,
688
+ args: []
689
+ });
690
+ } catch {
691
+ }
692
+ try {
693
+ await client.execute({
694
+ sql: `ALTER TABLE tasks ADD COLUMN complexity TEXT NOT NULL DEFAULT 'standard'`,
695
+ args: []
696
+ });
697
+ } catch {
698
+ }
653
699
  try {
654
700
  await client.execute({
655
701
  sql: `ALTER TABLE memories ADD COLUMN task_id TEXT`,
@@ -1060,6 +1106,15 @@ async function ensureSchema() {
1060
1106
  } catch {
1061
1107
  }
1062
1108
  }
1109
+ for (const col of [
1110
+ "ALTER TABLE memories ADD COLUMN source_path TEXT",
1111
+ "ALTER TABLE memories ADD COLUMN source_type TEXT DEFAULT 'text'"
1112
+ ]) {
1113
+ try {
1114
+ await client.execute(col);
1115
+ } catch {
1116
+ }
1117
+ }
1063
1118
  await client.executeMultiple(`
1064
1119
  CREATE INDEX IF NOT EXISTS idx_memories_workspace
1065
1120
  ON memories(workspace_id);
@@ -1124,6 +1179,34 @@ async function ensureSchema() {
1124
1179
  CREATE INDEX IF NOT EXISTS idx_conversations_channel
1125
1180
  ON conversations(channel_id);
1126
1181
  `);
1182
+ try {
1183
+ await client.execute({
1184
+ sql: `ALTER TABLE tasks ADD COLUMN budget_tokens INTEGER`,
1185
+ args: []
1186
+ });
1187
+ } catch {
1188
+ }
1189
+ try {
1190
+ await client.execute({
1191
+ sql: `ALTER TABLE tasks ADD COLUMN budget_fallback_model TEXT`,
1192
+ args: []
1193
+ });
1194
+ } catch {
1195
+ }
1196
+ try {
1197
+ await client.execute({
1198
+ sql: `ALTER TABLE tasks ADD COLUMN tokens_used INTEGER DEFAULT 0`,
1199
+ args: []
1200
+ });
1201
+ } catch {
1202
+ }
1203
+ try {
1204
+ await client.execute({
1205
+ sql: `ALTER TABLE tasks ADD COLUMN tokens_warned_at INTEGER`,
1206
+ args: []
1207
+ });
1208
+ } catch {
1209
+ }
1127
1210
  await client.executeMultiple(`
1128
1211
  CREATE VIRTUAL TABLE IF NOT EXISTS conversations_fts USING fts5(
1129
1212
  content_text,
@@ -1150,6 +1233,52 @@ async function ensureSchema() {
1150
1233
  VALUES (new.rowid, new.content_text, new.sender_name, new.agent_response);
1151
1234
  END;
1152
1235
  `);
1236
+ try {
1237
+ await client.execute({
1238
+ sql: `ALTER TABLE memories ADD COLUMN tier INTEGER DEFAULT 3`,
1239
+ args: []
1240
+ });
1241
+ } catch {
1242
+ }
1243
+ try {
1244
+ await client.execute(
1245
+ `CREATE INDEX IF NOT EXISTS idx_memories_tier ON memories(tier)`
1246
+ );
1247
+ } catch {
1248
+ }
1249
+ try {
1250
+ await client.execute({
1251
+ sql: `UPDATE memories SET tier = 1 WHERE tool_name = 'commit_to_long_term_memory' AND importance >= 8 AND tier = 3`,
1252
+ args: []
1253
+ });
1254
+ await client.execute({
1255
+ sql: `UPDATE memories SET tier = 2 WHERE tool_name IN ('store_memory', 'manual') AND importance >= 5 AND tier = 3`,
1256
+ args: []
1257
+ });
1258
+ } catch {
1259
+ }
1260
+ try {
1261
+ await client.execute({
1262
+ sql: `ALTER TABLE memories ADD COLUMN supersedes_id TEXT`,
1263
+ args: []
1264
+ });
1265
+ } catch {
1266
+ }
1267
+ try {
1268
+ await client.execute(
1269
+ `CREATE INDEX IF NOT EXISTS idx_memories_supersedes ON memories(supersedes_id) WHERE supersedes_id IS NOT NULL`
1270
+ );
1271
+ } catch {
1272
+ }
1273
+ for (const col of [
1274
+ "ALTER TABLE tasks ADD COLUMN checkpoint TEXT",
1275
+ "ALTER TABLE tasks ADD COLUMN checkpoint_count INTEGER DEFAULT 0"
1276
+ ]) {
1277
+ try {
1278
+ await client.execute(col);
1279
+ } catch {
1280
+ }
1281
+ }
1153
1282
  }
1154
1283
 
1155
1284
  // src/lib/keychain.ts