@askexenow/exe-os 0.9.24 → 0.9.25
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/cli.js +4 -0
- package/dist/bin/exe-doctor.js +21 -4
- package/dist/bin/exe-new-employee.js +4 -0
- package/dist/bin/exe-start.sh +24 -4
- package/dist/bin/install.js +4 -0
- package/dist/bin/setup.js +4 -0
- package/dist/lib/session-wrappers.js +4 -0
- package/dist/mcp/server.js +23 -4
- package/package.json +1 -1
package/dist/bin/cli.js
CHANGED
|
@@ -14724,6 +14724,10 @@ exec "${exeStartDst}" "$0" "$@"
|
|
|
14724
14724
|
writeFileSync18(wrapperPath, wrapperContent);
|
|
14725
14725
|
chmodSync2(wrapperPath, 493);
|
|
14726
14726
|
created++;
|
|
14727
|
+
const codexPath = path32.join(binDir, `${emp.name}${n}-codex`);
|
|
14728
|
+
writeFileSync18(codexPath, wrapperContent);
|
|
14729
|
+
chmodSync2(codexPath, 493);
|
|
14730
|
+
created++;
|
|
14727
14731
|
}
|
|
14728
14732
|
}
|
|
14729
14733
|
const codexLauncherCandidates = [
|
package/dist/bin/exe-doctor.js
CHANGED
|
@@ -3725,12 +3725,13 @@ async function detectConflicts(client, projectFilter, agentFilter2) {
|
|
|
3725
3725
|
|
|
3726
3726
|
// src/bin/exe-doctor.ts
|
|
3727
3727
|
function parseFlags(argv) {
|
|
3728
|
-
const flags = { fix: false, dryRun: false, verbose: false };
|
|
3728
|
+
const flags = { fix: false, dryRun: false, verbose: false, conflicts: false };
|
|
3729
3729
|
for (let i = 0; i < argv.length; i++) {
|
|
3730
3730
|
const arg = argv[i];
|
|
3731
3731
|
if (arg === "--fix") flags.fix = true;
|
|
3732
3732
|
else if (arg === "--dry-run") flags.dryRun = true;
|
|
3733
3733
|
else if (arg === "--verbose") flags.verbose = true;
|
|
3734
|
+
else if (arg === "--conflicts") flags.conflicts = true;
|
|
3734
3735
|
else if (arg === "--agent" && argv[i + 1]) flags.agent = argv[++i];
|
|
3735
3736
|
else if (arg === "--project" && argv[i + 1]) flags.project = argv[++i];
|
|
3736
3737
|
}
|
|
@@ -3911,15 +3912,31 @@ function auditHookHealth() {
|
|
|
3911
3912
|
return { logExists: true, totalLines, errorsLastHour, topPatterns };
|
|
3912
3913
|
}
|
|
3913
3914
|
async function runAudit(client, flags) {
|
|
3914
|
-
const
|
|
3915
|
+
const runConflicts = flags.conflicts || process.env.EXE_AUDIT_CONFLICTS === "1";
|
|
3916
|
+
const [stats, nullVectors, duplicates, bloated, fts, orphanedProjects] = await Promise.all([
|
|
3915
3917
|
auditStats(client, flags),
|
|
3916
3918
|
auditNullVectors(client, flags),
|
|
3917
3919
|
auditDuplicates(client, flags),
|
|
3918
3920
|
auditBloated(client, flags),
|
|
3919
3921
|
auditFts(client),
|
|
3920
|
-
auditOrphanedProjects(client)
|
|
3921
|
-
detectConflicts(client, flags.project, flags.agent)
|
|
3922
|
+
auditOrphanedProjects(client)
|
|
3922
3923
|
]);
|
|
3924
|
+
let conflicts;
|
|
3925
|
+
if (runConflicts) {
|
|
3926
|
+
conflicts = await detectConflicts(client, flags.project, flags.agent);
|
|
3927
|
+
} else {
|
|
3928
|
+
conflicts = {
|
|
3929
|
+
candidateCount: 0,
|
|
3930
|
+
classified: 0,
|
|
3931
|
+
conflicts: 0,
|
|
3932
|
+
superseded: 0,
|
|
3933
|
+
agree: 0,
|
|
3934
|
+
unclassified: 0,
|
|
3935
|
+
pairs: [],
|
|
3936
|
+
skipped: true,
|
|
3937
|
+
skipReason: "Conflict detection skipped (O(n\xB2) on 97K memories). Use --conflicts flag to enable."
|
|
3938
|
+
};
|
|
3939
|
+
}
|
|
3923
3940
|
const duplicateCount = duplicates.reduce((sum, d) => sum + d.delete_ids.length, 0);
|
|
3924
3941
|
const hookHealth = auditHookHealth();
|
|
3925
3942
|
return { stats, nullVectors, duplicates, duplicateCount, bloated, fts, orphanedProjects, conflicts, hookHealth };
|
|
@@ -2136,6 +2136,10 @@ exec "${exeStartDst}" "$0" "$@"
|
|
|
2136
2136
|
writeFileSync(wrapperPath, wrapperContent);
|
|
2137
2137
|
chmodSync(wrapperPath, 493);
|
|
2138
2138
|
created++;
|
|
2139
|
+
const codexPath = path.join(binDir, `${emp.name}${n}-codex`);
|
|
2140
|
+
writeFileSync(codexPath, wrapperContent);
|
|
2141
|
+
chmodSync(codexPath, 493);
|
|
2142
|
+
created++;
|
|
2139
2143
|
}
|
|
2140
2144
|
}
|
|
2141
2145
|
const codexLauncherCandidates = [
|
package/dist/bin/exe-start.sh
CHANGED
|
@@ -18,13 +18,27 @@ ROSTER_PATH="${HOME}/.exe-os/exe-employees.json"
|
|
|
18
18
|
INVOKED_AS="$(basename "${1:-exe-start}")"
|
|
19
19
|
shift # Remove $0 passthrough; remaining args are user's
|
|
20
20
|
|
|
21
|
+
# Detect runtime suffix: {agent}1-codex -> runtime=codex, strip suffix
|
|
22
|
+
RUNTIME="claude"
|
|
23
|
+
CLEAN_NAME="$INVOKED_AS"
|
|
24
|
+
case "$INVOKED_AS" in
|
|
25
|
+
*-codex)
|
|
26
|
+
RUNTIME="codex"
|
|
27
|
+
CLEAN_NAME="$(echo "$INVOKED_AS" | sed 's/-codex$//')"
|
|
28
|
+
;;
|
|
29
|
+
*-opencode)
|
|
30
|
+
RUNTIME="opencode"
|
|
31
|
+
CLEAN_NAME="$(echo "$INVOKED_AS" | sed 's/-opencode$//')"
|
|
32
|
+
;;
|
|
33
|
+
esac
|
|
34
|
+
|
|
21
35
|
# Extract name + number: {agent}1 -> {agent},1
|
|
22
|
-
NAME="$(echo "$
|
|
23
|
-
NUM="$(echo "$
|
|
36
|
+
NAME="$(echo "$CLEAN_NAME" | sed 's/[0-9]*$//')"
|
|
37
|
+
NUM="$(echo "$CLEAN_NAME" | grep -oE '[0-9]+$' || true)"
|
|
24
38
|
|
|
25
39
|
if [ -z "$NAME" ] || [ -z "$NUM" ]; then
|
|
26
40
|
echo "Could not parse name and number from: $INVOKED_AS"
|
|
27
|
-
echo " Expected format: {agent}1, {agent}2, etc."
|
|
41
|
+
echo " Expected format: {agent}1, {agent}2, {agent}1-codex, etc."
|
|
28
42
|
exit 1
|
|
29
43
|
fi
|
|
30
44
|
|
|
@@ -144,7 +158,13 @@ unset TMUX
|
|
|
144
158
|
|
|
145
159
|
# Create session and launch COO with full identity + behaviors + bypass permissions
|
|
146
160
|
tmux new-session -d -s "$SESSION" -c "$PWD"
|
|
147
|
-
|
|
161
|
+
if [ "$RUNTIME" = "codex" ]; then
|
|
162
|
+
tmux send-keys -t "$SESSION" "exe-start-codex --agent $COO_NAME" Enter
|
|
163
|
+
elif [ "$RUNTIME" = "opencode" ]; then
|
|
164
|
+
tmux send-keys -t "$SESSION" "exe-start-opencode --agent $COO_NAME" Enter
|
|
165
|
+
else
|
|
166
|
+
tmux send-keys -t "$SESSION" "exe-launch-agent --agent $COO_NAME" Enter
|
|
167
|
+
fi
|
|
148
168
|
|
|
149
169
|
# Attach user to session (-d detaches other clients to prevent rendering conflict)
|
|
150
170
|
exec tmux attach -d -t "$SESSION"
|
package/dist/bin/install.js
CHANGED
|
@@ -1766,6 +1766,10 @@ exec "${exeStartDst}" "$0" "$@"
|
|
|
1766
1766
|
writeFileSync5(wrapperPath, wrapperContent);
|
|
1767
1767
|
chmodSync2(wrapperPath, 493);
|
|
1768
1768
|
created++;
|
|
1769
|
+
const codexPath = path7.join(binDir, `${emp.name}${n}-codex`);
|
|
1770
|
+
writeFileSync5(codexPath, wrapperContent);
|
|
1771
|
+
chmodSync2(codexPath, 493);
|
|
1772
|
+
created++;
|
|
1769
1773
|
}
|
|
1770
1774
|
}
|
|
1771
1775
|
const codexLauncherCandidates = [
|
package/dist/bin/setup.js
CHANGED
|
@@ -6853,6 +6853,10 @@ exec "${exeStartDst}" "$0" "$@"
|
|
|
6853
6853
|
writeFileSync9(wrapperPath, wrapperContent);
|
|
6854
6854
|
chmodSync2(wrapperPath, 493);
|
|
6855
6855
|
created++;
|
|
6856
|
+
const codexPath = path14.join(binDir, `${emp.name}${n}-codex`);
|
|
6857
|
+
writeFileSync9(codexPath, wrapperContent);
|
|
6858
|
+
chmodSync2(codexPath, 493);
|
|
6859
|
+
created++;
|
|
6856
6860
|
}
|
|
6857
6861
|
}
|
|
6858
6862
|
const codexLauncherCandidates = [
|
|
@@ -61,6 +61,10 @@ exec "${exeStartDst}" "$0" "$@"
|
|
|
61
61
|
writeFileSync(wrapperPath, wrapperContent);
|
|
62
62
|
chmodSync(wrapperPath, 493);
|
|
63
63
|
created++;
|
|
64
|
+
const codexPath = path.join(binDir, `${emp.name}${n}-codex`);
|
|
65
|
+
writeFileSync(codexPath, wrapperContent);
|
|
66
|
+
chmodSync(codexPath, 493);
|
|
67
|
+
created++;
|
|
64
68
|
}
|
|
65
69
|
}
|
|
66
70
|
const codexLauncherCandidates = [
|
package/dist/mcp/server.js
CHANGED
|
@@ -19715,12 +19715,13 @@ async function detectConflicts(client, projectFilter, agentFilter2) {
|
|
|
19715
19715
|
|
|
19716
19716
|
// src/bin/exe-doctor.ts
|
|
19717
19717
|
function parseFlags(argv) {
|
|
19718
|
-
const flags = { fix: false, dryRun: false, verbose: false };
|
|
19718
|
+
const flags = { fix: false, dryRun: false, verbose: false, conflicts: false };
|
|
19719
19719
|
for (let i = 0; i < argv.length; i++) {
|
|
19720
19720
|
const arg = argv[i];
|
|
19721
19721
|
if (arg === "--fix") flags.fix = true;
|
|
19722
19722
|
else if (arg === "--dry-run") flags.dryRun = true;
|
|
19723
19723
|
else if (arg === "--verbose") flags.verbose = true;
|
|
19724
|
+
else if (arg === "--conflicts") flags.conflicts = true;
|
|
19724
19725
|
else if (arg === "--agent" && argv[i + 1]) flags.agent = argv[++i];
|
|
19725
19726
|
else if (arg === "--project" && argv[i + 1]) flags.project = argv[++i];
|
|
19726
19727
|
}
|
|
@@ -19901,15 +19902,31 @@ function auditHookHealth() {
|
|
|
19901
19902
|
return { logExists: true, totalLines, errorsLastHour, topPatterns };
|
|
19902
19903
|
}
|
|
19903
19904
|
async function runAudit(client, flags) {
|
|
19904
|
-
const
|
|
19905
|
+
const runConflicts = flags.conflicts || process.env.EXE_AUDIT_CONFLICTS === "1";
|
|
19906
|
+
const [stats, nullVectors, duplicates, bloated, fts, orphanedProjects] = await Promise.all([
|
|
19905
19907
|
auditStats(client, flags),
|
|
19906
19908
|
auditNullVectors(client, flags),
|
|
19907
19909
|
auditDuplicates(client, flags),
|
|
19908
19910
|
auditBloated(client, flags),
|
|
19909
19911
|
auditFts(client),
|
|
19910
|
-
auditOrphanedProjects(client)
|
|
19911
|
-
detectConflicts(client, flags.project, flags.agent)
|
|
19912
|
+
auditOrphanedProjects(client)
|
|
19912
19913
|
]);
|
|
19914
|
+
let conflicts;
|
|
19915
|
+
if (runConflicts) {
|
|
19916
|
+
conflicts = await detectConflicts(client, flags.project, flags.agent);
|
|
19917
|
+
} else {
|
|
19918
|
+
conflicts = {
|
|
19919
|
+
candidateCount: 0,
|
|
19920
|
+
classified: 0,
|
|
19921
|
+
conflicts: 0,
|
|
19922
|
+
superseded: 0,
|
|
19923
|
+
agree: 0,
|
|
19924
|
+
unclassified: 0,
|
|
19925
|
+
pairs: [],
|
|
19926
|
+
skipped: true,
|
|
19927
|
+
skipReason: "Conflict detection skipped (O(n\xB2) on 97K memories). Use --conflicts flag to enable."
|
|
19928
|
+
};
|
|
19929
|
+
}
|
|
19913
19930
|
const duplicateCount = duplicates.reduce((sum, d) => sum + d.delete_ids.length, 0);
|
|
19914
19931
|
const hookHealth = auditHookHealth();
|
|
19915
19932
|
return { stats, nullVectors, duplicates, duplicateCount, bloated, fts, orphanedProjects, conflicts, hookHealth };
|
|
@@ -20240,6 +20257,8 @@ function registerRunMemoryAudit(server2) {
|
|
|
20240
20257
|
fix: false,
|
|
20241
20258
|
dryRun: false,
|
|
20242
20259
|
verbose: true,
|
|
20260
|
+
conflicts: false,
|
|
20261
|
+
// O(n²) — opt-in only via CLI --conflicts
|
|
20243
20262
|
agent: agent_id,
|
|
20244
20263
|
project: project_name
|
|
20245
20264
|
};
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@askexenow/exe-os",
|
|
3
|
-
"version": "0.9.
|
|
3
|
+
"version": "0.9.25",
|
|
4
4
|
"description": "AI employee operating system — persistent memory, task management, and multi-agent coordination for Claude Code.",
|
|
5
5
|
"license": "SEE LICENSE IN LICENSE",
|
|
6
6
|
"type": "module",
|