@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.
- package/README.md +178 -79
- package/dist/bin/backfill-responses.js +160 -8
- package/dist/bin/backfill-vectors.js +130 -1
- package/dist/bin/cleanup-stale-review-tasks.js +130 -1
- package/dist/bin/cli.js +10111 -7540
- package/dist/bin/exe-agent.js +159 -1
- package/dist/bin/exe-assign.js +235 -16
- package/dist/bin/exe-boot.js +344 -472
- package/dist/bin/exe-call.js +145 -1
- package/dist/bin/exe-cloud.js +11 -0
- package/dist/bin/exe-dispatch.js +37 -24
- package/dist/bin/exe-doctor.js +130 -1
- package/dist/bin/exe-export-behaviors.js +150 -7
- package/dist/bin/exe-forget.js +822 -665
- package/dist/bin/exe-gateway.js +470 -62
- package/dist/bin/exe-heartbeat.js +133 -2
- package/dist/bin/exe-kill.js +150 -7
- package/dist/bin/exe-launch-agent.js +150 -7
- package/dist/bin/exe-new-employee.js +756 -224
- package/dist/bin/exe-pending-messages.js +132 -2
- package/dist/bin/exe-pending-notifications.js +130 -1
- package/dist/bin/exe-pending-reviews.js +132 -2
- package/dist/bin/exe-review.js +160 -8
- package/dist/bin/exe-search.js +2473 -2008
- package/dist/bin/exe-session-cleanup.js +238 -51
- package/dist/bin/exe-settings.js +11 -0
- package/dist/bin/exe-status.js +130 -1
- package/dist/bin/exe-team.js +130 -1
- package/dist/bin/git-sweep.js +272 -16
- package/dist/bin/graph-backfill.js +150 -7
- package/dist/bin/graph-export.js +150 -7
- package/dist/bin/install.js +5 -0
- package/dist/bin/scan-tasks.js +238 -19
- package/dist/bin/setup.js +1776 -10
- package/dist/bin/shard-migrate.js +150 -7
- package/dist/bin/update.js +9 -6
- package/dist/bin/wiki-sync.js +150 -7
- package/dist/gateway/index.js +470 -62
- package/dist/hooks/bug-report-worker.js +195 -35
- package/dist/hooks/commit-complete.js +272 -16
- package/dist/hooks/error-recall.js +2313 -1847
- package/dist/hooks/exe-heartbeat-hook.js +5 -0
- package/dist/hooks/ingest-worker.js +330 -58
- package/dist/hooks/ingest.js +11 -0
- package/dist/hooks/instructions-loaded.js +199 -10
- package/dist/hooks/notification.js +199 -10
- package/dist/hooks/post-compact.js +199 -10
- package/dist/hooks/pre-compact.js +199 -10
- package/dist/hooks/pre-tool-use.js +199 -10
- package/dist/hooks/prompt-ingest-worker.js +179 -14
- package/dist/hooks/prompt-submit.js +781 -285
- package/dist/hooks/response-ingest-worker.js +1900 -1405
- package/dist/hooks/session-end.js +456 -12
- package/dist/hooks/session-start.js +2188 -1724
- package/dist/hooks/stop.js +200 -10
- package/dist/hooks/subagent-stop.js +199 -10
- package/dist/hooks/summary-worker.js +604 -334
- package/dist/index.js +554 -61
- package/dist/lib/cloud-sync.js +5 -0
- package/dist/lib/config.js +13 -0
- package/dist/lib/consolidation.js +5 -0
- package/dist/lib/database.js +104 -0
- package/dist/lib/device-registry.js +109 -0
- package/dist/lib/embedder.js +13 -0
- package/dist/lib/employee-templates.js +53 -26
- package/dist/lib/employees.js +5 -0
- package/dist/lib/exe-daemon-client.js +5 -0
- package/dist/lib/exe-daemon.js +493 -79
- package/dist/lib/file-grep.js +20 -4
- package/dist/lib/hybrid-search.js +1435 -190
- package/dist/lib/identity-templates.js +126 -5
- package/dist/lib/identity.js +5 -0
- package/dist/lib/license.js +5 -0
- package/dist/lib/messaging.js +37 -24
- package/dist/lib/schedules.js +130 -1
- package/dist/lib/skill-learning.js +11 -0
- package/dist/lib/status-brief.js +5 -0
- package/dist/lib/store.js +199 -10
- package/dist/lib/task-router.js +72 -6
- package/dist/lib/tasks.js +179 -50
- package/dist/lib/tmux-routing.js +179 -46
- package/dist/mcp/server.js +2129 -1855
- package/dist/mcp/tools/create-task.js +86 -36
- package/dist/mcp/tools/deactivate-behavior.js +5 -0
- package/dist/mcp/tools/list-tasks.js +39 -11
- package/dist/mcp/tools/send-message.js +37 -24
- package/dist/mcp/tools/update-task.js +153 -38
- package/dist/runtime/index.js +451 -59
- package/dist/tui/App.js +454 -59
- package/package.json +1 -1
package/dist/bin/exe-review.js
CHANGED
|
@@ -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
|
-
|
|
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
|
-
|
|
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
|
};
|