@askexenow/exe-os 0.8.83 → 0.8.86
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 +746 -595
- package/dist/bin/backfill-responses.js +745 -594
- package/dist/bin/backfill-vectors.js +312 -226
- package/dist/bin/cleanup-stale-review-tasks.js +154 -21
- package/dist/bin/cli.js +14678 -12676
- package/dist/bin/exe-agent-config.js +242 -0
- package/dist/bin/exe-agent.js +100 -91
- package/dist/bin/exe-assign.js +1003 -854
- package/dist/bin/exe-boot.js +1420 -485
- package/dist/bin/exe-call.js +10 -0
- package/dist/bin/exe-cloud.js +29 -6
- package/dist/bin/exe-dispatch.js +572 -271
- package/dist/bin/exe-doctor.js +403 -6
- package/dist/bin/exe-export-behaviors.js +175 -72
- package/dist/bin/exe-forget.js +102 -3
- package/dist/bin/exe-gateway.js +796 -292
- package/dist/bin/exe-healthcheck.js +134 -1
- package/dist/bin/exe-heartbeat.js +172 -36
- package/dist/bin/exe-kill.js +175 -72
- package/dist/bin/exe-launch-agent.js +189 -76
- package/dist/bin/exe-link.js +927 -82
- package/dist/bin/exe-new-employee.js +60 -8
- package/dist/bin/exe-pending-messages.js +151 -19
- package/dist/bin/exe-pending-notifications.js +97 -2
- package/dist/bin/exe-pending-reviews.js +155 -22
- package/dist/bin/exe-rename.js +564 -23
- package/dist/bin/exe-review.js +231 -73
- package/dist/bin/exe-search.js +995 -228
- package/dist/bin/exe-session-cleanup.js +4930 -1664
- package/dist/bin/exe-settings.js +20 -5
- package/dist/bin/exe-start-codex.js +2598 -0
- package/dist/bin/exe-start.sh +15 -3
- package/dist/bin/exe-status.js +154 -21
- package/dist/bin/exe-team.js +97 -2
- package/dist/bin/git-sweep.js +1180 -363
- package/dist/bin/graph-backfill.js +175 -72
- package/dist/bin/graph-export.js +175 -72
- package/dist/bin/install.js +60 -7
- package/dist/bin/list-providers.js +1 -0
- package/dist/bin/scan-tasks.js +1185 -367
- package/dist/bin/setup.js +914 -270
- package/dist/bin/shard-migrate.js +175 -72
- package/dist/bin/update.js +1 -0
- package/dist/bin/wiki-sync.js +175 -72
- package/dist/gateway/index.js +792 -285
- package/dist/hooks/bug-report-worker.js +445 -135
- package/dist/hooks/commit-complete.js +1178 -361
- package/dist/hooks/error-recall.js +994 -228
- package/dist/hooks/ingest-worker.js +1799 -1234
- package/dist/hooks/ingest.js +3 -0
- package/dist/hooks/instructions-loaded.js +707 -97
- package/dist/hooks/notification.js +699 -89
- package/dist/hooks/post-compact.js +757 -109
- package/dist/hooks/pre-compact.js +1061 -244
- package/dist/hooks/pre-tool-use.js +787 -130
- package/dist/hooks/prompt-ingest-worker.js +242 -101
- package/dist/hooks/prompt-submit.js +1121 -299
- package/dist/hooks/response-ingest-worker.js +242 -101
- package/dist/hooks/session-end.js +4063 -397
- package/dist/hooks/session-start.js +1071 -254
- package/dist/hooks/stop.js +768 -120
- package/dist/hooks/subagent-stop.js +757 -109
- package/dist/hooks/summary-worker.js +1706 -1011
- package/dist/index.js +1821 -1098
- package/dist/lib/agent-config.js +167 -0
- package/dist/lib/cloud-sync.js +932 -88
- package/dist/lib/consolidation.js +2 -1
- package/dist/lib/database.js +642 -87
- package/dist/lib/db-daemon-client.js +503 -0
- package/dist/lib/device-registry.js +547 -7
- package/dist/lib/embedder.js +14 -28
- package/dist/lib/employee-templates.js +84 -74
- package/dist/lib/employees.js +9 -0
- package/dist/lib/exe-daemon-client.js +16 -29
- package/dist/lib/exe-daemon.js +2733 -1575
- package/dist/lib/hybrid-search.js +995 -228
- package/dist/lib/identity.js +87 -67
- package/dist/lib/keychain.js +9 -1
- package/dist/lib/messaging.js +103 -40
- package/dist/lib/reminders.js +91 -74
- package/dist/lib/runtime-table.js +16 -0
- package/dist/lib/schedules.js +96 -2
- package/dist/lib/session-wrappers.js +22 -0
- package/dist/lib/skill-learning.js +103 -85
- package/dist/lib/store.js +234 -73
- package/dist/lib/tasks.js +348 -134
- package/dist/lib/tmux-routing.js +422 -208
- package/dist/lib/token-spend.js +273 -0
- package/dist/lib/ws-client.js +11 -0
- package/dist/mcp/server.js +5742 -696
- package/dist/mcp/tools/complete-reminder.js +94 -77
- package/dist/mcp/tools/create-reminder.js +94 -77
- package/dist/mcp/tools/create-task.js +375 -152
- package/dist/mcp/tools/deactivate-behavior.js +95 -77
- package/dist/mcp/tools/list-reminders.js +94 -77
- package/dist/mcp/tools/list-tasks.js +99 -31
- package/dist/mcp/tools/send-message.js +108 -45
- package/dist/mcp/tools/update-task.js +162 -77
- package/dist/runtime/index.js +1075 -258
- package/dist/tui/App.js +1333 -506
- package/package.json +6 -1
- package/src/commands/exe/agent-config.md +27 -0
- package/src/commands/exe/cc-doctor.md +10 -0
|
@@ -0,0 +1,242 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
|
|
3
|
+
// src/lib/agent-config.ts
|
|
4
|
+
import { readFileSync as readFileSync2, writeFileSync, existsSync as existsSync2, mkdirSync } from "fs";
|
|
5
|
+
import path2 from "path";
|
|
6
|
+
|
|
7
|
+
// src/lib/config.ts
|
|
8
|
+
import { readFile, writeFile, mkdir, chmod } from "fs/promises";
|
|
9
|
+
import { readFileSync, existsSync, renameSync } from "fs";
|
|
10
|
+
import path from "path";
|
|
11
|
+
import os from "os";
|
|
12
|
+
function resolveDataDir() {
|
|
13
|
+
if (process.env.EXE_OS_DIR) return process.env.EXE_OS_DIR;
|
|
14
|
+
if (process.env.EXE_MEM_DIR) return process.env.EXE_MEM_DIR;
|
|
15
|
+
const newDir = path.join(os.homedir(), ".exe-os");
|
|
16
|
+
const legacyDir = path.join(os.homedir(), ".exe-mem");
|
|
17
|
+
if (!existsSync(newDir) && existsSync(legacyDir)) {
|
|
18
|
+
try {
|
|
19
|
+
renameSync(legacyDir, newDir);
|
|
20
|
+
process.stderr.write(`[exe-os] Migrated data directory: ~/.exe-mem \u2192 ~/.exe-os
|
|
21
|
+
`);
|
|
22
|
+
} catch {
|
|
23
|
+
return legacyDir;
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
return newDir;
|
|
27
|
+
}
|
|
28
|
+
var EXE_AI_DIR = resolveDataDir();
|
|
29
|
+
var DB_PATH = path.join(EXE_AI_DIR, "memories.db");
|
|
30
|
+
var MODELS_DIR = path.join(EXE_AI_DIR, "models");
|
|
31
|
+
var CONFIG_PATH = path.join(EXE_AI_DIR, "config.json");
|
|
32
|
+
var LEGACY_LANCE_PATH = path.join(EXE_AI_DIR, "local.lance");
|
|
33
|
+
var CURRENT_CONFIG_VERSION = 1;
|
|
34
|
+
var DEFAULT_CONFIG = {
|
|
35
|
+
config_version: CURRENT_CONFIG_VERSION,
|
|
36
|
+
dbPath: DB_PATH,
|
|
37
|
+
modelFile: "jina-embeddings-v5-small-q4_k_m.gguf",
|
|
38
|
+
embeddingDim: 1024,
|
|
39
|
+
batchSize: 20,
|
|
40
|
+
flushIntervalMs: 1e4,
|
|
41
|
+
autoIngestion: true,
|
|
42
|
+
autoRetrieval: true,
|
|
43
|
+
searchMode: "hybrid",
|
|
44
|
+
hookSearchMode: "hybrid",
|
|
45
|
+
fileGrepEnabled: true,
|
|
46
|
+
splashEffect: true,
|
|
47
|
+
consolidationEnabled: true,
|
|
48
|
+
consolidationIntervalMs: 6 * 60 * 60 * 1e3,
|
|
49
|
+
consolidationModel: "claude-haiku-4-5-20251001",
|
|
50
|
+
consolidationMaxCallsPerRun: 20,
|
|
51
|
+
selfQueryRouter: true,
|
|
52
|
+
selfQueryModel: "claude-haiku-4-5-20251001",
|
|
53
|
+
rerankerEnabled: true,
|
|
54
|
+
scalingRoadmap: {
|
|
55
|
+
rerankerAutoTrigger: {
|
|
56
|
+
enabled: true,
|
|
57
|
+
broadQueryMinCardinality: 5e4,
|
|
58
|
+
fetchTopK: 150,
|
|
59
|
+
returnTopK: 5
|
|
60
|
+
}
|
|
61
|
+
},
|
|
62
|
+
graphRagEnabled: true,
|
|
63
|
+
wikiEnabled: false,
|
|
64
|
+
wikiUrl: "",
|
|
65
|
+
wikiApiKey: "",
|
|
66
|
+
wikiSyncIntervalMs: 30 * 60 * 1e3,
|
|
67
|
+
wikiWorkspaceMapping: {},
|
|
68
|
+
wikiAutoUpdate: true,
|
|
69
|
+
wikiAutoUpdateThreshold: 0.5,
|
|
70
|
+
wikiAutoUpdateCreateNew: true,
|
|
71
|
+
skillLearning: true,
|
|
72
|
+
skillThreshold: 3,
|
|
73
|
+
skillModel: "claude-haiku-4-5-20251001",
|
|
74
|
+
exeHeartbeat: {
|
|
75
|
+
enabled: true,
|
|
76
|
+
intervalSeconds: 60,
|
|
77
|
+
staleInProgressThresholdHours: 2
|
|
78
|
+
},
|
|
79
|
+
sessionLifecycle: {
|
|
80
|
+
idleKillEnabled: true,
|
|
81
|
+
idleKillTicksRequired: 3,
|
|
82
|
+
idleKillIntercomAckWindowMs: 1e4,
|
|
83
|
+
maxAutoInstances: 10
|
|
84
|
+
},
|
|
85
|
+
autoUpdate: {
|
|
86
|
+
checkOnBoot: true,
|
|
87
|
+
autoInstall: false,
|
|
88
|
+
checkIntervalMs: 24 * 60 * 60 * 1e3
|
|
89
|
+
}
|
|
90
|
+
};
|
|
91
|
+
|
|
92
|
+
// src/lib/runtime-table.ts
|
|
93
|
+
var RUNTIME_TABLE = {
|
|
94
|
+
codex: {
|
|
95
|
+
binary: "codex",
|
|
96
|
+
launchMode: "exec",
|
|
97
|
+
autoApproveFlag: "--full-auto",
|
|
98
|
+
inlineFlag: "--no-alt-screen",
|
|
99
|
+
apiKeyEnv: "OPENAI_API_KEY",
|
|
100
|
+
defaultModel: "gpt-5.4"
|
|
101
|
+
}
|
|
102
|
+
};
|
|
103
|
+
var DEFAULT_RUNTIME = "claude";
|
|
104
|
+
|
|
105
|
+
// src/lib/agent-config.ts
|
|
106
|
+
var AGENT_CONFIG_PATH = path2.join(EXE_AI_DIR, "agent-config.json");
|
|
107
|
+
var KNOWN_RUNTIMES = {
|
|
108
|
+
claude: ["claude-opus-4", "claude-sonnet-4", "claude-haiku-3.5"],
|
|
109
|
+
codex: ["gpt-5.4", "gpt-5.5", "o3", "o4-mini"],
|
|
110
|
+
opencode: ["minimax-m2.7"]
|
|
111
|
+
};
|
|
112
|
+
var DEFAULT_MODELS = {
|
|
113
|
+
claude: "claude-opus-4",
|
|
114
|
+
codex: RUNTIME_TABLE.codex?.defaultModel ?? "gpt-5.4",
|
|
115
|
+
opencode: "minimax-m2.7"
|
|
116
|
+
};
|
|
117
|
+
function loadAgentConfig() {
|
|
118
|
+
if (!existsSync2(AGENT_CONFIG_PATH)) return {};
|
|
119
|
+
try {
|
|
120
|
+
return JSON.parse(readFileSync2(AGENT_CONFIG_PATH, "utf-8"));
|
|
121
|
+
} catch {
|
|
122
|
+
return {};
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
function saveAgentConfig(config) {
|
|
126
|
+
const dir = path2.dirname(AGENT_CONFIG_PATH);
|
|
127
|
+
if (!existsSync2(dir)) mkdirSync(dir, { recursive: true });
|
|
128
|
+
writeFileSync(AGENT_CONFIG_PATH, JSON.stringify(config, null, 2) + "\n", "utf-8");
|
|
129
|
+
}
|
|
130
|
+
function getAgentRuntime(agentId) {
|
|
131
|
+
const config = loadAgentConfig();
|
|
132
|
+
const entry = config[agentId];
|
|
133
|
+
if (entry) return entry;
|
|
134
|
+
return { runtime: DEFAULT_RUNTIME, model: DEFAULT_MODELS[DEFAULT_RUNTIME] };
|
|
135
|
+
}
|
|
136
|
+
function setAgentRuntime(agentId, runtime, model) {
|
|
137
|
+
const knownModels = KNOWN_RUNTIMES[runtime];
|
|
138
|
+
if (!knownModels) {
|
|
139
|
+
return {
|
|
140
|
+
ok: false,
|
|
141
|
+
error: `Unknown runtime "${runtime}". Valid: ${Object.keys(KNOWN_RUNTIMES).join(", ")}`
|
|
142
|
+
};
|
|
143
|
+
}
|
|
144
|
+
if (!knownModels.includes(model)) {
|
|
145
|
+
return {
|
|
146
|
+
ok: false,
|
|
147
|
+
error: `Unknown model "${model}" for runtime "${runtime}". Valid: ${knownModels.join(", ")}`
|
|
148
|
+
};
|
|
149
|
+
}
|
|
150
|
+
const config = loadAgentConfig();
|
|
151
|
+
config[agentId] = { runtime, model };
|
|
152
|
+
saveAgentConfig(config);
|
|
153
|
+
return { ok: true };
|
|
154
|
+
}
|
|
155
|
+
function clearAgentRuntime(agentId) {
|
|
156
|
+
const config = loadAgentConfig();
|
|
157
|
+
delete config[agentId];
|
|
158
|
+
saveAgentConfig(config);
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
// src/lib/employees.ts
|
|
162
|
+
import { readFile as readFile2, writeFile as writeFile2, mkdir as mkdir2 } from "fs/promises";
|
|
163
|
+
import { existsSync as existsSync3, symlinkSync, readlinkSync, readFileSync as readFileSync3, renameSync as renameSync2, unlinkSync, writeFileSync as writeFileSync2 } from "fs";
|
|
164
|
+
import { execSync } from "child_process";
|
|
165
|
+
import path3 from "path";
|
|
166
|
+
import os2 from "os";
|
|
167
|
+
var EMPLOYEES_PATH = path3.join(EXE_AI_DIR, "exe-employees.json");
|
|
168
|
+
function loadEmployeesSync(employeesPath = EMPLOYEES_PATH) {
|
|
169
|
+
if (!existsSync3(employeesPath)) return [];
|
|
170
|
+
try {
|
|
171
|
+
return JSON.parse(readFileSync3(employeesPath, "utf-8"));
|
|
172
|
+
} catch {
|
|
173
|
+
return [];
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
|
|
177
|
+
// src/bin/exe-agent-config.ts
|
|
178
|
+
function showAll() {
|
|
179
|
+
const config = loadAgentConfig();
|
|
180
|
+
let employees = [];
|
|
181
|
+
try {
|
|
182
|
+
employees = loadEmployeesSync();
|
|
183
|
+
} catch {
|
|
184
|
+
process.stderr.write("Warning: could not load employee roster\n");
|
|
185
|
+
}
|
|
186
|
+
if (employees.length === 0) {
|
|
187
|
+
console.log("No employees in roster.");
|
|
188
|
+
return;
|
|
189
|
+
}
|
|
190
|
+
console.log("");
|
|
191
|
+
console.log("Agent Runtime Configuration");
|
|
192
|
+
console.log("\u2550".repeat(65));
|
|
193
|
+
console.log(
|
|
194
|
+
"Agent".padEnd(10) + "Role".padEnd(22) + "Runtime".padEnd(12) + "Model"
|
|
195
|
+
);
|
|
196
|
+
console.log("\u2500".repeat(65));
|
|
197
|
+
for (const emp of employees) {
|
|
198
|
+
const entry = config[emp.name];
|
|
199
|
+
const runtime = entry?.runtime ?? DEFAULT_RUNTIME;
|
|
200
|
+
const model = entry?.model ?? DEFAULT_MODELS[DEFAULT_RUNTIME];
|
|
201
|
+
const configured = entry ? "" : " (default)";
|
|
202
|
+
const role = (emp.role ?? "").length > 20 ? (emp.role ?? "").slice(0, 18) + ".." : emp.role ?? "";
|
|
203
|
+
console.log(
|
|
204
|
+
emp.name.padEnd(10) + role.padEnd(22) + runtime.padEnd(12) + model + configured
|
|
205
|
+
);
|
|
206
|
+
}
|
|
207
|
+
console.log("\u2500".repeat(65));
|
|
208
|
+
console.log("");
|
|
209
|
+
console.log("Available runtimes:");
|
|
210
|
+
for (const [rt, models] of Object.entries(KNOWN_RUNTIMES)) {
|
|
211
|
+
console.log(` ${rt}: ${models.join(", ")}`);
|
|
212
|
+
}
|
|
213
|
+
console.log("");
|
|
214
|
+
}
|
|
215
|
+
function main() {
|
|
216
|
+
const args = process.argv.slice(2);
|
|
217
|
+
if (args.length === 0) {
|
|
218
|
+
showAll();
|
|
219
|
+
return;
|
|
220
|
+
}
|
|
221
|
+
const agentId = args[0];
|
|
222
|
+
if (args[1] === "--clear") {
|
|
223
|
+
clearAgentRuntime(agentId);
|
|
224
|
+
console.log(`Cleared config for ${agentId} \u2014 will use defaults.`);
|
|
225
|
+
return;
|
|
226
|
+
}
|
|
227
|
+
if (args.length < 3) {
|
|
228
|
+
const rt = getAgentRuntime(agentId);
|
|
229
|
+
console.log(`${agentId}: runtime=${rt.runtime} model=${rt.model}`);
|
|
230
|
+
return;
|
|
231
|
+
}
|
|
232
|
+
const runtime = args[1];
|
|
233
|
+
const model = args[2];
|
|
234
|
+
const result = setAgentRuntime(agentId, runtime, model);
|
|
235
|
+
if (!result.ok) {
|
|
236
|
+
process.stderr.write(`Error: ${result.error}
|
|
237
|
+
`);
|
|
238
|
+
process.exit(1);
|
|
239
|
+
}
|
|
240
|
+
console.log(`Set ${agentId} \u2192 runtime=${runtime} model=${model}`);
|
|
241
|
+
}
|
|
242
|
+
main();
|
package/dist/bin/exe-agent.js
CHANGED
|
@@ -1,4 +1,99 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
3
|
+
var __esm = (fn, res) => function __init() {
|
|
4
|
+
return fn && (res = (0, fn[__getOwnPropNames(fn)[0]])(fn = 0)), res;
|
|
5
|
+
};
|
|
6
|
+
|
|
7
|
+
// src/lib/config.ts
|
|
8
|
+
import { readFile, writeFile, mkdir, chmod } from "fs/promises";
|
|
9
|
+
import { readFileSync, existsSync, renameSync } from "fs";
|
|
10
|
+
import path from "path";
|
|
11
|
+
import os from "os";
|
|
12
|
+
function resolveDataDir() {
|
|
13
|
+
if (process.env.EXE_OS_DIR) return process.env.EXE_OS_DIR;
|
|
14
|
+
if (process.env.EXE_MEM_DIR) return process.env.EXE_MEM_DIR;
|
|
15
|
+
const newDir = path.join(os.homedir(), ".exe-os");
|
|
16
|
+
const legacyDir = path.join(os.homedir(), ".exe-mem");
|
|
17
|
+
if (!existsSync(newDir) && existsSync(legacyDir)) {
|
|
18
|
+
try {
|
|
19
|
+
renameSync(legacyDir, newDir);
|
|
20
|
+
process.stderr.write(`[exe-os] Migrated data directory: ~/.exe-mem \u2192 ~/.exe-os
|
|
21
|
+
`);
|
|
22
|
+
} catch {
|
|
23
|
+
return legacyDir;
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
return newDir;
|
|
27
|
+
}
|
|
28
|
+
var EXE_AI_DIR, DB_PATH, MODELS_DIR, CONFIG_PATH, LEGACY_LANCE_PATH, CURRENT_CONFIG_VERSION, DEFAULT_CONFIG;
|
|
29
|
+
var init_config = __esm({
|
|
30
|
+
"src/lib/config.ts"() {
|
|
31
|
+
"use strict";
|
|
32
|
+
EXE_AI_DIR = resolveDataDir();
|
|
33
|
+
DB_PATH = path.join(EXE_AI_DIR, "memories.db");
|
|
34
|
+
MODELS_DIR = path.join(EXE_AI_DIR, "models");
|
|
35
|
+
CONFIG_PATH = path.join(EXE_AI_DIR, "config.json");
|
|
36
|
+
LEGACY_LANCE_PATH = path.join(EXE_AI_DIR, "local.lance");
|
|
37
|
+
CURRENT_CONFIG_VERSION = 1;
|
|
38
|
+
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
|
+
wikiAutoUpdate: true,
|
|
73
|
+
wikiAutoUpdateThreshold: 0.5,
|
|
74
|
+
wikiAutoUpdateCreateNew: true,
|
|
75
|
+
skillLearning: true,
|
|
76
|
+
skillThreshold: 3,
|
|
77
|
+
skillModel: "claude-haiku-4-5-20251001",
|
|
78
|
+
exeHeartbeat: {
|
|
79
|
+
enabled: true,
|
|
80
|
+
intervalSeconds: 60,
|
|
81
|
+
staleInProgressThresholdHours: 2
|
|
82
|
+
},
|
|
83
|
+
sessionLifecycle: {
|
|
84
|
+
idleKillEnabled: true,
|
|
85
|
+
idleKillTicksRequired: 3,
|
|
86
|
+
idleKillIntercomAckWindowMs: 1e4,
|
|
87
|
+
maxAutoInstances: 10
|
|
88
|
+
},
|
|
89
|
+
autoUpdate: {
|
|
90
|
+
checkOnBoot: true,
|
|
91
|
+
autoInstall: false,
|
|
92
|
+
checkIntervalMs: 24 * 60 * 60 * 1e3
|
|
93
|
+
}
|
|
94
|
+
};
|
|
95
|
+
}
|
|
96
|
+
});
|
|
2
97
|
|
|
3
98
|
// src/bin/exe-agent.ts
|
|
4
99
|
import { createInterface } from "readline";
|
|
@@ -821,7 +916,7 @@ async function renderAgentEvents(events, renderer) {
|
|
|
821
916
|
}
|
|
822
917
|
}
|
|
823
918
|
|
|
824
|
-
// src/
|
|
919
|
+
// src/lib/providers/anthropic.ts
|
|
825
920
|
import Anthropic from "@anthropic-ai/sdk";
|
|
826
921
|
var AnthropicProvider = class {
|
|
827
922
|
name;
|
|
@@ -917,7 +1012,7 @@ var AnthropicProvider = class {
|
|
|
917
1012
|
}
|
|
918
1013
|
};
|
|
919
1014
|
|
|
920
|
-
// src/
|
|
1015
|
+
// src/lib/providers/openai-compat.ts
|
|
921
1016
|
import OpenAI from "openai";
|
|
922
1017
|
import { randomUUID } from "crypto";
|
|
923
1018
|
var OpenAICompatProvider = class {
|
|
@@ -1053,7 +1148,7 @@ var OpenAICompatProvider = class {
|
|
|
1053
1148
|
}
|
|
1054
1149
|
};
|
|
1055
1150
|
|
|
1056
|
-
// src/
|
|
1151
|
+
// src/lib/providers/ollama.ts
|
|
1057
1152
|
import { randomUUID as randomUUID2 } from "crypto";
|
|
1058
1153
|
var OllamaProvider = class {
|
|
1059
1154
|
name;
|
|
@@ -1151,98 +1246,12 @@ import { randomUUID as randomUUID3 } from "crypto";
|
|
|
1151
1246
|
import { createClient } from "@libsql/client";
|
|
1152
1247
|
|
|
1153
1248
|
// src/lib/employees.ts
|
|
1249
|
+
init_config();
|
|
1154
1250
|
import { readFile as readFile2, writeFile as writeFile2, mkdir as mkdir2 } from "fs/promises";
|
|
1155
1251
|
import { existsSync as existsSync2, symlinkSync, readlinkSync, readFileSync as readFileSync2, renameSync as renameSync2, unlinkSync, writeFileSync } from "fs";
|
|
1156
1252
|
import { execSync } from "child_process";
|
|
1157
1253
|
import path2 from "path";
|
|
1158
1254
|
import os2 from "os";
|
|
1159
|
-
|
|
1160
|
-
// src/lib/config.ts
|
|
1161
|
-
import { readFile, writeFile, mkdir, chmod } from "fs/promises";
|
|
1162
|
-
import { readFileSync, existsSync, renameSync } from "fs";
|
|
1163
|
-
import path from "path";
|
|
1164
|
-
import os from "os";
|
|
1165
|
-
function resolveDataDir() {
|
|
1166
|
-
if (process.env.EXE_OS_DIR) return process.env.EXE_OS_DIR;
|
|
1167
|
-
if (process.env.EXE_MEM_DIR) return process.env.EXE_MEM_DIR;
|
|
1168
|
-
const newDir = path.join(os.homedir(), ".exe-os");
|
|
1169
|
-
const legacyDir = path.join(os.homedir(), ".exe-mem");
|
|
1170
|
-
if (!existsSync(newDir) && existsSync(legacyDir)) {
|
|
1171
|
-
try {
|
|
1172
|
-
renameSync(legacyDir, newDir);
|
|
1173
|
-
process.stderr.write(`[exe-os] Migrated data directory: ~/.exe-mem \u2192 ~/.exe-os
|
|
1174
|
-
`);
|
|
1175
|
-
} catch {
|
|
1176
|
-
return legacyDir;
|
|
1177
|
-
}
|
|
1178
|
-
}
|
|
1179
|
-
return newDir;
|
|
1180
|
-
}
|
|
1181
|
-
var EXE_AI_DIR = resolveDataDir();
|
|
1182
|
-
var DB_PATH = path.join(EXE_AI_DIR, "memories.db");
|
|
1183
|
-
var MODELS_DIR = path.join(EXE_AI_DIR, "models");
|
|
1184
|
-
var CONFIG_PATH = path.join(EXE_AI_DIR, "config.json");
|
|
1185
|
-
var LEGACY_LANCE_PATH = path.join(EXE_AI_DIR, "local.lance");
|
|
1186
|
-
var CURRENT_CONFIG_VERSION = 1;
|
|
1187
|
-
var DEFAULT_CONFIG = {
|
|
1188
|
-
config_version: CURRENT_CONFIG_VERSION,
|
|
1189
|
-
dbPath: DB_PATH,
|
|
1190
|
-
modelFile: "jina-embeddings-v5-small-q4_k_m.gguf",
|
|
1191
|
-
embeddingDim: 1024,
|
|
1192
|
-
batchSize: 20,
|
|
1193
|
-
flushIntervalMs: 1e4,
|
|
1194
|
-
autoIngestion: true,
|
|
1195
|
-
autoRetrieval: true,
|
|
1196
|
-
searchMode: "hybrid",
|
|
1197
|
-
hookSearchMode: "hybrid",
|
|
1198
|
-
fileGrepEnabled: true,
|
|
1199
|
-
splashEffect: true,
|
|
1200
|
-
consolidationEnabled: true,
|
|
1201
|
-
consolidationIntervalMs: 6 * 60 * 60 * 1e3,
|
|
1202
|
-
consolidationModel: "claude-haiku-4-5-20251001",
|
|
1203
|
-
consolidationMaxCallsPerRun: 20,
|
|
1204
|
-
selfQueryRouter: true,
|
|
1205
|
-
selfQueryModel: "claude-haiku-4-5-20251001",
|
|
1206
|
-
rerankerEnabled: true,
|
|
1207
|
-
scalingRoadmap: {
|
|
1208
|
-
rerankerAutoTrigger: {
|
|
1209
|
-
enabled: true,
|
|
1210
|
-
broadQueryMinCardinality: 5e4,
|
|
1211
|
-
fetchTopK: 150,
|
|
1212
|
-
returnTopK: 5
|
|
1213
|
-
}
|
|
1214
|
-
},
|
|
1215
|
-
graphRagEnabled: true,
|
|
1216
|
-
wikiEnabled: false,
|
|
1217
|
-
wikiUrl: "",
|
|
1218
|
-
wikiApiKey: "",
|
|
1219
|
-
wikiSyncIntervalMs: 30 * 60 * 1e3,
|
|
1220
|
-
wikiWorkspaceMapping: {},
|
|
1221
|
-
wikiAutoUpdate: true,
|
|
1222
|
-
wikiAutoUpdateThreshold: 0.5,
|
|
1223
|
-
wikiAutoUpdateCreateNew: true,
|
|
1224
|
-
skillLearning: true,
|
|
1225
|
-
skillThreshold: 3,
|
|
1226
|
-
skillModel: "claude-haiku-4-5-20251001",
|
|
1227
|
-
exeHeartbeat: {
|
|
1228
|
-
enabled: true,
|
|
1229
|
-
intervalSeconds: 60,
|
|
1230
|
-
staleInProgressThresholdHours: 2
|
|
1231
|
-
},
|
|
1232
|
-
sessionLifecycle: {
|
|
1233
|
-
idleKillEnabled: true,
|
|
1234
|
-
idleKillTicksRequired: 3,
|
|
1235
|
-
idleKillIntercomAckWindowMs: 1e4,
|
|
1236
|
-
maxAutoInstances: 10
|
|
1237
|
-
},
|
|
1238
|
-
autoUpdate: {
|
|
1239
|
-
checkOnBoot: true,
|
|
1240
|
-
autoInstall: false,
|
|
1241
|
-
checkIntervalMs: 24 * 60 * 60 * 1e3
|
|
1242
|
-
}
|
|
1243
|
-
};
|
|
1244
|
-
|
|
1245
|
-
// src/lib/employees.ts
|
|
1246
1255
|
var EMPLOYEES_PATH = path2.join(EXE_AI_DIR, "exe-employees.json");
|
|
1247
1256
|
|
|
1248
1257
|
// src/lib/platform-procedures.ts
|
|
@@ -2171,7 +2180,7 @@ function createProvider(args) {
|
|
|
2171
2180
|
});
|
|
2172
2181
|
case "ollama":
|
|
2173
2182
|
return new OllamaProvider("ollama", {
|
|
2174
|
-
host: args.baseUrl ?? "http://localhost:11434",
|
|
2183
|
+
host: args.baseUrl ?? process.env.OLLAMA_HOST ?? "http://localhost:11434",
|
|
2175
2184
|
defaultModel: args.model
|
|
2176
2185
|
});
|
|
2177
2186
|
default:
|