devez-vibe 1.9.34 → 1.9.35

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/bin/dvz.exe CHANGED
Binary file
@@ -330,10 +330,40 @@ function catalogEntry(model, defaultResolvedModel) {
330
330
  };
331
331
  }
332
332
 
333
+ function compareVersions(left, right) {
334
+ for (let index = 0; index < Math.max(left.length, right.length); index += 1) {
335
+ const difference = (left[index] ?? 0) - (right[index] ?? 0);
336
+ if (difference) return difference;
337
+ }
338
+ return 0;
339
+ }
340
+
341
+ /** Each family's newest model in CLAUDE_MODEL_ORDER first, then older ones by family and version. */
342
+ function sortClaudeModels(models) {
343
+ const ranked = models.map((model) => {
344
+ const [family = "", version = ""] = compactClaudeModelName(model).toLowerCase().split(" ");
345
+ return { model, family, version: version.match(/\d+/g)?.map(Number) ?? [] };
346
+ });
347
+ const newest = new Map();
348
+ for (const { family, version } of ranked) {
349
+ if (!newest.has(family) || compareVersions(version, newest.get(family)) > 0) newest.set(family, version);
350
+ }
351
+ const tier = (entry) => (compareVersions(entry.version, newest.get(entry.family)) === 0 ? 0 : 1);
352
+ const familyOrder = ({ family }) => {
353
+ const index = CLAUDE_MODEL_ORDER.indexOf(family);
354
+ return index < 0 ? CLAUDE_MODEL_ORDER.length : index;
355
+ };
356
+ return ranked
357
+ .sort((left, right) => tier(left) - tier(right)
358
+ || familyOrder(left) - familyOrder(right)
359
+ || compareVersions(right.version, left.version))
360
+ .map(({ model }) => model);
361
+ }
362
+
333
363
  function claudeCatalogEntries(models, defaultResolvedModel) {
334
- const catalogModels = models.filter((model) => model.value && model.value !== "default"
364
+ const catalogModels = sortClaudeModels(models.filter((model) => model.value && model.value !== "default"
335
365
  && ![model.value, model.resolvedModel]
336
- .some((name) => stripClaudeModel(String(name || "")).startsWith(RETIRED_OPUS_MODEL)));
366
+ .some((name) => stripClaudeModel(String(name || "")).startsWith(RETIRED_OPUS_MODEL))));
337
367
  const entries = catalogModels.map((model) => catalogEntry(model, defaultResolvedModel));
338
368
  const existingIndex = entries.findIndex((entry) =>
339
369
  stripClaudeModel(entry.model) === PREVIOUS_OPUS_MODEL
@@ -401,14 +431,6 @@ async function loadModelCatalog(params) {
401
431
  const defaultResolvedModel = String(
402
432
  models.find((model) => model.value === "default")?.resolvedModel || "",
403
433
  );
404
- models.sort((left, right) => {
405
- const leftFamily = String(left.value || "").match(/(fable|opus|sonnet|haiku)/i)?.[1]?.toLowerCase();
406
- const rightFamily = String(right.value || "").match(/(fable|opus|sonnet|haiku)/i)?.[1]?.toLowerCase();
407
- const leftOrder = CLAUDE_MODEL_ORDER.indexOf(leftFamily);
408
- const rightOrder = CLAUDE_MODEL_ORDER.indexOf(rightFamily);
409
- return (leftOrder < 0 ? CLAUDE_MODEL_ORDER.length : leftOrder)
410
- - (rightOrder < 0 ? CLAUDE_MODEL_ORDER.length : rightOrder);
411
- });
412
434
  return {
413
435
  data: claudeCatalogEntries(models, defaultResolvedModel),
414
436
  };
@@ -4575,6 +4597,19 @@ async function runSelfTest() {
4575
4597
  ) !== "max") {
4576
4598
  throw new Error(`Claude pinned model self-test failed: ${JSON.stringify(catalog)}`);
4577
4599
  }
4600
+ const orderedNames = claudeCatalogEntries([
4601
+ { value: "haiku", displayName: "Haiku 4.5" },
4602
+ { value: "claude-sonnet-4-6", displayName: "Sonnet 4.6" },
4603
+ { value: "fable", displayName: "Fable 5" },
4604
+ { value: "opus", resolvedModel: "claude-opus-5-5", displayName: "Opus" },
4605
+ { value: "sonnet", displayName: "Sonnet 5" },
4606
+ { value: "claude-opus-6", displayName: "Opus 6" },
4607
+ { value: "claude-fable-5-1", displayName: "Fable 5.1" },
4608
+ { value: "nova", displayName: "Nova 1" },
4609
+ ].map((model) => ({ resolvedModel: model.value, ...model })), "").filter((entry) => !entry.hidden).map((entry) => entry.displayName).join(",");
4610
+ if (orderedNames !== "Fable 5.1,Opus 6,Sonnet 5,Haiku 4.5,Nova 1,Fable 5,Opus 5.5,Sonnet 4.6") {
4611
+ throw new Error(`Claude model order self-test failed: ${orderedNames}`);
4612
+ }
4578
4613
  const inheritedFork = forkSessionSelection(
4579
4614
  { model: "claude:sonnet", effort: "high" },
4580
4615
  { model: "claude:opus", effort: "max" },
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "devez-vibe",
3
- "version": "1.9.34",
3
+ "version": "1.9.35",
4
4
  "type": "module",
5
5
  "description": "Stable terminal UI for Codex and Claude Agent SDK",
6
6
  "keywords": [