@askexenow/exe-os 0.8.60 → 0.8.61
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/assets/tmux.conf +37 -0
- package/dist/bin/cli.js +151 -111
- package/dist/bin/exe-new-employee.js +862 -114
- package/dist/bin/exe-start.sh +133 -0
- package/dist/bin/install.js +182 -20
- package/dist/hooks/response-ingest-worker.js +3 -1
- package/dist/hooks/summary-worker.js +3 -1
- package/dist/lib/session-wrappers.js +107 -0
- package/package.json +3 -3
package/dist/bin/cli.js
CHANGED
|
@@ -509,12 +509,14 @@ __export(installer_exports, {
|
|
|
509
509
|
mergeHooks: () => mergeHooks,
|
|
510
510
|
registerMcpServer: () => registerMcpServer,
|
|
511
511
|
resolvePackageRoot: () => resolvePackageRoot,
|
|
512
|
-
runInstaller: () => runInstaller
|
|
512
|
+
runInstaller: () => runInstaller,
|
|
513
|
+
setupTmux: () => setupTmux
|
|
513
514
|
});
|
|
514
515
|
import { readFile as readFile3, writeFile as writeFile3, mkdir as mkdir3, readdir } from "fs/promises";
|
|
515
|
-
import { existsSync as existsSync4, readFileSync as readFileSync3 } from "fs";
|
|
516
|
+
import { existsSync as existsSync4, readFileSync as readFileSync3, writeFileSync, copyFileSync, mkdirSync as mkdirSync2 } from "fs";
|
|
516
517
|
import path4 from "path";
|
|
517
518
|
import os3 from "os";
|
|
519
|
+
import { execSync as execSync2 } from "child_process";
|
|
518
520
|
import { fileURLToPath } from "url";
|
|
519
521
|
function resolvePackageRoot() {
|
|
520
522
|
const thisFile = fileURLToPath(import.meta.url);
|
|
@@ -961,6 +963,44 @@ async function runInstaller(homeDir) {
|
|
|
961
963
|
exe-os installed successfully.
|
|
962
964
|
`);
|
|
963
965
|
}
|
|
966
|
+
function setupTmux(home) {
|
|
967
|
+
const homeDir = home ?? os3.homedir();
|
|
968
|
+
const exeDir = path4.join(homeDir, ".exe-os");
|
|
969
|
+
const exeTmuxConf = path4.join(exeDir, "tmux.conf");
|
|
970
|
+
const userTmuxConf = path4.join(homeDir, ".tmux.conf");
|
|
971
|
+
const backupPath = path4.join(homeDir, ".tmux.conf.backup");
|
|
972
|
+
const sourceLine = "source-file ~/.exe-os/tmux.conf";
|
|
973
|
+
const pkgRoot = resolvePackageRoot();
|
|
974
|
+
const assetPath = path4.join(pkgRoot, "dist", "assets", "tmux.conf");
|
|
975
|
+
if (!existsSync4(assetPath)) {
|
|
976
|
+
process.stderr.write(`exe-os: tmux.conf asset not found at ${assetPath} \u2014 skipping tmux setup
|
|
977
|
+
`);
|
|
978
|
+
return;
|
|
979
|
+
}
|
|
980
|
+
mkdirSync2(exeDir, { recursive: true });
|
|
981
|
+
copyFileSync(assetPath, exeTmuxConf);
|
|
982
|
+
if (existsSync4(userTmuxConf)) {
|
|
983
|
+
const existing = readFileSync3(userTmuxConf, "utf8");
|
|
984
|
+
if (!existing.includes(sourceLine)) {
|
|
985
|
+
if (!existsSync4(backupPath)) {
|
|
986
|
+
copyFileSync(userTmuxConf, backupPath);
|
|
987
|
+
process.stderr.write(`exe-os: backed up existing tmux config to ${backupPath}
|
|
988
|
+
`);
|
|
989
|
+
}
|
|
990
|
+
writeFileSync(userTmuxConf, `${sourceLine}
|
|
991
|
+
${existing}`);
|
|
992
|
+
}
|
|
993
|
+
} else {
|
|
994
|
+
writeFileSync(userTmuxConf, `# Exe OS tmux defaults \u2014 remove this line to use your own config
|
|
995
|
+
${sourceLine}
|
|
996
|
+
`);
|
|
997
|
+
}
|
|
998
|
+
try {
|
|
999
|
+
execSync2(`tmux source-file ${exeTmuxConf} 2>/dev/null`);
|
|
1000
|
+
} catch {
|
|
1001
|
+
}
|
|
1002
|
+
process.stderr.write("exe-os: tmux config installed\n");
|
|
1003
|
+
}
|
|
964
1004
|
function summarizeSymlinkResults(results) {
|
|
965
1005
|
if (results.length === 0) return "no employees in roster";
|
|
966
1006
|
const created = results.filter((r) => r.action === "created").length;
|
|
@@ -2149,12 +2189,12 @@ __export(shard_manager_exports, {
|
|
|
2149
2189
|
shardExists: () => shardExists
|
|
2150
2190
|
});
|
|
2151
2191
|
import path6 from "path";
|
|
2152
|
-
import { existsSync as existsSync6, mkdirSync as
|
|
2192
|
+
import { existsSync as existsSync6, mkdirSync as mkdirSync3, readdirSync } from "fs";
|
|
2153
2193
|
import { createClient as createClient2 } from "@libsql/client";
|
|
2154
2194
|
function initShardManager(encryptionKey) {
|
|
2155
2195
|
_encryptionKey = encryptionKey;
|
|
2156
2196
|
if (!existsSync6(SHARDS_DIR)) {
|
|
2157
|
-
|
|
2197
|
+
mkdirSync3(SHARDS_DIR, { recursive: true });
|
|
2158
2198
|
}
|
|
2159
2199
|
_shardingEnabled = true;
|
|
2160
2200
|
}
|
|
@@ -4409,8 +4449,8 @@ __export(exe_rename_exports, {
|
|
|
4409
4449
|
main: () => main,
|
|
4410
4450
|
renameEmployee: () => renameEmployee
|
|
4411
4451
|
});
|
|
4412
|
-
import { readFileSync as readFileSync5, writeFileSync, renameSync as renameSync2, unlinkSync as unlinkSync2, existsSync as existsSync8 } from "fs";
|
|
4413
|
-
import { execSync as
|
|
4452
|
+
import { readFileSync as readFileSync5, writeFileSync as writeFileSync2, renameSync as renameSync2, unlinkSync as unlinkSync2, existsSync as existsSync8 } from "fs";
|
|
4453
|
+
import { execSync as execSync3 } from "child_process";
|
|
4414
4454
|
import path9 from "path";
|
|
4415
4455
|
import { homedir as homedir2 } from "os";
|
|
4416
4456
|
async function renameEmployee(oldName, newName, opts = {}) {
|
|
@@ -4442,7 +4482,7 @@ async function renameEmployee(oldName, newName, opts = {}) {
|
|
|
4442
4482
|
undo: () => {
|
|
4443
4483
|
employee.name = originalName;
|
|
4444
4484
|
employee.systemPrompt = originalPrompt;
|
|
4445
|
-
|
|
4485
|
+
writeFileSync2(rosterPath, JSON.stringify(employees, null, 2) + "\n", "utf-8");
|
|
4446
4486
|
}
|
|
4447
4487
|
});
|
|
4448
4488
|
const oldIdentityPath = path9.join(identityDir, `${oldName}.md`);
|
|
@@ -4454,12 +4494,12 @@ async function renameEmployee(oldName, newName, opts = {}) {
|
|
|
4454
4494
|
`$1${newName}`
|
|
4455
4495
|
);
|
|
4456
4496
|
renameSync2(oldIdentityPath, newIdentityPath);
|
|
4457
|
-
|
|
4497
|
+
writeFileSync2(newIdentityPath, updatedContent, "utf-8");
|
|
4458
4498
|
rollbackStack.push({
|
|
4459
4499
|
description: "restore identity file",
|
|
4460
4500
|
undo: () => {
|
|
4461
4501
|
if (existsSync8(newIdentityPath)) {
|
|
4462
|
-
|
|
4502
|
+
writeFileSync2(newIdentityPath, content, "utf-8");
|
|
4463
4503
|
renameSync2(newIdentityPath, oldIdentityPath);
|
|
4464
4504
|
}
|
|
4465
4505
|
}
|
|
@@ -4475,7 +4515,7 @@ async function renameEmployee(oldName, newName, opts = {}) {
|
|
|
4475
4515
|
undo: () => {
|
|
4476
4516
|
if (existsSync8(newAgentPath)) {
|
|
4477
4517
|
renameSync2(newAgentPath, oldAgentPath);
|
|
4478
|
-
|
|
4518
|
+
writeFileSync2(oldAgentPath, agentContent, "utf-8");
|
|
4479
4519
|
}
|
|
4480
4520
|
}
|
|
4481
4521
|
});
|
|
@@ -4544,7 +4584,7 @@ async function renameEmployee(oldName, newName, opts = {}) {
|
|
|
4544
4584
|
}
|
|
4545
4585
|
function findExeBin2() {
|
|
4546
4586
|
try {
|
|
4547
|
-
return
|
|
4587
|
+
return execSync3(process.platform === "win32" ? "where exe-os" : "which exe-os", { encoding: "utf8" }).trim();
|
|
4548
4588
|
} catch {
|
|
4549
4589
|
return null;
|
|
4550
4590
|
}
|
|
@@ -4778,7 +4818,7 @@ __export(license_exports, {
|
|
|
4778
4818
|
stopLicenseRevalidation: () => stopLicenseRevalidation,
|
|
4779
4819
|
validateLicense: () => validateLicense
|
|
4780
4820
|
});
|
|
4781
|
-
import { readFileSync as readFileSync6, writeFileSync as
|
|
4821
|
+
import { readFileSync as readFileSync6, writeFileSync as writeFileSync3, existsSync as existsSync10, mkdirSync as mkdirSync4 } from "fs";
|
|
4782
4822
|
import { randomUUID as randomUUID3 } from "crypto";
|
|
4783
4823
|
import path11 from "path";
|
|
4784
4824
|
import { jwtVerify, importSPKI } from "jose";
|
|
@@ -4807,8 +4847,8 @@ function loadDeviceId() {
|
|
|
4807
4847
|
} catch {
|
|
4808
4848
|
}
|
|
4809
4849
|
const id = randomUUID3();
|
|
4810
|
-
|
|
4811
|
-
|
|
4850
|
+
mkdirSync4(EXE_AI_DIR, { recursive: true });
|
|
4851
|
+
writeFileSync3(DEVICE_ID_PATH, id, "utf8");
|
|
4812
4852
|
return id;
|
|
4813
4853
|
}
|
|
4814
4854
|
function loadLicense() {
|
|
@@ -4820,8 +4860,8 @@ function loadLicense() {
|
|
|
4820
4860
|
}
|
|
4821
4861
|
}
|
|
4822
4862
|
function saveLicense(apiKey) {
|
|
4823
|
-
|
|
4824
|
-
|
|
4863
|
+
mkdirSync4(EXE_AI_DIR, { recursive: true });
|
|
4864
|
+
writeFileSync3(LICENSE_PATH, apiKey.trim(), { encoding: "utf8", mode: 384 });
|
|
4825
4865
|
}
|
|
4826
4866
|
async function verifyLicenseJwt(token) {
|
|
4827
4867
|
try {
|
|
@@ -4892,7 +4932,7 @@ function getRawCachedPlan() {
|
|
|
4892
4932
|
}
|
|
4893
4933
|
function cacheResponse(token) {
|
|
4894
4934
|
try {
|
|
4895
|
-
|
|
4935
|
+
writeFileSync3(CACHE_PATH, JSON.stringify({ token }), "utf8");
|
|
4896
4936
|
} catch {
|
|
4897
4937
|
}
|
|
4898
4938
|
}
|
|
@@ -5157,13 +5197,13 @@ __export(identity_exports, {
|
|
|
5157
5197
|
listIdentities: () => listIdentities,
|
|
5158
5198
|
updateIdentity: () => updateIdentity
|
|
5159
5199
|
});
|
|
5160
|
-
import { existsSync as existsSync11, mkdirSync as
|
|
5200
|
+
import { existsSync as existsSync11, mkdirSync as mkdirSync5, readFileSync as readFileSync7, writeFileSync as writeFileSync4 } from "fs";
|
|
5161
5201
|
import { readdirSync as readdirSync2 } from "fs";
|
|
5162
5202
|
import path12 from "path";
|
|
5163
5203
|
import { createHash as createHash2 } from "crypto";
|
|
5164
5204
|
function ensureDir() {
|
|
5165
5205
|
if (!existsSync11(IDENTITY_DIR)) {
|
|
5166
|
-
|
|
5206
|
+
mkdirSync5(IDENTITY_DIR, { recursive: true });
|
|
5167
5207
|
}
|
|
5168
5208
|
}
|
|
5169
5209
|
function identityPath(agentId) {
|
|
@@ -5223,7 +5263,7 @@ async function updateIdentity(agentId, content, updatedBy) {
|
|
|
5223
5263
|
ensureDir();
|
|
5224
5264
|
const filePath = identityPath(agentId);
|
|
5225
5265
|
const hash = contentHash(content);
|
|
5226
|
-
|
|
5266
|
+
writeFileSync4(filePath, content, "utf-8");
|
|
5227
5267
|
try {
|
|
5228
5268
|
const client = getClient();
|
|
5229
5269
|
await client.execute({
|
|
@@ -5820,7 +5860,7 @@ __export(setup_wizard_exports, {
|
|
|
5820
5860
|
validateModel: () => validateModel
|
|
5821
5861
|
});
|
|
5822
5862
|
import crypto3 from "crypto";
|
|
5823
|
-
import { existsSync as existsSync12, mkdirSync as
|
|
5863
|
+
import { existsSync as existsSync12, mkdirSync as mkdirSync6, readFileSync as readFileSync8, writeFileSync as writeFileSync5, unlinkSync as unlinkSync4 } from "fs";
|
|
5824
5864
|
import os5 from "os";
|
|
5825
5865
|
import path13 from "path";
|
|
5826
5866
|
import { createInterface as createInterface2 } from "readline";
|
|
@@ -5832,8 +5872,8 @@ function loadSetupState() {
|
|
|
5832
5872
|
}
|
|
5833
5873
|
}
|
|
5834
5874
|
function saveSetupState(state) {
|
|
5835
|
-
|
|
5836
|
-
|
|
5875
|
+
mkdirSync6(path13.dirname(SETUP_STATE_PATH), { recursive: true });
|
|
5876
|
+
writeFileSync5(SETUP_STATE_PATH, JSON.stringify(state, null, 2));
|
|
5837
5877
|
}
|
|
5838
5878
|
function clearSetupState() {
|
|
5839
5879
|
try {
|
|
@@ -6000,7 +6040,7 @@ async function runSetupWizard(opts = {}) {
|
|
|
6000
6040
|
if (!projects[dir]) projects[dir] = {};
|
|
6001
6041
|
projects[dir].hasTrustDialogAccepted = true;
|
|
6002
6042
|
}
|
|
6003
|
-
|
|
6043
|
+
writeFileSync5(claudeJsonPath, JSON.stringify(claudeJson, null, 2) + "\n");
|
|
6004
6044
|
} catch {
|
|
6005
6045
|
}
|
|
6006
6046
|
state.completedSteps.push(5);
|
|
@@ -6052,9 +6092,9 @@ async function runSetupWizard(opts = {}) {
|
|
|
6052
6092
|
const cooIdentityContent = getIdentityTemplate("coo");
|
|
6053
6093
|
if (cooIdentityContent) {
|
|
6054
6094
|
const cooIdPath = identityPath2(cooName);
|
|
6055
|
-
|
|
6095
|
+
mkdirSync6(path13.dirname(cooIdPath), { recursive: true });
|
|
6056
6096
|
const replaced = cooIdentityContent.replace(/agent_id:\s*exe/g, `agent_id: ${cooName}`).replace(/\$\{agent_id\}/g, cooName);
|
|
6057
|
-
|
|
6097
|
+
writeFileSync5(cooIdPath, replaced, "utf-8");
|
|
6058
6098
|
}
|
|
6059
6099
|
registerBinSymlinks2(cooName);
|
|
6060
6100
|
createdEmployees.push({ name: cooName, role: "COO" });
|
|
@@ -6153,9 +6193,9 @@ async function runSetupWizard(opts = {}) {
|
|
|
6153
6193
|
const ctoIdentityContent = getIdentityTemplate("cto");
|
|
6154
6194
|
if (ctoIdentityContent) {
|
|
6155
6195
|
const ctoIdPath = identityPath2(ctoName);
|
|
6156
|
-
|
|
6196
|
+
mkdirSync6(path13.dirname(ctoIdPath), { recursive: true });
|
|
6157
6197
|
const replaced = ctoIdentityContent.replace(/agent_id:\s*\w+/g, `agent_id: ${ctoName}`).replace(/\$\{agent_id\}/g, ctoName);
|
|
6158
|
-
|
|
6198
|
+
writeFileSync5(ctoIdPath, replaced, "utf-8");
|
|
6159
6199
|
}
|
|
6160
6200
|
registerBinSymlinks2(ctoName);
|
|
6161
6201
|
createdEmployees.push({ name: ctoName, role: "CTO" });
|
|
@@ -6181,9 +6221,9 @@ async function runSetupWizard(opts = {}) {
|
|
|
6181
6221
|
const cmoIdentityContent = getIdentityTemplate("cmo");
|
|
6182
6222
|
if (cmoIdentityContent) {
|
|
6183
6223
|
const cmoIdPath = identityPath2(cmoName);
|
|
6184
|
-
|
|
6224
|
+
mkdirSync6(path13.dirname(cmoIdPath), { recursive: true });
|
|
6185
6225
|
const replaced = cmoIdentityContent.replace(/agent_id:\s*\w+/g, `agent_id: ${cmoName}`).replace(/\$\{agent_id\}/g, cmoName);
|
|
6186
|
-
|
|
6226
|
+
writeFileSync5(cmoIdPath, replaced, "utf-8");
|
|
6187
6227
|
}
|
|
6188
6228
|
registerBinSymlinks2(cmoName);
|
|
6189
6229
|
createdEmployees.push({ name: cmoName, role: "CMO" });
|
|
@@ -6245,7 +6285,7 @@ var init_setup_wizard = __esm({
|
|
|
6245
6285
|
});
|
|
6246
6286
|
|
|
6247
6287
|
// src/lib/update-check.ts
|
|
6248
|
-
import { execSync as
|
|
6288
|
+
import { execSync as execSync4 } from "child_process";
|
|
6249
6289
|
import { readFileSync as readFileSync9 } from "fs";
|
|
6250
6290
|
import path14 from "path";
|
|
6251
6291
|
function getLocalVersion(packageRoot) {
|
|
@@ -6255,7 +6295,7 @@ function getLocalVersion(packageRoot) {
|
|
|
6255
6295
|
}
|
|
6256
6296
|
function getRemoteVersion() {
|
|
6257
6297
|
try {
|
|
6258
|
-
const output =
|
|
6298
|
+
const output = execSync4("npm view @askexenow/exe-os version", {
|
|
6259
6299
|
encoding: "utf-8",
|
|
6260
6300
|
timeout: 15e3,
|
|
6261
6301
|
stdio: ["pipe", "pipe", "pipe"]
|
|
@@ -6294,7 +6334,7 @@ __export(update_exports, {
|
|
|
6294
6334
|
getRemoteVersion: () => getRemoteVersion,
|
|
6295
6335
|
runUpdate: () => runUpdate
|
|
6296
6336
|
});
|
|
6297
|
-
import { execSync as
|
|
6337
|
+
import { execSync as execSync5 } from "child_process";
|
|
6298
6338
|
import { createInterface as createInterface3 } from "readline";
|
|
6299
6339
|
async function runUpdate(cliArgs) {
|
|
6300
6340
|
const args2 = cliArgs ?? process.argv.slice(2);
|
|
@@ -6336,14 +6376,14 @@ async function runUpdate(cliArgs) {
|
|
|
6336
6376
|
}
|
|
6337
6377
|
console.log("\n\u{1F9F9} Clearing npm cache...");
|
|
6338
6378
|
try {
|
|
6339
|
-
|
|
6379
|
+
execSync5("npm cache clean --force", { stdio: "pipe" });
|
|
6340
6380
|
console.log(" Done");
|
|
6341
6381
|
} catch {
|
|
6342
6382
|
console.log(" Skipped (non-critical)");
|
|
6343
6383
|
}
|
|
6344
6384
|
console.log("\u{1F4E5} Installing @askexenow/exe-os@latest...");
|
|
6345
6385
|
try {
|
|
6346
|
-
|
|
6386
|
+
execSync5("npm install -g @askexenow/exe-os@latest", {
|
|
6347
6387
|
stdio: ["pipe", "pipe", "pipe"],
|
|
6348
6388
|
timeout: 12e4
|
|
6349
6389
|
});
|
|
@@ -6360,7 +6400,7 @@ async function runUpdate(cliArgs) {
|
|
|
6360
6400
|
newVersion = getLocalVersion(packageRoot);
|
|
6361
6401
|
} catch {
|
|
6362
6402
|
try {
|
|
6363
|
-
const out =
|
|
6403
|
+
const out = execSync5("npm list -g @askexenow/exe-os --depth=0 2>/dev/null", { encoding: "utf8" });
|
|
6364
6404
|
const match = out.match(/@askexenow\/exe-os@(\S+)/);
|
|
6365
6405
|
newVersion = match?.[1] ?? "unknown";
|
|
6366
6406
|
} catch {
|
|
@@ -12803,14 +12843,14 @@ __export(session_registry_exports, {
|
|
|
12803
12843
|
pruneStaleSessions: () => pruneStaleSessions,
|
|
12804
12844
|
registerSession: () => registerSession
|
|
12805
12845
|
});
|
|
12806
|
-
import { readFileSync as readFileSync11, writeFileSync as
|
|
12807
|
-
import { execSync as
|
|
12846
|
+
import { readFileSync as readFileSync11, writeFileSync as writeFileSync6, mkdirSync as mkdirSync7, existsSync as existsSync14 } from "fs";
|
|
12847
|
+
import { execSync as execSync6 } from "child_process";
|
|
12808
12848
|
import path15 from "path";
|
|
12809
12849
|
import os6 from "os";
|
|
12810
12850
|
function registerSession(entry) {
|
|
12811
12851
|
const dir = path15.dirname(REGISTRY_PATH);
|
|
12812
12852
|
if (!existsSync14(dir)) {
|
|
12813
|
-
|
|
12853
|
+
mkdirSync7(dir, { recursive: true });
|
|
12814
12854
|
}
|
|
12815
12855
|
const sessions = listSessions();
|
|
12816
12856
|
const idx = sessions.findIndex((s) => s.windowName === entry.windowName);
|
|
@@ -12819,7 +12859,7 @@ function registerSession(entry) {
|
|
|
12819
12859
|
} else {
|
|
12820
12860
|
sessions.push(entry);
|
|
12821
12861
|
}
|
|
12822
|
-
|
|
12862
|
+
writeFileSync6(REGISTRY_PATH, JSON.stringify(sessions, null, 2));
|
|
12823
12863
|
}
|
|
12824
12864
|
function listSessions() {
|
|
12825
12865
|
try {
|
|
@@ -12834,7 +12874,7 @@ function pruneStaleSessions() {
|
|
|
12834
12874
|
if (sessions.length === 0) return 0;
|
|
12835
12875
|
let liveSessions = [];
|
|
12836
12876
|
try {
|
|
12837
|
-
liveSessions =
|
|
12877
|
+
liveSessions = execSync6("tmux list-sessions -F '#{session_name}' 2>/dev/null", {
|
|
12838
12878
|
encoding: "utf8"
|
|
12839
12879
|
}).trim().split("\n").filter(Boolean);
|
|
12840
12880
|
} catch {
|
|
@@ -12844,7 +12884,7 @@ function pruneStaleSessions() {
|
|
|
12844
12884
|
const alive = sessions.filter((s) => liveSet.has(s.windowName));
|
|
12845
12885
|
const pruned = sessions.length - alive.length;
|
|
12846
12886
|
if (pruned > 0) {
|
|
12847
|
-
|
|
12887
|
+
writeFileSync6(REGISTRY_PATH, JSON.stringify(alive, null, 2));
|
|
12848
12888
|
}
|
|
12849
12889
|
return pruned;
|
|
12850
12890
|
}
|
|
@@ -12857,13 +12897,13 @@ var init_session_registry = __esm({
|
|
|
12857
12897
|
});
|
|
12858
12898
|
|
|
12859
12899
|
// src/lib/session-key.ts
|
|
12860
|
-
import { execSync as
|
|
12900
|
+
import { execSync as execSync7 } from "child_process";
|
|
12861
12901
|
function getSessionKey() {
|
|
12862
12902
|
if (_cached) return _cached;
|
|
12863
12903
|
let pid = process.ppid;
|
|
12864
12904
|
for (let i = 0; i < 10; i++) {
|
|
12865
12905
|
try {
|
|
12866
|
-
const info =
|
|
12906
|
+
const info = execSync7(`ps -p ${pid} -o ppid=,comm=`, {
|
|
12867
12907
|
encoding: "utf8",
|
|
12868
12908
|
timeout: 2e3
|
|
12869
12909
|
}).trim();
|
|
@@ -13007,14 +13047,14 @@ var init_transport = __esm({
|
|
|
13007
13047
|
});
|
|
13008
13048
|
|
|
13009
13049
|
// src/lib/cc-agent-support.ts
|
|
13010
|
-
import { execSync as
|
|
13050
|
+
import { execSync as execSync8 } from "child_process";
|
|
13011
13051
|
function _resetCcAgentSupportCache() {
|
|
13012
13052
|
_cachedSupport = null;
|
|
13013
13053
|
}
|
|
13014
13054
|
function claudeSupportsAgentFlag() {
|
|
13015
13055
|
if (_cachedSupport !== null) return _cachedSupport;
|
|
13016
13056
|
try {
|
|
13017
|
-
const helpOutput =
|
|
13057
|
+
const helpOutput = execSync8("claude --help 2>&1", {
|
|
13018
13058
|
encoding: "utf-8",
|
|
13019
13059
|
timeout: 5e3
|
|
13020
13060
|
});
|
|
@@ -13057,12 +13097,12 @@ var init_provider_table = __esm({
|
|
|
13057
13097
|
});
|
|
13058
13098
|
|
|
13059
13099
|
// src/lib/intercom-queue.ts
|
|
13060
|
-
import { readFileSync as readFileSync12, writeFileSync as
|
|
13100
|
+
import { readFileSync as readFileSync12, writeFileSync as writeFileSync7, renameSync as renameSync4, existsSync as existsSync15, mkdirSync as mkdirSync8 } from "fs";
|
|
13061
13101
|
import path16 from "path";
|
|
13062
13102
|
import os7 from "os";
|
|
13063
13103
|
function ensureDir2() {
|
|
13064
13104
|
const dir = path16.dirname(QUEUE_PATH);
|
|
13065
|
-
if (!existsSync15(dir))
|
|
13105
|
+
if (!existsSync15(dir)) mkdirSync8(dir, { recursive: true });
|
|
13066
13106
|
}
|
|
13067
13107
|
function readQueue() {
|
|
13068
13108
|
try {
|
|
@@ -13075,7 +13115,7 @@ function readQueue() {
|
|
|
13075
13115
|
function writeQueue(queue) {
|
|
13076
13116
|
ensureDir2();
|
|
13077
13117
|
const tmp = `${QUEUE_PATH}.tmp`;
|
|
13078
|
-
|
|
13118
|
+
writeFileSync7(tmp, JSON.stringify(queue, null, 2));
|
|
13079
13119
|
renameSync4(tmp, QUEUE_PATH);
|
|
13080
13120
|
}
|
|
13081
13121
|
function queueIntercom(targetSession, reason) {
|
|
@@ -13287,7 +13327,7 @@ __export(tasks_crud_exports, {
|
|
|
13287
13327
|
});
|
|
13288
13328
|
import crypto6 from "crypto";
|
|
13289
13329
|
import path19 from "path";
|
|
13290
|
-
import { execSync as
|
|
13330
|
+
import { execSync as execSync9 } from "child_process";
|
|
13291
13331
|
import { mkdir as mkdir6, writeFile as writeFile5, appendFile } from "fs/promises";
|
|
13292
13332
|
import { existsSync as existsSync18, readFileSync as readFileSync15 } from "fs";
|
|
13293
13333
|
async function writeCheckpoint(input) {
|
|
@@ -13534,12 +13574,12 @@ function checkStaleCompletion(taskContext, taskCreatedAt) {
|
|
|
13534
13574
|
if (!DELEGATION_KEYWORDS.test(taskContext)) return null;
|
|
13535
13575
|
try {
|
|
13536
13576
|
const since = new Date(taskCreatedAt).toISOString();
|
|
13537
|
-
const branch =
|
|
13577
|
+
const branch = execSync9(
|
|
13538
13578
|
"git rev-parse --abbrev-ref HEAD 2>/dev/null",
|
|
13539
13579
|
{ encoding: "utf8", timeout: 3e3 }
|
|
13540
13580
|
).trim();
|
|
13541
13581
|
const branchArg = branch && branch !== "HEAD" ? branch : "";
|
|
13542
|
-
const commitCount =
|
|
13582
|
+
const commitCount = execSync9(
|
|
13543
13583
|
`git log --oneline --since="${since}" ${branchArg} 2>/dev/null | wc -l`,
|
|
13544
13584
|
{ encoding: "utf8", timeout: 5e3 }
|
|
13545
13585
|
).trim();
|
|
@@ -13993,7 +14033,7 @@ var init_tasks_chain = __esm({
|
|
|
13993
14033
|
});
|
|
13994
14034
|
|
|
13995
14035
|
// src/lib/project-name.ts
|
|
13996
|
-
import { execSync as
|
|
14036
|
+
import { execSync as execSync10 } from "child_process";
|
|
13997
14037
|
import path22 from "path";
|
|
13998
14038
|
function getProjectName(cwd2) {
|
|
13999
14039
|
const dir = cwd2 ?? process.cwd();
|
|
@@ -14001,7 +14041,7 @@ function getProjectName(cwd2) {
|
|
|
14001
14041
|
try {
|
|
14002
14042
|
let repoRoot;
|
|
14003
14043
|
try {
|
|
14004
|
-
const gitCommonDir =
|
|
14044
|
+
const gitCommonDir = execSync10("git rev-parse --path-format=absolute --git-common-dir", {
|
|
14005
14045
|
cwd: dir,
|
|
14006
14046
|
encoding: "utf8",
|
|
14007
14047
|
timeout: 2e3,
|
|
@@ -14009,7 +14049,7 @@ function getProjectName(cwd2) {
|
|
|
14009
14049
|
}).trim();
|
|
14010
14050
|
repoRoot = path22.dirname(gitCommonDir);
|
|
14011
14051
|
} catch {
|
|
14012
|
-
repoRoot =
|
|
14052
|
+
repoRoot = execSync10("git rev-parse --show-toplevel", {
|
|
14013
14053
|
cwd: dir,
|
|
14014
14054
|
encoding: "utf8",
|
|
14015
14055
|
timeout: 2e3,
|
|
@@ -14493,7 +14533,7 @@ __export(tasks_exports, {
|
|
|
14493
14533
|
writeCheckpoint: () => writeCheckpoint
|
|
14494
14534
|
});
|
|
14495
14535
|
import path23 from "path";
|
|
14496
|
-
import { writeFileSync as
|
|
14536
|
+
import { writeFileSync as writeFileSync8, mkdirSync as mkdirSync9, unlinkSync as unlinkSync7 } from "fs";
|
|
14497
14537
|
async function createTask(input) {
|
|
14498
14538
|
const result = await createTaskCore(input);
|
|
14499
14539
|
if (!input.skipDispatch && result.status !== "blocked" && !process.env.VITEST) {
|
|
@@ -14515,8 +14555,8 @@ async function updateTask(input) {
|
|
|
14515
14555
|
const cacheDir = path23.join(EXE_AI_DIR, "session-cache");
|
|
14516
14556
|
const cachePath = path23.join(cacheDir, `current-task-${agent}.json`);
|
|
14517
14557
|
if (input.status === "in_progress") {
|
|
14518
|
-
|
|
14519
|
-
|
|
14558
|
+
mkdirSync9(cacheDir, { recursive: true });
|
|
14559
|
+
writeFileSync8(cachePath, JSON.stringify({ taskId, title: String(row.title) }));
|
|
14520
14560
|
} else if (input.status === "done" || input.status === "blocked" || input.status === "cancelled") {
|
|
14521
14561
|
try {
|
|
14522
14562
|
unlinkSync7(cachePath);
|
|
@@ -14960,8 +15000,8 @@ __export(tmux_routing_exports, {
|
|
|
14960
15000
|
spawnEmployee: () => spawnEmployee,
|
|
14961
15001
|
verifyPaneAtCapacity: () => verifyPaneAtCapacity
|
|
14962
15002
|
});
|
|
14963
|
-
import { execFileSync as execFileSync3, execSync as
|
|
14964
|
-
import { readFileSync as readFileSync16, writeFileSync as
|
|
15003
|
+
import { execFileSync as execFileSync3, execSync as execSync11 } from "child_process";
|
|
15004
|
+
import { readFileSync as readFileSync16, writeFileSync as writeFileSync9, mkdirSync as mkdirSync10, existsSync as existsSync20, appendFileSync } from "fs";
|
|
14965
15005
|
import path24 from "path";
|
|
14966
15006
|
import os9 from "os";
|
|
14967
15007
|
import { fileURLToPath as fileURLToPath4 } from "url";
|
|
@@ -14979,7 +15019,7 @@ function isProcessAlive(pid) {
|
|
|
14979
15019
|
}
|
|
14980
15020
|
function acquireSpawnLock2(sessionName) {
|
|
14981
15021
|
if (!existsSync20(SPAWN_LOCK_DIR)) {
|
|
14982
|
-
|
|
15022
|
+
mkdirSync10(SPAWN_LOCK_DIR, { recursive: true });
|
|
14983
15023
|
}
|
|
14984
15024
|
const lockFile = spawnLockPath(sessionName);
|
|
14985
15025
|
if (existsSync20(lockFile)) {
|
|
@@ -14992,7 +15032,7 @@ function acquireSpawnLock2(sessionName) {
|
|
|
14992
15032
|
} catch {
|
|
14993
15033
|
}
|
|
14994
15034
|
}
|
|
14995
|
-
|
|
15035
|
+
writeFileSync9(lockFile, JSON.stringify({ pid: process.pid, timestamp: Date.now() }));
|
|
14996
15036
|
return true;
|
|
14997
15037
|
}
|
|
14998
15038
|
function releaseSpawnLock2(sessionName) {
|
|
@@ -15075,11 +15115,11 @@ function extractRootExe(name) {
|
|
|
15075
15115
|
}
|
|
15076
15116
|
function registerParentExe(sessionKey, parentExe, dispatchedBy) {
|
|
15077
15117
|
if (!existsSync20(SESSION_CACHE)) {
|
|
15078
|
-
|
|
15118
|
+
mkdirSync10(SESSION_CACHE, { recursive: true });
|
|
15079
15119
|
}
|
|
15080
15120
|
const rootExe = extractRootExe(parentExe) ?? parentExe;
|
|
15081
15121
|
const filePath = path24.join(SESSION_CACHE, `parent-exe-${sessionKey}.json`);
|
|
15082
|
-
|
|
15122
|
+
writeFileSync9(filePath, JSON.stringify({
|
|
15083
15123
|
parentExe: rootExe,
|
|
15084
15124
|
dispatchedBy: dispatchedBy || rootExe,
|
|
15085
15125
|
registeredAt: (/* @__PURE__ */ new Date()).toISOString()
|
|
@@ -15165,8 +15205,8 @@ function readDebounceState() {
|
|
|
15165
15205
|
}
|
|
15166
15206
|
function writeDebounceState(state) {
|
|
15167
15207
|
try {
|
|
15168
|
-
if (!existsSync20(SESSION_CACHE))
|
|
15169
|
-
|
|
15208
|
+
if (!existsSync20(SESSION_CACHE)) mkdirSync10(SESSION_CACHE, { recursive: true });
|
|
15209
|
+
writeFileSync9(DEBOUNCE_FILE, JSON.stringify(state));
|
|
15170
15210
|
} catch {
|
|
15171
15211
|
}
|
|
15172
15212
|
}
|
|
@@ -15358,7 +15398,7 @@ function spawnEmployee(employeeName, exeSession, projectDir, opts) {
|
|
|
15358
15398
|
const logDir = path24.join(os9.homedir(), ".exe-os", "session-logs");
|
|
15359
15399
|
const logFile = path24.join(logDir, `${instanceLabel}-${Date.now()}.log`);
|
|
15360
15400
|
if (!existsSync20(logDir)) {
|
|
15361
|
-
|
|
15401
|
+
mkdirSync10(logDir, { recursive: true });
|
|
15362
15402
|
}
|
|
15363
15403
|
transport.kill(sessionName);
|
|
15364
15404
|
let cleanupSuffix = "";
|
|
@@ -15382,7 +15422,7 @@ function spawnEmployee(employeeName, exeSession, projectDir, opts) {
|
|
|
15382
15422
|
const trustDir = opts?.cwd ?? projectDir;
|
|
15383
15423
|
if (!projects[trustDir]) projects[trustDir] = {};
|
|
15384
15424
|
projects[trustDir].hasTrustDialogAccepted = true;
|
|
15385
|
-
|
|
15425
|
+
writeFileSync9(claudeJsonPath, JSON.stringify(claudeJson, null, 2) + "\n");
|
|
15386
15426
|
} catch {
|
|
15387
15427
|
}
|
|
15388
15428
|
try {
|
|
@@ -15420,8 +15460,8 @@ function spawnEmployee(employeeName, exeSession, projectDir, opts) {
|
|
|
15420
15460
|
if (changed) {
|
|
15421
15461
|
perms.allow = allow;
|
|
15422
15462
|
settings.permissions = perms;
|
|
15423
|
-
|
|
15424
|
-
|
|
15463
|
+
mkdirSync10(projSettingsDir, { recursive: true });
|
|
15464
|
+
writeFileSync9(settingsPath, JSON.stringify(settings, null, 2) + "\n");
|
|
15425
15465
|
}
|
|
15426
15466
|
} catch {
|
|
15427
15467
|
}
|
|
@@ -15465,7 +15505,7 @@ function spawnEmployee(employeeName, exeSession, projectDir, opts) {
|
|
|
15465
15505
|
let sessionContextFlag = "";
|
|
15466
15506
|
try {
|
|
15467
15507
|
const ctxDir = path24.join(os9.homedir(), ".exe-os", "session-cache");
|
|
15468
|
-
|
|
15508
|
+
mkdirSync10(ctxDir, { recursive: true });
|
|
15469
15509
|
const ctxFile = path24.join(ctxDir, `session-context-${sessionName}.md`);
|
|
15470
15510
|
const ctxContent = [
|
|
15471
15511
|
`## Session Context`,
|
|
@@ -15473,7 +15513,7 @@ function spawnEmployee(employeeName, exeSession, projectDir, opts) {
|
|
|
15473
15513
|
`Your parent exe session is ${exeSession}.`,
|
|
15474
15514
|
`Your employees (if any) use the -${exeSession} suffix (e.g., tom-${exeSession}).`
|
|
15475
15515
|
].join("\n");
|
|
15476
|
-
|
|
15516
|
+
writeFileSync9(ctxFile, ctxContent);
|
|
15477
15517
|
sessionContextFlag = ` --append-system-prompt-file ${ctxFile}`;
|
|
15478
15518
|
} catch {
|
|
15479
15519
|
}
|
|
@@ -15512,7 +15552,7 @@ function spawnEmployee(employeeName, exeSession, projectDir, opts) {
|
|
|
15512
15552
|
try {
|
|
15513
15553
|
const mySession = getMySession();
|
|
15514
15554
|
const dispatchInfo = path24.join(SESSION_CACHE, `dispatch-info-${sessionName}.json`);
|
|
15515
|
-
|
|
15555
|
+
writeFileSync9(dispatchInfo, JSON.stringify({
|
|
15516
15556
|
dispatchedBy: mySession,
|
|
15517
15557
|
rootExe: exeSession,
|
|
15518
15558
|
provider: useBinSymlink ? ccProvider : useExeAgent ? opts.provider : "anthropic",
|
|
@@ -15523,7 +15563,7 @@ function spawnEmployee(employeeName, exeSession, projectDir, opts) {
|
|
|
15523
15563
|
let booted = false;
|
|
15524
15564
|
for (let i = 0; i < 30; i++) {
|
|
15525
15565
|
try {
|
|
15526
|
-
|
|
15566
|
+
execSync11("sleep 0.5");
|
|
15527
15567
|
} catch {
|
|
15528
15568
|
}
|
|
15529
15569
|
try {
|
|
@@ -15699,13 +15739,13 @@ __export(tmux_status_exports, {
|
|
|
15699
15739
|
parseActivity: () => parseActivity,
|
|
15700
15740
|
parseContextPercentage: () => parseContextPercentage
|
|
15701
15741
|
});
|
|
15702
|
-
import { execSync as
|
|
15742
|
+
import { execSync as execSync12 } from "child_process";
|
|
15703
15743
|
function inTmux() {
|
|
15704
15744
|
if (process.env.TMUX || process.env.TMUX_PANE) return true;
|
|
15705
15745
|
const term = process.env.TERM ?? "";
|
|
15706
15746
|
if (term.startsWith("tmux") || term.startsWith("screen")) return true;
|
|
15707
15747
|
try {
|
|
15708
|
-
|
|
15748
|
+
execSync12("tmux display-message -p '#{session_name}' 2>/dev/null", {
|
|
15709
15749
|
encoding: "utf8",
|
|
15710
15750
|
timeout: 2e3
|
|
15711
15751
|
});
|
|
@@ -15715,12 +15755,12 @@ function inTmux() {
|
|
|
15715
15755
|
try {
|
|
15716
15756
|
let pid = process.ppid;
|
|
15717
15757
|
for (let depth = 0; depth < 8 && pid > 1; depth++) {
|
|
15718
|
-
const comm =
|
|
15758
|
+
const comm = execSync12(`ps -p ${pid} -o comm= 2>/dev/null`, {
|
|
15719
15759
|
encoding: "utf8",
|
|
15720
15760
|
timeout: 1e3
|
|
15721
15761
|
}).trim();
|
|
15722
15762
|
if (/tmux/.test(comm)) return true;
|
|
15723
|
-
const ppid =
|
|
15763
|
+
const ppid = execSync12(`ps -p ${pid} -o ppid= 2>/dev/null`, {
|
|
15724
15764
|
encoding: "utf8",
|
|
15725
15765
|
timeout: 1e3
|
|
15726
15766
|
}).trim();
|
|
@@ -15733,7 +15773,7 @@ function inTmux() {
|
|
|
15733
15773
|
}
|
|
15734
15774
|
function listTmuxSessions() {
|
|
15735
15775
|
try {
|
|
15736
|
-
const out =
|
|
15776
|
+
const out = execSync12("tmux list-sessions -F '#{session_name}' 2>/dev/null", {
|
|
15737
15777
|
encoding: "utf8",
|
|
15738
15778
|
timeout: 3e3
|
|
15739
15779
|
});
|
|
@@ -15744,7 +15784,7 @@ function listTmuxSessions() {
|
|
|
15744
15784
|
}
|
|
15745
15785
|
function capturePaneLines(windowName, lines = 10) {
|
|
15746
15786
|
try {
|
|
15747
|
-
const out =
|
|
15787
|
+
const out = execSync12(
|
|
15748
15788
|
`tmux capture-pane -t ${JSON.stringify(windowName)} -p 2>/dev/null | tail -${lines}`,
|
|
15749
15789
|
{ encoding: "utf8", timeout: 3e3 }
|
|
15750
15790
|
);
|
|
@@ -15755,7 +15795,7 @@ function capturePaneLines(windowName, lines = 10) {
|
|
|
15755
15795
|
}
|
|
15756
15796
|
function getPaneCwd(windowName) {
|
|
15757
15797
|
try {
|
|
15758
|
-
const out =
|
|
15798
|
+
const out = execSync12(
|
|
15759
15799
|
`tmux display-message -t ${JSON.stringify(windowName)} -p '#{pane_current_path}' 2>/dev/null`,
|
|
15760
15800
|
{ encoding: "utf8", timeout: 3e3 }
|
|
15761
15801
|
);
|
|
@@ -15766,7 +15806,7 @@ function getPaneCwd(windowName) {
|
|
|
15766
15806
|
}
|
|
15767
15807
|
function projectFromPath(dir) {
|
|
15768
15808
|
try {
|
|
15769
|
-
const root =
|
|
15809
|
+
const root = execSync12("git -C " + JSON.stringify(dir) + " rev-parse --show-toplevel 2>/dev/null", {
|
|
15770
15810
|
encoding: "utf8",
|
|
15771
15811
|
timeout: 3e3
|
|
15772
15812
|
}).trim();
|
|
@@ -15835,7 +15875,7 @@ function getEmployeeStatuses(employeeNames) {
|
|
|
15835
15875
|
}
|
|
15836
15876
|
let paneAlive = true;
|
|
15837
15877
|
try {
|
|
15838
|
-
const paneStatus =
|
|
15878
|
+
const paneStatus = execSync12(
|
|
15839
15879
|
`tmux list-panes -t ${JSON.stringify(sessionName)} -F '#{pane_dead}' 2>/dev/null`,
|
|
15840
15880
|
{ encoding: "utf8", timeout: 3e3 }
|
|
15841
15881
|
).trim();
|
|
@@ -16025,8 +16065,8 @@ function Footer() {
|
|
|
16025
16065
|
setSessions(allSessions.length);
|
|
16026
16066
|
if (!currentSession) {
|
|
16027
16067
|
try {
|
|
16028
|
-
const { execSync:
|
|
16029
|
-
const name =
|
|
16068
|
+
const { execSync: execSync14 } = await import("child_process");
|
|
16069
|
+
const name = execSync14("tmux display-message -p '#{session_name}' 2>/dev/null", {
|
|
16030
16070
|
encoding: "utf8",
|
|
16031
16071
|
timeout: 2e3
|
|
16032
16072
|
}).trim();
|
|
@@ -19350,8 +19390,8 @@ function TmuxPane({ sessionName, employeeName, employeeRole, projectName, onDeta
|
|
|
19350
19390
|
}
|
|
19351
19391
|
const capture = () => {
|
|
19352
19392
|
try {
|
|
19353
|
-
const { execSync:
|
|
19354
|
-
const output =
|
|
19393
|
+
const { execSync: execSync14 } = __require("child_process");
|
|
19394
|
+
const output = execSync14(
|
|
19355
19395
|
`tmux capture-pane -t ${JSON.stringify(sessionName)} -p -e 2>/dev/null | tail -${CAPTURE_LINES}`,
|
|
19356
19396
|
{ encoding: "utf8", timeout: 3e3 }
|
|
19357
19397
|
);
|
|
@@ -19375,8 +19415,8 @@ function TmuxPane({ sessionName, employeeName, employeeRole, projectName, onDeta
|
|
|
19375
19415
|
if (key.return) {
|
|
19376
19416
|
if (!demo && inputBuffer.trim()) {
|
|
19377
19417
|
try {
|
|
19378
|
-
const { execSync:
|
|
19379
|
-
|
|
19418
|
+
const { execSync: execSync14 } = __require("child_process");
|
|
19419
|
+
execSync14(
|
|
19380
19420
|
`tmux send-keys -t ${JSON.stringify(sessionName)} ${JSON.stringify(inputBuffer)} Enter`,
|
|
19381
19421
|
{ timeout: 2e3 }
|
|
19382
19422
|
);
|
|
@@ -19384,8 +19424,8 @@ function TmuxPane({ sessionName, employeeName, employeeRole, projectName, onDeta
|
|
|
19384
19424
|
}
|
|
19385
19425
|
} else if (!demo) {
|
|
19386
19426
|
try {
|
|
19387
|
-
const { execSync:
|
|
19388
|
-
|
|
19427
|
+
const { execSync: execSync14 } = __require("child_process");
|
|
19428
|
+
execSync14(`tmux send-keys -t ${JSON.stringify(sessionName)} Enter`, { timeout: 2e3 });
|
|
19389
19429
|
} catch {
|
|
19390
19430
|
}
|
|
19391
19431
|
}
|
|
@@ -20060,12 +20100,12 @@ function SessionsView({
|
|
|
20060
20100
|
return;
|
|
20061
20101
|
}
|
|
20062
20102
|
} else {
|
|
20063
|
-
const { execSync:
|
|
20103
|
+
const { execSync: execSync14 } = await import("child_process");
|
|
20064
20104
|
const dir = projectDir || process.cwd();
|
|
20065
|
-
|
|
20066
|
-
|
|
20105
|
+
execSync14(`tmux new-session -d -s ${JSON.stringify(entry.sessionName)} -c ${JSON.stringify(dir)}`, { timeout: 5e3 });
|
|
20106
|
+
execSync14(`tmux send-keys -t ${JSON.stringify(entry.sessionName)} "claude --dangerously-skip-permissions" Enter`, { timeout: 3e3 });
|
|
20067
20107
|
await new Promise((r) => setTimeout(r, 3e3));
|
|
20068
|
-
|
|
20108
|
+
execSync14(`tmux send-keys -t ${JSON.stringify(entry.sessionName)} "/exe" Enter`, { timeout: 3e3 });
|
|
20069
20109
|
}
|
|
20070
20110
|
const updated = { ...entry, status: "active", activity: "Starting...", attached: false };
|
|
20071
20111
|
setViewingEmployee(updated);
|
|
@@ -20167,7 +20207,7 @@ function SessionsView({
|
|
|
20167
20207
|
const { listSessions: listSessions2 } = await Promise.resolve().then(() => (init_session_registry(), session_registry_exports));
|
|
20168
20208
|
const { listTmuxSessions: listTmuxSessions2, inTmux: inTmux2, capturePaneLines: capturePaneLines2, parseActivity: parseActivity2 } = await Promise.resolve().then(() => (init_tmux_status(), tmux_status_exports));
|
|
20169
20209
|
const { loadEmployees: loadEmployees2 } = await Promise.resolve().then(() => (init_employees(), employees_exports));
|
|
20170
|
-
const { execSync:
|
|
20210
|
+
const { execSync: execSync14 } = await import("child_process");
|
|
20171
20211
|
if (!inTmux2()) {
|
|
20172
20212
|
setTmuxAvailable(false);
|
|
20173
20213
|
setProjects([]);
|
|
@@ -20176,7 +20216,7 @@ function SessionsView({
|
|
|
20176
20216
|
setTmuxAvailable(true);
|
|
20177
20217
|
const attachedMap = /* @__PURE__ */ new Map();
|
|
20178
20218
|
try {
|
|
20179
|
-
const out =
|
|
20219
|
+
const out = execSync14("tmux list-sessions -F '#{session_name}:#{session_attached}' 2>/dev/null", {
|
|
20180
20220
|
encoding: "utf8",
|
|
20181
20221
|
timeout: 3e3
|
|
20182
20222
|
});
|
|
@@ -21126,8 +21166,8 @@ function upsertConversation(conversations, platform, senderId, message) {
|
|
|
21126
21166
|
async function loadGatewayConfig() {
|
|
21127
21167
|
const state = { running: false, port: 3100, adapters: [], agents: [], gatewayUrl: "" };
|
|
21128
21168
|
try {
|
|
21129
|
-
const { execSync:
|
|
21130
|
-
const ps =
|
|
21169
|
+
const { execSync: execSync14 } = await import("child_process");
|
|
21170
|
+
const ps = execSync14("pgrep -f exe-gateway 2>/dev/null", { encoding: "utf8", timeout: 3e3 });
|
|
21131
21171
|
state.running = ps.trim().length > 0;
|
|
21132
21172
|
} catch {
|
|
21133
21173
|
state.running = false;
|
|
@@ -21604,10 +21644,10 @@ var init_Gateway = __esm({
|
|
|
21604
21644
|
});
|
|
21605
21645
|
|
|
21606
21646
|
// src/tui/utils/agent-status.ts
|
|
21607
|
-
import { execSync as
|
|
21647
|
+
import { execSync as execSync13 } from "child_process";
|
|
21608
21648
|
function getAgentStatus(agentId) {
|
|
21609
21649
|
try {
|
|
21610
|
-
const sessions =
|
|
21650
|
+
const sessions = execSync13("tmux list-sessions -F '#{session_name}' 2>/dev/null", {
|
|
21611
21651
|
encoding: "utf8",
|
|
21612
21652
|
timeout: 2e3
|
|
21613
21653
|
}).trim().split("\n");
|
|
@@ -21618,7 +21658,7 @@ function getAgentStatus(agentId) {
|
|
|
21618
21658
|
return /^\d?-/.test(suffix) || /^\d+$/.test(suffix);
|
|
21619
21659
|
});
|
|
21620
21660
|
if (!agentSession) return { label: "offline", color: "gray" };
|
|
21621
|
-
const pane =
|
|
21661
|
+
const pane = execSync13(`tmux capture-pane -t "${agentSession}" -p 2>/dev/null | tail -3`, {
|
|
21622
21662
|
encoding: "utf8",
|
|
21623
21663
|
timeout: 2e3
|
|
21624
21664
|
});
|
|
@@ -22583,8 +22623,8 @@ function SettingsView({ onBack }) {
|
|
|
22583
22623
|
};
|
|
22584
22624
|
});
|
|
22585
22625
|
try {
|
|
22586
|
-
const { execSync:
|
|
22587
|
-
|
|
22626
|
+
const { execSync: execSync14 } = await import("child_process");
|
|
22627
|
+
execSync14("curl -s --max-time 1 http://localhost:11434/api/tags", { timeout: 2e3 });
|
|
22588
22628
|
providerList.push({ name: "Ollama", configured: true, detail: "localhost:11434" });
|
|
22589
22629
|
} catch {
|
|
22590
22630
|
providerList.push({ name: "Ollama", configured: false, detail: "not running" });
|
|
@@ -23231,7 +23271,7 @@ Unhandled rejection: ${reason}
|
|
|
23231
23271
|
});
|
|
23232
23272
|
|
|
23233
23273
|
// src/bin/cli.ts
|
|
23234
|
-
import { existsSync as existsSync21, readFileSync as readFileSync17, writeFileSync as
|
|
23274
|
+
import { existsSync as existsSync21, readFileSync as readFileSync17, writeFileSync as writeFileSync10, readdirSync as readdirSync5, rmSync } from "fs";
|
|
23235
23275
|
import path33 from "path";
|
|
23236
23276
|
import os11 from "os";
|
|
23237
23277
|
var args = process.argv.slice(2);
|
|
@@ -23459,7 +23499,7 @@ async function runClaudeUninstall(flags = []) {
|
|
|
23459
23499
|
permCount = before - settings.permissions.allow.length;
|
|
23460
23500
|
}
|
|
23461
23501
|
if (!dryRun) {
|
|
23462
|
-
|
|
23502
|
+
writeFileSync10(settingsPath, JSON.stringify(settings, null, 2) + "\n");
|
|
23463
23503
|
}
|
|
23464
23504
|
log("\u2713 Removed exe-os hooks from settings.json");
|
|
23465
23505
|
if (permCount > 0) log(`\u2713 Removed ${permCount} MCP permission entries`);
|
|
@@ -23488,7 +23528,7 @@ async function runClaudeUninstall(flags = []) {
|
|
|
23488
23528
|
}
|
|
23489
23529
|
if (removedMcp) {
|
|
23490
23530
|
if (!dryRun) {
|
|
23491
|
-
|
|
23531
|
+
writeFileSync10(claudeJsonPath, JSON.stringify(claudeJson, null, 2) + "\n");
|
|
23492
23532
|
}
|
|
23493
23533
|
log("\u2713 Removed exe-os MCP server from claude.json");
|
|
23494
23534
|
removed++;
|
|
@@ -23524,7 +23564,7 @@ async function runClaudeUninstall(flags = []) {
|
|
|
23524
23564
|
const endIdx = content.indexOf(endMarker);
|
|
23525
23565
|
if (startIdx !== -1 && endIdx !== -1) {
|
|
23526
23566
|
const cleaned = (content.slice(0, startIdx) + content.slice(endIdx + endMarker.length)).replace(/\n{3,}/g, "\n\n").trim() + "\n";
|
|
23527
|
-
if (!dryRun)
|
|
23567
|
+
if (!dryRun) writeFileSync10(claudeMdPath, cleaned);
|
|
23528
23568
|
log("\u2713 Removed orchestration block from CLAUDE.md");
|
|
23529
23569
|
removed++;
|
|
23530
23570
|
}
|
|
@@ -23576,7 +23616,7 @@ async function runClaudeUninstall(flags = []) {
|
|
|
23576
23616
|
if (pSettings.permissions.allow.length < before) changed = true;
|
|
23577
23617
|
}
|
|
23578
23618
|
if (changed && !dryRun) {
|
|
23579
|
-
|
|
23619
|
+
writeFileSync10(projSettings, JSON.stringify(pSettings, null, 2) + "\n");
|
|
23580
23620
|
}
|
|
23581
23621
|
if (changed) projectCount++;
|
|
23582
23622
|
} catch {
|
|
@@ -23590,10 +23630,10 @@ async function runClaudeUninstall(flags = []) {
|
|
|
23590
23630
|
}
|
|
23591
23631
|
}
|
|
23592
23632
|
try {
|
|
23593
|
-
const { execSync:
|
|
23633
|
+
const { execSync: execSync14 } = await import("child_process");
|
|
23594
23634
|
const findExeBin3 = () => {
|
|
23595
23635
|
try {
|
|
23596
|
-
return
|
|
23636
|
+
return execSync14(process.platform === "win32" ? "where exe-os" : "which exe-os", { encoding: "utf8" }).trim();
|
|
23597
23637
|
} catch {
|
|
23598
23638
|
return null;
|
|
23599
23639
|
}
|