@link-assistant/hive-mind 1.56.2 → 1.56.3

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
+ ## 1.56.3
4
+
5
+ ### Patch Changes
6
+
7
+ - 86da037: Support `gpt-5.5` for the Codex tool, prefer it as the default model, accept forward-compatible `gpt-5.5-mini` and `gpt-5.5-nano` aliases, and document per-tool model and reasoning defaults.
8
+
3
9
  ## 1.56.2
4
10
 
5
11
  ### Patch Changes
package/README.hi.md CHANGED
@@ -452,7 +452,7 @@ Aliases:
452
452
  /agent /solve --tool agent के बराबर है
453
453
 
454
454
  Tool alias examples:
455
- /codex https://github.com/owner/repo/issues/123 --model gpt-5.4
455
+ /codex https://github.com/owner/repo/issues/123 --model gpt-5.5
456
456
  /opencode https://github.com/owner/repo/issues/123 --model grok-code-fast-1
457
457
  /agent https://github.com/owner/repo/issues/123 --model nemotron-3-super-free
458
458
 
package/README.md CHANGED
@@ -461,7 +461,7 @@ Aliases:
461
461
  /agent is equivalent to /solve --tool agent
462
462
 
463
463
  Tool alias examples:
464
- /codex https://github.com/owner/repo/issues/123 --model gpt-5.4
464
+ /codex https://github.com/owner/repo/issues/123 --model gpt-5.5
465
465
  /opencode https://github.com/owner/repo/issues/123 --model grok-code-fast-1
466
466
  /agent https://github.com/owner/repo/issues/123 --model nemotron-3-super-free
467
467
 
@@ -477,6 +477,17 @@ Free Models via Kilo Gateway (with --tool agent):
477
477
  /solve https://github.com/owner/repo/issues/123 --tool agent --model kilo/deepseek-r1-free
478
478
  ```
479
479
 
480
+ Current tool defaults in Hive Mind:
481
+
482
+ | Tool | Default model | Default reasoning behavior |
483
+ | ---------- | ----------------------------------------------------------- | ---------------------------------------------------------------------------------------- |
484
+ | `claude` | `sonnet` | No extra thinking is requested unless you pass `--think` or `--thinking-budget` |
485
+ | `codex` | `gpt-5.5` preferred, with runtime fallback to local catalog | Codex runs with `reasoning_effort=none` unless you pass `--think` or `--thinking-budget` |
486
+ | `opencode` | `grok-code-fast-1` | No extra thinking prompt is added for the default model |
487
+ | `agent` | `nemotron-3-super-free` | No extra thinking prompt is added for the default model |
488
+
489
+ See [docs/CONFIGURATION.md](./docs/CONFIGURATION.md) for the full per-tool defaults and reasoning mappings.
490
+
480
491
  > **📖 Free Models Guide**: See [docs/FREE_MODELS.md](./docs/FREE_MODELS.md) for comprehensive information about all free models including OpenCode Zen and Kilo Gateway providers.
481
492
 
482
493
  #### `/hive` - Run Hive Orchestration
package/README.ru.md CHANGED
@@ -452,7 +452,7 @@ Aliases:
452
452
  /agent эквивалентна /solve --tool agent
453
453
 
454
454
  Tool alias examples:
455
- /codex https://github.com/owner/repo/issues/123 --model gpt-5.4
455
+ /codex https://github.com/owner/repo/issues/123 --model gpt-5.5
456
456
  /opencode https://github.com/owner/repo/issues/123 --model grok-code-fast-1
457
457
  /agent https://github.com/owner/repo/issues/123 --model nemotron-3-super-free
458
458
 
package/README.zh.md CHANGED
@@ -452,7 +452,7 @@ Aliases:
452
452
  /agent 等同于 /solve --tool agent
453
453
 
454
454
  Tool alias examples:
455
- /codex https://github.com/owner/repo/issues/123 --model gpt-5.4
455
+ /codex https://github.com/owner/repo/issues/123 --model gpt-5.5
456
456
  /opencode https://github.com/owner/repo/issues/123 --model grok-code-fast-1
457
457
  /agent https://github.com/owner/repo/issues/123 --model nemotron-3-super-free
458
458
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@link-assistant/hive-mind",
3
- "version": "1.56.2",
3
+ "version": "1.56.3",
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/codex.lib.mjs CHANGED
@@ -23,6 +23,7 @@ import { createInteractiveHandler } from './interactive-mode.lib.mjs';
23
23
  import { initProgressMonitoring } from './solve.progress-monitoring.lib.mjs';
24
24
  import { getCodexPlaywrightMcpDisableConfigArgs } from './playwright-mcp.lib.mjs';
25
25
  import { fetchModelInfo } from './model-info.lib.mjs';
26
+ import { defaultModels } from './models/index.mjs';
26
27
  import Decimal from 'decimal.js-light';
27
28
 
28
29
  const CODEX_USAGE_FIELD_NAMES = ['input_tokens', 'cached_input_tokens', 'output_tokens', 'cache_write_tokens', 'cache_creation_input_tokens', 'reasoning_tokens', 'input_tokens_details.cached_tokens', 'input_tokens_details.cache_read_tokens', 'input_tokens_details.cache_write_tokens', 'input_tokens_details.cache_creation_tokens', 'input_tokens_details.cache_creation_input_tokens', 'output_tokens_details.reasoning_tokens'];
@@ -408,7 +409,7 @@ export const calculateCodexPricing = async (modelId, tokenUsage) => {
408
409
  };
409
410
 
410
411
  // Function to validate Codex CLI connection
411
- export const validateCodexConnection = async (model = 'gpt-5.4', verbose = false) => {
412
+ export const validateCodexConnection = async (model = defaultModels.codex, verbose = false) => {
412
413
  // Map model alias to full ID
413
414
  const mappedModel = mapModelToId(model);
414
415
 
package/src/hive.mjs CHANGED
@@ -86,7 +86,7 @@ if (isRunningDirectly) {
86
86
  const { validateClaudeConnection } = claudeLib;
87
87
  // Import model validation library
88
88
  const modelValidation = await import('./models/index.mjs');
89
- const { validateAndExitOnInvalidModel, defaultModels } = modelValidation;
89
+ const { validateAndExitOnInvalidModel, defaultModels, resolveRuntimeDefaultModel } = modelValidation;
90
90
  const githubLib = await import('./github.lib.mjs');
91
91
  const { checkGitHubPermissions, fetchAllIssuesWithPagination, fetchProjectIssues, isRateLimitError, batchCheckPullRequestsForIssues, parseGitHubUrl, batchCheckArchivedRepositories } = githubLib;
92
92
  // Import YouTrack-related functions
@@ -458,7 +458,7 @@ if (isRunningDirectly) {
458
458
 
459
459
  const modelExplicitlyProvided = rawArgs.includes('--model') || rawArgs.includes('-m') || rawArgs.includes('--worker-model');
460
460
  if (argv.tool && !modelExplicitlyProvided && defaultModels[argv.tool]) {
461
- argv.model = defaultModels[argv.tool];
461
+ argv.model = await resolveRuntimeDefaultModel(argv.tool);
462
462
  }
463
463
 
464
464
  // Validate model names EARLY (simple string check, always runs)
@@ -12,6 +12,9 @@
12
12
  * @see https://github.com/link-assistant/hive-mind/issues/1473
13
13
  */
14
14
 
15
+ import { execFile } from 'node:child_process';
16
+ import { promisify } from 'node:util';
17
+
15
18
  // Check if use is already defined (when imported from solve.mjs)
16
19
  // If not, fetch it (when running standalone)
17
20
  if (typeof globalThis.use === 'undefined') {
@@ -20,6 +23,8 @@ if (typeof globalThis.use === 'undefined') {
20
23
 
21
24
  import { log } from '../lib.mjs';
22
25
 
26
+ const execFileAsync = promisify(execFile);
27
+
23
28
  // ─── MODEL DATA ──────────────────────────────────────────────────────────────
24
29
 
25
30
  // Claude models (Anthropic API)
@@ -106,9 +111,13 @@ export const opencodeModels = {
106
111
  export const codexModels = {
107
112
  gpt5: 'gpt-5',
108
113
  'gpt-5': 'gpt-5',
114
+ 'gpt-5.5': 'gpt-5.5',
115
+ 'gpt-5.5-mini': 'gpt-5.5-mini',
116
+ 'gpt-5.5-nano': 'gpt-5.5-nano',
109
117
  'gpt-5.4': 'gpt-5.4',
110
118
  'gpt-5.4-mini': 'gpt-5.4-mini',
111
119
  'gpt-5.4-nano': 'gpt-5.4-nano',
120
+ 'gpt-5.2': 'gpt-5.2',
112
121
  'gpt-5.2-codex': 'gpt-5.2-codex',
113
122
  'gpt-5.3-codex': 'gpt-5.3-codex',
114
123
  'gpt-5.3-codex-spark': 'gpt-5.3-codex-spark',
@@ -125,7 +134,7 @@ export const defaultModels = {
125
134
  claude: 'sonnet',
126
135
  agent: 'nemotron-3-super-free', // Issue #1563: changed from qwen3.6-plus-free (free promotion ended) per agent PR #243
127
136
  opencode: 'grok-code-fast-1',
128
- codex: 'gpt-5.4',
137
+ codex: 'gpt-5.5',
129
138
  };
130
139
 
131
140
  // Models that support 1M token context window via [1m] suffix (Issue #1221, Issue #1238, Issue #1329)
@@ -190,9 +199,13 @@ export const OPENCODE_MODELS = {
190
199
  export const CODEX_MODELS = {
191
200
  ...codexModels,
192
201
  'gpt-5': 'gpt-5',
202
+ 'gpt-5.5': 'gpt-5.5',
203
+ 'gpt-5.5-mini': 'gpt-5.5-mini',
204
+ 'gpt-5.5-nano': 'gpt-5.5-nano',
193
205
  'gpt-5.4': 'gpt-5.4',
194
206
  'gpt-5.4-mini': 'gpt-5.4-mini',
195
207
  'gpt-5.4-nano': 'gpt-5.4-nano',
208
+ 'gpt-5.2': 'gpt-5.2',
196
209
  'gpt-5.2-codex': 'gpt-5.2-codex',
197
210
  'gpt-5.3-codex': 'gpt-5.3-codex',
198
211
  'gpt-5.3-codex-spark': 'gpt-5.3-codex-spark',
@@ -249,6 +262,50 @@ export const getDefaultModelForTool = tool => {
249
262
  return defaultModels[tool] || defaultModels.claude;
250
263
  };
251
264
 
265
+ let cachedInstalledCodexModelsPromise = null;
266
+ const CODEX_DEFAULT_FALLBACK_CHAIN = ['gpt-5.4', 'gpt-5.5-mini', 'gpt-5.4-mini', 'gpt-5.3-codex', 'gpt-5.3-codex-spark', 'gpt-5.2', 'gpt-5.2-codex', 'gpt-5.5-nano', 'gpt-5.4-nano'];
267
+
268
+ export const getInstalledCodexModels = async () => {
269
+ if (!cachedInstalledCodexModelsPromise) {
270
+ cachedInstalledCodexModelsPromise = (async () => {
271
+ try {
272
+ const { stdout } = await execFileAsync('codex', ['debug', 'models'], {
273
+ encoding: 'utf8',
274
+ maxBuffer: 10 * 1024 * 1024,
275
+ });
276
+ const parsed = JSON.parse(stdout);
277
+ const modelSlugs = parsed?.models?.map(model => model?.slug).filter(Boolean);
278
+ return Array.isArray(modelSlugs) ? [...new Set(modelSlugs)] : null;
279
+ } catch {
280
+ return null;
281
+ }
282
+ })();
283
+ }
284
+
285
+ return cachedInstalledCodexModelsPromise;
286
+ };
287
+
288
+ export const resolveRuntimeDefaultModel = async (tool, options = {}) => {
289
+ const toolName = (tool || 'claude').toString().toLowerCase();
290
+ const preferredDefault = defaultModels[toolName] || defaultModels.claude;
291
+
292
+ if (toolName !== 'codex') {
293
+ return preferredDefault;
294
+ }
295
+
296
+ const availableCodexModels = options.availableCodexModels === undefined ? await getInstalledCodexModels() : options.availableCodexModels;
297
+
298
+ if (!Array.isArray(availableCodexModels) || availableCodexModels.length === 0) {
299
+ return preferredDefault;
300
+ }
301
+
302
+ if (availableCodexModels.includes(preferredDefault)) {
303
+ return preferredDefault;
304
+ }
305
+
306
+ return CODEX_DEFAULT_FALLBACK_CHAIN.find(model => availableCodexModels.includes(model)) || preferredDefault;
307
+ };
308
+
252
309
  /**
253
310
  * Map model name to full model ID for a specific tool
254
311
  * @param {string} tool - The tool name (claude, agent, opencode, codex)
@@ -318,7 +375,7 @@ export const getValidModelsForTool = tool => {
318
375
  export const primaryModelNames = {
319
376
  claude: ['opus', 'sonnet', 'haiku', 'opusplan'],
320
377
  opencode: ['grok', 'gpt4o'],
321
- codex: ['gpt-5.4', 'gpt-5.4-mini', 'gpt-5.3-codex', 'gpt-5.3-codex-spark', 'gpt-5.2-codex'],
378
+ codex: ['gpt-5.5', 'gpt-5.4', 'gpt-5.4-mini', 'gpt-5.3-codex', 'gpt-5.3-codex-spark'],
322
379
  agent: ['nemotron-3-super-free', 'minimax-m2.5-free', 'big-pickle', 'gpt-5-nano', 'glm-5-free', 'deepseek-r1-free'],
323
380
  };
324
381
 
@@ -8,7 +8,7 @@
8
8
  // This approach was adopted per issue #482 feedback to minimize custom code maintenance
9
9
 
10
10
  import { enhanceErrorMessage, detectMalformedFlags } from './option-suggestions.lib.mjs';
11
- import { defaultModels, buildModelOptionDescription } from './models/index.mjs';
11
+ import { defaultModels, buildModelOptionDescription, resolveRuntimeDefaultModel } from './models/index.mjs';
12
12
  import { validateBranchName } from './solve.branch.lib.mjs';
13
13
 
14
14
  // Re-export for use by telegram-bot.mjs (avoids extra import lines there)
@@ -678,7 +678,7 @@ export const parseArguments = async (yargs, hideBin) => {
678
678
  if (argv.tool && !modelExplicitlyProvided && defaultModels[argv.tool]) {
679
679
  // User did not explicitly provide --model, so use the correct default for the tool
680
680
  // (Issue #1473: centralized in models/index.mjs)
681
- argv.model = defaultModels[argv.tool];
681
+ argv.model = await resolveRuntimeDefaultModel(argv.tool);
682
682
  }
683
683
 
684
684
  // Validate mutual exclusivity of --claude-file and --gitkeep-file