@gajae-code/coding-agent 0.18.6 → 0.18.8

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 (302) hide show
  1. package/CHANGELOG.md +318 -1
  2. package/dist/types/async/job-manager.d.ts +1 -1
  3. package/dist/types/capability/mcp.d.ts +2 -0
  4. package/dist/types/capability/skill.d.ts +2 -0
  5. package/dist/types/capability/types.d.ts +6 -0
  6. package/dist/types/cli/public-command-errors.d.ts +3 -1
  7. package/dist/types/cli/setup-cli.d.ts +1 -1
  8. package/dist/types/commands/deep-interview.d.ts +3 -0
  9. package/dist/types/config/autorouting-tier-map.d.ts +348 -9
  10. package/dist/types/config/file-lock.d.ts +1 -0
  11. package/dist/types/config/model-bindings-applier.d.ts +2 -0
  12. package/dist/types/config/model-profile-activation.d.ts +11 -3
  13. package/dist/types/config/model-registry.d.ts +4 -9
  14. package/dist/types/config/settings.d.ts +4 -0
  15. package/dist/types/config/skill-settings-defaults.d.ts +2 -0
  16. package/dist/types/cursor-delete-path.d.ts +1 -0
  17. package/dist/types/cursor-mcp-name.d.ts +8 -0
  18. package/dist/types/customization/inventory.d.ts +2 -0
  19. package/dist/types/debug/report-bundle-parent.d.ts +2 -0
  20. package/dist/types/defaults/gjc/extensions/grok-cli-vendor/src/provider/stream.d.ts +1 -0
  21. package/dist/types/defaults/gjc/extensions/grok-cli-vendor/src/provider/version-manager.d.ts +31 -0
  22. package/dist/types/defaults/gjc-skills.generated.d.ts +5 -6
  23. package/dist/types/discovery/helpers.d.ts +8 -3
  24. package/dist/types/export/html/css-color.d.ts +2 -0
  25. package/dist/types/export/html/template.generated.d.ts +1 -1
  26. package/dist/types/extensibility/extensions/types.d.ts +7 -0
  27. package/dist/types/extensibility/gjc-plugins/runtime-adapters.d.ts +14 -1
  28. package/dist/types/extensibility/plugins/marketplace/cache.d.ts +2 -0
  29. package/dist/types/extensibility/plugins/plugin-link-path.d.ts +2 -0
  30. package/dist/types/extensibility/runtime-skill-discovery.d.ts +3 -1
  31. package/dist/types/extensibility/skill-management.d.ts +3 -1
  32. package/dist/types/extensibility/skills.d.ts +2 -0
  33. package/dist/types/gjc-runtime/deep-interview-crystallize.d.ts +74 -0
  34. package/dist/types/gjc-runtime/deep-interview-runtime.d.ts +11 -0
  35. package/dist/types/gjc-runtime/gc-runtime.d.ts +5 -0
  36. package/dist/types/gjc-runtime/ralplan-runtime.d.ts +0 -5
  37. package/dist/types/gjc-runtime/state-argv.d.ts +1 -1
  38. package/dist/types/gjc-runtime/state-migrations.d.ts +8 -0
  39. package/dist/types/gjc-runtime/state-runtime.d.ts +95 -0
  40. package/dist/types/gjc-runtime/state-writer.d.ts +11 -1
  41. package/dist/types/gjc-runtime/ultragoal-runtime.d.ts +8 -0
  42. package/dist/types/internal-urls/skill-path.d.ts +1 -0
  43. package/dist/types/lsp/workspace-path.d.ts +1 -0
  44. package/dist/types/modes/acp/acp-agent.d.ts +7 -0
  45. package/dist/types/modes/components/custom-editor.d.ts +6 -0
  46. package/dist/types/modes/components/customization/customization-dashboard.d.ts +1 -0
  47. package/dist/types/modes/components/extensions/state-manager.d.ts +4 -3
  48. package/dist/types/modes/controllers/input-controller.d.ts +9 -0
  49. package/dist/types/modes/interactive-mode.d.ts +1 -0
  50. package/dist/types/modes/utils/interrupt-ownership.d.ts +3 -0
  51. package/dist/types/modes/utils/keybinding-matchers.d.ts +1 -0
  52. package/dist/types/modes/utils/macos-option-forwarding.d.ts +17 -0
  53. package/dist/types/progress/collect-project-progress.d.ts +38 -0
  54. package/dist/types/progress/progress-contract.d.ts +154 -0
  55. package/dist/types/progress/progress-snapshot.d.ts +11 -0
  56. package/dist/types/progress/project-progress.d.ts +141 -0
  57. package/dist/types/progress/render-progress.d.ts +28 -0
  58. package/dist/types/runtime-mcp/elicitation.d.ts +12 -0
  59. package/dist/types/runtime-mcp/oauth-public-url.d.ts +1 -0
  60. package/dist/types/runtime-mcp/plugin-network-boundary.d.ts +1 -0
  61. package/dist/types/runtime-mcp/smithery-registry.d.ts +24 -0
  62. package/dist/types/runtime-mcp/types.d.ts +6 -0
  63. package/dist/types/sdk/acp/adapter.d.ts +1 -1
  64. package/dist/types/sdk/broker/broker-exit.d.ts +6 -2
  65. package/dist/types/sdk/broker/broker.d.ts +18 -1
  66. package/dist/types/sdk/broker/lifecycle.d.ts +9 -0
  67. package/dist/types/sdk/broker/session-index.d.ts +12 -6
  68. package/dist/types/sdk/broker/task-artifact-owner-validation.d.ts +55 -0
  69. package/dist/types/sdk/bus/index.d.ts +12 -1
  70. package/dist/types/sdk/bus/telegram-daemon-contract.d.ts +6 -1
  71. package/dist/types/sdk/bus/telegram-daemon.d.ts +3 -2
  72. package/dist/types/sdk/client/client.d.ts +2 -0
  73. package/dist/types/sdk/host/host.d.ts +6 -0
  74. package/dist/types/sdk/host/query/handlers.d.ts +3 -0
  75. package/dist/types/sdk/index.d.ts +1 -0
  76. package/dist/types/sdk/router/session-router.d.ts +9 -0
  77. package/dist/types/sdk/session-list.d.ts +1 -1
  78. package/dist/types/sdk/session.d.ts +8 -0
  79. package/dist/types/session/agent-session.d.ts +38 -9
  80. package/dist/types/session/artifacts.d.ts +2 -2
  81. package/dist/types/session/internal/managed-gc-retirement-codec.d.ts +32 -0
  82. package/dist/types/session/internal/managed-session-scope.d.ts +79 -2
  83. package/dist/types/session/internal/managed-session-storage.d.ts +36 -1
  84. package/dist/types/session/internal/managed-task-owner-cleanup.d.ts +62 -0
  85. package/dist/types/session/internal/task-artifact-owner-access.d.ts +19 -0
  86. package/dist/types/session/internal/task-artifact-owner-transcript.d.ts +11 -0
  87. package/dist/types/session/session-manager.d.ts +31 -5
  88. package/dist/types/session/session-retirement.d.ts +71 -0
  89. package/dist/types/session/session-storage.d.ts +62 -48
  90. package/dist/types/session/session-transcript-header.d.ts +2 -0
  91. package/dist/types/session/task-artifact-owner-codec.d.ts +109 -0
  92. package/dist/types/session/task-artifact-owner-retirement.d.ts +7 -0
  93. package/dist/types/session/task-artifact-owner.d.ts +10 -0
  94. package/dist/types/setup/credential-auto-import.d.ts +1 -1
  95. package/dist/types/setup/credential-import.d.ts +6 -4
  96. package/dist/types/skill-state/active-state.d.ts +38 -0
  97. package/dist/types/slash-commands/helpers/progress-report.d.ts +8 -0
  98. package/dist/types/task/executor.d.ts +3 -0
  99. package/dist/types/tools/bash-skill-urls.d.ts +1 -1
  100. package/dist/types/tools/index.d.ts +3 -0
  101. package/dist/types/tools/python.d.ts +9 -1
  102. package/dist/types/tools/recipe/recipe-guard.d.ts +7 -0
  103. package/dist/types/tools/restricted-cwd.d.ts +1 -0
  104. package/dist/types/tools/todo-write.d.ts +6 -0
  105. package/dist/types/utils/tools-checksum.d.ts +7 -0
  106. package/package.json +7 -7
  107. package/scripts/generate-sdk-operation-inventory.ts +21 -0
  108. package/scripts/resident-memory-bench.ts +174 -20
  109. package/scripts/verify-managed-empty-stop.ts +28 -0
  110. package/src/async/job-manager.ts +228 -122
  111. package/src/capability/index.ts +18 -0
  112. package/src/capability/mcp.ts +2 -0
  113. package/src/capability/skill.ts +2 -0
  114. package/src/capability/types.ts +6 -0
  115. package/src/cli/auth-broker-cli.ts +1 -1
  116. package/src/cli/config-cli.ts +8 -18
  117. package/src/cli/customize-doctor.ts +15 -2
  118. package/src/cli/public-command-errors.ts +21 -1
  119. package/src/cli/setup-cli.ts +4 -4
  120. package/src/cli/skills-cli.ts +5 -0
  121. package/src/cli-main.ts +7 -8
  122. package/src/commands/deep-interview.ts +47 -8
  123. package/src/commands/sdk.ts +140 -29
  124. package/src/config/autorouting-tier-map.ts +117 -7
  125. package/src/config/file-lock.ts +307 -68
  126. package/src/config/mcp-schema.json +4 -0
  127. package/src/config/model-bindings-applier.ts +20 -0
  128. package/src/config/model-profile-activation.ts +240 -46
  129. package/src/config/model-registry.ts +47 -153
  130. package/src/config/settings.ts +44 -4
  131. package/src/config/skill-settings-defaults.ts +7 -0
  132. package/src/coordinator-mcp/policy.ts +3 -2
  133. package/src/cursor-delete-path.ts +10 -0
  134. package/src/cursor-mcp-name.ts +15 -0
  135. package/src/cursor.ts +13 -2
  136. package/src/customization/inventory.ts +3 -0
  137. package/src/debug/report-bundle-parent.ts +22 -0
  138. package/src/debug/report-bundle.ts +3 -0
  139. package/src/debug/system-info.ts +13 -1
  140. package/src/defaults/gjc/extensions/grok-cli-vendor/src/provider/stream.ts +67 -4
  141. package/src/defaults/gjc/extensions/grok-cli-vendor/src/provider/version-manager.ts +80 -0
  142. package/src/defaults/gjc/skills/deep-interview/SKILL.md +105 -10
  143. package/src/defaults/gjc/skills/ralplan/SKILL.md +6 -4
  144. package/src/defaults/gjc-defaults.test.ts +18 -1
  145. package/src/defaults/gjc-defaults.ts +3 -0
  146. package/src/defaults/gjc-skills.generated.ts +58 -36
  147. package/src/discovery/agents.ts +6 -1
  148. package/src/discovery/builtin.ts +10 -0
  149. package/src/discovery/helpers.ts +168 -23
  150. package/src/discovery/mcp-json.ts +6 -0
  151. package/src/discovery/ssh.ts +9 -4
  152. package/src/discovery/substitute-plugin-root.ts +3 -1
  153. package/src/edit/file-read-cache.ts +1 -1
  154. package/src/eval/py/executor.ts +380 -120
  155. package/src/export/html/css-color.ts +9 -0
  156. package/src/export/html/index.ts +5 -4
  157. package/src/export/html/template.generated.ts +1 -1
  158. package/src/extensibility/extensions/runner.ts +4 -0
  159. package/src/extensibility/extensions/types.ts +7 -0
  160. package/src/extensibility/gjc-plugins/runtime-adapters.ts +73 -8
  161. package/src/extensibility/plugins/manager.ts +3 -2
  162. package/src/extensibility/plugins/marketplace/cache.ts +15 -0
  163. package/src/extensibility/plugins/marketplace/manager.ts +11 -3
  164. package/src/extensibility/plugins/plugin-link-path.ts +12 -0
  165. package/src/extensibility/runtime-skill-discovery.ts +20 -2
  166. package/src/extensibility/skill-management.ts +6 -2
  167. package/src/extensibility/skills.ts +6 -1
  168. package/src/gjc-runtime/deep-interview-crystallize.ts +1814 -0
  169. package/src/gjc-runtime/deep-interview-recorder.ts +20 -2
  170. package/src/gjc-runtime/deep-interview-runtime.ts +1415 -13
  171. package/src/gjc-runtime/deep-interview-stage.ts +98 -21
  172. package/src/gjc-runtime/gc-runtime.ts +206 -8
  173. package/src/gjc-runtime/launch-worktree.ts +14 -4
  174. package/src/gjc-runtime/ralplan-runtime.ts +447 -52
  175. package/src/gjc-runtime/state-argv.ts +2 -0
  176. package/src/gjc-runtime/state-migrations.ts +91 -29
  177. package/src/gjc-runtime/state-runtime.ts +3716 -135
  178. package/src/gjc-runtime/state-writer.ts +83 -8
  179. package/src/gjc-runtime/ultragoal-runtime.ts +16 -4
  180. package/src/gjc-runtime/workflow-manifest.generated.json +70 -42
  181. package/src/gjc-runtime/workflow-manifest.ts +54 -21
  182. package/src/harness-control-plane/operate.ts +12 -4
  183. package/src/harness-control-plane/owner.ts +5 -1
  184. package/src/hashline/parser.ts +48 -9
  185. package/src/hashline/recovery.ts +13 -4
  186. package/src/hindsight/config.ts +9 -3
  187. package/src/internal-urls/docs-index.generated.ts +19 -18
  188. package/src/internal-urls/skill-path.ts +19 -0
  189. package/src/internal-urls/skill-protocol.ts +2 -0
  190. package/src/lsp/edits.ts +6 -0
  191. package/src/lsp/workspace-path.ts +51 -0
  192. package/src/main.ts +195 -31
  193. package/src/modes/acp/acp-agent.ts +163 -7
  194. package/src/modes/components/custom-editor.ts +14 -0
  195. package/src/modes/components/customization/customization-dashboard.ts +12 -0
  196. package/src/modes/components/extensions/extension-dashboard.ts +2 -2
  197. package/src/modes/components/extensions/state-manager.ts +15 -5
  198. package/src/modes/components/model-selector.ts +1 -4
  199. package/src/modes/components/provider-onboarding-selector.ts +1 -1
  200. package/src/modes/components/status-line/segments.ts +4 -0
  201. package/src/modes/controllers/event-controller.ts +11 -4
  202. package/src/modes/controllers/input-controller.ts +74 -29
  203. package/src/modes/controllers/runtime-mcp-command-controller.ts +8 -3
  204. package/src/modes/controllers/selector-controller.ts +28 -15
  205. package/src/modes/interactive-mode.ts +4 -0
  206. package/src/modes/runtime-init.ts +4 -0
  207. package/src/modes/utils/abort-message.ts +3 -1
  208. package/src/modes/utils/interrupt-ownership.ts +12 -0
  209. package/src/modes/utils/keybinding-matchers.ts +4 -0
  210. package/src/modes/utils/macos-option-forwarding.ts +80 -0
  211. package/src/progress/collect-project-progress.ts +153 -0
  212. package/src/progress/progress-contract.ts +172 -0
  213. package/src/progress/progress-snapshot.ts +140 -0
  214. package/src/progress/project-progress.ts +446 -0
  215. package/src/progress/render-progress.ts +209 -0
  216. package/src/prompts/system/master-mode.md +1 -0
  217. package/src/prompts/tools/skill-discovery.md +1 -1
  218. package/src/runtime-mcp/client.ts +13 -4
  219. package/src/runtime-mcp/config-writer.ts +10 -6
  220. package/src/runtime-mcp/config.ts +1 -0
  221. package/src/runtime-mcp/elicitation.ts +142 -0
  222. package/src/runtime-mcp/oauth-flow.ts +5 -0
  223. package/src/runtime-mcp/oauth-public-url.ts +8 -0
  224. package/src/runtime-mcp/plugin-network-boundary.ts +4 -0
  225. package/src/runtime-mcp/smithery-registry.ts +22 -3
  226. package/src/runtime-mcp/transports/http.ts +2 -2
  227. package/src/runtime-mcp/types.ts +6 -0
  228. package/src/sdk/acp/adapter.ts +93 -8
  229. package/src/sdk/broker/broker-exit.ts +52 -23
  230. package/src/sdk/broker/broker.ts +83 -7
  231. package/src/sdk/broker/ensure.ts +2 -0
  232. package/src/sdk/broker/lifecycle.ts +820 -73
  233. package/src/sdk/broker/session-index.ts +191 -81
  234. package/src/sdk/broker/task-artifact-owner-validation.ts +259 -0
  235. package/src/sdk/bus/chat-daemon-cli.ts +38 -1
  236. package/src/sdk/bus/chat-daemon-control.ts +2 -2
  237. package/src/sdk/bus/chat-daemon-runtime.ts +3 -0
  238. package/src/sdk/bus/index.ts +241 -46
  239. package/src/sdk/bus/telegram-daemon-contract.ts +6 -1
  240. package/src/sdk/bus/telegram-daemon.ts +4 -2
  241. package/src/sdk/cli/session-cli.ts +17 -3
  242. package/src/sdk/client/client.ts +28 -8
  243. package/src/sdk/host/host.ts +6 -0
  244. package/src/sdk/host/query/handlers.ts +9 -1
  245. package/src/sdk/host/session-runtime.test.ts +2805 -411
  246. package/src/sdk/host/session-runtime.ts +428 -111
  247. package/src/sdk/host/surface-policy.ts +1 -0
  248. package/src/sdk/index.ts +8 -0
  249. package/src/sdk/lifecycle-session.ts +3 -1
  250. package/src/sdk/mcp/server.ts +15 -3
  251. package/src/sdk/prompt-deadline-manager.ts +15 -0
  252. package/src/sdk/protocol/operation-inventory.generated.json +146 -0
  253. package/src/sdk/protocol/operation-registry.ts +9 -2
  254. package/src/sdk/router/session-router.ts +94 -14
  255. package/src/sdk/session-list.ts +1 -0
  256. package/src/sdk/session.ts +81 -38
  257. package/src/session/agent-session.ts +674 -224
  258. package/src/session/artifacts.ts +174 -70
  259. package/src/session/internal/managed-gc-retirement-codec.ts +319 -0
  260. package/src/session/internal/managed-session-scope.ts +3457 -462
  261. package/src/session/internal/managed-session-storage.ts +482 -61
  262. package/src/session/internal/managed-task-owner-cleanup.ts +473 -0
  263. package/src/session/internal/task-artifact-owner-access.ts +245 -0
  264. package/src/session/internal/task-artifact-owner-transcript.ts +614 -0
  265. package/src/session/session-manager.ts +939 -133
  266. package/src/session/session-retirement.ts +714 -0
  267. package/src/session/session-storage.ts +418 -174
  268. package/src/session/session-transcript-header.ts +17 -0
  269. package/src/session/task-artifact-owner-codec.ts +641 -0
  270. package/src/session/task-artifact-owner-retirement.ts +477 -0
  271. package/src/session/task-artifact-owner.ts +289 -0
  272. package/src/setup/credential-auto-import.ts +12 -3
  273. package/src/setup/credential-import.ts +176 -5
  274. package/src/setup/paseo/announce.ts +6 -1
  275. package/src/skill-state/active-state.ts +132 -2
  276. package/src/slash-commands/builtin-registry.ts +39 -9
  277. package/src/slash-commands/helpers/progress-report.ts +23 -0
  278. package/src/stt/setup.ts +3 -5
  279. package/src/task/commands.ts +3 -1
  280. package/src/task/executor.ts +4 -0
  281. package/src/task/index.ts +6 -0
  282. package/src/tools/ask.ts +205 -6
  283. package/src/tools/ast-edit.ts +4 -0
  284. package/src/tools/bash-allowed-prefixes.ts +15 -0
  285. package/src/tools/bash-skill-urls.ts +56 -3
  286. package/src/tools/bash.ts +48 -79
  287. package/src/tools/descriptors.ts +5 -1
  288. package/src/tools/eval.ts +56 -36
  289. package/src/tools/image-gen.ts +1 -1
  290. package/src/tools/index.ts +3 -0
  291. package/src/tools/python.ts +187 -66
  292. package/src/tools/recipe/index.ts +9 -0
  293. package/src/tools/recipe/recipe-guard.ts +19 -0
  294. package/src/tools/restricted-cwd.ts +10 -0
  295. package/src/tools/skill-discovery.ts +5 -0
  296. package/src/tools/skill.ts +28 -1
  297. package/src/tools/todo-write.ts +10 -1
  298. package/src/tools/tool-catalog.generated.ts +1 -1
  299. package/src/tools/write.ts +1 -0
  300. package/src/utils/tools-checksum.ts +34 -0
  301. package/src/utils/tools-manager.ts +24 -6
  302. package/src/web/search/providers/codex.ts +3 -2
@@ -65,6 +65,7 @@ import {
65
65
  resolveMissingSessionModelRecovery,
66
66
  } from "../config/model-profile-activation";
67
67
  import { resolveModelProfileName } from "../config/model-profile-contract";
68
+ import type { ModelProfileOwnershipMarker } from "../config/model-profile-ownership";
68
69
  import { resolveProfileBindings } from "../config/model-profiles";
69
70
  import { kNoAuth, ModelRegistry } from "../config/model-registry";
70
71
  import {
@@ -84,12 +85,15 @@ import { Settings, type SkillsSettings } from "../config/settings";
84
85
  import { resolveEagerTaskDelegation } from "../config/task-delegation";
85
86
  import { CursorExecHandlers } from "../cursor";
86
87
  import { EditTool } from "../edit";
88
+ import { disposeVmContextsByOwner } from "../eval/js/context-manager";
89
+ import { disposeKernelSessionsByOwner } from "../eval/py/executor";
87
90
  import type { MasterModeContext } from "../master-mode/context";
88
91
  import { describeFoldReceipt } from "../session/fold-coordinator";
89
92
  import type { BashRestrictionProfile } from "../tools/bash-allowed-prefixes";
90
93
  import { SearchTool } from "../tools/search";
91
94
  import "../discovery";
92
95
  import { resolveConfigValue } from "../config/resolve-config-value";
96
+ import { resolveGlobalUserSkillLinkTrust } from "../config/skill-settings-defaults";
93
97
  import { getEmbeddedDefaultGjcSkills } from "../defaults/gjc-defaults";
94
98
  import { BUNDLED_GROK_BUILD_EXTENSION_ID, getBundledGrokBuildExtensionFactory } from "../defaults/gjc-grok-cli";
95
99
  import { initializeWithSettings, releaseSettingsScope } from "../discovery";
@@ -161,6 +165,7 @@ import {
161
165
  type MCPToolCache,
162
166
  resolveMCPToolCache,
163
167
  } from "../runtime-mcp";
168
+ import { createMCPFormInputHandler } from "../runtime-mcp/elicitation";
164
169
  import type { MCPLoadResult } from "../runtime-mcp/manager";
165
170
  import { MCP_STARTUP_WAIT_GRACE_MS } from "../runtime-mcp/startup-policy";
166
171
  import type { MCPServerConfig } from "../runtime-mcp/types";
@@ -182,7 +187,7 @@ import { AgentSession, type ForkContextSeed, isSessionDisposalIncompleteError }
182
187
  import { AuthBrokerClient, AuthStorage, RemoteAuthCredentialStore } from "../session/auth-storage";
183
188
  import { type CustomMessage, convertToLlm } from "../session/messages";
184
189
  import { primaryControlSurfaceFor } from "../session/primary-control-surface";
185
- import { createReadonlySessionManager, SessionManager } from "../session/session-manager";
190
+ import { createReadonlySessionManager, SessionManager, sessionArtifactCapability } from "../session/session-manager";
186
191
  import {
187
192
  parsePersistedCredentialSelector,
188
193
  resolveStartupAuthConfig,
@@ -489,6 +494,8 @@ export interface CreateAgentSessionOptions {
489
494
  modelPattern?: string;
490
495
  /** Active profile inherited by a nested SDK/subagent session. */
491
496
  activeModelProfile?: string;
497
+ /** Model profile ownership marker for propagating parent profile ownership to subagent sessions. */
498
+ modelProfileOwnershipMarker?: ModelProfileOwnershipMarker;
492
499
  /** Thinking selector. Default: from settings, else unset */
493
500
  thinkingLevel?: ThinkingLevel;
494
501
  /** Runtime substitution metadata for the initial model_change session event. */
@@ -588,6 +595,12 @@ export interface CreateAgentSessionOptions {
588
595
  */
589
596
  deferOptionalModelRefresh?: boolean;
590
597
 
598
+ /**
599
+ * Defer model profile activation until explicit model pin validation occurs.
600
+ * @internal Lifecycle-only: prevents default profile activation before pin resolution.
601
+ */
602
+ deferModelProfileActivation?: boolean;
603
+
591
604
  /** Enable LSP integration (tool, formatting, diagnostics, warmup). Default: true */
592
605
  enableLsp?: boolean;
593
606
  /** Skip Python kernel availability check and prelude warmup */
@@ -2075,6 +2088,12 @@ export async function createAgentSession(options: CreateAgentSessionOptions = {}
2075
2088
  const hasThinkingEntry = existingBranch.some(entry => entry.type === "thinking_level_change");
2076
2089
  const hasServiceTierEntry = existingBranch.some(entry => entry.type === "service_tier_change");
2077
2090
 
2091
+ // Apply inherited model profile ownership marker to subagent sessions when a parent provides one.
2092
+ // This must occur after computing hasExistingSession to avoid marking a fresh session as resumed.
2093
+ if (options.modelProfileOwnershipMarker !== undefined) {
2094
+ sessionManager.appendModelProfileOwnershipMarker(options.modelProfileOwnershipMarker);
2095
+ }
2096
+
2078
2097
  for (const entry of existingBranch) {
2079
2098
  if (entry.type !== "custom" || entry.customType !== "auth-credential-pin") continue;
2080
2099
  const data = entry.data;
@@ -2414,6 +2433,10 @@ export async function createAgentSession(options: CreateAgentSessionOptions = {}
2414
2433
  profileAuthority,
2415
2434
  cwd,
2416
2435
  disabledExtensions: settings.get("disabledExtensions"),
2436
+ allowExternalUserSkillSymlinks: resolveGlobalUserSkillLinkTrust({
2437
+ trustUserSkills: settings.getGlobal("skills.trustUserSkills"),
2438
+ enablePiUser: settings.getGlobal("skills.enablePiUser"),
2439
+ }),
2417
2440
  });
2418
2441
  skills = withEmbeddedDefaultGjcSkills(skillsResult.skills);
2419
2442
  skillWarnings = skillsResult.warnings;
@@ -2653,7 +2676,19 @@ export async function createAgentSession(options: CreateAgentSessionOptions = {}
2653
2676
  let ownedMcpManagerTools: readonly CustomTool[] = [];
2654
2677
  let publishOwnedMcpTools = false;
2655
2678
  const notificationDebounceTimers = new Map<string, Timer>();
2679
+ const installMcpInputHandler = (manager: MCPManager): void => {
2680
+ manager.setInputRequestHandler(
2681
+ createMCPFormInputHandler({
2682
+ getUi: () => {
2683
+ const context = toolContextStore.getContext();
2684
+ return { ui: context.ui, hasUI: context.hasUI === true };
2685
+ },
2686
+ getAskAnswerSource: () => session.getAskAnswerSource(),
2687
+ }),
2688
+ );
2689
+ };
2656
2690
  const wireMcpManagerCallbacks = (manager: MCPManager): void => {
2691
+ installMcpInputHandler(manager);
2657
2692
  manager.setOnPromptsChanged(serverName => {
2658
2693
  const promptCommands = buildMCPPromptCommands(manager);
2659
2694
  session.setMCPPromptCommands(promptCommands);
@@ -3180,9 +3215,18 @@ export async function createAgentSession(options: CreateAgentSessionOptions = {}
3180
3215
  getSessionFile: () => sessionManager.getSessionFile() ?? null,
3181
3216
  getSessionAgentDir: () => session?.getSessionAgentDir() ?? options.agentDir ?? settings.getAgentDir(),
3182
3217
  getEvalKernelOwnerId: () => evalKernelOwnerId,
3183
- assertEvalExecutionAllowed: () => session?.assertEvalExecutionAllowed(),
3184
- trackEvalExecution: (execution, abortController) =>
3185
- session ? session.trackEvalExecution(execution, abortController) : execution,
3218
+ assertEvalExecutionAllowed: () => {
3219
+ if (!session) throw new Error("Eval execution is unavailable until session initialization completes");
3220
+ session.assertEvalExecutionAllowed();
3221
+ },
3222
+ trackEvalExecution: (execution, abortController) => {
3223
+ if (!session) {
3224
+ abortController.abort(new Error("Eval execution is unavailable until session initialization completes"));
3225
+ void execution.catch(() => {});
3226
+ throw new Error("Eval execution is unavailable until session initialization completes");
3227
+ }
3228
+ return session.trackEvalExecution(execution, abortController);
3229
+ },
3186
3230
  getAsyncJobManager: () => asyncJobManager,
3187
3231
  waitForUserSteering: signal => {
3188
3232
  if (agent) return agent.waitForSteeringArrival(signal);
@@ -3265,19 +3309,21 @@ export async function createAgentSession(options: CreateAgentSessionOptions = {}
3265
3309
  peekQueueInvoker: () => session.peekQueueInvoker(),
3266
3310
  peekStandingResolveHandler: () => session.peekStandingResolveHandler(),
3267
3311
  setStandingResolveHandler: handler => session.setStandingResolveHandler(handler),
3268
- allocateOutputArtifact: async toolType => {
3269
- try {
3270
- return await sessionManager.allocateArtifactPath(toolType);
3271
- } catch {
3272
- return {};
3273
- }
3312
+ allocateOutputArtifact: toolType => sessionManager.allocateArtifactPath(toolType),
3313
+ captureArtifactPublication: () => {
3314
+ const capability = sessionArtifactCapability(sessionManager);
3315
+ if (!capability) throw new Error("Session artifact publication authority is unavailable.");
3316
+ return capability.captureArtifactPublication();
3274
3317
  },
3275
3318
  getArtifactManager: () => sessionManager.getArtifactManager(),
3276
3319
  isArtifactManagerAuthorized: manager => sessionManager.isArtifactManagerAuthorized(manager),
3277
3320
  adoptArtifactManager: manager => sessionManager.adoptArtifactManager(manager),
3278
3321
  releaseArtifactManager: manager => sessionManager.releaseArtifactManager(manager),
3279
3322
  ensureArtifactManager: () => sessionManager.ensureArtifactManager(),
3280
- registerSessionCleanup: cleanup => session?.registerToolSessionTransitionCleanup(cleanup) ?? (() => {}),
3323
+ registerSessionCleanup: cleanup => {
3324
+ if (!session) throw new Error("Cannot register session cleanup before session initialization completes");
3325
+ return session.registerToolSessionTransitionCleanup(cleanup);
3326
+ },
3281
3327
  mcpConfigPath: explicitMcpConfigPath,
3282
3328
  settings,
3283
3329
  authStorage,
@@ -3685,6 +3731,7 @@ export async function createAgentSession(options: CreateAgentSessionOptions = {}
3685
3731
  : {}),
3686
3732
  });
3687
3733
  owned.setAuthStorage(authStorage);
3734
+ installMcpInputHandler(owned);
3688
3735
  mcpManager = owned;
3689
3736
  ownsMcpManager = true;
3690
3737
  registerOwnedMcpManagerCleanup(owned);
@@ -4014,6 +4061,14 @@ export async function createAgentSession(options: CreateAgentSessionOptions = {}
4014
4061
  // INTERNAL terminal-abort seams, threaded directly from the
4015
4062
  // owning session (NOT on the public extension context).
4016
4063
  terminalAbortSeams: {
4064
+ getTerminalRunOwnerForEvent: event => {
4065
+ if (!session) throw new Error("Terminal owner session is not initialized.");
4066
+ return session.getTerminalRunOwnerForEvent(event);
4067
+ },
4068
+ getRunOwnerDomain: handle => {
4069
+ if (!session) throw new Error("Terminal owner session is not initialized.");
4070
+ return session.getRunOwnerDomain(handle);
4071
+ },
4017
4072
  getTerminalTurnEpoch: () => {
4018
4073
  if (!session) throw new Error("Terminal abort session is not initialized.");
4019
4074
  return session.getTerminalTurnEpoch();
@@ -4430,19 +4485,6 @@ export async function createAgentSession(options: CreateAgentSessionOptions = {}
4430
4485
  // Re-resolve the allowed set: extension factories above may have
4431
4486
  // registered providers/models that weren't visible at startup.
4432
4487
  const allowedFallbackCandidates = await resolveAllowedModels(modelRegistry, settings, modelMatchPreferences);
4433
- // A fresh provider discovery can disprove a bundled model while the
4434
- // general available catalog retains it for offline/profile compatibility.
4435
- // Exclude only those positively disproved bundled entries from the
4436
- // unconfigured startup path; explicit model/profile resolution above keeps
4437
- // its existing precedence and semantics.
4438
- const profileAvailableKeys = new Set(
4439
- modelRegistry
4440
- .getAvailableForProfileActivation()
4441
- .map(candidate => `${candidate.provider}\u0000${candidate.id}`),
4442
- );
4443
- const fallbackCandidates = allowedFallbackCandidates.filter(candidate =>
4444
- profileAvailableKeys.has(`${candidate.provider}\u0000${candidate.id}`),
4445
- );
4446
4488
  // Candidate order is not a quality signal: catalogs sort retired models
4447
4489
  // ahead of current ones whenever their IDs carry older date suffixes, so
4448
4490
  // an unconfigured install would otherwise start on a model its provider
@@ -4450,7 +4492,7 @@ export async function createAgentSession(options: CreateAgentSessionOptions = {}
4450
4492
  // first — the same table `findInitialModel` consults — and only then fall
4451
4493
  // back to catalog order.
4452
4494
  for (const candidate of orderByProviderDefaultFirst(
4453
- fallbackCandidates,
4495
+ allowedFallbackCandidates,
4454
4496
  modelRegistry.automaticProviderOrder(credentialSessionId),
4455
4497
  )) {
4456
4498
  if (await hasModelApiKey(candidate)) {
@@ -5372,6 +5414,10 @@ export async function createAgentSession(options: CreateAgentSessionOptions = {}
5372
5414
  profileAuthority,
5373
5415
  cwd: reloadCwd,
5374
5416
  disabledExtensions: settings.get("disabledExtensions"),
5417
+ allowExternalUserSkillSymlinks: resolveGlobalUserSkillLinkTrust({
5418
+ trustUserSkills: settings.getGlobal("skills.trustUserSkills"),
5419
+ enablePiUser: settings.getGlobal("skills.enablePiUser"),
5420
+ }),
5375
5421
  });
5376
5422
  return { skills: withEmbeddedDefaultGjcSkills(reloaded.skills), warnings: reloaded.warnings };
5377
5423
  }
@@ -5438,7 +5484,10 @@ export async function createAgentSession(options: CreateAgentSessionOptions = {}
5438
5484
  forkContextSeed: options.forkContextSeed,
5439
5485
  providerSessionState: options.providerSessionState,
5440
5486
  });
5441
- session.setActiveModelProfile(startupActiveModelProfile);
5487
+ // Defer profile activation until explicit model pin validation occurs (#5919).
5488
+ if (!options.deferModelProfileActivation) {
5489
+ session.setActiveModelProfile(startupActiveModelProfile);
5490
+ }
5442
5491
  if (retainedRecoveryBindingsAfterLateRestore) session.markStartupRecoveryBindingsRequired();
5443
5492
  if (recoveredSessionDefault)
5444
5493
  session.installRecoveredDefaultFallbackChain(
@@ -6007,6 +6056,9 @@ export async function createAgentSession(options: CreateAgentSessionOptions = {}
6007
6056
  gjcRuntimeSnapshot: gjcRuntimeStore,
6008
6057
  };
6009
6058
  } catch (error) {
6059
+ // Capture pending owner work before asynchronous startup teardown can yield.
6060
+ const startupPythonCleanup = disposeKernelSessionsByOwner(evalKernelOwnerId);
6061
+ void startupPythonCleanup.catch(() => {});
6010
6062
  let cleanupDiagnostic: unknown;
6011
6063
  let ownedMcpCleanupFailed = false;
6012
6064
  let ownedMcpCleanupError: unknown;
@@ -6044,6 +6096,7 @@ export async function createAgentSession(options: CreateAgentSessionOptions = {}
6044
6096
  await session.awaitDisposeCompletion();
6045
6097
  }
6046
6098
  });
6099
+ await attemptCleanup(() => startupPythonCleanup);
6047
6100
  } else {
6048
6101
  if (hasRegistered)
6049
6102
  await attemptCleanup(() => {
@@ -6068,18 +6121,8 @@ export async function createAgentSession(options: CreateAgentSessionOptions = {}
6068
6121
  ownedMcpCleanupFailed = true;
6069
6122
  ownedMcpCleanupError = cleanupError;
6070
6123
  });
6071
- const evalCleanup = Promise.all([import("../eval/py/executor"), import("../eval/js/context-manager")]);
6072
- let evalCleanupModules: Awaited<typeof evalCleanup> | undefined;
6073
- try {
6074
- evalCleanupModules = await evalCleanup;
6075
- } catch (cleanupError) {
6076
- recordCleanupFailure(cleanupError);
6077
- }
6078
- if (evalCleanupModules) {
6079
- const [kernelExecutor, contextManager] = evalCleanupModules;
6080
- await attemptCleanup(() => kernelExecutor.disposeKernelSessionsByOwner(evalKernelOwnerId));
6081
- await attemptCleanup(() => contextManager.disposeVmContextsByOwner(evalKernelOwnerId));
6082
- }
6124
+ await attemptCleanup(() => startupPythonCleanup);
6125
+ await attemptCleanup(() => disposeVmContextsByOwner(evalKernelOwnerId));
6083
6126
  await attemptCleanup(closeOwnedSettings);
6084
6127
  }
6085
6128
  if (processCwdClaimed)