@gajae-code/coding-agent 0.10.2 → 0.11.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (476) hide show
  1. package/CHANGELOG.md +58 -2
  2. package/dist/types/append-only-mode.d.ts +1 -1
  3. package/dist/types/async/job-manager.d.ts +46 -7
  4. package/dist/types/cli/args.d.ts +4 -5
  5. package/dist/types/cli/daemon-cli.d.ts +12 -1
  6. package/dist/types/cli/notify-cli.d.ts +21 -1
  7. package/dist/types/cli.d.ts +3 -0
  8. package/dist/types/commands/daemon.d.ts +39 -0
  9. package/dist/types/commands/launch.d.ts +3 -0
  10. package/dist/types/commands/notify.d.ts +28 -1
  11. package/dist/types/commands/sdk.d.ts +33 -0
  12. package/dist/types/config/atomic-yaml-patch.d.ts +85 -0
  13. package/dist/types/config/model-profile-activation.d.ts +35 -15
  14. package/dist/types/config/model-profiles.d.ts +11 -5
  15. package/dist/types/config/model-registry.d.ts +3 -3
  16. package/dist/types/config/model-resolver.d.ts +39 -6
  17. package/dist/types/config/model-selector-value.d.ts +17 -0
  18. package/dist/types/config/models-config-schema.d.ts +10 -6
  19. package/dist/types/config/settings-schema.d.ts +133 -6
  20. package/dist/types/config/settings.d.ts +63 -35
  21. package/dist/types/coordinator-mcp/model-preset.d.ts +7 -6
  22. package/dist/types/coordinator-mcp/server.d.ts +6 -49
  23. package/dist/types/daemon/builtin.d.ts +6 -5
  24. package/dist/types/daemon/control-types.d.ts +1 -1
  25. package/dist/types/discovery/mcp-json.d.ts +12 -1
  26. package/dist/types/extensibility/custom-tools/types.d.ts +1 -1
  27. package/dist/types/extensibility/extensions/compact-handler.d.ts +4 -2
  28. package/dist/types/extensibility/extensions/get-commands-handler.d.ts +2 -2
  29. package/dist/types/extensibility/extensions/loader.d.ts +10 -1
  30. package/dist/types/extensibility/extensions/runner.d.ts +3 -3
  31. package/dist/types/extensibility/extensions/types.d.ts +141 -16
  32. package/dist/types/extensibility/hooks/types.d.ts +1 -1
  33. package/dist/types/gjc-runtime/launch-tmux.d.ts +3 -2
  34. package/dist/types/gjc-runtime/psmux-detect.d.ts +3 -0
  35. package/dist/types/gjc-runtime/session-state-sidecar.d.ts +3 -0
  36. package/dist/types/gjc-runtime/team-runtime.d.ts +3 -4
  37. package/dist/types/gjc-runtime/tmux-owner-isolation-cli.d.ts +13 -0
  38. package/dist/types/gjc-runtime/tmux-sessions.d.ts +4 -1
  39. package/dist/types/gjc-runtime/ultragoal-receipt-freshness.d.ts +11 -0
  40. package/dist/types/gjc-runtime/windows-powershell-command.d.ts +9 -0
  41. package/dist/types/harness-control-plane/operate.d.ts +5 -5
  42. package/dist/types/harness-control-plane/owner.d.ts +18 -4
  43. package/dist/types/harness-control-plane/receipts.d.ts +0 -1
  44. package/dist/types/harness-control-plane/sdk-transport.d.ts +43 -0
  45. package/dist/types/harness-control-plane/session-transport.d.ts +48 -0
  46. package/dist/types/harness-control-plane/types.d.ts +3 -4
  47. package/dist/types/lsp/index.d.ts +1 -1
  48. package/dist/types/main.d.ts +32 -38
  49. package/dist/types/modes/acp/acp-agent.d.ts +224 -53
  50. package/dist/types/modes/acp/acp-client-bridge.d.ts +1 -0
  51. package/dist/types/modes/acp/acp-mode.d.ts +6 -15
  52. package/dist/types/modes/acp/permission-mode.d.ts +4 -0
  53. package/dist/types/modes/acp/startup-options.d.ts +6 -0
  54. package/dist/types/modes/components/agent-dashboard.d.ts +3 -0
  55. package/dist/types/modes/components/model-selector.d.ts +1 -0
  56. package/dist/types/modes/components/notifications-settings-editor.d.ts +135 -0
  57. package/dist/types/modes/components/settings-selector.d.ts +6 -4
  58. package/dist/types/modes/components/welcome.d.ts +1 -1
  59. package/dist/types/modes/controllers/command-controller.d.ts +2 -2
  60. package/dist/types/modes/controllers/extension-ui-controller.d.ts +1 -0
  61. package/dist/types/modes/controllers/selector-controller.d.ts +35 -1
  62. package/dist/types/modes/index.d.ts +0 -4
  63. package/dist/types/modes/interactive-mode.d.ts +5 -2
  64. package/dist/types/modes/runtime-init.d.ts +2 -2
  65. package/dist/types/modes/shared/agent-wire/approval-gate.d.ts +6 -9
  66. package/dist/types/modes/shared/agent-wire/deep-interview-gate.d.ts +4 -6
  67. package/dist/types/modes/shared/agent-wire/event-contract.d.ts +6 -6
  68. package/dist/types/modes/shared/agent-wire/event-envelope.d.ts +4 -9
  69. package/dist/types/modes/shared/agent-wire/event-observation.d.ts +1 -1
  70. package/dist/types/modes/shared/agent-wire/workflow-gate-broker.d.ts +170 -30
  71. package/dist/types/modes/shared/agent-wire/workflow-gate-schema.d.ts +7 -7
  72. package/dist/types/modes/shared/agent-wire/workflow-gate-types.d.ts +105 -0
  73. package/dist/types/modes/types.d.ts +7 -2
  74. package/dist/types/runtime-mcp/client.d.ts +2 -0
  75. package/dist/types/runtime-mcp/config.d.ts +5 -1
  76. package/dist/types/runtime-mcp/manager.d.ts +8 -1
  77. package/dist/types/runtime-mcp/types.d.ts +4 -0
  78. package/dist/types/sdk/acp/adapter.d.ts +67 -0
  79. package/dist/types/sdk/acp/index.d.ts +2 -0
  80. package/dist/types/sdk/broker/broker.d.ts +53 -0
  81. package/dist/types/sdk/broker/discovery.d.ts +30 -0
  82. package/dist/types/sdk/broker/ensure.d.ts +42 -0
  83. package/dist/types/sdk/broker/identity.d.ts +3 -0
  84. package/dist/types/sdk/broker/index.d.ts +8 -0
  85. package/dist/types/sdk/broker/lifecycle-ledger.d.ts +95 -0
  86. package/dist/types/sdk/broker/lifecycle.d.ts +85 -0
  87. package/dist/types/sdk/broker/process-incarnation.d.ts +14 -0
  88. package/dist/types/sdk/broker/runtime.d.ts +33 -0
  89. package/dist/types/sdk/broker/session-index.d.ts +57 -0
  90. package/dist/types/sdk/broker/state-version.d.ts +8 -0
  91. package/dist/types/sdk/broker/transport.d.ts +9 -0
  92. package/dist/types/sdk/bus/chat-command-policy.d.ts +49 -0
  93. package/dist/types/sdk/bus/chat-daemon-cli.d.ts +21 -0
  94. package/dist/types/sdk/bus/chat-daemon-control.d.ts +111 -0
  95. package/dist/types/sdk/bus/chat-daemon-runtime.d.ts +77 -0
  96. package/dist/types/sdk/bus/chat-effect-journal.d.ts +84 -0
  97. package/dist/types/{notifications → sdk/bus}/config-commands.d.ts +7 -2
  98. package/dist/types/sdk/bus/config.d.ts +274 -0
  99. package/dist/types/sdk/bus/conversation-store.d.ts +72 -0
  100. package/dist/types/sdk/bus/discord-conversation.d.ts +58 -0
  101. package/dist/types/sdk/bus/discord-daemon.d.ts +50 -0
  102. package/dist/types/sdk/bus/discord-live-provider.d.ts +70 -0
  103. package/dist/types/sdk/bus/discord-provider.d.ts +85 -0
  104. package/dist/types/{notifications → sdk/bus}/html-format.d.ts +2 -2
  105. package/dist/types/{notifications → sdk/bus}/index.d.ts +113 -13
  106. package/dist/types/{notifications → sdk/bus}/lifecycle-control-runtime.d.ts +4 -2
  107. package/dist/types/{notifications → sdk/bus}/lifecycle-orchestrator.d.ts +18 -21
  108. package/dist/types/{notifications → sdk/bus}/managed-daemon.d.ts +1 -1
  109. package/dist/types/sdk/bus/native-runtime-compatibility.d.ts +13 -0
  110. package/dist/types/sdk/bus/notification-orchestration.d.ts +170 -0
  111. package/dist/types/{notifications → sdk/bus}/notification-service.d.ts +7 -1
  112. package/dist/types/sdk/bus/session-control.d.ts +83 -0
  113. package/dist/types/sdk/bus/slack-conversation.d.ts +56 -0
  114. package/dist/types/sdk/bus/slack-daemon.d.ts +60 -0
  115. package/dist/types/sdk/bus/slack-live-provider.d.ts +59 -0
  116. package/dist/types/sdk/bus/slack-provider.d.ts +55 -0
  117. package/dist/types/{notifications → sdk/bus}/telegram-cli.d.ts +4 -4
  118. package/dist/types/{notifications → sdk/bus}/telegram-daemon-cli.d.ts +14 -5
  119. package/dist/types/sdk/bus/telegram-daemon-contract.d.ts +12 -0
  120. package/dist/types/{notifications → sdk/bus}/telegram-daemon-control.d.ts +2 -2
  121. package/dist/types/{notifications → sdk/bus}/telegram-daemon.d.ts +78 -17
  122. package/dist/types/{notifications → sdk/bus}/telegram-reference.d.ts +2 -2
  123. package/dist/types/sdk/bus/telegram-setup.d.ts +128 -0
  124. package/dist/types/{notifications → sdk/bus}/topic-registry.d.ts +11 -0
  125. package/dist/types/sdk/cli/index.d.ts +1 -0
  126. package/dist/types/sdk/cli/session-cli.d.ts +19 -0
  127. package/dist/types/sdk/client/client.d.ts +1 -0
  128. package/dist/types/sdk/client/discovery.d.ts +27 -0
  129. package/dist/types/sdk/client/index.d.ts +2 -0
  130. package/dist/types/sdk/host/control/dispatch.d.ts +34 -0
  131. package/dist/types/sdk/host/control/index.d.ts +2 -0
  132. package/dist/types/sdk/host/control/operations.d.ts +65 -0
  133. package/dist/types/sdk/host/events.d.ts +35 -0
  134. package/dist/types/sdk/host/host.d.ts +35 -0
  135. package/dist/types/sdk/host/index.d.ts +4 -0
  136. package/dist/types/sdk/host/query/cursor.d.ts +62 -0
  137. package/dist/types/sdk/host/query/handlers.d.ts +70 -0
  138. package/dist/types/sdk/host/query/index.d.ts +3 -0
  139. package/dist/types/sdk/host/query/revision-store.d.ts +60 -0
  140. package/dist/types/sdk/host/reverse-leases.d.ts +45 -0
  141. package/dist/types/sdk/host/types.d.ts +32 -0
  142. package/dist/types/sdk/index.d.ts +6 -0
  143. package/dist/types/sdk/lifecycle-session.d.ts +14 -0
  144. package/dist/types/sdk/mcp/index.d.ts +1 -0
  145. package/dist/types/sdk/mcp/server.d.ts +37 -0
  146. package/dist/types/sdk/models.d.ts +44 -0
  147. package/dist/types/sdk/protocol/adapter-validation.d.ts +14 -0
  148. package/dist/types/sdk/protocol/operation-registry.d.ts +24 -0
  149. package/dist/types/{sdk.d.ts → sdk/session.d.ts} +44 -38
  150. package/dist/types/sdk/startup-capability.d.ts +50 -0
  151. package/dist/types/session/agent-session.d.ts +114 -21
  152. package/dist/types/session/default-model-selection.d.ts +25 -0
  153. package/dist/types/session/fallback-chain-controller.d.ts +52 -0
  154. package/dist/types/session/session-manager.d.ts +58 -1
  155. package/dist/types/setup/credential-auto-import.d.ts +36 -6
  156. package/dist/types/tools/ask-answer-registry.d.ts +1 -1
  157. package/dist/types/tools/browser/benchmark/detector-report.d.ts +63 -0
  158. package/dist/types/tools/browser/benchmark/run-suite.d.ts +18 -0
  159. package/dist/types/tools/browser/launch.d.ts +22 -0
  160. package/dist/types/tools/browser/profile-discovery.d.ts +31 -0
  161. package/dist/types/tools/browser/profile-posture.d.ts +37 -0
  162. package/dist/types/tools/browser/profile-reuse.d.ts +39 -0
  163. package/dist/types/tools/browser/profile-warmup.d.ts +39 -0
  164. package/dist/types/tools/browser/registry.d.ts +19 -0
  165. package/dist/types/tools/browser/tab-protocol.d.ts +4 -0
  166. package/dist/types/tools/index.d.ts +8 -8
  167. package/dist/types/tools/subagent-render.d.ts +1 -0
  168. package/dist/types/tools/subagent.d.ts +6 -1
  169. package/package.json +34 -13
  170. package/scripts/build-sdk-package-smoke.ts +99 -0
  171. package/scripts/capture-notifications-settings-showcase.ts +435 -0
  172. package/scripts/compile-args.ts +4 -2
  173. package/scripts/g005-daemon-smoke.ts +4 -5
  174. package/scripts/g011-daemon-path-smoke.ts +5 -5
  175. package/scripts/generate-sdk-adapter-parity-manifest.ts +163 -0
  176. package/scripts/generate-sdk-operation-inventory.ts +867 -0
  177. package/scripts/generate-telegram-baseline-manifest.ts +128 -0
  178. package/scripts/manifest-schema.ts +124 -0
  179. package/scripts/run-test-manifest.ts +153 -0
  180. package/scripts/run-threat-model-check.ts +157 -0
  181. package/scripts/verify-gjc-sdk-canonicalization.ts +3467 -0
  182. package/scripts/verify-gjc-sdk-rename.ts +90 -0
  183. package/src/append-only-mode.ts +1 -1
  184. package/src/async/job-manager.ts +406 -63
  185. package/src/cli/args.ts +43 -12
  186. package/src/cli/auth-gateway-cli.ts +2 -2
  187. package/src/cli/config-cli.ts +2 -1
  188. package/src/cli/daemon-cli.ts +63 -14
  189. package/src/cli/list-models.ts +1 -1
  190. package/src/cli/notify-cli.ts +288 -286
  191. package/src/cli.ts +21 -2
  192. package/src/commands/daemon.ts +50 -6
  193. package/src/commands/harness.ts +93 -36
  194. package/src/commands/launch.ts +5 -2
  195. package/src/commands/mcp-serve.ts +19 -12
  196. package/src/commands/notify.ts +36 -3
  197. package/src/commands/sdk.ts +426 -0
  198. package/src/commit/agentic/agent.ts +1 -0
  199. package/src/config/atomic-yaml-patch.ts +423 -0
  200. package/src/config/model-profile-activation.ts +240 -89
  201. package/src/config/model-profiles.ts +18 -15
  202. package/src/config/model-registry.ts +51 -26
  203. package/src/config/model-resolver.ts +138 -51
  204. package/src/config/model-selector-value.ts +50 -0
  205. package/src/config/models-config-schema.ts +14 -21
  206. package/src/config/settings-schema.ts +128 -10
  207. package/src/config/settings.ts +1120 -158
  208. package/src/coordinator-mcp/model-preset.ts +74 -20
  209. package/src/coordinator-mcp/server.ts +1597 -3052
  210. package/src/daemon/builtin.ts +8 -5
  211. package/src/daemon/control-types.ts +1 -1
  212. package/src/defaults/gjc/skills/team/SKILL.md +4 -4
  213. package/src/discovery/mcp-json.ts +327 -20
  214. package/src/extensibility/custom-tools/types.ts +1 -1
  215. package/src/extensibility/extensions/compact-handler.ts +3 -3
  216. package/src/extensibility/extensions/get-commands-handler.ts +2 -2
  217. package/src/extensibility/extensions/loader.ts +69 -5
  218. package/src/extensibility/extensions/runner.ts +112 -4
  219. package/src/extensibility/extensions/types.ts +176 -17
  220. package/src/extensibility/hooks/types.ts +1 -1
  221. package/src/gjc-runtime/launch-tmux.ts +170 -86
  222. package/src/gjc-runtime/psmux-detect.ts +82 -4
  223. package/src/gjc-runtime/session-state-sidecar.ts +41 -31
  224. package/src/gjc-runtime/team-runtime.ts +54 -35
  225. package/src/gjc-runtime/tmux-owner-isolation-cli.ts +53 -17
  226. package/src/gjc-runtime/tmux-owner-isolation.ts +1 -1
  227. package/src/gjc-runtime/tmux-sessions.ts +19 -13
  228. package/src/gjc-runtime/ultragoal-guard.ts +108 -14
  229. package/src/gjc-runtime/ultragoal-receipt-freshness.ts +102 -1
  230. package/src/gjc-runtime/ultragoal-runtime.ts +227 -11
  231. package/src/gjc-runtime/windows-powershell-command.ts +58 -0
  232. package/src/harness-control-plane/operate.ts +9 -9
  233. package/src/harness-control-plane/owner.ts +283 -39
  234. package/src/harness-control-plane/receipts.ts +0 -1
  235. package/src/harness-control-plane/sdk-transport.ts +395 -0
  236. package/src/harness-control-plane/session-transport.ts +94 -0
  237. package/src/harness-control-plane/types.ts +1 -1
  238. package/src/internal-urls/docs-index.generated.ts +34 -35
  239. package/src/lsp/client.ts +42 -6
  240. package/src/lsp/index.ts +2 -2
  241. package/src/main.ts +299 -204
  242. package/src/modes/DESIGN.md +258 -0
  243. package/src/modes/acp/acp-agent.ts +1228 -2612
  244. package/src/modes/acp/acp-client-bridge.ts +2 -20
  245. package/src/modes/acp/acp-event-mapper.ts +18 -2
  246. package/src/modes/acp/acp-mode.ts +8 -36
  247. package/src/modes/acp/permission-mode.ts +25 -0
  248. package/src/modes/acp/startup-options.ts +6 -0
  249. package/src/modes/components/agent-dashboard.ts +37 -17
  250. package/src/modes/components/model-selector.ts +93 -35
  251. package/src/modes/components/notifications-settings-editor.ts +1379 -0
  252. package/src/modes/components/settings-selector.ts +60 -11
  253. package/src/modes/components/welcome.ts +4 -4
  254. package/src/modes/controllers/command-controller.ts +10 -17
  255. package/src/modes/controllers/event-controller.ts +11 -16
  256. package/src/modes/controllers/extension-ui-controller.ts +396 -28
  257. package/src/modes/controllers/selector-controller.ts +674 -36
  258. package/src/modes/index.ts +0 -22
  259. package/src/modes/interactive-mode.ts +87 -36
  260. package/src/modes/runtime-init.ts +298 -6
  261. package/src/modes/shared/agent-wire/approval-gate.ts +9 -11
  262. package/src/modes/shared/agent-wire/deep-interview-gate.ts +10 -11
  263. package/src/modes/shared/agent-wire/event-contract.ts +7 -8
  264. package/src/modes/shared/agent-wire/event-envelope.ts +9 -17
  265. package/src/modes/shared/agent-wire/event-observation.ts +16 -7
  266. package/src/modes/shared/agent-wire/workflow-gate-broker.ts +1258 -87
  267. package/src/modes/shared/agent-wire/workflow-gate-schema.ts +15 -15
  268. package/src/modes/shared/agent-wire/workflow-gate-types.ts +113 -0
  269. package/src/modes/types.ts +7 -2
  270. package/src/runtime-mcp/client.ts +94 -19
  271. package/src/runtime-mcp/config.ts +27 -15
  272. package/src/runtime-mcp/manager.ts +343 -105
  273. package/src/runtime-mcp/oauth-flow.ts +42 -12
  274. package/src/runtime-mcp/transports/http.ts +49 -19
  275. package/src/runtime-mcp/transports/stdio.ts +47 -28
  276. package/src/runtime-mcp/types.ts +10 -0
  277. package/src/sdk/acp/adapter.ts +418 -0
  278. package/src/sdk/acp/index.ts +2 -0
  279. package/src/sdk/broker/broker.ts +642 -0
  280. package/src/sdk/broker/discovery.ts +113 -0
  281. package/src/sdk/broker/ensure.ts +307 -0
  282. package/src/sdk/broker/identity.ts +42 -0
  283. package/src/sdk/broker/index.ts +8 -0
  284. package/src/sdk/broker/internal-source-marker-2178.txt +1 -0
  285. package/src/sdk/broker/internal-source.bunfig.toml +1 -0
  286. package/src/sdk/broker/lifecycle-ledger.ts +286 -0
  287. package/src/sdk/broker/lifecycle.ts +2157 -0
  288. package/src/sdk/broker/process-incarnation.ts +159 -0
  289. package/src/sdk/broker/runtime.ts +164 -0
  290. package/src/sdk/broker/session-index.ts +318 -0
  291. package/src/sdk/broker/state-version.ts +23 -0
  292. package/src/sdk/broker/transport.ts +125 -0
  293. package/src/sdk/bus/chat-command-policy.ts +107 -0
  294. package/src/sdk/bus/chat-daemon-cli.ts +214 -0
  295. package/src/sdk/bus/chat-daemon-control.ts +713 -0
  296. package/src/sdk/bus/chat-daemon-runtime.ts +526 -0
  297. package/src/sdk/bus/chat-effect-journal.ts +355 -0
  298. package/src/{notifications → sdk/bus}/config-commands.ts +39 -10
  299. package/src/sdk/bus/config.ts +433 -0
  300. package/src/sdk/bus/conversation-store.ts +391 -0
  301. package/src/sdk/bus/discord-conversation.ts +85 -0
  302. package/src/sdk/bus/discord-daemon.ts +2292 -0
  303. package/src/sdk/bus/discord-live-provider.ts +521 -0
  304. package/src/sdk/bus/discord-provider.ts +56 -0
  305. package/src/{notifications → sdk/bus}/html-format.ts +2 -2
  306. package/src/sdk/bus/index.ts +3979 -0
  307. package/src/{notifications → sdk/bus}/lifecycle-commands.ts +2 -0
  308. package/src/{notifications → sdk/bus}/lifecycle-control-runtime.ts +225 -196
  309. package/src/{notifications → sdk/bus}/lifecycle-orchestrator.ts +161 -74
  310. package/src/{notifications → sdk/bus}/managed-daemon.ts +2 -2
  311. package/src/sdk/bus/native-runtime-compatibility.ts +42 -0
  312. package/src/sdk/bus/natives-augment.d.ts +38 -0
  313. package/src/sdk/bus/notification-orchestration.ts +535 -0
  314. package/src/{notifications → sdk/bus}/notification-service.ts +106 -12
  315. package/src/sdk/bus/session-control.ts +333 -0
  316. package/src/sdk/bus/slack-conversation.ts +74 -0
  317. package/src/sdk/bus/slack-daemon.ts +2144 -0
  318. package/src/sdk/bus/slack-live-provider.ts +380 -0
  319. package/src/sdk/bus/slack-provider.ts +76 -0
  320. package/src/{notifications → sdk/bus}/telegram-cli.ts +8 -8
  321. package/src/sdk/bus/telegram-daemon-cli.ts +330 -0
  322. package/src/sdk/bus/telegram-daemon-contract.ts +14 -0
  323. package/src/{notifications → sdk/bus}/telegram-daemon-control.ts +4 -4
  324. package/src/{notifications → sdk/bus}/telegram-daemon.ts +603 -63
  325. package/src/{notifications → sdk/bus}/telegram-reference.ts +2 -2
  326. package/src/sdk/bus/telegram-setup.ts +663 -0
  327. package/src/{notifications → sdk/bus}/topic-registry.ts +32 -0
  328. package/src/sdk/cli/index.ts +1 -0
  329. package/src/sdk/cli/session-cli.ts +275 -0
  330. package/src/sdk/client/client.ts +1 -0
  331. package/src/sdk/client/discovery.ts +108 -0
  332. package/src/sdk/client/index.ts +2 -0
  333. package/src/sdk/host/control/dispatch.ts +367 -0
  334. package/src/sdk/host/control/index.ts +10 -0
  335. package/src/sdk/host/control/operations.ts +63 -0
  336. package/src/sdk/host/events.ts +91 -0
  337. package/src/sdk/host/host.ts +296 -0
  338. package/src/sdk/host/index.ts +4 -0
  339. package/src/sdk/host/query/cursor.ts +189 -0
  340. package/src/sdk/host/query/handlers.ts +533 -0
  341. package/src/sdk/host/query/index.ts +3 -0
  342. package/src/sdk/host/query/revision-store.ts +1126 -0
  343. package/src/sdk/host/reverse-leases.ts +325 -0
  344. package/src/sdk/host/types.ts +29 -0
  345. package/src/sdk/index.ts +13 -0
  346. package/src/sdk/lifecycle-session.ts +39 -0
  347. package/src/sdk/mcp/index.ts +1 -0
  348. package/src/sdk/mcp/server.ts +332 -0
  349. package/src/sdk/models.ts +168 -0
  350. package/src/sdk/protocol/adapter-validation.ts +48 -0
  351. package/src/sdk/protocol/operation-inventory.generated.json +5654 -0
  352. package/src/sdk/protocol/operation-registry.ts +312 -0
  353. package/src/{sdk.ts → sdk/session.ts} +339 -212
  354. package/src/sdk/startup-capability.ts +189 -0
  355. package/src/session/agent-session.ts +2650 -944
  356. package/src/session/default-model-selection.ts +93 -0
  357. package/src/session/fallback-chain-controller.ts +136 -0
  358. package/src/session/session-manager.ts +438 -11
  359. package/src/session/session-storage.ts +8 -1
  360. package/src/setup/credential-auto-import.ts +290 -35
  361. package/src/setup/hermes/templates/operator-instructions.v1.md +3 -5
  362. package/src/slash-commands/builtin-registry.ts +2 -1
  363. package/src/task/executor.ts +62 -13
  364. package/src/task/index.ts +26 -16
  365. package/src/tools/ask-answer-registry.ts +1 -1
  366. package/src/tools/ask.ts +13 -8
  367. package/src/tools/browser/STEALTH-THIRD-PARTY-NOTICES.md +26 -0
  368. package/src/tools/browser/benchmark/detector-report.ts +157 -0
  369. package/src/tools/browser/benchmark/run-suite.ts +39 -0
  370. package/src/tools/browser/launch.ts +124 -19
  371. package/src/tools/browser/profile-discovery.ts +63 -0
  372. package/src/tools/browser/profile-posture.ts +59 -0
  373. package/src/tools/browser/profile-reuse.ts +102 -0
  374. package/src/tools/browser/profile-warmup.ts +109 -0
  375. package/src/tools/browser/registry.ts +87 -11
  376. package/src/tools/browser/tab-protocol.ts +1 -0
  377. package/src/tools/browser/tab-supervisor.ts +1 -0
  378. package/src/tools/browser/tab-worker.ts +1 -1
  379. package/src/tools/browser.ts +6 -0
  380. package/src/tools/index.ts +8 -8
  381. package/src/tools/puppeteer/14_stealth_permissions.txt +57 -0
  382. package/src/tools/puppeteer/15_stealth_webrtc.txt +60 -0
  383. package/src/tools/subagent-render.ts +19 -8
  384. package/src/tools/subagent.ts +84 -32
  385. package/src/tools/telegram-send.ts +2 -2
  386. package/vendor/insane-search/MANIFEST.json +2 -1
  387. package/vendor/insane-search/engine/bias_check.py +4 -1
  388. package/vendor/insane-search/engine/phase0.py +26 -1
  389. package/dist/types/harness-control-plane/rpc-adapter.d.ts +0 -69
  390. package/dist/types/modes/bridge/auth.d.ts +0 -12
  391. package/dist/types/modes/bridge/bridge-client-bridge.d.ts +0 -9
  392. package/dist/types/modes/bridge/bridge-mode.d.ts +0 -47
  393. package/dist/types/modes/bridge/bridge-ui-context.d.ts +0 -88
  394. package/dist/types/modes/bridge/event-stream.d.ts +0 -8
  395. package/dist/types/modes/rpc/host-tools.d.ts +0 -1
  396. package/dist/types/modes/rpc/host-uris.d.ts +0 -1
  397. package/dist/types/modes/rpc/rpc-client.d.ts +0 -299
  398. package/dist/types/modes/rpc/rpc-mode.d.ts +0 -86
  399. package/dist/types/modes/rpc/rpc-socket-security.d.ts +0 -10
  400. package/dist/types/modes/rpc/rpc-types.d.ts +0 -810
  401. package/dist/types/modes/shared/agent-wire/command-contract.d.ts +0 -18
  402. package/dist/types/modes/shared/agent-wire/command-dispatch.d.ts +0 -37
  403. package/dist/types/modes/shared/agent-wire/command-validation.d.ts +0 -2
  404. package/dist/types/modes/shared/agent-wire/handshake.d.ts +0 -56
  405. package/dist/types/modes/shared/agent-wire/host-tool-bridge.d.ts +0 -16
  406. package/dist/types/modes/shared/agent-wire/host-uri-bridge.d.ts +0 -17
  407. package/dist/types/modes/shared/agent-wire/protocol.d.ts +0 -25
  408. package/dist/types/modes/shared/agent-wire/responses.d.ts +0 -4
  409. package/dist/types/modes/shared/agent-wire/scopes.d.ts +0 -18
  410. package/dist/types/modes/shared/agent-wire/session-registry.d.ts +0 -25
  411. package/dist/types/modes/shared/agent-wire/ui-request-broker.d.ts +0 -42
  412. package/dist/types/modes/shared/agent-wire/ui-result.d.ts +0 -27
  413. package/dist/types/modes/shared/agent-wire/unattended-action-policy.d.ts +0 -29
  414. package/dist/types/modes/shared/agent-wire/unattended-audit.d.ts +0 -68
  415. package/dist/types/modes/shared/agent-wire/unattended-run-controller.d.ts +0 -166
  416. package/dist/types/modes/shared/agent-wire/unattended-session.d.ts +0 -127
  417. package/dist/types/notifications/config.d.ts +0 -132
  418. package/src/harness-control-plane/rpc-adapter.ts +0 -290
  419. package/src/modes/bridge/auth.ts +0 -41
  420. package/src/modes/bridge/bridge-client-bridge.ts +0 -47
  421. package/src/modes/bridge/bridge-mode.ts +0 -675
  422. package/src/modes/bridge/bridge-ui-context.ts +0 -200
  423. package/src/modes/bridge/event-stream.ts +0 -70
  424. package/src/modes/rpc/host-tools.ts +0 -1
  425. package/src/modes/rpc/host-uris.ts +0 -1
  426. package/src/modes/rpc/rpc-client.ts +0 -1166
  427. package/src/modes/rpc/rpc-mode.ts +0 -1029
  428. package/src/modes/rpc/rpc-socket-security.ts +0 -115
  429. package/src/modes/rpc/rpc-types.ts +0 -637
  430. package/src/modes/shared/agent-wire/command-contract.ts +0 -18
  431. package/src/modes/shared/agent-wire/command-dispatch.ts +0 -498
  432. package/src/modes/shared/agent-wire/command-validation.ts +0 -181
  433. package/src/modes/shared/agent-wire/handshake.ts +0 -157
  434. package/src/modes/shared/agent-wire/host-tool-bridge.ts +0 -197
  435. package/src/modes/shared/agent-wire/host-uri-bridge.ts +0 -236
  436. package/src/modes/shared/agent-wire/protocol.ts +0 -46
  437. package/src/modes/shared/agent-wire/responses.ts +0 -17
  438. package/src/modes/shared/agent-wire/scopes.ts +0 -94
  439. package/src/modes/shared/agent-wire/session-registry.ts +0 -109
  440. package/src/modes/shared/agent-wire/ui-request-broker.ts +0 -150
  441. package/src/modes/shared/agent-wire/ui-result.ts +0 -48
  442. package/src/modes/shared/agent-wire/unattended-action-policy.ts +0 -365
  443. package/src/modes/shared/agent-wire/unattended-audit.ts +0 -176
  444. package/src/modes/shared/agent-wire/unattended-run-controller.ts +0 -426
  445. package/src/modes/shared/agent-wire/unattended-session.ts +0 -528
  446. package/src/notifications/config.ts +0 -219
  447. package/src/notifications/index.ts +0 -1835
  448. package/src/notifications/telegram-daemon-cli.ts +0 -243
  449. package/src/tools/puppeteer/09_stealth_locale.txt +0 -46
  450. /package/dist/types/{notifications → sdk/bus}/attachment-registry.d.ts +0 -0
  451. /package/dist/types/{notifications → sdk/bus}/chat-adapters.d.ts +0 -0
  452. /package/dist/types/{notifications → sdk/bus}/daemon-paths.d.ts +0 -0
  453. /package/dist/types/{notifications → sdk/bus}/engine.d.ts +0 -0
  454. /package/dist/types/{notifications → sdk/bus}/helpers.d.ts +0 -0
  455. /package/dist/types/{notifications → sdk/bus}/lifecycle-commands.d.ts +0 -0
  456. /package/dist/types/{notifications → sdk/bus}/operator-runtime.d.ts +0 -0
  457. /package/dist/types/{notifications → sdk/bus}/rate-limit-pool.d.ts +0 -0
  458. /package/dist/types/{notifications → sdk/bus}/recent-activity.d.ts +0 -0
  459. /package/dist/types/{notifications → sdk/bus}/reply-sent-store.d.ts +0 -0
  460. /package/dist/types/{notifications → sdk/bus}/rich-draft.d.ts +0 -0
  461. /package/dist/types/{notifications → sdk/bus}/rich-render.d.ts +0 -0
  462. /package/dist/types/{notifications → sdk/bus}/threaded-inbound.d.ts +0 -0
  463. /package/dist/types/{notifications → sdk/bus}/threaded-render.d.ts +0 -0
  464. /package/src/{notifications → sdk/bus}/attachment-registry.ts +0 -0
  465. /package/src/{notifications → sdk/bus}/chat-adapters.ts +0 -0
  466. /package/src/{notifications → sdk/bus}/daemon-paths.ts +0 -0
  467. /package/src/{notifications → sdk/bus}/engine.ts +0 -0
  468. /package/src/{notifications → sdk/bus}/helpers.ts +0 -0
  469. /package/src/{notifications → sdk/bus}/operator-runtime.ts +0 -0
  470. /package/src/{notifications → sdk/bus}/rate-limit-pool.ts +0 -0
  471. /package/src/{notifications → sdk/bus}/recent-activity.ts +0 -0
  472. /package/src/{notifications → sdk/bus}/reply-sent-store.ts +0 -0
  473. /package/src/{notifications → sdk/bus}/rich-draft.ts +0 -0
  474. /package/src/{notifications → sdk/bus}/rich-render.ts +0 -0
  475. /package/src/{notifications → sdk/bus}/threaded-inbound.ts +0 -0
  476. /package/src/{notifications → sdk/bus}/threaded-render.ts +0 -0
@@ -8,10 +8,28 @@
8
8
  import type { OAuthCallbackFlowOptions } from "@gajae-code/ai/utils/oauth/callback-server";
9
9
  import { OAuthCallbackFlow } from "@gajae-code/ai/utils/oauth/callback-server";
10
10
  import type { OAuthController, OAuthCredentials } from "@gajae-code/ai/utils/oauth/types";
11
+ import { MCPExpectedFailure } from "./types";
11
12
 
12
13
  const DEFAULT_PORT = 3000;
13
14
  const CALLBACK_PATH = "/callback";
14
15
  const CALLBACK_BIND_HOSTNAME = "127.0.0.1";
16
+ type RefreshTokenResponse = {
17
+ access_token: string;
18
+ refresh_token?: string;
19
+ expires_in?: number;
20
+ };
21
+
22
+ function isRefreshTokenResponse(value: unknown): value is RefreshTokenResponse {
23
+ if (typeof value !== "object" || value === null || Array.isArray(value)) return false;
24
+ const payload = value as Record<string, unknown>;
25
+ return (
26
+ typeof payload.access_token === "string" &&
27
+ payload.access_token.length > 0 &&
28
+ (payload.refresh_token === undefined || typeof payload.refresh_token === "string") &&
29
+ (payload.expires_in === undefined ||
30
+ (typeof payload.expires_in === "number" && Number.isFinite(payload.expires_in) && payload.expires_in >= 0))
31
+ );
32
+ }
15
33
 
16
34
  function isLoopbackHostname(hostname: string): boolean {
17
35
  return hostname === "localhost" || hostname === "127.0.0.1";
@@ -384,22 +402,34 @@ export async function refreshMCPOAuthToken(
384
402
  if (clientId) params.set("client_id", clientId);
385
403
  if (clientSecret) params.set("client_secret", clientSecret);
386
404
 
387
- const response = await fetch(tokenUrl, {
388
- method: "POST",
389
- headers: { "Content-Type": "application/x-www-form-urlencoded" },
390
- body: params.toString(),
391
- });
405
+ let response: Response;
406
+ try {
407
+ response = await fetch(tokenUrl, {
408
+ method: "POST",
409
+ headers: { "Content-Type": "application/x-www-form-urlencoded" },
410
+ body: params.toString(),
411
+ });
412
+ } catch (error) {
413
+ throw new MCPExpectedFailure(error);
414
+ }
392
415
 
393
416
  if (!response.ok) {
394
- const text = await response.text();
395
- throw new Error(`MCP OAuth refresh failed: ${response.status} ${text}`);
417
+ let text: string;
418
+ try {
419
+ text = await response.text();
420
+ } catch (error) {
421
+ throw new MCPExpectedFailure(error);
422
+ }
423
+ throw new MCPExpectedFailure(new Error(`MCP OAuth refresh failed: ${response.status} ${text}`));
396
424
  }
397
425
 
398
- const data = (await response.json()) as {
399
- access_token: string;
400
- refresh_token?: string;
401
- expires_in?: number;
402
- };
426
+ let data: unknown;
427
+ try {
428
+ data = await response.json();
429
+ } catch {
430
+ throw new MCPExpectedFailure();
431
+ }
432
+ if (!isRefreshTokenResponse(data)) throw new MCPExpectedFailure();
403
433
  const expiresIn = data.expires_in ?? 3600;
404
434
  return {
405
435
  access: data.access_token,
@@ -15,7 +15,7 @@ import type {
15
15
  MCPSseServerConfig,
16
16
  MCPTransport,
17
17
  } from "../../runtime-mcp/types";
18
- import { toJsonRpcError } from "../../runtime-mcp/types";
18
+ import { MCPExpectedFailure, toJsonRpcError } from "../../runtime-mcp/types";
19
19
 
20
20
  /**
21
21
  * HTTP transport for MCP servers.
@@ -123,7 +123,7 @@ export class HttpTransport implements MCPTransport {
123
123
  }
124
124
  } catch (error) {
125
125
  if (error instanceof Error && error.name !== "AbortError") {
126
- logger.debug("HTTP SSE stream error", { url: this.config.url, error: error.message });
126
+ logger.debug("HTTP SSE stream error");
127
127
  this.onError?.(error);
128
128
  }
129
129
  }
@@ -160,10 +160,14 @@ export class HttpTransport implements MCPTransport {
160
160
  if (newHeaders) {
161
161
  // Persist refreshed headers so subsequent requests use them directly
162
162
  this.config = { ...this.config, headers: newHeaders };
163
- return this.#executeRequest<T>(method, params, options);
163
+ try {
164
+ return await this.#executeRequest<T>(method, params, options);
165
+ } catch (retryError) {
166
+ throw retryError instanceof MCPExpectedFailure ? retryError : new MCPExpectedFailure(retryError);
167
+ }
164
168
  }
165
169
  }
166
- throw error;
170
+ throw error instanceof MCPExpectedFailure ? error : new MCPExpectedFailure(error);
167
171
  }
168
172
  }
169
173
 
@@ -173,7 +177,7 @@ export class HttpTransport implements MCPTransport {
173
177
  options: MCPRequestOptions | undefined,
174
178
  ): Promise<T> {
175
179
  if (!this.#connected) {
176
- throw new Error("Transport not connected");
180
+ throw new MCPExpectedFailure();
177
181
  }
178
182
 
179
183
  const id = Snowflake.next();
@@ -238,10 +242,27 @@ export class HttpTransport implements MCPTransport {
238
242
  }
239
243
 
240
244
  // Handle JSON response
241
- const result = (await response.json()) as JsonRpcResponse;
245
+ if (!response.body) {
246
+ throw new MCPExpectedFailure();
247
+ }
248
+ const parsedResult = await response.json();
249
+
250
+ if (
251
+ typeof parsedResult !== "object" ||
252
+ parsedResult === null ||
253
+ !("id" in parsedResult) ||
254
+ parsedResult.id !== id ||
255
+ (!("result" in parsedResult) && !("error" in parsedResult))
256
+ ) {
257
+ throw new MCPExpectedFailure();
258
+ }
242
259
 
243
- if (result.error) {
244
- throw new Error(`MCP error ${result.error.code}: ${result.error.message}`);
260
+ const result = parsedResult as JsonRpcResponse;
261
+ if ("error" in result) {
262
+ if (!result.error) {
263
+ throw new MCPExpectedFailure();
264
+ }
265
+ throw new MCPExpectedFailure(new Error(`MCP error ${result.error.code}: ${result.error.message}`));
245
266
  }
246
267
 
247
268
  return result.result as T;
@@ -260,7 +281,7 @@ export class HttpTransport implements MCPTransport {
260
281
 
261
282
  #parseSSEResponse<T>(response: Response, expectedId: string | number, options?: MCPRequestOptions): Promise<T> {
262
283
  if (!response.body) {
263
- throw new Error("No response body");
284
+ throw new MCPExpectedFailure();
264
285
  }
265
286
 
266
287
  const timeout = this.config.timeout ?? 30000;
@@ -294,10 +315,19 @@ export class HttpTransport implements MCPTransport {
294
315
  ) {
295
316
  captured = true;
296
317
  drainController.abort();
297
- if (message.error) {
298
- reject(new Error(`MCP error ${message.error.code}: ${message.error.message}`));
318
+ const response = message as JsonRpcResponse;
319
+ if ("error" in response) {
320
+ if (!response.error) {
321
+ reject(new MCPExpectedFailure());
322
+ } else {
323
+ reject(
324
+ new MCPExpectedFailure(
325
+ new Error(`MCP error ${response.error.code}: ${response.error.message}`),
326
+ ),
327
+ );
328
+ }
299
329
  } else {
300
- resolve(message.result as T);
330
+ resolve(response.result as T);
301
331
  }
302
332
  return;
303
333
  }
@@ -306,18 +336,18 @@ export class HttpTransport implements MCPTransport {
306
336
  }
307
337
  }
308
338
  if (!captured) {
309
- reject(new Error(`No response received for request ID ${expectedId}`));
339
+ reject(new MCPExpectedFailure());
310
340
  }
311
341
  } catch (error) {
312
342
  if (captured) return;
313
343
  if (error instanceof Error && error.name === "AbortError") {
314
344
  if (options?.signal?.aborted) {
315
- reject(error);
345
+ reject(new MCPExpectedFailure(error));
316
346
  } else {
317
- reject(new Error(`SSE response timeout after ${timeout}ms`));
347
+ reject(new MCPExpectedFailure(new Error(`SSE response timeout after ${timeout}ms`)));
318
348
  }
319
349
  } else {
320
- reject(error as Error);
350
+ reject(error instanceof MCPExpectedFailure ? error : new MCPExpectedFailure(error));
321
351
  }
322
352
  } finally {
323
353
  clearTimeout(timeoutId);
@@ -390,7 +420,7 @@ export class HttpTransport implements MCPTransport {
390
420
 
391
421
  async notify(method: string, params?: Record<string, unknown>): Promise<void> {
392
422
  if (!this.#connected) {
393
- throw new Error("Transport not connected");
423
+ throw new MCPExpectedFailure();
394
424
  }
395
425
 
396
426
  const body = {
@@ -447,9 +477,9 @@ export class HttpTransport implements MCPTransport {
447
477
  } catch (error) {
448
478
  clearTimeout(timeoutId);
449
479
  if (error instanceof Error && error.name === "AbortError") {
450
- throw new Error(`Notify timeout after ${timeout}ms`);
480
+ throw new MCPExpectedFailure(new Error(`Notify timeout after ${timeout}ms`));
451
481
  }
452
- throw error;
482
+ throw error instanceof MCPExpectedFailure ? error : new MCPExpectedFailure(error);
453
483
  }
454
484
  }
455
485
 
@@ -16,7 +16,7 @@ import type {
16
16
  MCPStdioServerConfig,
17
17
  MCPTransport,
18
18
  } from "../../runtime-mcp/types";
19
- import { toJsonRpcError } from "../../runtime-mcp/types";
19
+ import { MCPExpectedFailure, toJsonRpcError } from "../../runtime-mcp/types";
20
20
 
21
21
  /**
22
22
  * Stdio transport for MCP servers.
@@ -90,7 +90,7 @@ export class StdioTransport implements MCPTransport {
90
90
  */
91
91
  async connect(): Promise<void> {
92
92
  if (this.#closePromise) {
93
- throw new Error("Transport is closing");
93
+ throw new MCPExpectedFailure();
94
94
  }
95
95
  if (this.#connected) return;
96
96
 
@@ -101,14 +101,19 @@ export class StdioTransport implements MCPTransport {
101
101
  ...Bun.env,
102
102
  ...this.config.env,
103
103
  };
104
+ const cwd = this.config.cwd ?? getProjectDir();
104
105
 
105
- this.#process = spawnOwnedProcess([this.config.command, ...args], {
106
- cwd: this.config.cwd ?? getProjectDir(),
107
- env,
108
- stdin: "pipe",
109
- gracefulMs: CLOSE_WAIT_MS,
110
- name: `mcp-stdio:${this.config.command}`,
111
- });
106
+ try {
107
+ this.#process = spawnOwnedProcess([this.config.command, ...args], {
108
+ cwd,
109
+ env,
110
+ stdin: "pipe",
111
+ gracefulMs: CLOSE_WAIT_MS,
112
+ name: `mcp-stdio:${this.config.command}`,
113
+ });
114
+ } catch (error) {
115
+ throw new MCPExpectedFailure(error);
116
+ }
112
117
 
113
118
  this.#connected = true;
114
119
 
@@ -121,6 +126,7 @@ export class StdioTransport implements MCPTransport {
121
126
 
122
127
  async #startReadLoop(): Promise<void> {
123
128
  if (!this.#process?.child.stdout) return;
129
+ let failure: MCPExpectedFailure | undefined;
124
130
  try {
125
131
  for await (const line of readJsonl(this.#process.child.stdout)) {
126
132
  if (!this.#connected) break;
@@ -131,11 +137,12 @@ export class StdioTransport implements MCPTransport {
131
137
  }
132
138
  }
133
139
  } catch (error) {
140
+ failure = new MCPExpectedFailure(error);
134
141
  if (this.#connected) {
135
- this.onError?.(error instanceof Error ? error : new Error(String(error)));
142
+ this.onError?.(failure);
136
143
  }
137
144
  } finally {
138
- this.#handleClose();
145
+ this.#handleClose(failure);
139
146
  }
140
147
  }
141
148
 
@@ -180,8 +187,16 @@ export class StdioTransport implements MCPTransport {
180
187
  const pending = this.#pendingRequests.get(response.id);
181
188
  if (pending) {
182
189
  this.#pendingRequests.delete(response.id);
183
- if (response.error) {
184
- pending.reject(new Error(`MCP error ${response.error.code}: ${response.error.message}`));
190
+ if (!("result" in response) && !("error" in response)) {
191
+ pending.reject(new MCPExpectedFailure());
192
+ } else if ("error" in response) {
193
+ if (!response.error) {
194
+ pending.reject(new MCPExpectedFailure());
195
+ } else {
196
+ pending.reject(
197
+ new MCPExpectedFailure(new Error(`MCP error ${response.error.code}: ${response.error.message}`)),
198
+ );
199
+ }
185
200
  } else {
186
201
  pending.resolve(response.result);
187
202
  }
@@ -228,8 +243,8 @@ export class StdioTransport implements MCPTransport {
228
243
  stdin.flush();
229
244
  }
230
245
 
231
- #handleClose(): void {
232
- void this.#closeInternal(true);
246
+ #handleClose(failure?: MCPExpectedFailure): void {
247
+ void this.#closeInternal(true, failure);
233
248
  }
234
249
 
235
250
  async request<T = unknown>(
@@ -239,7 +254,7 @@ export class StdioTransport implements MCPTransport {
239
254
  ): Promise<T> {
240
255
  const stdin = this.#getStdin();
241
256
  if (!this.#connected || !stdin) {
242
- throw new Error("Transport not connected");
257
+ throw new MCPExpectedFailure();
243
258
  }
244
259
 
245
260
  const id = Snowflake.next();
@@ -255,7 +270,7 @@ export class StdioTransport implements MCPTransport {
255
270
 
256
271
  if (signal?.aborted) {
257
272
  const reason = signal.reason instanceof Error ? signal.reason : new Error("Aborted");
258
- return Promise.reject(reason);
273
+ return Promise.reject(new MCPExpectedFailure(reason));
259
274
  }
260
275
 
261
276
  const { promise, resolve, reject } = Promise.withResolvers<T>();
@@ -278,7 +293,7 @@ export class StdioTransport implements MCPTransport {
278
293
  const onAbort = () => {
279
294
  cleanup();
280
295
  const reason = signal?.reason instanceof Error ? signal.reason : new Error("Aborted");
281
- reject(reason);
296
+ reject(new MCPExpectedFailure(reason));
282
297
  };
283
298
 
284
299
  if (signal) {
@@ -298,7 +313,7 @@ export class StdioTransport implements MCPTransport {
298
313
 
299
314
  timer = setTimeout(() => {
300
315
  cleanup();
301
- reject(new Error(`Request timeout after ${timeout}ms`));
316
+ reject(new MCPExpectedFailure(new Error(`Request timeout after ${timeout}ms`)));
302
317
  }, timeout);
303
318
 
304
319
  const message = `${JSON.stringify(request)}\n`;
@@ -308,7 +323,7 @@ export class StdioTransport implements MCPTransport {
308
323
  stdin.flush();
309
324
  } catch (error: unknown) {
310
325
  cleanup();
311
- reject(error instanceof Error ? error : new Error(String(error)));
326
+ reject(new MCPExpectedFailure(error));
312
327
  }
313
328
 
314
329
  return promise;
@@ -317,7 +332,7 @@ export class StdioTransport implements MCPTransport {
317
332
  async notify(method: string, params?: Record<string, unknown>): Promise<void> {
318
333
  const stdin = this.#getStdin();
319
334
  if (!this.#connected || !stdin) {
320
- throw new Error("Transport not connected");
335
+ throw new MCPExpectedFailure();
321
336
  }
322
337
 
323
338
  const notification = {
@@ -327,29 +342,33 @@ export class StdioTransport implements MCPTransport {
327
342
  };
328
343
 
329
344
  const message = `${JSON.stringify(notification)}\n`;
330
- // Bun's FileSink has write() method directly
331
- stdin.write(message);
332
- stdin.flush();
345
+ try {
346
+ // Bun's FileSink has write() method directly
347
+ stdin.write(message);
348
+ stdin.flush();
349
+ } catch (error) {
350
+ throw new MCPExpectedFailure(error);
351
+ }
333
352
  }
334
353
 
335
354
  async close(): Promise<void> {
336
355
  await this.#closeInternal(false);
337
356
  }
338
357
 
339
- #closeInternal(fromReadLoop: boolean): Promise<void> {
358
+ #closeInternal(fromReadLoop: boolean, failure?: MCPExpectedFailure): Promise<void> {
340
359
  if (this.#closePromise) return this.#closePromise;
341
- this.#closePromise = this.#finishClose(fromReadLoop).finally(() => {
360
+ this.#closePromise = this.#finishClose(fromReadLoop, failure).finally(() => {
342
361
  this.#closePromise = null;
343
362
  });
344
363
  return this.#closePromise;
345
364
  }
346
365
 
347
- async #finishClose(fromReadLoop: boolean): Promise<void> {
366
+ async #finishClose(fromReadLoop: boolean, failure?: MCPExpectedFailure): Promise<void> {
348
367
  const wasConnected = this.#connected;
349
368
  this.#connected = false;
350
369
 
351
370
  for (const [, pending] of this.#pendingRequests) {
352
- pending.reject(new Error("Transport closed"));
371
+ pending.reject(failure ?? new MCPExpectedFailure());
353
372
  }
354
373
  this.#pendingRequests.clear();
355
374
 
@@ -223,6 +223,16 @@ export interface MCPToolCallResult {
223
223
  // Transport Types
224
224
  // =============================================================================
225
225
 
226
+ /** Expected configured-server transport or protocol failure. */
227
+ export class MCPExpectedFailure extends Error {
228
+ constructor(cause?: unknown) {
229
+ super(
230
+ cause instanceof Error ? cause.message : "MCP server operation failed",
231
+ cause === undefined ? undefined : { cause },
232
+ );
233
+ this.name = "MCPExpectedFailure";
234
+ }
235
+ }
226
236
  export interface MCPRequestOptions {
227
237
  /** Abort signal (e.g. Escape-to-interrupt) */
228
238
  signal?: AbortSignal;