@gajae-code/coding-agent 0.10.1 → 0.11.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 (474) hide show
  1. package/CHANGELOG.md +70 -2
  2. package/dist/types/append-only-mode.d.ts +1 -1
  3. package/dist/types/cli/args.d.ts +4 -5
  4. package/dist/types/cli/daemon-cli.d.ts +12 -1
  5. package/dist/types/cli/notify-cli.d.ts +21 -1
  6. package/dist/types/cli.d.ts +3 -0
  7. package/dist/types/commands/daemon.d.ts +39 -0
  8. package/dist/types/commands/launch.d.ts +3 -0
  9. package/dist/types/commands/notify.d.ts +28 -1
  10. package/dist/types/commands/sdk.d.ts +33 -0
  11. package/dist/types/config/atomic-yaml-patch.d.ts +85 -0
  12. package/dist/types/config/model-profile-activation.d.ts +35 -15
  13. package/dist/types/config/model-profiles.d.ts +11 -5
  14. package/dist/types/config/model-registry.d.ts +3 -3
  15. package/dist/types/config/model-resolver.d.ts +39 -6
  16. package/dist/types/config/model-selector-value.d.ts +17 -0
  17. package/dist/types/config/models-config-schema.d.ts +10 -6
  18. package/dist/types/config/settings-schema.d.ts +133 -6
  19. package/dist/types/config/settings.d.ts +63 -35
  20. package/dist/types/coordinator-mcp/model-preset.d.ts +7 -6
  21. package/dist/types/coordinator-mcp/server.d.ts +6 -49
  22. package/dist/types/daemon/builtin.d.ts +6 -5
  23. package/dist/types/daemon/control-types.d.ts +1 -1
  24. package/dist/types/discovery/mcp-json.d.ts +12 -1
  25. package/dist/types/extensibility/custom-tools/types.d.ts +1 -1
  26. package/dist/types/extensibility/extensions/compact-handler.d.ts +4 -2
  27. package/dist/types/extensibility/extensions/get-commands-handler.d.ts +2 -2
  28. package/dist/types/extensibility/extensions/loader.d.ts +10 -1
  29. package/dist/types/extensibility/extensions/runner.d.ts +3 -3
  30. package/dist/types/extensibility/extensions/types.d.ts +141 -16
  31. package/dist/types/extensibility/hooks/types.d.ts +1 -1
  32. package/dist/types/gjc-runtime/launch-tmux.d.ts +3 -2
  33. package/dist/types/gjc-runtime/psmux-detect.d.ts +3 -0
  34. package/dist/types/gjc-runtime/session-state-sidecar.d.ts +3 -0
  35. package/dist/types/gjc-runtime/team-runtime.d.ts +3 -4
  36. package/dist/types/gjc-runtime/tmux-owner-isolation-cli.d.ts +13 -0
  37. package/dist/types/gjc-runtime/tmux-sessions.d.ts +4 -1
  38. package/dist/types/gjc-runtime/windows-powershell-command.d.ts +9 -0
  39. package/dist/types/harness-control-plane/operate.d.ts +5 -5
  40. package/dist/types/harness-control-plane/owner.d.ts +18 -4
  41. package/dist/types/harness-control-plane/receipts.d.ts +0 -1
  42. package/dist/types/harness-control-plane/sdk-transport.d.ts +43 -0
  43. package/dist/types/harness-control-plane/session-transport.d.ts +48 -0
  44. package/dist/types/harness-control-plane/types.d.ts +3 -4
  45. package/dist/types/lsp/index.d.ts +1 -1
  46. package/dist/types/main.d.ts +32 -38
  47. package/dist/types/modes/acp/acp-agent.d.ts +224 -53
  48. package/dist/types/modes/acp/acp-client-bridge.d.ts +1 -0
  49. package/dist/types/modes/acp/acp-mode.d.ts +6 -15
  50. package/dist/types/modes/acp/permission-mode.d.ts +4 -0
  51. package/dist/types/modes/acp/startup-options.d.ts +6 -0
  52. package/dist/types/modes/components/agent-dashboard.d.ts +3 -0
  53. package/dist/types/modes/components/gajae-pet-widget.d.ts +1 -0
  54. package/dist/types/modes/components/model-selector.d.ts +1 -0
  55. package/dist/types/modes/components/notifications-settings-editor.d.ts +135 -0
  56. package/dist/types/modes/components/pet-capability.d.ts +37 -0
  57. package/dist/types/modes/components/pet-selector.d.ts +1 -1
  58. package/dist/types/modes/components/settings-selector.d.ts +15 -4
  59. package/dist/types/modes/components/welcome.d.ts +1 -1
  60. package/dist/types/modes/controllers/selector-controller.d.ts +35 -1
  61. package/dist/types/modes/index.d.ts +0 -4
  62. package/dist/types/modes/interactive-mode.d.ts +5 -1
  63. package/dist/types/modes/runtime-init.d.ts +2 -2
  64. package/dist/types/modes/shared/agent-wire/approval-gate.d.ts +6 -9
  65. package/dist/types/modes/shared/agent-wire/deep-interview-gate.d.ts +4 -6
  66. package/dist/types/modes/shared/agent-wire/event-contract.d.ts +6 -6
  67. package/dist/types/modes/shared/agent-wire/event-envelope.d.ts +4 -9
  68. package/dist/types/modes/shared/agent-wire/event-observation.d.ts +1 -1
  69. package/dist/types/modes/shared/agent-wire/workflow-gate-broker.d.ts +169 -30
  70. package/dist/types/modes/shared/agent-wire/workflow-gate-schema.d.ts +7 -7
  71. package/dist/types/modes/shared/agent-wire/workflow-gate-types.d.ts +105 -0
  72. package/dist/types/modes/types.d.ts +16 -1
  73. package/dist/types/runtime-mcp/client.d.ts +2 -0
  74. package/dist/types/runtime-mcp/config.d.ts +5 -1
  75. package/dist/types/runtime-mcp/manager.d.ts +8 -1
  76. package/dist/types/runtime-mcp/types.d.ts +4 -0
  77. package/dist/types/sdk/acp/adapter.d.ts +67 -0
  78. package/dist/types/sdk/acp/index.d.ts +2 -0
  79. package/dist/types/sdk/broker/broker.d.ts +53 -0
  80. package/dist/types/sdk/broker/discovery.d.ts +30 -0
  81. package/dist/types/sdk/broker/ensure.d.ts +33 -0
  82. package/dist/types/sdk/broker/identity.d.ts +3 -0
  83. package/dist/types/sdk/broker/index.d.ts +8 -0
  84. package/dist/types/sdk/broker/lifecycle-ledger.d.ts +95 -0
  85. package/dist/types/sdk/broker/lifecycle.d.ts +85 -0
  86. package/dist/types/sdk/broker/process-incarnation.d.ts +14 -0
  87. package/dist/types/sdk/broker/runtime.d.ts +33 -0
  88. package/dist/types/sdk/broker/session-index.d.ts +57 -0
  89. package/dist/types/sdk/broker/state-version.d.ts +8 -0
  90. package/dist/types/sdk/broker/transport.d.ts +9 -0
  91. package/dist/types/sdk/bus/chat-command-policy.d.ts +49 -0
  92. package/dist/types/sdk/bus/chat-daemon-cli.d.ts +21 -0
  93. package/dist/types/sdk/bus/chat-daemon-control.d.ts +111 -0
  94. package/dist/types/sdk/bus/chat-daemon-runtime.d.ts +77 -0
  95. package/dist/types/sdk/bus/chat-effect-journal.d.ts +84 -0
  96. package/dist/types/{notifications → sdk/bus}/config-commands.d.ts +7 -2
  97. package/dist/types/sdk/bus/config.d.ts +274 -0
  98. package/dist/types/sdk/bus/conversation-store.d.ts +72 -0
  99. package/dist/types/sdk/bus/discord-conversation.d.ts +58 -0
  100. package/dist/types/sdk/bus/discord-daemon.d.ts +45 -0
  101. package/dist/types/sdk/bus/discord-live-provider.d.ts +70 -0
  102. package/dist/types/sdk/bus/discord-provider.d.ts +85 -0
  103. package/dist/types/{notifications → sdk/bus}/html-format.d.ts +2 -2
  104. package/dist/types/{notifications → sdk/bus}/index.d.ts +113 -13
  105. package/dist/types/{notifications → sdk/bus}/lifecycle-control-runtime.d.ts +4 -2
  106. package/dist/types/{notifications → sdk/bus}/lifecycle-orchestrator.d.ts +18 -21
  107. package/dist/types/{notifications → sdk/bus}/managed-daemon.d.ts +1 -1
  108. package/dist/types/sdk/bus/native-runtime-compatibility.d.ts +13 -0
  109. package/dist/types/sdk/bus/notification-orchestration.d.ts +170 -0
  110. package/dist/types/{notifications → sdk/bus}/notification-service.d.ts +7 -1
  111. package/dist/types/sdk/bus/session-control.d.ts +83 -0
  112. package/dist/types/sdk/bus/slack-conversation.d.ts +56 -0
  113. package/dist/types/sdk/bus/slack-daemon.d.ts +60 -0
  114. package/dist/types/sdk/bus/slack-live-provider.d.ts +59 -0
  115. package/dist/types/sdk/bus/slack-provider.d.ts +55 -0
  116. package/dist/types/{notifications → sdk/bus}/telegram-cli.d.ts +4 -4
  117. package/dist/types/{notifications → sdk/bus}/telegram-daemon-cli.d.ts +14 -5
  118. package/dist/types/sdk/bus/telegram-daemon-contract.d.ts +12 -0
  119. package/dist/types/{notifications → sdk/bus}/telegram-daemon-control.d.ts +2 -2
  120. package/dist/types/{notifications → sdk/bus}/telegram-daemon.d.ts +55 -17
  121. package/dist/types/{notifications → sdk/bus}/telegram-reference.d.ts +2 -2
  122. package/dist/types/sdk/bus/telegram-setup.d.ts +128 -0
  123. package/dist/types/{notifications → sdk/bus}/topic-registry.d.ts +11 -0
  124. package/dist/types/sdk/cli/index.d.ts +1 -0
  125. package/dist/types/sdk/cli/session-cli.d.ts +19 -0
  126. package/dist/types/sdk/client/client.d.ts +1 -0
  127. package/dist/types/sdk/client/discovery.d.ts +27 -0
  128. package/dist/types/sdk/client/index.d.ts +2 -0
  129. package/dist/types/sdk/host/control/dispatch.d.ts +34 -0
  130. package/dist/types/sdk/host/control/index.d.ts +2 -0
  131. package/dist/types/sdk/host/control/operations.d.ts +65 -0
  132. package/dist/types/sdk/host/events.d.ts +35 -0
  133. package/dist/types/sdk/host/host.d.ts +35 -0
  134. package/dist/types/sdk/host/index.d.ts +4 -0
  135. package/dist/types/sdk/host/query/cursor.d.ts +62 -0
  136. package/dist/types/sdk/host/query/handlers.d.ts +70 -0
  137. package/dist/types/sdk/host/query/index.d.ts +3 -0
  138. package/dist/types/sdk/host/query/revision-store.d.ts +60 -0
  139. package/dist/types/sdk/host/reverse-leases.d.ts +45 -0
  140. package/dist/types/sdk/host/types.d.ts +32 -0
  141. package/dist/types/sdk/index.d.ts +6 -0
  142. package/dist/types/sdk/lifecycle-session.d.ts +14 -0
  143. package/dist/types/sdk/mcp/index.d.ts +1 -0
  144. package/dist/types/sdk/mcp/server.d.ts +37 -0
  145. package/dist/types/sdk/models.d.ts +44 -0
  146. package/dist/types/sdk/protocol/adapter-validation.d.ts +14 -0
  147. package/dist/types/sdk/protocol/operation-registry.d.ts +24 -0
  148. package/dist/types/{sdk.d.ts → sdk/session.d.ts} +44 -38
  149. package/dist/types/sdk/startup-capability.d.ts +50 -0
  150. package/dist/types/session/agent-session.d.ts +114 -21
  151. package/dist/types/session/default-model-selection.d.ts +25 -0
  152. package/dist/types/session/fallback-chain-controller.d.ts +52 -0
  153. package/dist/types/session/session-manager.d.ts +58 -1
  154. package/dist/types/setup/credential-auto-import.d.ts +36 -6
  155. package/dist/types/tools/ask-answer-registry.d.ts +1 -1
  156. package/dist/types/tools/browser/benchmark/detector-report.d.ts +63 -0
  157. package/dist/types/tools/browser/benchmark/run-suite.d.ts +18 -0
  158. package/dist/types/tools/browser/launch.d.ts +22 -0
  159. package/dist/types/tools/browser/profile-discovery.d.ts +31 -0
  160. package/dist/types/tools/browser/profile-posture.d.ts +37 -0
  161. package/dist/types/tools/browser/profile-reuse.d.ts +39 -0
  162. package/dist/types/tools/browser/profile-warmup.d.ts +39 -0
  163. package/dist/types/tools/browser/registry.d.ts +19 -0
  164. package/dist/types/tools/browser/tab-protocol.d.ts +4 -0
  165. package/dist/types/tools/index.d.ts +8 -8
  166. package/package.json +34 -13
  167. package/scripts/build-sdk-package-smoke.ts +94 -0
  168. package/scripts/capture-notifications-settings-showcase.ts +435 -0
  169. package/scripts/compile-args.ts +4 -2
  170. package/scripts/g005-daemon-smoke.ts +4 -5
  171. package/scripts/g011-daemon-path-smoke.ts +5 -5
  172. package/scripts/generate-sdk-adapter-parity-manifest.ts +163 -0
  173. package/scripts/generate-sdk-operation-inventory.ts +867 -0
  174. package/scripts/generate-telegram-baseline-manifest.ts +128 -0
  175. package/scripts/manifest-schema.ts +124 -0
  176. package/scripts/run-test-manifest.ts +153 -0
  177. package/scripts/run-threat-model-check.ts +157 -0
  178. package/scripts/verify-gjc-sdk-canonicalization.ts +3467 -0
  179. package/scripts/verify-gjc-sdk-rename.ts +90 -0
  180. package/src/append-only-mode.ts +1 -1
  181. package/src/cli/args.ts +43 -12
  182. package/src/cli/auth-gateway-cli.ts +2 -2
  183. package/src/cli/config-cli.ts +2 -1
  184. package/src/cli/daemon-cli.ts +63 -14
  185. package/src/cli/list-models.ts +1 -1
  186. package/src/cli/notify-cli.ts +288 -286
  187. package/src/cli.ts +21 -2
  188. package/src/commands/daemon.ts +50 -6
  189. package/src/commands/harness.ts +93 -36
  190. package/src/commands/launch.ts +5 -2
  191. package/src/commands/mcp-serve.ts +19 -12
  192. package/src/commands/notify.ts +36 -3
  193. package/src/commands/sdk.ts +426 -0
  194. package/src/commit/agentic/agent.ts +1 -0
  195. package/src/config/atomic-yaml-patch.ts +423 -0
  196. package/src/config/model-profile-activation.ts +240 -89
  197. package/src/config/model-profiles.ts +37 -34
  198. package/src/config/model-registry.ts +51 -26
  199. package/src/config/model-resolver.ts +138 -51
  200. package/src/config/model-selector-value.ts +50 -0
  201. package/src/config/models-config-schema.ts +14 -21
  202. package/src/config/settings-schema.ts +128 -10
  203. package/src/config/settings.ts +1120 -158
  204. package/src/coordinator-mcp/model-preset.ts +74 -20
  205. package/src/coordinator-mcp/server.ts +1597 -3052
  206. package/src/daemon/builtin.ts +8 -5
  207. package/src/daemon/control-types.ts +1 -1
  208. package/src/defaults/gjc/skills/team/SKILL.md +4 -4
  209. package/src/discovery/mcp-json.ts +327 -20
  210. package/src/extensibility/custom-tools/types.ts +1 -1
  211. package/src/extensibility/extensions/compact-handler.ts +3 -3
  212. package/src/extensibility/extensions/get-commands-handler.ts +2 -2
  213. package/src/extensibility/extensions/loader.ts +69 -5
  214. package/src/extensibility/extensions/runner.ts +112 -4
  215. package/src/extensibility/extensions/types.ts +176 -17
  216. package/src/extensibility/hooks/types.ts +1 -1
  217. package/src/extensibility/slash-commands.ts +3 -3
  218. package/src/gjc-runtime/launch-tmux.ts +170 -86
  219. package/src/gjc-runtime/psmux-detect.ts +82 -4
  220. package/src/gjc-runtime/session-state-sidecar.ts +41 -31
  221. package/src/gjc-runtime/team-runtime.ts +54 -35
  222. package/src/gjc-runtime/tmux-owner-isolation-cli.ts +53 -17
  223. package/src/gjc-runtime/tmux-owner-isolation.ts +5 -2
  224. package/src/gjc-runtime/tmux-sessions.ts +19 -13
  225. package/src/gjc-runtime/ultragoal-guard.ts +53 -6
  226. package/src/gjc-runtime/ultragoal-runtime.ts +155 -3
  227. package/src/gjc-runtime/windows-powershell-command.ts +58 -0
  228. package/src/harness-control-plane/operate.ts +9 -9
  229. package/src/harness-control-plane/owner.ts +283 -39
  230. package/src/harness-control-plane/receipts.ts +0 -1
  231. package/src/harness-control-plane/sdk-transport.ts +395 -0
  232. package/src/harness-control-plane/session-transport.ts +94 -0
  233. package/src/harness-control-plane/types.ts +1 -1
  234. package/src/internal-urls/docs-index.generated.ts +36 -37
  235. package/src/lsp/client.ts +42 -6
  236. package/src/lsp/index.ts +2 -2
  237. package/src/main.ts +299 -204
  238. package/src/modes/DESIGN.md +258 -0
  239. package/src/modes/acp/acp-agent.ts +1228 -2612
  240. package/src/modes/acp/acp-client-bridge.ts +2 -20
  241. package/src/modes/acp/acp-event-mapper.ts +18 -2
  242. package/src/modes/acp/acp-mode.ts +8 -36
  243. package/src/modes/acp/permission-mode.ts +25 -0
  244. package/src/modes/acp/startup-options.ts +6 -0
  245. package/src/modes/components/agent-dashboard.ts +37 -17
  246. package/src/modes/components/custom-editor.ts +1 -0
  247. package/src/modes/components/gajae-pet-widget.ts +169 -20
  248. package/src/modes/components/model-selector.ts +93 -35
  249. package/src/modes/components/notifications-settings-editor.ts +1379 -0
  250. package/src/modes/components/pet-capability.ts +115 -0
  251. package/src/modes/components/pet-selector.ts +4 -6
  252. package/src/modes/components/settings-selector.ts +86 -11
  253. package/src/modes/components/welcome.ts +4 -4
  254. package/src/modes/controllers/command-controller.ts +1 -2
  255. package/src/modes/controllers/event-controller.ts +11 -16
  256. package/src/modes/controllers/extension-ui-controller.ts +357 -12
  257. package/src/modes/controllers/input-controller.ts +43 -13
  258. package/src/modes/controllers/selector-controller.ts +671 -44
  259. package/src/modes/index.ts +0 -22
  260. package/src/modes/interactive-mode.ts +108 -24
  261. package/src/modes/runtime-init.ts +298 -6
  262. package/src/modes/shared/agent-wire/approval-gate.ts +9 -11
  263. package/src/modes/shared/agent-wire/deep-interview-gate.ts +10 -11
  264. package/src/modes/shared/agent-wire/event-contract.ts +7 -8
  265. package/src/modes/shared/agent-wire/event-envelope.ts +9 -17
  266. package/src/modes/shared/agent-wire/event-observation.ts +16 -7
  267. package/src/modes/shared/agent-wire/workflow-gate-broker.ts +1254 -87
  268. package/src/modes/shared/agent-wire/workflow-gate-schema.ts +15 -15
  269. package/src/modes/shared/agent-wire/workflow-gate-types.ts +113 -0
  270. package/src/modes/types.ts +16 -1
  271. package/src/runtime-mcp/client.ts +94 -19
  272. package/src/runtime-mcp/config.ts +27 -15
  273. package/src/runtime-mcp/manager.ts +343 -105
  274. package/src/runtime-mcp/oauth-flow.ts +42 -12
  275. package/src/runtime-mcp/transports/http.ts +49 -19
  276. package/src/runtime-mcp/transports/stdio.ts +47 -28
  277. package/src/runtime-mcp/types.ts +10 -0
  278. package/src/sdk/acp/adapter.ts +418 -0
  279. package/src/sdk/acp/index.ts +2 -0
  280. package/src/sdk/broker/broker.ts +642 -0
  281. package/src/sdk/broker/discovery.ts +94 -0
  282. package/src/sdk/broker/ensure.ts +249 -0
  283. package/src/sdk/broker/identity.ts +42 -0
  284. package/src/sdk/broker/index.ts +8 -0
  285. package/src/sdk/broker/internal-source-marker-2178.txt +1 -0
  286. package/src/sdk/broker/internal-source.bunfig.toml +1 -0
  287. package/src/sdk/broker/lifecycle-ledger.ts +286 -0
  288. package/src/sdk/broker/lifecycle.ts +2157 -0
  289. package/src/sdk/broker/process-incarnation.ts +159 -0
  290. package/src/sdk/broker/runtime.ts +164 -0
  291. package/src/sdk/broker/session-index.ts +318 -0
  292. package/src/sdk/broker/state-version.ts +23 -0
  293. package/src/sdk/broker/transport.ts +125 -0
  294. package/src/sdk/bus/chat-command-policy.ts +107 -0
  295. package/src/sdk/bus/chat-daemon-cli.ts +214 -0
  296. package/src/sdk/bus/chat-daemon-control.ts +713 -0
  297. package/src/sdk/bus/chat-daemon-runtime.ts +526 -0
  298. package/src/sdk/bus/chat-effect-journal.ts +353 -0
  299. package/src/{notifications → sdk/bus}/config-commands.ts +39 -10
  300. package/src/sdk/bus/config.ts +433 -0
  301. package/src/sdk/bus/conversation-store.ts +391 -0
  302. package/src/sdk/bus/discord-conversation.ts +85 -0
  303. package/src/sdk/bus/discord-daemon.ts +2275 -0
  304. package/src/sdk/bus/discord-live-provider.ts +521 -0
  305. package/src/sdk/bus/discord-provider.ts +56 -0
  306. package/src/{notifications → sdk/bus}/html-format.ts +2 -2
  307. package/src/sdk/bus/index.ts +3943 -0
  308. package/src/{notifications → sdk/bus}/lifecycle-commands.ts +2 -0
  309. package/src/{notifications → sdk/bus}/lifecycle-control-runtime.ts +225 -196
  310. package/src/{notifications → sdk/bus}/lifecycle-orchestrator.ts +161 -74
  311. package/src/{notifications → sdk/bus}/managed-daemon.ts +2 -2
  312. package/src/sdk/bus/native-runtime-compatibility.ts +42 -0
  313. package/src/sdk/bus/natives-augment.d.ts +38 -0
  314. package/src/sdk/bus/notification-orchestration.ts +535 -0
  315. package/src/{notifications → sdk/bus}/notification-service.ts +106 -12
  316. package/src/sdk/bus/session-control.ts +333 -0
  317. package/src/sdk/bus/slack-conversation.ts +74 -0
  318. package/src/sdk/bus/slack-daemon.ts +2144 -0
  319. package/src/sdk/bus/slack-live-provider.ts +380 -0
  320. package/src/sdk/bus/slack-provider.ts +76 -0
  321. package/src/{notifications → sdk/bus}/telegram-cli.ts +8 -8
  322. package/src/sdk/bus/telegram-daemon-cli.ts +330 -0
  323. package/src/sdk/bus/telegram-daemon-contract.ts +14 -0
  324. package/src/{notifications → sdk/bus}/telegram-daemon-control.ts +4 -4
  325. package/src/{notifications → sdk/bus}/telegram-daemon.ts +502 -54
  326. package/src/{notifications → sdk/bus}/telegram-reference.ts +2 -2
  327. package/src/sdk/bus/telegram-setup.ts +663 -0
  328. package/src/{notifications → sdk/bus}/topic-registry.ts +32 -0
  329. package/src/sdk/cli/index.ts +1 -0
  330. package/src/sdk/cli/session-cli.ts +275 -0
  331. package/src/sdk/client/client.ts +1 -0
  332. package/src/sdk/client/discovery.ts +108 -0
  333. package/src/sdk/client/index.ts +2 -0
  334. package/src/sdk/host/control/dispatch.ts +367 -0
  335. package/src/sdk/host/control/index.ts +10 -0
  336. package/src/sdk/host/control/operations.ts +63 -0
  337. package/src/sdk/host/events.ts +91 -0
  338. package/src/sdk/host/host.ts +296 -0
  339. package/src/sdk/host/index.ts +4 -0
  340. package/src/sdk/host/query/cursor.ts +189 -0
  341. package/src/sdk/host/query/handlers.ts +533 -0
  342. package/src/sdk/host/query/index.ts +3 -0
  343. package/src/sdk/host/query/revision-store.ts +1126 -0
  344. package/src/sdk/host/reverse-leases.ts +325 -0
  345. package/src/sdk/host/types.ts +29 -0
  346. package/src/sdk/index.ts +13 -0
  347. package/src/sdk/lifecycle-session.ts +39 -0
  348. package/src/sdk/mcp/index.ts +1 -0
  349. package/src/sdk/mcp/server.ts +332 -0
  350. package/src/sdk/models.ts +168 -0
  351. package/src/sdk/protocol/adapter-validation.ts +48 -0
  352. package/src/sdk/protocol/operation-inventory.generated.json +5654 -0
  353. package/src/sdk/protocol/operation-registry.ts +312 -0
  354. package/src/{sdk.ts → sdk/session.ts} +339 -212
  355. package/src/sdk/startup-capability.ts +189 -0
  356. package/src/session/agent-session.ts +2470 -866
  357. package/src/session/default-model-selection.ts +93 -0
  358. package/src/session/fallback-chain-controller.ts +136 -0
  359. package/src/session/session-manager.ts +447 -13
  360. package/src/session/session-storage.ts +8 -1
  361. package/src/setup/credential-auto-import.ts +290 -35
  362. package/src/setup/hermes/templates/operator-instructions.v1.md +3 -5
  363. package/src/slash-commands/builtin-registry.ts +33 -30
  364. package/src/task/executor.ts +62 -13
  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/telegram-send.ts +2 -2
  384. package/vendor/insane-search/MANIFEST.json +2 -1
  385. package/vendor/insane-search/engine/bias_check.py +4 -1
  386. package/vendor/insane-search/engine/phase0.py +26 -1
  387. package/dist/types/harness-control-plane/rpc-adapter.d.ts +0 -69
  388. package/dist/types/modes/bridge/auth.d.ts +0 -12
  389. package/dist/types/modes/bridge/bridge-client-bridge.d.ts +0 -9
  390. package/dist/types/modes/bridge/bridge-mode.d.ts +0 -47
  391. package/dist/types/modes/bridge/bridge-ui-context.d.ts +0 -88
  392. package/dist/types/modes/bridge/event-stream.d.ts +0 -8
  393. package/dist/types/modes/rpc/host-tools.d.ts +0 -1
  394. package/dist/types/modes/rpc/host-uris.d.ts +0 -1
  395. package/dist/types/modes/rpc/rpc-client.d.ts +0 -299
  396. package/dist/types/modes/rpc/rpc-mode.d.ts +0 -86
  397. package/dist/types/modes/rpc/rpc-socket-security.d.ts +0 -10
  398. package/dist/types/modes/rpc/rpc-types.d.ts +0 -810
  399. package/dist/types/modes/shared/agent-wire/command-contract.d.ts +0 -18
  400. package/dist/types/modes/shared/agent-wire/command-dispatch.d.ts +0 -37
  401. package/dist/types/modes/shared/agent-wire/command-validation.d.ts +0 -2
  402. package/dist/types/modes/shared/agent-wire/handshake.d.ts +0 -56
  403. package/dist/types/modes/shared/agent-wire/host-tool-bridge.d.ts +0 -16
  404. package/dist/types/modes/shared/agent-wire/host-uri-bridge.d.ts +0 -17
  405. package/dist/types/modes/shared/agent-wire/protocol.d.ts +0 -25
  406. package/dist/types/modes/shared/agent-wire/responses.d.ts +0 -4
  407. package/dist/types/modes/shared/agent-wire/scopes.d.ts +0 -18
  408. package/dist/types/modes/shared/agent-wire/session-registry.d.ts +0 -25
  409. package/dist/types/modes/shared/agent-wire/ui-request-broker.d.ts +0 -42
  410. package/dist/types/modes/shared/agent-wire/ui-result.d.ts +0 -27
  411. package/dist/types/modes/shared/agent-wire/unattended-action-policy.d.ts +0 -29
  412. package/dist/types/modes/shared/agent-wire/unattended-audit.d.ts +0 -68
  413. package/dist/types/modes/shared/agent-wire/unattended-run-controller.d.ts +0 -166
  414. package/dist/types/modes/shared/agent-wire/unattended-session.d.ts +0 -127
  415. package/dist/types/notifications/config.d.ts +0 -132
  416. package/src/harness-control-plane/rpc-adapter.ts +0 -290
  417. package/src/modes/bridge/auth.ts +0 -41
  418. package/src/modes/bridge/bridge-client-bridge.ts +0 -47
  419. package/src/modes/bridge/bridge-mode.ts +0 -675
  420. package/src/modes/bridge/bridge-ui-context.ts +0 -200
  421. package/src/modes/bridge/event-stream.ts +0 -70
  422. package/src/modes/rpc/host-tools.ts +0 -1
  423. package/src/modes/rpc/host-uris.ts +0 -1
  424. package/src/modes/rpc/rpc-client.ts +0 -1166
  425. package/src/modes/rpc/rpc-mode.ts +0 -1029
  426. package/src/modes/rpc/rpc-socket-security.ts +0 -115
  427. package/src/modes/rpc/rpc-types.ts +0 -637
  428. package/src/modes/shared/agent-wire/command-contract.ts +0 -18
  429. package/src/modes/shared/agent-wire/command-dispatch.ts +0 -498
  430. package/src/modes/shared/agent-wire/command-validation.ts +0 -181
  431. package/src/modes/shared/agent-wire/handshake.ts +0 -157
  432. package/src/modes/shared/agent-wire/host-tool-bridge.ts +0 -197
  433. package/src/modes/shared/agent-wire/host-uri-bridge.ts +0 -236
  434. package/src/modes/shared/agent-wire/protocol.ts +0 -46
  435. package/src/modes/shared/agent-wire/responses.ts +0 -17
  436. package/src/modes/shared/agent-wire/scopes.ts +0 -94
  437. package/src/modes/shared/agent-wire/session-registry.ts +0 -109
  438. package/src/modes/shared/agent-wire/ui-request-broker.ts +0 -150
  439. package/src/modes/shared/agent-wire/ui-result.ts +0 -48
  440. package/src/modes/shared/agent-wire/unattended-action-policy.ts +0 -365
  441. package/src/modes/shared/agent-wire/unattended-audit.ts +0 -176
  442. package/src/modes/shared/agent-wire/unattended-run-controller.ts +0 -426
  443. package/src/modes/shared/agent-wire/unattended-session.ts +0 -528
  444. package/src/notifications/config.ts +0 -219
  445. package/src/notifications/index.ts +0 -1835
  446. package/src/notifications/telegram-daemon-cli.ts +0 -243
  447. package/src/tools/puppeteer/09_stealth_locale.txt +0 -46
  448. /package/dist/types/{notifications → sdk/bus}/attachment-registry.d.ts +0 -0
  449. /package/dist/types/{notifications → sdk/bus}/chat-adapters.d.ts +0 -0
  450. /package/dist/types/{notifications → sdk/bus}/daemon-paths.d.ts +0 -0
  451. /package/dist/types/{notifications → sdk/bus}/engine.d.ts +0 -0
  452. /package/dist/types/{notifications → sdk/bus}/helpers.d.ts +0 -0
  453. /package/dist/types/{notifications → sdk/bus}/lifecycle-commands.d.ts +0 -0
  454. /package/dist/types/{notifications → sdk/bus}/operator-runtime.d.ts +0 -0
  455. /package/dist/types/{notifications → sdk/bus}/rate-limit-pool.d.ts +0 -0
  456. /package/dist/types/{notifications → sdk/bus}/recent-activity.d.ts +0 -0
  457. /package/dist/types/{notifications → sdk/bus}/reply-sent-store.d.ts +0 -0
  458. /package/dist/types/{notifications → sdk/bus}/rich-draft.d.ts +0 -0
  459. /package/dist/types/{notifications → sdk/bus}/rich-render.d.ts +0 -0
  460. /package/dist/types/{notifications → sdk/bus}/threaded-inbound.d.ts +0 -0
  461. /package/dist/types/{notifications → sdk/bus}/threaded-render.d.ts +0 -0
  462. /package/src/{notifications → sdk/bus}/attachment-registry.ts +0 -0
  463. /package/src/{notifications → sdk/bus}/chat-adapters.ts +0 -0
  464. /package/src/{notifications → sdk/bus}/daemon-paths.ts +0 -0
  465. /package/src/{notifications → sdk/bus}/engine.ts +0 -0
  466. /package/src/{notifications → sdk/bus}/helpers.ts +0 -0
  467. /package/src/{notifications → sdk/bus}/operator-runtime.ts +0 -0
  468. /package/src/{notifications → sdk/bus}/rate-limit-pool.ts +0 -0
  469. /package/src/{notifications → sdk/bus}/recent-activity.ts +0 -0
  470. /package/src/{notifications → sdk/bus}/reply-sent-store.ts +0 -0
  471. /package/src/{notifications → sdk/bus}/rich-draft.ts +0 -0
  472. /package/src/{notifications → sdk/bus}/rich-render.ts +0 -0
  473. /package/src/{notifications → sdk/bus}/threaded-inbound.ts +0 -0
  474. /package/src/{notifications → sdk/bus}/threaded-render.ts +0 -0
package/src/main.ts CHANGED
@@ -26,9 +26,10 @@ import { buildInitialMessage } from "./cli/initial-message";
26
26
  import { runListModelsCommand } from "./cli/list-models";
27
27
  import { selectSession } from "./cli/session-picker";
28
28
  import { findConfigFile } from "./config";
29
- import { activateModelProfile } from "./config/model-profile-activation";
29
+ import { activateModelProfile, ModelProfileCredentialError } from "./config/model-profile-activation";
30
30
  import { ModelRegistry, ModelsConfigFile } from "./config/model-registry";
31
31
  import { resolveCliModel, resolveModelRoleValue, resolveModelScope, type ScopedModel } from "./config/model-resolver";
32
+ import { selectorHead } from "./config/model-selector-value";
32
33
  import { getDefault, type SettingPath, Settings, settings } from "./config/settings";
33
34
  import { BUNDLED_GROK_BUILD_EXTENSION_ID, getBundledGrokBuildExtensionFactory } from "./defaults/gjc-grok-cli";
34
35
  import { initializeWithSettings } from "./discovery";
@@ -36,6 +37,7 @@ import { exportFromFile } from "./export/html";
36
37
  import type { ExtensionUIContext } from "./extensibility/extensions/types";
37
38
  import { persistCoordinatorRuntimeInputReady } from "./gjc-runtime/session-state-sidecar";
38
39
  import { isTmuxOwnerIsolationCliArgv, runTmuxOwnerIsolationCliFromStdin } from "./gjc-runtime/tmux-owner-isolation-cli";
40
+ import type { AcpStartupOptions } from "./modes/acp/startup-options";
39
41
  import type { SessionSelectionResult } from "./modes/components/session-selector";
40
42
  import type { InteractiveMode } from "./modes/interactive-mode";
41
43
  import type { PrintModeOptions } from "./modes/print-mode";
@@ -51,7 +53,7 @@ import {
51
53
  discoverAuthStorage,
52
54
  } from "./sdk";
53
55
  import type { AgentSession } from "./session/agent-session";
54
- import type { AuthStorage } from "./session/auth-storage";
56
+
55
57
  import {
56
58
  type ResumeSessionIdentity,
57
59
  resolveResumableSession,
@@ -86,19 +88,15 @@ async function checkForNewVersion(currentVersion: string): Promise<string | unde
86
88
  }
87
89
  }
88
90
 
89
- export type StartupUpdateRoute = "interactive" | "print" | "text" | "json" | "rpc" | "rpc-ui" | "acp" | "bridge";
91
+ export type StartupUpdateRoute = "interactive" | "print" | "text" | "json" | "acp";
90
92
 
91
93
  export function classifyStartupUpdateRoute(
92
94
  parsed: Pick<Args, "print" | "mode">,
93
95
  autoPrint: boolean,
94
96
  ): StartupUpdateRoute {
95
- if (!parsed.print && !autoPrint && parsed.mode === undefined) {
96
- return "interactive";
97
- }
98
- if (parsed.print) {
99
- return "print";
100
- }
101
- return parsed.mode ?? "text";
97
+ if (!parsed.print && !autoPrint && parsed.mode === undefined) return "interactive";
98
+ if (parsed.print) return "print";
99
+ return parsed.mode === "acp" ? "acp" : "text";
102
100
  }
103
101
 
104
102
  /** Coordinates the non-blocking update check around the interactive UI lifecycle. */
@@ -115,9 +113,7 @@ export class StartupUpdateOrchestrator {
115
113
  }
116
114
 
117
115
  startBeforeInteractiveInitialization(): void {
118
- if (this.#route !== "interactive" || !this.#enabled() || this.#versionCheckPromise) {
119
- return;
120
- }
116
+ if (this.#route !== "interactive" || !this.#enabled() || this.#versionCheckPromise) return;
121
117
  try {
122
118
  this.#versionCheckPromise = this.#check().catch(() => undefined);
123
119
  } catch {
@@ -128,9 +124,7 @@ export class StartupUpdateOrchestrator {
128
124
  attachAfterInteractiveInitialization(notify: (version: string) => void): void {
129
125
  this.#versionCheckPromise
130
126
  ?.then(version => {
131
- if (version && this.#enabled()) {
132
- notify(version);
133
- }
127
+ if (version && this.#enabled()) notify(version);
134
128
  })
135
129
  .catch(() => {});
136
130
  }
@@ -149,7 +143,7 @@ export async function initializeInteractiveModeWithStartupUpdate(
149
143
  startupUpdate.attachAfterInteractiveInitialization(version => mode.showNewVersionNotification(version));
150
144
  }
151
145
 
152
- const RPC_DEFAULTED_SETTING_PATHS: SettingPath[] = [
146
+ const ACP_DEFAULTED_SETTING_PATHS: SettingPath[] = [
153
147
  "todo.enabled",
154
148
  "todo.reminders",
155
149
  "todo.reminders.max",
@@ -167,18 +161,125 @@ const RPC_DEFAULTED_SETTING_PATHS: SettingPath[] = [
167
161
  "task.maxRecursionDepth",
168
162
  "task.disabledAgents",
169
163
  "task.agentModelOverrides",
170
- // Memory subsystems are off-by-default for RPC hosts; embedders that want
171
- // memory should opt in explicitly through their own settings layer.
164
+ // Memory subsystems are off-by-default for embedded (ACP) hosts; embedders
165
+ // that want memory should opt in explicitly through their own settings layer.
172
166
  "memory.backend",
173
167
  "memories.enabled",
174
168
  ];
175
169
 
176
- function applyRpcDefaultSettingOverrides(targetSettings: Settings = settings): void {
177
- for (const settingPath of RPC_DEFAULTED_SETTING_PATHS) {
170
+ function applyAcpDefaultSettingOverrides(targetSettings: Settings = settings): void {
171
+ for (const settingPath of ACP_DEFAULTED_SETTING_PATHS) {
178
172
  targetSettings.override(settingPath, getDefault(settingPath));
179
173
  }
180
174
  }
181
175
 
176
+ /**
177
+ * Translate only ACP startup settings with a canonical SDK control carrier.
178
+ * Every other local-session flag is rejected so the broker-backed ACP host
179
+ * never appears to accept options it cannot apply to its remote session.
180
+ */
181
+ export function resolveAcpStartupOptions(
182
+ parsed: Pick<
183
+ Args,
184
+ | "allowHome"
185
+ | "apiKey"
186
+ | "appendSystemPrompt"
187
+ | "credential"
188
+ | "continue"
189
+ | "default"
190
+ | "cwd"
191
+ | "fileArgs"
192
+ | "fork"
193
+ | "hooks"
194
+ | "messages"
195
+ | "mpreset"
196
+ | "mcpConfig"
197
+ | "model"
198
+ | "models"
199
+ | "noLsp"
200
+ | "noPty"
201
+ | "noRules"
202
+ | "noSession"
203
+ | "noSkills"
204
+ | "noTitle"
205
+ | "noTools"
206
+ | "pluginDirs"
207
+ | "print"
208
+ | "provider"
209
+ | "providerSessionId"
210
+ | "resume"
211
+ | "sessionDir"
212
+ | "skills"
213
+ | "slow"
214
+ | "smol"
215
+ | "plan"
216
+ | "systemPrompt"
217
+ | "thinking"
218
+ | "tmux"
219
+ | "tools"
220
+ | "extensions"
221
+ | "unknownFlags"
222
+ >,
223
+ sessionOptions: Pick<CreateAgentSessionOptions, "model" | "modelPattern" | "thinkingLevel">,
224
+ ): AcpStartupOptions {
225
+ const unsupported = [
226
+ ...(parsed.allowHome ? ["--allow-home"] : []),
227
+ ...(parsed.default ? ["--default"] : []),
228
+ ...(parsed.apiKey ? ["--api-key"] : []),
229
+ ...(parsed.appendSystemPrompt ? ["--append-system-prompt"] : []),
230
+ ...(parsed.credential ? ["--credential"] : []),
231
+ ...(parsed.continue ? ["--continue"] : []),
232
+ ...(parsed.cwd ? ["--cwd"] : []),
233
+ ...(parsed.fileArgs.length > 0 ? ["@file"] : []),
234
+ ...(parsed.fork ? ["--fork"] : []),
235
+ ...(parsed.hooks?.length ? ["--hook"] : []),
236
+ ...(parsed.messages.length > 0 ? ["initial prompt"] : []),
237
+ ...(parsed.models?.length ? ["--models"] : []),
238
+ ...(parsed.mcpConfig !== undefined ? ["--mcp-config"] : []),
239
+ ...(parsed.noLsp ? ["--no-lsp"] : []),
240
+ ...(parsed.noPty ? ["--no-pty"] : []),
241
+ ...(parsed.noRules ? ["--no-rules"] : []),
242
+ ...(parsed.noSession ? ["--no-session"] : []),
243
+ ...(parsed.noSkills ? ["--no-skills"] : []),
244
+ ...(parsed.noTitle ? ["--no-title"] : []),
245
+ ...(parsed.noTools ? ["--no-tools"] : []),
246
+ ...(parsed.pluginDirs?.length ? ["--plugin-dir"] : []),
247
+ ...(parsed.print ? ["--print"] : []),
248
+ ...(parsed.provider && !parsed.model ? ["--provider"] : []),
249
+ ...(parsed.providerSessionId ? ["--provider-session-id"] : []),
250
+ ...(parsed.resume ? ["--resume"] : []),
251
+ ...(parsed.sessionDir ? ["--session-dir"] : []),
252
+ ...(parsed.skills?.length ? ["--skills"] : []),
253
+ ...(parsed.slow ? ["--slow"] : []),
254
+ ...(parsed.smol ? ["--smol"] : []),
255
+ ...(parsed.plan ? ["--plan"] : []),
256
+ ...(parsed.systemPrompt ? ["--system-prompt"] : []),
257
+ ...(parsed.tmux ? ["--tmux"] : []),
258
+ ...(parsed.tools?.length ? ["--tools"] : []),
259
+ ...(parsed.extensions?.length ? ["--extension"] : []),
260
+ ...(parsed.unknownFlags.size > 0 ? ["extension flags"] : []),
261
+ ];
262
+ if (unsupported.length > 0) {
263
+ throw new Error(
264
+ `Unsupported under SDK-backed ACP: ${unsupported.join(", ")}. Use ACP session configuration or SDK controls after session creation.`,
265
+ );
266
+ }
267
+ if (parsed.model && (!sessionOptions.model || sessionOptions.modelPattern)) {
268
+ throw new Error(
269
+ "Unsupported under SDK-backed ACP: --model could not be resolved to a canonical model ID. Use session/set_config_option after session creation.",
270
+ );
271
+ }
272
+ return {
273
+ ...(parsed.mpreset ? { modelPreset: parsed.mpreset } : {}),
274
+ ...(parsed.model && sessionOptions.model
275
+ ? { modelId: `${sessionOptions.model.provider}/${sessionOptions.model.id}` }
276
+ : {}),
277
+ ...((parsed.model || parsed.thinking) && sessionOptions.thinkingLevel
278
+ ? { thinkingLevel: sessionOptions.thinkingLevel }
279
+ : {}),
280
+ };
281
+ }
282
+
182
283
  async function readPipedInput(): Promise<string | undefined> {
183
284
  if (process.stdin.isTTY !== false) return undefined;
184
285
  try {
@@ -267,36 +368,36 @@ type CreateSessionForMain = (
267
368
  context?: { skipPostCreateModelRefresh?: boolean },
268
369
  ) => Promise<CreateAgentSessionResult>;
269
370
 
270
- type AcpSessionFactory = (cwd: string) => Promise<AgentSession>;
271
-
272
- export interface AcpSessionFactoryOptions {
273
- baseOptions: CreateAgentSessionOptions;
274
- settings: Settings;
275
- sessionDir?: string;
276
- authStorage: AuthStorage;
277
- modelRegistry: ModelRegistry;
278
- parsedArgs: Pick<Args, "apiKey" | "default" | "model" | "mpreset" | "thinking">;
279
- rawArgs: string[];
280
- createSession: CreateSessionForMain;
281
- }
282
-
283
- export async function applyStartupModelProfiles(args: {
371
+ type StartupModelProfileArgs = {
284
372
  session: AgentSession;
285
373
  settings: Settings;
286
374
  modelRegistry: ModelRegistry;
287
375
  parsedArgs: Pick<Args, "default" | "model" | "mpreset" | "thinking">;
288
376
  startupModel?: CreateAgentSessionOptions["model"];
289
377
  startupThinkingLevel?: CreateAgentSessionOptions["thinkingLevel"];
290
- }): Promise<void> {
378
+ };
379
+
380
+ async function applyStartupModelProfilesWithPolicy(
381
+ args: StartupModelProfileArgs,
382
+ onCredentialError?: (error: ModelProfileCredentialError) => void,
383
+ ): Promise<void> {
291
384
  const applyProfile = async (
292
385
  profileName: string,
293
386
  persistDefault: boolean,
294
387
  options: { thinkingLevelOverride?: CreateAgentSessionOptions["thinkingLevel"] } = {},
295
388
  ): Promise<void> => {
296
- await activateModelProfile(
297
- { session: args.session, modelRegistry: args.modelRegistry, settings: args.settings, profileName },
298
- { persistDefault, thinkingLevelOverride: options.thinkingLevelOverride },
299
- );
389
+ try {
390
+ await activateModelProfile(
391
+ { session: args.session, modelRegistry: args.modelRegistry, settings: args.settings, profileName },
392
+ { persistDefault, thinkingLevelOverride: options.thinkingLevelOverride },
393
+ );
394
+ } catch (error) {
395
+ if (onCredentialError && error instanceof ModelProfileCredentialError) {
396
+ onCredentialError(error);
397
+ return;
398
+ }
399
+ throw error;
400
+ }
300
401
  };
301
402
 
302
403
  // Capture the explicitly-selected startup model BEFORE profile activation can
@@ -319,68 +420,76 @@ export async function applyStartupModelProfiles(args: {
319
420
  await applyProfile(args.parsedArgs.mpreset, args.parsedArgs.default === true);
320
421
  }
321
422
 
322
- // Explicit CLI --model/--thinking must win over any activated profile.
423
+ // Explicit CLI --model/--thinking must win over any activated or skipped profile.
323
424
  if (explicitModel) {
324
- await args.session.setModelTemporary(explicitModel, args.startupThinkingLevel ?? args.parsedArgs.thinking);
425
+ await args.session.setModelTemporary(explicitModel, args.startupThinkingLevel ?? args.parsedArgs.thinking, {
426
+ persistAsSessionDefault: true,
427
+ cause: "startup-override",
428
+ });
429
+ const selector = `${explicitModel.provider}/${explicitModel.id}`;
430
+ args.session.setConfiguredModelChain("default", [selector], "startup-override", undefined, true);
431
+ args.session.seedDefaultFallbackResolution(0, []);
325
432
  } else if (args.parsedArgs.thinking && args.session.model) {
326
- await args.session.setModelTemporary(args.session.model, args.parsedArgs.thinking);
433
+ await args.session.setModelTemporary(args.session.model, args.parsedArgs.thinking, { cause: "startup-override" });
327
434
  }
328
435
  }
329
436
 
330
- export async function applyStartupModelProfilesOrExit(
331
- args: Parameters<typeof applyStartupModelProfiles>[0],
332
- ): Promise<void> {
437
+ export async function applyStartupModelProfiles(args: StartupModelProfileArgs): Promise<void> {
438
+ await applyStartupModelProfilesWithPolicy(args);
439
+ }
440
+
441
+ async function exitForStartupModelProfileError(args: StartupModelProfileArgs, error: unknown): Promise<never> {
442
+ const message = error instanceof Error ? error.message : String(error);
443
+ process.stderr.write(`${chalk.red(`Error: ${message}`)}\n`);
444
+ await args.session.dispose();
445
+ process.exit(1);
446
+ }
447
+
448
+ export async function applyStartupModelProfilesOrExit(args: StartupModelProfileArgs): Promise<void> {
333
449
  try {
334
450
  await applyStartupModelProfiles(args);
335
451
  } catch (error) {
336
- const message = error instanceof Error ? error.message : String(error);
337
- process.stderr.write(`${chalk.red(`Error: ${message}`)}\n`);
338
- process.exit(1);
452
+ await exitForStartupModelProfileError(args, error);
339
453
  }
340
454
  }
341
455
 
342
- /**
343
- * Build the per-`session/new` factory used by ACP mode.
344
- *
345
- * MCP servers in ACP sessions are owned exclusively by the ACP client, which
346
- * supplies them through `session/new.mcpServers` and re-applies them via
347
- * {@link AcpAgent#configureMcpServers}. We therefore force `enableMCP: false`
348
- * on every session created here so {@link createAgentSession} skips the on-disk
349
- * `.mcp.json` discovery path — otherwise host MCP tools land in the session's
350
- * tool registry and shadow the client-supplied servers (issue #1234).
351
- */
352
- export function createAcpSessionFactory(args: AcpSessionFactoryOptions): AcpSessionFactory {
353
- return async cwd => {
354
- const nextSettings = await args.settings.cloneForCwd(cwd);
355
- const hasStartupProfile = Boolean(nextSettings.get("modelProfile.default") || args.parsedArgs.mpreset);
356
- const nextSessionManager = SessionManager.create(cwd, args.sessionDir);
357
- const agentId = `acp:${nextSessionManager.getSessionId()}`;
358
- const { session: nextSession } = await args.createSession(
359
- {
360
- ...args.baseOptions,
361
- cwd,
362
- sessionManager: nextSessionManager,
363
- settings: nextSettings,
364
- authStorage: args.authStorage,
365
- modelRegistry: args.modelRegistry,
366
- agentId,
367
- hasUI: false,
368
- enableMCP: false,
369
- },
370
- { skipPostCreateModelRefresh: hasStartupProfile },
371
- );
372
- await applyStartupModelProfilesOrExit({
373
- session: nextSession,
374
- settings: nextSettings,
375
- modelRegistry: args.modelRegistry,
376
- parsedArgs: args.parsedArgs,
377
- startupModel: args.baseOptions.model,
378
- startupThinkingLevel: args.baseOptions.thinkingLevel,
379
- });
380
- applyCliRuntimeApiKeyOverride(args.authStorage, args.parsedArgs.apiKey, nextSession.model);
381
- applyExtensionFlagValues(nextSession, args.rawArgs);
382
- return nextSession;
383
- };
456
+ export function isStartupModelProfileCredentialRecoveryEligible(options: {
457
+ isInteractive: boolean;
458
+ hasInteractiveTerminal: boolean;
459
+ initialMessage: string | undefined;
460
+ initialMessages: readonly string[];
461
+ resumeAction: "continue-tail" | "open-idle" | undefined;
462
+ }): boolean {
463
+ return (
464
+ options.isInteractive &&
465
+ options.hasInteractiveTerminal &&
466
+ options.initialMessage === undefined &&
467
+ options.initialMessages.length === 0 &&
468
+ options.resumeAction !== "continue-tail"
469
+ );
470
+ }
471
+
472
+ export async function applyStartupModelProfilesForRoot(
473
+ args: StartupModelProfileArgs & {
474
+ isInteractive: boolean;
475
+ hasInteractiveTerminal: boolean;
476
+ initialMessage: string | undefined;
477
+ initialMessages: readonly string[];
478
+ resumeAction: "continue-tail" | "open-idle" | undefined;
479
+ },
480
+ ): Promise<{ recoverableErrors: string[] }> {
481
+ if (!isStartupModelProfileCredentialRecoveryEligible(args)) {
482
+ await applyStartupModelProfilesOrExit(args);
483
+ return { recoverableErrors: [] };
484
+ }
485
+
486
+ const recoverableErrors: string[] = [];
487
+ try {
488
+ await applyStartupModelProfilesWithPolicy(args, error => recoverableErrors.push(error.message));
489
+ } catch (error) {
490
+ await exitForStartupModelProfileError(args, error);
491
+ }
492
+ return { recoverableErrors };
384
493
  }
385
494
 
386
495
  interface InteractiveModeFactoryOptions {
@@ -735,6 +844,7 @@ async function buildSessionOptions(
735
844
  const options: CreateAgentSessionOptions = {
736
845
  cwd: parsed.cwd ?? getProjectDir(),
737
846
  };
847
+ if (parsed.mcpConfig !== undefined) options.mcpConfigPath = parsed.mcpConfig;
738
848
 
739
849
  const systemPromptSource = parsed.systemPrompt;
740
850
  const resolvedSystemPrompt = await resolvePromptInput(systemPromptSource, "system prompt");
@@ -801,7 +911,9 @@ async function buildSessionOptions(
801
911
  scopedModel.model.provider === rememberedResolvedModel.provider &&
802
912
  scopedModel.model.id === rememberedResolvedModel.id,
803
913
  )
804
- : scopedModels.find(scopedModel => scopedModel.model.id.toLowerCase() === remembered.toLowerCase());
914
+ : scopedModels.find(
915
+ scopedModel => scopedModel.model.id.toLowerCase() === selectorHead(remembered)?.toLowerCase(),
916
+ );
805
917
  if (rememberedModel) {
806
918
  options.model = rememberedModel.model;
807
919
  // Apply explicit thinking level from remembered role value
@@ -881,21 +993,12 @@ export interface RlmPreset {
881
993
  onSessionCreated?: (session: AgentSession) => void | Promise<void>;
882
994
  }
883
995
 
884
- type RunRpcMode = (
885
- session: AgentSession,
886
- setToolUIContext?: CreateAgentSessionResult["setToolUIContext"],
887
- options?: { listen?: string },
888
- ) => Promise<void>;
889
- type RunBridgeMode = (
890
- session: AgentSession,
891
- setToolUIContext?: CreateAgentSessionResult["setToolUIContext"],
892
- ) => Promise<void>;
893
996
  type RunPrintMode = (session: AgentSession, options: PrintModeOptions) => Promise<void>;
894
997
 
895
998
  export interface RunRootCommandDependencies {
896
999
  createAgentSession?: typeof createAgentSession;
897
1000
  discoverAuthStorage?: typeof discoverAuthStorage;
898
- runAcpMode?: (createSession: AcpSessionFactory) => Promise<void>;
1001
+ runAcpMode?: (options?: { agentDir?: string }) => Promise<void>;
899
1002
  settings?: Settings;
900
1003
  rlmPreset?: RlmPreset;
901
1004
  suppressProcessExit?: boolean;
@@ -904,8 +1007,6 @@ export interface RunRootCommandDependencies {
904
1007
  readPipedInput?: typeof readPipedInput;
905
1008
  runStartupCredentialAutoImportIfNeeded?: typeof runStartupCredentialAutoImportIfNeeded;
906
1009
  getChangelogForDisplay?: typeof getChangelogForDisplay;
907
- runRpcMode?: RunRpcMode;
908
- runBridgeMode?: RunBridgeMode;
909
1010
  createInteractiveMode?: CreateInteractiveMode;
910
1011
  runPrintMode?: RunPrintMode;
911
1012
  isResumePickerTerminal?: ResumePickerTerminalCheck;
@@ -1000,7 +1101,7 @@ export async function runRootCommand(
1000
1101
  }
1001
1102
 
1002
1103
  if (parsedArgs.listModels !== undefined) {
1003
- await modelRegistry.refresh("online");
1104
+ await modelRegistry.refresh("online-if-uncached");
1004
1105
  const searchPattern = typeof parsedArgs.listModels === "string" ? parsedArgs.listModels : undefined;
1005
1106
  await runListModelsCommand({
1006
1107
  modelRegistry,
@@ -1030,36 +1131,17 @@ export async function runRootCommand(
1030
1131
  process.exit(0);
1031
1132
  }
1032
1133
 
1033
- if (
1034
- (parsedArgs.mode === "rpc" || parsedArgs.mode === "rpc-ui" || parsedArgs.mode === "bridge") &&
1035
- parsedArgs.fileArgs.length > 0
1036
- ) {
1037
- process.stderr.write(`${chalk.red("Error: @file arguments are not supported in RPC or bridge mode")}\n`);
1038
- process.exit(1);
1039
- }
1040
-
1041
1134
  const cwd = getProjectDir();
1042
1135
  const settingsInstance =
1043
1136
  deps.settings ?? (await logger.time("settings:init", deps.initializeSettings ?? Settings.init, { cwd }));
1044
- if (
1045
- parsedArgs.mode === "rpc" ||
1046
- parsedArgs.mode === "rpc-ui" ||
1047
- parsedArgs.mode === "acp" ||
1048
- parsedArgs.mode === "bridge"
1049
- ) {
1050
- applyRpcDefaultSettingOverrides(settingsInstance);
1137
+ if (parsedArgs.mode === "acp") {
1138
+ applyAcpDefaultSettingOverrides(settingsInstance);
1051
1139
  }
1052
1140
  modelRegistry.applyConfiguredModelBindings(settingsInstance);
1053
- if (parsedArgs.noPty || parsedArgs.mode === "rpc-ui") {
1141
+ if (parsedArgs.noPty) {
1054
1142
  Bun.env.PI_NO_PTY = "1";
1055
1143
  }
1056
- if (
1057
- parsedArgs.noTitle ||
1058
- parsedArgs.mode === "rpc" ||
1059
- parsedArgs.mode === "rpc-ui" ||
1060
- parsedArgs.mode === "acp" ||
1061
- parsedArgs.mode === "bridge"
1062
- ) {
1144
+ if (parsedArgs.noTitle || parsedArgs.mode === "acp") {
1063
1145
  Bun.env.PI_NO_TITLE = "1";
1064
1146
  }
1065
1147
  const { pipedInput, fileText, fileImages } = await logger.time("prepareInitialMessage", async () => {
@@ -1215,12 +1297,14 @@ export async function runRootCommand(
1215
1297
  };
1216
1298
  sessionOptions.authStorage = authStorage;
1217
1299
  sessionOptions.modelRegistry = modelRegistry;
1218
- sessionOptions.hasUI = isInteractive || mode === "rpc-ui";
1300
+ sessionOptions.hasUI = isInteractive;
1301
+ sessionOptions.notificationHostModeSupported = isInteractive;
1219
1302
  sessionOptions.settings = settingsInstance;
1220
1303
  const hasRootStartupProfile = Boolean(settingsInstance.get("modelProfile.default") || parsedArgs.mpreset);
1221
1304
 
1222
1305
  // Research-mode (RLM) preset: augment session options before session creation.
1223
1306
  deps.rlmPreset?.applyOptions(sessionOptions, settingsInstance);
1307
+ const acpStartupOptions = mode === "acp" ? resolveAcpStartupOptions(parsedArgs, sessionOptions) : undefined;
1224
1308
 
1225
1309
  // Handle CLI --api-key as runtime override (not persisted)
1226
1310
  if (parsedArgs.apiKey && parsedArgs.credential) {
@@ -1261,17 +1345,10 @@ export async function runRootCommand(
1261
1345
  };
1262
1346
 
1263
1347
  if (mode === "acp") {
1264
- const createAcpSession = createAcpSessionFactory({
1265
- baseOptions: sessionOptions,
1266
- settings: settingsInstance,
1267
- sessionDir: parsedArgs.sessionDir,
1268
- authStorage,
1269
- modelRegistry,
1270
- parsedArgs,
1271
- rawArgs,
1272
- createSession,
1348
+ await (deps.runAcpMode ?? (await import("./modes/acp")).runAcpMode)({
1349
+ agentDir: settingsInstance.getAgentDir(),
1350
+ ...(acpStartupOptions ? { startupOptions: acpStartupOptions } : {}),
1273
1351
  });
1274
- await (deps.runAcpMode ?? (await import("./modes/acp")).runAcpMode)(createAcpSession);
1275
1352
  } else {
1276
1353
  const { session, setToolUIContext, modelFallbackMessage, lspServers, mcpManager, eventBus } = await createSession(
1277
1354
  sessionOptions,
@@ -1281,17 +1358,36 @@ export async function runRootCommand(
1281
1358
 
1282
1359
  // Research-mode (RLM) preset: hard tool-boundary assertion after the registry is assembled.
1283
1360
  if (deps.rlmPreset?.onSessionCreated) {
1284
- await deps.rlmPreset.onSessionCreated(session);
1361
+ try {
1362
+ await deps.rlmPreset.onSessionCreated(session);
1363
+ } catch (error) {
1364
+ try {
1365
+ await session.dispose();
1366
+ } catch {
1367
+ logger.warn("Failed to dispose session after RLM post-create error");
1368
+ }
1369
+ throw error;
1370
+ }
1285
1371
  }
1286
1372
 
1287
- await applyStartupModelProfilesOrExit({
1288
- session,
1289
- settings: settingsInstance,
1290
- modelRegistry,
1291
- parsedArgs,
1292
- startupModel: sessionOptions.model,
1293
- startupThinkingLevel: sessionOptions.thinkingLevel,
1294
- });
1373
+ if (!(parsedArgs.authBootstrap === true && isInteractive)) {
1374
+ const { recoverableErrors } = await applyStartupModelProfilesForRoot({
1375
+ session,
1376
+ settings: settingsInstance,
1377
+ modelRegistry,
1378
+ parsedArgs,
1379
+ startupModel: sessionOptions.model,
1380
+ startupThinkingLevel: sessionOptions.thinkingLevel,
1381
+ isInteractive,
1382
+ hasInteractiveTerminal: hasResumePickerTerminal(),
1383
+ initialMessage,
1384
+ initialMessages: parsedArgs.messages,
1385
+ resumeAction: bareResumeAction,
1386
+ });
1387
+ for (const recoverableError of recoverableErrors) {
1388
+ notifs.push({ kind: "error", message: recoverableError });
1389
+ }
1390
+ }
1295
1391
 
1296
1392
  if (modelFallbackMessage) {
1297
1393
  notifs.push({ kind: "warn", message: modelFallbackMessage });
@@ -1321,71 +1417,70 @@ export async function runRootCommand(
1321
1417
  process.stderr.write(
1322
1418
  `${chalk.yellow(`\nAdvanced manual config remains available at ${ModelsConfigFile.path()}`)}\n`,
1323
1419
  );
1420
+ await session.dispose();
1421
+ stopThemeWatcher();
1422
+ await postmortem.quit(1);
1324
1423
  process.exit(1);
1325
1424
  }
1326
1425
 
1327
- if (mode === "rpc" || mode === "rpc-ui") {
1328
- const { RpcListenRefusedError, runRpcMode } = await import("./modes/rpc/rpc-mode");
1329
- const runRpc = deps.runRpcMode ?? runRpcMode;
1426
+ if (isInteractive) {
1427
+ let exitForTiming = false;
1330
1428
  try {
1331
- await runRpc(session, mode === "rpc-ui" ? setToolUIContext : undefined, {
1332
- listen: parsedArgs.rpcListen,
1333
- });
1334
- } catch (error) {
1335
- if (!(error instanceof RpcListenRefusedError)) throw error;
1336
- logger.setTransports({ console: true, file: true });
1337
- logger.error(error.message);
1338
- await session.dispose();
1339
- stopThemeWatcher();
1340
- await postmortem.quit(1);
1341
- process.exit(1);
1342
- }
1343
- } else if (mode === "bridge") {
1344
- const runBridge = deps.runBridgeMode ?? (await import("./modes/bridge/bridge-mode")).runBridgeMode;
1345
- await runBridge(session, setToolUIContext);
1346
- } else if (isInteractive) {
1347
- startupUpdate.startBeforeInteractiveInitialization();
1348
- const changelogMarkdown = await logger.time(
1349
- "main:getChangelogForDisplay",
1350
- deps.getChangelogForDisplay ?? getChangelogForDisplay,
1351
- parsedArgs,
1352
- );
1429
+ startupUpdate.startBeforeInteractiveInitialization();
1430
+ const changelogMarkdown = await logger.time(
1431
+ "main:getChangelogForDisplay",
1432
+ deps.getChangelogForDisplay ?? getChangelogForDisplay,
1433
+ parsedArgs,
1434
+ );
1435
+
1436
+ const scopedModelsForDisplay = sessionOptions.scopedModels ?? scopedModels;
1437
+ if (scopedModelsForDisplay.length > 0) {
1438
+ const modelList = scopedModelsForDisplay
1439
+ .map(scopedModel => {
1440
+ const thinkingStr = !scopedModel.thinkingLevel ? `:${scopedModel.thinkingLevel}` : "";
1441
+ return `${scopedModel.model.id}${thinkingStr}`;
1442
+ })
1443
+ .join(", ");
1444
+ process.stdout.write(`${chalk.dim(`Model scope: ${modelList} ${chalk.gray("(Alt+N to cycle)")}`)}\n`);
1445
+ }
1353
1446
 
1354
- const scopedModelsForDisplay = sessionOptions.scopedModels ?? scopedModels;
1355
- if (scopedModelsForDisplay.length > 0) {
1356
- const modelList = scopedModelsForDisplay
1357
- .map(scopedModel => {
1358
- const thinkingStr = !scopedModel.thinkingLevel ? `:${scopedModel.thinkingLevel}` : "";
1359
- return `${scopedModel.model.id}${thinkingStr}`;
1360
- })
1361
- .join(", ");
1362
- process.stdout.write(`${chalk.dim(`Model scope: ${modelList} ${chalk.gray("(Alt+N to cycle)")}`)}\n`);
1363
- }
1447
+ if ($env.PI_TIMING) {
1448
+ logger.printTimings();
1449
+ exitForTiming = $env.PI_TIMING === "x";
1450
+ }
1364
1451
 
1365
- if ($env.PI_TIMING) {
1366
- logger.printTimings();
1367
- if ($env.PI_TIMING === "x") {
1368
- process.exit(0);
1452
+ if (!exitForTiming) {
1453
+ logger.endTiming();
1454
+ await runInteractiveMode(
1455
+ session,
1456
+ VERSION,
1457
+ changelogMarkdown,
1458
+ notifs,
1459
+ startupUpdate,
1460
+ parsedArgs.messages,
1461
+ setToolUIContext,
1462
+ lspServers,
1463
+ mcpManager,
1464
+ eventBus,
1465
+ initialMessage,
1466
+ initialImages,
1467
+ deps.createInteractiveMode,
1468
+ bareResumeAction,
1469
+ );
1369
1470
  }
1471
+ } catch (error) {
1472
+ try {
1473
+ await session.dispose();
1474
+ } catch {
1475
+ logger.warn("Failed to dispose session after interactive error");
1476
+ }
1477
+ throw error;
1370
1478
  }
1371
1479
 
1372
- logger.endTiming();
1373
- await runInteractiveMode(
1374
- session,
1375
- VERSION,
1376
- changelogMarkdown,
1377
- notifs,
1378
- startupUpdate,
1379
- parsedArgs.messages,
1380
- setToolUIContext,
1381
- lspServers,
1382
- mcpManager,
1383
- eventBus,
1384
- initialMessage,
1385
- initialImages,
1386
- deps.createInteractiveMode,
1387
- bareResumeAction,
1388
- );
1480
+ if (exitForTiming) {
1481
+ await session.dispose();
1482
+ process.exit(0);
1483
+ }
1389
1484
  } else {
1390
1485
  const runPrint = deps.runPrintMode ?? (await import("./modes/print-mode")).runPrintMode;
1391
1486
  await runPrint(session, {