@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.
Files changed (95) hide show
  1. package/dist/bin/backfill-conversations.js +754 -79
  2. package/dist/bin/backfill-responses.js +752 -77
  3. package/dist/bin/backfill-vectors.js +752 -77
  4. package/dist/bin/cleanup-stale-review-tasks.js +657 -35
  5. package/dist/bin/cli.js +1388 -605
  6. package/dist/bin/exe-agent-config.js +123 -95
  7. package/dist/bin/exe-agent.js +41 -25
  8. package/dist/bin/exe-assign.js +732 -57
  9. package/dist/bin/exe-boot.js +784 -153
  10. package/dist/bin/exe-call.js +209 -138
  11. package/dist/bin/exe-cloud.js +35 -12
  12. package/dist/bin/exe-dispatch.js +692 -70
  13. package/dist/bin/exe-doctor.js +648 -26
  14. package/dist/bin/exe-export-behaviors.js +650 -20
  15. package/dist/bin/exe-forget.js +635 -13
  16. package/dist/bin/exe-gateway.js +1053 -271
  17. package/dist/bin/exe-heartbeat.js +665 -43
  18. package/dist/bin/exe-kill.js +646 -16
  19. package/dist/bin/exe-launch-agent.js +887 -97
  20. package/dist/bin/exe-link.js +658 -43
  21. package/dist/bin/exe-new-employee.js +378 -177
  22. package/dist/bin/exe-pending-messages.js +656 -34
  23. package/dist/bin/exe-pending-notifications.js +635 -13
  24. package/dist/bin/exe-pending-reviews.js +659 -37
  25. package/dist/bin/exe-rename.js +645 -30
  26. package/dist/bin/exe-review.js +635 -13
  27. package/dist/bin/exe-search.js +771 -88
  28. package/dist/bin/exe-session-cleanup.js +834 -150
  29. package/dist/bin/exe-settings.js +127 -91
  30. package/dist/bin/exe-start-codex.js +729 -94
  31. package/dist/bin/exe-start-opencode.js +717 -82
  32. package/dist/bin/exe-status.js +657 -35
  33. package/dist/bin/exe-team.js +635 -13
  34. package/dist/bin/git-sweep.js +720 -89
  35. package/dist/bin/graph-backfill.js +643 -13
  36. package/dist/bin/graph-export.js +646 -16
  37. package/dist/bin/install.js +596 -193
  38. package/dist/bin/scan-tasks.js +724 -93
  39. package/dist/bin/setup.js +1038 -210
  40. package/dist/bin/shard-migrate.js +645 -15
  41. package/dist/bin/wiki-sync.js +646 -16
  42. package/dist/gateway/index.js +1027 -245
  43. package/dist/hooks/bug-report-worker.js +891 -170
  44. package/dist/hooks/commit-complete.js +718 -87
  45. package/dist/hooks/error-recall.js +776 -93
  46. package/dist/hooks/exe-heartbeat-hook.js +85 -71
  47. package/dist/hooks/ingest-worker.js +840 -156
  48. package/dist/hooks/ingest.js +90 -73
  49. package/dist/hooks/instructions-loaded.js +669 -38
  50. package/dist/hooks/notification.js +661 -30
  51. package/dist/hooks/post-compact.js +674 -43
  52. package/dist/hooks/pre-compact.js +718 -87
  53. package/dist/hooks/pre-tool-use.js +872 -125
  54. package/dist/hooks/prompt-ingest-worker.js +758 -83
  55. package/dist/hooks/prompt-submit.js +1060 -319
  56. package/dist/hooks/response-ingest-worker.js +758 -83
  57. package/dist/hooks/session-end.js +721 -90
  58. package/dist/hooks/session-start.js +1031 -207
  59. package/dist/hooks/stop.js +680 -49
  60. package/dist/hooks/subagent-stop.js +674 -43
  61. package/dist/hooks/summary-worker.js +816 -132
  62. package/dist/index.js +1015 -232
  63. package/dist/lib/cloud-sync.js +663 -48
  64. package/dist/lib/consolidation.js +26 -3
  65. package/dist/lib/database.js +626 -18
  66. package/dist/lib/db.js +2261 -0
  67. package/dist/lib/device-registry.js +640 -25
  68. package/dist/lib/embedder.js +96 -43
  69. package/dist/lib/employee-templates.js +16 -0
  70. package/dist/lib/employees.js +259 -83
  71. package/dist/lib/exe-daemon-client.js +101 -63
  72. package/dist/lib/exe-daemon.js +894 -162
  73. package/dist/lib/hybrid-search.js +771 -88
  74. package/dist/lib/identity.js +27 -7
  75. package/dist/lib/messaging.js +55 -28
  76. package/dist/lib/reminders.js +21 -1
  77. package/dist/lib/schedules.js +636 -14
  78. package/dist/lib/skill-learning.js +21 -1
  79. package/dist/lib/store.js +643 -13
  80. package/dist/lib/task-router.js +82 -71
  81. package/dist/lib/tasks.js +98 -71
  82. package/dist/lib/tmux-routing.js +87 -60
  83. package/dist/lib/token-spend.js +26 -6
  84. package/dist/mcp/server.js +1784 -458
  85. package/dist/mcp/tools/complete-reminder.js +21 -1
  86. package/dist/mcp/tools/create-reminder.js +21 -1
  87. package/dist/mcp/tools/create-task.js +290 -164
  88. package/dist/mcp/tools/deactivate-behavior.js +24 -4
  89. package/dist/mcp/tools/list-reminders.js +21 -1
  90. package/dist/mcp/tools/list-tasks.js +195 -38
  91. package/dist/mcp/tools/send-message.js +58 -31
  92. package/dist/mcp/tools/update-task.js +75 -48
  93. package/dist/runtime/index.js +720 -89
  94. package/dist/tui/App.js +853 -123
  95. package/package.json +3 -2
@@ -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 path4 from "path";
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 = path4.join(homedir(), ".exe-os", "crdt-state.bin");
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 path5 from "path";
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 path3 from "path";
402
+ import path4 from "path";
288
403
  import { jwtVerify, importSPKI } from "jose";
289
- var LICENSE_PATH = path3.join(EXE_AI_DIR, "license.key");
290
- var CACHE_PATH = path3.join(EXE_AI_DIR, "license-cache.json");
291
- var DEVICE_ID_PATH = path3.join(EXE_AI_DIR, "device-id");
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 = path5.join(EXE_AI_DIR, "roster-merge.lock");
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 = path5.join(EXE_AI_DIR, "roster-deletions.json");
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";