@gajae-code/coding-agent 0.10.2 → 0.11.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 (476) hide show
  1. package/CHANGELOG.md +58 -2
  2. package/dist/types/append-only-mode.d.ts +1 -1
  3. package/dist/types/async/job-manager.d.ts +46 -7
  4. package/dist/types/cli/args.d.ts +4 -5
  5. package/dist/types/cli/daemon-cli.d.ts +12 -1
  6. package/dist/types/cli/notify-cli.d.ts +21 -1
  7. package/dist/types/cli.d.ts +3 -0
  8. package/dist/types/commands/daemon.d.ts +39 -0
  9. package/dist/types/commands/launch.d.ts +3 -0
  10. package/dist/types/commands/notify.d.ts +28 -1
  11. package/dist/types/commands/sdk.d.ts +33 -0
  12. package/dist/types/config/atomic-yaml-patch.d.ts +85 -0
  13. package/dist/types/config/model-profile-activation.d.ts +35 -15
  14. package/dist/types/config/model-profiles.d.ts +11 -5
  15. package/dist/types/config/model-registry.d.ts +3 -3
  16. package/dist/types/config/model-resolver.d.ts +39 -6
  17. package/dist/types/config/model-selector-value.d.ts +17 -0
  18. package/dist/types/config/models-config-schema.d.ts +10 -6
  19. package/dist/types/config/settings-schema.d.ts +133 -6
  20. package/dist/types/config/settings.d.ts +63 -35
  21. package/dist/types/coordinator-mcp/model-preset.d.ts +7 -6
  22. package/dist/types/coordinator-mcp/server.d.ts +6 -49
  23. package/dist/types/daemon/builtin.d.ts +6 -5
  24. package/dist/types/daemon/control-types.d.ts +1 -1
  25. package/dist/types/discovery/mcp-json.d.ts +12 -1
  26. package/dist/types/extensibility/custom-tools/types.d.ts +1 -1
  27. package/dist/types/extensibility/extensions/compact-handler.d.ts +4 -2
  28. package/dist/types/extensibility/extensions/get-commands-handler.d.ts +2 -2
  29. package/dist/types/extensibility/extensions/loader.d.ts +10 -1
  30. package/dist/types/extensibility/extensions/runner.d.ts +3 -3
  31. package/dist/types/extensibility/extensions/types.d.ts +141 -16
  32. package/dist/types/extensibility/hooks/types.d.ts +1 -1
  33. package/dist/types/gjc-runtime/launch-tmux.d.ts +3 -2
  34. package/dist/types/gjc-runtime/psmux-detect.d.ts +3 -0
  35. package/dist/types/gjc-runtime/session-state-sidecar.d.ts +3 -0
  36. package/dist/types/gjc-runtime/team-runtime.d.ts +3 -4
  37. package/dist/types/gjc-runtime/tmux-owner-isolation-cli.d.ts +13 -0
  38. package/dist/types/gjc-runtime/tmux-sessions.d.ts +4 -1
  39. package/dist/types/gjc-runtime/ultragoal-receipt-freshness.d.ts +11 -0
  40. package/dist/types/gjc-runtime/windows-powershell-command.d.ts +9 -0
  41. package/dist/types/harness-control-plane/operate.d.ts +5 -5
  42. package/dist/types/harness-control-plane/owner.d.ts +18 -4
  43. package/dist/types/harness-control-plane/receipts.d.ts +0 -1
  44. package/dist/types/harness-control-plane/sdk-transport.d.ts +43 -0
  45. package/dist/types/harness-control-plane/session-transport.d.ts +48 -0
  46. package/dist/types/harness-control-plane/types.d.ts +3 -4
  47. package/dist/types/lsp/index.d.ts +1 -1
  48. package/dist/types/main.d.ts +32 -38
  49. package/dist/types/modes/acp/acp-agent.d.ts +224 -53
  50. package/dist/types/modes/acp/acp-client-bridge.d.ts +1 -0
  51. package/dist/types/modes/acp/acp-mode.d.ts +6 -15
  52. package/dist/types/modes/acp/permission-mode.d.ts +4 -0
  53. package/dist/types/modes/acp/startup-options.d.ts +6 -0
  54. package/dist/types/modes/components/agent-dashboard.d.ts +3 -0
  55. package/dist/types/modes/components/model-selector.d.ts +1 -0
  56. package/dist/types/modes/components/notifications-settings-editor.d.ts +135 -0
  57. package/dist/types/modes/components/settings-selector.d.ts +6 -4
  58. package/dist/types/modes/components/welcome.d.ts +1 -1
  59. package/dist/types/modes/controllers/command-controller.d.ts +2 -2
  60. package/dist/types/modes/controllers/extension-ui-controller.d.ts +1 -0
  61. package/dist/types/modes/controllers/selector-controller.d.ts +35 -1
  62. package/dist/types/modes/index.d.ts +0 -4
  63. package/dist/types/modes/interactive-mode.d.ts +5 -2
  64. package/dist/types/modes/runtime-init.d.ts +2 -2
  65. package/dist/types/modes/shared/agent-wire/approval-gate.d.ts +6 -9
  66. package/dist/types/modes/shared/agent-wire/deep-interview-gate.d.ts +4 -6
  67. package/dist/types/modes/shared/agent-wire/event-contract.d.ts +6 -6
  68. package/dist/types/modes/shared/agent-wire/event-envelope.d.ts +4 -9
  69. package/dist/types/modes/shared/agent-wire/event-observation.d.ts +1 -1
  70. package/dist/types/modes/shared/agent-wire/workflow-gate-broker.d.ts +170 -30
  71. package/dist/types/modes/shared/agent-wire/workflow-gate-schema.d.ts +7 -7
  72. package/dist/types/modes/shared/agent-wire/workflow-gate-types.d.ts +105 -0
  73. package/dist/types/modes/types.d.ts +7 -2
  74. package/dist/types/runtime-mcp/client.d.ts +2 -0
  75. package/dist/types/runtime-mcp/config.d.ts +5 -1
  76. package/dist/types/runtime-mcp/manager.d.ts +8 -1
  77. package/dist/types/runtime-mcp/types.d.ts +4 -0
  78. package/dist/types/sdk/acp/adapter.d.ts +67 -0
  79. package/dist/types/sdk/acp/index.d.ts +2 -0
  80. package/dist/types/sdk/broker/broker.d.ts +53 -0
  81. package/dist/types/sdk/broker/discovery.d.ts +30 -0
  82. package/dist/types/sdk/broker/ensure.d.ts +42 -0
  83. package/dist/types/sdk/broker/identity.d.ts +3 -0
  84. package/dist/types/sdk/broker/index.d.ts +8 -0
  85. package/dist/types/sdk/broker/lifecycle-ledger.d.ts +95 -0
  86. package/dist/types/sdk/broker/lifecycle.d.ts +85 -0
  87. package/dist/types/sdk/broker/process-incarnation.d.ts +14 -0
  88. package/dist/types/sdk/broker/runtime.d.ts +33 -0
  89. package/dist/types/sdk/broker/session-index.d.ts +57 -0
  90. package/dist/types/sdk/broker/state-version.d.ts +8 -0
  91. package/dist/types/sdk/broker/transport.d.ts +9 -0
  92. package/dist/types/sdk/bus/chat-command-policy.d.ts +49 -0
  93. package/dist/types/sdk/bus/chat-daemon-cli.d.ts +21 -0
  94. package/dist/types/sdk/bus/chat-daemon-control.d.ts +111 -0
  95. package/dist/types/sdk/bus/chat-daemon-runtime.d.ts +77 -0
  96. package/dist/types/sdk/bus/chat-effect-journal.d.ts +84 -0
  97. package/dist/types/{notifications → sdk/bus}/config-commands.d.ts +7 -2
  98. package/dist/types/sdk/bus/config.d.ts +274 -0
  99. package/dist/types/sdk/bus/conversation-store.d.ts +72 -0
  100. package/dist/types/sdk/bus/discord-conversation.d.ts +58 -0
  101. package/dist/types/sdk/bus/discord-daemon.d.ts +50 -0
  102. package/dist/types/sdk/bus/discord-live-provider.d.ts +70 -0
  103. package/dist/types/sdk/bus/discord-provider.d.ts +85 -0
  104. package/dist/types/{notifications → sdk/bus}/html-format.d.ts +2 -2
  105. package/dist/types/{notifications → sdk/bus}/index.d.ts +113 -13
  106. package/dist/types/{notifications → sdk/bus}/lifecycle-control-runtime.d.ts +4 -2
  107. package/dist/types/{notifications → sdk/bus}/lifecycle-orchestrator.d.ts +18 -21
  108. package/dist/types/{notifications → sdk/bus}/managed-daemon.d.ts +1 -1
  109. package/dist/types/sdk/bus/native-runtime-compatibility.d.ts +13 -0
  110. package/dist/types/sdk/bus/notification-orchestration.d.ts +170 -0
  111. package/dist/types/{notifications → sdk/bus}/notification-service.d.ts +7 -1
  112. package/dist/types/sdk/bus/session-control.d.ts +83 -0
  113. package/dist/types/sdk/bus/slack-conversation.d.ts +56 -0
  114. package/dist/types/sdk/bus/slack-daemon.d.ts +60 -0
  115. package/dist/types/sdk/bus/slack-live-provider.d.ts +59 -0
  116. package/dist/types/sdk/bus/slack-provider.d.ts +55 -0
  117. package/dist/types/{notifications → sdk/bus}/telegram-cli.d.ts +4 -4
  118. package/dist/types/{notifications → sdk/bus}/telegram-daemon-cli.d.ts +14 -5
  119. package/dist/types/sdk/bus/telegram-daemon-contract.d.ts +12 -0
  120. package/dist/types/{notifications → sdk/bus}/telegram-daemon-control.d.ts +2 -2
  121. package/dist/types/{notifications → sdk/bus}/telegram-daemon.d.ts +78 -17
  122. package/dist/types/{notifications → sdk/bus}/telegram-reference.d.ts +2 -2
  123. package/dist/types/sdk/bus/telegram-setup.d.ts +128 -0
  124. package/dist/types/{notifications → sdk/bus}/topic-registry.d.ts +11 -0
  125. package/dist/types/sdk/cli/index.d.ts +1 -0
  126. package/dist/types/sdk/cli/session-cli.d.ts +19 -0
  127. package/dist/types/sdk/client/client.d.ts +1 -0
  128. package/dist/types/sdk/client/discovery.d.ts +27 -0
  129. package/dist/types/sdk/client/index.d.ts +2 -0
  130. package/dist/types/sdk/host/control/dispatch.d.ts +34 -0
  131. package/dist/types/sdk/host/control/index.d.ts +2 -0
  132. package/dist/types/sdk/host/control/operations.d.ts +65 -0
  133. package/dist/types/sdk/host/events.d.ts +35 -0
  134. package/dist/types/sdk/host/host.d.ts +35 -0
  135. package/dist/types/sdk/host/index.d.ts +4 -0
  136. package/dist/types/sdk/host/query/cursor.d.ts +62 -0
  137. package/dist/types/sdk/host/query/handlers.d.ts +70 -0
  138. package/dist/types/sdk/host/query/index.d.ts +3 -0
  139. package/dist/types/sdk/host/query/revision-store.d.ts +60 -0
  140. package/dist/types/sdk/host/reverse-leases.d.ts +45 -0
  141. package/dist/types/sdk/host/types.d.ts +32 -0
  142. package/dist/types/sdk/index.d.ts +6 -0
  143. package/dist/types/sdk/lifecycle-session.d.ts +14 -0
  144. package/dist/types/sdk/mcp/index.d.ts +1 -0
  145. package/dist/types/sdk/mcp/server.d.ts +37 -0
  146. package/dist/types/sdk/models.d.ts +44 -0
  147. package/dist/types/sdk/protocol/adapter-validation.d.ts +14 -0
  148. package/dist/types/sdk/protocol/operation-registry.d.ts +24 -0
  149. package/dist/types/{sdk.d.ts → sdk/session.d.ts} +44 -38
  150. package/dist/types/sdk/startup-capability.d.ts +50 -0
  151. package/dist/types/session/agent-session.d.ts +114 -21
  152. package/dist/types/session/default-model-selection.d.ts +25 -0
  153. package/dist/types/session/fallback-chain-controller.d.ts +52 -0
  154. package/dist/types/session/session-manager.d.ts +58 -1
  155. package/dist/types/setup/credential-auto-import.d.ts +36 -6
  156. package/dist/types/tools/ask-answer-registry.d.ts +1 -1
  157. package/dist/types/tools/browser/benchmark/detector-report.d.ts +63 -0
  158. package/dist/types/tools/browser/benchmark/run-suite.d.ts +18 -0
  159. package/dist/types/tools/browser/launch.d.ts +22 -0
  160. package/dist/types/tools/browser/profile-discovery.d.ts +31 -0
  161. package/dist/types/tools/browser/profile-posture.d.ts +37 -0
  162. package/dist/types/tools/browser/profile-reuse.d.ts +39 -0
  163. package/dist/types/tools/browser/profile-warmup.d.ts +39 -0
  164. package/dist/types/tools/browser/registry.d.ts +19 -0
  165. package/dist/types/tools/browser/tab-protocol.d.ts +4 -0
  166. package/dist/types/tools/index.d.ts +8 -8
  167. package/dist/types/tools/subagent-render.d.ts +1 -0
  168. package/dist/types/tools/subagent.d.ts +6 -1
  169. package/package.json +34 -13
  170. package/scripts/build-sdk-package-smoke.ts +99 -0
  171. package/scripts/capture-notifications-settings-showcase.ts +435 -0
  172. package/scripts/compile-args.ts +4 -2
  173. package/scripts/g005-daemon-smoke.ts +4 -5
  174. package/scripts/g011-daemon-path-smoke.ts +5 -5
  175. package/scripts/generate-sdk-adapter-parity-manifest.ts +163 -0
  176. package/scripts/generate-sdk-operation-inventory.ts +867 -0
  177. package/scripts/generate-telegram-baseline-manifest.ts +128 -0
  178. package/scripts/manifest-schema.ts +124 -0
  179. package/scripts/run-test-manifest.ts +153 -0
  180. package/scripts/run-threat-model-check.ts +157 -0
  181. package/scripts/verify-gjc-sdk-canonicalization.ts +3467 -0
  182. package/scripts/verify-gjc-sdk-rename.ts +90 -0
  183. package/src/append-only-mode.ts +1 -1
  184. package/src/async/job-manager.ts +406 -63
  185. package/src/cli/args.ts +43 -12
  186. package/src/cli/auth-gateway-cli.ts +2 -2
  187. package/src/cli/config-cli.ts +2 -1
  188. package/src/cli/daemon-cli.ts +63 -14
  189. package/src/cli/list-models.ts +1 -1
  190. package/src/cli/notify-cli.ts +288 -286
  191. package/src/cli.ts +21 -2
  192. package/src/commands/daemon.ts +50 -6
  193. package/src/commands/harness.ts +93 -36
  194. package/src/commands/launch.ts +5 -2
  195. package/src/commands/mcp-serve.ts +19 -12
  196. package/src/commands/notify.ts +36 -3
  197. package/src/commands/sdk.ts +426 -0
  198. package/src/commit/agentic/agent.ts +1 -0
  199. package/src/config/atomic-yaml-patch.ts +423 -0
  200. package/src/config/model-profile-activation.ts +240 -89
  201. package/src/config/model-profiles.ts +18 -15
  202. package/src/config/model-registry.ts +51 -26
  203. package/src/config/model-resolver.ts +138 -51
  204. package/src/config/model-selector-value.ts +50 -0
  205. package/src/config/models-config-schema.ts +14 -21
  206. package/src/config/settings-schema.ts +128 -10
  207. package/src/config/settings.ts +1120 -158
  208. package/src/coordinator-mcp/model-preset.ts +74 -20
  209. package/src/coordinator-mcp/server.ts +1597 -3052
  210. package/src/daemon/builtin.ts +8 -5
  211. package/src/daemon/control-types.ts +1 -1
  212. package/src/defaults/gjc/skills/team/SKILL.md +4 -4
  213. package/src/discovery/mcp-json.ts +327 -20
  214. package/src/extensibility/custom-tools/types.ts +1 -1
  215. package/src/extensibility/extensions/compact-handler.ts +3 -3
  216. package/src/extensibility/extensions/get-commands-handler.ts +2 -2
  217. package/src/extensibility/extensions/loader.ts +69 -5
  218. package/src/extensibility/extensions/runner.ts +112 -4
  219. package/src/extensibility/extensions/types.ts +176 -17
  220. package/src/extensibility/hooks/types.ts +1 -1
  221. package/src/gjc-runtime/launch-tmux.ts +170 -86
  222. package/src/gjc-runtime/psmux-detect.ts +82 -4
  223. package/src/gjc-runtime/session-state-sidecar.ts +41 -31
  224. package/src/gjc-runtime/team-runtime.ts +54 -35
  225. package/src/gjc-runtime/tmux-owner-isolation-cli.ts +53 -17
  226. package/src/gjc-runtime/tmux-owner-isolation.ts +1 -1
  227. package/src/gjc-runtime/tmux-sessions.ts +19 -13
  228. package/src/gjc-runtime/ultragoal-guard.ts +108 -14
  229. package/src/gjc-runtime/ultragoal-receipt-freshness.ts +102 -1
  230. package/src/gjc-runtime/ultragoal-runtime.ts +227 -11
  231. package/src/gjc-runtime/windows-powershell-command.ts +58 -0
  232. package/src/harness-control-plane/operate.ts +9 -9
  233. package/src/harness-control-plane/owner.ts +283 -39
  234. package/src/harness-control-plane/receipts.ts +0 -1
  235. package/src/harness-control-plane/sdk-transport.ts +395 -0
  236. package/src/harness-control-plane/session-transport.ts +94 -0
  237. package/src/harness-control-plane/types.ts +1 -1
  238. package/src/internal-urls/docs-index.generated.ts +34 -35
  239. package/src/lsp/client.ts +42 -6
  240. package/src/lsp/index.ts +2 -2
  241. package/src/main.ts +299 -204
  242. package/src/modes/DESIGN.md +258 -0
  243. package/src/modes/acp/acp-agent.ts +1228 -2612
  244. package/src/modes/acp/acp-client-bridge.ts +2 -20
  245. package/src/modes/acp/acp-event-mapper.ts +18 -2
  246. package/src/modes/acp/acp-mode.ts +8 -36
  247. package/src/modes/acp/permission-mode.ts +25 -0
  248. package/src/modes/acp/startup-options.ts +6 -0
  249. package/src/modes/components/agent-dashboard.ts +37 -17
  250. package/src/modes/components/model-selector.ts +93 -35
  251. package/src/modes/components/notifications-settings-editor.ts +1379 -0
  252. package/src/modes/components/settings-selector.ts +60 -11
  253. package/src/modes/components/welcome.ts +4 -4
  254. package/src/modes/controllers/command-controller.ts +10 -17
  255. package/src/modes/controllers/event-controller.ts +11 -16
  256. package/src/modes/controllers/extension-ui-controller.ts +396 -28
  257. package/src/modes/controllers/selector-controller.ts +674 -36
  258. package/src/modes/index.ts +0 -22
  259. package/src/modes/interactive-mode.ts +87 -36
  260. package/src/modes/runtime-init.ts +298 -6
  261. package/src/modes/shared/agent-wire/approval-gate.ts +9 -11
  262. package/src/modes/shared/agent-wire/deep-interview-gate.ts +10 -11
  263. package/src/modes/shared/agent-wire/event-contract.ts +7 -8
  264. package/src/modes/shared/agent-wire/event-envelope.ts +9 -17
  265. package/src/modes/shared/agent-wire/event-observation.ts +16 -7
  266. package/src/modes/shared/agent-wire/workflow-gate-broker.ts +1258 -87
  267. package/src/modes/shared/agent-wire/workflow-gate-schema.ts +15 -15
  268. package/src/modes/shared/agent-wire/workflow-gate-types.ts +113 -0
  269. package/src/modes/types.ts +7 -2
  270. package/src/runtime-mcp/client.ts +94 -19
  271. package/src/runtime-mcp/config.ts +27 -15
  272. package/src/runtime-mcp/manager.ts +343 -105
  273. package/src/runtime-mcp/oauth-flow.ts +42 -12
  274. package/src/runtime-mcp/transports/http.ts +49 -19
  275. package/src/runtime-mcp/transports/stdio.ts +47 -28
  276. package/src/runtime-mcp/types.ts +10 -0
  277. package/src/sdk/acp/adapter.ts +418 -0
  278. package/src/sdk/acp/index.ts +2 -0
  279. package/src/sdk/broker/broker.ts +642 -0
  280. package/src/sdk/broker/discovery.ts +113 -0
  281. package/src/sdk/broker/ensure.ts +307 -0
  282. package/src/sdk/broker/identity.ts +42 -0
  283. package/src/sdk/broker/index.ts +8 -0
  284. package/src/sdk/broker/internal-source-marker-2178.txt +1 -0
  285. package/src/sdk/broker/internal-source.bunfig.toml +1 -0
  286. package/src/sdk/broker/lifecycle-ledger.ts +286 -0
  287. package/src/sdk/broker/lifecycle.ts +2157 -0
  288. package/src/sdk/broker/process-incarnation.ts +159 -0
  289. package/src/sdk/broker/runtime.ts +164 -0
  290. package/src/sdk/broker/session-index.ts +318 -0
  291. package/src/sdk/broker/state-version.ts +23 -0
  292. package/src/sdk/broker/transport.ts +125 -0
  293. package/src/sdk/bus/chat-command-policy.ts +107 -0
  294. package/src/sdk/bus/chat-daemon-cli.ts +214 -0
  295. package/src/sdk/bus/chat-daemon-control.ts +713 -0
  296. package/src/sdk/bus/chat-daemon-runtime.ts +526 -0
  297. package/src/sdk/bus/chat-effect-journal.ts +355 -0
  298. package/src/{notifications → sdk/bus}/config-commands.ts +39 -10
  299. package/src/sdk/bus/config.ts +433 -0
  300. package/src/sdk/bus/conversation-store.ts +391 -0
  301. package/src/sdk/bus/discord-conversation.ts +85 -0
  302. package/src/sdk/bus/discord-daemon.ts +2292 -0
  303. package/src/sdk/bus/discord-live-provider.ts +521 -0
  304. package/src/sdk/bus/discord-provider.ts +56 -0
  305. package/src/{notifications → sdk/bus}/html-format.ts +2 -2
  306. package/src/sdk/bus/index.ts +3979 -0
  307. package/src/{notifications → sdk/bus}/lifecycle-commands.ts +2 -0
  308. package/src/{notifications → sdk/bus}/lifecycle-control-runtime.ts +225 -196
  309. package/src/{notifications → sdk/bus}/lifecycle-orchestrator.ts +161 -74
  310. package/src/{notifications → sdk/bus}/managed-daemon.ts +2 -2
  311. package/src/sdk/bus/native-runtime-compatibility.ts +42 -0
  312. package/src/sdk/bus/natives-augment.d.ts +38 -0
  313. package/src/sdk/bus/notification-orchestration.ts +535 -0
  314. package/src/{notifications → sdk/bus}/notification-service.ts +106 -12
  315. package/src/sdk/bus/session-control.ts +333 -0
  316. package/src/sdk/bus/slack-conversation.ts +74 -0
  317. package/src/sdk/bus/slack-daemon.ts +2144 -0
  318. package/src/sdk/bus/slack-live-provider.ts +380 -0
  319. package/src/sdk/bus/slack-provider.ts +76 -0
  320. package/src/{notifications → sdk/bus}/telegram-cli.ts +8 -8
  321. package/src/sdk/bus/telegram-daemon-cli.ts +330 -0
  322. package/src/sdk/bus/telegram-daemon-contract.ts +14 -0
  323. package/src/{notifications → sdk/bus}/telegram-daemon-control.ts +4 -4
  324. package/src/{notifications → sdk/bus}/telegram-daemon.ts +603 -63
  325. package/src/{notifications → sdk/bus}/telegram-reference.ts +2 -2
  326. package/src/sdk/bus/telegram-setup.ts +663 -0
  327. package/src/{notifications → sdk/bus}/topic-registry.ts +32 -0
  328. package/src/sdk/cli/index.ts +1 -0
  329. package/src/sdk/cli/session-cli.ts +275 -0
  330. package/src/sdk/client/client.ts +1 -0
  331. package/src/sdk/client/discovery.ts +108 -0
  332. package/src/sdk/client/index.ts +2 -0
  333. package/src/sdk/host/control/dispatch.ts +367 -0
  334. package/src/sdk/host/control/index.ts +10 -0
  335. package/src/sdk/host/control/operations.ts +63 -0
  336. package/src/sdk/host/events.ts +91 -0
  337. package/src/sdk/host/host.ts +296 -0
  338. package/src/sdk/host/index.ts +4 -0
  339. package/src/sdk/host/query/cursor.ts +189 -0
  340. package/src/sdk/host/query/handlers.ts +533 -0
  341. package/src/sdk/host/query/index.ts +3 -0
  342. package/src/sdk/host/query/revision-store.ts +1126 -0
  343. package/src/sdk/host/reverse-leases.ts +325 -0
  344. package/src/sdk/host/types.ts +29 -0
  345. package/src/sdk/index.ts +13 -0
  346. package/src/sdk/lifecycle-session.ts +39 -0
  347. package/src/sdk/mcp/index.ts +1 -0
  348. package/src/sdk/mcp/server.ts +332 -0
  349. package/src/sdk/models.ts +168 -0
  350. package/src/sdk/protocol/adapter-validation.ts +48 -0
  351. package/src/sdk/protocol/operation-inventory.generated.json +5654 -0
  352. package/src/sdk/protocol/operation-registry.ts +312 -0
  353. package/src/{sdk.ts → sdk/session.ts} +339 -212
  354. package/src/sdk/startup-capability.ts +189 -0
  355. package/src/session/agent-session.ts +2650 -944
  356. package/src/session/default-model-selection.ts +93 -0
  357. package/src/session/fallback-chain-controller.ts +136 -0
  358. package/src/session/session-manager.ts +438 -11
  359. package/src/session/session-storage.ts +8 -1
  360. package/src/setup/credential-auto-import.ts +290 -35
  361. package/src/setup/hermes/templates/operator-instructions.v1.md +3 -5
  362. package/src/slash-commands/builtin-registry.ts +2 -1
  363. package/src/task/executor.ts +62 -13
  364. package/src/task/index.ts +26 -16
  365. package/src/tools/ask-answer-registry.ts +1 -1
  366. package/src/tools/ask.ts +13 -8
  367. package/src/tools/browser/STEALTH-THIRD-PARTY-NOTICES.md +26 -0
  368. package/src/tools/browser/benchmark/detector-report.ts +157 -0
  369. package/src/tools/browser/benchmark/run-suite.ts +39 -0
  370. package/src/tools/browser/launch.ts +124 -19
  371. package/src/tools/browser/profile-discovery.ts +63 -0
  372. package/src/tools/browser/profile-posture.ts +59 -0
  373. package/src/tools/browser/profile-reuse.ts +102 -0
  374. package/src/tools/browser/profile-warmup.ts +109 -0
  375. package/src/tools/browser/registry.ts +87 -11
  376. package/src/tools/browser/tab-protocol.ts +1 -0
  377. package/src/tools/browser/tab-supervisor.ts +1 -0
  378. package/src/tools/browser/tab-worker.ts +1 -1
  379. package/src/tools/browser.ts +6 -0
  380. package/src/tools/index.ts +8 -8
  381. package/src/tools/puppeteer/14_stealth_permissions.txt +57 -0
  382. package/src/tools/puppeteer/15_stealth_webrtc.txt +60 -0
  383. package/src/tools/subagent-render.ts +19 -8
  384. package/src/tools/subagent.ts +84 -32
  385. package/src/tools/telegram-send.ts +2 -2
  386. package/vendor/insane-search/MANIFEST.json +2 -1
  387. package/vendor/insane-search/engine/bias_check.py +4 -1
  388. package/vendor/insane-search/engine/phase0.py +26 -1
  389. package/dist/types/harness-control-plane/rpc-adapter.d.ts +0 -69
  390. package/dist/types/modes/bridge/auth.d.ts +0 -12
  391. package/dist/types/modes/bridge/bridge-client-bridge.d.ts +0 -9
  392. package/dist/types/modes/bridge/bridge-mode.d.ts +0 -47
  393. package/dist/types/modes/bridge/bridge-ui-context.d.ts +0 -88
  394. package/dist/types/modes/bridge/event-stream.d.ts +0 -8
  395. package/dist/types/modes/rpc/host-tools.d.ts +0 -1
  396. package/dist/types/modes/rpc/host-uris.d.ts +0 -1
  397. package/dist/types/modes/rpc/rpc-client.d.ts +0 -299
  398. package/dist/types/modes/rpc/rpc-mode.d.ts +0 -86
  399. package/dist/types/modes/rpc/rpc-socket-security.d.ts +0 -10
  400. package/dist/types/modes/rpc/rpc-types.d.ts +0 -810
  401. package/dist/types/modes/shared/agent-wire/command-contract.d.ts +0 -18
  402. package/dist/types/modes/shared/agent-wire/command-dispatch.d.ts +0 -37
  403. package/dist/types/modes/shared/agent-wire/command-validation.d.ts +0 -2
  404. package/dist/types/modes/shared/agent-wire/handshake.d.ts +0 -56
  405. package/dist/types/modes/shared/agent-wire/host-tool-bridge.d.ts +0 -16
  406. package/dist/types/modes/shared/agent-wire/host-uri-bridge.d.ts +0 -17
  407. package/dist/types/modes/shared/agent-wire/protocol.d.ts +0 -25
  408. package/dist/types/modes/shared/agent-wire/responses.d.ts +0 -4
  409. package/dist/types/modes/shared/agent-wire/scopes.d.ts +0 -18
  410. package/dist/types/modes/shared/agent-wire/session-registry.d.ts +0 -25
  411. package/dist/types/modes/shared/agent-wire/ui-request-broker.d.ts +0 -42
  412. package/dist/types/modes/shared/agent-wire/ui-result.d.ts +0 -27
  413. package/dist/types/modes/shared/agent-wire/unattended-action-policy.d.ts +0 -29
  414. package/dist/types/modes/shared/agent-wire/unattended-audit.d.ts +0 -68
  415. package/dist/types/modes/shared/agent-wire/unattended-run-controller.d.ts +0 -166
  416. package/dist/types/modes/shared/agent-wire/unattended-session.d.ts +0 -127
  417. package/dist/types/notifications/config.d.ts +0 -132
  418. package/src/harness-control-plane/rpc-adapter.ts +0 -290
  419. package/src/modes/bridge/auth.ts +0 -41
  420. package/src/modes/bridge/bridge-client-bridge.ts +0 -47
  421. package/src/modes/bridge/bridge-mode.ts +0 -675
  422. package/src/modes/bridge/bridge-ui-context.ts +0 -200
  423. package/src/modes/bridge/event-stream.ts +0 -70
  424. package/src/modes/rpc/host-tools.ts +0 -1
  425. package/src/modes/rpc/host-uris.ts +0 -1
  426. package/src/modes/rpc/rpc-client.ts +0 -1166
  427. package/src/modes/rpc/rpc-mode.ts +0 -1029
  428. package/src/modes/rpc/rpc-socket-security.ts +0 -115
  429. package/src/modes/rpc/rpc-types.ts +0 -637
  430. package/src/modes/shared/agent-wire/command-contract.ts +0 -18
  431. package/src/modes/shared/agent-wire/command-dispatch.ts +0 -498
  432. package/src/modes/shared/agent-wire/command-validation.ts +0 -181
  433. package/src/modes/shared/agent-wire/handshake.ts +0 -157
  434. package/src/modes/shared/agent-wire/host-tool-bridge.ts +0 -197
  435. package/src/modes/shared/agent-wire/host-uri-bridge.ts +0 -236
  436. package/src/modes/shared/agent-wire/protocol.ts +0 -46
  437. package/src/modes/shared/agent-wire/responses.ts +0 -17
  438. package/src/modes/shared/agent-wire/scopes.ts +0 -94
  439. package/src/modes/shared/agent-wire/session-registry.ts +0 -109
  440. package/src/modes/shared/agent-wire/ui-request-broker.ts +0 -150
  441. package/src/modes/shared/agent-wire/ui-result.ts +0 -48
  442. package/src/modes/shared/agent-wire/unattended-action-policy.ts +0 -365
  443. package/src/modes/shared/agent-wire/unattended-audit.ts +0 -176
  444. package/src/modes/shared/agent-wire/unattended-run-controller.ts +0 -426
  445. package/src/modes/shared/agent-wire/unattended-session.ts +0 -528
  446. package/src/notifications/config.ts +0 -219
  447. package/src/notifications/index.ts +0 -1835
  448. package/src/notifications/telegram-daemon-cli.ts +0 -243
  449. package/src/tools/puppeteer/09_stealth_locale.txt +0 -46
  450. /package/dist/types/{notifications → sdk/bus}/attachment-registry.d.ts +0 -0
  451. /package/dist/types/{notifications → sdk/bus}/chat-adapters.d.ts +0 -0
  452. /package/dist/types/{notifications → sdk/bus}/daemon-paths.d.ts +0 -0
  453. /package/dist/types/{notifications → sdk/bus}/engine.d.ts +0 -0
  454. /package/dist/types/{notifications → sdk/bus}/helpers.d.ts +0 -0
  455. /package/dist/types/{notifications → sdk/bus}/lifecycle-commands.d.ts +0 -0
  456. /package/dist/types/{notifications → sdk/bus}/operator-runtime.d.ts +0 -0
  457. /package/dist/types/{notifications → sdk/bus}/rate-limit-pool.d.ts +0 -0
  458. /package/dist/types/{notifications → sdk/bus}/recent-activity.d.ts +0 -0
  459. /package/dist/types/{notifications → sdk/bus}/reply-sent-store.d.ts +0 -0
  460. /package/dist/types/{notifications → sdk/bus}/rich-draft.d.ts +0 -0
  461. /package/dist/types/{notifications → sdk/bus}/rich-render.d.ts +0 -0
  462. /package/dist/types/{notifications → sdk/bus}/threaded-inbound.d.ts +0 -0
  463. /package/dist/types/{notifications → sdk/bus}/threaded-render.d.ts +0 -0
  464. /package/src/{notifications → sdk/bus}/attachment-registry.ts +0 -0
  465. /package/src/{notifications → sdk/bus}/chat-adapters.ts +0 -0
  466. /package/src/{notifications → sdk/bus}/daemon-paths.ts +0 -0
  467. /package/src/{notifications → sdk/bus}/engine.ts +0 -0
  468. /package/src/{notifications → sdk/bus}/helpers.ts +0 -0
  469. /package/src/{notifications → sdk/bus}/operator-runtime.ts +0 -0
  470. /package/src/{notifications → sdk/bus}/rate-limit-pool.ts +0 -0
  471. /package/src/{notifications → sdk/bus}/recent-activity.ts +0 -0
  472. /package/src/{notifications → sdk/bus}/reply-sent-store.ts +0 -0
  473. /package/src/{notifications → sdk/bus}/rich-draft.ts +0 -0
  474. /package/src/{notifications → sdk/bus}/rich-render.ts +0 -0
  475. /package/src/{notifications → sdk/bus}/threaded-inbound.ts +0 -0
  476. /package/src/{notifications → sdk/bus}/threaded-render.ts +0 -0
@@ -1,3 +1,4 @@
1
+ import { ThinkingLevel } from "@gajae-code/agent-core";
1
2
  import type { Component, OverlayHandle, TUI } from "@gajae-code/tui";
2
3
  import { Container, Spacer, Text } from "@gajae-code/tui";
3
4
  import { logger } from "@gajae-code/utils";
@@ -22,6 +23,8 @@ import { HookInputComponent } from "../../modes/components/hook-input";
22
23
  import { HookSelectorComponent } from "../../modes/components/hook-selector";
23
24
  import { getAvailableThemesWithPaths, getThemeByName, setTheme, type Theme, theme } from "../../modes/theme/theme";
24
25
  import type { InteractiveModeContext } from "../../modes/types";
26
+ import { parseThinkingLevel } from "../../thinking";
27
+ import type { TodoPhase } from "../../tools/todo-write";
25
28
  import { setSessionTerminalTitle, setTerminalTitle } from "../../utils/title-generator";
26
29
  import { applyInjectedUserSubmission } from "../utils/injected-user-submission";
27
30
  import { classifyHookSelectorBellEvent, ringTerminalBell } from "../utils/terminal-bell";
@@ -50,6 +53,235 @@ export class ExtensionUiController {
50
53
  overlay?.hide();
51
54
  }
52
55
 
56
+ captureSessionUiCleanup(): () => void {
57
+ const terminalInputUnsubscribers = [...this.#extensionTerminalInputUnsubscribers];
58
+ const widgetsAbove = [...this.#hookWidgetsAbove.entries()];
59
+ const widgetsBelow = [...this.#hookWidgetsBelow.entries()];
60
+ const activeHookCustomComponent = this.#activeHookCustomComponent;
61
+ const activeHookCustomOverlay = this.#activeHookCustomOverlay;
62
+ return () => {
63
+ for (const unsubscribe of terminalInputUnsubscribers) {
64
+ unsubscribe();
65
+ this.#extensionTerminalInputUnsubscribers.delete(unsubscribe);
66
+ }
67
+ let widgetsChanged = false;
68
+ for (const [key, widget] of widgetsAbove) {
69
+ if (this.#hookWidgetsAbove.get(key) !== widget) continue;
70
+ this.#hookWidgetsAbove.delete(key);
71
+ widget.dispose?.();
72
+ widgetsChanged = true;
73
+ }
74
+ for (const [key, widget] of widgetsBelow) {
75
+ if (this.#hookWidgetsBelow.get(key) !== widget) continue;
76
+ this.#hookWidgetsBelow.delete(key);
77
+ widget.dispose?.();
78
+ widgetsChanged = true;
79
+ }
80
+ if (
81
+ this.#activeHookCustomComponent === activeHookCustomComponent &&
82
+ this.#activeHookCustomOverlay === activeHookCustomOverlay
83
+ ) {
84
+ this.#clearActiveHookCustom();
85
+ }
86
+ if (widgetsChanged) this.#rebuildHookWidgets();
87
+ };
88
+ }
89
+
90
+ #sdkControl = async (operation: string, input: Record<string, unknown>): Promise<unknown> => {
91
+ const session = this.ctx.session;
92
+ switch (operation) {
93
+ case "model.set": {
94
+ const selector = typeof input.id === "string" ? input.id : "";
95
+ const slashIndex = selector.indexOf("/");
96
+ const model =
97
+ slashIndex > 0
98
+ ? session.modelRegistry.find(selector.slice(0, slashIndex), selector.slice(slashIndex + 1))
99
+ : undefined;
100
+ const thinkingLevel =
101
+ typeof input.thinkingLevel === "string" ? parseThinkingLevel(input.thinkingLevel) : undefined;
102
+ if (!model || !thinkingLevel || thinkingLevel === ThinkingLevel.Inherit)
103
+ throw Object.assign(new Error("model.set requires a valid model id and concrete thinkingLevel."), {
104
+ code: "invalid_input",
105
+ });
106
+ return await session.setDefaultModelSelection(model, thinkingLevel);
107
+ }
108
+ case "todo.replace": {
109
+ const phases = input.items;
110
+ if (
111
+ !Array.isArray(phases) ||
112
+ !phases.every(phase => {
113
+ if (!phase || typeof phase !== "object") return false;
114
+ const candidate = phase as { name?: unknown; tasks?: unknown };
115
+ return (
116
+ typeof candidate.name === "string" &&
117
+ Array.isArray(candidate.tasks) &&
118
+ candidate.tasks.every(task => {
119
+ if (!task || typeof task !== "object") return false;
120
+ const item = task as { content?: unknown; status?: unknown };
121
+ return (
122
+ typeof item.content === "string" &&
123
+ ["pending", "in_progress", "completed", "abandoned"].includes(String(item.status))
124
+ );
125
+ })
126
+ );
127
+ })
128
+ )
129
+ throw Object.assign(new Error("todo.replace requires TodoPhase items."), { code: "invalid_input" });
130
+ session.setTodoPhases(phases as TodoPhase[]);
131
+ return { replaced: session.getTodoPhases() };
132
+ }
133
+ case "permission_mode.set": {
134
+ const requested = input.mode;
135
+ const mode =
136
+ requested === "allow" || requested === "always-allow"
137
+ ? "allow"
138
+ : requested === "deny" || requested === "always-deny"
139
+ ? "deny"
140
+ : requested === "prompt"
141
+ ? "prompt"
142
+ : undefined;
143
+ if (!mode)
144
+ throw Object.assign(new Error("permission_mode.set requires prompt, allow, or deny."), {
145
+ code: "invalid_input",
146
+ });
147
+ session.setSdkPermissionMode(mode);
148
+ return { changed: true, mode: session.sdkPermissionMode };
149
+ }
150
+ case "bash.execute": {
151
+ if (typeof input.cmd !== "string" || input.cmd.trim() === "")
152
+ throw Object.assign(new Error("bash.execute requires a command."), { code: "invalid_input" });
153
+ const result = await session.executeBash(input.cmd, undefined, { excludeFromContext: true });
154
+ return {
155
+ exitCode: result.exitCode,
156
+ cancelled: result.cancelled,
157
+ output: result.output,
158
+ truncated: result.truncated,
159
+ };
160
+ }
161
+ case "bash.abort":
162
+ if (!session.isBashRunning) return { aborted: false };
163
+ session.abortBash();
164
+ return { aborted: true };
165
+ case "retry.last":
166
+ if (!(await session.retry()))
167
+ throw Object.assign(new Error("There is no failed or interrupted turn to retry."), {
168
+ code: "nothing_to_retry",
169
+ });
170
+ return { retried: true };
171
+ case "retry.now":
172
+ if (!session.isRetrying)
173
+ throw Object.assign(new Error("No retry backoff is pending."), { code: "retry_not_pending" });
174
+ session.retryNow();
175
+ return { retried: true, immediate: true };
176
+ case "bash.background":
177
+ if (!session.requestForegroundBashBackground())
178
+ throw Object.assign(new Error("The active bash command cannot be moved to a managed background job."), {
179
+ code: "not_foldable",
180
+ });
181
+ return { backgrounded: true };
182
+ case "compaction.auto.set":
183
+ session.setAutoCompactionEnabled(input.on === true);
184
+ return { changed: true };
185
+ case "retry.auto.set":
186
+ session.setAutoRetryEnabled(input.on === true);
187
+ return { changed: true };
188
+ case "retry.abort":
189
+ session.abortRetry();
190
+ return { aborted: true };
191
+ case "session.new":
192
+ return { created: await session.newSession() };
193
+ case "session.fork":
194
+ return { session: await session.fork() };
195
+ case "session.resume":
196
+ return { resumed: await session.switchSession(String(input.id)) };
197
+ case "session.close":
198
+ await session.sessionManager.flush();
199
+ return { closed: true };
200
+ case "session.switch":
201
+ return { switched: await session.switchSession(String(input.id)) };
202
+ case "session.branch":
203
+ try {
204
+ return await session.branch(String(input.entryId));
205
+ } catch (error) {
206
+ throw Object.assign(new Error(error instanceof Error ? error.message : "Branch entry was not found."), {
207
+ code: "resource_gone",
208
+ });
209
+ }
210
+ case "session.rename":
211
+ return { renamed: await session.setSessionName(String(input.name), "user") };
212
+ case "session.handoff":
213
+ try {
214
+ return {
215
+ handoff: await session.handoff(
216
+ typeof input.instructions === "string" ? input.instructions : undefined,
217
+ ),
218
+ };
219
+ } catch (error) {
220
+ throw Object.assign(
221
+ new Error(error instanceof Error ? error.message : "Handoff is unavailable for the current state."),
222
+ { code: "invalid_request" },
223
+ );
224
+ }
225
+ case "session.export_html":
226
+ try {
227
+ return { path: await session.exportToHtml(typeof input.path === "string" ? input.path : undefined) };
228
+ } catch (error) {
229
+ throw Object.assign(
230
+ new Error(
231
+ error instanceof Error ? error.message : "Session export is unavailable for the current state.",
232
+ ),
233
+ { code: "invalid_request" },
234
+ );
235
+ }
236
+ case "runtime.reload":
237
+ await session.reload();
238
+ return { reloaded: true };
239
+ case "service_tier.set":
240
+ session.setServiceTier(input.tier as never);
241
+ return { changed: true };
242
+ case "queue.message.remove": {
243
+ const removed = session.removeQueuedMessageForEditing(String(input.id));
244
+ if (removed === undefined)
245
+ throw Object.assign(new Error("Queued message was not found."), { code: "resource_gone" });
246
+ return { removed };
247
+ }
248
+ case "queue.message.move": {
249
+ const id = String(input.id);
250
+ const moved =
251
+ input.before !== undefined
252
+ ? session.moveQueuedMessageForEditing(id, "up")
253
+ : session.moveQueuedMessageForEditing(id, "down");
254
+ if (!moved) throw Object.assign(new Error("Queue position is invalid."), { code: "invalid_position" });
255
+ return { moved };
256
+ }
257
+ case "queue.message.update": {
258
+ const id = String(input.id);
259
+ const old = session.removeQueuedMessageForEditing(id);
260
+ const patch = input.patch as { text?: unknown };
261
+ if (old === undefined || typeof patch?.text !== "string")
262
+ throw Object.assign(new Error("Queued message update is invalid."), { code: "invalid_message" });
263
+ await session.sendUserMessage(patch.text, { deliverAs: id.startsWith("steer:") ? "steer" : "followUp" });
264
+ return { updated: true };
265
+ }
266
+ case "extension.set_enabled": {
267
+ const id = String(input.id);
268
+ const disabled = [...(session.settings.get("disabledExtensions") ?? [])];
269
+ const on = input.on === true;
270
+ const next = on ? disabled.filter(value => value !== id) : [...new Set([...disabled, id])];
271
+ session.settings.set("disabledExtensions", next);
272
+ return { changed: true, enabled: on };
273
+ }
274
+ case "session.delete":
275
+ await session.sessionManager.dropSession(String(input.id));
276
+ return { deleted: true };
277
+ case "session.cwd.move":
278
+ await session.sessionManager.moveTo(String(input.path));
279
+ return { moved: true, cwd: session.sessionManager.getCwd() };
280
+ default:
281
+ throw Object.assign(new Error(`${operation} has no AgentSession implementation.`), { code: "unavailable" });
282
+ }
283
+ };
284
+
53
285
  /** Re-mount the pet-aware composer after a transient hook UI closes. */
54
286
  #restoreComposerEditor(): void {
55
287
  this.ctx.restoreComposer();
@@ -128,11 +360,21 @@ export class ExtensionUiController {
128
360
  setModel: async model => {
129
361
  const key = await this.ctx.session.modelRegistry.getApiKey(model);
130
362
  if (!key) return false;
131
- await this.ctx.session.setModel(model);
363
+ await this.ctx.session.setModel(model, "default", { cause: "user-selection" });
132
364
  return true;
133
365
  },
134
366
  getThinkingLevel: () => this.ctx.session.thinkingLevel,
135
- setThinkingLevel: level => this.ctx.session.setThinkingLevel(level),
367
+ setThinkingLevel: (level, persist) => this.ctx.session.setThinkingLevel(level, persist),
368
+ getThinkingVisibility: () => this.ctx.session.getThinkingVisibility(),
369
+ setThinkingVisibility: (visibility, persist) => this.ctx.session.setThinkingVisibility(visibility, persist),
370
+ cycleThinkingLevel: () => this.ctx.session.cycleThinkingLevel(),
371
+ setThinkingLevelForControl: (level, persist) => this.ctx.session.setThinkingLevelForControl(level, persist),
372
+ setThinkingVisibilityForControl: (visibility, persist) =>
373
+ this.ctx.session.setThinkingVisibilityForControl(visibility, persist),
374
+ setModelTemporaryForControl: (model, expectedSessionId) =>
375
+ this.ctx.session.setModelTemporaryForControl(model, expectedSessionId),
376
+ fetchUsageReportsForControl: () => this.ctx.session.fetchUsageReportsForControl(),
377
+ getThinkingScopeForControl: () => this.ctx.session.getThinkingScopeForControl(),
136
378
  getCommands: () => getSessionSlashCommands(this.ctx.session),
137
379
  getSessionName: () => this.ctx.sessionManager.getSessionName(),
138
380
  setSessionName: name => this.#updateSessionName(name),
@@ -142,6 +384,15 @@ export class ExtensionUiController {
142
384
  isIdle: () => !this.ctx.session.isStreaming,
143
385
  abort: () => this.ctx.session.abort(),
144
386
  hasPendingMessages: () => this.ctx.session.queuedMessageCount > 0,
387
+ getPendingMessageCounts: () => this.ctx.session.pendingMessageCounts,
388
+ getTranscript: () => this.ctx.session.getTranscript(),
389
+ getTranscriptBody: entryId => this.ctx.session.getTranscriptBody(entryId),
390
+ getGoalState: () => this.ctx.session.getGoalModeState(),
391
+ getTodoState: () => this.ctx.session.getTodoPhases(),
392
+ getQueuedMessages: () => this.ctx.session.getQueuedMessageEntries(),
393
+ getActiveTools: () => this.ctx.session.getActiveToolNames(),
394
+ getAllTools: () => this.ctx.session.getAllToolNames(),
395
+
145
396
  shutdown: () => {
146
397
  // Defer the actual teardown to the main loop, which calls
147
398
  // `checkShutdownRequested()` at idle boundaries so any queued
@@ -151,6 +402,38 @@ export class ExtensionUiController {
151
402
  getContextUsage: () => this.ctx.session.getContextUsage(),
152
403
  compact: instructionsOrOptions => this.#compactSession(instructionsOrOptions),
153
404
  getSystemPrompt: () => this.ctx.session.systemPrompt,
405
+ clearContext: () => this.ctx.session.clearContext(),
406
+ cycleModel: () => this.ctx.session.cycleModel(),
407
+ cycleThinkingLevel: () => this.ctx.session.cycleThinkingLevel(),
408
+ setQueueMode: (kind, mode) => {
409
+ if (kind === "steering" && (mode === "all" || mode === "one-at-a-time")) {
410
+ this.ctx.session.setSteeringMode(mode);
411
+ return true;
412
+ }
413
+ if (kind === "follow_up" && (mode === "all" || mode === "one-at-a-time")) {
414
+ this.ctx.session.setFollowUpMode(mode);
415
+ return true;
416
+ }
417
+ if (kind === "interrupt" && (mode === "immediate" || mode === "wait")) {
418
+ this.ctx.session.setInterruptMode(mode);
419
+ return true;
420
+ }
421
+ return false;
422
+ },
423
+ invokeSkill: (name, args) => this.ctx.session.invokeSkill(name, args),
424
+ setPlanMode: on => this.ctx.session.setSdkPlanMode(on),
425
+ operateGoal: (op, objective) => this.ctx.session.operateGoal(op, objective),
426
+ getSkillState: () =>
427
+ this.ctx.session.skills.map(skill => ({ name: skill.name, description: skill.description })),
428
+ getConfigItems: () => ({
429
+ steeringMode: this.ctx.session.steeringMode,
430
+ followUpMode: this.ctx.session.followUpMode,
431
+ interruptMode: this.ctx.session.interruptMode,
432
+ }),
433
+ getBranchCandidates: () => this.ctx.sessionManager.getTree(),
434
+ getExtensions: () => this.ctx.session.extensionRunner?.getExtensionPaths() ?? [],
435
+ setSdkPermissionProvider: provider => this.ctx.session.setSdkPermissionProvider(provider),
436
+ sdkControl: this.#sdkControl,
154
437
  };
155
438
  const commandActions: ExtensionCommandContextActions = {
156
439
  getContextUsage: () => this.ctx.session.getContextUsage(),
@@ -165,36 +448,30 @@ export class ExtensionUiController {
165
448
  this.ctx.showStatus("Reloaded session");
166
449
  },
167
450
  newSession: async options => {
168
- // Stop any loading animation
451
+ const cleanupPreviousSessionUi = this.captureSessionUiCleanup();
452
+ const success = await this.ctx.session.newSession({ parentSession: options?.parentSession });
453
+ if (!success) {
454
+ return { cancelled: true };
455
+ }
456
+ cleanupPreviousSessionUi();
457
+
169
458
  if (this.ctx.loadingAnimation) {
170
459
  this.ctx.loadingAnimation.stop();
171
460
  this.ctx.loadingAnimation = undefined;
172
461
  }
173
462
  this.ctx.statusContainer.clear();
174
-
175
- // Create new session
176
- this.clearExtensionTerminalInputListeners();
177
- this.clearHookWidgets();
178
- const success = await this.ctx.session.newSession({ parentSession: options?.parentSession });
179
- if (!success) {
180
- return { cancelled: true };
181
- }
182
463
  this.ctx.resetIrcSidebarSession();
183
-
184
464
  setSessionTerminalTitle(this.ctx.sessionManager.getSessionName(), this.ctx.sessionManager.getCwd());
185
465
 
186
- // Call setup callback if provided
187
466
  if (options?.setup) {
188
467
  await options.setup(this.ctx.sessionManager);
189
468
  }
190
469
 
191
- // Reset and update status line
192
470
  this.ctx.statusLine.invalidate();
193
471
  this.ctx.statusLine.setSessionStartTime(Date.now());
194
472
  this.ctx.updateEditorTopBorder();
195
473
  this.ctx.ui.requestRender();
196
474
 
197
- // Clear UI state
198
475
  prepareTranscriptRebuild(this.ctx.ui, "replace-identity");
199
476
  this.ctx.chatContainer.clear();
200
477
  this.ctx.pendingMessagesContainer.clear();
@@ -377,11 +654,21 @@ export class ExtensionUiController {
377
654
  setModel: async model => {
378
655
  const key = await this.ctx.session.modelRegistry.getApiKey(model);
379
656
  if (!key) return false;
380
- await this.ctx.session.setModel(model);
657
+ await this.ctx.session.setModel(model, "default", { cause: "user-selection" });
381
658
  return true;
382
659
  },
383
660
  getThinkingLevel: () => this.ctx.session.thinkingLevel,
384
661
  setThinkingLevel: (level, persist) => this.ctx.session.setThinkingLevel(level, persist),
662
+ getThinkingVisibility: () => this.ctx.session.getThinkingVisibility(),
663
+ setThinkingVisibility: (visibility, persist) => this.ctx.session.setThinkingVisibility(visibility, persist),
664
+ cycleThinkingLevel: () => this.ctx.session.cycleThinkingLevel(),
665
+ setThinkingLevelForControl: (level, persist) => this.ctx.session.setThinkingLevelForControl(level, persist),
666
+ setThinkingVisibilityForControl: (visibility, persist) =>
667
+ this.ctx.session.setThinkingVisibilityForControl(visibility, persist),
668
+ setModelTemporaryForControl: (model, expectedSessionId) =>
669
+ this.ctx.session.setModelTemporaryForControl(model, expectedSessionId),
670
+ fetchUsageReportsForControl: () => this.ctx.session.fetchUsageReportsForControl(),
671
+ getThinkingScopeForControl: () => this.ctx.session.getThinkingScopeForControl(),
385
672
  getCommands: () => getSessionSlashCommands(this.ctx.session),
386
673
  getSessionName: () => this.ctx.sessionManager.getSessionName(),
387
674
  setSessionName: name => this.#updateSessionName(name),
@@ -391,6 +678,15 @@ export class ExtensionUiController {
391
678
  isIdle: () => !this.ctx.session.isStreaming,
392
679
  abort: () => this.ctx.session.abort(),
393
680
  hasPendingMessages: () => this.ctx.session.queuedMessageCount > 0,
681
+ getPendingMessageCounts: () => this.ctx.session.pendingMessageCounts,
682
+ getTranscript: () => this.ctx.session.getTranscript(),
683
+ getTranscriptBody: entryId => this.ctx.session.getTranscriptBody(entryId),
684
+ getGoalState: () => this.ctx.session.getGoalModeState(),
685
+ getTodoState: () => this.ctx.session.getTodoPhases(),
686
+ getQueuedMessages: () => this.ctx.session.getQueuedMessageEntries(),
687
+ getActiveTools: () => this.ctx.session.getActiveToolNames(),
688
+ getAllTools: () => this.ctx.session.getAllToolNames(),
689
+
394
690
  shutdown: () => {
395
691
  // Defer the actual teardown to the main loop, which calls
396
692
  // `checkShutdownRequested()` at idle boundaries so any queued
@@ -400,6 +696,35 @@ export class ExtensionUiController {
400
696
  getContextUsage: () => this.ctx.session.getContextUsage(),
401
697
  compact: instructionsOrOptions => this.#compactSession(instructionsOrOptions),
402
698
  getSystemPrompt: () => this.ctx.session.systemPrompt,
699
+ clearContext: () => this.ctx.session.clearContext(),
700
+ cycleModel: () => this.ctx.session.cycleModel(),
701
+ cycleThinkingLevel: () => this.ctx.session.cycleThinkingLevel(),
702
+ setQueueMode: (kind, mode) => {
703
+ if (kind === "steering" && (mode === "all" || mode === "one-at-a-time")) {
704
+ this.ctx.session.setSteeringMode(mode);
705
+ return true;
706
+ }
707
+ if (kind === "follow_up" && (mode === "all" || mode === "one-at-a-time")) {
708
+ this.ctx.session.setFollowUpMode(mode);
709
+ return true;
710
+ }
711
+ if (kind === "interrupt" && (mode === "immediate" || mode === "wait")) {
712
+ this.ctx.session.setInterruptMode(mode);
713
+ return true;
714
+ }
715
+ return false;
716
+ },
717
+ getSkillState: () =>
718
+ this.ctx.session.skills.map(skill => ({ name: skill.name, description: skill.description })),
719
+ getConfigItems: () => ({
720
+ steeringMode: this.ctx.session.steeringMode,
721
+ followUpMode: this.ctx.session.followUpMode,
722
+ interruptMode: this.ctx.session.interruptMode,
723
+ }),
724
+ getBranchCandidates: () => this.ctx.sessionManager.getTree(),
725
+ getExtensions: () => this.ctx.session.extensionRunner?.getExtensionPaths() ?? [],
726
+ setSdkPermissionProvider: provider => this.ctx.session.setSdkPermissionProvider(provider),
727
+ sdkControl: this.#sdkControl,
403
728
  };
404
729
  const commandActions: ExtensionCommandContextActions = {
405
730
  getContextUsage: () => this.ctx.session.getContextUsage(),
@@ -420,28 +745,24 @@ export class ExtensionUiController {
420
745
  if (this.ctx.isBackgrounded) {
421
746
  return { cancelled: true };
422
747
  }
423
- // Stop any loading animation
748
+ const cleanupPreviousSessionUi = this.captureSessionUiCleanup();
749
+ const success = await this.ctx.session.newSession({ parentSession: options?.parentSession });
750
+ if (!success) {
751
+ return { cancelled: true };
752
+ }
753
+ cleanupPreviousSessionUi();
754
+
424
755
  if (this.ctx.loadingAnimation) {
425
756
  this.ctx.loadingAnimation.stop();
426
757
  this.ctx.loadingAnimation = undefined;
427
758
  }
428
759
  this.ctx.statusContainer.clear();
429
-
430
- // Create new session
431
- this.clearExtensionTerminalInputListeners();
432
- this.clearHookWidgets();
433
- const success = await this.ctx.session.newSession({ parentSession: options?.parentSession });
434
- if (!success) {
435
- return { cancelled: true };
436
- }
437
760
  this.ctx.resetIrcSidebarSession();
438
761
 
439
- // Call setup callback if provided
440
762
  if (options?.setup) {
441
763
  await options.setup(this.ctx.sessionManager);
442
764
  }
443
765
 
444
- // Clear UI state
445
766
  prepareTranscriptRebuild(this.ctx.ui, "replace-identity");
446
767
  this.ctx.chatContainer.clear();
447
768
  this.ctx.pendingMessagesContainer.clear();
@@ -576,6 +897,14 @@ export class ExtensionUiController {
576
897
  model: this.ctx.session.model,
577
898
  isIdle: () => !this.ctx.session.isStreaming,
578
899
  hasPendingMessages: () => this.ctx.session.queuedMessageCount > 0,
900
+ getPendingMessageCounts: () => this.ctx.session.pendingMessageCounts,
901
+ getTranscript: () => this.ctx.session.getTranscript(),
902
+ getTranscriptBody: entryId => this.ctx.session.getTranscriptBody(entryId),
903
+ getGoalState: () => this.ctx.session.getGoalModeState(),
904
+ getTodoState: () => this.ctx.session.getTodoPhases(),
905
+ getQueuedMessages: () => this.ctx.session.getQueuedMessageEntries(),
906
+ getActiveTools: () => this.ctx.session.getActiveToolNames(),
907
+ getAllTools: () => this.ctx.session.getAllToolNames(),
579
908
  hasQueuedMessages: () => this.ctx.session.queuedMessageCount > 0,
580
909
  abort: () => {
581
910
  this.ctx.session.abort();
@@ -584,6 +913,44 @@ export class ExtensionUiController {
584
913
  // Signal shutdown request
585
914
  },
586
915
  getSystemPrompt: () => [...this.ctx.session.systemPrompt],
916
+ cycleModel: () => this.ctx.session.cycleModel(),
917
+ cycleThinkingLevel: () => this.ctx.session.cycleThinkingLevel(),
918
+ setQueueMode: (kind, mode) => {
919
+ if (kind === "steering" && (mode === "all" || mode === "one-at-a-time")) {
920
+ this.ctx.session.setSteeringMode(mode);
921
+ return true;
922
+ }
923
+ if (kind === "follow_up" && (mode === "all" || mode === "one-at-a-time")) {
924
+ this.ctx.session.setFollowUpMode(mode);
925
+ return true;
926
+ }
927
+ if (kind === "interrupt" && (mode === "immediate" || mode === "wait")) {
928
+ this.ctx.session.setInterruptMode(mode);
929
+ return true;
930
+ }
931
+ return false;
932
+ },
933
+ getSkillState: () =>
934
+ this.ctx.session.skills.map(skill => ({ name: skill.name, description: skill.description })),
935
+ getConfigItems: () => ({
936
+ steeringMode: this.ctx.session.steeringMode,
937
+ followUpMode: this.ctx.session.followUpMode,
938
+ interruptMode: this.ctx.session.interruptMode,
939
+ }),
940
+ getBranchCandidates: () => this.ctx.sessionManager.getTree(),
941
+ getExtensions: () => this.ctx.session.extensionRunner?.getExtensionPaths() ?? [],
942
+ getArtifact: () => undefined,
943
+ getJobs: () => undefined,
944
+ sdkBindings: () => [
945
+ "cycleModel",
946
+ "cycleThinkingLevel",
947
+ "setQueueMode",
948
+ "getSkillState",
949
+ "getConfigItems",
950
+ "getBranchCandidates",
951
+ "getExtensions",
952
+ ],
953
+ clearContext: () => this.ctx.session.clearContext(),
587
954
  });
588
955
  } catch (err) {
589
956
  this.showToolError(registeredTool.definition.name, err instanceof Error ? err.message : String(err));
@@ -981,9 +1348,10 @@ export class ExtensionUiController {
981
1348
  // (queueSteer/queueFollowUp push synchronously) before refreshing pending display.
982
1349
  const send = this.ctx.session.sendUserMessage(content, options);
983
1350
  applyInjectedUserSubmission(this.ctx, { content, queued });
984
- send.catch((err: unknown) => {
1351
+ void send.catch((err: unknown) => {
985
1352
  this.ctx.showError(`Extension sendUserMessage failed: ${err instanceof Error ? err.message : String(err)}`);
986
1353
  });
1354
+ return send;
987
1355
  };
988
1356
 
989
1357
  #applyCustomMessageDisplay(wasStreaming: boolean, shouldDisplay: boolean | undefined): void {