@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
@@ -1,498 +0,0 @@
1
- import type { AgentTool, ResolvedThinkingLevel } from "@gajae-code/agent-core";
2
- import { ThinkingLevel } from "@gajae-code/agent-core";
3
- import { getOAuthProviders } from "@gajae-code/ai/utils/oauth";
4
- import { Snowflake } from "@gajae-code/utils";
5
- import type { ExtensionUIContext } from "../../../extensibility/extensions";
6
- import type { AgentSession } from "../../../session/agent-session";
7
- import type {
8
- RpcCommand,
9
- RpcExtensionUIRequest,
10
- RpcHostToolDefinition,
11
- RpcHostUriSchemeDefinition,
12
- RpcResponse,
13
- RpcSessionState,
14
- RpcUnattendedAccepted,
15
- RpcUnattendedDeclaration,
16
- RpcWorkflowGateResolution,
17
- RpcWorkflowGateResponse,
18
- } from "../../rpc/rpc-types";
19
- import { rpcError, rpcSuccess } from "./responses";
20
- import {
21
- ActionDeniedError,
22
- ScopeDeniedError,
23
- UnattendedBudgetExceededError,
24
- UnattendedNegotiationError,
25
- } from "./unattended-run-controller";
26
- import { WorkflowGateBrokerError } from "./workflow-gate-broker";
27
-
28
- export type RpcCommandDispatchOutput = (obj: RpcResponse | RpcExtensionUIRequest | object) => void;
29
-
30
- export interface RpcHostToolRegistry {
31
- setTools(tools: RpcHostToolDefinition[]): AgentTool[];
32
- }
33
-
34
- export interface RpcHostUriRegistry {
35
- setSchemes(schemes: RpcHostUriSchemeDefinition[]): string[];
36
- }
37
-
38
- /**
39
- * Optional unattended control plane wired into RPC dispatch (#318/#319/#323).
40
- * When present, `negotiate_unattended` and `workflow_gate_response` route here
41
- * instead of falling through to the unknown-command path.
42
- */
43
- export interface RpcUnattendedControlPlane {
44
- /** Enter unattended mode (fail-closed); throws an Error on refusal. */
45
- negotiate(declaration: RpcUnattendedDeclaration): RpcUnattendedAccepted;
46
- /** Resolve a pending workflow gate with the agent's answer. */
47
- resolveGate(response: RpcWorkflowGateResponse): Promise<RpcWorkflowGateResolution>;
48
- /** List unresolved durable workflow gates for reconnect replay. */
49
- listPendingGates?(): import("../../rpc/rpc-types").RpcWorkflowGate[];
50
- isUnattended?(): boolean;
51
- preflightCommand?(command: RpcCommand): void;
52
- reconcileUsage?(phase?: string): void;
53
- }
54
-
55
- export interface RpcCommandDispatchContext {
56
- session: AgentSession;
57
- output: RpcCommandDispatchOutput;
58
- hostToolRegistry: RpcHostToolRegistry;
59
- hostUriRegistry: RpcHostUriRegistry;
60
- createUiContext: () => Pick<ExtensionUIContext, "notify">;
61
- unattendedControlPlane?: RpcUnattendedControlPlane;
62
- }
63
-
64
- export function normalizeHostToolDefinitions(tools: RpcHostToolDefinition[]): RpcHostToolDefinition[] {
65
- return tools.map((tool, index) => {
66
- const name = typeof tool.name === "string" ? tool.name.trim() : "";
67
- if (!name) {
68
- throw new Error(`Host tool at index ${index} must provide a non-empty name`);
69
- }
70
- const description = typeof tool.description === "string" ? tool.description.trim() : "";
71
- if (!description) {
72
- throw new Error(`Host tool "${name}" must provide a non-empty description`);
73
- }
74
- if (!tool.parameters || typeof tool.parameters !== "object" || Array.isArray(tool.parameters)) {
75
- throw new Error(`Host tool "${name}" must provide a JSON Schema object`);
76
- }
77
- const label = typeof tool.label === "string" && tool.label.trim() ? tool.label.trim() : name;
78
- return {
79
- name,
80
- label,
81
- description,
82
- parameters: tool.parameters,
83
- hidden: tool.hidden === true,
84
- };
85
- });
86
- }
87
-
88
- function serializeRpcDispatchError(err: unknown): string | object {
89
- if (
90
- err instanceof ScopeDeniedError ||
91
- err instanceof ActionDeniedError ||
92
- err instanceof UnattendedBudgetExceededError
93
- ) {
94
- return err.payload;
95
- }
96
- if (err instanceof UnattendedNegotiationError) {
97
- return { code: err.code, message: err.message };
98
- }
99
- if (err instanceof WorkflowGateBrokerError) {
100
- return { code: err.code, message: err.message };
101
- }
102
- return err instanceof Error ? err.message : String(err);
103
- }
104
-
105
- function isConcreteThinkingLevel(value: unknown): value is ResolvedThinkingLevel {
106
- return (
107
- typeof value === "string" &&
108
- value !== ThinkingLevel.Inherit &&
109
- (Object.values(ThinkingLevel) as string[]).includes(value)
110
- );
111
- }
112
-
113
- export async function dispatchRpcCommand(
114
- command: RpcCommand,
115
- context: RpcCommandDispatchContext,
116
- ): Promise<RpcResponse> {
117
- const { session, output, hostToolRegistry, hostUriRegistry, createUiContext, unattendedControlPlane } = context;
118
- const id = command.id;
119
- const typedError = (cmd: string, err: unknown): RpcResponse => rpcError(id, cmd, serializeRpcDispatchError(err));
120
- const preflight = (): RpcResponse | undefined => {
121
- if (!unattendedControlPlane?.isUnattended?.() || command.type === "negotiate_unattended") return undefined;
122
- try {
123
- unattendedControlPlane.preflightCommand?.(command);
124
- return undefined;
125
- } catch (err) {
126
- return typedError(command.type, err);
127
- }
128
- };
129
- const reconcile = (phase = `${command.type} post-dispatch`): RpcResponse | undefined => {
130
- if (!unattendedControlPlane?.isUnattended?.()) return undefined;
131
- try {
132
- unattendedControlPlane.reconcileUsage?.(phase);
133
- return undefined;
134
- } catch (err) {
135
- return typedError(command.type, err);
136
- }
137
- };
138
- const denied = preflight();
139
- if (denied) return denied;
140
-
141
- try {
142
- switch (command.type) {
143
- case "prompt": {
144
- session
145
- .prompt(command.message, {
146
- images: command.images,
147
- streamingBehavior: command.streamingBehavior,
148
- })
149
- .catch(e => output(rpcError(id, "prompt", serializeRpcDispatchError(e))));
150
- return reconcile() ?? rpcSuccess(id, "prompt");
151
- }
152
-
153
- case "steer": {
154
- await session.steer(command.message, command.images);
155
- return rpcSuccess(id, "steer");
156
- }
157
-
158
- case "follow_up": {
159
- await session.followUp(command.message, command.images);
160
- return rpcSuccess(id, "follow_up");
161
- }
162
-
163
- case "abort": {
164
- await session.abort();
165
- return rpcSuccess(id, "abort");
166
- }
167
-
168
- case "abort_and_prompt": {
169
- await session.abort();
170
- session
171
- .prompt(command.message, { images: command.images })
172
- .catch(e => output(rpcError(id, "abort_and_prompt", e.message)));
173
- return rpcSuccess(id, "abort_and_prompt");
174
- }
175
-
176
- case "new_session": {
177
- const options = command.parentSession ? { parentSession: command.parentSession } : undefined;
178
- const cancelled = !(await session.newSession(options));
179
- return rpcSuccess(id, "new_session", { cancelled });
180
- }
181
-
182
- case "get_state": {
183
- const state: RpcSessionState = {
184
- model: session.model,
185
- thinkingLevel: session.thinkingLevel,
186
- isStreaming: session.isStreaming,
187
- isCompacting: session.isCompacting,
188
- steeringMode: session.steeringMode,
189
- followUpMode: session.followUpMode,
190
- interruptMode: session.interruptMode,
191
- sessionFile: session.sessionFile,
192
- sessionId: session.sessionId,
193
- sessionName: session.sessionName,
194
- autoCompactionEnabled: session.autoCompactionEnabled,
195
- messageCount: session.messages.length,
196
- queuedMessageCount: session.queuedMessageCount,
197
- todoPhases: session.getTodoPhases(),
198
- contextUsage: session.getContextUsage(),
199
- };
200
- const include = new Set(command.include ?? []);
201
- if (include.has("systemPrompt")) {
202
- state.systemPrompt = session.systemPrompt;
203
- }
204
- if (include.has("tools") || include.has("dumpTools")) {
205
- state.dumpTools = session.agent.state.tools.map(tool => ({
206
- name: tool.name,
207
- description: tool.description,
208
- parameters: tool.parameters,
209
- }));
210
- }
211
- return rpcSuccess(id, "get_state", state);
212
- }
213
-
214
- case "set_todos": {
215
- session.setTodoPhases(command.phases);
216
- return rpcSuccess(id, "set_todos", { todoPhases: session.getTodoPhases() });
217
- }
218
-
219
- case "set_host_tools": {
220
- const tools = normalizeHostToolDefinitions(command.tools);
221
- const rpcTools = hostToolRegistry.setTools(tools);
222
- await session.refreshRpcHostTools(rpcTools);
223
- return rpcSuccess(id, "set_host_tools", { toolNames: tools.map(tool => tool.name) });
224
- }
225
-
226
- case "get_pending_workflow_gates": {
227
- const gates = unattendedControlPlane?.listPendingGates?.() ?? [];
228
- return rpcSuccess(id, "get_pending_workflow_gates", { gates });
229
- }
230
-
231
- case "set_host_uri_schemes": {
232
- try {
233
- const schemes = hostUriRegistry.setSchemes(command.schemes);
234
- return rpcSuccess(id, "set_host_uri_schemes", { schemes });
235
- } catch (err) {
236
- return rpcError(id, "set_host_uri_schemes", err instanceof Error ? err.message : String(err));
237
- }
238
- }
239
-
240
- case "set_model": {
241
- const models = session.getAvailableModels();
242
- const model = models.find(m => m.provider === command.provider && m.id === command.modelId);
243
- if (!model) {
244
- return rpcError(id, "set_model", `Model not found: ${command.provider}/${command.modelId}`);
245
- }
246
- await session.setModel(model);
247
- return rpcSuccess(id, "set_model", model);
248
- }
249
-
250
- case "set_default_model_selection": {
251
- if (typeof command.provider !== "string" || !command.provider.trim()) {
252
- return typedError("set_default_model_selection", "provider must be a non-empty string");
253
- }
254
- if (typeof command.modelId !== "string" || !command.modelId.trim()) {
255
- return typedError("set_default_model_selection", "modelId must be a non-empty string");
256
- }
257
- const requestedLevel: unknown = command.thinkingLevel;
258
- if (requestedLevel !== undefined && !isConcreteThinkingLevel(requestedLevel)) {
259
- return typedError("set_default_model_selection", "thinkingLevel must be a concrete level");
260
- }
261
- const model = session
262
- .getAvailableModels()
263
- .find(candidate => candidate.provider === command.provider && candidate.id === command.modelId);
264
- if (!model) {
265
- return typedError(
266
- "set_default_model_selection",
267
- `Model not found: ${command.provider}/${command.modelId}`,
268
- );
269
- }
270
- const selection = await session.setDefaultModelSelection(model, requestedLevel);
271
- return rpcSuccess(id, "set_default_model_selection", selection);
272
- }
273
-
274
- case "cycle_model": {
275
- const result = await session.cycleModel();
276
- if (!result) {
277
- return rpcSuccess(id, "cycle_model", null);
278
- }
279
- return rpcSuccess(id, "cycle_model", result);
280
- }
281
-
282
- case "get_available_models": {
283
- const models = session.getAvailableModels();
284
- return rpcSuccess(id, "get_available_models", { models });
285
- }
286
-
287
- case "set_thinking_level": {
288
- if (!(Object.values(ThinkingLevel) as string[]).includes(command.level as string)) {
289
- return rpcError(id, "set_thinking_level", `Invalid thinking level: ${String(command.level)}`);
290
- }
291
- session.setThinkingLevel(command.level);
292
- return rpcSuccess(id, "set_thinking_level");
293
- }
294
-
295
- case "cycle_thinking_level": {
296
- const level = session.cycleThinkingLevel();
297
- if (!level) {
298
- return rpcSuccess(id, "cycle_thinking_level", null);
299
- }
300
- return rpcSuccess(id, "cycle_thinking_level", { level });
301
- }
302
-
303
- case "set_steering_mode": {
304
- if ((command.mode as string) !== "all" && (command.mode as string) !== "one-at-a-time") {
305
- return rpcError(id, "set_steering_mode", `Invalid steering mode: ${String(command.mode)}`);
306
- }
307
- session.setSteeringMode(command.mode);
308
- return rpcSuccess(id, "set_steering_mode");
309
- }
310
-
311
- case "set_follow_up_mode": {
312
- if ((command.mode as string) !== "all" && (command.mode as string) !== "one-at-a-time") {
313
- return rpcError(id, "set_follow_up_mode", `Invalid follow-up mode: ${String(command.mode)}`);
314
- }
315
- session.setFollowUpMode(command.mode);
316
- return rpcSuccess(id, "set_follow_up_mode");
317
- }
318
-
319
- case "set_interrupt_mode": {
320
- if ((command.mode as string) !== "immediate" && (command.mode as string) !== "wait") {
321
- return rpcError(id, "set_interrupt_mode", `Invalid interrupt mode: ${String(command.mode)}`);
322
- }
323
- session.setInterruptMode(command.mode);
324
- return rpcSuccess(id, "set_interrupt_mode");
325
- }
326
-
327
- case "compact": {
328
- const result = await session.compact(command.customInstructions);
329
- return rpcSuccess(id, "compact", result);
330
- }
331
-
332
- case "set_auto_compaction": {
333
- session.setAutoCompactionEnabled(command.enabled);
334
- return rpcSuccess(id, "set_auto_compaction");
335
- }
336
-
337
- case "set_auto_retry": {
338
- session.setAutoRetryEnabled(command.enabled);
339
- return rpcSuccess(id, "set_auto_retry");
340
- }
341
-
342
- case "abort_retry": {
343
- session.abortRetry();
344
- return rpcSuccess(id, "abort_retry");
345
- }
346
-
347
- case "bash": {
348
- const result = await session.executeBash(command.command);
349
- return reconcile() ?? rpcSuccess(id, "bash", result);
350
- }
351
-
352
- case "abort_bash": {
353
- session.abortBash();
354
- return rpcSuccess(id, "abort_bash");
355
- }
356
-
357
- case "get_session_stats": {
358
- const stats = session.getSessionStats();
359
- return rpcSuccess(id, "get_session_stats", stats);
360
- }
361
-
362
- case "export_html": {
363
- const path = await session.exportToHtml(command.outputPath);
364
- return rpcSuccess(id, "export_html", { path });
365
- }
366
-
367
- case "switch_session": {
368
- const cancelled = !(await session.switchSession(command.sessionPath));
369
- return rpcSuccess(id, "switch_session", { cancelled });
370
- }
371
-
372
- case "branch": {
373
- const result = await session.branch(command.entryId);
374
- return rpcSuccess(id, "branch", { text: result.selectedText, cancelled: result.cancelled });
375
- }
376
-
377
- case "get_branch_messages": {
378
- const messages = session.getUserMessagesForBranching();
379
- return rpcSuccess(id, "get_branch_messages", { messages });
380
- }
381
-
382
- case "get_last_assistant_text": {
383
- const text = session.getLastAssistantText();
384
- return rpcSuccess(id, "get_last_assistant_text", { text });
385
- }
386
-
387
- case "set_session_name": {
388
- const name = command.name.trim();
389
- if (!name) {
390
- return rpcError(id, "set_session_name", "Session name cannot be empty");
391
- }
392
- const applied = await session.setSessionName(name, "user");
393
- if (!applied) {
394
- return rpcError(id, "set_session_name", "Session name cannot be empty");
395
- }
396
- return rpcSuccess(id, "set_session_name");
397
- }
398
-
399
- case "handoff": {
400
- const result = await session.handoff(command.customInstructions);
401
- return rpcSuccess(id, "handoff", result ? { savedPath: result.savedPath } : null);
402
- }
403
-
404
- case "get_messages": {
405
- // Fast-lane read: snapshot the live array so a concurrent ordered
406
- // turn/compaction mutating session.messages in place cannot make this
407
- // response serialize a half-rewritten array (#606, issue 13).
408
- return rpcSuccess(id, "get_messages", { messages: [...session.messages] });
409
- }
410
-
411
- case "get_login_providers": {
412
- const providers = getOAuthProviders().map(provider => ({
413
- id: provider.id,
414
- name: provider.name,
415
- available: provider.available,
416
- authenticated: session.modelRegistry.authStorage.hasAuth(provider.id),
417
- }));
418
- return rpcSuccess(id, "get_login_providers", { providers });
419
- }
420
-
421
- case "login": {
422
- const knownProvider = getOAuthProviders().find(p => p.id === command.providerId);
423
- if (!knownProvider) {
424
- return rpcError(id, "login", `Unknown OAuth provider: ${command.providerId}`);
425
- }
426
- const uiCtx = createUiContext();
427
- let authEmitted = false;
428
- try {
429
- await session.modelRegistry.authStorage.login(command.providerId, {
430
- onAuth: info => {
431
- authEmitted = true;
432
- output({
433
- type: "extension_ui_request",
434
- id: Snowflake.next() as string,
435
- method: "open_url",
436
- url: info.url,
437
- instructions: info.instructions,
438
- } as RpcExtensionUIRequest);
439
- },
440
- onProgress: message => {
441
- uiCtx.notify(message, "info");
442
- },
443
- onPrompt: () => {
444
- if (!authEmitted) {
445
- return Promise.reject(
446
- new Error(
447
- `Provider '${command.providerId}' requires interactive prompts ` +
448
- "which are not supported in RPC mode. Use the terminal UI to log in.",
449
- ),
450
- );
451
- }
452
- return new Promise<string>(() => {});
453
- },
454
- });
455
- await session.modelRegistry.refresh();
456
- return rpcSuccess(id, "login", { providerId: command.providerId });
457
- } catch (err: unknown) {
458
- return rpcError(id, "login", err instanceof Error ? err.message : String(err));
459
- }
460
- }
461
-
462
- case "negotiate_unattended": {
463
- if (!unattendedControlPlane) {
464
- return rpcError(id, "negotiate_unattended", "unattended mode is not available on this session");
465
- }
466
- try {
467
- const accepted = unattendedControlPlane.negotiate(command.declaration);
468
- return rpcSuccess(id, "negotiate_unattended", accepted);
469
- } catch (err) {
470
- return typedError("negotiate_unattended", err);
471
- }
472
- }
473
-
474
- case "workflow_gate_response": {
475
- if (!unattendedControlPlane) {
476
- return rpcError(id, "workflow_gate_response", "workflow gates are not available on this session");
477
- }
478
- try {
479
- const resolution = await unattendedControlPlane.resolveGate({
480
- gate_id: command.gate_id,
481
- answer: command.answer,
482
- idempotency_key: command.idempotency_key,
483
- });
484
- return rpcSuccess(id, "workflow_gate_response", resolution);
485
- } catch (err) {
486
- return typedError("workflow_gate_response", err);
487
- }
488
- }
489
-
490
- default: {
491
- const unknownCommand = command as { type: string };
492
- return rpcError(id, unknownCommand.type, `Unknown command: ${unknownCommand.type}`);
493
- }
494
- }
495
- } catch (err) {
496
- return rpcError(id, command.type, serializeRpcDispatchError(err));
497
- }
498
- }
@@ -1,181 +0,0 @@
1
- import type { RpcCommand } from "../../rpc/rpc-types";
2
- import { isRpcCommandType } from "./scopes";
3
-
4
- function isRecord(value: unknown): value is Record<string, unknown> {
5
- return !!value && typeof value === "object" && !Array.isArray(value);
6
- }
7
-
8
- function optionalString(value: unknown): boolean {
9
- return value === undefined || typeof value === "string";
10
- }
11
-
12
- function optionalArray(value: unknown): boolean {
13
- return value === undefined || Array.isArray(value);
14
- }
15
-
16
- function stringField(value: Record<string, unknown>, key: string): boolean {
17
- return typeof value[key] === "string";
18
- }
19
-
20
- const THINKING_LEVELS = new Set(["inherit", "off", "minimal", "low", "medium", "high", "xhigh", "max"]);
21
- const RESOLVED_THINKING_LEVELS = new Set(["off", "minimal", "low", "medium", "high", "xhigh", "max"]);
22
- const TODO_STATUSES = new Set(["pending", "in_progress", "completed", "abandoned"]);
23
-
24
- function optionalBoolean(value: unknown): boolean {
25
- return value === undefined || typeof value === "boolean";
26
- }
27
-
28
- function stringArray(value: unknown): value is string[] {
29
- return Array.isArray(value) && value.every(item => typeof item === "string");
30
- }
31
-
32
- const GET_STATE_INCLUDES = new Set(["tools", "dumpTools", "systemPrompt"]);
33
-
34
- function optionalGetStateInclude(value: unknown): boolean {
35
- return (
36
- value === undefined ||
37
- (Array.isArray(value) && value.every(item => typeof item === "string" && GET_STATE_INCLUDES.has(item)))
38
- );
39
- }
40
-
41
- function todoPhase(value: unknown): boolean {
42
- if (!isRecord(value) || typeof value.name !== "string" || !Array.isArray(value.tasks)) return false;
43
- return value.tasks.every(
44
- task =>
45
- isRecord(task) &&
46
- typeof task.content === "string" &&
47
- typeof task.status === "string" &&
48
- TODO_STATUSES.has(task.status) &&
49
- (task.notes === undefined || stringArray(task.notes)),
50
- );
51
- }
52
-
53
- function hostToolDefinition(value: unknown): boolean {
54
- return (
55
- isRecord(value) &&
56
- typeof value.name === "string" &&
57
- typeof value.description === "string" &&
58
- isRecord(value.parameters) &&
59
- optionalString(value.label) &&
60
- optionalBoolean(value.hidden)
61
- );
62
- }
63
-
64
- function hostUriScheme(value: unknown): boolean {
65
- return (
66
- isRecord(value) &&
67
- typeof value.scheme === "string" &&
68
- optionalString(value.description) &&
69
- optionalBoolean(value.writable) &&
70
- optionalBoolean(value.immutable)
71
- );
72
- }
73
-
74
- function unattendedBudget(value: unknown): boolean {
75
- return (
76
- isRecord(value) &&
77
- typeof value.max_tokens === "number" &&
78
- typeof value.max_tool_calls === "number" &&
79
- typeof value.max_wall_time_ms === "number" &&
80
- typeof value.max_cost_usd === "number"
81
- );
82
- }
83
-
84
- function unattendedDeclaration(value: unknown): boolean {
85
- return (
86
- isRecord(value) &&
87
- typeof value.actor === "string" &&
88
- unattendedBudget(value.budget) &&
89
- stringArray(value.scopes) &&
90
- stringArray(value.action_allowlist)
91
- );
92
- }
93
-
94
- export function isRpcCommand(value: unknown): value is RpcCommand {
95
- if (!isRecord(value) || !optionalString(value.id) || !isRpcCommandType(value.type)) return false;
96
- switch (value.type) {
97
- case "prompt":
98
- return (
99
- stringField(value, "message") &&
100
- optionalArray(value.images) &&
101
- (value.streamingBehavior === undefined ||
102
- value.streamingBehavior === "steer" ||
103
- value.streamingBehavior === "followUp")
104
- );
105
- case "steer":
106
- case "follow_up":
107
- return stringField(value, "message") && optionalArray(value.images);
108
- case "abort":
109
- return true;
110
- case "get_state":
111
- return optionalGetStateInclude(value.include);
112
- case "cycle_model":
113
- case "get_available_models":
114
- case "cycle_thinking_level":
115
- case "abort_retry":
116
- case "abort_bash":
117
- case "get_session_stats":
118
- case "get_branch_messages":
119
- case "get_last_assistant_text":
120
- case "get_messages":
121
- case "get_login_providers":
122
- case "get_pending_workflow_gates":
123
- return true;
124
- case "abort_and_prompt":
125
- return stringField(value, "message") && optionalArray(value.images);
126
- case "new_session":
127
- return optionalString(value.parentSession);
128
- case "set_todos":
129
- return Array.isArray(value.phases) && value.phases.every(todoPhase);
130
- case "set_host_tools":
131
- return Array.isArray(value.tools) && value.tools.every(hostToolDefinition);
132
- case "set_host_uri_schemes":
133
- return Array.isArray(value.schemes) && value.schemes.every(hostUriScheme);
134
- case "set_capabilities":
135
- return (
136
- Array.isArray(value.capabilities) && value.capabilities.every(capability => typeof capability === "string")
137
- );
138
- case "set_model":
139
- return stringField(value, "provider") && stringField(value, "modelId");
140
- case "set_default_model_selection":
141
- return (
142
- typeof value.provider === "string" &&
143
- value.provider.trim().length > 0 &&
144
- typeof value.modelId === "string" &&
145
- value.modelId.trim().length > 0 &&
146
- (value.thinkingLevel === undefined ||
147
- (typeof value.thinkingLevel === "string" && RESOLVED_THINKING_LEVELS.has(value.thinkingLevel)))
148
- );
149
- case "set_thinking_level":
150
- return typeof value.level === "string" && THINKING_LEVELS.has(value.level);
151
- case "set_steering_mode":
152
- return value.mode === "all" || value.mode === "one-at-a-time";
153
- case "set_follow_up_mode":
154
- return value.mode === "all" || value.mode === "one-at-a-time";
155
- case "set_interrupt_mode":
156
- return value.mode === "immediate" || value.mode === "wait";
157
- case "compact":
158
- return optionalString(value.customInstructions);
159
- case "set_auto_compaction":
160
- case "set_auto_retry":
161
- return typeof value.enabled === "boolean";
162
- case "bash":
163
- return stringField(value, "command");
164
- case "export_html":
165
- return optionalString(value.outputPath);
166
- case "switch_session":
167
- return stringField(value, "sessionPath");
168
- case "branch":
169
- return stringField(value, "entryId");
170
- case "set_session_name":
171
- return stringField(value, "name");
172
- case "handoff":
173
- return optionalString(value.customInstructions);
174
- case "login":
175
- return stringField(value, "providerId");
176
- case "negotiate_unattended":
177
- return unattendedDeclaration(value.declaration);
178
- case "workflow_gate_response":
179
- return stringField(value, "gate_id") && "answer" in value && optionalString(value.idempotency_key);
180
- }
181
- }