@autohq/cli 0.1.372 → 0.1.374

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.374",
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);
@@ -28726,6 +28810,10 @@ var RunRuntimeRestartSchema = external_exports.object({
28726
28810
  logTail: external_exports.string().nullable(),
28727
28811
  logTailTruncated: external_exports.boolean()
28728
28812
  });
28813
+ var RunModelFallbackSchema = external_exports.object({
28814
+ activatedAt: external_exports.string().datetime().nullable(),
28815
+ fallbackModelId: external_exports.string().nullable()
28816
+ });
28729
28817
  var RunSummarySchema = external_exports.object({
28730
28818
  session: external_exports.object({
28731
28819
  id: SessionIdSchema2,
@@ -28811,7 +28899,9 @@ var RunSummarySchema = external_exports.object({
28811
28899
  runtimeRestarts: external_exports.object({
28812
28900
  count: external_exports.number().int().nonnegative(),
28813
28901
  recent: external_exports.array(RunRuntimeRestartSchema)
28814
- })
28902
+ }),
28903
+ /** Latest same-provider model-fallback activation for the session, if any. */
28904
+ modelFallback: RunModelFallbackSchema
28815
28905
  });
28816
28906
 
28817
28907
  // ../../packages/schemas/src/session-turns.ts
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) {
@@ -20291,7 +20375,7 @@ var init_runtime_restart_diagnostics = __esm({
20291
20375
  });
20292
20376
 
20293
20377
  // ../../packages/schemas/src/session-introspection.ts
20294
- var TruncatedValueSchema, RunConversationSearchSnippetSchema, RunConversationSearchMatchSchema, RunConversationSearchResponseSchema, SessionToolExchangeSchema, SessionToolExchangesResponseSchema, SESSION_TRIGGER_DELIVERY_ACTIONS, SessionTriggerDeliveryActionSchema, SESSION_EVENT_ORIGIN_KINDS, SessionEventOriginKindSchema, SessionTriggerDeliveryRecordSchema, SessionTriggersResponseSchema, RunBindingRecordSchema, RunBindingsResponseSchema, RunTurnSchema, SessionToolStatSchema, RunRuntimeRestartSchema, RunSummarySchema;
20378
+ var TruncatedValueSchema, RunConversationSearchSnippetSchema, RunConversationSearchMatchSchema, RunConversationSearchResponseSchema, SessionToolExchangeSchema, SessionToolExchangesResponseSchema, SESSION_TRIGGER_DELIVERY_ACTIONS, SessionTriggerDeliveryActionSchema, SESSION_EVENT_ORIGIN_KINDS, SessionEventOriginKindSchema, SessionTriggerDeliveryRecordSchema, SessionTriggersResponseSchema, RunBindingRecordSchema, RunBindingsResponseSchema, RunTurnSchema, SessionToolStatSchema, RunRuntimeRestartSchema, RunModelFallbackSchema, RunSummarySchema;
20295
20379
  var init_session_introspection = __esm({
20296
20380
  "../../packages/schemas/src/session-introspection.ts"() {
20297
20381
  "use strict";
@@ -20442,6 +20526,10 @@ var init_session_introspection = __esm({
20442
20526
  logTail: external_exports.string().nullable(),
20443
20527
  logTailTruncated: external_exports.boolean()
20444
20528
  });
20529
+ RunModelFallbackSchema = external_exports.object({
20530
+ activatedAt: external_exports.string().datetime().nullable(),
20531
+ fallbackModelId: external_exports.string().nullable()
20532
+ });
20445
20533
  RunSummarySchema = external_exports.object({
20446
20534
  session: external_exports.object({
20447
20535
  id: SessionIdSchema,
@@ -20527,7 +20615,9 @@ var init_session_introspection = __esm({
20527
20615
  runtimeRestarts: external_exports.object({
20528
20616
  count: external_exports.number().int().nonnegative(),
20529
20617
  recent: external_exports.array(RunRuntimeRestartSchema)
20530
- })
20618
+ }),
20619
+ /** Latest same-provider model-fallback activation for the session, if any. */
20620
+ modelFallback: RunModelFallbackSchema
20531
20621
  });
20532
20622
  }
20533
20623
  });
@@ -31744,7 +31834,7 @@ var init_package = __esm({
31744
31834
  "package.json"() {
31745
31835
  package_default = {
31746
31836
  name: "@autohq/cli",
31747
- version: "0.1.372",
31837
+ version: "0.1.374",
31748
31838
  license: "SEE LICENSE IN README.md",
31749
31839
  publishConfig: {
31750
31840
  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.374",
4
4
  "license": "SEE LICENSE IN README.md",
5
5
  "publishConfig": {
6
6
  "access": "public"