@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 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 = [
@@ -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 [stats, nullVectors, duplicates, bloated, fts, orphanedProjects, conflicts] = await Promise.all([
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 = [
@@ -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 "$INVOKED_AS" | sed 's/[0-9]*$//')"
23
- NUM="$(echo "$INVOKED_AS" | grep -oE '[0-9]+$' || true)"
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
- tmux send-keys -t "$SESSION" "exe-launch-agent --agent $COO_NAME" Enter
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"
@@ -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 = [
@@ -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 [stats, nullVectors, duplicates, bloated, fts, orphanedProjects, conflicts] = await Promise.all([
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.24",
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",