explorbot 0.5.5 → 0.5.6

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/models.json CHANGED
@@ -2,7 +2,8 @@
2
2
  "openrouter": {
3
3
  "model": "openai/gpt-oss-20b:nitro",
4
4
  "visionModel": "openai/gpt-5.6-luna",
5
- "agenticModel": "openai/gpt-5.6-luna"
5
+ "agenticModel": "anthropic/claude-haiku-5.5",
6
+ "decisionModel": "typesafe/jev-latest"
6
7
  },
7
8
  "poolside": {
8
9
  "model": "poolside/laguna-xs-2.1"
@@ -14,13 +15,13 @@
14
15
  },
15
16
  "openai": {
16
17
  "model": "gpt-5-nano",
17
- "visionModel": "gpt-5.6-luna",
18
- "agenticModel": "gpt-5.6-luna"
18
+ "visionModel": "gpt-6-luna",
19
+ "agenticModel": "gpt-6-luna"
19
20
  },
20
21
  "anthropic": {
21
- "model": "claude-haiku-4-5-20251001",
22
- "visionModel": "claude-haiku-4-5-20251001",
23
- "agenticModel": "claude-haiku-4-5-20251001"
22
+ "model": "claude-haiku-5-5",
23
+ "visionModel": "claude-haiku-5-5",
24
+ "agenticModel": "claude-haiku-5-5"
24
25
  },
25
26
  "mistral": {
26
27
  "model": "mistral-small-latest",
package/dist/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "explorbot",
3
- "version": "0.5.5",
3
+ "version": "0.5.6",
4
4
  "description": "CLI app built with React Ink, CodeceptJS, and Playwright",
5
5
  "license": "Elastic-2.0",
6
6
  "type": "module",
@@ -225,7 +225,10 @@ export function modelLines(provider, only) {
225
225
  let selected = roles;
226
226
  if (only)
227
227
  selected = roles.filter(([role]) => only.includes(role));
228
- return selected.map(([role, comment]) => ` // ${comment}\n ${role}: '${provider}/${recommended[role] || '<model-id>'}',`).join('\n');
228
+ const lines = selected.map(([role, comment]) => ` // ${comment}\n ${role}: '${provider}/${recommended[role] || '<model-id>'}',`);
229
+ if (!only && recommended.decisionModel)
230
+ lines.push(` // decision model judging ambiguous outcomes\n decisionModel: { provider: '${provider}', model: '${recommended.decisionModel}' },`);
231
+ return lines.join('\n');
229
232
  }
230
233
  function globalConfigTemplate(provider) {
231
234
  const { envKey } = PROVIDERS[provider];
@@ -44,6 +44,8 @@ export class RecommendedModelsCommand extends BaseCommand {
44
44
  if (!roles[role])
45
45
  models.push([label, chalk.dim('not served, pair with another provider')]);
46
46
  }
47
+ if (roles.decisionModel)
48
+ models.push(['decisionModel (judge)', roles.decisionModel]);
47
49
  lines.push(...renderSection('models', models, 2));
48
50
  const envKey = PROVIDERS[provider]?.envKey;
49
51
  if (!envKey) {
@@ -61,6 +63,8 @@ export class RecommendedModelsCommand extends BaseCommand {
61
63
  env.push([label, `${ROLES[role].env}=${provider}/${roles[role]}`]);
62
64
  label = '';
63
65
  }
66
+ if (roles.decisionModel)
67
+ env.push(['decision', `EXPLORBOT_DECISION_MODEL=${provider}/${roles.decisionModel}`]);
64
68
  lines.push(...renderSection('env variables', env, 2));
65
69
  }
66
70
  const modelVars = ['EXPLORBOT_AI_PROVIDER', ...MODEL_ENV_VARS];
@@ -137,6 +137,10 @@ export class ConfigParser {
137
137
  sourcePath = join(outputRoot, 'explorbot.config.js');
138
138
  log(`Configuration built from EXPLORBOT_* environment variables. Output: ${outputRoot}`);
139
139
  }
140
+ const configuredUrl = loadedConfig?.playwright?.url || loadedConfig?.web?.url || '';
141
+ if (!this.runBase && resolvedPath && !isGlobalConfigPath(resolvedPath) && URL.canParse(configuredUrl)) {
142
+ this.runBase = parseRunBase(configuredUrl);
143
+ }
140
144
  let config = this.resolveConfig(loadedConfig);
141
145
  await resolveConfigModels(config.ai);
142
146
  this.site = null;
@@ -377,6 +381,8 @@ export class ConfigParser {
377
381
  ai.agenticModel = await resolveModel(agenticSpec, 'agenticModel');
378
382
  if (!agenticSpec && recommended.agenticModel)
379
383
  ai.agenticModel = await resolveModel(provider, 'agenticModel');
384
+ if (recommended.decisionModel)
385
+ ai.decisionModel = { provider: provider, model: recommended.decisionModel };
380
386
  const dirs = { knowledge: 'knowledge', experience: 'experience', output: 'output' };
381
387
  if (process.env.EXPLORBOT_OUTPUT)
382
388
  dirs.output = '.';
@@ -39,7 +39,8 @@ export default {
39
39
  ai: {
40
40
  model: 'openrouter/openai/gpt-oss-20b:nitro',
41
41
  visionModel: 'openrouter/openai/gpt-5.6-luna',
42
- agenticModel: 'openrouter/openai/gpt-5.6-luna',
42
+ agenticModel: 'openrouter/anthropic/claude-haiku-5.5',
43
+ decisionModel: { provider: 'openrouter', model: 'typesafe/jev-latest' },
43
44
  },
44
45
  };
45
46
  ```
@@ -56,7 +56,8 @@ export default {
56
56
  ai: {
57
57
  model: openrouter('openai/gpt-oss-20b:nitro'),
58
58
  visionModel: openrouter('openai/gpt-5.6-luna'),
59
- agenticModel: openrouter('openai/gpt-5.6-luna'),
59
+ agenticModel: openrouter('anthropic/claude-haiku-5.5'),
60
+ decisionModel: { provider: 'openrouter', model: 'typesafe/jev-latest' },
60
61
  },
61
62
  };
62
63
  ```
@@ -123,8 +124,8 @@ Set the recommended models in the exported config:
123
124
  export default {
124
125
  ai: {
125
126
  model: openai('gpt-5-nano'),
126
- visionModel: openai('gpt-5.6-luna'),
127
- agenticModel: openai('gpt-5.6-luna'),
127
+ visionModel: openai('gpt-6-luna'),
128
+ agenticModel: openai('gpt-6-luna'),
128
129
  },
129
130
  };
130
131
  ```
@@ -156,9 +157,9 @@ Set the recommended model in the exported config:
156
157
  ```javascript
157
158
  export default {
158
159
  ai: {
159
- model: anthropic('claude-haiku-4-5-20251001'),
160
- visionModel: anthropic('claude-haiku-4-5-20251001'),
161
- agenticModel: anthropic('claude-haiku-4-5-20251001'),
160
+ model: anthropic('claude-haiku-5-5'),
161
+ visionModel: anthropic('claude-haiku-5-5'),
162
+ agenticModel: anthropic('claude-haiku-5-5'),
162
163
  },
163
164
  };
164
165
  ```
@@ -103,7 +103,7 @@ On its own, without a provider, `EXPLORBOT_AI_MODEL` must carry the provider as
103
103
  ```
104
104
  openrouter/openai/gpt-oss-120b:nitro → openrouter, model "openai/gpt-oss-120b:nitro"
105
105
  groq/openai/gpt-oss-20b → groq, model "openai/gpt-oss-20b"
106
- anthropic/claude-haiku-4-5-20251001 → anthropic, model "claude-haiku-4-5-20251001"
106
+ anthropic/claude-haiku-5-5 → anthropic, model "claude-haiku-5-5"
107
107
  ```
108
108
 
109
109
  `EXPLORBOT_VISION_MODEL` and `EXPLORBOT_AGENTIC_MODEL` override those roles the same way — a provider name for its recommendation, or `provider/model-id` to pin one. Mix the forms to take a provider's recommendations and override one role:
package/models.json CHANGED
@@ -2,7 +2,8 @@
2
2
  "openrouter": {
3
3
  "model": "openai/gpt-oss-20b:nitro",
4
4
  "visionModel": "openai/gpt-5.6-luna",
5
- "agenticModel": "openai/gpt-5.6-luna"
5
+ "agenticModel": "anthropic/claude-haiku-5.5",
6
+ "decisionModel": "typesafe/jev-latest"
6
7
  },
7
8
  "poolside": {
8
9
  "model": "poolside/laguna-xs-2.1"
@@ -14,13 +15,13 @@
14
15
  },
15
16
  "openai": {
16
17
  "model": "gpt-5-nano",
17
- "visionModel": "gpt-5.6-luna",
18
- "agenticModel": "gpt-5.6-luna"
18
+ "visionModel": "gpt-6-luna",
19
+ "agenticModel": "gpt-6-luna"
19
20
  },
20
21
  "anthropic": {
21
- "model": "claude-haiku-4-5-20251001",
22
- "visionModel": "claude-haiku-4-5-20251001",
23
- "agenticModel": "claude-haiku-4-5-20251001"
22
+ "model": "claude-haiku-5-5",
23
+ "visionModel": "claude-haiku-5-5",
24
+ "agenticModel": "claude-haiku-5-5"
24
25
  },
25
26
  "mistral": {
26
27
  "model": "mistral-small-latest",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "explorbot",
3
- "version": "0.5.5",
3
+ "version": "0.5.6",
4
4
  "description": "CLI app built with React Ink, CodeceptJS, and Playwright",
5
5
  "license": "Elastic-2.0",
6
6
  "type": "module",
@@ -260,7 +260,9 @@ export function modelLines(provider: string, only?: ModelRole[]): string {
260
260
  let selected = roles;
261
261
  if (only) selected = roles.filter(([role]) => only.includes(role));
262
262
 
263
- return selected.map(([role, comment]) => ` // ${comment}\n ${role}: '${provider}/${recommended[role] || '<model-id>'}',`).join('\n');
263
+ const lines = selected.map(([role, comment]) => ` // ${comment}\n ${role}: '${provider}/${recommended[role] || '<model-id>'}',`);
264
+ if (!only && recommended.decisionModel) lines.push(` // decision model judging ambiguous outcomes\n decisionModel: { provider: '${provider}', model: '${recommended.decisionModel}' },`);
265
+ return lines.join('\n');
264
266
  }
265
267
 
266
268
  function globalConfigTemplate(provider: string): string {
@@ -52,6 +52,7 @@ export class RecommendedModelsCommand extends BaseCommand {
52
52
  if (roles[role]) models.push([label, roles[role]]);
53
53
  if (!roles[role]) models.push([label, chalk.dim('not served, pair with another provider')]);
54
54
  }
55
+ if (roles.decisionModel) models.push(['decisionModel (judge)', roles.decisionModel]);
55
56
  lines.push(...renderSection('models', models, 2));
56
57
 
57
58
  const envKey = PROVIDERS[provider]?.envKey;
@@ -70,6 +71,7 @@ export class RecommendedModelsCommand extends BaseCommand {
70
71
  env.push([label, `${ROLES[role].env}=${provider}/${roles[role]}`]);
71
72
  label = '';
72
73
  }
74
+ if (roles.decisionModel) env.push(['decision', `EXPLORBOT_DECISION_MODEL=${provider}/${roles.decisionModel}`]);
73
75
  lines.push(...renderSection('env variables', env, 2));
74
76
  }
75
77
 
package/src/config.ts CHANGED
@@ -420,6 +420,11 @@ export class ConfigParser {
420
420
  log(`Configuration built from EXPLORBOT_* environment variables. Output: ${outputRoot}`);
421
421
  }
422
422
 
423
+ const configuredUrl = loadedConfig?.playwright?.url || loadedConfig?.web?.url || '';
424
+ if (!this.runBase && resolvedPath && !isGlobalConfigPath(resolvedPath) && URL.canParse(configuredUrl)) {
425
+ this.runBase = parseRunBase(configuredUrl);
426
+ }
427
+
423
428
  let config = this.resolveConfig(loadedConfig as ExplorbotConfig);
424
429
  await resolveConfigModels(config.ai);
425
430
  this.site = null;
@@ -675,6 +680,8 @@ export class ConfigParser {
675
680
  if (agenticSpec) ai.agenticModel = await resolveModel(agenticSpec, 'agenticModel');
676
681
  if (!agenticSpec && recommended.agenticModel) ai.agenticModel = await resolveModel(provider!, 'agenticModel');
677
682
 
683
+ if (recommended.decisionModel) ai.decisionModel = { provider: provider!, model: recommended.decisionModel };
684
+
678
685
  const dirs = { knowledge: 'knowledge', experience: 'experience', output: 'output' };
679
686
  if (process.env.EXPLORBOT_OUTPUT) dirs.output = '.';
680
687