@askexenow/exe-os 0.9.7 → 0.9.8
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/dist/bin/backfill-conversations.js +754 -79
- package/dist/bin/backfill-responses.js +752 -77
- package/dist/bin/backfill-vectors.js +752 -77
- package/dist/bin/cleanup-stale-review-tasks.js +657 -35
- package/dist/bin/cli.js +1388 -605
- package/dist/bin/exe-agent-config.js +123 -95
- package/dist/bin/exe-agent.js +41 -25
- package/dist/bin/exe-assign.js +732 -57
- package/dist/bin/exe-boot.js +784 -153
- package/dist/bin/exe-call.js +209 -138
- package/dist/bin/exe-cloud.js +35 -12
- package/dist/bin/exe-dispatch.js +692 -70
- package/dist/bin/exe-doctor.js +648 -26
- package/dist/bin/exe-export-behaviors.js +650 -20
- package/dist/bin/exe-forget.js +635 -13
- package/dist/bin/exe-gateway.js +1053 -271
- package/dist/bin/exe-heartbeat.js +665 -43
- package/dist/bin/exe-kill.js +646 -16
- package/dist/bin/exe-launch-agent.js +887 -97
- package/dist/bin/exe-link.js +658 -43
- package/dist/bin/exe-new-employee.js +378 -177
- package/dist/bin/exe-pending-messages.js +656 -34
- package/dist/bin/exe-pending-notifications.js +635 -13
- package/dist/bin/exe-pending-reviews.js +659 -37
- package/dist/bin/exe-rename.js +645 -30
- package/dist/bin/exe-review.js +635 -13
- package/dist/bin/exe-search.js +771 -88
- package/dist/bin/exe-session-cleanup.js +834 -150
- package/dist/bin/exe-settings.js +127 -91
- package/dist/bin/exe-start-codex.js +729 -94
- package/dist/bin/exe-start-opencode.js +717 -82
- package/dist/bin/exe-status.js +657 -35
- package/dist/bin/exe-team.js +635 -13
- package/dist/bin/git-sweep.js +720 -89
- package/dist/bin/graph-backfill.js +643 -13
- package/dist/bin/graph-export.js +646 -16
- package/dist/bin/install.js +596 -193
- package/dist/bin/scan-tasks.js +724 -93
- package/dist/bin/setup.js +1038 -210
- package/dist/bin/shard-migrate.js +645 -15
- package/dist/bin/wiki-sync.js +646 -16
- package/dist/gateway/index.js +1027 -245
- package/dist/hooks/bug-report-worker.js +891 -170
- package/dist/hooks/commit-complete.js +718 -87
- package/dist/hooks/error-recall.js +776 -93
- package/dist/hooks/exe-heartbeat-hook.js +85 -71
- package/dist/hooks/ingest-worker.js +840 -156
- package/dist/hooks/ingest.js +90 -73
- package/dist/hooks/instructions-loaded.js +669 -38
- package/dist/hooks/notification.js +661 -30
- package/dist/hooks/post-compact.js +674 -43
- package/dist/hooks/pre-compact.js +718 -87
- package/dist/hooks/pre-tool-use.js +872 -125
- package/dist/hooks/prompt-ingest-worker.js +758 -83
- package/dist/hooks/prompt-submit.js +1060 -319
- package/dist/hooks/response-ingest-worker.js +758 -83
- package/dist/hooks/session-end.js +721 -90
- package/dist/hooks/session-start.js +1031 -207
- package/dist/hooks/stop.js +680 -49
- package/dist/hooks/subagent-stop.js +674 -43
- package/dist/hooks/summary-worker.js +816 -132
- package/dist/index.js +1015 -232
- package/dist/lib/cloud-sync.js +663 -48
- package/dist/lib/consolidation.js +26 -3
- package/dist/lib/database.js +626 -18
- package/dist/lib/db.js +2261 -0
- package/dist/lib/device-registry.js +640 -25
- package/dist/lib/embedder.js +96 -43
- package/dist/lib/employee-templates.js +16 -0
- package/dist/lib/employees.js +259 -83
- package/dist/lib/exe-daemon-client.js +101 -63
- package/dist/lib/exe-daemon.js +894 -162
- package/dist/lib/hybrid-search.js +771 -88
- package/dist/lib/identity.js +27 -7
- package/dist/lib/messaging.js +55 -28
- package/dist/lib/reminders.js +21 -1
- package/dist/lib/schedules.js +636 -14
- package/dist/lib/skill-learning.js +21 -1
- package/dist/lib/store.js +643 -13
- package/dist/lib/task-router.js +82 -71
- package/dist/lib/tasks.js +98 -71
- package/dist/lib/tmux-routing.js +87 -60
- package/dist/lib/token-spend.js +26 -6
- package/dist/mcp/server.js +1784 -458
- package/dist/mcp/tools/complete-reminder.js +21 -1
- package/dist/mcp/tools/create-reminder.js +21 -1
- package/dist/mcp/tools/create-task.js +290 -164
- package/dist/mcp/tools/deactivate-behavior.js +24 -4
- package/dist/mcp/tools/list-reminders.js +21 -1
- package/dist/mcp/tools/list-tasks.js +195 -38
- package/dist/mcp/tools/send-message.js +58 -31
- package/dist/mcp/tools/update-task.js +75 -48
- package/dist/runtime/index.js +720 -89
- package/dist/tui/App.js +853 -123
- package/package.json +3 -2
package/dist/bin/exe-settings.js
CHANGED
|
@@ -216,12 +216,34 @@ function loadEmployeesSync(employeesPath = EMPLOYEES_PATH) {
|
|
|
216
216
|
return [];
|
|
217
217
|
}
|
|
218
218
|
}
|
|
219
|
-
var EMPLOYEES_PATH;
|
|
219
|
+
var EMPLOYEES_PATH, IDENTITY_DIR;
|
|
220
220
|
var init_employees = __esm({
|
|
221
221
|
"src/lib/employees.ts"() {
|
|
222
222
|
"use strict";
|
|
223
223
|
init_config();
|
|
224
224
|
EMPLOYEES_PATH = path2.join(EXE_AI_DIR, "exe-employees.json");
|
|
225
|
+
IDENTITY_DIR = path2.join(EXE_AI_DIR, "identity");
|
|
226
|
+
}
|
|
227
|
+
});
|
|
228
|
+
|
|
229
|
+
// src/lib/database-adapter.ts
|
|
230
|
+
import os3 from "os";
|
|
231
|
+
import path3 from "path";
|
|
232
|
+
import { createRequire } from "module";
|
|
233
|
+
import { pathToFileURL } from "url";
|
|
234
|
+
var BOOLEAN_COLUMNS_BY_TABLE, BOOLEAN_COLUMN_NAMES;
|
|
235
|
+
var init_database_adapter = __esm({
|
|
236
|
+
"src/lib/database-adapter.ts"() {
|
|
237
|
+
"use strict";
|
|
238
|
+
BOOLEAN_COLUMNS_BY_TABLE = {
|
|
239
|
+
memories: /* @__PURE__ */ new Set(["has_error", "draft"]),
|
|
240
|
+
behaviors: /* @__PURE__ */ new Set(["active"]),
|
|
241
|
+
notifications: /* @__PURE__ */ new Set(["read"]),
|
|
242
|
+
users: /* @__PURE__ */ new Set(["has_personal_memory"])
|
|
243
|
+
};
|
|
244
|
+
BOOLEAN_COLUMN_NAMES = new Set(
|
|
245
|
+
Object.values(BOOLEAN_COLUMNS_BY_TABLE).flatMap((cols) => [...cols])
|
|
246
|
+
);
|
|
225
247
|
}
|
|
226
248
|
});
|
|
227
249
|
|
|
@@ -232,19 +254,112 @@ var init_database = __esm({
|
|
|
232
254
|
"use strict";
|
|
233
255
|
init_db_retry();
|
|
234
256
|
init_employees();
|
|
257
|
+
init_database_adapter();
|
|
235
258
|
}
|
|
236
259
|
});
|
|
237
260
|
|
|
238
261
|
// src/lib/crdt-sync.ts
|
|
239
262
|
import * as Y from "yjs";
|
|
240
263
|
import { readFileSync as readFileSync4, writeFileSync as writeFileSync3, existsSync as existsSync4, mkdirSync as mkdirSync2, unlinkSync as unlinkSync2 } from "fs";
|
|
241
|
-
import
|
|
264
|
+
import path5 from "path";
|
|
242
265
|
import { homedir } from "os";
|
|
243
266
|
var DEFAULT_STATE_PATH;
|
|
244
267
|
var init_crdt_sync = __esm({
|
|
245
268
|
"src/lib/crdt-sync.ts"() {
|
|
246
269
|
"use strict";
|
|
247
|
-
DEFAULT_STATE_PATH =
|
|
270
|
+
DEFAULT_STATE_PATH = path5.join(homedir(), ".exe-os", "crdt-state.bin");
|
|
271
|
+
}
|
|
272
|
+
});
|
|
273
|
+
|
|
274
|
+
// src/lib/runtime-table.ts
|
|
275
|
+
var RUNTIME_TABLE, DEFAULT_RUNTIME;
|
|
276
|
+
var init_runtime_table = __esm({
|
|
277
|
+
"src/lib/runtime-table.ts"() {
|
|
278
|
+
"use strict";
|
|
279
|
+
RUNTIME_TABLE = {
|
|
280
|
+
codex: {
|
|
281
|
+
binary: "codex",
|
|
282
|
+
launchMode: "interactive",
|
|
283
|
+
autoApproveFlag: "--dangerously-bypass-approvals-and-sandbox",
|
|
284
|
+
inlineFlag: "--no-alt-screen",
|
|
285
|
+
apiKeyEnv: "OPENAI_API_KEY",
|
|
286
|
+
defaultModel: "gpt-5.4"
|
|
287
|
+
},
|
|
288
|
+
opencode: {
|
|
289
|
+
binary: "opencode",
|
|
290
|
+
launchMode: "exec",
|
|
291
|
+
autoApproveFlag: "--dangerously-skip-permissions",
|
|
292
|
+
inlineFlag: "",
|
|
293
|
+
apiKeyEnv: "ANTHROPIC_API_KEY",
|
|
294
|
+
defaultModel: "anthropic/claude-sonnet-4-6"
|
|
295
|
+
}
|
|
296
|
+
};
|
|
297
|
+
DEFAULT_RUNTIME = "claude";
|
|
298
|
+
}
|
|
299
|
+
});
|
|
300
|
+
|
|
301
|
+
// src/lib/agent-config.ts
|
|
302
|
+
import { readFileSync as readFileSync6, writeFileSync as writeFileSync5, existsSync as existsSync6, mkdirSync as mkdirSync4 } from "fs";
|
|
303
|
+
import path7 from "path";
|
|
304
|
+
function loadAgentConfig() {
|
|
305
|
+
if (!existsSync6(AGENT_CONFIG_PATH)) return {};
|
|
306
|
+
try {
|
|
307
|
+
return JSON.parse(readFileSync6(AGENT_CONFIG_PATH, "utf-8"));
|
|
308
|
+
} catch {
|
|
309
|
+
return {};
|
|
310
|
+
}
|
|
311
|
+
}
|
|
312
|
+
function saveAgentConfig(config) {
|
|
313
|
+
const dir = path7.dirname(AGENT_CONFIG_PATH);
|
|
314
|
+
if (!existsSync6(dir)) mkdirSync4(dir, { recursive: true });
|
|
315
|
+
writeFileSync5(AGENT_CONFIG_PATH, JSON.stringify(config, null, 2) + "\n", "utf-8");
|
|
316
|
+
}
|
|
317
|
+
function setAgentRuntime(agentId, runtime, model) {
|
|
318
|
+
const knownModels = KNOWN_RUNTIMES[runtime];
|
|
319
|
+
if (!knownModels) {
|
|
320
|
+
return {
|
|
321
|
+
ok: false,
|
|
322
|
+
error: `Unknown runtime "${runtime}". Valid: ${Object.keys(KNOWN_RUNTIMES).join(", ")}`
|
|
323
|
+
};
|
|
324
|
+
}
|
|
325
|
+
if (!knownModels.includes(model)) {
|
|
326
|
+
return {
|
|
327
|
+
ok: false,
|
|
328
|
+
error: `Unknown model "${model}" for runtime "${runtime}". Valid: ${knownModels.join(", ")}`
|
|
329
|
+
};
|
|
330
|
+
}
|
|
331
|
+
const config = loadAgentConfig();
|
|
332
|
+
config[agentId] = { runtime, model };
|
|
333
|
+
saveAgentConfig(config);
|
|
334
|
+
return { ok: true };
|
|
335
|
+
}
|
|
336
|
+
function clearAgentRuntime(agentId) {
|
|
337
|
+
const config = loadAgentConfig();
|
|
338
|
+
delete config[agentId];
|
|
339
|
+
saveAgentConfig(config);
|
|
340
|
+
}
|
|
341
|
+
var AGENT_CONFIG_PATH, KNOWN_RUNTIMES, RUNTIME_LABELS, DEFAULT_MODELS;
|
|
342
|
+
var init_agent_config = __esm({
|
|
343
|
+
"src/lib/agent-config.ts"() {
|
|
344
|
+
"use strict";
|
|
345
|
+
init_config();
|
|
346
|
+
init_runtime_table();
|
|
347
|
+
AGENT_CONFIG_PATH = path7.join(EXE_AI_DIR, "agent-config.json");
|
|
348
|
+
KNOWN_RUNTIMES = {
|
|
349
|
+
claude: ["claude-opus-4", "claude-sonnet-4", "claude-haiku-4.5"],
|
|
350
|
+
codex: ["gpt-5.4", "gpt-5.5", "gpt-5.3-codex-spark", "o3", "o4-mini"],
|
|
351
|
+
opencode: ["anthropic/claude-sonnet-4-6", "openai/gpt-5.4", "google/gemini-2.5-pro", "deepseek/deepseek-r3", "minimax/minimax-m2.5"]
|
|
352
|
+
};
|
|
353
|
+
RUNTIME_LABELS = {
|
|
354
|
+
claude: "Claude Code (Anthropic)",
|
|
355
|
+
codex: "Codex (OpenAI)",
|
|
356
|
+
opencode: "OpenCode (open source)"
|
|
357
|
+
};
|
|
358
|
+
DEFAULT_MODELS = {
|
|
359
|
+
claude: "claude-opus-4",
|
|
360
|
+
codex: RUNTIME_TABLE.codex?.defaultModel ?? "gpt-5.4",
|
|
361
|
+
opencode: RUNTIME_TABLE.opencode?.defaultModel ?? "anthropic/claude-sonnet-4-6"
|
|
362
|
+
};
|
|
248
363
|
}
|
|
249
364
|
});
|
|
250
365
|
|
|
@@ -271,7 +386,7 @@ function isMainModule(importMetaUrl) {
|
|
|
271
386
|
init_database();
|
|
272
387
|
import { readFileSync as readFileSync5, writeFileSync as writeFileSync4, existsSync as existsSync5, readdirSync, mkdirSync as mkdirSync3, appendFileSync, unlinkSync as unlinkSync3, openSync, closeSync } from "fs";
|
|
273
388
|
import crypto2 from "crypto";
|
|
274
|
-
import
|
|
389
|
+
import path6 from "path";
|
|
275
390
|
import { homedir as homedir2 } from "os";
|
|
276
391
|
|
|
277
392
|
// src/lib/crypto.ts
|
|
@@ -284,18 +399,18 @@ import { brotliCompressSync, brotliDecompressSync, constants } from "zlib";
|
|
|
284
399
|
init_config();
|
|
285
400
|
import { readFileSync as readFileSync3, writeFileSync as writeFileSync2, existsSync as existsSync3, mkdirSync } from "fs";
|
|
286
401
|
import { randomUUID } from "crypto";
|
|
287
|
-
import
|
|
402
|
+
import path4 from "path";
|
|
288
403
|
import { jwtVerify, importSPKI } from "jose";
|
|
289
|
-
var LICENSE_PATH =
|
|
290
|
-
var CACHE_PATH =
|
|
291
|
-
var DEVICE_ID_PATH =
|
|
404
|
+
var LICENSE_PATH = path4.join(EXE_AI_DIR, "license.key");
|
|
405
|
+
var CACHE_PATH = path4.join(EXE_AI_DIR, "license-cache.json");
|
|
406
|
+
var DEVICE_ID_PATH = path4.join(EXE_AI_DIR, "device-id");
|
|
292
407
|
|
|
293
408
|
// src/lib/cloud-sync.ts
|
|
294
409
|
init_config();
|
|
295
410
|
init_crdt_sync();
|
|
296
411
|
init_employees();
|
|
297
412
|
var LOCALHOST_PATTERNS = /^(localhost|127\.0\.0\.1|\[::1\])$/i;
|
|
298
|
-
var ROSTER_LOCK_PATH =
|
|
413
|
+
var ROSTER_LOCK_PATH = path6.join(EXE_AI_DIR, "roster-merge.lock");
|
|
299
414
|
function assertSecureEndpoint(endpoint) {
|
|
300
415
|
if (endpoint.startsWith("https://")) return;
|
|
301
416
|
if (endpoint.startsWith("http://")) {
|
|
@@ -310,90 +425,11 @@ function assertSecureEndpoint(endpoint) {
|
|
|
310
425
|
);
|
|
311
426
|
}
|
|
312
427
|
}
|
|
313
|
-
var ROSTER_DELETIONS_PATH =
|
|
314
|
-
|
|
315
|
-
// src/lib/agent-config.ts
|
|
316
|
-
init_config();
|
|
317
|
-
import { readFileSync as readFileSync6, writeFileSync as writeFileSync5, existsSync as existsSync6, mkdirSync as mkdirSync4 } from "fs";
|
|
318
|
-
import path6 from "path";
|
|
319
|
-
|
|
320
|
-
// src/lib/runtime-table.ts
|
|
321
|
-
var RUNTIME_TABLE = {
|
|
322
|
-
codex: {
|
|
323
|
-
binary: "codex",
|
|
324
|
-
launchMode: "interactive",
|
|
325
|
-
autoApproveFlag: "--dangerously-bypass-approvals-and-sandbox",
|
|
326
|
-
inlineFlag: "--no-alt-screen",
|
|
327
|
-
apiKeyEnv: "OPENAI_API_KEY",
|
|
328
|
-
defaultModel: "gpt-5.4"
|
|
329
|
-
},
|
|
330
|
-
opencode: {
|
|
331
|
-
binary: "opencode",
|
|
332
|
-
launchMode: "exec",
|
|
333
|
-
autoApproveFlag: "--dangerously-skip-permissions",
|
|
334
|
-
inlineFlag: "",
|
|
335
|
-
apiKeyEnv: "ANTHROPIC_API_KEY",
|
|
336
|
-
defaultModel: "anthropic/claude-sonnet-4-6"
|
|
337
|
-
}
|
|
338
|
-
};
|
|
339
|
-
var DEFAULT_RUNTIME = "claude";
|
|
340
|
-
|
|
341
|
-
// src/lib/agent-config.ts
|
|
342
|
-
var AGENT_CONFIG_PATH = path6.join(EXE_AI_DIR, "agent-config.json");
|
|
343
|
-
var KNOWN_RUNTIMES = {
|
|
344
|
-
claude: ["claude-opus-4", "claude-sonnet-4", "claude-haiku-4.5"],
|
|
345
|
-
codex: ["gpt-5.4", "gpt-5.5", "gpt-5.3-codex-spark", "o3", "o4-mini"],
|
|
346
|
-
opencode: ["anthropic/claude-sonnet-4-6", "openai/gpt-5.4", "google/gemini-2.5-pro", "deepseek/deepseek-r3", "minimax/minimax-m2.5"]
|
|
347
|
-
};
|
|
348
|
-
var RUNTIME_LABELS = {
|
|
349
|
-
claude: "Claude Code (Anthropic)",
|
|
350
|
-
codex: "Codex (OpenAI)",
|
|
351
|
-
opencode: "OpenCode (open source)"
|
|
352
|
-
};
|
|
353
|
-
var DEFAULT_MODELS = {
|
|
354
|
-
claude: "claude-opus-4",
|
|
355
|
-
codex: RUNTIME_TABLE.codex?.defaultModel ?? "gpt-5.4",
|
|
356
|
-
opencode: RUNTIME_TABLE.opencode?.defaultModel ?? "anthropic/claude-sonnet-4-6"
|
|
357
|
-
};
|
|
358
|
-
function loadAgentConfig() {
|
|
359
|
-
if (!existsSync6(AGENT_CONFIG_PATH)) return {};
|
|
360
|
-
try {
|
|
361
|
-
return JSON.parse(readFileSync6(AGENT_CONFIG_PATH, "utf-8"));
|
|
362
|
-
} catch {
|
|
363
|
-
return {};
|
|
364
|
-
}
|
|
365
|
-
}
|
|
366
|
-
function saveAgentConfig(config) {
|
|
367
|
-
const dir = path6.dirname(AGENT_CONFIG_PATH);
|
|
368
|
-
if (!existsSync6(dir)) mkdirSync4(dir, { recursive: true });
|
|
369
|
-
writeFileSync5(AGENT_CONFIG_PATH, JSON.stringify(config, null, 2) + "\n", "utf-8");
|
|
370
|
-
}
|
|
371
|
-
function setAgentRuntime(agentId, runtime, model) {
|
|
372
|
-
const knownModels = KNOWN_RUNTIMES[runtime];
|
|
373
|
-
if (!knownModels) {
|
|
374
|
-
return {
|
|
375
|
-
ok: false,
|
|
376
|
-
error: `Unknown runtime "${runtime}". Valid: ${Object.keys(KNOWN_RUNTIMES).join(", ")}`
|
|
377
|
-
};
|
|
378
|
-
}
|
|
379
|
-
if (!knownModels.includes(model)) {
|
|
380
|
-
return {
|
|
381
|
-
ok: false,
|
|
382
|
-
error: `Unknown model "${model}" for runtime "${runtime}". Valid: ${knownModels.join(", ")}`
|
|
383
|
-
};
|
|
384
|
-
}
|
|
385
|
-
const config = loadAgentConfig();
|
|
386
|
-
config[agentId] = { runtime, model };
|
|
387
|
-
saveAgentConfig(config);
|
|
388
|
-
return { ok: true };
|
|
389
|
-
}
|
|
390
|
-
function clearAgentRuntime(agentId) {
|
|
391
|
-
const config = loadAgentConfig();
|
|
392
|
-
delete config[agentId];
|
|
393
|
-
saveAgentConfig(config);
|
|
394
|
-
}
|
|
428
|
+
var ROSTER_DELETIONS_PATH = path6.join(EXE_AI_DIR, "roster-deletions.json");
|
|
395
429
|
|
|
396
430
|
// src/bin/exe-settings.ts
|
|
431
|
+
init_agent_config();
|
|
432
|
+
init_runtime_table();
|
|
397
433
|
init_employees();
|
|
398
434
|
function label(value) {
|
|
399
435
|
return value ? "ON" : "OFF";
|