@gajae-code/coding-agent 0.14.2 → 0.15.0

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 (345) hide show
  1. package/CHANGELOG.md +120 -1
  2. package/dist/types/async/job-manager.d.ts +4 -1
  3. package/dist/types/autoresearch/dashboard.d.ts +29 -4
  4. package/dist/types/autoresearch/data-context.d.ts +25 -0
  5. package/dist/types/autoresearch/git.d.ts +65 -7
  6. package/dist/types/autoresearch/harness.d.ts +58 -0
  7. package/dist/types/autoresearch/prompts.d.ts +51 -0
  8. package/dist/types/autoresearch/runs.d.ts +173 -0
  9. package/dist/types/autoresearch/types.d.ts +9 -139
  10. package/dist/types/capability/types.d.ts +20 -0
  11. package/dist/types/cli/accounts-cli.d.ts +1 -0
  12. package/dist/types/commands/{rlm.d.ts → autoresearch.d.ts} +2 -4
  13. package/dist/types/config/autorouting-contract.d.ts +146 -0
  14. package/dist/types/config/autorouting-generator.d.ts +40 -0
  15. package/dist/types/config/autorouting-tier-map.d.ts +16844 -0
  16. package/dist/types/config/autorouting.d.ts +35 -0
  17. package/dist/types/config/model-discovery-manager.d.ts +8 -1
  18. package/dist/types/config/model-registry.d.ts +30 -1
  19. package/dist/types/config/provider-selection-policy.d.ts +23 -0
  20. package/dist/types/config/settings-schema.d.ts +61 -3
  21. package/dist/types/config/settings.d.ts +3 -0
  22. package/dist/types/coordinator/contract.d.ts +1 -1
  23. package/dist/types/coordinator-mcp/durability.d.ts +29 -0
  24. package/dist/types/coordinator-mcp/event-webhook.d.ts +50 -0
  25. package/dist/types/coordinator-mcp/question-state.d.ts +1 -1
  26. package/dist/types/coordinator-mcp/server.d.ts +14 -0
  27. package/dist/types/crash/index-store.d.ts +3 -0
  28. package/dist/types/crash/record-loader.d.ts +2 -0
  29. package/dist/types/crash/upstream/relay.d.ts +5 -3
  30. package/dist/types/cursor.d.ts +12 -0
  31. package/dist/types/defaults/gjc-defaults.d.ts +35 -1
  32. package/dist/types/defaults/gjc-skills.generated.d.ts +1 -1
  33. package/dist/types/discovery/helpers.d.ts +1 -1
  34. package/dist/types/edit/index.d.ts +2 -1
  35. package/dist/types/eval/py/executor.d.ts +2 -0
  36. package/dist/types/extensibility/extensions/loader.d.ts +32 -0
  37. package/dist/types/extensibility/gjc-plugins/types.d.ts +1 -1
  38. package/dist/types/extensibility/skills.d.ts +2 -0
  39. package/dist/types/gjc-runtime/autoresearch-runtime.d.ts +194 -0
  40. package/dist/types/gjc-runtime/gc-runtime.d.ts +1 -1
  41. package/dist/types/gjc-runtime/psmux-detect.d.ts +1 -1
  42. package/dist/types/gjc-runtime/python-transcript.d.ts +19 -0
  43. package/dist/types/gjc-runtime/ralplan-runtime.d.ts +2 -8
  44. package/dist/types/gjc-runtime/session-layout.d.ts +6 -3
  45. package/dist/types/gjc-runtime/state-renderer.d.ts +0 -22
  46. package/dist/types/gjc-runtime/state-schema.d.ts +7 -7
  47. package/dist/types/gjc-runtime/tmux-common.d.ts +2 -2
  48. package/dist/types/gjc-runtime/ultragoal-change-set.d.ts +38 -1
  49. package/dist/types/gjc-runtime/ultragoal-runtime.d.ts +2 -24
  50. package/dist/types/gjc-runtime/ultragoal-validation-policy.d.ts +73 -0
  51. package/dist/types/gjc-runtime/workflow-recovery-projection.d.ts +100 -0
  52. package/dist/types/hooks/skill-keywords.d.ts +1 -1
  53. package/dist/types/main.d.ts +0 -10
  54. package/dist/types/modes/acp/acp-agent.d.ts +13 -6
  55. package/dist/types/modes/components/model-selector.d.ts +14 -0
  56. package/dist/types/modes/components/skill-hud/render.d.ts +6 -1
  57. package/dist/types/modes/components/smart-routing-panel.d.ts +82 -0
  58. package/dist/types/modes/controllers/selector-controller.d.ts +14 -0
  59. package/dist/types/modes/interactive-mode.d.ts +3 -0
  60. package/dist/types/modes/types.d.ts +9 -0
  61. package/dist/types/rlm/artifacts.d.ts +4 -4
  62. package/dist/types/runtime/optional-runtime-services.d.ts +2 -1
  63. package/dist/types/runtime/workspace-tree-service.d.ts +5 -1
  64. package/dist/types/runtime-mcp/config.d.ts +6 -0
  65. package/dist/types/runtime-mcp/manager.d.ts +10 -0
  66. package/dist/types/sdk/acp/adapter.d.ts +0 -4
  67. package/dist/types/sdk/broker/broker.d.ts +1 -1
  68. package/dist/types/sdk/broker/lifecycle.d.ts +57 -2
  69. package/dist/types/sdk/broker/session-index.d.ts +15 -0
  70. package/dist/types/sdk/bus/chat-daemon-control.d.ts +6 -0
  71. package/dist/types/sdk/bus/chat-daemon-runtime.d.ts +4 -0
  72. package/dist/types/sdk/bus/index.d.ts +8 -0
  73. package/dist/types/sdk/bus/kind-aware-reconciliation.d.ts +2 -0
  74. package/dist/types/sdk/bus/telegram-daemon-contract.d.ts +12 -2
  75. package/dist/types/sdk/client/client.d.ts +39 -4
  76. package/dist/types/sdk/host/host.d.ts +1 -0
  77. package/dist/types/sdk/host/internal-autorouting-state.d.ts +3 -0
  78. package/dist/types/sdk/host/model-pin.d.ts +29 -0
  79. package/dist/types/sdk/host/session-runtime.d.ts +2 -1
  80. package/dist/types/sdk/lifecycle-session.d.ts +13 -0
  81. package/dist/types/sdk/router/session-router.d.ts +27 -1
  82. package/dist/types/sdk/session.d.ts +11 -1
  83. package/dist/types/session/agent-session.d.ts +36 -6
  84. package/dist/types/session/artifacts.d.ts +16 -1
  85. package/dist/types/session/internal/managed-session-storage.d.ts +7 -0
  86. package/dist/types/session/session-manager.d.ts +84 -2
  87. package/dist/types/session/session-staging-paths.d.ts +3 -0
  88. package/dist/types/skill-state/canonical-skills.d.ts +1 -1
  89. package/dist/types/skill-state/workflow-hud.d.ts +12 -21
  90. package/dist/types/skill-state/workflow-mutation-guard.d.ts +1 -0
  91. package/dist/types/slash-commands/helpers/autorouting-status.d.ts +8 -0
  92. package/dist/types/system-prompt.d.ts +23 -0
  93. package/dist/types/task/executor.d.ts +35 -4
  94. package/dist/types/task/index.d.ts +17 -3
  95. package/dist/types/task/receipt.d.ts +3 -1
  96. package/dist/types/task/types.d.ts +144 -0
  97. package/dist/types/tools/atomic-file-write.d.ts +72 -0
  98. package/dist/types/tools/descriptors.d.ts +1 -0
  99. package/dist/types/tools/index.d.ts +36 -1
  100. package/dist/types/tools/move-session.d.ts +40 -0
  101. package/dist/types/tools/python.d.ts +12 -0
  102. package/dist/types/tools/resource-gc.d.ts +0 -3
  103. package/dist/types/tools/search.d.ts +8 -1
  104. package/dist/types/tools/skill.d.ts +9 -4
  105. package/dist/types/tools/subagent.d.ts +33 -3
  106. package/dist/types/utils/xml-escape.d.ts +2 -0
  107. package/dist/types/workflow/workflow-intent-diff.d.ts +2 -2
  108. package/dist/types/workflow/workflow-intent-report-consumer.d.ts +1 -1
  109. package/package.json +11 -12
  110. package/scripts/build-sdk-package-smoke.ts +7 -5
  111. package/scripts/check-autorouting-tier-map.ts +183 -0
  112. package/scripts/generate-sdk-operation-inventory.ts +12 -0
  113. package/scripts/generate-tool-catalog.ts +40 -5
  114. package/src/async/job-manager.ts +5 -2
  115. package/src/autoresearch/dashboard.ts +134 -314
  116. package/src/autoresearch/data-context.ts +35 -0
  117. package/src/autoresearch/git.ts +186 -26
  118. package/src/autoresearch/{helpers.ts → harness.ts} +65 -40
  119. package/src/autoresearch/{prompt-setup.md → prompts/prompt-setup.md} +7 -7
  120. package/src/autoresearch/prompts/prompt.md +103 -0
  121. package/src/autoresearch/prompts.ts +126 -0
  122. package/src/autoresearch/runs.ts +708 -0
  123. package/src/autoresearch/types.ts +9 -150
  124. package/src/capability/index.ts +4 -4
  125. package/src/capability/types.ts +20 -0
  126. package/src/cli/accounts-cli.ts +21 -5
  127. package/src/cli/config-cli.ts +25 -1
  128. package/src/cli/fast-help.ts +1 -2
  129. package/src/cli/list-models.ts +5 -8
  130. package/src/cli/setup-cli.ts +8 -0
  131. package/src/cli.ts +2 -21
  132. package/src/commands/autoresearch.ts +33 -0
  133. package/src/commands/coordinator.ts +15 -0
  134. package/src/commands/launch.ts +2 -4
  135. package/src/commands/quick-lane.ts +1 -1
  136. package/src/commands/sdk.ts +24 -0
  137. package/src/commands/state.ts +1 -1
  138. package/src/config/autorouting-contract.ts +474 -0
  139. package/src/config/autorouting-generator.ts +238 -0
  140. package/src/config/autorouting-tier-map.ts +6108 -0
  141. package/src/config/autorouting.ts +120 -0
  142. package/src/config/model-discovery-manager.ts +42 -11
  143. package/src/config/model-registry.ts +348 -68
  144. package/src/config/provider-selection-policy.ts +60 -9
  145. package/src/config/settings-schema.ts +195 -6
  146. package/src/config/settings.ts +62 -1
  147. package/src/config.ts +2 -3
  148. package/src/coordinator/contract.ts +0 -1
  149. package/src/coordinator-mcp/codex-handoff.ts +68 -42
  150. package/src/coordinator-mcp/durability.ts +200 -0
  151. package/src/coordinator-mcp/event-webhook.ts +278 -0
  152. package/src/coordinator-mcp/question-state.ts +109 -46
  153. package/src/coordinator-mcp/server.ts +932 -504
  154. package/src/crash/index-store.ts +126 -22
  155. package/src/crash/record-loader.ts +7 -0
  156. package/src/crash/upstream/relay.ts +82 -34
  157. package/src/cursor.ts +84 -1
  158. package/src/debug/index.ts +26 -0
  159. package/src/defaults/gjc/skills/autoresearch/SKILL.md +116 -0
  160. package/src/defaults/gjc/skills/autoresearch/auto-critic.md +46 -0
  161. package/src/defaults/gjc/skills/autoresearch/auto-iterate.md +42 -0
  162. package/src/defaults/gjc/skills/deep-interview/SKILL.md +17 -37
  163. package/src/defaults/gjc/skills/ralplan/SKILL.md +21 -18
  164. package/src/defaults/gjc/skills/ultragoal/SKILL.md +6 -17
  165. package/src/defaults/gjc/skills/ultragoal/ai-slop-cleaner.md +2 -2
  166. package/src/defaults/gjc-defaults.ts +89 -2
  167. package/src/defaults/gjc-skills.generated.ts +24 -17
  168. package/src/discovery/builtin.ts +18 -5
  169. package/src/discovery/helpers.ts +6 -6
  170. package/src/edit/index.ts +5 -2
  171. package/src/eval/py/executor.ts +8 -0
  172. package/src/extensibility/extensions/loader.ts +135 -13
  173. package/src/extensibility/extensions/wrapper.ts +1 -2
  174. package/src/extensibility/gjc-plugins/schema.ts +1 -1
  175. package/src/extensibility/runtime-skill-discovery.ts +2 -2
  176. package/src/extensibility/skill-management.ts +2 -3
  177. package/src/extensibility/skills.ts +16 -8
  178. package/src/gjc-runtime/autoresearch-runtime.ts +1509 -0
  179. package/src/gjc-runtime/gc-render.ts +0 -1
  180. package/src/gjc-runtime/gc-runtime.ts +1 -11
  181. package/src/gjc-runtime/launch-tmux.ts +3 -3
  182. package/src/gjc-runtime/psmux-detect.ts +2 -2
  183. package/src/gjc-runtime/python-transcript.ts +58 -0
  184. package/src/gjc-runtime/ralplan-runtime.ts +6 -18
  185. package/src/gjc-runtime/session-layout.ts +18 -7
  186. package/src/gjc-runtime/session-state-sidecar.ts +58 -9
  187. package/src/gjc-runtime/state-renderer.ts +0 -38
  188. package/src/gjc-runtime/state-runtime.ts +43 -22
  189. package/src/gjc-runtime/state-schema.ts +1 -1
  190. package/src/gjc-runtime/tmux-common.ts +7 -7
  191. package/src/gjc-runtime/ultragoal-change-set.ts +232 -11
  192. package/src/gjc-runtime/ultragoal-runtime.ts +309 -114
  193. package/src/gjc-runtime/ultragoal-validation-policy.ts +247 -0
  194. package/src/gjc-runtime/workflow-command-ref.ts +15 -11
  195. package/src/gjc-runtime/workflow-manifest.generated.json +413 -532
  196. package/src/gjc-runtime/workflow-manifest.ts +43 -83
  197. package/src/gjc-runtime/workflow-recovery-projection.ts +616 -0
  198. package/src/hooks/skill-keywords.ts +3 -3
  199. package/src/hooks/skill-state.ts +2 -2
  200. package/src/internal-urls/docs-index.generated.ts +26 -24
  201. package/src/lsp/index.ts +25 -5
  202. package/src/main.ts +2 -27
  203. package/src/modes/acp/acp-agent.ts +200 -75
  204. package/src/modes/components/model-selector.ts +216 -13
  205. package/src/modes/components/oauth-selector.ts +5 -5
  206. package/src/modes/components/skill-hud/render.ts +173 -35
  207. package/src/modes/components/smart-routing-panel.ts +531 -0
  208. package/src/modes/components/tool-status-header.ts +6 -3
  209. package/src/modes/controllers/command-controller.ts +17 -7
  210. package/src/modes/controllers/input-controller.ts +44 -9
  211. package/src/modes/controllers/runtime-mcp-command-controller.ts +4 -0
  212. package/src/modes/controllers/selector-controller.ts +298 -65
  213. package/src/modes/interactive-mode.ts +8 -1
  214. package/src/modes/shared/agent-wire/workflow-gate-types.ts +1 -1
  215. package/src/modes/types.ts +9 -1
  216. package/src/prompts/agents/planner.md +1 -1
  217. package/src/prompts/system/system-prompt.md +1 -1
  218. package/src/prompts/system/volatile-project-context.md +2 -1
  219. package/src/prompts/tools/move-session.md +15 -0
  220. package/src/prompts/tools/python.md +12 -0
  221. package/src/prompts/tools/skill-discovery.md +1 -1
  222. package/src/prompts/tools/skill.md +2 -2
  223. package/src/prompts/tools/task-summary.md +1 -0
  224. package/src/prompts/tools/task.md +6 -0
  225. package/src/rlm/artifacts.ts +12 -10
  226. package/src/runtime/optional-runtime-services.ts +3 -2
  227. package/src/runtime/workspace-tree-service.ts +11 -3
  228. package/src/runtime-mcp/config.ts +8 -1
  229. package/src/runtime-mcp/manager.ts +33 -0
  230. package/src/sdk/acp/adapter.ts +48 -1
  231. package/src/sdk/broker/broker.ts +30 -2
  232. package/src/sdk/broker/discovery.ts +217 -2
  233. package/src/sdk/broker/lifecycle.ts +385 -59
  234. package/src/sdk/broker/session-index.ts +243 -48
  235. package/src/sdk/broker/transport.ts +1 -0
  236. package/src/sdk/bus/chat-daemon-control.ts +8 -2
  237. package/src/sdk/bus/chat-daemon-runtime.ts +5 -0
  238. package/src/sdk/bus/index.ts +208 -11
  239. package/src/sdk/bus/kind-aware-reconciliation.ts +16 -0
  240. package/src/sdk/bus/reconciliation-store.ts +27 -5
  241. package/src/sdk/bus/telegram-daemon-contract.ts +12 -2
  242. package/src/sdk/client/client.ts +204 -22
  243. package/src/sdk/host/host.ts +16 -0
  244. package/src/sdk/host/internal-autorouting-state.ts +13 -0
  245. package/src/sdk/host/model-pin.ts +101 -0
  246. package/src/sdk/host/reverse-leases.ts +2 -1
  247. package/src/sdk/host/session-runtime.test.ts +224 -1
  248. package/src/sdk/host/session-runtime.ts +125 -37
  249. package/src/sdk/lifecycle/service.ts +3 -1
  250. package/src/sdk/lifecycle-session.ts +42 -1
  251. package/src/sdk/protocol/operation-inventory.generated.json +66 -0
  252. package/src/sdk/router/session-router.ts +375 -36
  253. package/src/sdk/session.ts +547 -47
  254. package/src/session/account-inventory.ts +1 -1
  255. package/src/session/agent-session.ts +765 -189
  256. package/src/session/artifacts.ts +234 -4
  257. package/src/session/internal/managed-session-storage.ts +91 -4
  258. package/src/session/provider-safety-stop-hint.ts +3 -2
  259. package/src/session/session-manager.ts +775 -16
  260. package/src/session/session-staging-paths.ts +8 -0
  261. package/src/setup/hermes/templates/operator-instructions.v1.md +0 -1
  262. package/src/setup/host-plugin-setup.ts +2 -2
  263. package/src/skill-state/active-state.ts +2 -2
  264. package/src/skill-state/canonical-skills.ts +1 -1
  265. package/src/skill-state/initial-phase.ts +1 -1
  266. package/src/skill-state/workflow-hud.ts +41 -41
  267. package/src/skill-state/workflow-mutation-guard.ts +26 -7
  268. package/src/slash-commands/builtin-registry.ts +77 -0
  269. package/src/slash-commands/helpers/autorouting-status.ts +55 -0
  270. package/src/system-prompt.ts +102 -5
  271. package/src/task/discovery.ts +2 -3
  272. package/src/task/executor.ts +617 -43
  273. package/src/task/index.ts +262 -15
  274. package/src/task/receipt.ts +30 -0
  275. package/src/task/render.ts +11 -1
  276. package/src/task/types.ts +316 -0
  277. package/src/tools/atomic-file-write.ts +594 -0
  278. package/src/tools/bisect.ts +3 -2
  279. package/src/tools/descriptors.test.ts +3 -0
  280. package/src/tools/descriptors.ts +24 -0
  281. package/src/tools/image-gen.ts +5 -1
  282. package/src/tools/index.ts +62 -5
  283. package/src/tools/move-session.ts +107 -0
  284. package/src/tools/python.ts +205 -0
  285. package/src/tools/read.ts +88 -15
  286. package/src/tools/renderers.ts +2 -0
  287. package/src/tools/resource-gc.ts +8 -177
  288. package/src/tools/search.ts +30 -6
  289. package/src/tools/skill-discovery.ts +1 -0
  290. package/src/tools/skill.ts +37 -7
  291. package/src/tools/subagent-render.ts +119 -13
  292. package/src/tools/subagent.ts +91 -74
  293. package/src/tools/tool-catalog.generated.ts +64 -2
  294. package/src/tools/write.ts +16 -12
  295. package/src/utils/xml-escape.ts +14 -0
  296. package/src/web/search/providers/codex.ts +2 -2
  297. package/src/workflow/workflow-intent-diff.ts +13 -12
  298. package/src/workflow/workflow-intent-report-consumer.ts +6 -6
  299. package/dist/types/autoresearch/helpers.d.ts +0 -24
  300. package/dist/types/autoresearch/index.d.ts +0 -2
  301. package/dist/types/autoresearch/state.d.ts +0 -17
  302. package/dist/types/autoresearch/storage.d.ts +0 -142
  303. package/dist/types/autoresearch/tools/init-experiment.d.ts +0 -31
  304. package/dist/types/autoresearch/tools/log-experiment.d.ts +0 -23
  305. package/dist/types/autoresearch/tools/run-experiment.d.ts +0 -8
  306. package/dist/types/autoresearch/tools/update-notes.d.ts +0 -12
  307. package/dist/types/commands/team.d.ts +0 -24
  308. package/dist/types/gjc-runtime/team-gc.d.ts +0 -7
  309. package/dist/types/gjc-runtime/team-launch.d.ts +0 -61
  310. package/dist/types/gjc-runtime/team-notify.d.ts +0 -45
  311. package/dist/types/gjc-runtime/team-runtime.d.ts +0 -336
  312. package/dist/types/gjc-runtime/team-store.d.ts +0 -168
  313. package/dist/types/gjc-runtime/team-worker-heartbeat.d.ts +0 -43
  314. package/dist/types/gjc-runtime/team-worker-memory-guard.d.ts +0 -92
  315. package/dist/types/gjc-runtime/team-workers.d.ts +0 -83
  316. package/dist/types/rlm/index.d.ts +0 -47
  317. package/dist/types/rlm/preset.d.ts +0 -23
  318. package/dist/types/rlm/python-tool.d.ts +0 -16
  319. package/src/autoresearch/command-resume.md +0 -14
  320. package/src/autoresearch/index.ts +0 -536
  321. package/src/autoresearch/prompt.md +0 -103
  322. package/src/autoresearch/resume-message.md +0 -10
  323. package/src/autoresearch/state.ts +0 -273
  324. package/src/autoresearch/storage.ts +0 -699
  325. package/src/autoresearch/tools/init-experiment.ts +0 -272
  326. package/src/autoresearch/tools/log-experiment.ts +0 -524
  327. package/src/autoresearch/tools/run-experiment.ts +0 -475
  328. package/src/autoresearch/tools/update-notes.ts +0 -109
  329. package/src/commands/rlm.ts +0 -19
  330. package/src/commands/team.ts +0 -238
  331. package/src/defaults/gjc/skills/deep-interview/auto-research-greenfield.md +0 -42
  332. package/src/defaults/gjc/skills/team/SKILL.md +0 -467
  333. package/src/gjc-runtime/team-gc.ts +0 -49
  334. package/src/gjc-runtime/team-launch.ts +0 -404
  335. package/src/gjc-runtime/team-notify.ts +0 -326
  336. package/src/gjc-runtime/team-runtime.ts +0 -5923
  337. package/src/gjc-runtime/team-store.ts +0 -878
  338. package/src/gjc-runtime/team-worker-heartbeat.ts +0 -149
  339. package/src/gjc-runtime/team-worker-memory-guard.ts +0 -363
  340. package/src/gjc-runtime/team-workers.ts +0 -1123
  341. package/src/prompts/system/rlm-report-command.md +0 -1
  342. package/src/prompts/system/rlm-research.md +0 -23
  343. package/src/rlm/index.ts +0 -365
  344. package/src/rlm/preset.ts +0 -76
  345. package/src/rlm/python-tool.ts +0 -68
@@ -14,6 +14,7 @@ import { resolveModelChainWithAuth, splitSelectorThinkingSuffix } from "../../co
14
14
  import { type ModelSelectorValue, normalizeModelSelectorValue } from "../../config/model-selector-value";
15
15
  import { type Settings, validateSettingPatch } from "../../config/settings";
16
16
  import type { ExtensionAPI, ExtensionCommandContext, ExtensionContext } from "../../extensibility/extensions";
17
+ import { normalizeGoal } from "../../goals/state";
17
18
  import {
18
19
  boundTerminalRetentionState,
19
20
  findOwnedRegistrationsForTurn,
@@ -45,6 +46,7 @@ import {
45
46
  import { type ControlSurface, controlRequestFromFrame, dispatchControl } from "./control";
46
47
  import { BROKER_RUNTIME_CLOSE_CAPABILITY_FIELD } from "./control/runtime-gate";
47
48
  import { SessionSdkHost, type SessionSdkHostOptions } from "./host";
49
+ import { clearAutoroutingInactive, isAutoroutingInactive, markAutoroutingInactive } from "./internal-autorouting-state";
48
50
  import { CursorRegistry, QueryHandlers, RevisionStore, type SessionSurface } from "./query";
49
51
  import {
50
52
  createSdkCapabilities,
@@ -385,9 +387,10 @@ export interface CreateSdkSessionRuntimeOptions {
385
387
  stateRoot: string;
386
388
  token: string;
387
389
  }): SessionSdkTransport | Promise<SessionSdkTransport>;
388
- onSdkRequest?: SessionSdkHostOptions["onRequest"];
389
390
  /** Session settings; enables `config.patch` application on this runtime. */
390
391
  settings?: Settings;
392
+ /** Callback for diagnostics and lifecycle request observation. */
393
+ onSdkRequest?: SessionSdkHostOptions["onRequest"];
391
394
  /** Mutable shadow of patched config values merged into query readback. */
392
395
  configOverrides?: Map<string, unknown>;
393
396
  /** Private session-owned terminal-abort capabilities; never exposed on ExtensionContext. */
@@ -869,6 +872,48 @@ function createQuerySurface(
869
872
  throw error;
870
873
  }
871
874
  };
875
+ const getDurableGoalState = (): { kind: "state"; state: unknown } | { kind: "empty" } | { kind: "unavailable" } => {
876
+ // A recreated SDK host can observe the session before its in-memory goal
877
+ // projection is hydrated. The latest mode_change is the durable authority;
878
+ // never borrow a goal from another session or an older branch.
879
+ let branch: ReturnType<ExtensionContext["sessionManager"]["getBranch"]>;
880
+ try {
881
+ branch = ctx.sessionManager.getBranch();
882
+ } catch {
883
+ return { kind: "unavailable" };
884
+ }
885
+ for (const entry of branch.toReversed()) {
886
+ if (entry.type !== "mode_change") continue;
887
+ if (entry.mode !== "goal" && entry.mode !== "goal_paused") return { kind: "empty" };
888
+ const goal = normalizeGoal(entry.data?.goal);
889
+ if (!goal) return { kind: "unavailable" };
890
+ return { kind: "state", state: { enabled: entry.mode === "goal", mode: "active", goal } };
891
+ }
892
+ return { kind: "empty" };
893
+ };
894
+ const getGoalState = (): unknown => {
895
+ const liveState =
896
+ typeof (ctx as Partial<ExtensionContext>).getGoalState === "function" ? ctx.getGoalState() : undefined;
897
+ if (liveState !== undefined) return liveState;
898
+ const durableState = getDurableGoalState();
899
+ if (durableState.kind === "state") return durableState.state;
900
+ if (durableState.kind === "unavailable")
901
+ return {
902
+ enabled: false,
903
+ goal: null,
904
+ reason: "goal_state_unavailable",
905
+ recoverable: true,
906
+ message:
907
+ "The authoritative goal state could not be recovered from this session. Reconnect or resume the session before retrying.",
908
+ };
909
+ return {
910
+ enabled: false,
911
+ goal: null,
912
+ reason: "no_active_goal",
913
+ message:
914
+ "No goal is active in this session: goal mode has not created or resumed a goal, so no goal snapshot exists yet.",
915
+ };
916
+ };
872
917
  return {
873
918
  getTranscriptEntries: () =>
874
919
  typeof (ctx as Partial<ExtensionContext>).getTranscript === "function" ? ctx.getTranscript() : [],
@@ -877,8 +922,7 @@ function createQuerySurface(
877
922
  systemPrompt: ctx.getSystemPrompt(),
878
923
  ...getLiveState(),
879
924
  }),
880
- getGoalState: () =>
881
- typeof (ctx as Partial<ExtensionContext>).getGoalState === "function" ? ctx.getGoalState() : undefined,
925
+ getGoalState,
882
926
  getTodoState: () =>
883
927
  typeof (ctx as Partial<ExtensionContext>).getTodoState === "function" ? ctx.getTodoState() : [],
884
928
  getDiff,
@@ -1222,6 +1266,7 @@ function createControlSurface(
1222
1266
  settings?: Settings,
1223
1267
  configOverrides?: Map<string, unknown>,
1224
1268
  configRevision: { current: number } = { current: 0 },
1269
+ getRuntimeHost: () => SessionSdkHost | undefined = () => undefined,
1225
1270
  terminalAbortSeams?: SdkOnlyTerminalAbortSeams,
1226
1271
  terminalPublicationCapture?: { resolvers?: Array<(observed: boolean) => void> },
1227
1272
  activePromptOwnerHolder?: { connectionIds?: ReadonlySet<string> },
@@ -2351,8 +2396,8 @@ function createControlSurface(
2351
2396
  // Follow-ups never start inline; ownership correlates at promotion.
2352
2397
  true,
2353
2398
  ),
2354
- abort: () => {
2355
- ctx.abort();
2399
+ abort: async () => {
2400
+ await Promise.resolve(ctx.abort()).catch(() => undefined);
2356
2401
  return { aborted: true };
2357
2402
  },
2358
2403
  abortTerminal: terminalAbort,
@@ -2477,10 +2522,24 @@ function createControlSurface(
2477
2522
  }
2478
2523
  if (!settings) return unavailable("config.patch")();
2479
2524
  const applyPatch = async () => {
2525
+ const wasAutoroutingInactive =
2526
+ settings.get("task.autorouting.enabled") === true && !settings.getEffectiveAutorouting().active;
2480
2527
  const entries = Object.entries(patch as Record<string, unknown>);
2481
2528
  for (const [key, value] of entries) settings.set(key as never, value as never);
2482
2529
  if (configOverrides) for (const [key, value] of entries) configOverrides.set(key, value);
2483
2530
  configRevision.current += 1;
2531
+ const isAutoroutingInactiveNow =
2532
+ settings.get("task.autorouting.enabled") === true && !settings.getEffectiveAutorouting().active;
2533
+ if (isAutoroutingInactiveNow && !wasAutoroutingInactive) {
2534
+ const host = getRuntimeHost();
2535
+ if (host) {
2536
+ markAutoroutingInactive(host);
2537
+ if (host.started) host.emitAutoroutingInactiveNotice();
2538
+ }
2539
+ } else if (!isAutoroutingInactiveNow && wasAutoroutingInactive) {
2540
+ const host = getRuntimeHost();
2541
+ if (host) clearAutoroutingInactive(host);
2542
+ }
2484
2543
  return { patched: entries.map(([key]) => key), revision: String(configRevision.current) };
2485
2544
  };
2486
2545
  // Serialize config mutations against synthetic profile activation and
@@ -2573,6 +2632,13 @@ export function createSdkSessionRuntimeExtension(api: ExtensionAPI, options: Cre
2573
2632
  waitForGateResolutionQuiescence: () => Promise<void>;
2574
2633
  activeInvocation?: { kind: InvocationKind; correlation: InvocationCorrelation };
2575
2634
  drainedInvocations?: Array<{ kind: InvocationKind; correlation: InvocationCorrelation }>;
2635
+ openLifecycleBatches: Array<{
2636
+ invocations: Array<{
2637
+ kind: InvocationKind;
2638
+ correlation: InvocationCorrelation;
2639
+ connectionId: string | undefined;
2640
+ }>;
2641
+ }>;
2576
2642
  disposeGate?: () => void;
2577
2643
  }
2578
2644
  | undefined;
@@ -2594,6 +2660,28 @@ export function createSdkSessionRuntimeExtension(api: ExtensionAPI, options: Cre
2594
2660
  const emitLifecycle = async (type: "agent_start" | "agent_end", ctx: ExtensionContext): Promise<void> => {
2595
2661
  const current = active;
2596
2662
  if (!current) return;
2663
+ const adoptLifecycleBatch = (
2664
+ batch:
2665
+ | Array<{
2666
+ kind: InvocationKind;
2667
+ correlation: InvocationCorrelation;
2668
+ connectionId: string | undefined;
2669
+ }>
2670
+ | undefined,
2671
+ ): void => {
2672
+ if (!batch || batch.length === 0) {
2673
+ current.activeInvocation = undefined;
2674
+ current.drainedInvocations = undefined;
2675
+ activePromptOwnerHolder.connectionIds = undefined;
2676
+ return;
2677
+ }
2678
+ current.activeInvocation = batch[0];
2679
+ current.drainedInvocations = batch.map(({ kind, correlation }) => ({ kind, correlation }));
2680
+ const owners = new Set<string>();
2681
+ for (const entry of batch) if (entry.connectionId !== undefined) owners.add(entry.connectionId);
2682
+ activePromptOwnerHolder.connectionIds = owners;
2683
+ };
2684
+ let transitions: Array<{ kind: InvocationKind; correlation: InvocationCorrelation }> = [];
2597
2685
  if (type === "agent_start") {
2598
2686
  // Drain EVERY entry admitted for this run: a continuation may promote
2599
2687
  // several follow-ups (each with its own requester correlation) into one
@@ -2603,19 +2691,24 @@ export function createSdkSessionRuntimeExtension(api: ExtensionAPI, options: Cre
2603
2691
  // continuation agent_start with an empty queue leaves the current owner
2604
2692
  // untouched (review thread P1).
2605
2693
  const drained = current.pending.splice(0);
2606
- current.activeInvocation = drained[0];
2607
2694
  if (drained.length > 0) {
2608
- const owners = new Set<string>();
2609
- for (const entry of drained) if (entry.connectionId !== undefined) owners.add(entry.connectionId);
2610
- activePromptOwnerHolder.connectionIds = owners;
2611
- // A single run may drain several follow-ups promoted together; each
2612
- // has its own durable record that must reach terminal state, so keep
2613
- // the full batch for the transition pass below (review thread P1).
2614
- current.drainedInvocations = drained.map(({ kind, correlation }) => ({ kind, correlation }));
2615
- }
2616
- if (current.activeInvocation?.kind === "prompt") {
2617
- current.deadlineManager.onAccepted(current.activeInvocation.correlation);
2695
+ current.openLifecycleBatches.push({ invocations: drained });
2696
+ adoptLifecycleBatch(drained);
2697
+ if (current.activeInvocation?.kind === "prompt") {
2698
+ current.deadlineManager.onAccepted(current.activeInvocation.correlation);
2699
+ }
2618
2700
  }
2701
+ transitions = drained.map(({ kind, correlation }) => ({ kind, correlation }));
2702
+ } else {
2703
+ // Pair this agent_end with the oldest unmatched start. A delayed
2704
+ // aborted-turn end that lands after a successor agent_start must
2705
+ // terminalize the aborted invocation, never the successor.
2706
+ const ended = current.openLifecycleBatches[0];
2707
+ transitions = ended
2708
+ ? ended.invocations.map(({ kind, correlation }) => ({ kind, correlation }))
2709
+ : current.activeInvocation
2710
+ ? [current.activeInvocation]
2711
+ : [];
2619
2712
  }
2620
2713
  // Observe whether the lifecycle publication actually landed: a terminal
2621
2714
  // abort awaits this result so its durable row only claims
@@ -2624,12 +2717,6 @@ export function createSdkSessionRuntimeExtension(api: ExtensionAPI, options: Cre
2624
2717
  // recorded as observed=false, never rethrown into the api handler.
2625
2718
  let observed = true;
2626
2719
  try {
2627
- const transitions =
2628
- current.drainedInvocations && current.drainedInvocations.length > 0
2629
- ? current.drainedInvocations
2630
- : current.activeInvocation
2631
- ? [current.activeInvocation]
2632
- : [];
2633
2720
  for (const invocation of transitions) {
2634
2721
  await current.reconciliation.noteTransition(invocation.kind, invocation.correlation, { type } as never);
2635
2722
  if ((type as string) === "agent_end" || (type as string) === "agent_failed") {
@@ -2641,20 +2728,10 @@ export function createSdkSessionRuntimeExtension(api: ExtensionAPI, options: Cre
2641
2728
  observed = false;
2642
2729
  }
2643
2730
  if (type === "agent_end") {
2644
- if (current.activeInvocation?.kind === "prompt") {
2645
- current.deadlineManager.clear(current.activeInvocation.correlation);
2646
- } else if (current.drainedInvocations) {
2647
- for (const inv of current.drainedInvocations)
2648
- if (inv.kind === "prompt") current.deadlineManager.clear(inv.correlation);
2649
- }
2650
- current.activeInvocation = undefined;
2651
- current.drainedInvocations = undefined;
2652
- // The turn is over: no connection owns it anymore. Clearing here means
2653
- // an abort against a later agent-initiated turn (monitor/cron
2654
- // follow-up) finds no owner and fails closed, instead of letting the
2655
- // previous prompt's owner stop a turn it did not submit (review
2656
- // thread P1).
2657
- activePromptOwnerHolder.connectionIds = undefined;
2731
+ if (current.openLifecycleBatches.length > 0) current.openLifecycleBatches.shift();
2732
+ for (const invocation of transitions)
2733
+ if (invocation.kind === "prompt") current.deadlineManager.clear(invocation.correlation);
2734
+ adoptLifecycleBatch(current.openLifecycleBatches[0]?.invocations);
2658
2735
  // Resolve EVERY concurrent waiter for the aborted turn: the turn emits
2659
2736
  // exactly one agent_end, and each admitted abort of it must observe the
2660
2737
  // same publication result rather than a single latest-wins slot (review
@@ -2728,6 +2805,13 @@ export function createSdkSessionRuntimeExtension(api: ExtensionAPI, options: Cre
2728
2805
  correlation: InvocationCorrelation;
2729
2806
  connectionId: string | undefined;
2730
2807
  }> = [];
2808
+ const openLifecycleBatches: Array<{
2809
+ invocations: Array<{
2810
+ kind: InvocationKind;
2811
+ correlation: InvocationCorrelation;
2812
+ connectionId: string | undefined;
2813
+ }>;
2814
+ }> = [];
2731
2815
  const configRevision = { current: 0 };
2732
2816
  let acceptingGateResolutions = true;
2733
2817
  const inFlightGateResolutions = new Set<Promise<unknown>>();
@@ -2754,6 +2838,7 @@ export function createSdkSessionRuntimeExtension(api: ExtensionAPI, options: Cre
2754
2838
  settings: options.settings,
2755
2839
  });
2756
2840
  const queryHandlers = new QueryHandlers(surfaceFactory.query, sessionId, revisions, cursors);
2841
+ let runtime: SessionSdkSessionRuntime;
2757
2842
  const controlSurface = createControlSurface(
2758
2843
  ctx,
2759
2844
  api,
@@ -2778,6 +2863,7 @@ export function createSdkSessionRuntimeExtension(api: ExtensionAPI, options: Cre
2778
2863
  options.settings,
2779
2864
  options.configOverrides,
2780
2865
  configRevision,
2866
+ () => runtime?.host,
2781
2867
  options.terminalAbortSeams,
2782
2868
  terminalPublicationCapture,
2783
2869
  activePromptOwnerHolder,
@@ -2793,7 +2879,6 @@ export function createSdkSessionRuntimeExtension(api: ExtensionAPI, options: Cre
2793
2879
  () => acceptingGateResolutions,
2794
2880
  trackGateResolution,
2795
2881
  );
2796
- let runtime: SessionSdkSessionRuntime;
2797
2882
  const installProviderDefinitions = (capability: string, definitions: unknown): void => {
2798
2883
  if (capability === "permission") {
2799
2884
  ctx.setSdkPermissionProvider?.(async (toolCall, permissionOptions, signal) => {
@@ -2969,6 +3054,7 @@ export function createSdkSessionRuntimeExtension(api: ExtensionAPI, options: Cre
2969
3054
  if (request.operation === "session.close" && response.ok === true) ctx.shutdown();
2970
3055
  },
2971
3056
  });
3057
+ if (isAutoroutingInactive(api)) markAutoroutingInactive(runtime.host);
2972
3058
  const disposeGate = ctx.workflowGate?.onGateEmitted?.(gate =>
2973
3059
  runtime.emitEvent({ kind: "workflow_gate", payload: gate }),
2974
3060
  );
@@ -3003,6 +3089,7 @@ export function createSdkSessionRuntimeExtension(api: ExtensionAPI, options: Cre
3003
3089
  steerReconciliation,
3004
3090
  deadlineManager,
3005
3091
  pending,
3092
+ openLifecycleBatches,
3006
3093
  registerBroker,
3007
3094
  fenceGateResolutions: () => {
3008
3095
  acceptingGateResolutions = false;
@@ -3031,6 +3118,7 @@ export function createSdkSessionRuntimeExtension(api: ExtensionAPI, options: Cre
3031
3118
  steerReconciliation,
3032
3119
  deadlineManager,
3033
3120
  pending,
3121
+ openLifecycleBatches,
3034
3122
  registerBroker,
3035
3123
  fenceGateResolutions: () => {
3036
3124
  acceptingGateResolutions = false;
@@ -421,7 +421,9 @@ function sessionResult(value: unknown, expectedSessionId?: string): SessionLifec
421
421
  note?: string;
422
422
  } = { sessionId };
423
423
  if (typeof record.cwd === "string") result.cwd = record.cwd;
424
- if (typeof record.endpointGeneration === "number") result.endpointGeneration = record.endpointGeneration;
424
+ const endpointGeneration = record.endpointGeneration;
425
+ if (typeof endpointGeneration === "number" && Number.isSafeInteger(endpointGeneration) && endpointGeneration > 0)
426
+ result.endpointGeneration = endpointGeneration;
425
427
  if (typeof record.reused === "boolean") result.reused = record.reused;
426
428
  if (typeof record.note === "string") result.note = record.note;
427
429
  return result;
@@ -1,3 +1,4 @@
1
+ import { parseModelString } from "../config/model-resolver";
1
2
  import type { AgentSession } from "../session/agent-session";
2
3
  import { type CreateAgentSessionOptions, createAgentSession } from "./session";
3
4
  import {
@@ -29,6 +30,19 @@ export type CreateLifecycleAgentSessionResult =
29
30
  * unbounded LLM work, so deferral is an invariant rather than a caller choice.
30
31
  */
31
32
  export type CreateLifecycleAgentSessionOptions = Omit<CreateAgentSessionOptions, "deferMemoryBackendStartup"> & {
33
+ /**
34
+ * Explicit model pin (#4707): the coordinator-resolved `provider/model`
35
+ * selector, forwarded as {@link CreateAgentSessionOptions.modelPattern} so
36
+ * the session resolves it through the same staged selector resolver the CLI
37
+ * `--model` flag uses (after extension providers register).
38
+ *
39
+ * Resolution is strict: if this child's registry cannot resolve the pin to
40
+ * exactly this model, construction fails and the partial session is
41
+ * disposed instead of continuing into startup profile application, which
42
+ * would otherwise activate `modelProfile.default`/`mpreset` while the
43
+ * coordinator reports the requested pin.
44
+ */
45
+ modelId?: string;
32
46
  /**
33
47
  * Startup budget for ACP lifecycle MCP launches, in milliseconds. Set only
34
48
  * when the lifecycle request supplies `mcpServers`; ordinary consumers keep
@@ -50,9 +64,13 @@ export async function createLifecycleAgentSession(
50
64
  const rollback = new SdkStartupRollbackTracker();
51
65
  const capability = new SdkStartupCapability(rollback, options.readiness ?? "immediate");
52
66
  try {
53
- const { mcpStartupTimeoutMs, readiness: _readiness, ...sessionOptions } = options;
67
+ const { modelId, mcpStartupTimeoutMs, readiness: _readiness, ...sessionOptions } = options;
54
68
  const internalOptions = {
55
69
  ...sessionOptions,
70
+ // Explicit model pin (#4707): resolve through the staged selector
71
+ // resolver after extension providers register (modelPattern), so the
72
+ // pin matches CLI `--model` semantics instead of bypassing them.
73
+ ...(modelId !== undefined ? { modelPattern: modelId } : {}),
56
74
  // Memory startup (rollout summarisation) issues one LLM request per
57
75
  // claimed rollout, so its duration scales with the backlog. Keeping it
58
76
  // inside the broker's readiness window is what kills the child at the
@@ -65,6 +83,29 @@ export async function createLifecycleAgentSession(
65
83
  [lifecycleMcpStartupTimeoutOption]?: number;
66
84
  };
67
85
  const result = await createAgentSession(internalOptions);
86
+ // Explicit model pin (#4707) is a guarantee, not a preference. The
87
+ // coordinator validated the selector against its own registry; this child
88
+ // owns the registry that actually serves requests, and the two can drift
89
+ // (a model removed, a provider disabled, an extension that failed to
90
+ // register). On drift `createAgentSession` returns a session with no model
91
+ // plus a fallback warning, and the startup profile pass that runs next
92
+ // would activate `modelProfile.default`/`mpreset` instead — publishing
93
+ // success on a model the caller never asked for. Fail before readiness and
94
+ // before any profile application, and dispose the partial session.
95
+ if (modelId !== undefined) {
96
+ const active = result.session.model;
97
+ const activeSelector = active ? `${active.provider}/${active.id}` : undefined;
98
+ const expected = parseModelString(modelId);
99
+ const expectedSelector = expected ? `${expected.provider}/${expected.id}` : modelId;
100
+ if (!activeSelector || activeSelector.toLowerCase() !== expectedSelector.toLowerCase()) {
101
+ await result.session.dispose().catch(() => {});
102
+ throw new Error(
103
+ `Model "${modelId}" not found. Use --list-models to see available models.${
104
+ activeSelector ? ` Session resolved ${activeSelector} instead.` : ""
105
+ }`,
106
+ );
107
+ }
108
+ }
68
109
  if (!result.session.extensionRunner)
69
110
  capability.settleFailure(capability.normalizeFailure("registration", "runner_absent"));
70
111
  if (!result.startDeferredMemoryBackend)
@@ -1854,6 +1854,17 @@
1854
1854
  "packages/coding-agent/test/sdk-operation-inventory.test.ts"
1855
1855
  ]
1856
1856
  },
1857
+ {
1858
+ "sourceId": "slash_command:routing",
1859
+ "sourceFile": "packages/coding-agent/src/slash-commands/builtin-registry.ts",
1860
+ "sourceKind": "slash_command",
1861
+ "decision": "exclude",
1862
+ "rationale": "visual/local-only autorouting settings toggle and smart-routing panel entry, not a user-facing SDK control seam",
1863
+ "exclusionMetadata": {
1864
+ "adapterMappings": "not_applicable",
1865
+ "testIds": "not_applicable"
1866
+ }
1867
+ },
1857
1868
  {
1858
1869
  "sourceId": "slash_command:export",
1859
1870
  "sourceFile": "packages/coding-agent/src/slash-commands/builtin-registry.ts",
@@ -2446,6 +2457,39 @@
2446
2457
  "testIds": "not_applicable"
2447
2458
  }
2448
2459
  },
2460
+ {
2461
+ "sourceId": "agent_session:getEffectiveActiveWorkflowSkillState",
2462
+ "sourceFile": "packages/coding-agent/src/session/agent-session.ts",
2463
+ "sourceKind": "agent_session",
2464
+ "decision": "exclude",
2465
+ "rationale": "internal restored-or-live workflow guard for session rescope, not a user-facing SDK control seam",
2466
+ "exclusionMetadata": {
2467
+ "adapterMappings": "not_applicable",
2468
+ "testIds": "not_applicable"
2469
+ }
2470
+ },
2471
+ {
2472
+ "sourceId": "agent_session:replaceOwnedMcpManager",
2473
+ "sourceFile": "packages/coding-agent/src/session/agent-session.ts",
2474
+ "sourceKind": "agent_session",
2475
+ "decision": "exclude",
2476
+ "rationale": "internal cwd-rebinding helper for owned MCP authority after move_session, not a user-facing SDK control seam",
2477
+ "exclusionMetadata": {
2478
+ "adapterMappings": "not_applicable",
2479
+ "testIds": "not_applicable"
2480
+ }
2481
+ },
2482
+ {
2483
+ "sourceId": "agent_session:replaceNamedCustomTools",
2484
+ "sourceFile": "packages/coding-agent/src/session/agent-session.ts",
2485
+ "sourceKind": "agent_session",
2486
+ "decision": "exclude",
2487
+ "rationale": "internal cwd-rebinding helper for named custom tools after move_session, not a user-facing SDK control seam",
2488
+ "exclusionMetadata": {
2489
+ "adapterMappings": "not_applicable",
2490
+ "testIds": "not_applicable"
2491
+ }
2492
+ },
2449
2493
  {
2450
2494
  "sourceId": "agent_session:getActiveSkillPhase",
2451
2495
  "sourceFile": "packages/coding-agent/src/session/agent-session.ts",
@@ -3693,6 +3737,28 @@
3693
3737
  "testIds": "not_applicable"
3694
3738
  }
3695
3739
  },
3740
+ {
3741
+ "sourceId": "agent_session:replaceSkills",
3742
+ "sourceFile": "packages/coding-agent/src/session/agent-session.ts",
3743
+ "sourceKind": "agent_session",
3744
+ "decision": "exclude",
3745
+ "rationale": "internal cwd-rebinding helper for session skills after move_session, not a user-facing SDK control seam",
3746
+ "exclusionMetadata": {
3747
+ "adapterMappings": "not_applicable",
3748
+ "testIds": "not_applicable"
3749
+ }
3750
+ },
3751
+ {
3752
+ "sourceId": "agent_session:retireWorkspaceTreeForRescope",
3753
+ "sourceFile": "packages/coding-agent/src/session/agent-session.ts",
3754
+ "sourceKind": "agent_session",
3755
+ "decision": "exclude",
3756
+ "rationale": "internal cwd-rebinding helper that retires the cached workspace tree after move_session, not a user-facing SDK control seam",
3757
+ "exclusionMetadata": {
3758
+ "adapterMappings": "not_applicable",
3759
+ "testIds": "not_applicable"
3760
+ }
3761
+ },
3696
3762
  {
3697
3763
  "sourceId": "agent_session:getTodoPhases",
3698
3764
  "sourceFile": "packages/coding-agent/src/session/agent-session.ts",