@autohq/cli 0.1.372 → 0.1.373

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.
@@ -23492,7 +23492,7 @@ Object.assign(lookup, {
23492
23492
  // package.json
23493
23493
  var package_default = {
23494
23494
  name: "@autohq/cli",
23495
- version: "0.1.372",
23495
+ version: "0.1.373",
23496
23496
  license: "SEE LICENSE IN README.md",
23497
23497
  publishConfig: {
23498
23498
  access: "public"
@@ -25412,10 +25412,15 @@ var AgentModelOpenRouterSchema = external_exports.object({
25412
25412
  models: external_exports.array(external_exports.string().trim().min(1).regex(OPENROUTER_MODEL_SLUG_PATTERN)).min(1).max(3),
25413
25413
  provider: AgentModelOpenRouterProviderPrefsSchema.optional()
25414
25414
  }).strict();
25415
+ var AgentModelFallbackSchema = external_exports.object({
25416
+ provider: ModelApiTokenProviderSchema.optional(),
25417
+ id: external_exports.string().trim().min(1).max(256)
25418
+ }).strict();
25415
25419
  var AgentModelSelectionSchema = external_exports.object({
25416
25420
  provider: ModelApiTokenProviderSchema.optional(),
25417
25421
  id: external_exports.string().trim().min(1).max(256),
25418
- openrouter: AgentModelOpenRouterSchema.optional()
25422
+ openrouter: AgentModelOpenRouterSchema.optional(),
25423
+ fallbacks: external_exports.array(AgentModelFallbackSchema).min(1).max(2).optional()
25419
25424
  }).strict();
25420
25425
  var ResolvedAgentModelSelectionSchema = AgentModelSelectionSchema.extend({
25421
25426
  provider: ModelApiTokenProviderSchema
@@ -25426,7 +25431,12 @@ var ModelRoutingOpenRouterSchema = external_exports.object({
25426
25431
  }).strict();
25427
25432
  var ModelRoutingConfigSchema = external_exports.object({
25428
25433
  primaryModelId: external_exports.string().min(1),
25429
- openrouter: ModelRoutingOpenRouterSchema.optional()
25434
+ openrouter: ModelRoutingOpenRouterSchema.optional(),
25435
+ // Capability 1 — the ordered same-provider fallback chain the gateway
25436
+ // rewrites `body.model` through when the primary exhausts the transient
25437
+ // retry loop. Mutually exclusive with `openrouter` by construction (the
25438
+ // authored fields are mutually exclusive at validation).
25439
+ fallbackModelIds: external_exports.array(external_exports.string().min(1)).min(1).max(2).optional()
25430
25440
  }).strict();
25431
25441
  var InvalidModelSelectionError = class extends Error {
25432
25442
  constructor(message) {
@@ -25566,6 +25576,71 @@ function validateAgentModelOpenRouterForHarness(spec, context) {
25566
25576
  seen.add(id);
25567
25577
  }
25568
25578
  }
25579
+ function validateAgentModelFallbacksForHarness(spec, context) {
25580
+ const fallbacks = spec.model?.fallbacks;
25581
+ if (!fallbacks || fallbacks.length === 0) {
25582
+ return;
25583
+ }
25584
+ if (spec.model?.openrouter) {
25585
+ context.addIssue({
25586
+ code: external_exports.ZodIssueCode.custom,
25587
+ path: ["model", "fallbacks"],
25588
+ message: "model.fallbacks and model.openrouter cannot be combined"
25589
+ });
25590
+ return;
25591
+ }
25592
+ const primary = spec.resolvedModel;
25593
+ if (!primary) {
25594
+ return;
25595
+ }
25596
+ const seenIds = /* @__PURE__ */ new Set([primary.id]);
25597
+ for (const [index, fallback] of fallbacks.entries()) {
25598
+ let resolved;
25599
+ try {
25600
+ resolved = resolveModelSelectionForHarness(spec.harness, {
25601
+ provider: fallback.provider ?? primary.provider,
25602
+ id: fallback.id
25603
+ });
25604
+ } catch (error51) {
25605
+ context.addIssue({
25606
+ code: external_exports.ZodIssueCode.custom,
25607
+ path: ["model", "fallbacks", index],
25608
+ message: error51 instanceof Error ? error51.message : String(error51)
25609
+ });
25610
+ continue;
25611
+ }
25612
+ if (resolved.provider !== primary.provider) {
25613
+ context.addIssue({
25614
+ code: external_exports.ZodIssueCode.custom,
25615
+ path: ["model", "fallbacks", index, "provider"],
25616
+ message: `model.fallbacks entries must resolve to the primary's provider (${primary.provider}); got ${resolved.provider}`
25617
+ });
25618
+ continue;
25619
+ }
25620
+ if (seenIds.has(resolved.id)) {
25621
+ context.addIssue({
25622
+ code: external_exports.ZodIssueCode.custom,
25623
+ path: ["model", "fallbacks", index, "id"],
25624
+ message: "model.fallbacks ids must be distinct and must not repeat the primary model id"
25625
+ });
25626
+ continue;
25627
+ }
25628
+ seenIds.add(resolved.id);
25629
+ try {
25630
+ validateReasoningEffortForHarness({
25631
+ harness: spec.harness,
25632
+ model: resolved,
25633
+ reasoningEffort: spec.reasoningEffort
25634
+ });
25635
+ } catch (error51) {
25636
+ context.addIssue({
25637
+ code: external_exports.ZodIssueCode.custom,
25638
+ path: ["model", "fallbacks", index],
25639
+ message: error51 instanceof Error ? error51.message : String(error51)
25640
+ });
25641
+ }
25642
+ }
25643
+ }
25569
25644
  function validateAgentModelFieldsForHarness(spec, context) {
25570
25645
  const harness = spec.harness;
25571
25646
  if (harness !== "claude-code" && harness !== "codex") {
@@ -25600,6 +25675,15 @@ function validateAgentModelFieldsForHarness(spec, context) {
25600
25675
  { harness, model: spec.model, resolvedModel },
25601
25676
  context
25602
25677
  );
25678
+ validateAgentModelFallbacksForHarness(
25679
+ {
25680
+ harness,
25681
+ model: spec.model,
25682
+ reasoningEffort: spec.reasoningEffort,
25683
+ resolvedModel
25684
+ },
25685
+ context
25686
+ );
25603
25687
  }
25604
25688
  function validateModelProviderForHarness(harness, provider) {
25605
25689
  const rules = modelRulesForHarness(harness);
package/dist/index.js CHANGED
@@ -16805,6 +16805,71 @@ function validateAgentModelOpenRouterForHarness(spec, context) {
16805
16805
  seen.add(id);
16806
16806
  }
16807
16807
  }
16808
+ function validateAgentModelFallbacksForHarness(spec, context) {
16809
+ const fallbacks = spec.model?.fallbacks;
16810
+ if (!fallbacks || fallbacks.length === 0) {
16811
+ return;
16812
+ }
16813
+ if (spec.model?.openrouter) {
16814
+ context.addIssue({
16815
+ code: external_exports.ZodIssueCode.custom,
16816
+ path: ["model", "fallbacks"],
16817
+ message: "model.fallbacks and model.openrouter cannot be combined"
16818
+ });
16819
+ return;
16820
+ }
16821
+ const primary = spec.resolvedModel;
16822
+ if (!primary) {
16823
+ return;
16824
+ }
16825
+ const seenIds = /* @__PURE__ */ new Set([primary.id]);
16826
+ for (const [index, fallback] of fallbacks.entries()) {
16827
+ let resolved;
16828
+ try {
16829
+ resolved = resolveModelSelectionForHarness(spec.harness, {
16830
+ provider: fallback.provider ?? primary.provider,
16831
+ id: fallback.id
16832
+ });
16833
+ } catch (error51) {
16834
+ context.addIssue({
16835
+ code: external_exports.ZodIssueCode.custom,
16836
+ path: ["model", "fallbacks", index],
16837
+ message: error51 instanceof Error ? error51.message : String(error51)
16838
+ });
16839
+ continue;
16840
+ }
16841
+ if (resolved.provider !== primary.provider) {
16842
+ context.addIssue({
16843
+ code: external_exports.ZodIssueCode.custom,
16844
+ path: ["model", "fallbacks", index, "provider"],
16845
+ message: `model.fallbacks entries must resolve to the primary's provider (${primary.provider}); got ${resolved.provider}`
16846
+ });
16847
+ continue;
16848
+ }
16849
+ if (seenIds.has(resolved.id)) {
16850
+ context.addIssue({
16851
+ code: external_exports.ZodIssueCode.custom,
16852
+ path: ["model", "fallbacks", index, "id"],
16853
+ message: "model.fallbacks ids must be distinct and must not repeat the primary model id"
16854
+ });
16855
+ continue;
16856
+ }
16857
+ seenIds.add(resolved.id);
16858
+ try {
16859
+ validateReasoningEffortForHarness({
16860
+ harness: spec.harness,
16861
+ model: resolved,
16862
+ reasoningEffort: spec.reasoningEffort
16863
+ });
16864
+ } catch (error51) {
16865
+ context.addIssue({
16866
+ code: external_exports.ZodIssueCode.custom,
16867
+ path: ["model", "fallbacks", index],
16868
+ message: error51 instanceof Error ? error51.message : String(error51)
16869
+ });
16870
+ }
16871
+ }
16872
+ }
16808
16873
  function validateAgentModelFieldsForHarness(spec, context) {
16809
16874
  const harness = spec.harness;
16810
16875
  if (harness !== "claude-code" && harness !== "codex") {
@@ -16839,6 +16904,15 @@ function validateAgentModelFieldsForHarness(spec, context) {
16839
16904
  { harness, model: spec.model, resolvedModel },
16840
16905
  context
16841
16906
  );
16907
+ validateAgentModelFallbacksForHarness(
16908
+ {
16909
+ harness,
16910
+ model: spec.model,
16911
+ reasoningEffort: spec.reasoningEffort,
16912
+ resolvedModel
16913
+ },
16914
+ context
16915
+ );
16842
16916
  }
16843
16917
  function validateModelProviderForHarness(harness, provider) {
16844
16918
  const rules = modelRulesForHarness(harness);
@@ -16867,7 +16941,7 @@ function validateModelIdForProvider(input) {
16867
16941
  `${input.provider} model ids are not open for ${input.harness}`
16868
16942
  );
16869
16943
  }
16870
- var MODEL_API_TOKEN_PROVIDERS, ModelApiTokenProviderSchema, CLAUDE_CODE_REASONING_EFFORTS, CODEX_REASONING_EFFORTS, ClaudeCodeReasoningEffortSchema, CodexReasoningEffortSchema, AgentReasoningEffortSchema, OPENROUTER_MODEL_SLUG_PATTERN, AgentModelOpenRouterProviderPrefsSchema, AgentModelOpenRouterSchema, AgentModelSelectionSchema, ResolvedAgentModelSelectionSchema, ModelRoutingOpenRouterSchema, ModelRoutingConfigSchema, InvalidModelSelectionError, HARNESS_MODEL_RULES;
16944
+ var MODEL_API_TOKEN_PROVIDERS, ModelApiTokenProviderSchema, CLAUDE_CODE_REASONING_EFFORTS, CODEX_REASONING_EFFORTS, ClaudeCodeReasoningEffortSchema, CodexReasoningEffortSchema, AgentReasoningEffortSchema, OPENROUTER_MODEL_SLUG_PATTERN, AgentModelOpenRouterProviderPrefsSchema, AgentModelOpenRouterSchema, AgentModelFallbackSchema, AgentModelSelectionSchema, ResolvedAgentModelSelectionSchema, ModelRoutingOpenRouterSchema, ModelRoutingConfigSchema, InvalidModelSelectionError, HARNESS_MODEL_RULES;
16871
16945
  var init_model_selection = __esm({
16872
16946
  "../../packages/schemas/src/model-selection.ts"() {
16873
16947
  "use strict";
@@ -16918,10 +16992,15 @@ var init_model_selection = __esm({
16918
16992
  models: external_exports.array(external_exports.string().trim().min(1).regex(OPENROUTER_MODEL_SLUG_PATTERN)).min(1).max(3),
16919
16993
  provider: AgentModelOpenRouterProviderPrefsSchema.optional()
16920
16994
  }).strict();
16995
+ AgentModelFallbackSchema = external_exports.object({
16996
+ provider: ModelApiTokenProviderSchema.optional(),
16997
+ id: external_exports.string().trim().min(1).max(256)
16998
+ }).strict();
16921
16999
  AgentModelSelectionSchema = external_exports.object({
16922
17000
  provider: ModelApiTokenProviderSchema.optional(),
16923
17001
  id: external_exports.string().trim().min(1).max(256),
16924
- openrouter: AgentModelOpenRouterSchema.optional()
17002
+ openrouter: AgentModelOpenRouterSchema.optional(),
17003
+ fallbacks: external_exports.array(AgentModelFallbackSchema).min(1).max(2).optional()
16925
17004
  }).strict();
16926
17005
  ResolvedAgentModelSelectionSchema = AgentModelSelectionSchema.extend({
16927
17006
  provider: ModelApiTokenProviderSchema
@@ -16932,7 +17011,12 @@ var init_model_selection = __esm({
16932
17011
  }).strict();
16933
17012
  ModelRoutingConfigSchema = external_exports.object({
16934
17013
  primaryModelId: external_exports.string().min(1),
16935
- openrouter: ModelRoutingOpenRouterSchema.optional()
17014
+ openrouter: ModelRoutingOpenRouterSchema.optional(),
17015
+ // Capability 1 — the ordered same-provider fallback chain the gateway
17016
+ // rewrites `body.model` through when the primary exhausts the transient
17017
+ // retry loop. Mutually exclusive with `openrouter` by construction (the
17018
+ // authored fields are mutually exclusive at validation).
17019
+ fallbackModelIds: external_exports.array(external_exports.string().min(1)).min(1).max(2).optional()
16936
17020
  }).strict();
16937
17021
  InvalidModelSelectionError = class extends Error {
16938
17022
  constructor(message) {
@@ -31744,7 +31828,7 @@ var init_package = __esm({
31744
31828
  "package.json"() {
31745
31829
  package_default = {
31746
31830
  name: "@autohq/cli",
31747
- version: "0.1.372",
31831
+ version: "0.1.373",
31748
31832
  license: "SEE LICENSE IN README.md",
31749
31833
  publishConfig: {
31750
31834
  access: "public"
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@autohq/cli",
3
- "version": "0.1.372",
3
+ "version": "0.1.373",
4
4
  "license": "SEE LICENSE IN README.md",
5
5
  "publishConfig": {
6
6
  "access": "public"