@askexenow/exe-os 0.8.8 → 0.8.10

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 (107) hide show
  1. package/dist/bin/backfill-conversations.js +2181 -0
  2. package/dist/bin/backfill-responses.js +2064 -0
  3. package/dist/bin/backfill-vectors.js +1771 -0
  4. package/dist/bin/cleanup-stale-review-tasks.js +1468 -0
  5. package/dist/bin/cli.js +21580 -0
  6. package/dist/bin/exe-agent.js +2016 -0
  7. package/dist/bin/exe-assign.js +2176 -0
  8. package/dist/bin/exe-boot.js +6199 -0
  9. package/dist/bin/exe-call.js +889 -0
  10. package/dist/bin/exe-cloud.js +861 -0
  11. package/dist/bin/exe-dispatch.js +1026 -0
  12. package/dist/bin/exe-doctor.js +1786 -0
  13. package/dist/bin/exe-export-behaviors.js +1637 -0
  14. package/dist/bin/exe-forget.js +1784 -0
  15. package/dist/bin/exe-gateway.js +8007 -0
  16. package/dist/bin/exe-healthcheck.js +207 -0
  17. package/dist/bin/exe-heartbeat.js +1770 -0
  18. package/dist/bin/exe-kill.js +1622 -0
  19. package/dist/bin/exe-launch-agent.js +1847 -0
  20. package/dist/bin/exe-link.js +192 -0
  21. package/dist/bin/exe-new-employee.js +1384 -0
  22. package/dist/bin/exe-pending-messages.js +1568 -0
  23. package/dist/bin/exe-pending-notifications.js +1450 -0
  24. package/dist/bin/exe-pending-reviews.js +1590 -0
  25. package/dist/bin/exe-repo-drift.js +95 -0
  26. package/dist/bin/exe-review.js +1742 -0
  27. package/dist/bin/exe-search.js +3116 -0
  28. package/dist/bin/exe-session-cleanup.js +3359 -0
  29. package/dist/bin/exe-settings.js +365 -0
  30. package/dist/bin/exe-status.js +1661 -0
  31. package/dist/bin/exe-team.js +1453 -0
  32. package/dist/bin/git-sweep.js +2441 -0
  33. package/dist/bin/graph-backfill.js +2111 -0
  34. package/dist/bin/graph-export.js +1747 -0
  35. package/dist/bin/install.js +661 -0
  36. package/dist/bin/list-providers.js +140 -0
  37. package/dist/bin/scan-tasks.js +2039 -0
  38. package/dist/bin/setup.js +2706 -0
  39. package/dist/bin/shard-migrate.js +1637 -0
  40. package/dist/bin/update.js +98 -0
  41. package/dist/bin/wiki-sync.js +1657 -0
  42. package/dist/gateway/index.js +9123 -0
  43. package/dist/hooks/bug-report-worker.js +2770 -0
  44. package/dist/hooks/commit-complete.js +2364 -0
  45. package/dist/hooks/error-recall.js +3327 -0
  46. package/dist/hooks/exe-heartbeat-hook.js +237 -0
  47. package/dist/hooks/ingest-worker.js +4932 -0
  48. package/dist/hooks/ingest.js +695 -0
  49. package/dist/hooks/instructions-loaded.js +2069 -0
  50. package/dist/hooks/notification.js +1915 -0
  51. package/dist/hooks/post-compact.js +1940 -0
  52. package/dist/hooks/pre-compact.js +1935 -0
  53. package/dist/hooks/pre-tool-use.js +2380 -0
  54. package/dist/hooks/prompt-ingest-worker.js +2291 -0
  55. package/dist/hooks/prompt-submit.js +5056 -0
  56. package/dist/hooks/response-ingest-worker.js +2431 -0
  57. package/dist/hooks/session-end.js +2196 -0
  58. package/dist/hooks/session-start.js +3259 -0
  59. package/dist/hooks/stop.js +2025 -0
  60. package/dist/hooks/subagent-stop.js +1915 -0
  61. package/dist/hooks/summary-worker.js +2934 -0
  62. package/dist/index.js +12194 -0
  63. package/dist/lib/cloud-sync.js +500 -0
  64. package/dist/lib/config.js +235 -0
  65. package/dist/lib/consolidation.js +481 -0
  66. package/dist/lib/crypto.js +51 -0
  67. package/dist/lib/database.js +834 -0
  68. package/dist/lib/device-registry.js +1009 -0
  69. package/dist/lib/embedder.js +645 -0
  70. package/dist/lib/employee-templates.js +570 -0
  71. package/dist/lib/employees.js +182 -0
  72. package/dist/lib/error-detector.js +156 -0
  73. package/dist/lib/exe-daemon-client.js +456 -0
  74. package/dist/lib/exe-daemon.js +8566 -0
  75. package/dist/lib/file-grep.js +215 -0
  76. package/dist/lib/hybrid-search.js +3064 -0
  77. package/dist/lib/identity-templates.js +441 -0
  78. package/dist/lib/identity.js +228 -0
  79. package/dist/lib/keychain.js +145 -0
  80. package/dist/lib/license.js +382 -0
  81. package/dist/lib/messaging.js +1256 -0
  82. package/dist/lib/reminders.js +63 -0
  83. package/dist/lib/schedules.js +1525 -0
  84. package/dist/lib/session-registry.js +52 -0
  85. package/dist/lib/skill-learning.js +488 -0
  86. package/dist/lib/status-brief.js +240 -0
  87. package/dist/lib/store.js +1740 -0
  88. package/dist/lib/task-router.js +128 -0
  89. package/dist/lib/tasks.js +2452 -0
  90. package/dist/lib/tmux-routing.js +2836 -0
  91. package/dist/lib/tmux-status.js +261 -0
  92. package/dist/lib/tmux-transport.js +83 -0
  93. package/dist/lib/transport.js +128 -0
  94. package/dist/lib/ws-auth.js +19 -0
  95. package/dist/lib/ws-client.js +160 -0
  96. package/dist/mcp/server.js +10679 -0
  97. package/dist/mcp/tools/complete-reminder.js +67 -0
  98. package/dist/mcp/tools/create-reminder.js +52 -0
  99. package/dist/mcp/tools/create-task.js +1770 -0
  100. package/dist/mcp/tools/deactivate-behavior.js +268 -0
  101. package/dist/mcp/tools/list-reminders.js +62 -0
  102. package/dist/mcp/tools/list-tasks.js +483 -0
  103. package/dist/mcp/tools/send-message.js +1262 -0
  104. package/dist/mcp/tools/update-task.js +1799 -0
  105. package/dist/runtime/index.js +7068 -0
  106. package/dist/tui/App.js +17741 -0
  107. package/package.json +2 -2
@@ -0,0 +1,237 @@
1
+ // src/adapters/claude/hooks/exe-heartbeat-hook.ts
2
+ import { execFileSync } from "child_process";
3
+ import path3 from "path";
4
+ import { fileURLToPath } from "url";
5
+
6
+ // src/adapters/claude/active-agent.ts
7
+ import { readFileSync as readFileSync2, writeFileSync, mkdirSync, unlinkSync, readdirSync } from "fs";
8
+ import { execSync as execSync2 } from "child_process";
9
+ import path2 from "path";
10
+
11
+ // src/lib/config.ts
12
+ import { readFile, writeFile, mkdir } from "fs/promises";
13
+ import { readFileSync, existsSync, renameSync } from "fs";
14
+ import path from "path";
15
+ import os from "os";
16
+ function resolveDataDir() {
17
+ if (process.env.EXE_OS_DIR) return process.env.EXE_OS_DIR;
18
+ if (process.env.EXE_MEM_DIR) return process.env.EXE_MEM_DIR;
19
+ const newDir = path.join(os.homedir(), ".exe-os");
20
+ const legacyDir = path.join(os.homedir(), ".exe-mem");
21
+ if (!existsSync(newDir) && existsSync(legacyDir)) {
22
+ try {
23
+ renameSync(legacyDir, newDir);
24
+ process.stderr.write(`[exe-os] Migrated data directory: ~/.exe-mem \u2192 ~/.exe-os
25
+ `);
26
+ } catch {
27
+ return legacyDir;
28
+ }
29
+ }
30
+ return newDir;
31
+ }
32
+ var EXE_AI_DIR = resolveDataDir();
33
+ var DB_PATH = path.join(EXE_AI_DIR, "memories.db");
34
+ var MODELS_DIR = path.join(EXE_AI_DIR, "models");
35
+ var CONFIG_PATH = path.join(EXE_AI_DIR, "config.json");
36
+ var LEGACY_LANCE_PATH = path.join(EXE_AI_DIR, "local.lance");
37
+ var CURRENT_CONFIG_VERSION = 1;
38
+ var DEFAULT_CONFIG = {
39
+ config_version: CURRENT_CONFIG_VERSION,
40
+ dbPath: DB_PATH,
41
+ modelFile: "jina-embeddings-v5-small-q4_k_m.gguf",
42
+ embeddingDim: 1024,
43
+ batchSize: 20,
44
+ flushIntervalMs: 1e4,
45
+ autoIngestion: true,
46
+ autoRetrieval: true,
47
+ searchMode: "hybrid",
48
+ hookSearchMode: "hybrid",
49
+ fileGrepEnabled: true,
50
+ splashEffect: true,
51
+ consolidationEnabled: true,
52
+ consolidationIntervalMs: 6 * 60 * 60 * 1e3,
53
+ consolidationModel: "claude-haiku-4-5-20251001",
54
+ consolidationMaxCallsPerRun: 20,
55
+ selfQueryRouter: true,
56
+ selfQueryModel: "claude-haiku-4-5-20251001",
57
+ rerankerEnabled: true,
58
+ scalingRoadmap: {
59
+ rerankerAutoTrigger: {
60
+ enabled: true,
61
+ broadQueryMinCardinality: 5e4,
62
+ fetchTopK: 150,
63
+ returnTopK: 5
64
+ }
65
+ },
66
+ graphRagEnabled: true,
67
+ wikiEnabled: false,
68
+ wikiUrl: "",
69
+ wikiApiKey: "",
70
+ wikiSyncIntervalMs: 30 * 60 * 1e3,
71
+ wikiWorkspaceMapping: {
72
+ exe: "Executive",
73
+ yoshi: "Engineering",
74
+ mari: "Marketing",
75
+ tom: "Engineering",
76
+ sasha: "Production"
77
+ },
78
+ wikiAutoUpdate: true,
79
+ wikiAutoUpdateThreshold: 0.5,
80
+ wikiAutoUpdateCreateNew: true,
81
+ skillLearning: true,
82
+ skillThreshold: 3,
83
+ skillModel: "claude-haiku-4-5-20251001",
84
+ exeHeartbeat: {
85
+ enabled: true,
86
+ intervalSeconds: 60,
87
+ staleInProgressThresholdHours: 2
88
+ },
89
+ sessionLifecycle: {
90
+ idleKillEnabled: true,
91
+ idleKillTicksRequired: 3,
92
+ idleKillIntercomAckWindowMs: 1e4,
93
+ maxAutoInstances: 10
94
+ },
95
+ autoUpdate: {
96
+ checkOnBoot: true,
97
+ autoInstall: false,
98
+ checkIntervalMs: 24 * 60 * 60 * 1e3
99
+ }
100
+ };
101
+
102
+ // src/lib/session-key.ts
103
+ import { execSync } from "child_process";
104
+ var _cached = null;
105
+ function getSessionKey() {
106
+ if (_cached) return _cached;
107
+ let pid = process.ppid;
108
+ for (let i = 0; i < 10; i++) {
109
+ try {
110
+ const info = execSync(`ps -p ${pid} -o ppid=,comm=`, {
111
+ encoding: "utf8",
112
+ timeout: 2e3
113
+ }).trim();
114
+ const match = info.match(/^\s*(\d+)\s+(.+)$/);
115
+ if (!match) break;
116
+ const [, ppid, cmd] = match;
117
+ if (cmd === "claude" || cmd.endsWith("/claude")) {
118
+ _cached = String(pid);
119
+ return _cached;
120
+ }
121
+ pid = parseInt(ppid, 10);
122
+ if (pid <= 1) break;
123
+ } catch {
124
+ break;
125
+ }
126
+ }
127
+ _cached = process.env.CLAUDE_CODE_SSE_PORT ?? String(process.ppid);
128
+ return _cached;
129
+ }
130
+
131
+ // src/adapters/claude/active-agent.ts
132
+ var CACHE_DIR = path2.join(EXE_AI_DIR, "session-cache");
133
+ var STALE_MS = 24 * 60 * 60 * 1e3;
134
+ function getMarkerPath() {
135
+ return path2.join(CACHE_DIR, `active-agent-${getSessionKey()}.json`);
136
+ }
137
+ function getActiveAgent() {
138
+ try {
139
+ const markerPath = getMarkerPath();
140
+ const raw = readFileSync2(markerPath, "utf8");
141
+ const data = JSON.parse(raw);
142
+ if (data.agentId) {
143
+ if (data.startedAt) {
144
+ const age = Date.now() - new Date(data.startedAt).getTime();
145
+ if (age > STALE_MS) {
146
+ try {
147
+ unlinkSync(markerPath);
148
+ } catch {
149
+ }
150
+ } else {
151
+ return {
152
+ agentId: data.agentId,
153
+ agentRole: data.agentRole || "employee"
154
+ };
155
+ }
156
+ } else {
157
+ return {
158
+ agentId: data.agentId,
159
+ agentRole: data.agentRole || "employee"
160
+ };
161
+ }
162
+ }
163
+ } catch {
164
+ }
165
+ try {
166
+ const sessionName = execSync2(
167
+ "tmux display-message -p '#{session_name}' 2>/dev/null",
168
+ { encoding: "utf8", timeout: 2e3 }
169
+ ).trim();
170
+ const empMatch = sessionName.match(/^(\w+)-exe\d+$/);
171
+ if (empMatch && empMatch[1] !== "exe") {
172
+ return { agentId: empMatch[1], agentRole: "employee" };
173
+ }
174
+ if (/^exe\d+$/.test(sessionName)) {
175
+ return { agentId: "exe", agentRole: "COO" };
176
+ }
177
+ } catch {
178
+ }
179
+ return {
180
+ agentId: process.env.AGENT_ID || "default",
181
+ agentRole: process.env.AGENT_ROLE || "employee"
182
+ };
183
+ }
184
+
185
+ // src/adapters/claude/hooks/exe-heartbeat-hook.ts
186
+ var HOOK_TIMEOUT_MS = 5e3;
187
+ var CLI_TIMEOUT_MS = 4e3;
188
+ var EXE_AGENT_ID = "exe";
189
+ var watchdog = setTimeout(() => process.exit(0), HOOK_TIMEOUT_MS);
190
+ watchdog.unref();
191
+ var input = "";
192
+ process.stdin.setEncoding("utf8");
193
+ process.stdin.on("data", (chunk) => {
194
+ input += chunk;
195
+ });
196
+ process.stdin.on("end", () => {
197
+ void input;
198
+ try {
199
+ const agent = getActiveAgent();
200
+ if (agent.agentId !== EXE_AGENT_ID) {
201
+ cleanExit();
202
+ return;
203
+ }
204
+ const cliPath = path3.resolve(
205
+ path3.dirname(fileURLToPath(import.meta.url)),
206
+ "..",
207
+ "bin",
208
+ "exe-heartbeat.js"
209
+ );
210
+ let output = "";
211
+ try {
212
+ output = execFileSync(process.execPath, [cliPath], {
213
+ encoding: "utf8",
214
+ timeout: CLI_TIMEOUT_MS
215
+ });
216
+ } catch {
217
+ cleanExit();
218
+ return;
219
+ }
220
+ if (output.trim().length === 0) {
221
+ cleanExit();
222
+ return;
223
+ }
224
+ process.stdout.write(JSON.stringify({
225
+ hookSpecificOutput: {
226
+ hookEventName: "UserPromptSubmit",
227
+ additionalContext: output
228
+ }
229
+ }));
230
+ } catch {
231
+ }
232
+ cleanExit();
233
+ });
234
+ function cleanExit() {
235
+ clearTimeout(watchdog);
236
+ process.exit(0);
237
+ }