@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.
Files changed (103) hide show
  1. package/dist/bin/backfill-conversations.js +746 -595
  2. package/dist/bin/backfill-responses.js +745 -594
  3. package/dist/bin/backfill-vectors.js +312 -226
  4. package/dist/bin/cleanup-stale-review-tasks.js +154 -21
  5. package/dist/bin/cli.js +14678 -12676
  6. package/dist/bin/exe-agent-config.js +242 -0
  7. package/dist/bin/exe-agent.js +100 -91
  8. package/dist/bin/exe-assign.js +1003 -854
  9. package/dist/bin/exe-boot.js +1420 -485
  10. package/dist/bin/exe-call.js +10 -0
  11. package/dist/bin/exe-cloud.js +29 -6
  12. package/dist/bin/exe-dispatch.js +572 -271
  13. package/dist/bin/exe-doctor.js +403 -6
  14. package/dist/bin/exe-export-behaviors.js +175 -72
  15. package/dist/bin/exe-forget.js +102 -3
  16. package/dist/bin/exe-gateway.js +796 -292
  17. package/dist/bin/exe-healthcheck.js +134 -1
  18. package/dist/bin/exe-heartbeat.js +172 -36
  19. package/dist/bin/exe-kill.js +175 -72
  20. package/dist/bin/exe-launch-agent.js +189 -76
  21. package/dist/bin/exe-link.js +927 -82
  22. package/dist/bin/exe-new-employee.js +60 -8
  23. package/dist/bin/exe-pending-messages.js +151 -19
  24. package/dist/bin/exe-pending-notifications.js +97 -2
  25. package/dist/bin/exe-pending-reviews.js +155 -22
  26. package/dist/bin/exe-rename.js +564 -23
  27. package/dist/bin/exe-review.js +231 -73
  28. package/dist/bin/exe-search.js +995 -228
  29. package/dist/bin/exe-session-cleanup.js +4930 -1664
  30. package/dist/bin/exe-settings.js +20 -5
  31. package/dist/bin/exe-start-codex.js +2598 -0
  32. package/dist/bin/exe-start.sh +15 -3
  33. package/dist/bin/exe-status.js +154 -21
  34. package/dist/bin/exe-team.js +97 -2
  35. package/dist/bin/git-sweep.js +1180 -363
  36. package/dist/bin/graph-backfill.js +175 -72
  37. package/dist/bin/graph-export.js +175 -72
  38. package/dist/bin/install.js +60 -7
  39. package/dist/bin/list-providers.js +1 -0
  40. package/dist/bin/scan-tasks.js +1185 -367
  41. package/dist/bin/setup.js +914 -270
  42. package/dist/bin/shard-migrate.js +175 -72
  43. package/dist/bin/update.js +1 -0
  44. package/dist/bin/wiki-sync.js +175 -72
  45. package/dist/gateway/index.js +792 -285
  46. package/dist/hooks/bug-report-worker.js +445 -135
  47. package/dist/hooks/commit-complete.js +1178 -361
  48. package/dist/hooks/error-recall.js +994 -228
  49. package/dist/hooks/ingest-worker.js +1799 -1234
  50. package/dist/hooks/ingest.js +3 -0
  51. package/dist/hooks/instructions-loaded.js +707 -97
  52. package/dist/hooks/notification.js +699 -89
  53. package/dist/hooks/post-compact.js +757 -109
  54. package/dist/hooks/pre-compact.js +1061 -244
  55. package/dist/hooks/pre-tool-use.js +787 -130
  56. package/dist/hooks/prompt-ingest-worker.js +242 -101
  57. package/dist/hooks/prompt-submit.js +1121 -299
  58. package/dist/hooks/response-ingest-worker.js +242 -101
  59. package/dist/hooks/session-end.js +4063 -397
  60. package/dist/hooks/session-start.js +1071 -254
  61. package/dist/hooks/stop.js +768 -120
  62. package/dist/hooks/subagent-stop.js +757 -109
  63. package/dist/hooks/summary-worker.js +1706 -1011
  64. package/dist/index.js +1821 -1098
  65. package/dist/lib/agent-config.js +167 -0
  66. package/dist/lib/cloud-sync.js +932 -88
  67. package/dist/lib/consolidation.js +2 -1
  68. package/dist/lib/database.js +642 -87
  69. package/dist/lib/db-daemon-client.js +503 -0
  70. package/dist/lib/device-registry.js +547 -7
  71. package/dist/lib/embedder.js +14 -28
  72. package/dist/lib/employee-templates.js +84 -74
  73. package/dist/lib/employees.js +9 -0
  74. package/dist/lib/exe-daemon-client.js +16 -29
  75. package/dist/lib/exe-daemon.js +2733 -1575
  76. package/dist/lib/hybrid-search.js +995 -228
  77. package/dist/lib/identity.js +87 -67
  78. package/dist/lib/keychain.js +9 -1
  79. package/dist/lib/messaging.js +103 -40
  80. package/dist/lib/reminders.js +91 -74
  81. package/dist/lib/runtime-table.js +16 -0
  82. package/dist/lib/schedules.js +96 -2
  83. package/dist/lib/session-wrappers.js +22 -0
  84. package/dist/lib/skill-learning.js +103 -85
  85. package/dist/lib/store.js +234 -73
  86. package/dist/lib/tasks.js +348 -134
  87. package/dist/lib/tmux-routing.js +422 -208
  88. package/dist/lib/token-spend.js +273 -0
  89. package/dist/lib/ws-client.js +11 -0
  90. package/dist/mcp/server.js +5742 -696
  91. package/dist/mcp/tools/complete-reminder.js +94 -77
  92. package/dist/mcp/tools/create-reminder.js +94 -77
  93. package/dist/mcp/tools/create-task.js +375 -152
  94. package/dist/mcp/tools/deactivate-behavior.js +95 -77
  95. package/dist/mcp/tools/list-reminders.js +94 -77
  96. package/dist/mcp/tools/list-tasks.js +99 -31
  97. package/dist/mcp/tools/send-message.js +108 -45
  98. package/dist/mcp/tools/update-task.js +162 -77
  99. package/dist/runtime/index.js +1075 -258
  100. package/dist/tui/App.js +1333 -506
  101. package/package.json +6 -1
  102. package/src/commands/exe/agent-config.md +27 -0
  103. 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();
@@ -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/gateway/providers/anthropic.ts
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/gateway/providers/openai-compat.ts
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/gateway/providers/ollama.ts
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: