@askexenow/exe-os 0.9.113 → 0.9.115
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/agentic-ontology-backfill.js +36 -12
- package/dist/bin/agentic-reflection-backfill.js +36 -12
- package/dist/bin/agentic-semantic-label.js +36 -12
- package/dist/bin/backfill-conversations.js +36 -12
- package/dist/bin/backfill-responses.js +36 -12
- package/dist/bin/backfill-vectors.js +36 -12
- package/dist/bin/bulk-sync-postgres.js +36 -12
- package/dist/bin/cleanup-stale-review-tasks.js +470 -113
- package/dist/bin/cli.js +413 -62
- package/dist/bin/exe-agent.js +27 -0
- package/dist/bin/exe-assign.js +36 -12
- package/dist/bin/exe-boot.js +246 -54
- package/dist/bin/exe-call.js +8 -0
- package/dist/bin/exe-cloud.js +47 -12
- package/dist/bin/exe-dispatch.js +348 -53
- package/dist/bin/exe-doctor.js +51 -13
- package/dist/bin/exe-export-behaviors.js +37 -12
- package/dist/bin/exe-forget.js +36 -12
- package/dist/bin/exe-gateway.js +348 -53
- package/dist/bin/exe-heartbeat.js +471 -113
- package/dist/bin/exe-kill.js +36 -12
- package/dist/bin/exe-launch-agent.js +117 -18
- package/dist/bin/exe-new-employee.js +9 -1
- package/dist/bin/exe-pending-messages.js +452 -95
- package/dist/bin/exe-pending-notifications.js +452 -95
- package/dist/bin/exe-pending-reviews.js +452 -95
- package/dist/bin/exe-rename.js +36 -12
- package/dist/bin/exe-review.js +36 -12
- package/dist/bin/exe-search.js +37 -12
- package/dist/bin/exe-session-cleanup.js +348 -53
- package/dist/bin/exe-settings.js +12 -0
- package/dist/bin/exe-start-codex.js +46 -13
- package/dist/bin/exe-start-opencode.js +46 -13
- package/dist/bin/exe-status.js +460 -114
- package/dist/bin/exe-support.js +12 -0
- package/dist/bin/exe-team.js +36 -12
- package/dist/bin/git-sweep.js +348 -53
- package/dist/bin/graph-backfill.js +36 -12
- package/dist/bin/graph-export.js +36 -12
- package/dist/bin/install.js +9 -1
- package/dist/bin/intercom-check.js +255 -53
- package/dist/bin/scan-tasks.js +348 -53
- package/dist/bin/setup.js +74 -12
- package/dist/bin/shard-migrate.js +36 -12
- package/dist/gateway/index.js +348 -53
- package/dist/hooks/bug-report-worker.js +348 -53
- package/dist/hooks/codex-stop-task-finalizer.js +308 -37
- package/dist/hooks/commit-complete.js +348 -53
- package/dist/hooks/error-recall.js +37 -12
- package/dist/hooks/ingest.js +363 -54
- package/dist/hooks/instructions-loaded.js +36 -12
- package/dist/hooks/notification.js +36 -12
- package/dist/hooks/post-compact.js +426 -72
- package/dist/hooks/post-tool-combined.js +501 -146
- package/dist/hooks/pre-compact.js +348 -53
- package/dist/hooks/pre-tool-use.js +92 -13
- package/dist/hooks/prompt-submit.js +348 -53
- package/dist/hooks/session-end.js +158 -53
- package/dist/hooks/session-start.js +66 -13
- package/dist/hooks/stop.js +420 -72
- package/dist/hooks/subagent-stop.js +419 -72
- package/dist/hooks/summary-worker.js +442 -121
- package/dist/index.js +375 -53
- package/dist/lib/agent-config.js +8 -0
- package/dist/lib/cloud-sync.js +35 -12
- package/dist/lib/config.js +13 -0
- package/dist/lib/consolidation.js +9 -1
- package/dist/lib/embedder.js +13 -0
- package/dist/lib/employees.js +8 -0
- package/dist/lib/exe-daemon.js +524 -60
- package/dist/lib/hybrid-search.js +37 -12
- package/dist/lib/keychain.js +25 -13
- package/dist/lib/messaging.js +395 -74
- package/dist/lib/schedules.js +36 -12
- package/dist/lib/skill-learning.js +21 -0
- package/dist/lib/store.js +36 -12
- package/dist/lib/tasks.js +324 -41
- package/dist/lib/tmux-routing.js +324 -41
- package/dist/mcp/server.js +374 -54
- package/dist/mcp/tools/create-task.js +324 -41
- package/dist/mcp/tools/list-tasks.js +406 -57
- package/dist/mcp/tools/send-message.js +395 -74
- package/dist/mcp/tools/update-task.js +324 -41
- package/dist/runtime/index.js +375 -53
- package/dist/tui/App.js +377 -55
- package/package.json +1 -1
package/dist/bin/exe-cloud.js
CHANGED
|
@@ -25,7 +25,7 @@ __export(keychain_exports, {
|
|
|
25
25
|
importMnemonic: () => importMnemonic,
|
|
26
26
|
setMasterKey: () => setMasterKey
|
|
27
27
|
});
|
|
28
|
-
import { readFile, writeFile, unlink, mkdir, chmod } from "fs/promises";
|
|
28
|
+
import { readFile, writeFile, unlink, mkdir, chmod, rename, copyFile } from "fs/promises";
|
|
29
29
|
import { existsSync, statSync } from "fs";
|
|
30
30
|
import { execSync } from "child_process";
|
|
31
31
|
import path from "path";
|
|
@@ -60,12 +60,14 @@ function linuxSecretAvailable() {
|
|
|
60
60
|
function isRootOnlyTrustedServerKeyFile(keyPath) {
|
|
61
61
|
if (process.platform !== "linux") return false;
|
|
62
62
|
try {
|
|
63
|
-
const uid = typeof os.userInfo().uid === "number" ? os.userInfo().uid : -1;
|
|
64
63
|
const st = statSync(keyPath);
|
|
65
64
|
if (!st.isFile() || (st.mode & 63) !== 0) return false;
|
|
65
|
+
const uid = typeof os.userInfo().uid === "number" ? os.userInfo().uid : -1;
|
|
66
66
|
if (uid === 0) return true;
|
|
67
67
|
const exeOsDir = process.env.EXE_OS_DIR;
|
|
68
|
-
|
|
68
|
+
if (exeOsDir && path.resolve(keyPath).startsWith(path.resolve(exeOsDir) + path.sep)) return true;
|
|
69
|
+
if (!linuxSecretAvailable()) return true;
|
|
70
|
+
return false;
|
|
69
71
|
} catch {
|
|
70
72
|
return false;
|
|
71
73
|
}
|
|
@@ -215,15 +217,25 @@ async function writeMachineBoundFileFallback(b64) {
|
|
|
215
217
|
await mkdir(dir, { recursive: true });
|
|
216
218
|
const keyPath = getKeyPath();
|
|
217
219
|
const machineKey = deriveMachineKey();
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
220
|
+
const content = machineKey ? encryptWithMachineKey(b64, machineKey) + "\n" : b64 + "\n";
|
|
221
|
+
const result = machineKey ? "encrypted" : "plaintext";
|
|
222
|
+
const tmpPath = keyPath + ".tmp";
|
|
223
|
+
try {
|
|
224
|
+
if (existsSync(keyPath)) {
|
|
225
|
+
await copyFile(keyPath, keyPath + ".bak").catch(() => {
|
|
226
|
+
});
|
|
227
|
+
}
|
|
228
|
+
await writeFile(tmpPath, content, "utf-8");
|
|
229
|
+
await chmod(tmpPath, 384);
|
|
230
|
+
await rename(tmpPath, keyPath);
|
|
231
|
+
} catch (err) {
|
|
232
|
+
try {
|
|
233
|
+
await unlink(tmpPath);
|
|
234
|
+
} catch {
|
|
235
|
+
}
|
|
236
|
+
throw err;
|
|
223
237
|
}
|
|
224
|
-
|
|
225
|
-
await chmod(keyPath, 384);
|
|
226
|
-
return "plaintext";
|
|
238
|
+
return result;
|
|
227
239
|
}
|
|
228
240
|
async function getMasterKey() {
|
|
229
241
|
let nativeValue = macKeychainGet() ?? linuxSecretGet();
|
|
@@ -290,7 +302,7 @@ async function getMasterKey() {
|
|
|
290
302
|
b64Value = content;
|
|
291
303
|
}
|
|
292
304
|
const key = Buffer.from(b64Value, "base64");
|
|
293
|
-
if (
|
|
305
|
+
if (isRootOnlyTrustedServerKeyFile(keyPath)) {
|
|
294
306
|
return key;
|
|
295
307
|
}
|
|
296
308
|
const migrated = macKeychainSet(b64Value) || linuxSecretSet(b64Value);
|
|
@@ -625,6 +637,17 @@ function normalizeOrchestration(raw) {
|
|
|
625
637
|
const userOrg = raw.orchestration ?? {};
|
|
626
638
|
raw.orchestration = { ...defaultOrg, ...userOrg };
|
|
627
639
|
}
|
|
640
|
+
function normalizeCloudEndpoint(raw) {
|
|
641
|
+
const cloud = raw.cloud;
|
|
642
|
+
if (!cloud?.endpoint) return;
|
|
643
|
+
const ep = String(cloud.endpoint);
|
|
644
|
+
if (ep === "https://askexe.com/cloud" || ep === "https://askexe.com/cloud/") {
|
|
645
|
+
cloud.endpoint = "https://cloud.askexe.com";
|
|
646
|
+
process.stderr.write(
|
|
647
|
+
"[config] Auto-migrated cloud endpoint: askexe.com/cloud \u2192 cloud.askexe.com\n"
|
|
648
|
+
);
|
|
649
|
+
}
|
|
650
|
+
}
|
|
628
651
|
async function loadConfig() {
|
|
629
652
|
const dir = process.env.EXE_OS_DIR ?? process.env.EXE_MEM_DIR ?? EXE_AI_DIR;
|
|
630
653
|
await ensurePrivateDir(dir);
|
|
@@ -650,6 +673,7 @@ async function loadConfig() {
|
|
|
650
673
|
normalizeSessionLifecycle(migratedCfg);
|
|
651
674
|
normalizeAutoUpdate(migratedCfg);
|
|
652
675
|
normalizeOrchestration(migratedCfg);
|
|
676
|
+
normalizeCloudEndpoint(migratedCfg);
|
|
653
677
|
const config = { ...DEFAULT_CONFIG, dbPath: path2.join(dir, "memories.db"), ...migratedCfg };
|
|
654
678
|
if (config.dbPath.startsWith("~")) {
|
|
655
679
|
config.dbPath = config.dbPath.replace(/^~/, os2.homedir());
|
|
@@ -4761,6 +4785,7 @@ __export(cloud_sync_exports, {
|
|
|
4761
4785
|
markCloudReuploadRequired: () => markCloudReuploadRequired,
|
|
4762
4786
|
mergeConfig: () => mergeConfig,
|
|
4763
4787
|
mergeRosterFromRemote: () => mergeRosterFromRemote,
|
|
4788
|
+
migrateEndpoint: () => migrateEndpoint,
|
|
4764
4789
|
pushToPostgres: () => pushToPostgres,
|
|
4765
4790
|
recordRosterDeletion: () => recordRosterDeletion
|
|
4766
4791
|
});
|
|
@@ -4931,6 +4956,15 @@ async function fetchWithRetry(url, init) {
|
|
|
4931
4956
|
}
|
|
4932
4957
|
throw lastError;
|
|
4933
4958
|
}
|
|
4959
|
+
function migrateEndpoint(endpoint) {
|
|
4960
|
+
if (endpoint === "https://askexe.com/cloud" || endpoint === "https://askexe.com/cloud/") {
|
|
4961
|
+
process.stderr.write(
|
|
4962
|
+
"[cloud-sync] Auto-migrating endpoint from askexe.com/cloud to cloud.askexe.com (bypasses Cloudflare WAF for datacenter IPs)\n"
|
|
4963
|
+
);
|
|
4964
|
+
return "https://cloud.askexe.com";
|
|
4965
|
+
}
|
|
4966
|
+
return endpoint;
|
|
4967
|
+
}
|
|
4934
4968
|
function assertSecureEndpoint(endpoint) {
|
|
4935
4969
|
if (endpoint.startsWith("https://")) return;
|
|
4936
4970
|
if (endpoint.startsWith("http://")) {
|
|
@@ -5068,6 +5102,7 @@ async function markCloudReuploadRequired(client = getClient()) {
|
|
|
5068
5102
|
await client.execute("INSERT OR REPLACE INTO sync_meta (key, value) VALUES ('cloud_reupload_required', '1')");
|
|
5069
5103
|
}
|
|
5070
5104
|
async function cloudSync(config) {
|
|
5105
|
+
config = { ...config, endpoint: migrateEndpoint(config.endpoint) };
|
|
5071
5106
|
if (!isSyncCryptoInitialized()) {
|
|
5072
5107
|
try {
|
|
5073
5108
|
const { getMasterKey: getMasterKey2 } = await Promise.resolve().then(() => (init_keychain(), keychain_exports));
|