@gajae-code/coding-agent 0.10.2 → 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 (465) hide show
  1. package/CHANGELOG.md +50 -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/model-selector.d.ts +1 -0
  54. package/dist/types/modes/components/notifications-settings-editor.d.ts +135 -0
  55. package/dist/types/modes/components/settings-selector.d.ts +6 -4
  56. package/dist/types/modes/components/welcome.d.ts +1 -1
  57. package/dist/types/modes/controllers/selector-controller.d.ts +35 -1
  58. package/dist/types/modes/index.d.ts +0 -4
  59. package/dist/types/modes/interactive-mode.d.ts +3 -0
  60. package/dist/types/modes/runtime-init.d.ts +2 -2
  61. package/dist/types/modes/shared/agent-wire/approval-gate.d.ts +6 -9
  62. package/dist/types/modes/shared/agent-wire/deep-interview-gate.d.ts +4 -6
  63. package/dist/types/modes/shared/agent-wire/event-contract.d.ts +6 -6
  64. package/dist/types/modes/shared/agent-wire/event-envelope.d.ts +4 -9
  65. package/dist/types/modes/shared/agent-wire/event-observation.d.ts +1 -1
  66. package/dist/types/modes/shared/agent-wire/workflow-gate-broker.d.ts +169 -30
  67. package/dist/types/modes/shared/agent-wire/workflow-gate-schema.d.ts +7 -7
  68. package/dist/types/modes/shared/agent-wire/workflow-gate-types.d.ts +105 -0
  69. package/dist/types/modes/types.d.ts +5 -0
  70. package/dist/types/runtime-mcp/client.d.ts +2 -0
  71. package/dist/types/runtime-mcp/config.d.ts +5 -1
  72. package/dist/types/runtime-mcp/manager.d.ts +8 -1
  73. package/dist/types/runtime-mcp/types.d.ts +4 -0
  74. package/dist/types/sdk/acp/adapter.d.ts +67 -0
  75. package/dist/types/sdk/acp/index.d.ts +2 -0
  76. package/dist/types/sdk/broker/broker.d.ts +53 -0
  77. package/dist/types/sdk/broker/discovery.d.ts +30 -0
  78. package/dist/types/sdk/broker/ensure.d.ts +33 -0
  79. package/dist/types/sdk/broker/identity.d.ts +3 -0
  80. package/dist/types/sdk/broker/index.d.ts +8 -0
  81. package/dist/types/sdk/broker/lifecycle-ledger.d.ts +95 -0
  82. package/dist/types/sdk/broker/lifecycle.d.ts +85 -0
  83. package/dist/types/sdk/broker/process-incarnation.d.ts +14 -0
  84. package/dist/types/sdk/broker/runtime.d.ts +33 -0
  85. package/dist/types/sdk/broker/session-index.d.ts +57 -0
  86. package/dist/types/sdk/broker/state-version.d.ts +8 -0
  87. package/dist/types/sdk/broker/transport.d.ts +9 -0
  88. package/dist/types/sdk/bus/chat-command-policy.d.ts +49 -0
  89. package/dist/types/sdk/bus/chat-daemon-cli.d.ts +21 -0
  90. package/dist/types/sdk/bus/chat-daemon-control.d.ts +111 -0
  91. package/dist/types/sdk/bus/chat-daemon-runtime.d.ts +77 -0
  92. package/dist/types/sdk/bus/chat-effect-journal.d.ts +84 -0
  93. package/dist/types/{notifications → sdk/bus}/config-commands.d.ts +7 -2
  94. package/dist/types/sdk/bus/config.d.ts +274 -0
  95. package/dist/types/sdk/bus/conversation-store.d.ts +72 -0
  96. package/dist/types/sdk/bus/discord-conversation.d.ts +58 -0
  97. package/dist/types/sdk/bus/discord-daemon.d.ts +45 -0
  98. package/dist/types/sdk/bus/discord-live-provider.d.ts +70 -0
  99. package/dist/types/sdk/bus/discord-provider.d.ts +85 -0
  100. package/dist/types/{notifications → sdk/bus}/html-format.d.ts +2 -2
  101. package/dist/types/{notifications → sdk/bus}/index.d.ts +113 -13
  102. package/dist/types/{notifications → sdk/bus}/lifecycle-control-runtime.d.ts +4 -2
  103. package/dist/types/{notifications → sdk/bus}/lifecycle-orchestrator.d.ts +18 -21
  104. package/dist/types/{notifications → sdk/bus}/managed-daemon.d.ts +1 -1
  105. package/dist/types/sdk/bus/native-runtime-compatibility.d.ts +13 -0
  106. package/dist/types/sdk/bus/notification-orchestration.d.ts +170 -0
  107. package/dist/types/{notifications → sdk/bus}/notification-service.d.ts +7 -1
  108. package/dist/types/sdk/bus/session-control.d.ts +83 -0
  109. package/dist/types/sdk/bus/slack-conversation.d.ts +56 -0
  110. package/dist/types/sdk/bus/slack-daemon.d.ts +60 -0
  111. package/dist/types/sdk/bus/slack-live-provider.d.ts +59 -0
  112. package/dist/types/sdk/bus/slack-provider.d.ts +55 -0
  113. package/dist/types/{notifications → sdk/bus}/telegram-cli.d.ts +4 -4
  114. package/dist/types/{notifications → sdk/bus}/telegram-daemon-cli.d.ts +14 -5
  115. package/dist/types/sdk/bus/telegram-daemon-contract.d.ts +12 -0
  116. package/dist/types/{notifications → sdk/bus}/telegram-daemon-control.d.ts +2 -2
  117. package/dist/types/{notifications → sdk/bus}/telegram-daemon.d.ts +55 -17
  118. package/dist/types/{notifications → sdk/bus}/telegram-reference.d.ts +2 -2
  119. package/dist/types/sdk/bus/telegram-setup.d.ts +128 -0
  120. package/dist/types/{notifications → sdk/bus}/topic-registry.d.ts +11 -0
  121. package/dist/types/sdk/cli/index.d.ts +1 -0
  122. package/dist/types/sdk/cli/session-cli.d.ts +19 -0
  123. package/dist/types/sdk/client/client.d.ts +1 -0
  124. package/dist/types/sdk/client/discovery.d.ts +27 -0
  125. package/dist/types/sdk/client/index.d.ts +2 -0
  126. package/dist/types/sdk/host/control/dispatch.d.ts +34 -0
  127. package/dist/types/sdk/host/control/index.d.ts +2 -0
  128. package/dist/types/sdk/host/control/operations.d.ts +65 -0
  129. package/dist/types/sdk/host/events.d.ts +35 -0
  130. package/dist/types/sdk/host/host.d.ts +35 -0
  131. package/dist/types/sdk/host/index.d.ts +4 -0
  132. package/dist/types/sdk/host/query/cursor.d.ts +62 -0
  133. package/dist/types/sdk/host/query/handlers.d.ts +70 -0
  134. package/dist/types/sdk/host/query/index.d.ts +3 -0
  135. package/dist/types/sdk/host/query/revision-store.d.ts +60 -0
  136. package/dist/types/sdk/host/reverse-leases.d.ts +45 -0
  137. package/dist/types/sdk/host/types.d.ts +32 -0
  138. package/dist/types/sdk/index.d.ts +6 -0
  139. package/dist/types/sdk/lifecycle-session.d.ts +14 -0
  140. package/dist/types/sdk/mcp/index.d.ts +1 -0
  141. package/dist/types/sdk/mcp/server.d.ts +37 -0
  142. package/dist/types/sdk/models.d.ts +44 -0
  143. package/dist/types/sdk/protocol/adapter-validation.d.ts +14 -0
  144. package/dist/types/sdk/protocol/operation-registry.d.ts +24 -0
  145. package/dist/types/{sdk.d.ts → sdk/session.d.ts} +44 -38
  146. package/dist/types/sdk/startup-capability.d.ts +50 -0
  147. package/dist/types/session/agent-session.d.ts +114 -21
  148. package/dist/types/session/default-model-selection.d.ts +25 -0
  149. package/dist/types/session/fallback-chain-controller.d.ts +52 -0
  150. package/dist/types/session/session-manager.d.ts +58 -1
  151. package/dist/types/setup/credential-auto-import.d.ts +36 -6
  152. package/dist/types/tools/ask-answer-registry.d.ts +1 -1
  153. package/dist/types/tools/browser/benchmark/detector-report.d.ts +63 -0
  154. package/dist/types/tools/browser/benchmark/run-suite.d.ts +18 -0
  155. package/dist/types/tools/browser/launch.d.ts +22 -0
  156. package/dist/types/tools/browser/profile-discovery.d.ts +31 -0
  157. package/dist/types/tools/browser/profile-posture.d.ts +37 -0
  158. package/dist/types/tools/browser/profile-reuse.d.ts +39 -0
  159. package/dist/types/tools/browser/profile-warmup.d.ts +39 -0
  160. package/dist/types/tools/browser/registry.d.ts +19 -0
  161. package/dist/types/tools/browser/tab-protocol.d.ts +4 -0
  162. package/dist/types/tools/index.d.ts +8 -8
  163. package/package.json +34 -13
  164. package/scripts/build-sdk-package-smoke.ts +94 -0
  165. package/scripts/capture-notifications-settings-showcase.ts +435 -0
  166. package/scripts/compile-args.ts +4 -2
  167. package/scripts/g005-daemon-smoke.ts +4 -5
  168. package/scripts/g011-daemon-path-smoke.ts +5 -5
  169. package/scripts/generate-sdk-adapter-parity-manifest.ts +163 -0
  170. package/scripts/generate-sdk-operation-inventory.ts +867 -0
  171. package/scripts/generate-telegram-baseline-manifest.ts +128 -0
  172. package/scripts/manifest-schema.ts +124 -0
  173. package/scripts/run-test-manifest.ts +153 -0
  174. package/scripts/run-threat-model-check.ts +157 -0
  175. package/scripts/verify-gjc-sdk-canonicalization.ts +3467 -0
  176. package/scripts/verify-gjc-sdk-rename.ts +90 -0
  177. package/src/append-only-mode.ts +1 -1
  178. package/src/cli/args.ts +43 -12
  179. package/src/cli/auth-gateway-cli.ts +2 -2
  180. package/src/cli/config-cli.ts +2 -1
  181. package/src/cli/daemon-cli.ts +63 -14
  182. package/src/cli/list-models.ts +1 -1
  183. package/src/cli/notify-cli.ts +288 -286
  184. package/src/cli.ts +21 -2
  185. package/src/commands/daemon.ts +50 -6
  186. package/src/commands/harness.ts +93 -36
  187. package/src/commands/launch.ts +5 -2
  188. package/src/commands/mcp-serve.ts +19 -12
  189. package/src/commands/notify.ts +36 -3
  190. package/src/commands/sdk.ts +426 -0
  191. package/src/commit/agentic/agent.ts +1 -0
  192. package/src/config/atomic-yaml-patch.ts +423 -0
  193. package/src/config/model-profile-activation.ts +240 -89
  194. package/src/config/model-profiles.ts +18 -15
  195. package/src/config/model-registry.ts +51 -26
  196. package/src/config/model-resolver.ts +138 -51
  197. package/src/config/model-selector-value.ts +50 -0
  198. package/src/config/models-config-schema.ts +14 -21
  199. package/src/config/settings-schema.ts +128 -10
  200. package/src/config/settings.ts +1120 -158
  201. package/src/coordinator-mcp/model-preset.ts +74 -20
  202. package/src/coordinator-mcp/server.ts +1597 -3052
  203. package/src/daemon/builtin.ts +8 -5
  204. package/src/daemon/control-types.ts +1 -1
  205. package/src/defaults/gjc/skills/team/SKILL.md +4 -4
  206. package/src/discovery/mcp-json.ts +327 -20
  207. package/src/extensibility/custom-tools/types.ts +1 -1
  208. package/src/extensibility/extensions/compact-handler.ts +3 -3
  209. package/src/extensibility/extensions/get-commands-handler.ts +2 -2
  210. package/src/extensibility/extensions/loader.ts +69 -5
  211. package/src/extensibility/extensions/runner.ts +112 -4
  212. package/src/extensibility/extensions/types.ts +176 -17
  213. package/src/extensibility/hooks/types.ts +1 -1
  214. package/src/gjc-runtime/launch-tmux.ts +170 -86
  215. package/src/gjc-runtime/psmux-detect.ts +82 -4
  216. package/src/gjc-runtime/session-state-sidecar.ts +41 -31
  217. package/src/gjc-runtime/team-runtime.ts +54 -35
  218. package/src/gjc-runtime/tmux-owner-isolation-cli.ts +53 -17
  219. package/src/gjc-runtime/tmux-owner-isolation.ts +1 -1
  220. package/src/gjc-runtime/tmux-sessions.ts +19 -13
  221. package/src/gjc-runtime/ultragoal-guard.ts +53 -6
  222. package/src/gjc-runtime/ultragoal-runtime.ts +155 -3
  223. package/src/gjc-runtime/windows-powershell-command.ts +58 -0
  224. package/src/harness-control-plane/operate.ts +9 -9
  225. package/src/harness-control-plane/owner.ts +283 -39
  226. package/src/harness-control-plane/receipts.ts +0 -1
  227. package/src/harness-control-plane/sdk-transport.ts +395 -0
  228. package/src/harness-control-plane/session-transport.ts +94 -0
  229. package/src/harness-control-plane/types.ts +1 -1
  230. package/src/internal-urls/docs-index.generated.ts +34 -35
  231. package/src/lsp/client.ts +42 -6
  232. package/src/lsp/index.ts +2 -2
  233. package/src/main.ts +299 -204
  234. package/src/modes/DESIGN.md +258 -0
  235. package/src/modes/acp/acp-agent.ts +1228 -2612
  236. package/src/modes/acp/acp-client-bridge.ts +2 -20
  237. package/src/modes/acp/acp-event-mapper.ts +18 -2
  238. package/src/modes/acp/acp-mode.ts +8 -36
  239. package/src/modes/acp/permission-mode.ts +25 -0
  240. package/src/modes/acp/startup-options.ts +6 -0
  241. package/src/modes/components/agent-dashboard.ts +37 -17
  242. package/src/modes/components/model-selector.ts +93 -35
  243. package/src/modes/components/notifications-settings-editor.ts +1379 -0
  244. package/src/modes/components/settings-selector.ts +60 -11
  245. package/src/modes/components/welcome.ts +4 -4
  246. package/src/modes/controllers/command-controller.ts +1 -2
  247. package/src/modes/controllers/event-controller.ts +11 -16
  248. package/src/modes/controllers/extension-ui-controller.ts +348 -4
  249. package/src/modes/controllers/selector-controller.ts +674 -36
  250. package/src/modes/index.ts +0 -22
  251. package/src/modes/interactive-mode.ts +59 -20
  252. package/src/modes/runtime-init.ts +298 -6
  253. package/src/modes/shared/agent-wire/approval-gate.ts +9 -11
  254. package/src/modes/shared/agent-wire/deep-interview-gate.ts +10 -11
  255. package/src/modes/shared/agent-wire/event-contract.ts +7 -8
  256. package/src/modes/shared/agent-wire/event-envelope.ts +9 -17
  257. package/src/modes/shared/agent-wire/event-observation.ts +16 -7
  258. package/src/modes/shared/agent-wire/workflow-gate-broker.ts +1254 -87
  259. package/src/modes/shared/agent-wire/workflow-gate-schema.ts +15 -15
  260. package/src/modes/shared/agent-wire/workflow-gate-types.ts +113 -0
  261. package/src/modes/types.ts +5 -0
  262. package/src/runtime-mcp/client.ts +94 -19
  263. package/src/runtime-mcp/config.ts +27 -15
  264. package/src/runtime-mcp/manager.ts +343 -105
  265. package/src/runtime-mcp/oauth-flow.ts +42 -12
  266. package/src/runtime-mcp/transports/http.ts +49 -19
  267. package/src/runtime-mcp/transports/stdio.ts +47 -28
  268. package/src/runtime-mcp/types.ts +10 -0
  269. package/src/sdk/acp/adapter.ts +418 -0
  270. package/src/sdk/acp/index.ts +2 -0
  271. package/src/sdk/broker/broker.ts +642 -0
  272. package/src/sdk/broker/discovery.ts +94 -0
  273. package/src/sdk/broker/ensure.ts +249 -0
  274. package/src/sdk/broker/identity.ts +42 -0
  275. package/src/sdk/broker/index.ts +8 -0
  276. package/src/sdk/broker/internal-source-marker-2178.txt +1 -0
  277. package/src/sdk/broker/internal-source.bunfig.toml +1 -0
  278. package/src/sdk/broker/lifecycle-ledger.ts +286 -0
  279. package/src/sdk/broker/lifecycle.ts +2157 -0
  280. package/src/sdk/broker/process-incarnation.ts +159 -0
  281. package/src/sdk/broker/runtime.ts +164 -0
  282. package/src/sdk/broker/session-index.ts +318 -0
  283. package/src/sdk/broker/state-version.ts +23 -0
  284. package/src/sdk/broker/transport.ts +125 -0
  285. package/src/sdk/bus/chat-command-policy.ts +107 -0
  286. package/src/sdk/bus/chat-daemon-cli.ts +214 -0
  287. package/src/sdk/bus/chat-daemon-control.ts +713 -0
  288. package/src/sdk/bus/chat-daemon-runtime.ts +526 -0
  289. package/src/sdk/bus/chat-effect-journal.ts +353 -0
  290. package/src/{notifications → sdk/bus}/config-commands.ts +39 -10
  291. package/src/sdk/bus/config.ts +433 -0
  292. package/src/sdk/bus/conversation-store.ts +391 -0
  293. package/src/sdk/bus/discord-conversation.ts +85 -0
  294. package/src/sdk/bus/discord-daemon.ts +2275 -0
  295. package/src/sdk/bus/discord-live-provider.ts +521 -0
  296. package/src/sdk/bus/discord-provider.ts +56 -0
  297. package/src/{notifications → sdk/bus}/html-format.ts +2 -2
  298. package/src/sdk/bus/index.ts +3943 -0
  299. package/src/{notifications → sdk/bus}/lifecycle-commands.ts +2 -0
  300. package/src/{notifications → sdk/bus}/lifecycle-control-runtime.ts +225 -196
  301. package/src/{notifications → sdk/bus}/lifecycle-orchestrator.ts +161 -74
  302. package/src/{notifications → sdk/bus}/managed-daemon.ts +2 -2
  303. package/src/sdk/bus/native-runtime-compatibility.ts +42 -0
  304. package/src/sdk/bus/natives-augment.d.ts +38 -0
  305. package/src/sdk/bus/notification-orchestration.ts +535 -0
  306. package/src/{notifications → sdk/bus}/notification-service.ts +106 -12
  307. package/src/sdk/bus/session-control.ts +333 -0
  308. package/src/sdk/bus/slack-conversation.ts +74 -0
  309. package/src/sdk/bus/slack-daemon.ts +2144 -0
  310. package/src/sdk/bus/slack-live-provider.ts +380 -0
  311. package/src/sdk/bus/slack-provider.ts +76 -0
  312. package/src/{notifications → sdk/bus}/telegram-cli.ts +8 -8
  313. package/src/sdk/bus/telegram-daemon-cli.ts +330 -0
  314. package/src/sdk/bus/telegram-daemon-contract.ts +14 -0
  315. package/src/{notifications → sdk/bus}/telegram-daemon-control.ts +4 -4
  316. package/src/{notifications → sdk/bus}/telegram-daemon.ts +502 -54
  317. package/src/{notifications → sdk/bus}/telegram-reference.ts +2 -2
  318. package/src/sdk/bus/telegram-setup.ts +663 -0
  319. package/src/{notifications → sdk/bus}/topic-registry.ts +32 -0
  320. package/src/sdk/cli/index.ts +1 -0
  321. package/src/sdk/cli/session-cli.ts +275 -0
  322. package/src/sdk/client/client.ts +1 -0
  323. package/src/sdk/client/discovery.ts +108 -0
  324. package/src/sdk/client/index.ts +2 -0
  325. package/src/sdk/host/control/dispatch.ts +367 -0
  326. package/src/sdk/host/control/index.ts +10 -0
  327. package/src/sdk/host/control/operations.ts +63 -0
  328. package/src/sdk/host/events.ts +91 -0
  329. package/src/sdk/host/host.ts +296 -0
  330. package/src/sdk/host/index.ts +4 -0
  331. package/src/sdk/host/query/cursor.ts +189 -0
  332. package/src/sdk/host/query/handlers.ts +533 -0
  333. package/src/sdk/host/query/index.ts +3 -0
  334. package/src/sdk/host/query/revision-store.ts +1126 -0
  335. package/src/sdk/host/reverse-leases.ts +325 -0
  336. package/src/sdk/host/types.ts +29 -0
  337. package/src/sdk/index.ts +13 -0
  338. package/src/sdk/lifecycle-session.ts +39 -0
  339. package/src/sdk/mcp/index.ts +1 -0
  340. package/src/sdk/mcp/server.ts +332 -0
  341. package/src/sdk/models.ts +168 -0
  342. package/src/sdk/protocol/adapter-validation.ts +48 -0
  343. package/src/sdk/protocol/operation-inventory.generated.json +5654 -0
  344. package/src/sdk/protocol/operation-registry.ts +312 -0
  345. package/src/{sdk.ts → sdk/session.ts} +339 -212
  346. package/src/sdk/startup-capability.ts +189 -0
  347. package/src/session/agent-session.ts +2453 -894
  348. package/src/session/default-model-selection.ts +93 -0
  349. package/src/session/fallback-chain-controller.ts +136 -0
  350. package/src/session/session-manager.ts +438 -11
  351. package/src/session/session-storage.ts +8 -1
  352. package/src/setup/credential-auto-import.ts +290 -35
  353. package/src/setup/hermes/templates/operator-instructions.v1.md +3 -5
  354. package/src/slash-commands/builtin-registry.ts +2 -1
  355. package/src/task/executor.ts +62 -13
  356. package/src/tools/ask-answer-registry.ts +1 -1
  357. package/src/tools/ask.ts +13 -8
  358. package/src/tools/browser/STEALTH-THIRD-PARTY-NOTICES.md +26 -0
  359. package/src/tools/browser/benchmark/detector-report.ts +157 -0
  360. package/src/tools/browser/benchmark/run-suite.ts +39 -0
  361. package/src/tools/browser/launch.ts +124 -19
  362. package/src/tools/browser/profile-discovery.ts +63 -0
  363. package/src/tools/browser/profile-posture.ts +59 -0
  364. package/src/tools/browser/profile-reuse.ts +102 -0
  365. package/src/tools/browser/profile-warmup.ts +109 -0
  366. package/src/tools/browser/registry.ts +87 -11
  367. package/src/tools/browser/tab-protocol.ts +1 -0
  368. package/src/tools/browser/tab-supervisor.ts +1 -0
  369. package/src/tools/browser/tab-worker.ts +1 -1
  370. package/src/tools/browser.ts +6 -0
  371. package/src/tools/index.ts +8 -8
  372. package/src/tools/puppeteer/14_stealth_permissions.txt +57 -0
  373. package/src/tools/puppeteer/15_stealth_webrtc.txt +60 -0
  374. package/src/tools/telegram-send.ts +2 -2
  375. package/vendor/insane-search/MANIFEST.json +2 -1
  376. package/vendor/insane-search/engine/bias_check.py +4 -1
  377. package/vendor/insane-search/engine/phase0.py +26 -1
  378. package/dist/types/harness-control-plane/rpc-adapter.d.ts +0 -69
  379. package/dist/types/modes/bridge/auth.d.ts +0 -12
  380. package/dist/types/modes/bridge/bridge-client-bridge.d.ts +0 -9
  381. package/dist/types/modes/bridge/bridge-mode.d.ts +0 -47
  382. package/dist/types/modes/bridge/bridge-ui-context.d.ts +0 -88
  383. package/dist/types/modes/bridge/event-stream.d.ts +0 -8
  384. package/dist/types/modes/rpc/host-tools.d.ts +0 -1
  385. package/dist/types/modes/rpc/host-uris.d.ts +0 -1
  386. package/dist/types/modes/rpc/rpc-client.d.ts +0 -299
  387. package/dist/types/modes/rpc/rpc-mode.d.ts +0 -86
  388. package/dist/types/modes/rpc/rpc-socket-security.d.ts +0 -10
  389. package/dist/types/modes/rpc/rpc-types.d.ts +0 -810
  390. package/dist/types/modes/shared/agent-wire/command-contract.d.ts +0 -18
  391. package/dist/types/modes/shared/agent-wire/command-dispatch.d.ts +0 -37
  392. package/dist/types/modes/shared/agent-wire/command-validation.d.ts +0 -2
  393. package/dist/types/modes/shared/agent-wire/handshake.d.ts +0 -56
  394. package/dist/types/modes/shared/agent-wire/host-tool-bridge.d.ts +0 -16
  395. package/dist/types/modes/shared/agent-wire/host-uri-bridge.d.ts +0 -17
  396. package/dist/types/modes/shared/agent-wire/protocol.d.ts +0 -25
  397. package/dist/types/modes/shared/agent-wire/responses.d.ts +0 -4
  398. package/dist/types/modes/shared/agent-wire/scopes.d.ts +0 -18
  399. package/dist/types/modes/shared/agent-wire/session-registry.d.ts +0 -25
  400. package/dist/types/modes/shared/agent-wire/ui-request-broker.d.ts +0 -42
  401. package/dist/types/modes/shared/agent-wire/ui-result.d.ts +0 -27
  402. package/dist/types/modes/shared/agent-wire/unattended-action-policy.d.ts +0 -29
  403. package/dist/types/modes/shared/agent-wire/unattended-audit.d.ts +0 -68
  404. package/dist/types/modes/shared/agent-wire/unattended-run-controller.d.ts +0 -166
  405. package/dist/types/modes/shared/agent-wire/unattended-session.d.ts +0 -127
  406. package/dist/types/notifications/config.d.ts +0 -132
  407. package/src/harness-control-plane/rpc-adapter.ts +0 -290
  408. package/src/modes/bridge/auth.ts +0 -41
  409. package/src/modes/bridge/bridge-client-bridge.ts +0 -47
  410. package/src/modes/bridge/bridge-mode.ts +0 -675
  411. package/src/modes/bridge/bridge-ui-context.ts +0 -200
  412. package/src/modes/bridge/event-stream.ts +0 -70
  413. package/src/modes/rpc/host-tools.ts +0 -1
  414. package/src/modes/rpc/host-uris.ts +0 -1
  415. package/src/modes/rpc/rpc-client.ts +0 -1166
  416. package/src/modes/rpc/rpc-mode.ts +0 -1029
  417. package/src/modes/rpc/rpc-socket-security.ts +0 -115
  418. package/src/modes/rpc/rpc-types.ts +0 -637
  419. package/src/modes/shared/agent-wire/command-contract.ts +0 -18
  420. package/src/modes/shared/agent-wire/command-dispatch.ts +0 -498
  421. package/src/modes/shared/agent-wire/command-validation.ts +0 -181
  422. package/src/modes/shared/agent-wire/handshake.ts +0 -157
  423. package/src/modes/shared/agent-wire/host-tool-bridge.ts +0 -197
  424. package/src/modes/shared/agent-wire/host-uri-bridge.ts +0 -236
  425. package/src/modes/shared/agent-wire/protocol.ts +0 -46
  426. package/src/modes/shared/agent-wire/responses.ts +0 -17
  427. package/src/modes/shared/agent-wire/scopes.ts +0 -94
  428. package/src/modes/shared/agent-wire/session-registry.ts +0 -109
  429. package/src/modes/shared/agent-wire/ui-request-broker.ts +0 -150
  430. package/src/modes/shared/agent-wire/ui-result.ts +0 -48
  431. package/src/modes/shared/agent-wire/unattended-action-policy.ts +0 -365
  432. package/src/modes/shared/agent-wire/unattended-audit.ts +0 -176
  433. package/src/modes/shared/agent-wire/unattended-run-controller.ts +0 -426
  434. package/src/modes/shared/agent-wire/unattended-session.ts +0 -528
  435. package/src/notifications/config.ts +0 -219
  436. package/src/notifications/index.ts +0 -1835
  437. package/src/notifications/telegram-daemon-cli.ts +0 -243
  438. package/src/tools/puppeteer/09_stealth_locale.txt +0 -46
  439. /package/dist/types/{notifications → sdk/bus}/attachment-registry.d.ts +0 -0
  440. /package/dist/types/{notifications → sdk/bus}/chat-adapters.d.ts +0 -0
  441. /package/dist/types/{notifications → sdk/bus}/daemon-paths.d.ts +0 -0
  442. /package/dist/types/{notifications → sdk/bus}/engine.d.ts +0 -0
  443. /package/dist/types/{notifications → sdk/bus}/helpers.d.ts +0 -0
  444. /package/dist/types/{notifications → sdk/bus}/lifecycle-commands.d.ts +0 -0
  445. /package/dist/types/{notifications → sdk/bus}/operator-runtime.d.ts +0 -0
  446. /package/dist/types/{notifications → sdk/bus}/rate-limit-pool.d.ts +0 -0
  447. /package/dist/types/{notifications → sdk/bus}/recent-activity.d.ts +0 -0
  448. /package/dist/types/{notifications → sdk/bus}/reply-sent-store.d.ts +0 -0
  449. /package/dist/types/{notifications → sdk/bus}/rich-draft.d.ts +0 -0
  450. /package/dist/types/{notifications → sdk/bus}/rich-render.d.ts +0 -0
  451. /package/dist/types/{notifications → sdk/bus}/threaded-inbound.d.ts +0 -0
  452. /package/dist/types/{notifications → sdk/bus}/threaded-render.d.ts +0 -0
  453. /package/src/{notifications → sdk/bus}/attachment-registry.ts +0 -0
  454. /package/src/{notifications → sdk/bus}/chat-adapters.ts +0 -0
  455. /package/src/{notifications → sdk/bus}/daemon-paths.ts +0 -0
  456. /package/src/{notifications → sdk/bus}/engine.ts +0 -0
  457. /package/src/{notifications → sdk/bus}/helpers.ts +0 -0
  458. /package/src/{notifications → sdk/bus}/operator-runtime.ts +0 -0
  459. /package/src/{notifications → sdk/bus}/rate-limit-pool.ts +0 -0
  460. /package/src/{notifications → sdk/bus}/recent-activity.ts +0 -0
  461. /package/src/{notifications → sdk/bus}/reply-sent-store.ts +0 -0
  462. /package/src/{notifications → sdk/bus}/rich-draft.ts +0 -0
  463. /package/src/{notifications → sdk/bus}/rich-render.ts +0 -0
  464. /package/src/{notifications → sdk/bus}/threaded-inbound.ts +0 -0
  465. /package/src/{notifications → sdk/bus}/threaded-render.ts +0 -0
@@ -5,30 +5,8 @@ import { postmortem } from "@gajae-code/utils";
5
5
  * Run modes for the coding agent.
6
6
  */
7
7
  export { runAcpMode } from "./acp";
8
- export { runBridgeMode } from "./bridge/bridge-mode";
9
8
  export { InteractiveMode, type InteractiveModeOptions } from "./interactive-mode";
10
9
  export { type PrintModeOptions, runPrintMode } from "./print-mode";
11
- export {
12
- defineRpcClientTool,
13
- type ModelInfo,
14
- RpcClient,
15
- type RpcClientCustomTool,
16
- type RpcClientOptions,
17
- type RpcClientToolContext,
18
- type RpcClientToolResult,
19
- type RpcEventListener,
20
- } from "./rpc/rpc-client";
21
- export { runRpcMode } from "./rpc/rpc-mode";
22
- export type {
23
- RpcCommand,
24
- RpcHostToolCallRequest,
25
- RpcHostToolCancelRequest,
26
- RpcHostToolDefinition,
27
- RpcHostToolResult,
28
- RpcHostToolUpdate,
29
- RpcResponse,
30
- RpcSessionState,
31
- } from "./rpc/rpc-types";
32
10
 
33
11
  postmortem.register("terminal-restore", () => {
34
12
  emergencyTerminalRestore();
@@ -62,7 +62,8 @@ import {
62
62
  scheduleLaunchStarReminderAfterFirstRender,
63
63
  starReminderLaunchGate,
64
64
  } from "../reminders/star-reminder";
65
- import type { AgentSession, AgentSessionEvent } from "../session/agent-session";
65
+ import type { NotificationSessionReconcileResult, NotificationSessionStatus } from "../sdk/bus/session-control";
66
+ import type { AgentSession, AgentSessionEvent, TemporaryProviderSessionScope } from "../session/agent-session";
66
67
  import { HistoryStorage } from "../session/history-storage";
67
68
  import type { SessionContext, SessionManager } from "../session/session-manager";
68
69
  import { getRecentSessions } from "../session/session-manager";
@@ -407,6 +408,7 @@ export class InteractiveMode implements InteractiveModeContext {
407
408
  #goalSuppressNextContinuation = false;
408
409
  #planModePreviousModelState: { model: Model; thinkingLevel?: ThinkingLevel } | undefined;
409
410
  #pendingModelSwitch: { model: Model; thinkingLevel?: ThinkingLevel } | undefined;
411
+ #planModeProviderSessionScope: TemporaryProviderSessionScope | undefined;
410
412
  #planModeHasEntered = false;
411
413
  #planReviewContainer: Container | undefined;
412
414
  readonly lspServers: LspStartupServerInfo[] | undefined = undefined;
@@ -543,6 +545,19 @@ export class InteractiveMode implements InteractiveModeContext {
543
545
  this.#observerRegistry = new SessionObserverRegistry();
544
546
  }
545
547
 
548
+ getCurrentSessionNotificationStatus(): NotificationSessionStatus | undefined {
549
+ return this.session.notificationSessionController?.query({ sessionManager: this.sessionManager });
550
+ }
551
+
552
+ async setCurrentSessionNotificationsEnabled(
553
+ enabled: boolean,
554
+ ): Promise<NotificationSessionReconcileResult | undefined> {
555
+ return await this.session.notificationSessionController?.setLocalEnabled(
556
+ { sessionManager: this.sessionManager },
557
+ enabled,
558
+ );
559
+ }
560
+
546
561
  async init(): Promise<void> {
547
562
  if (this.isInitialized) return;
548
563
 
@@ -1353,8 +1368,18 @@ export class InteractiveMode implements InteractiveModeContext {
1353
1368
  return;
1354
1369
  }
1355
1370
  try {
1356
- await this.session.setModelTemporary(resolved.model, planThinkingLevel);
1371
+ this.#planModeProviderSessionScope = this.session.beginTemporaryProviderSessionScope("plan-mode");
1372
+ await this.session.setModelTemporary(resolved.model, planThinkingLevel, {
1373
+ cause: "temporary-operation",
1374
+ reason: "plan-mode",
1375
+ providerSessionScope: this.#planModeProviderSessionScope,
1376
+ });
1357
1377
  } catch (error) {
1378
+ const scope = this.#planModeProviderSessionScope;
1379
+ if (scope) {
1380
+ this.session.restoreTemporaryProviderSessionScope(scope);
1381
+ this.#planModeProviderSessionScope = undefined;
1382
+ }
1358
1383
  this.showWarning(
1359
1384
  `Failed to switch to plan model for plan mode: ${error instanceof Error ? error.message : String(error)}`,
1360
1385
  );
@@ -1370,8 +1395,18 @@ export class InteractiveMode implements InteractiveModeContext {
1370
1395
  if (!pending) return;
1371
1396
  this.#pendingModelSwitch = undefined;
1372
1397
  try {
1373
- await this.session.setModelTemporary(pending.model, pending.thinkingLevel);
1398
+ this.#planModeProviderSessionScope ??= this.session.beginTemporaryProviderSessionScope("plan-mode");
1399
+ await this.session.setModelTemporary(pending.model, pending.thinkingLevel, {
1400
+ cause: "temporary-operation",
1401
+ reason: "plan-mode",
1402
+ providerSessionScope: this.#planModeProviderSessionScope,
1403
+ });
1374
1404
  } catch (error) {
1405
+ const scope = this.#planModeProviderSessionScope;
1406
+ if (scope) {
1407
+ this.session.restoreTemporaryProviderSessionScope(scope);
1408
+ this.#planModeProviderSessionScope = undefined;
1409
+ }
1375
1410
  this.showWarning(
1376
1411
  `Failed to switch model after streaming: ${error instanceof Error ? error.message : String(error)}`,
1377
1412
  );
@@ -1528,30 +1563,34 @@ export class InteractiveMode implements InteractiveModeContext {
1528
1563
  if (previousTools && previousTools.length > 0) {
1529
1564
  await this.session.setActiveToolsByName(previousTools);
1530
1565
  }
1531
- if (this.#planModePreviousModelState) {
1566
+ const scope = this.#planModeProviderSessionScope;
1567
+ if (scope && !this.session.isStreaming) {
1568
+ const restored = this.session.restoreTemporaryProviderSessionScope(scope);
1569
+ if (restored) this.#planModeProviderSessionScope = undefined;
1570
+ } else if (this.#planModePreviousModelState) {
1532
1571
  const prev = this.#planModePreviousModelState;
1533
1572
  if (modelsAreEqual(this.session.model, prev.model)) {
1534
- // Same model — only thinking level may differ. Avoid setModelTemporary()
1535
- // which would reset provider-side sessions (openai-responses/OpenAI code backend) and
1536
- // break conversation continuity.
1537
1573
  this.session.setThinkingLevel(prev.thinkingLevel);
1538
1574
  } else if (this.session.isStreaming) {
1539
1575
  this.#pendingModelSwitch = { model: prev.model, thinkingLevel: prev.thinkingLevel };
1540
1576
  } else {
1541
- await this.session.setModelTemporary(prev.model, prev.thinkingLevel);
1577
+ await this.session.setModelTemporary(prev.model, prev.thinkingLevel, {
1578
+ cause: "restore",
1579
+ reason: "plan-mode",
1580
+ });
1542
1581
  }
1543
- // If #applyPlanModeModel queued a deferred switch to the plan-role model
1544
- // (because the session was streaming on entry), drop it now: we are
1545
- // leaving plan mode, so flushing it on the next agent_end would land the
1546
- // session on the plan-role model after the user has exited plan mode
1547
- // (issue #816). Only clear when the pending target matches the plan-role
1548
- // model — leave any unrelated user-queued switch intact.
1549
- const pending = this.#pendingModelSwitch;
1550
- if (pending) {
1551
- const planResolution = this.session.resolveRoleModelWithThinking("plan");
1552
- if (planResolution.model && modelsAreEqual(pending.model, planResolution.model)) {
1553
- this.#pendingModelSwitch = undefined;
1554
- }
1582
+ }
1583
+ // If #applyPlanModeModel queued a deferred switch to the plan-role model
1584
+ // (because the session was streaming on entry), drop it now: we are
1585
+ // leaving plan mode, so flushing it on the next agent_end would land the
1586
+ // session on the plan-role model after the user has exited plan mode
1587
+ // (issue #816). Only clear when the pending target matches the plan-role
1588
+ // model — leave any unrelated user-queued switch intact.
1589
+ const pending = this.#pendingModelSwitch;
1590
+ if (pending) {
1591
+ const planResolution = this.session.resolveRoleModelWithThinking("plan");
1592
+ if (planResolution.model && modelsAreEqual(pending.model, planResolution.model)) {
1593
+ this.#pendingModelSwitch = undefined;
1555
1594
  }
1556
1595
  }
1557
1596
  this.session.setStandingResolveHandler?.(null);
@@ -1,16 +1,21 @@
1
1
  /**
2
- * Shared extension runtime wiring for print and RPC modes.
2
+ * Shared extension runtime wiring for non-interactive session callers.
3
3
  *
4
- * Both modes initialize the extension runner with the same action handlers
4
+ * These callers initialize the extension runner with the same action handlers
5
5
  * that delegate to the {@link AgentSession}. Only error reporting, shutdown
6
6
  * behavior, and UI context differ between callers — those stay as
7
7
  * caller-supplied hooks.
8
8
  */
9
+ import * as path from "node:path";
10
+ import { ThinkingLevel } from "@gajae-code/agent-core";
9
11
  import { runExtensionCompact, runExtensionSetModel } from "../extensibility/extensions/compact-handler";
10
12
  import { getSessionSlashCommands } from "../extensibility/extensions/get-commands-handler";
11
13
  import type { ExtensionError, ExtensionUIContext } from "../extensibility/extensions/types";
12
14
  import type { AgentSession } from "../session/agent-session";
13
15
 
16
+ import { parseThinkingLevel } from "../thinking";
17
+ import type { TodoPhase } from "../tools/todo-write";
18
+
14
19
  /** Action name for an extension-originated send failure. */
15
20
  export type ExtensionSendAction = "extension_send" | "extension_send_user";
16
21
 
@@ -19,9 +24,9 @@ export interface InitializeExtensionsOptions {
19
24
  reportSendError: (action: ExtensionSendAction, error: Error) => void;
20
25
  /** Reports a runtime error surfaced through {@link ExtensionRunner.onError}. */
21
26
  reportRuntimeError: (error: ExtensionError) => void;
22
- /** Optional shutdown hook (rpc mode signals its loop; print mode is a no-op). */
27
+ /** Optional shutdown hook for caller-specific lifecycle signaling. */
23
28
  onShutdown?: () => void;
24
- /** Optional UI context (rpc supplies one; print runs headless). */
29
+ /** Optional interactive UI context; omitted for headless callers. */
25
30
  uiContext?: ExtensionUIContext;
26
31
  }
27
32
 
@@ -47,9 +52,11 @@ export async function initializeExtensions(session: AgentSession, options: Initi
47
52
  });
48
53
  },
49
54
  sendUserMessage: (content, sendOptions) => {
50
- session.sendUserMessage(content, sendOptions).catch(e => {
55
+ const send = session.sendUserMessage(content, sendOptions);
56
+ void send.catch(e => {
51
57
  reportSendError("extension_send_user", e instanceof Error ? e : new Error(String(e)));
52
58
  });
59
+ return send;
53
60
  },
54
61
  appendEntry: (customType, data) => {
55
62
  session.sessionManager.appendCustomEntry(customType, data);
@@ -63,7 +70,17 @@ export async function initializeExtensions(session: AgentSession, options: Initi
63
70
  getCommands: () => getSessionSlashCommands(session),
64
71
  setModel: model => runExtensionSetModel(session, model),
65
72
  getThinkingLevel: () => session.thinkingLevel,
66
- setThinkingLevel: level => session.setThinkingLevel(level),
73
+ setThinkingLevel: (level, persist) => session.setThinkingLevel(level, persist),
74
+ getThinkingVisibility: () => session.getThinkingVisibility(),
75
+ setThinkingVisibility: (visibility, persist) => session.setThinkingVisibility(visibility, persist),
76
+ cycleThinkingLevel: () => session.cycleThinkingLevel(),
77
+ setThinkingLevelForControl: (level, persist) => session.setThinkingLevelForControl(level, persist),
78
+ setThinkingVisibilityForControl: (visibility, persist) =>
79
+ session.setThinkingVisibilityForControl(visibility, persist),
80
+ setModelTemporaryForControl: (model, expectedSessionId) =>
81
+ session.setModelTemporaryForControl(model, expectedSessionId),
82
+ fetchUsageReportsForControl: () => session.fetchUsageReportsForControl(),
83
+ getThinkingScopeForControl: () => session.getThinkingScopeForControl(),
67
84
  getSessionName: () => session.sessionManager.getSessionName(),
68
85
  setSessionName: async name => {
69
86
  await session.sessionManager.setSessionName(name, "user");
@@ -75,11 +92,286 @@ export async function initializeExtensions(session: AgentSession, options: Initi
75
92
  isIdle: () => !session.isStreaming,
76
93
  abort: () => session.abort(),
77
94
  hasPendingMessages: () => session.queuedMessageCount > 0,
95
+ getPendingMessageCounts: () => session.pendingMessageCounts,
96
+ getTranscript: () => session.getTranscript(),
97
+ getTranscriptBody: entryId => session.getTranscriptBody(entryId),
98
+ getGoalState: () => session.getGoalModeState(),
99
+ getTodoState: () => session.getTodoPhases(),
100
+ getQueuedMessages: () => session.getQueuedMessageEntries(),
101
+ getActiveTools: () => session.getActiveToolNames(),
102
+ getAllTools: () => session.getAllToolNames(),
78
103
  shutdown,
79
104
  getContextUsage: () => session.getContextUsage(),
80
105
  getSystemPrompt: () => session.systemPrompt,
81
106
  getWorkflowGate: () => session.getWorkflowGateEmitter(),
82
107
  compact: instructionsOrOptions => runExtensionCompact(session, instructionsOrOptions),
108
+ clearContext: () => session.clearContext(),
109
+ cycleModel: () => session.cycleModel(),
110
+ cycleThinkingLevel: () => session.cycleThinkingLevel(),
111
+ setQueueMode: (kind, mode) => {
112
+ if (kind === "steering" && (mode === "all" || mode === "one-at-a-time")) {
113
+ session.setSteeringMode(mode);
114
+ return true;
115
+ }
116
+ if (kind === "follow_up" && (mode === "all" || mode === "one-at-a-time")) {
117
+ session.setFollowUpMode(mode);
118
+ return true;
119
+ }
120
+ if (kind === "interrupt" && (mode === "immediate" || mode === "wait")) {
121
+ session.setInterruptMode(mode);
122
+ return true;
123
+ }
124
+ return false;
125
+ },
126
+ invokeSkill: (name, args) => session.invokeSkill(name, args),
127
+ setPlanMode: on => session.setSdkPlanMode(on),
128
+ operateGoal: (op, objective) => session.operateGoal(op, objective),
129
+ getSkillState: () => session.skills.map(skill => ({ name: skill.name, description: skill.description })),
130
+ getConfigItems: () => session.getSdkConfigItems(),
131
+ getBranchCandidates: () => session.sessionManager.getTree(),
132
+ getExtensions: () => session.extensionRunner?.getExtensionPaths() ?? [],
133
+ getArtifact: async id => {
134
+ const artifactsDir = session.sessionManager.getArtifactsDir();
135
+ if (!artifactsDir || !id) return undefined;
136
+ const candidate = path.resolve(artifactsDir, id);
137
+ const root = `${path.resolve(artifactsDir)}${path.sep}`;
138
+ if (!candidate.startsWith(root))
139
+ throw Object.assign(new Error("Artifact path escapes the session artifact directory."), {
140
+ code: "invalid_input",
141
+ });
142
+ const file = Bun.file(candidate);
143
+ return (await file.exists()) ? new Uint8Array(await file.arrayBuffer()) : undefined;
144
+ },
145
+ getArtifactRange: async (id, offset, length) => {
146
+ const artifactsDir = session.sessionManager.getArtifactsDir();
147
+ if (!artifactsDir || !id) return undefined;
148
+ const candidate = path.resolve(artifactsDir, id);
149
+ const root = `${path.resolve(artifactsDir)}${path.sep}`;
150
+ if (!candidate.startsWith(root))
151
+ throw Object.assign(new Error("Artifact path escapes the session artifact directory."), {
152
+ code: "invalid_input",
153
+ });
154
+ const file = Bun.file(candidate);
155
+ if (!(await file.exists())) return undefined;
156
+ const start = Math.min(Math.max(0, offset), file.size);
157
+ const end = Math.min(file.size, start + Math.max(0, length));
158
+ return { bytes: new Uint8Array(await file.slice(start, end).arrayBuffer()), totalBytes: file.size };
159
+ },
160
+ getJobs: () => session.getAsyncJobSnapshot(),
161
+ setSdkPermissionProvider: provider => session.setSdkPermissionProvider(provider),
162
+ sdkControl: async (operation, input) => {
163
+ switch (operation) {
164
+ case "model.set": {
165
+ const selector = typeof input.id === "string" ? input.id : "";
166
+ const slashIndex = selector.indexOf("/");
167
+ const model =
168
+ slashIndex > 0
169
+ ? session.modelRegistry.find(selector.slice(0, slashIndex), selector.slice(slashIndex + 1))
170
+ : undefined;
171
+ const thinkingLevel =
172
+ typeof input.thinkingLevel === "string" ? parseThinkingLevel(input.thinkingLevel) : undefined;
173
+ if (!model || !thinkingLevel || thinkingLevel === ThinkingLevel.Inherit)
174
+ throw Object.assign(new Error("model.set requires a valid model id and concrete thinkingLevel."), {
175
+ code: "invalid_input",
176
+ });
177
+ return await session.setDefaultModelSelection(model, thinkingLevel);
178
+ }
179
+ case "todo.replace": {
180
+ const phases = input.items;
181
+ if (
182
+ !Array.isArray(phases) ||
183
+ !phases.every((phase: unknown) => {
184
+ if (!phase || typeof phase !== "object") return false;
185
+ const candidate = phase as { name?: unknown; tasks?: unknown };
186
+ return (
187
+ typeof candidate.name === "string" &&
188
+ Array.isArray(candidate.tasks) &&
189
+ candidate.tasks.every((task: unknown) => {
190
+ if (!task || typeof task !== "object") return false;
191
+ const item = task as { content?: unknown; status?: unknown };
192
+ return (
193
+ typeof item.content === "string" &&
194
+ ["pending", "in_progress", "completed", "abandoned"].includes(String(item.status))
195
+ );
196
+ })
197
+ );
198
+ })
199
+ ) {
200
+ throw Object.assign(new Error("todo.replace requires TodoPhase items."), {
201
+ code: "invalid_input",
202
+ });
203
+ }
204
+ session.setTodoPhases(phases as TodoPhase[]);
205
+ return { replaced: session.getTodoPhases() };
206
+ }
207
+ case "permission_mode.set": {
208
+ const requested = input.mode;
209
+ const mode =
210
+ requested === "allow" || requested === "always-allow"
211
+ ? "allow"
212
+ : requested === "deny" || requested === "always-deny"
213
+ ? "deny"
214
+ : requested === "prompt"
215
+ ? "prompt"
216
+ : undefined;
217
+ if (!mode)
218
+ throw Object.assign(new Error("permission_mode.set requires prompt, allow, or deny."), {
219
+ code: "invalid_input",
220
+ });
221
+ session.setSdkPermissionMode(mode);
222
+ return { changed: true, mode: session.sdkPermissionMode };
223
+ }
224
+ case "bash.execute": {
225
+ if (typeof input.cmd !== "string" || input.cmd.trim() === "")
226
+ throw Object.assign(new Error("bash.execute requires a command."), { code: "invalid_input" });
227
+ const result = await session.executeBash(input.cmd, undefined, { excludeFromContext: true });
228
+ return {
229
+ exitCode: result.exitCode,
230
+ cancelled: result.cancelled,
231
+ output: result.output,
232
+ truncated: result.truncated,
233
+ };
234
+ }
235
+ case "bash.abort": {
236
+ if (!session.isBashRunning) return { aborted: false };
237
+ session.abortBash();
238
+ return { aborted: true };
239
+ }
240
+ case "retry.last": {
241
+ if (!(await session.retry()))
242
+ throw Object.assign(new Error("There is no failed or interrupted turn to retry."), {
243
+ code: "nothing_to_retry",
244
+ });
245
+ return { retried: true };
246
+ }
247
+ case "retry.now": {
248
+ if (!session.isRetrying)
249
+ throw Object.assign(new Error("No retry backoff is pending."), { code: "retry_not_pending" });
250
+ session.retryNow();
251
+ return { retried: true, immediate: true };
252
+ }
253
+ case "bash.background": {
254
+ if (!session.requestForegroundBashBackground())
255
+ throw Object.assign(
256
+ new Error("The active bash command cannot be moved to a managed background job."),
257
+ { code: "not_foldable" },
258
+ );
259
+ return { backgrounded: true };
260
+ }
261
+ case "compaction.auto.set":
262
+ session.setAutoCompactionEnabled(input.on === true);
263
+ return { changed: true };
264
+ case "retry.auto.set":
265
+ session.setAutoRetryEnabled(input.on === true);
266
+ return { changed: true };
267
+ case "retry.abort":
268
+ session.abortRetry();
269
+ return { aborted: true };
270
+ case "session.new":
271
+ return { created: await session.newSession() };
272
+ case "session.fork":
273
+ return { session: await session.fork() };
274
+ case "session.resume":
275
+ return { resumed: await session.switchSession(String(input.id)) };
276
+ case "session.close":
277
+ await session.sessionManager.flush();
278
+ return { closed: true };
279
+ case "session.switch":
280
+ return { switched: await session.switchSession(String(input.id)) };
281
+ case "session.branch":
282
+ try {
283
+ return await session.branch(String(input.entryId));
284
+ } catch (error) {
285
+ throw Object.assign(
286
+ new Error(error instanceof Error ? error.message : "Branch entry was not found."),
287
+ { code: "resource_gone" },
288
+ );
289
+ }
290
+ case "session.rename":
291
+ return { renamed: await session.setSessionName(String(input.name), "user") };
292
+ case "session.handoff":
293
+ try {
294
+ return {
295
+ handoff: await session.handoff(
296
+ typeof input.instructions === "string" ? input.instructions : undefined,
297
+ ),
298
+ };
299
+ } catch (error) {
300
+ throw Object.assign(
301
+ new Error(
302
+ error instanceof Error ? error.message : "Handoff is unavailable for the current state.",
303
+ ),
304
+ { code: "invalid_request" },
305
+ );
306
+ }
307
+ case "session.export_html":
308
+ try {
309
+ return {
310
+ path: await session.exportToHtml(typeof input.path === "string" ? input.path : undefined),
311
+ };
312
+ } catch (error) {
313
+ throw Object.assign(
314
+ new Error(
315
+ error instanceof Error
316
+ ? error.message
317
+ : "Session export is unavailable for the current state.",
318
+ ),
319
+ { code: "invalid_request" },
320
+ );
321
+ }
322
+ case "runtime.reload":
323
+ await session.reload();
324
+ return { reloaded: true };
325
+ case "service_tier.set":
326
+ session.setServiceTier(input.tier as never);
327
+ return { changed: true };
328
+ case "queue.message.remove": {
329
+ const removed = session.removeQueuedMessageForEditing(String(input.id));
330
+ if (removed === undefined)
331
+ throw Object.assign(new Error("Queued message was not found."), { code: "resource_gone" });
332
+ return { removed };
333
+ }
334
+ case "queue.message.move": {
335
+ const id = String(input.id);
336
+ const moved =
337
+ input.before !== undefined
338
+ ? session.moveQueuedMessageForEditing(id, "up")
339
+ : session.moveQueuedMessageForEditing(id, "down");
340
+ if (!moved)
341
+ throw Object.assign(new Error("Queue position is invalid."), { code: "invalid_position" });
342
+ return { moved };
343
+ }
344
+ case "queue.message.update": {
345
+ const id = String(input.id);
346
+ const old = session.removeQueuedMessageForEditing(id);
347
+ const patch = input.patch as { text?: unknown };
348
+ if (old === undefined || typeof patch?.text !== "string")
349
+ throw Object.assign(new Error("Queued message update is invalid."), { code: "invalid_message" });
350
+ await session.sendUserMessage(patch.text, {
351
+ deliverAs: id.startsWith("steer:") ? "steer" : "followUp",
352
+ });
353
+ return { updated: true };
354
+ }
355
+ case "extension.set_enabled": {
356
+ const id = String(input.id);
357
+ const disabled = [...(session.settings.get("disabledExtensions") ?? [])];
358
+ const on = input.on === true;
359
+ const next = on ? disabled.filter(value => value !== id) : [...new Set([...disabled, id])];
360
+ session.settings.set("disabledExtensions", next);
361
+ return { changed: true, enabled: on };
362
+ }
363
+ case "session.delete":
364
+ await session.sessionManager.dropSession(String(input.id));
365
+ return { deleted: true };
366
+ case "session.cwd.move":
367
+ await session.sessionManager.moveTo(String(input.path));
368
+ return { moved: true, cwd: session.sessionManager.getCwd() };
369
+ default:
370
+ throw Object.assign(new Error(`${operation} has no AgentSession implementation.`), {
371
+ code: "unavailable",
372
+ });
373
+ }
374
+ },
83
375
  },
84
376
  // ExtensionCommandContextActions — commands invokable via prompt("/command")
85
377
  {
@@ -7,16 +7,14 @@
7
7
  * - ultragoal execution sign-off -> `workflow_gate` { kind: "execution" } whose
8
8
  * answer is approve / decline (+ optional reason).
9
9
  *
10
- * Gates remain mandatory; the external agent substitutes for the human at the
11
- * answer boundary only. Declining / requesting changes is honored and is NEVER
12
- * silently treated as approval.
10
+ * Gates remain mandatory; the remote SDK client answers at the gate boundary.
11
+ * Declining / requesting changes is honored and is NEVER silently treated as approval.
13
12
  *
14
- * This is the pure mapping primitive; routing ralplan/ultragoal through it when
15
- * an unattended controller + gate broker are attached is wired with the transport
16
- * in #321 and exercised end-to-end by #323.
13
+ * This is the pure mapping primitive used by SDK-native workflow gate emitters.
17
14
  */
18
- import type { RpcJsonSchema, RpcWorkflowGateContext } from "../../rpc/rpc-types";
15
+
19
16
  import type { OpenGateInput } from "./workflow-gate-broker";
17
+ import type { JsonSchema, WorkflowGateContext } from "./workflow-gate-types";
20
18
 
21
19
  export type ApprovalDecision = "approve" | "request-changes" | "reject";
22
20
  export type ExecutionDecision = "approve" | "decline";
@@ -57,8 +55,8 @@ const APPROVAL_DECISIONS: ApprovalDecision[] = ["approve", "request-changes", "r
57
55
  const EXECUTION_DECISIONS: ExecutionDecision[] = ["approve", "decline"];
58
56
 
59
57
  /** Build the ralplan `pending approval` -> `workflow_gate { kind: "approval" }` open-input. */
60
- export function approvalGate(context: RpcWorkflowGateContext = {}): OpenGateInput {
61
- const schema: RpcJsonSchema = {
58
+ export function approvalGate(context: WorkflowGateContext = {}): OpenGateInput {
59
+ const schema: JsonSchema = {
62
60
  type: "object",
63
61
  properties: {
64
62
  decision: { type: "string", enum: APPROVAL_DECISIONS },
@@ -77,8 +75,8 @@ export function approvalGate(context: RpcWorkflowGateContext = {}): OpenGateInpu
77
75
  }
78
76
 
79
77
  /** Build the ultragoal execution sign-off -> `workflow_gate { kind: "execution" }` open-input. */
80
- export function executionGate(context: RpcWorkflowGateContext = {}): OpenGateInput {
81
- const schema: RpcJsonSchema = {
78
+ export function executionGate(context: WorkflowGateContext = {}): OpenGateInput {
79
+ const schema: JsonSchema = {
82
80
  type: "object",
83
81
  properties: {
84
82
  decision: { type: "string", enum: EXECUTION_DECISIONS },
@@ -7,12 +7,11 @@
7
7
  * back into the exact QuestionResult shape the human path produces, so ambiguity
8
8
  * scoring/state updates proceed identically whether a human or an agent answers.
9
9
  *
10
- * This is the pure mapping primitive. Routing the ask tool through it (instead of
11
- * the interactive select/editor UI) when an unattended controller + gate broker
12
- * are attached is wired with the transport in #321 and exercised by #323.
10
+ * This is the pure mapping primitive used by SDK-native workflow gate emitters.
13
11
  */
14
- import type { RpcJsonSchema, RpcWorkflowGateKind, RpcWorkflowStage } from "../../rpc/rpc-types";
12
+
15
13
  import type { OpenGateInput } from "./workflow-gate-broker";
14
+ import type { JsonSchema, WorkflowGateKind, WorkflowStage } from "./workflow-gate-types";
16
15
 
17
16
  /** "Other (type your own)" sentinel, mirroring the interactive ask tool. */
18
17
  export const GATE_OTHER_OPTION = "Other (type your own)";
@@ -27,8 +26,8 @@ export interface AskGateDeepInterviewState {
27
26
  }
28
27
 
29
28
  export interface AskGateWorkflowGateMeta {
30
- stage: RpcWorkflowStage;
31
- kind: RpcWorkflowGateKind;
29
+ stage: WorkflowStage;
30
+ kind: WorkflowGateKind;
32
31
  }
33
32
 
34
33
  export interface AskGateQuestion {
@@ -115,16 +114,16 @@ function deepInterviewQuestionState(questionText: string): Record<string, unknow
115
114
  return state;
116
115
  }
117
116
 
118
- function questionAnswerSchema(question: AskGateQuestion, labels: string[]): RpcJsonSchema {
117
+ function questionAnswerSchema(question: AskGateQuestion, labels: string[]): JsonSchema {
119
118
  const multi = question.multi ?? false;
120
- const selectedItems: RpcJsonSchema = { type: "string", enum: labels };
121
- const selectedBase: RpcJsonSchema = { type: "array", items: selectedItems, uniqueItems: true };
122
- const selectedOnly: RpcJsonSchema = {
119
+ const selectedItems: JsonSchema = { type: "string", enum: labels };
120
+ const selectedBase: JsonSchema = { type: "array", items: selectedItems, uniqueItems: true };
121
+ const selectedOnly: JsonSchema = {
123
122
  ...selectedBase,
124
123
  minItems: question.allowEmpty ? 0 : 1,
125
124
  ...(multi ? {} : { maxItems: 1 }),
126
125
  };
127
- const selectedWithOther: RpcJsonSchema = {
126
+ const selectedWithOther: JsonSchema = {
128
127
  ...selectedBase,
129
128
  ...(multi ? {} : { maxItems: 0 }),
130
129
  };
@@ -3,8 +3,8 @@
3
3
  * for AgentSession events and bounded owner observations.
4
4
  *
5
5
  * Two distinct consumer-facing shapes, deliberately NOT collapsed into one:
6
- * - `AgentWireEventPayload`: rich, full `AgentSessionEvent` for renderers
7
- * (ACP SDK notifications, RPC/Bridge event frames).
6
+ * - `AgentWireEventPayload`: rich, full `AgentSessionEvent` for event
7
+ * consumers on any agent-wire transport.
8
8
  * - `AgentWireOwnerObservation`: bounded/redacted owner evidence for control
9
9
  * planes (Harness). Never carries assistant text, message deltas, raw tool
10
10
  * args, raw command output, raw tool results, answers, or oversize strings.
@@ -45,14 +45,13 @@ const AGENT_SESSION_EVENT_TYPE_REGISTRY: Record<AgentWireEventType, true> = {
45
45
  auto_compaction_end: true,
46
46
  auto_retry_start: true,
47
47
  auto_retry_end: true,
48
- retry_fallback_applied: true,
49
- retry_fallback_succeeded: true,
50
48
  ttsr_triggered: true,
51
49
  todo_reminder: true,
52
50
  todo_auto_clear: true,
53
51
  irc_message: true,
54
52
  subagent_steer_message: true,
55
53
  notice: true,
54
+ model_fallback_switched: true,
56
55
  thinking_level_changed: true,
57
56
  goal_updated: true,
58
57
  };
@@ -63,8 +62,8 @@ export const AGENT_WIRE_EVENT_TYPES: readonly AgentWireEventType[] = Object.keys
63
62
  ) as AgentWireEventType[];
64
63
 
65
64
  /**
66
- * Rich event payload. Carries the full `AgentSessionEvent` so renderers (ACP,
67
- * RPC, Bridge) can present message content, tool args/results, todo state, etc.
65
+ * Rich event payload. Carries the full `AgentSessionEvent` so event consumers
66
+ * can present message content, tool args/results, todo state, and related data.
68
67
  */
69
68
  export interface AgentWireEventPayload {
70
69
  event_type: AgentWireEventType;
@@ -78,7 +77,7 @@ export type AgentWireCompactAssistantMessageEvent = AssistantMessageEvent extend
78
77
 
79
78
  export interface AgentWireCompactMessageUpdatePayload {
80
79
  event_type: "message_update";
81
- /** Compact RPC opt-in payload: delta-only update plus minimal routing metadata. */
80
+ /** Compact opt-in payload: delta-only update plus minimal routing metadata. */
82
81
  compact: true;
83
82
  message_id: string | null;
84
83
  content_index: number | null;
@@ -120,7 +119,7 @@ export interface AgentWireOwnerObservation {
120
119
  eventType?: AgentWireEventType;
121
120
  /** Set when this observation derives from a non-event wire frame. */
122
121
  frameType?: string;
123
- /** Owner event kind (e.g. `rpc_tool_started`). */
122
+ /** Owner event kind (for example, a tool-started observation). */
124
123
  kind: string;
125
124
  /** Bounded observed signal, or null when the frame carries no signal. */
126
125
  signal: AgentWireObservedSignal | null;