@bahulam/code 0.1.20 → 0.1.21

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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@bahulam/code",
3
- "version": "0.1.20",
3
+ "version": "0.1.21",
4
4
  "description": "Bahulam Code — abundance, in your terminal. CLI-first, reliability-first, sub-agents, 65.6% SWE-bench Verified.",
5
5
  "type": "module",
6
6
  "bin": {
@@ -10,7 +10,7 @@
10
10
  {"value": "us.anthropic.claude-opus-4-6-v1", "label": "Claude Opus 4.6 (Bedrock)", "provider": "anthropic", "inputCost": 15, "outputCost": 75, "context": 200000, "maxOutput": 32000, "supportsTools": true, "supportsReasoning": true, "harnessValidated": false},
11
11
  {"value": "us.anthropic.claude-sonnet-4-6", "label": "Claude Sonnet 4.6 (Bedrock)", "provider": "anthropic", "inputCost": 3, "outputCost": 15, "context": 200000, "maxOutput": 64000, "supportsTools": true, "supportsReasoning": true, "harnessValidated": false},
12
12
  {"value": "us.anthropic.claude-haiku-4-5-20251001-v1:0", "label": "Claude Haiku 4.5 (Bedrock)", "provider": "anthropic", "inputCost": 0.8, "outputCost": 4, "context": 200000, "maxOutput": 8192, "supportsTools": true, "supportsReasoning": false, "harnessValidated": false},
13
- {"value": "google/gemini-2.5-pro", "label": "Gemini 2.5 Pro", "provider": "google", "category": "image", "inputCost": 1.25, "outputCost": 10, "context": 1048576, "maxOutput": 65536, "supportsTools": true, "supportsReasoning": true, "harnessValidated": true, "platformAccessTier": ["pro", "tier_49", "tier_99"]},
13
+ {"value": "google/gemini-2.5-pro", "label": "Gemini 2.5 Pro", "provider": "google", "category": "multimodal", "inputModalities": ["text", "image", "file", "audio", "video"], "outputModalities": ["text"], "inputCost": 1.25, "outputCost": 10, "context": 1048576, "maxOutput": 65536, "supportsTools": true, "supportsReasoning": true, "harnessValidated": true, "platformAccessTier": ["pro", "tier_49", "tier_99"]},
14
14
  {"value": "google/gemini-2.5-flash", "label": "Gemini 2.5 Flash", "provider": "google", "inputCost": 0.15, "outputCost": 0.6, "context": 1048576, "maxOutput": 65535, "supportsTools": true, "supportsReasoning": true, "harnessValidated": true, "platformAccessTier": ["pro", "tier_49", "tier_99"]},
15
15
  {"value": "google/gemini-2.5-flash-lite", "label": "Gemini 2.5 Flash Lite", "provider": "google", "inputCost": 0.075, "outputCost": 0.3, "context": 1048576, "maxOutput": 65535, "supportsTools": true, "supportsReasoning": false, "harnessValidated": true, "platformAccessTier": ["pro", "tier_49", "tier_99"]},
16
16
  {"value": "openai/gpt-4.1", "label": "GPT-4.1", "provider": "openai", "inputCost": 2, "outputCost": 8, "context": 1047576, "maxOutput": 32768, "supportsTools": true, "supportsReasoning": false, "harnessValidated": true, "platformAccessTier": ["pro", "tier_49", "tier_99"]},
@@ -19,7 +19,7 @@
19
19
  {"value": "openai/codex-mini", "label": "Codex Mini", "provider": "openai", "inputCost": 1.5, "outputCost": 6, "context": 200000, "maxOutput": 100000, "supportsTools": true, "supportsReasoning": true, "harnessValidated": false},
20
20
  {"value": "deepseek/deepseek-v4-flash", "label": "DeepSeek V4 Flash", "provider": "deepseek", "inputCost": 0.098, "outputCost": 0.197, "context": 1048576, "maxOutput": 384000, "supportsTools": true, "supportsReasoning": true, "harnessValidated": true, "platformAccessTier": ["pro", "tier_49", "tier_99"]},
21
21
  {"value": "deepseek/deepseek-v4-flash-0731", "label": "DeepSeek V4 Flash (0731)", "provider": "deepseek", "inputCost": 0.098, "outputCost": 0.197, "context": 1310720, "maxOutput": 384000, "supportsTools": true, "supportsReasoning": true, "harnessValidated": true, "cacheProfile": "{\"type\": \"prefix_hash\", \"provider_hint\": \"DeepSeek\"}", "platformAccessTier": ["pro", "tier_49", "tier_99"]},
22
- {"value": "deepseek/deepseek-v4-flash-vision-exp", "label": "DeepSeek V4 Flash Vision Exp", "provider": "deepseek", "category": "image", "inputCost": 0.22, "outputCost": 0.66, "context": 1048576, "maxOutput": 384000, "supportsTools": true, "supportsReasoning": true, "harnessValidated": true, "platformAccessTier": ["free", "pro", "tier_49", "tier_99"]},
22
+ {"value": "deepseek/deepseek-v4-flash-vision-exp", "label": "DeepSeek V4 Flash Vision Exp", "provider": "deepseek", "category": "multimodal", "inputModalities": ["text", "image"], "outputModalities": ["text"], "inputCost": 0.22, "outputCost": 0.66, "context": 1048576, "maxOutput": 384000, "supportsTools": true, "supportsReasoning": true, "harnessValidated": true, "platformAccessTier": ["free", "pro", "tier_49", "tier_99"]},
23
23
  {"value": "deepseek/deepseek-v4-pro", "label": "DeepSeek V4 Pro", "provider": "deepseek", "inputCost": 0.435, "outputCost": 0.87, "context": 1048576, "maxOutput": 384000, "supportsTools": true, "supportsReasoning": true, "harnessValidated": true, "cacheProfile": "{\"type\": \"prefix_hash\", \"provider_hint\": \"DeepSeek\"}", "platformAccessTier": ["pro", "tier_49", "tier_99"]},
24
24
  {"value": "deepseek/deepseek-chat-v3-0324", "label": "DeepSeek V3", "provider": "deepseek", "inputCost": 0.27, "outputCost": 1.1, "context": 163840, "maxOutput": 163840, "supportsTools": true, "supportsReasoning": false, "harnessValidated": false},
25
25
  {"value": "deepseek/deepseek-r1-0528", "label": "DeepSeek R1 0528", "provider": "deepseek", "inputCost": 0.8, "outputCost": 2.4, "context": 163840, "maxOutput": 32768, "supportsTools": true, "supportsReasoning": true, "harnessValidated": false},
@@ -37,6 +37,8 @@ function normalizeSnapshotRow(row) {
37
37
  provider: row.provider || (id.includes('/') ? id.split('/', 1)[0] : 'unknown'),
38
38
  label: row.label || id,
39
39
  category,
40
+ input_modalities: row.inputModalities ?? row.input_modalities ?? null,
41
+ output_modalities: row.outputModalities ?? row.output_modalities ?? null,
40
42
  input_cost_usd_per_m: row.inputCost ?? row.input_cost_usd_per_m ?? null,
41
43
  output_cost_usd_per_m: row.outputCost ?? row.output_cost_usd_per_m ?? null,
42
44
  context_length: row.context ?? row.context_length ?? null,
@@ -1,7 +1,7 @@
1
1
  /**
2
2
  * Interactive per-role model form for /model (PRD-076 W7).
3
3
  *
4
- * ↑↓ picks a role row, ←→ cycles through [backend default] + the curated
4
+ * ↑↓ picks a role row, ←→ cycles through [backend default] + the available
5
5
  * platform catalog for that role, Enter applies to session overrides,
6
6
  * c resets every row to default, Esc cancels. Same raw-stdin overlay
7
7
  * pattern as the resume picker (repl-resume.mjs): pause readline, raw
@@ -35,19 +35,19 @@ function formatTokenLimit(value, label) {
35
35
  return `${Math.round(n)} ${label}`;
36
36
  }
37
37
 
38
- function optionRowsForRole(catalog, row) {
39
- const curated = (catalog || []).filter(m => m?.harness_validated && m?.id);
38
+ export function optionRowsForRole(catalog, row) {
39
+ const available = (catalog || []).filter(m => m?.id);
40
40
  const group = String(row?.optionGroup || 'text').toLowerCase();
41
41
  if (group === 'image_analysis') {
42
- return curated.filter(m => (
42
+ return available.filter(m => (
43
43
  ['image', 'multimodal'].includes(modelCategory(m))
44
44
  && !isImageGenerationModel(m)
45
45
  ));
46
46
  }
47
47
  if (group === 'image_generation') {
48
- return curated.filter(m => modelCategory(m) === 'image' && isImageGenerationModel(m));
48
+ return available.filter(m => modelCategory(m) === 'image' && isImageGenerationModel(m));
49
49
  }
50
- return curated.filter(m => ['text', 'chat'].includes(modelCategory(m)));
50
+ return available.filter(m => ['text', 'chat', 'multimodal'].includes(modelCategory(m)));
51
51
  }
52
52
 
53
53
  /**
@@ -63,11 +63,11 @@ export async function pickModelOverridesForm({ rl, roles, catalog, fallbackIds,
63
63
  if (!process.stdin.isTTY) return null;
64
64
  if (rl) rl.pause();
65
65
 
66
- const catalogRows = (catalog || []).filter(m => m?.harness_validated && m?.id);
66
+ const catalogRows = (catalog || []).filter(m => m?.id);
67
67
  const usingFallback = catalogRows.length === 0;
68
68
  const byId = new Map(catalogRows.map(m => [m.id, m]));
69
69
 
70
- // Per-row option list; a current override that isn't in the curated list
70
+ // Per-row option list; a current override that isn't in the catalog list
71
71
  // is appended so it stays visible and selectable.
72
72
  const rows = roles.map(r => {
73
73
  const optionIds = usingFallback
@@ -99,9 +99,7 @@ export async function pickModelOverridesForm({ rl, roles, catalog, fallbackIds,
99
99
  }
100
100
  const meta = byId.get(value);
101
101
  const badge = meta ? creditBadge(meta) : '';
102
- // Only flag uncurated picks when a curated catalog actually loaded
103
- // in fallback mode every option is a known backend model, not a stray.
104
- const flag = meta || usingFallback ? '' : c.yellow(' (uncurated)');
102
+ const flag = meta && meta.harness_validated === false ? c.yellow(' (uncurated)') : '';
105
103
  return `${c.brand(value)}${badge ? ` ${c.dim(badge)}` : ''}${flag}`;
106
104
  };
107
105