@link-assistant/hive-mind 2.9.0 → 2.9.1

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/CHANGELOG.md CHANGED
@@ -1,5 +1,11 @@
1
1
  # @link-assistant/hive-mind
2
2
 
3
+ ## 2.9.1
4
+
5
+ ### Patch Changes
6
+
7
+ - 3e48cb3: Resume Codex sessions after transient high-demand failures and preserve uncommitted work before uploading failure logs.
8
+
3
9
  ## 2.9.0
4
10
 
5
11
  ### Minor Changes
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@link-assistant/hive-mind",
3
- "version": "2.9.0",
3
+ "version": "2.9.1",
4
4
  "description": "AI-powered issue solver and hive mind for collaborative problem solving",
5
5
  "main": "src/hive.mjs",
6
6
  "type": "module",
package/src/solve.mjs CHANGED
@@ -1117,6 +1117,17 @@ try {
1117
1117
  await log('');
1118
1118
  }
1119
1119
 
1120
+ // Preserve work before remote diagnostics; issue #2101 ended during log upload.
1121
+ try {
1122
+ const { criticalErrorRecovery } = await import('./config.lib.mjs');
1123
+ if (criticalErrorRecovery.autoCommitUncommittedChanges) {
1124
+ const { commitUncommittedChangesOnCriticalError } = await import('./critical-error-commit.lib.mjs');
1125
+ await commitUncommittedChangesOnCriticalError({ tempDir, branchName, $, log, reason: toolFailureMessage });
1126
+ }
1127
+ } catch (preserveError) {
1128
+ await log(` ⚠️ Could not auto-commit before failure exit: ${preserveError.message}`, { verbose: true });
1129
+ }
1130
+
1120
1131
  // Attach failure logs before exiting (Issues #1212, #1462: fall back to issue if no PR)
1121
1132
  const hasPR = global.createdPR && global.createdPR.number;
1122
1133
  const hasIssue = global.issueNumber;
@@ -1167,19 +1178,6 @@ try {
1167
1178
  }
1168
1179
  }
1169
1180
 
1170
- // Issue #1834 (PR #1835 feedback): "on all critical errors we auto commit uncommitted changes by
1171
- // default." A failed session exits here before the normal auto-commit chokepoint below, so commit
1172
- // + push any work first. On by default; disable via HIVE_MIND_AUTO_COMMIT_ON_CRITICAL_ERROR=false.
1173
- try {
1174
- const { criticalErrorRecovery } = await import('./config.lib.mjs');
1175
- if (criticalErrorRecovery.autoCommitUncommittedChanges) {
1176
- const { commitUncommittedChangesOnCriticalError } = await import('./critical-error-commit.lib.mjs');
1177
- await commitUncommittedChangesOnCriticalError({ tempDir, branchName, $, log, reason: toolFailureMessage });
1178
- }
1179
- } catch (preserveError) {
1180
- await log(` ⚠️ Could not auto-commit before failure exit: ${preserveError.message}`, { verbose: true });
1181
- }
1182
-
1183
1181
  await safeExit(1, toolFailureMessage);
1184
1182
  }
1185
1183
 
@@ -47,7 +47,11 @@ export const classifyRetryableError = value => {
47
47
  // overloaded API anyway. Claude Code already exposes its own per-request fallback
48
48
  // via `--fallback-model` (wired in claude.lib.mjs), so we keep `--model` stable and
49
49
  // simply retry. Therefore isCapacity is false → retry with the same model.
50
- if (lower.includes('overloaded') || lower.includes('overloaded_error')) {
50
+ // Issue #2101: Codex may exhaust its internal WebSocket/HTTPS attempts and
51
+ // surface only "We're currently experiencing high demand, which may cause
52
+ // temporary errors." The terminal message omits both the preceding 503 and
53
+ // the backend's concurrency_limit code, so it must be recognized directly.
54
+ if (lower.includes('overloaded') || lower.includes('overloaded_error') || lower.includes('currently experiencing high demand') || lower.includes('too many concurrent requests') || lower.includes('concurrency_limit')) {
51
55
  return { message, isRetryable: true, isCapacity: false, label: 'API overload' };
52
56
  }
53
57