@bastani/atomic 0.9.26 → 0.9.27-alpha.1

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.
Files changed (82) hide show
  1. package/CHANGELOG.md +18 -0
  2. package/dist/builtin/intercom/CHANGELOG.md +6 -0
  3. package/dist/builtin/intercom/index.bundle.mjs +21 -6
  4. package/dist/builtin/intercom/package.json +1 -1
  5. package/dist/builtin/mcp/package.json +1 -1
  6. package/dist/builtin/subagents/CHANGELOG.md +8 -0
  7. package/dist/builtin/subagents/package.json +1 -1
  8. package/dist/builtin/subagents/src/extension/index.bundle.mjs +693 -642
  9. package/dist/builtin/web-access/package.json +1 -1
  10. package/dist/builtin/workflows/CHANGELOG.md +8 -0
  11. package/dist/builtin/workflows/package.json +1 -1
  12. package/dist/builtin/workflows/src/extension/index.bundle.mjs +71 -20
  13. package/dist/builtin/workflows/src/index.js +31 -10
  14. package/dist/codemode-worker.js +3309 -0
  15. package/dist/config.d.ts +7 -1
  16. package/dist/config.d.ts.map +1 -1
  17. package/dist/config.js +38 -12
  18. package/dist/config.js.map +1 -1
  19. package/dist/core/agent-session-custom-message-commit.d.ts.map +1 -1
  20. package/dist/core/agent-session-custom-message-commit.js +6 -0
  21. package/dist/core/agent-session-custom-message-commit.js.map +1 -1
  22. package/dist/core/agent-session-extension-bindings.d.ts.map +1 -1
  23. package/dist/core/agent-session-extension-bindings.js +22 -6
  24. package/dist/core/agent-session-extension-bindings.js.map +1 -1
  25. package/dist/core/agent-session-services.d.ts.map +1 -1
  26. package/dist/core/agent-session-services.js +3 -1
  27. package/dist/core/agent-session-services.js.map +1 -1
  28. package/dist/core/agent-session-tasks.js +9 -4
  29. package/dist/core/agent-session-tasks.js.map +1 -1
  30. package/dist/core/auth-storage-backends.d.ts +3 -0
  31. package/dist/core/auth-storage-backends.d.ts.map +1 -1
  32. package/dist/core/auth-storage-backends.js +45 -1
  33. package/dist/core/auth-storage-backends.js.map +1 -1
  34. package/dist/core/auth-storage.d.ts.map +1 -1
  35. package/dist/core/auth-storage.js +14 -0
  36. package/dist/core/auth-storage.js.map +1 -1
  37. package/dist/core/extensions/provider-types.d.ts +3 -2
  38. package/dist/core/extensions/provider-types.d.ts.map +1 -1
  39. package/dist/core/extensions/provider-types.js.map +1 -1
  40. package/dist/core/extensions/runner-events.d.ts.map +1 -1
  41. package/dist/core/extensions/runner-events.js +10 -1
  42. package/dist/core/extensions/runner-events.js.map +1 -1
  43. package/dist/extensions/codemode/execute.d.ts.map +1 -1
  44. package/dist/extensions/codemode/execute.js +40 -6
  45. package/dist/extensions/codemode/execute.js.map +1 -1
  46. package/dist/extensions/codemode/tool.d.ts.map +1 -1
  47. package/dist/extensions/codemode/tool.js +1 -0
  48. package/dist/extensions/codemode/tool.js.map +1 -1
  49. package/dist/extensions/mcp/tools.d.ts.map +1 -1
  50. package/dist/extensions/mcp/tools.js +4 -9
  51. package/dist/extensions/mcp/tools.js.map +1 -1
  52. package/dist/index.d.ts +1 -0
  53. package/dist/index.d.ts.map +1 -1
  54. package/dist/index.js +1 -0
  55. package/dist/index.js.map +1 -1
  56. package/dist/modes/interactive/interactive-agent-events.js +21 -0
  57. package/dist/modes/interactive/interactive-agent-events.js.map +1 -1
  58. package/dist/modes/interactive/interactive-mode-base.d.ts +1 -0
  59. package/dist/modes/interactive/interactive-mode-base.d.ts.map +1 -1
  60. package/dist/modes/interactive/interactive-mode-base.js +1 -0
  61. package/dist/modes/interactive/interactive-mode-base.js.map +1 -1
  62. package/dist/modes/interactive/interactive-mode-helpers.js +1 -1
  63. package/dist/modes/interactive/interactive-mode-helpers.js.map +1 -1
  64. package/dist/modes/interactive/interactive-mode-surface.d.ts +1 -0
  65. package/dist/modes/interactive/interactive-mode-surface.d.ts.map +1 -1
  66. package/dist/modes/interactive/interactive-mode-surface.js.map +1 -1
  67. package/dist/modes/interactive/interactive-process-lifecycle.js +7 -4
  68. package/dist/modes/interactive/interactive-process-lifecycle.js.map +1 -1
  69. package/dist/utils/output-files.d.ts +7 -0
  70. package/dist/utils/output-files.d.ts.map +1 -0
  71. package/dist/utils/output-files.js +20 -0
  72. package/dist/utils/output-files.js.map +1 -0
  73. package/docs/codemode.md +3 -3
  74. package/docs/extensions/api-reference.md +3 -1
  75. package/docs/extensions.md +2 -0
  76. package/docs/sdk.md +2 -0
  77. package/docs/settings.md +2 -0
  78. package/docs/subagents.md +4 -0
  79. package/docs/workflows/api-reference.md +6 -2
  80. package/docs/workflows/operations.md +10 -10
  81. package/npm-shrinkwrap.json +32 -32
  82. package/package.json +6 -6
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@bastani/web-access",
3
- "version": "0.9.26",
3
+ "version": "0.9.27-alpha.1",
4
4
  "private": true,
5
5
  "description": "Atomic extension for web search, URL fetching, GitHub repo cloning, PDF/video extraction. Fork of: https://github.com/nicobailon/pi-web-access",
6
6
  "contributors": [
@@ -6,6 +6,14 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),
6
6
 
7
7
  ## [Unreleased]
8
8
 
9
+ ## [0.9.27-alpha.1] - 2026-10-04
10
+
11
+ ### Fixed
12
+
13
+ - Fixed workflow stages that set `model` or `fallbackModels` using settings or inherited parent models instead of only their declared chain and reasoning levels, including after reattachment. Exhausted explicit chains now stop rather than append the parent model. Numbered account providers such as `openai-1` resolve from their own `auth.json` credentials without alias registrations or `models.json` entries ([#3426](https://github.com/bastani-inc/atomic/issues/3426)).
14
+ - Raised the durable database admission and checkpoint deadline from 10 seconds to two minutes to tolerate transient PostgreSQL latency, retaining prompt cancellation. Workflow tool requests now allow 150 seconds so their outer deadline does not cut admission short ([#3428](https://github.com/bastani-inc/atomic/issues/3428)).
15
+ - Fixed reattached stages rejecting saved custom or dynamic model IDs that the SDK can reconstruct, and replaying an exhausted explicit reasoning tier when an earlier candidate leaves its thinking level unspecified ([#3432](https://github.com/bastani-inc/atomic/pull/3432)).
16
+
9
17
  ## [0.9.26] - 2026-10-04
10
18
 
11
19
  ### Added
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@bastani/workflows",
3
- "version": "0.9.26",
3
+ "version": "0.9.27-alpha.1",
4
4
  "private": true,
5
5
  "description": "Atomic extension for multi-stage workflow authoring and execution.",
6
6
  "contributors": [
@@ -188,7 +188,7 @@ async function boundedAdmission(operation, signal, timeoutMs = DBOS_ADMISSION_TI
188
188
  signal?.removeEventListener("abort", abort);
189
189
  }
190
190
  }
191
- var DBOS_ADMISSION_TIMEOUT_MS = 1e4, DbosDependencyError, key2, bag, dbosAdmissionContext;
191
+ var DBOS_ADMISSION_TIMEOUT_MS = 120000, DbosDependencyError, key2, bag, dbosAdmissionContext;
192
192
  var init_dbos_admission = __esm(() => {
193
193
  init_dbos_process_owner();
194
194
  DbosDependencyError = class DbosDependencyError extends Error {
@@ -110836,11 +110836,20 @@ async function buildModelCandidatesFromCatalog(input) {
110836
110836
  primaryModel: input.primaryModel,
110837
110837
  fallbackModels: input.fallbackModels,
110838
110838
  fallbackThinkingLevels: input.fallbackThinkingLevels,
110839
- currentModel: input.catalog.currentModel,
110839
+ currentModel: input.includeCurrentModel === false ? undefined : input.catalog.currentModel,
110840
110840
  availableModels,
110841
110841
  preferredProvider: input.catalog.preferredProvider
110842
110842
  });
110843
110843
  } catch (err) {
110844
+ if (input.includeCurrentModel === false) {
110845
+ if (err instanceof WorkflowModelValidationError)
110846
+ throw err;
110847
+ return buildModelCandidates({
110848
+ primaryModel: input.primaryModel,
110849
+ fallbackModels: input.fallbackModels,
110850
+ fallbackThinkingLevels: input.fallbackThinkingLevels
110851
+ });
110852
+ }
110844
110853
  if (input.catalog.currentModel === undefined) {
110845
110854
  throw err;
110846
110855
  }
@@ -111390,7 +111399,7 @@ function stripWorkflowOnlyOptions(options, defaultSessionDir, meta, pendingStage
111390
111399
  const {
111391
111400
  schema: _schema,
111392
111401
  mcp: _mcp,
111393
- fallbackModels: _fallbackModels,
111402
+ fallbackModels,
111394
111403
  fallbackThinkingLevels: _fallbackThinkingLevels,
111395
111404
  modelConstraints: _modelConstraints,
111396
111405
  taskNeeds: _taskNeeds,
@@ -111421,7 +111430,11 @@ function stripWorkflowOnlyOptions(options, defaultSessionDir, meta, pendingStage
111421
111430
  sessionOptions.sessionManager = SessionManager.create(cwd, effectiveSessionDir, classification);
111422
111431
  }
111423
111432
  }
111424
- return { ...sessionOptions, orchestrationContext };
111433
+ return {
111434
+ ...sessionOptions,
111435
+ ...fallbackModels?.length === 0 ? { fallbackModels: [] } : {},
111436
+ orchestrationContext
111437
+ };
111425
111438
  }
111426
111439
  function missingAdapter(consumer) {
111427
111440
  if (consumer === "complete") {
@@ -111830,10 +111843,12 @@ function buildStageSessionOptions(input) {
111830
111843
  const options = input.candidate === undefined ? { ...input.effectiveStageOptions ?? {} } : {
111831
111844
  ...input.effectiveStageOptions ?? {},
111832
111845
  model: input.candidate.value,
111833
- ...input.candidate.reasoningLevel !== undefined ? { thinkingLevel: input.candidate.reasoningLevel } : {},
111834
- fallbackModels: undefined,
111835
- fallbackThinkingLevels: undefined
111846
+ ...input.candidate.reasoningLevel !== undefined ? { thinkingLevel: input.candidate.reasoningLevel } : {}
111836
111847
  };
111848
+ if (input.ownsFallbackChain) {
111849
+ options.fallbackModels = [];
111850
+ options.fallbackThinkingLevels = undefined;
111851
+ }
111837
111852
  if (input.restoreSavedModel === true)
111838
111853
  delete options.model;
111839
111854
  if (input.reattachSessionFile !== undefined && options.sessionManager === undefined) {
@@ -112845,7 +112860,8 @@ class StageSessionController {
112845
112860
  ...this.modelRoute.fallbackModels.map(() => "off"),
112846
112861
  ...this.effectiveStageOptions?.fallbackThinkingLevels ?? []
112847
112862
  ] : this.effectiveStageOptions?.fallbackThinkingLevels,
112848
- catalog: this.modelCatalog
112863
+ catalog: this.modelCatalog,
112864
+ includeCurrentModel: this.modelRoute !== undefined
112849
112865
  });
112850
112866
  this.candidatesPromise = this.modelRoute ? resolved.then((candidates) => {
112851
112867
  if (!this.modelRoute)
@@ -112888,7 +112904,8 @@ class StageSessionController {
112888
112904
  if (this.reattachSessionFile !== undefined) {
112889
112905
  const resumed = await this.createSession(undefined, consumer, { restoreSavedModel: true });
112890
112906
  const restoredId = workflowModelId(resumed.model);
112891
- const restoredIndex = restoredId === undefined ? -1 : candidates.findIndex((entry) => entry.id === restoredId);
112907
+ const exactRestoredIndex = restoredId === undefined ? -1 : candidates.findIndex((entry) => entry.id === restoredId && entry.reasoningLevel === resumed.thinkingLevel);
112908
+ const restoredIndex = exactRestoredIndex >= 0 ? exactRestoredIndex : candidates.findIndex((entry) => entry.id === restoredId && entry.reasoningLevel === undefined);
112892
112909
  this.activeCandidateIndex = restoredIndex >= 0 ? restoredIndex : undefined;
112893
112910
  this.selectedModel = restoredId ?? first.id;
112894
112911
  this.resumeCurrentSession = true;
@@ -113094,10 +113111,14 @@ class StageSessionController {
113094
113111
  }
113095
113112
  }
113096
113113
  this.reportStartupPhase("resource-preparation");
113097
- this.applyCandidateThinking(candidate);
113114
+ if (resumeOptions?.restoreSavedModel)
113115
+ this.pendingThinkingLevel = undefined;
113116
+ else
113117
+ this.applyCandidateThinking(candidate);
113098
113118
  const stageOptions = buildStageSessionOptions({
113099
113119
  effectiveStageOptions: this.effectiveStageOptions,
113100
113120
  candidate,
113121
+ ownsFallbackChain: this.hasExplicitModelFallbackConfig,
113101
113122
  restoreSavedModel: resumeOptions?.restoreSavedModel,
113102
113123
  reattachSessionFile: this.reattachSessionFile,
113103
113124
  sharedModelRuntime: this.sharedModelRuntime
@@ -118643,6 +118664,10 @@ function registerPendingStageIntercomBridge(pi, activeStore) {
118643
118664
  };
118644
118665
  const unsubscribeStore = activeStore.subscribeInvalidation(announceRoutes);
118645
118666
  announceRoutes();
118667
+ pi.on?.("session_start", () => {
118668
+ announcedRoutes.clear();
118669
+ announceRoutes();
118670
+ });
118646
118671
  const subscription = pi.events?.on?.(PENDING_STAGE_MESSAGE_EVENT, (payload) => {
118647
118672
  if (disposed || !isPendingStageMessageEvent(payload) || payload.handled)
118648
118673
  return;
@@ -119206,7 +119231,8 @@ function renderRunSummary(payload) {
119206
119231
 
119207
119232
  // dist/builtin/workflows/src/extension/wiring.ts
119208
119233
  import {
119209
- isStaleExtensionContextError as isStaleExtensionContextError7
119234
+ isStaleExtensionContextError as isStaleExtensionContextError7,
119235
+ resolveRestoredModelReference
119210
119236
  } from "@bastani/atomic";
119211
119237
 
119212
119238
  // dist/builtin/workflows/src/extension/atomic-stage-session.ts
@@ -119410,14 +119436,8 @@ function stripWorkflowOnlyOptions2(options) {
119410
119436
  if (!options)
119411
119437
  return options;
119412
119438
  const maybeWorkflowOptions = options;
119413
- const {
119414
- schema: _schema,
119415
- mcp: _mcp,
119416
- fallbackModels: _fallbackModels,
119417
- group: _group,
119418
- ...sessionOptions
119419
- } = maybeWorkflowOptions;
119420
- return sessionOptions;
119439
+ const { schema: _schema, mcp: _mcp, fallbackModels, group: _group, ...sessionOptions } = maybeWorkflowOptions;
119440
+ return fallbackModels?.length === 0 ? { ...sessionOptions, fallbackModels: [] } : sessionOptions;
119421
119441
  }
119422
119442
  function emitLateIntercomRoute(pi, meta, messages, options, batch) {
119423
119443
  if (!messages.some((message) => message.customType === "intercom_message") || !pi.events?.emit)
@@ -119607,6 +119627,36 @@ function makeStageExtensionUiContext(ui, meta, broker, inheritedBindingRevision,
119607
119627
  })
119608
119628
  };
119609
119629
  }
119630
+ async function resolveStageModel(options, restoreSavedModel) {
119631
+ const runtime = options.modelRuntime;
119632
+ if (!runtime)
119633
+ return;
119634
+ const saved = restoreSavedModel ? options.sessionManager?.buildSessionContext() : undefined;
119635
+ const reference = saved?.model ? `${saved.model.provider}/${saved.model.modelId}` : typeof options.model === "string" ? options.model : undefined;
119636
+ if (!reference)
119637
+ return;
119638
+ const slash = reference.indexOf("/");
119639
+ if (slash < 0)
119640
+ throw new Error(`Workflow stage model must specify provider/model: ${reference}`);
119641
+ const provider = reference.slice(0, slash);
119642
+ const modelId = reference.slice(slash + 1);
119643
+ let model = runtime.getModel(provider, modelId);
119644
+ if (!model && !runtime.getProvider(provider)) {
119645
+ const source = /^(.*)-\d+$/.exec(provider)?.[1];
119646
+ const credential = runtime.getCredentialSnapshot(provider);
119647
+ if (source && credential && runtime.getModel(source, modelId)) {
119648
+ runtime.registerProvider(provider, { aliasOf: source });
119649
+ model = runtime.getModel(provider, modelId);
119650
+ }
119651
+ }
119652
+ if (!model && saved?.model)
119653
+ model = await resolveRestoredModelReference(provider, modelId, runtime);
119654
+ if (!model)
119655
+ throw new Error(`Workflow stage model unavailable: ${reference}`);
119656
+ options.model = model;
119657
+ if (saved?.model)
119658
+ options.thinkingLevel = saved.thinkingLevel;
119659
+ }
119610
119660
  function buildRuntimeAdapters(builtWith, options = {}) {
119611
119661
  const resolveSurface = options.resolveSurface ?? (() => builtWith);
119612
119662
  const sessionFactory = (pi) => options.createAgentSession ?? pi.createAgentSession ?? (isTestContext() && options.sdk === undefined ? createTestAgentSession : (sessionOptions, prepareOptions) => createPiSdkAgentSession(sessionOptions, {
@@ -119620,6 +119670,7 @@ function buildRuntimeAdapters(builtWith, options = {}) {
119620
119670
  const pi = resolveSurface();
119621
119671
  const createSession = sessionFactory(pi);
119622
119672
  const inheritedOptions = pi.getChildSessionOptions?.(stripWorkflowOnlyOptions2(stageOptions) ?? {}) ?? stripWorkflowOnlyOptions2(stageOptions) ?? {};
119673
+ await resolveStageModel(inheritedOptions, stageOptions.model === undefined && stageOptions.sessionManager !== undefined);
119623
119674
  if (meta?.isFallbackAttempt && inheritedOptions.model && inheritedOptions.isFallbackModelAllowed?.(inheritedOptions.model, inheritedOptions.thinkingLevel) === false)
119624
119675
  throw new Error("Workflow stage fallback model unavailable under inherited policy.");
119625
119676
  const sessionOptions = withWorkflowStageSessionOptions(inheritedOptions, meta, pi);
@@ -124048,7 +124099,7 @@ var WorkflowParametersSchema = Type25.Object({
124048
124099
  }, { additionalProperties: false });
124049
124100
 
124050
124101
  // dist/builtin/workflows/src/extension/workflow-tool-registration.ts
124051
- var WORKFLOW_TOOL_REQUEST_TIMEOUT_MS = 120000;
124102
+ var WORKFLOW_TOOL_REQUEST_TIMEOUT_MS = 150000;
124052
124103
  var MUTATING_WORKFLOW_ACTIONS = new Set([
124053
124104
  "reload",
124054
124105
  "run",
@@ -175,7 +175,7 @@ async function boundedAdmission(operation, signal, timeoutMs = DBOS_ADMISSION_TI
175
175
  signal?.removeEventListener("abort", abort);
176
176
  }
177
177
  }
178
- var DBOS_ADMISSION_TIMEOUT_MS = 1e4, DbosDependencyError, key2, bag, dbosAdmissionContext;
178
+ var DBOS_ADMISSION_TIMEOUT_MS = 120000, DbosDependencyError, key2, bag, dbosAdmissionContext;
179
179
  var init_dbos_admission = __esm(() => {
180
180
  init_dbos_process_owner();
181
181
  DbosDependencyError = class DbosDependencyError extends Error {
@@ -52338,11 +52338,20 @@ async function buildModelCandidatesFromCatalog(input) {
52338
52338
  primaryModel: input.primaryModel,
52339
52339
  fallbackModels: input.fallbackModels,
52340
52340
  fallbackThinkingLevels: input.fallbackThinkingLevels,
52341
- currentModel: input.catalog.currentModel,
52341
+ currentModel: input.includeCurrentModel === false ? undefined : input.catalog.currentModel,
52342
52342
  availableModels,
52343
52343
  preferredProvider: input.catalog.preferredProvider
52344
52344
  });
52345
52345
  } catch (err) {
52346
+ if (input.includeCurrentModel === false) {
52347
+ if (err instanceof WorkflowModelValidationError)
52348
+ throw err;
52349
+ return buildModelCandidates({
52350
+ primaryModel: input.primaryModel,
52351
+ fallbackModels: input.fallbackModels,
52352
+ fallbackThinkingLevels: input.fallbackThinkingLevels
52353
+ });
52354
+ }
52346
52355
  if (input.catalog.currentModel === undefined) {
52347
52356
  throw err;
52348
52357
  }
@@ -52892,7 +52901,7 @@ function stripWorkflowOnlyOptions(options, defaultSessionDir, meta, pendingStage
52892
52901
  const {
52893
52902
  schema: _schema,
52894
52903
  mcp: _mcp,
52895
- fallbackModels: _fallbackModels,
52904
+ fallbackModels,
52896
52905
  fallbackThinkingLevels: _fallbackThinkingLevels,
52897
52906
  modelConstraints: _modelConstraints,
52898
52907
  taskNeeds: _taskNeeds,
@@ -52923,7 +52932,11 @@ function stripWorkflowOnlyOptions(options, defaultSessionDir, meta, pendingStage
52923
52932
  sessionOptions.sessionManager = SessionManager.create(cwd, effectiveSessionDir, classification);
52924
52933
  }
52925
52934
  }
52926
- return { ...sessionOptions, orchestrationContext };
52935
+ return {
52936
+ ...sessionOptions,
52937
+ ...fallbackModels?.length === 0 ? { fallbackModels: [] } : {},
52938
+ orchestrationContext
52939
+ };
52927
52940
  }
52928
52941
  function missingAdapter(consumer) {
52929
52942
  if (consumer === "complete") {
@@ -53332,10 +53345,12 @@ function buildStageSessionOptions(input) {
53332
53345
  const options = input.candidate === undefined ? { ...input.effectiveStageOptions ?? {} } : {
53333
53346
  ...input.effectiveStageOptions ?? {},
53334
53347
  model: input.candidate.value,
53335
- ...input.candidate.reasoningLevel !== undefined ? { thinkingLevel: input.candidate.reasoningLevel } : {},
53336
- fallbackModels: undefined,
53337
- fallbackThinkingLevels: undefined
53348
+ ...input.candidate.reasoningLevel !== undefined ? { thinkingLevel: input.candidate.reasoningLevel } : {}
53338
53349
  };
53350
+ if (input.ownsFallbackChain) {
53351
+ options.fallbackModels = [];
53352
+ options.fallbackThinkingLevels = undefined;
53353
+ }
53339
53354
  if (input.restoreSavedModel === true)
53340
53355
  delete options.model;
53341
53356
  if (input.reattachSessionFile !== undefined && options.sessionManager === undefined) {
@@ -54347,7 +54362,8 @@ class StageSessionController {
54347
54362
  ...this.modelRoute.fallbackModels.map(() => "off"),
54348
54363
  ...this.effectiveStageOptions?.fallbackThinkingLevels ?? []
54349
54364
  ] : this.effectiveStageOptions?.fallbackThinkingLevels,
54350
- catalog: this.modelCatalog
54365
+ catalog: this.modelCatalog,
54366
+ includeCurrentModel: this.modelRoute !== undefined
54351
54367
  });
54352
54368
  this.candidatesPromise = this.modelRoute ? resolved.then((candidates) => {
54353
54369
  if (!this.modelRoute)
@@ -54390,7 +54406,8 @@ class StageSessionController {
54390
54406
  if (this.reattachSessionFile !== undefined) {
54391
54407
  const resumed = await this.createSession(undefined, consumer, { restoreSavedModel: true });
54392
54408
  const restoredId = workflowModelId(resumed.model);
54393
- const restoredIndex = restoredId === undefined ? -1 : candidates.findIndex((entry) => entry.id === restoredId);
54409
+ const exactRestoredIndex = restoredId === undefined ? -1 : candidates.findIndex((entry) => entry.id === restoredId && entry.reasoningLevel === resumed.thinkingLevel);
54410
+ const restoredIndex = exactRestoredIndex >= 0 ? exactRestoredIndex : candidates.findIndex((entry) => entry.id === restoredId && entry.reasoningLevel === undefined);
54394
54411
  this.activeCandidateIndex = restoredIndex >= 0 ? restoredIndex : undefined;
54395
54412
  this.selectedModel = restoredId ?? first.id;
54396
54413
  this.resumeCurrentSession = true;
@@ -54596,10 +54613,14 @@ class StageSessionController {
54596
54613
  }
54597
54614
  }
54598
54615
  this.reportStartupPhase("resource-preparation");
54599
- this.applyCandidateThinking(candidate);
54616
+ if (resumeOptions?.restoreSavedModel)
54617
+ this.pendingThinkingLevel = undefined;
54618
+ else
54619
+ this.applyCandidateThinking(candidate);
54600
54620
  const stageOptions = buildStageSessionOptions({
54601
54621
  effectiveStageOptions: this.effectiveStageOptions,
54602
54622
  candidate,
54623
+ ownsFallbackChain: this.hasExplicitModelFallbackConfig,
54603
54624
  restoreSavedModel: resumeOptions?.restoreSavedModel,
54604
54625
  reattachSessionFile: this.reattachSessionFile,
54605
54626
  sharedModelRuntime: this.sharedModelRuntime