@askexenow/exe-os 0.8.80 → 0.8.82
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 +359 -267
- package/dist/bin/backfill-responses.js +357 -265
- package/dist/bin/backfill-vectors.js +339 -264
- package/dist/bin/cleanup-stale-review-tasks.js +315 -256
- package/dist/bin/cli.js +494 -240
- package/dist/bin/exe-agent.js +141 -46
- package/dist/bin/exe-assign.js +151 -63
- package/dist/bin/exe-boot.js +294 -115
- package/dist/bin/exe-call.js +76 -51
- package/dist/bin/exe-cloud.js +58 -45
- package/dist/bin/exe-dispatch.js +434 -277
- package/dist/bin/exe-doctor.js +317 -246
- package/dist/bin/exe-export-behaviors.js +328 -248
- package/dist/bin/exe-forget.js +314 -231
- package/dist/bin/exe-gateway.js +2676 -1402
- package/dist/bin/exe-heartbeat.js +329 -264
- package/dist/bin/exe-kill.js +324 -244
- package/dist/bin/exe-launch-agent.js +574 -463
- package/dist/bin/exe-link.js +1055 -95
- package/dist/bin/exe-new-employee.js +49 -54
- package/dist/bin/exe-pending-messages.js +310 -253
- package/dist/bin/exe-pending-notifications.js +299 -228
- package/dist/bin/exe-pending-reviews.js +314 -245
- package/dist/bin/exe-rename.js +259 -195
- package/dist/bin/exe-review.js +140 -64
- package/dist/bin/exe-search.js +543 -356
- package/dist/bin/exe-session-cleanup.js +463 -382
- package/dist/bin/exe-settings.js +129 -99
- package/dist/bin/exe-start.sh +6 -6
- package/dist/bin/exe-status.js +95 -36
- package/dist/bin/exe-team.js +116 -51
- package/dist/bin/git-sweep.js +482 -307
- package/dist/bin/graph-backfill.js +357 -245
- package/dist/bin/graph-export.js +324 -244
- package/dist/bin/install.js +33 -10
- package/dist/bin/scan-tasks.js +481 -307
- package/dist/bin/setup.js +1147 -140
- package/dist/bin/shard-migrate.js +321 -241
- package/dist/bin/update.js +1 -7
- package/dist/bin/wiki-sync.js +318 -238
- package/dist/gateway/index.js +2656 -1383
- package/dist/hooks/bug-report-worker.js +641 -472
- package/dist/hooks/commit-complete.js +482 -307
- package/dist/hooks/error-recall.js +363 -135
- package/dist/hooks/exe-heartbeat-hook.js +97 -27
- package/dist/hooks/ingest-worker.js +584 -397
- package/dist/hooks/ingest.js +123 -58
- package/dist/hooks/instructions-loaded.js +212 -82
- package/dist/hooks/notification.js +200 -70
- package/dist/hooks/post-compact.js +199 -81
- package/dist/hooks/pre-compact.js +352 -140
- package/dist/hooks/pre-tool-use.js +416 -278
- package/dist/hooks/prompt-ingest-worker.js +376 -299
- package/dist/hooks/prompt-submit.js +414 -188
- package/dist/hooks/response-ingest-worker.js +408 -338
- package/dist/hooks/session-end.js +209 -83
- package/dist/hooks/session-start.js +382 -158
- package/dist/hooks/stop.js +209 -83
- package/dist/hooks/subagent-stop.js +209 -85
- package/dist/hooks/summary-worker.js +606 -510
- package/dist/index.js +2133 -855
- package/dist/lib/cloud-sync.js +1175 -184
- package/dist/lib/config.js +1 -9
- package/dist/lib/consolidation.js +71 -34
- package/dist/lib/database.js +166 -14
- package/dist/lib/device-registry.js +189 -117
- package/dist/lib/embedder.js +6 -10
- package/dist/lib/employee-templates.js +134 -39
- package/dist/lib/employees.js +30 -7
- package/dist/lib/exe-daemon-client.js +5 -7
- package/dist/lib/exe-daemon.js +514 -152
- package/dist/lib/hybrid-search.js +543 -356
- package/dist/lib/identity-templates.js +15 -15
- package/dist/lib/identity.js +19 -15
- package/dist/lib/license.js +1 -7
- package/dist/lib/messaging.js +157 -135
- package/dist/lib/reminders.js +97 -0
- package/dist/lib/schedules.js +302 -231
- package/dist/lib/skill-learning.js +33 -27
- package/dist/lib/status-brief.js +11 -14
- package/dist/lib/store.js +326 -237
- package/dist/lib/task-router.js +105 -1
- package/dist/lib/tasks.js +233 -116
- package/dist/lib/tmux-routing.js +173 -56
- package/dist/lib/ws-client.js +13 -3
- package/dist/mcp/server.js +2009 -1015
- package/dist/mcp/tools/complete-reminder.js +97 -0
- package/dist/mcp/tools/create-reminder.js +97 -0
- package/dist/mcp/tools/create-task.js +426 -262
- package/dist/mcp/tools/deactivate-behavior.js +119 -44
- package/dist/mcp/tools/list-reminders.js +97 -0
- package/dist/mcp/tools/list-tasks.js +56 -57
- package/dist/mcp/tools/send-message.js +206 -143
- package/dist/mcp/tools/update-task.js +259 -85
- package/dist/runtime/index.js +495 -316
- package/dist/tui/App.js +1128 -919
- package/package.json +2 -10
- package/src/commands/exe/afk.md +8 -8
- package/src/commands/exe/assign.md +1 -1
- package/src/commands/exe/build-adv.md +1 -1
- package/src/commands/exe/call.md +10 -10
- package/src/commands/exe/employee-heartbeat.md +9 -6
- package/src/commands/exe/heartbeat.md +5 -5
- package/src/commands/exe/intercom.md +26 -15
- package/src/commands/exe/launch.md +2 -2
- package/src/commands/exe/new-employee.md +1 -1
- package/src/commands/exe/review.md +2 -2
- package/src/commands/exe/schedule.md +1 -1
- package/src/commands/exe/sessions.md +2 -2
- package/src/commands/exe.md +22 -20
|
@@ -8,6 +8,97 @@ var __export = (target, all) => {
|
|
|
8
8
|
__defProp(target, name, { get: all[name], enumerable: true });
|
|
9
9
|
};
|
|
10
10
|
|
|
11
|
+
// src/lib/config.ts
|
|
12
|
+
import { readFile, writeFile, mkdir, chmod } 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, DB_PATH, MODELS_DIR, CONFIG_PATH, LEGACY_LANCE_PATH, CURRENT_CONFIG_VERSION, DEFAULT_CONFIG;
|
|
33
|
+
var init_config = __esm({
|
|
34
|
+
"src/lib/config.ts"() {
|
|
35
|
+
"use strict";
|
|
36
|
+
EXE_AI_DIR = resolveDataDir();
|
|
37
|
+
DB_PATH = path.join(EXE_AI_DIR, "memories.db");
|
|
38
|
+
MODELS_DIR = path.join(EXE_AI_DIR, "models");
|
|
39
|
+
CONFIG_PATH = path.join(EXE_AI_DIR, "config.json");
|
|
40
|
+
LEGACY_LANCE_PATH = path.join(EXE_AI_DIR, "local.lance");
|
|
41
|
+
CURRENT_CONFIG_VERSION = 1;
|
|
42
|
+
DEFAULT_CONFIG = {
|
|
43
|
+
config_version: CURRENT_CONFIG_VERSION,
|
|
44
|
+
dbPath: DB_PATH,
|
|
45
|
+
modelFile: "jina-embeddings-v5-small-q4_k_m.gguf",
|
|
46
|
+
embeddingDim: 1024,
|
|
47
|
+
batchSize: 20,
|
|
48
|
+
flushIntervalMs: 1e4,
|
|
49
|
+
autoIngestion: true,
|
|
50
|
+
autoRetrieval: true,
|
|
51
|
+
searchMode: "hybrid",
|
|
52
|
+
hookSearchMode: "hybrid",
|
|
53
|
+
fileGrepEnabled: true,
|
|
54
|
+
splashEffect: true,
|
|
55
|
+
consolidationEnabled: true,
|
|
56
|
+
consolidationIntervalMs: 6 * 60 * 60 * 1e3,
|
|
57
|
+
consolidationModel: "claude-haiku-4-5-20251001",
|
|
58
|
+
consolidationMaxCallsPerRun: 20,
|
|
59
|
+
selfQueryRouter: true,
|
|
60
|
+
selfQueryModel: "claude-haiku-4-5-20251001",
|
|
61
|
+
rerankerEnabled: true,
|
|
62
|
+
scalingRoadmap: {
|
|
63
|
+
rerankerAutoTrigger: {
|
|
64
|
+
enabled: true,
|
|
65
|
+
broadQueryMinCardinality: 5e4,
|
|
66
|
+
fetchTopK: 150,
|
|
67
|
+
returnTopK: 5
|
|
68
|
+
}
|
|
69
|
+
},
|
|
70
|
+
graphRagEnabled: true,
|
|
71
|
+
wikiEnabled: false,
|
|
72
|
+
wikiUrl: "",
|
|
73
|
+
wikiApiKey: "",
|
|
74
|
+
wikiSyncIntervalMs: 30 * 60 * 1e3,
|
|
75
|
+
wikiWorkspaceMapping: {},
|
|
76
|
+
wikiAutoUpdate: true,
|
|
77
|
+
wikiAutoUpdateThreshold: 0.5,
|
|
78
|
+
wikiAutoUpdateCreateNew: true,
|
|
79
|
+
skillLearning: true,
|
|
80
|
+
skillThreshold: 3,
|
|
81
|
+
skillModel: "claude-haiku-4-5-20251001",
|
|
82
|
+
exeHeartbeat: {
|
|
83
|
+
enabled: true,
|
|
84
|
+
intervalSeconds: 60,
|
|
85
|
+
staleInProgressThresholdHours: 2
|
|
86
|
+
},
|
|
87
|
+
sessionLifecycle: {
|
|
88
|
+
idleKillEnabled: true,
|
|
89
|
+
idleKillTicksRequired: 3,
|
|
90
|
+
idleKillIntercomAckWindowMs: 1e4,
|
|
91
|
+
maxAutoInstances: 10
|
|
92
|
+
},
|
|
93
|
+
autoUpdate: {
|
|
94
|
+
checkOnBoot: true,
|
|
95
|
+
autoInstall: false,
|
|
96
|
+
checkIntervalMs: 24 * 60 * 60 * 1e3
|
|
97
|
+
}
|
|
98
|
+
};
|
|
99
|
+
}
|
|
100
|
+
});
|
|
101
|
+
|
|
11
102
|
// src/lib/db-retry.ts
|
|
12
103
|
function isBusyError(err) {
|
|
13
104
|
if (err instanceof Error) {
|
|
@@ -47,7 +138,7 @@ function wrapWithRetry(client) {
|
|
|
47
138
|
return (sql) => retryOnBusy(() => target.execute(sql), "execute");
|
|
48
139
|
}
|
|
49
140
|
if (prop === "batch") {
|
|
50
|
-
return (stmts) => retryOnBusy(() => target.batch(stmts), "batch");
|
|
141
|
+
return (stmts, mode) => retryOnBusy(() => target.batch(stmts, mode), "batch");
|
|
51
142
|
}
|
|
52
143
|
return Reflect.get(target, prop, receiver);
|
|
53
144
|
}
|
|
@@ -63,6 +154,43 @@ var init_db_retry = __esm({
|
|
|
63
154
|
}
|
|
64
155
|
});
|
|
65
156
|
|
|
157
|
+
// src/lib/employees.ts
|
|
158
|
+
import { readFile as readFile2, writeFile as writeFile2, mkdir as mkdir2 } from "fs/promises";
|
|
159
|
+
import { existsSync as existsSync2, symlinkSync, readlinkSync, readFileSync as readFileSync2, renameSync as renameSync2, unlinkSync, writeFileSync } from "fs";
|
|
160
|
+
import { execSync } from "child_process";
|
|
161
|
+
import path2 from "path";
|
|
162
|
+
import os2 from "os";
|
|
163
|
+
function normalizeRole(role) {
|
|
164
|
+
return (role ?? "").trim().toLowerCase();
|
|
165
|
+
}
|
|
166
|
+
function isCoordinatorRole(role) {
|
|
167
|
+
return normalizeRole(role) === normalizeRole(COORDINATOR_ROLE);
|
|
168
|
+
}
|
|
169
|
+
function getCoordinatorEmployee(employees) {
|
|
170
|
+
return employees.find((e) => isCoordinatorRole(e.role));
|
|
171
|
+
}
|
|
172
|
+
function getCoordinatorName(employees = loadEmployeesSync()) {
|
|
173
|
+
return getCoordinatorEmployee(employees)?.name ?? DEFAULT_COORDINATOR_TEMPLATE_NAME;
|
|
174
|
+
}
|
|
175
|
+
function loadEmployeesSync(employeesPath = EMPLOYEES_PATH) {
|
|
176
|
+
if (!existsSync2(employeesPath)) return [];
|
|
177
|
+
try {
|
|
178
|
+
return JSON.parse(readFileSync2(employeesPath, "utf-8"));
|
|
179
|
+
} catch {
|
|
180
|
+
return [];
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
var EMPLOYEES_PATH, DEFAULT_COORDINATOR_TEMPLATE_NAME, COORDINATOR_ROLE;
|
|
184
|
+
var init_employees = __esm({
|
|
185
|
+
"src/lib/employees.ts"() {
|
|
186
|
+
"use strict";
|
|
187
|
+
init_config();
|
|
188
|
+
EMPLOYEES_PATH = path2.join(EXE_AI_DIR, "exe-employees.json");
|
|
189
|
+
DEFAULT_COORDINATOR_TEMPLATE_NAME = "exe";
|
|
190
|
+
COORDINATOR_ROLE = "COO";
|
|
191
|
+
}
|
|
192
|
+
});
|
|
193
|
+
|
|
66
194
|
// src/lib/database.ts
|
|
67
195
|
var database_exports = {};
|
|
68
196
|
__export(database_exports, {
|
|
@@ -210,22 +338,24 @@ async function ensureSchema() {
|
|
|
210
338
|
ON behaviors(agent_id, active);
|
|
211
339
|
`);
|
|
212
340
|
try {
|
|
341
|
+
const coordinatorName = getCoordinatorName();
|
|
213
342
|
const existing = await client.execute({
|
|
214
|
-
sql: "SELECT COUNT(*) as cnt FROM behaviors WHERE agent_id =
|
|
215
|
-
args: []
|
|
343
|
+
sql: "SELECT COUNT(*) as cnt FROM behaviors WHERE agent_id = ?",
|
|
344
|
+
args: [coordinatorName]
|
|
216
345
|
});
|
|
217
346
|
if (Number(existing.rows[0]?.cnt) === 0) {
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
347
|
+
const seededAt = "2026-03-25T00:00:00Z";
|
|
348
|
+
for (const [domain, content] of [
|
|
349
|
+
["workflow", `Don't ask "keep going?" \u2014 just keep executing phases/plans autonomously`],
|
|
350
|
+
["tool-use", "Always use create_task MCP tool, never write .md files directly for task creation"],
|
|
351
|
+
["workflow", "Auto-start reviewing when idle and reviews are pending \u2014 never ask founder for permission"]
|
|
352
|
+
]) {
|
|
353
|
+
await client.execute({
|
|
354
|
+
sql: `INSERT INTO behaviors (id, agent_id, project_name, domain, content, active, created_at, updated_at)
|
|
355
|
+
VALUES (hex(randomblob(16)), ?, NULL, ?, ?, 1, ?, ?)`,
|
|
356
|
+
args: [coordinatorName, domain, content, seededAt, seededAt]
|
|
357
|
+
});
|
|
358
|
+
}
|
|
229
359
|
}
|
|
230
360
|
} catch {
|
|
231
361
|
}
|
|
@@ -917,6 +1047,39 @@ async function ensureSchema() {
|
|
|
917
1047
|
} catch {
|
|
918
1048
|
}
|
|
919
1049
|
}
|
|
1050
|
+
try {
|
|
1051
|
+
await client.execute({
|
|
1052
|
+
sql: `ALTER TABLE memories ADD COLUMN draft INTEGER DEFAULT 0`,
|
|
1053
|
+
args: []
|
|
1054
|
+
});
|
|
1055
|
+
} catch {
|
|
1056
|
+
}
|
|
1057
|
+
try {
|
|
1058
|
+
await client.execute(
|
|
1059
|
+
`CREATE INDEX IF NOT EXISTS idx_memories_draft ON memories(draft) WHERE draft = 1`
|
|
1060
|
+
);
|
|
1061
|
+
} catch {
|
|
1062
|
+
}
|
|
1063
|
+
try {
|
|
1064
|
+
await client.execute({
|
|
1065
|
+
sql: `ALTER TABLE memories ADD COLUMN memory_type TEXT DEFAULT 'raw'`,
|
|
1066
|
+
args: []
|
|
1067
|
+
});
|
|
1068
|
+
} catch {
|
|
1069
|
+
}
|
|
1070
|
+
try {
|
|
1071
|
+
await client.execute(
|
|
1072
|
+
`CREATE INDEX IF NOT EXISTS idx_memories_type ON memories(memory_type)`
|
|
1073
|
+
);
|
|
1074
|
+
} catch {
|
|
1075
|
+
}
|
|
1076
|
+
try {
|
|
1077
|
+
await client.execute({
|
|
1078
|
+
sql: `ALTER TABLE memories ADD COLUMN trajectory TEXT`,
|
|
1079
|
+
args: []
|
|
1080
|
+
});
|
|
1081
|
+
} catch {
|
|
1082
|
+
}
|
|
920
1083
|
}
|
|
921
1084
|
async function disposeDatabase() {
|
|
922
1085
|
if (_client) {
|
|
@@ -930,6 +1093,7 @@ var init_database = __esm({
|
|
|
930
1093
|
"src/lib/database.ts"() {
|
|
931
1094
|
"use strict";
|
|
932
1095
|
init_db_retry();
|
|
1096
|
+
init_employees();
|
|
933
1097
|
_client = null;
|
|
934
1098
|
_resilientClient = null;
|
|
935
1099
|
initTurso = initDatabase;
|
|
@@ -938,108 +1102,16 @@ var init_database = __esm({
|
|
|
938
1102
|
});
|
|
939
1103
|
|
|
940
1104
|
// src/lib/device-registry.ts
|
|
1105
|
+
init_config();
|
|
941
1106
|
import crypto from "crypto";
|
|
942
|
-
import
|
|
943
|
-
import { readFileSync as
|
|
944
|
-
import
|
|
945
|
-
|
|
946
|
-
// src/lib/config.ts
|
|
947
|
-
import { readFile, writeFile, mkdir, chmod } from "fs/promises";
|
|
948
|
-
import { readFileSync, existsSync, renameSync } from "fs";
|
|
949
|
-
import path from "path";
|
|
950
|
-
import os from "os";
|
|
951
|
-
function resolveDataDir() {
|
|
952
|
-
if (process.env.EXE_OS_DIR) return process.env.EXE_OS_DIR;
|
|
953
|
-
if (process.env.EXE_MEM_DIR) return process.env.EXE_MEM_DIR;
|
|
954
|
-
const newDir = path.join(os.homedir(), ".exe-os");
|
|
955
|
-
const legacyDir = path.join(os.homedir(), ".exe-mem");
|
|
956
|
-
if (!existsSync(newDir) && existsSync(legacyDir)) {
|
|
957
|
-
try {
|
|
958
|
-
renameSync(legacyDir, newDir);
|
|
959
|
-
process.stderr.write(`[exe-os] Migrated data directory: ~/.exe-mem \u2192 ~/.exe-os
|
|
960
|
-
`);
|
|
961
|
-
} catch {
|
|
962
|
-
return legacyDir;
|
|
963
|
-
}
|
|
964
|
-
}
|
|
965
|
-
return newDir;
|
|
966
|
-
}
|
|
967
|
-
var EXE_AI_DIR = resolveDataDir();
|
|
968
|
-
var DB_PATH = path.join(EXE_AI_DIR, "memories.db");
|
|
969
|
-
var MODELS_DIR = path.join(EXE_AI_DIR, "models");
|
|
970
|
-
var CONFIG_PATH = path.join(EXE_AI_DIR, "config.json");
|
|
971
|
-
var LEGACY_LANCE_PATH = path.join(EXE_AI_DIR, "local.lance");
|
|
972
|
-
var CURRENT_CONFIG_VERSION = 1;
|
|
973
|
-
var DEFAULT_CONFIG = {
|
|
974
|
-
config_version: CURRENT_CONFIG_VERSION,
|
|
975
|
-
dbPath: DB_PATH,
|
|
976
|
-
modelFile: "jina-embeddings-v5-small-q4_k_m.gguf",
|
|
977
|
-
embeddingDim: 1024,
|
|
978
|
-
batchSize: 20,
|
|
979
|
-
flushIntervalMs: 1e4,
|
|
980
|
-
autoIngestion: true,
|
|
981
|
-
autoRetrieval: true,
|
|
982
|
-
searchMode: "hybrid",
|
|
983
|
-
hookSearchMode: "hybrid",
|
|
984
|
-
fileGrepEnabled: true,
|
|
985
|
-
splashEffect: true,
|
|
986
|
-
consolidationEnabled: true,
|
|
987
|
-
consolidationIntervalMs: 6 * 60 * 60 * 1e3,
|
|
988
|
-
consolidationModel: "claude-haiku-4-5-20251001",
|
|
989
|
-
consolidationMaxCallsPerRun: 20,
|
|
990
|
-
selfQueryRouter: true,
|
|
991
|
-
selfQueryModel: "claude-haiku-4-5-20251001",
|
|
992
|
-
rerankerEnabled: true,
|
|
993
|
-
scalingRoadmap: {
|
|
994
|
-
rerankerAutoTrigger: {
|
|
995
|
-
enabled: true,
|
|
996
|
-
broadQueryMinCardinality: 5e4,
|
|
997
|
-
fetchTopK: 150,
|
|
998
|
-
returnTopK: 5
|
|
999
|
-
}
|
|
1000
|
-
},
|
|
1001
|
-
graphRagEnabled: true,
|
|
1002
|
-
wikiEnabled: false,
|
|
1003
|
-
wikiUrl: "",
|
|
1004
|
-
wikiApiKey: "",
|
|
1005
|
-
wikiSyncIntervalMs: 30 * 60 * 1e3,
|
|
1006
|
-
wikiWorkspaceMapping: {
|
|
1007
|
-
exe: "Executive",
|
|
1008
|
-
yoshi: "Engineering",
|
|
1009
|
-
mari: "Marketing",
|
|
1010
|
-
tom: "Engineering",
|
|
1011
|
-
sasha: "Production"
|
|
1012
|
-
},
|
|
1013
|
-
wikiAutoUpdate: true,
|
|
1014
|
-
wikiAutoUpdateThreshold: 0.5,
|
|
1015
|
-
wikiAutoUpdateCreateNew: true,
|
|
1016
|
-
skillLearning: true,
|
|
1017
|
-
skillThreshold: 3,
|
|
1018
|
-
skillModel: "claude-haiku-4-5-20251001",
|
|
1019
|
-
exeHeartbeat: {
|
|
1020
|
-
enabled: true,
|
|
1021
|
-
intervalSeconds: 60,
|
|
1022
|
-
staleInProgressThresholdHours: 2
|
|
1023
|
-
},
|
|
1024
|
-
sessionLifecycle: {
|
|
1025
|
-
idleKillEnabled: true,
|
|
1026
|
-
idleKillTicksRequired: 3,
|
|
1027
|
-
idleKillIntercomAckWindowMs: 1e4,
|
|
1028
|
-
maxAutoInstances: 10
|
|
1029
|
-
},
|
|
1030
|
-
autoUpdate: {
|
|
1031
|
-
checkOnBoot: true,
|
|
1032
|
-
autoInstall: false,
|
|
1033
|
-
checkIntervalMs: 24 * 60 * 60 * 1e3
|
|
1034
|
-
}
|
|
1035
|
-
};
|
|
1036
|
-
|
|
1037
|
-
// src/lib/device-registry.ts
|
|
1038
|
-
var DEVICE_JSON_PATH = path2.join(EXE_AI_DIR, "device.json");
|
|
1107
|
+
import os3 from "os";
|
|
1108
|
+
import { readFileSync as readFileSync3, writeFileSync as writeFileSync2, mkdirSync, existsSync as existsSync3 } from "fs";
|
|
1109
|
+
import path3 from "path";
|
|
1110
|
+
var DEVICE_JSON_PATH = path3.join(EXE_AI_DIR, "device.json");
|
|
1039
1111
|
function getDeviceInfo() {
|
|
1040
|
-
if (
|
|
1112
|
+
if (existsSync3(DEVICE_JSON_PATH)) {
|
|
1041
1113
|
try {
|
|
1042
|
-
const raw =
|
|
1114
|
+
const raw = readFileSync3(DEVICE_JSON_PATH, "utf8");
|
|
1043
1115
|
const data = JSON.parse(raw);
|
|
1044
1116
|
if (data.deviceId && data.friendlyName && data.hostname) {
|
|
1045
1117
|
return data;
|
|
@@ -1047,20 +1119,20 @@ function getDeviceInfo() {
|
|
|
1047
1119
|
} catch {
|
|
1048
1120
|
}
|
|
1049
1121
|
}
|
|
1050
|
-
const hostname =
|
|
1122
|
+
const hostname = os3.hostname();
|
|
1051
1123
|
const info = {
|
|
1052
1124
|
deviceId: crypto.randomUUID(),
|
|
1053
1125
|
friendlyName: hostname.replace(/\./g, "-").toLowerCase(),
|
|
1054
1126
|
hostname
|
|
1055
1127
|
};
|
|
1056
|
-
mkdirSync(
|
|
1057
|
-
|
|
1128
|
+
mkdirSync(path3.dirname(DEVICE_JSON_PATH), { recursive: true });
|
|
1129
|
+
writeFileSync2(DEVICE_JSON_PATH, JSON.stringify(info, null, 2));
|
|
1058
1130
|
return info;
|
|
1059
1131
|
}
|
|
1060
1132
|
function setFriendlyName(name) {
|
|
1061
1133
|
const info = getDeviceInfo();
|
|
1062
1134
|
info.friendlyName = name;
|
|
1063
|
-
|
|
1135
|
+
writeFileSync2(DEVICE_JSON_PATH, JSON.stringify(info, null, 2));
|
|
1064
1136
|
}
|
|
1065
1137
|
async function resolveTargetDevice(targetAgent, targetProject) {
|
|
1066
1138
|
const { getClient: getClient2 } = await Promise.resolve().then(() => (init_database(), database_exports));
|
package/dist/lib/embedder.js
CHANGED
|
@@ -13,7 +13,6 @@ var config_exports = {};
|
|
|
13
13
|
__export(config_exports, {
|
|
14
14
|
CONFIG_MIGRATIONS: () => CONFIG_MIGRATIONS,
|
|
15
15
|
CONFIG_PATH: () => CONFIG_PATH,
|
|
16
|
-
COO_AGENT_NAME: () => COO_AGENT_NAME,
|
|
17
16
|
CURRENT_CONFIG_VERSION: () => CURRENT_CONFIG_VERSION,
|
|
18
17
|
DB_PATH: () => DB_PATH,
|
|
19
18
|
EXE_AI_DIR: () => EXE_AI_DIR,
|
|
@@ -169,7 +168,7 @@ async function loadConfigFrom(configPath) {
|
|
|
169
168
|
return { ...DEFAULT_CONFIG };
|
|
170
169
|
}
|
|
171
170
|
}
|
|
172
|
-
var EXE_AI_DIR, DB_PATH, MODELS_DIR, CONFIG_PATH,
|
|
171
|
+
var EXE_AI_DIR, DB_PATH, MODELS_DIR, CONFIG_PATH, LEGACY_LANCE_PATH, CURRENT_CONFIG_VERSION, DEFAULT_CONFIG, CONFIG_MIGRATIONS;
|
|
173
172
|
var init_config = __esm({
|
|
174
173
|
"src/lib/config.ts"() {
|
|
175
174
|
"use strict";
|
|
@@ -177,7 +176,6 @@ var init_config = __esm({
|
|
|
177
176
|
DB_PATH = path.join(EXE_AI_DIR, "memories.db");
|
|
178
177
|
MODELS_DIR = path.join(EXE_AI_DIR, "models");
|
|
179
178
|
CONFIG_PATH = path.join(EXE_AI_DIR, "config.json");
|
|
180
|
-
COO_AGENT_NAME = "exe";
|
|
181
179
|
LEGACY_LANCE_PATH = path.join(EXE_AI_DIR, "local.lance");
|
|
182
180
|
CURRENT_CONFIG_VERSION = 1;
|
|
183
181
|
DEFAULT_CONFIG = {
|
|
@@ -213,13 +211,7 @@ var init_config = __esm({
|
|
|
213
211
|
wikiUrl: "",
|
|
214
212
|
wikiApiKey: "",
|
|
215
213
|
wikiSyncIntervalMs: 30 * 60 * 1e3,
|
|
216
|
-
wikiWorkspaceMapping: {
|
|
217
|
-
exe: "Executive",
|
|
218
|
-
yoshi: "Engineering",
|
|
219
|
-
mari: "Marketing",
|
|
220
|
-
tom: "Engineering",
|
|
221
|
-
sasha: "Production"
|
|
222
|
-
},
|
|
214
|
+
wikiWorkspaceMapping: {},
|
|
223
215
|
wikiAutoUpdate: true,
|
|
224
216
|
wikiAutoUpdateThreshold: 0.5,
|
|
225
217
|
wikiAutoUpdateCreateNew: true,
|
|
@@ -361,6 +353,10 @@ function spawnDaemon() {
|
|
|
361
353
|
stdio: ["ignore", "ignore", stderrFd],
|
|
362
354
|
env: {
|
|
363
355
|
...process.env,
|
|
356
|
+
TMUX: void 0,
|
|
357
|
+
// Daemon is global — must not inherit session scope
|
|
358
|
+
TMUX_PANE: void 0,
|
|
359
|
+
// Prevents resolveExeSession() from scoping to one session
|
|
364
360
|
EXE_DAEMON_SOCK: SOCKET_PATH,
|
|
365
361
|
EXE_DAEMON_PID: PID_PATH
|
|
366
362
|
}
|