@cydm/happy-elves 0.1.0-beta.31 → 0.1.0-beta.310

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 (342) hide show
  1. package/apps/cli/dist/commands/app.js +10 -0
  2. package/apps/cli/dist/commands/daemon.js +92 -4
  3. package/apps/cli/dist/commands/gateway.d.ts +2 -0
  4. package/apps/cli/dist/commands/gateway.js +429 -0
  5. package/apps/cli/dist/commands/lib/args.js +49 -0
  6. package/apps/cli/dist/commands/lib/bootstrap-daemon.d.ts +2 -2
  7. package/apps/cli/dist/commands/lib/bootstrap-daemon.js +2 -2
  8. package/apps/cli/dist/commands/lib/doctor.d.ts +11 -0
  9. package/apps/cli/dist/commands/lib/doctor.js +276 -11
  10. package/apps/cli/dist/commands/lib/gateway-store.d.ts +38 -0
  11. package/apps/cli/dist/commands/lib/gateway-store.js +33 -0
  12. package/apps/cli/dist/commands/lib/index.d.ts +4 -2
  13. package/apps/cli/dist/commands/lib/index.js +2 -0
  14. package/apps/cli/dist/commands/lib/json.d.ts +2 -2
  15. package/apps/cli/dist/commands/lib/json.js +5 -2
  16. package/apps/cli/dist/commands/lib/local-daemon.d.ts +1 -0
  17. package/apps/cli/dist/commands/lib/local-daemon.js +14 -0
  18. package/apps/cli/dist/commands/lib/paths.d.ts +2 -0
  19. package/apps/cli/dist/commands/lib/paths.js +2 -0
  20. package/apps/cli/dist/commands/lib/relay-db-audit.d.ts +37 -0
  21. package/apps/cli/dist/commands/lib/relay-db-audit.js +300 -0
  22. package/apps/cli/dist/commands/lib/relay-http.d.ts +1 -1
  23. package/apps/cli/dist/commands/lib/scope.d.ts +1 -1
  24. package/apps/cli/dist/commands/lib/session-output.d.ts +15 -1
  25. package/apps/cli/dist/commands/lib/session-output.js +214 -6
  26. package/apps/cli/dist/commands/lib/session-view.d.ts +2 -2
  27. package/apps/cli/dist/commands/lib/status.js +5 -1
  28. package/apps/cli/dist/commands/lib/types.d.ts +4 -2
  29. package/apps/cli/dist/commands/lib/usage.js +123 -10
  30. package/apps/cli/dist/commands/lib/workspace.d.ts +2 -2
  31. package/apps/cli/dist/commands/lib/workspace.js +63 -10
  32. package/apps/cli/dist/commands/machine.js +50 -9
  33. package/apps/cli/dist/commands/memory.d.ts +2 -0
  34. package/apps/cli/dist/commands/memory.js +179 -0
  35. package/apps/cli/dist/commands/relay.js +29 -2
  36. package/apps/cli/dist/commands/release.d.ts +2 -0
  37. package/apps/cli/dist/commands/release.js +197 -0
  38. package/apps/cli/dist/commands/remote.js +10 -2
  39. package/apps/cli/dist/commands/schedule.d.ts +2 -0
  40. package/apps/cli/dist/commands/schedule.js +273 -0
  41. package/apps/cli/dist/commands/session.js +517 -5
  42. package/apps/cli/dist/commands/turn.js +225 -9
  43. package/apps/cli/dist/commands/workspace.d.ts +2 -0
  44. package/apps/cli/dist/commands/workspace.js +68 -0
  45. package/apps/cli/package.json +6 -0
  46. package/apps/daemon/dist/gateway/adapters.d.ts +38 -0
  47. package/apps/daemon/dist/gateway/adapters.js +2 -0
  48. package/apps/daemon/dist/gateway/feishu.d.ts +65 -0
  49. package/apps/daemon/dist/gateway/feishu.js +493 -0
  50. package/apps/daemon/dist/gateway/format.d.ts +2 -0
  51. package/apps/daemon/dist/gateway/format.js +19 -0
  52. package/apps/daemon/dist/gateway/handler.d.ts +7 -0
  53. package/apps/daemon/dist/gateway/handler.js +151 -0
  54. package/apps/daemon/dist/gateway/runtime.d.ts +33 -0
  55. package/apps/daemon/dist/gateway/runtime.js +850 -0
  56. package/apps/daemon/dist/gateway/store.d.ts +92 -0
  57. package/apps/daemon/dist/gateway/store.js +268 -0
  58. package/apps/daemon/dist/memory/handler.d.ts +7 -0
  59. package/apps/daemon/dist/memory/handler.js +105 -0
  60. package/apps/daemon/dist/memory/manager.d.ts +44 -0
  61. package/apps/daemon/dist/memory/manager.js +359 -0
  62. package/apps/daemon/dist/paths.d.ts +3 -0
  63. package/apps/daemon/dist/paths.js +3 -0
  64. package/apps/daemon/dist/relay/admission.d.ts +30 -0
  65. package/apps/daemon/dist/relay/admission.js +31 -0
  66. package/apps/daemon/dist/relay/connection.js +37 -1
  67. package/apps/daemon/dist/relay/devtools.d.ts +1 -1
  68. package/apps/daemon/dist/relay/register.js +2 -0
  69. package/apps/daemon/dist/relay/send.d.ts +2 -2
  70. package/apps/daemon/dist/relay/send.js +2 -0
  71. package/apps/daemon/dist/relay-http.d.ts +1 -1
  72. package/apps/daemon/dist/runtime/external-provider.d.ts +1 -1
  73. package/apps/daemon/dist/runtime/external-provider.js +187 -17
  74. package/apps/daemon/dist/runtime.d.ts +1 -2
  75. package/apps/daemon/dist/runtime.js +0 -3
  76. package/apps/daemon/dist/schedule/handler.d.ts +9 -0
  77. package/apps/daemon/dist/schedule/handler.js +148 -0
  78. package/apps/daemon/dist/schedule/runner.d.ts +21 -0
  79. package/apps/daemon/dist/schedule/runner.js +547 -0
  80. package/apps/daemon/dist/schedule/store.d.ts +9 -0
  81. package/apps/daemon/dist/schedule/store.js +143 -0
  82. package/apps/daemon/dist/session/create-session.d.ts +1 -1
  83. package/apps/daemon/dist/session/directory.d.ts +1 -1
  84. package/apps/daemon/dist/session/events.d.ts +15 -2
  85. package/apps/daemon/dist/session/events.js +76 -24
  86. package/apps/daemon/dist/session/file-preview.d.ts +1 -1
  87. package/apps/daemon/dist/session/lifecycle.d.ts +26 -3
  88. package/apps/daemon/dist/session/lifecycle.js +161 -22
  89. package/apps/daemon/dist/session/metadata.d.ts +2 -2
  90. package/apps/daemon/dist/session/metadata.js +42 -1
  91. package/apps/daemon/dist/session/primitives.d.ts +1 -1
  92. package/apps/daemon/dist/session/primitives.js +37 -6
  93. package/apps/daemon/dist/session/prompt.d.ts +28 -1
  94. package/apps/daemon/dist/session/prompt.js +340 -5
  95. package/apps/daemon/dist/session/reconcile.d.ts +3 -0
  96. package/apps/daemon/dist/session/reconcile.js +235 -0
  97. package/apps/daemon/dist/session/runtime-handle.d.ts +1 -1
  98. package/apps/daemon/dist/start.js +5 -1
  99. package/apps/daemon/dist/state.d.ts +2 -2
  100. package/apps/daemon/dist/turn-coordinator.d.ts +1 -0
  101. package/apps/daemon/dist/turn-coordinator.js +4 -0
  102. package/apps/daemon/dist/types.d.ts +16 -1
  103. package/apps/daemon/package.json +3 -25
  104. package/apps/relay/dist/connections.d.ts +2 -0
  105. package/apps/relay/dist/controller-handlers.d.ts +42 -2
  106. package/apps/relay/dist/controller-handlers.js +349 -37
  107. package/apps/relay/dist/db.js +296 -2
  108. package/apps/relay/dist/errors.d.ts +2 -1
  109. package/apps/relay/dist/errors.js +3 -1
  110. package/apps/relay/dist/http-routes.js +659 -33
  111. package/apps/relay/dist/http-schemas.d.ts +156 -0
  112. package/apps/relay/dist/http-schemas.js +85 -0
  113. package/apps/relay/dist/index.js +31 -1
  114. package/apps/relay/dist/machine-handlers.d.ts +15 -7
  115. package/apps/relay/dist/machine-handlers.js +567 -27
  116. package/apps/relay/dist/projections.d.ts +1 -1
  117. package/apps/relay/dist/projections.js +13 -0
  118. package/apps/relay/dist/relay-context.d.ts +41 -3
  119. package/apps/relay/dist/relay-context.js +244 -19
  120. package/apps/relay/dist/repositories.d.ts +2 -2
  121. package/apps/relay/dist/repositories.js +28 -1
  122. package/apps/relay/dist/runtime-bindings.d.ts +25 -0
  123. package/apps/relay/dist/runtime-bindings.js +49 -0
  124. package/apps/relay/dist/scope.d.ts +1 -1
  125. package/apps/relay/dist/types.d.ts +71 -1
  126. package/apps/relay/dist/websocket.js +2 -0
  127. package/package.json +5 -11
  128. package/packages/agent-sdk/dist/index.d.ts +80 -0
  129. package/packages/agent-sdk/dist/index.js +16 -0
  130. package/packages/client/dist/account.d.ts +35 -2
  131. package/packages/client/dist/account.js +98 -1
  132. package/packages/client/dist/client.d.ts +59 -6
  133. package/packages/client/dist/client.js +312 -58
  134. package/packages/client/dist/index.d.ts +1 -1
  135. package/packages/client/dist/parsers.d.ts +28 -2
  136. package/packages/client/dist/parsers.js +167 -0
  137. package/packages/client/dist/transport.d.ts +21 -1
  138. package/packages/client/dist/transport.js +69 -6
  139. package/packages/client/dist/types.d.ts +177 -1
  140. package/packages/client/dist/validation.d.ts +1 -1
  141. package/packages/runtime/dist/index.d.ts +66 -0
  142. package/packages/runtime-acpx/dist/index.d.ts +1 -1
  143. package/packages/runtime-acpx/dist/index.js +8 -0
  144. package/packages/runtime-cli/dist/claude-history.d.ts +1 -2
  145. package/packages/runtime-cli/dist/claude-history.js +0 -3
  146. package/packages/runtime-cli/dist/claude-session-store.d.ts +0 -1
  147. package/packages/runtime-cli/dist/claude-session-store.js +1 -1
  148. package/packages/runtime-cli/dist/claude-turn.d.ts +2 -1
  149. package/packages/runtime-cli/dist/claude-turn.js +29 -9
  150. package/packages/runtime-cli/dist/codex-app-server.d.ts +8 -3
  151. package/packages/runtime-cli/dist/codex-app-server.js +122 -25
  152. package/packages/runtime-cli/dist/codex-history.d.ts +1 -2
  153. package/packages/runtime-cli/dist/codex-history.js +11 -5
  154. package/packages/runtime-cli/dist/codex-protocol.d.ts +2 -2
  155. package/packages/runtime-cli/dist/codex-protocol.js +4 -4
  156. package/packages/runtime-cli/dist/history-merge.d.ts +1 -1
  157. package/packages/runtime-cli/dist/index.d.ts +1 -1
  158. package/packages/runtime-cli/dist/index.js +108 -2
  159. package/packages/runtime-cli/dist/permissions.d.ts +1 -1
  160. package/packages/runtime-cli/dist/session-store.d.ts +2 -1
  161. package/packages/runtime-cli/dist/session-store.js +9 -8
  162. package/packages/shared/dist/index.d.ts +2 -0
  163. package/packages/shared/dist/index.js +2 -0
  164. package/packages/shared/dist/protocol-schemas.d.ts +1077 -0
  165. package/packages/shared/dist/protocol-schemas.js +273 -0
  166. package/packages/shared/dist/protocol-types.d.ts +371 -3
  167. package/packages/shared/dist/protocol.d.ts +181 -2
  168. package/packages/shared/dist/protocol.js +197 -1
  169. package/packages/shared/dist/session-tags.d.ts +12 -0
  170. package/packages/shared/dist/session-tags.js +50 -0
  171. package/apps/cli/dist/commands/account.js.map +0 -1
  172. package/apps/cli/dist/commands/app.js.map +0 -1
  173. package/apps/cli/dist/commands/collect.js.map +0 -1
  174. package/apps/cli/dist/commands/command.js.map +0 -1
  175. package/apps/cli/dist/commands/config.js.map +0 -1
  176. package/apps/cli/dist/commands/daemon.js.map +0 -1
  177. package/apps/cli/dist/commands/lib/args.js.map +0 -1
  178. package/apps/cli/dist/commands/lib/audit.js.map +0 -1
  179. package/apps/cli/dist/commands/lib/bootstrap-config.js.map +0 -1
  180. package/apps/cli/dist/commands/lib/bootstrap-daemon.js.map +0 -1
  181. package/apps/cli/dist/commands/lib/bootstrap-output.js.map +0 -1
  182. package/apps/cli/dist/commands/lib/bootstrap.js.map +0 -1
  183. package/apps/cli/dist/commands/lib/config.js.map +0 -1
  184. package/apps/cli/dist/commands/lib/doctor.js.map +0 -1
  185. package/apps/cli/dist/commands/lib/exit.js.map +0 -1
  186. package/apps/cli/dist/commands/lib/index.js.map +0 -1
  187. package/apps/cli/dist/commands/lib/json.js.map +0 -1
  188. package/apps/cli/dist/commands/lib/local-daemon.js.map +0 -1
  189. package/apps/cli/dist/commands/lib/loop-store.js.map +0 -1
  190. package/apps/cli/dist/commands/lib/paths.js.map +0 -1
  191. package/apps/cli/dist/commands/lib/relay-http.js.map +0 -1
  192. package/apps/cli/dist/commands/lib/scope.js.map +0 -1
  193. package/apps/cli/dist/commands/lib/session-output.js.map +0 -1
  194. package/apps/cli/dist/commands/lib/session-view.js.map +0 -1
  195. package/apps/cli/dist/commands/lib/status.js.map +0 -1
  196. package/apps/cli/dist/commands/lib/types.js.map +0 -1
  197. package/apps/cli/dist/commands/lib/usage.js.map +0 -1
  198. package/apps/cli/dist/commands/lib/workspace.js.map +0 -1
  199. package/apps/cli/dist/commands/loop.js.map +0 -1
  200. package/apps/cli/dist/commands/machine.js.map +0 -1
  201. package/apps/cli/dist/commands/relay.js.map +0 -1
  202. package/apps/cli/dist/commands/remote.js.map +0 -1
  203. package/apps/cli/dist/commands/session.js.map +0 -1
  204. package/apps/cli/dist/commands/token.js.map +0 -1
  205. package/apps/cli/dist/commands/turn.js.map +0 -1
  206. package/apps/cli/dist/errors.js.map +0 -1
  207. package/apps/cli/dist/index.js.map +0 -1
  208. package/apps/daemon/dist/app.js.map +0 -1
  209. package/apps/daemon/dist/args.js.map +0 -1
  210. package/apps/daemon/dist/audit.js.map +0 -1
  211. package/apps/daemon/dist/cli.js.map +0 -1
  212. package/apps/daemon/dist/config.js.map +0 -1
  213. package/apps/daemon/dist/errors.js.map +0 -1
  214. package/apps/daemon/dist/loop/runner.js.map +0 -1
  215. package/apps/daemon/dist/loop/store.js.map +0 -1
  216. package/apps/daemon/dist/pair.js.map +0 -1
  217. package/apps/daemon/dist/paths.js.map +0 -1
  218. package/apps/daemon/dist/process.js.map +0 -1
  219. package/apps/daemon/dist/relay/connection.js.map +0 -1
  220. package/apps/daemon/dist/relay/devtools.js.map +0 -1
  221. package/apps/daemon/dist/relay/register.js.map +0 -1
  222. package/apps/daemon/dist/relay/send.js.map +0 -1
  223. package/apps/daemon/dist/relay-http.js.map +0 -1
  224. package/apps/daemon/dist/runtime/external-provider.js.map +0 -1
  225. package/apps/daemon/dist/runtime.js.map +0 -1
  226. package/apps/daemon/dist/session/create-session.js.map +0 -1
  227. package/apps/daemon/dist/session/directory.js.map +0 -1
  228. package/apps/daemon/dist/session/events.js.map +0 -1
  229. package/apps/daemon/dist/session/file-preview.js.map +0 -1
  230. package/apps/daemon/dist/session/lifecycle.js.map +0 -1
  231. package/apps/daemon/dist/session/metadata.js.map +0 -1
  232. package/apps/daemon/dist/session/primitives.js.map +0 -1
  233. package/apps/daemon/dist/session/prompt.js.map +0 -1
  234. package/apps/daemon/dist/session/runtime-handle.js.map +0 -1
  235. package/apps/daemon/dist/start.js.map +0 -1
  236. package/apps/daemon/dist/state.js.map +0 -1
  237. package/apps/daemon/dist/turn-coordinator.js.map +0 -1
  238. package/apps/daemon/dist/types.js.map +0 -1
  239. package/apps/daemon/dist/utils.js.map +0 -1
  240. package/apps/relay/dist/auth.js.map +0 -1
  241. package/apps/relay/dist/connections.js.map +0 -1
  242. package/apps/relay/dist/controller-handlers.js.map +0 -1
  243. package/apps/relay/dist/db.js.map +0 -1
  244. package/apps/relay/dist/errors.js.map +0 -1
  245. package/apps/relay/dist/http-routes.js.map +0 -1
  246. package/apps/relay/dist/http-schemas.js.map +0 -1
  247. package/apps/relay/dist/index.js.map +0 -1
  248. package/apps/relay/dist/machine-handlers.js.map +0 -1
  249. package/apps/relay/dist/projections.js.map +0 -1
  250. package/apps/relay/dist/relay-context.js.map +0 -1
  251. package/apps/relay/dist/repositories.js.map +0 -1
  252. package/apps/relay/dist/retention.js.map +0 -1
  253. package/apps/relay/dist/scope.js.map +0 -1
  254. package/apps/relay/dist/security.js.map +0 -1
  255. package/apps/relay/dist/types.js.map +0 -1
  256. package/apps/relay/dist/websocket.js.map +0 -1
  257. package/apps/relay/package.json +0 -29
  258. package/packages/agent-sdk/dist/index.d.ts.map +0 -1
  259. package/packages/agent-sdk/dist/index.js.map +0 -1
  260. package/packages/agent-sdk/package.json +0 -20
  261. package/packages/client/dist/account.d.ts.map +0 -1
  262. package/packages/client/dist/account.js.map +0 -1
  263. package/packages/client/dist/client.d.ts.map +0 -1
  264. package/packages/client/dist/client.js.map +0 -1
  265. package/packages/client/dist/errors.d.ts.map +0 -1
  266. package/packages/client/dist/errors.js.map +0 -1
  267. package/packages/client/dist/http.d.ts.map +0 -1
  268. package/packages/client/dist/http.js.map +0 -1
  269. package/packages/client/dist/index.d.ts.map +0 -1
  270. package/packages/client/dist/index.js.map +0 -1
  271. package/packages/client/dist/parsers.d.ts.map +0 -1
  272. package/packages/client/dist/parsers.js.map +0 -1
  273. package/packages/client/dist/transport.d.ts.map +0 -1
  274. package/packages/client/dist/transport.js.map +0 -1
  275. package/packages/client/dist/types.d.ts.map +0 -1
  276. package/packages/client/dist/types.js.map +0 -1
  277. package/packages/client/dist/validation.d.ts.map +0 -1
  278. package/packages/client/dist/validation.js.map +0 -1
  279. package/packages/client/package.json +0 -22
  280. package/packages/pie-provider/dist/index.d.ts.map +0 -1
  281. package/packages/pie-provider/dist/index.js.map +0 -1
  282. package/packages/pie-provider/package.json +0 -26
  283. package/packages/runtime/dist/index.d.ts.map +0 -1
  284. package/packages/runtime/dist/index.js.map +0 -1
  285. package/packages/runtime/package.json +0 -19
  286. package/packages/runtime-acpx/dist/index.d.ts.map +0 -1
  287. package/packages/runtime-acpx/dist/index.js.map +0 -1
  288. package/packages/runtime-acpx/package.json +0 -23
  289. package/packages/runtime-cli/dist/async-queue.d.ts.map +0 -1
  290. package/packages/runtime-cli/dist/async-queue.js.map +0 -1
  291. package/packages/runtime-cli/dist/claude-history.d.ts.map +0 -1
  292. package/packages/runtime-cli/dist/claude-history.js.map +0 -1
  293. package/packages/runtime-cli/dist/claude-json.d.ts.map +0 -1
  294. package/packages/runtime-cli/dist/claude-json.js.map +0 -1
  295. package/packages/runtime-cli/dist/claude-rename.d.ts.map +0 -1
  296. package/packages/runtime-cli/dist/claude-rename.js.map +0 -1
  297. package/packages/runtime-cli/dist/claude-session-store.d.ts.map +0 -1
  298. package/packages/runtime-cli/dist/claude-session-store.js.map +0 -1
  299. package/packages/runtime-cli/dist/claude-turn.d.ts.map +0 -1
  300. package/packages/runtime-cli/dist/claude-turn.js.map +0 -1
  301. package/packages/runtime-cli/dist/codex-app-server.d.ts.map +0 -1
  302. package/packages/runtime-cli/dist/codex-app-server.js.map +0 -1
  303. package/packages/runtime-cli/dist/codex-approvals.d.ts.map +0 -1
  304. package/packages/runtime-cli/dist/codex-approvals.js.map +0 -1
  305. package/packages/runtime-cli/dist/codex-history.d.ts.map +0 -1
  306. package/packages/runtime-cli/dist/codex-history.js.map +0 -1
  307. package/packages/runtime-cli/dist/codex-json-rpc.d.ts.map +0 -1
  308. package/packages/runtime-cli/dist/codex-json-rpc.js.map +0 -1
  309. package/packages/runtime-cli/dist/codex-lifecycle.d.ts.map +0 -1
  310. package/packages/runtime-cli/dist/codex-lifecycle.js.map +0 -1
  311. package/packages/runtime-cli/dist/codex-protocol.d.ts.map +0 -1
  312. package/packages/runtime-cli/dist/codex-protocol.js.map +0 -1
  313. package/packages/runtime-cli/dist/command-resolver.d.ts.map +0 -1
  314. package/packages/runtime-cli/dist/command-resolver.js.map +0 -1
  315. package/packages/runtime-cli/dist/history-merge.d.ts.map +0 -1
  316. package/packages/runtime-cli/dist/history-merge.js.map +0 -1
  317. package/packages/runtime-cli/dist/index.d.ts.map +0 -1
  318. package/packages/runtime-cli/dist/index.js.map +0 -1
  319. package/packages/runtime-cli/dist/permissions.d.ts.map +0 -1
  320. package/packages/runtime-cli/dist/permissions.js.map +0 -1
  321. package/packages/runtime-cli/dist/session-store.d.ts.map +0 -1
  322. package/packages/runtime-cli/dist/session-store.js.map +0 -1
  323. package/packages/runtime-cli/package.json +0 -22
  324. package/packages/shared/dist/args.d.ts.map +0 -1
  325. package/packages/shared/dist/args.js.map +0 -1
  326. package/packages/shared/dist/crypto.d.ts.map +0 -1
  327. package/packages/shared/dist/crypto.js.map +0 -1
  328. package/packages/shared/dist/ids.d.ts.map +0 -1
  329. package/packages/shared/dist/ids.js.map +0 -1
  330. package/packages/shared/dist/index.d.ts.map +0 -1
  331. package/packages/shared/dist/index.js.map +0 -1
  332. package/packages/shared/dist/protocol-schemas.d.ts.map +0 -1
  333. package/packages/shared/dist/protocol-schemas.js.map +0 -1
  334. package/packages/shared/dist/protocol-types.d.ts.map +0 -1
  335. package/packages/shared/dist/protocol-types.js.map +0 -1
  336. package/packages/shared/dist/protocol.d.ts.map +0 -1
  337. package/packages/shared/dist/protocol.js.map +0 -1
  338. package/packages/shared/dist/session-name.d.ts.map +0 -1
  339. package/packages/shared/dist/session-name.js.map +0 -1
  340. package/packages/shared/dist/session-state.d.ts.map +0 -1
  341. package/packages/shared/dist/session-state.js.map +0 -1
  342. package/packages/shared/package.json +0 -24
@@ -1,11 +1,17 @@
1
1
  import { controllerSessionCommandDecision, randomId, } from "../../../packages/shared/dist/index.js";
2
+ import { findSessionRuntimeBinding, upsertSessionRuntimeBindings } from "./runtime-bindings.js";
2
3
  const legacyMachineAgents = [
3
4
  { id: "codex", label: "Codex" },
4
5
  { id: "claude", label: "Claude Code" },
5
6
  ];
6
7
  export function handleControllerMessage(context, connection, message) {
7
- const { allowControllerAction, allowControllerMachine, allowControllerSession, broadcastControllers, connectedMachine, db, insertEvent, isCommandPending, machineCapabilities, markCommandPending, now, parseJson, previousCommandResponse, send, sendAck, sendError, sendMachineOffline, sessionSnapshot, setSessionStatus, } = context;
8
+ const { allowControllerAction, allowControllerMachine, allowControllerSession, activeSessionClaim, broadcastControllers, claimSessionTurn, connectedMachine, db, deliverOutboxCommand, finishSessionClaim, insertEvent, isCommandPending, isSessionCommandPending, machineCapabilities, markCommandPending, now, parseJson, previousAdmissionAck, previousCommandResponse, send, sendAck, sendError, sendMachineOffline, sessionSnapshot, setSessionStatus, } = context;
8
9
  if ("requestId" in message && typeof message.requestId === "string") {
10
+ const admission = previousAdmissionAck(connection.accountId, message.requestId);
11
+ if (admission) {
12
+ send(connection.socket, admission);
13
+ return;
14
+ }
9
15
  const previous = previousCommandResponse(connection.accountId, message.requestId);
10
16
  if (previous) {
11
17
  send(connection.socket, previous);
@@ -19,6 +25,12 @@ export function handleControllerMessage(context, connection, message) {
19
25
  const decision = controllerSessionCommandDecision(sessionRow.status, command);
20
26
  if (decision.allowed)
21
27
  return false;
28
+ if (decision.code === "SESSION_BUSY" &&
29
+ command === "prompt" &&
30
+ !activeSessionClaim(connection.accountId, sessionRow.id) &&
31
+ !sessionLooksTranscriptPending(db, sessionRow)) {
32
+ return false;
33
+ }
22
34
  sendError(connection, {
23
35
  type: "server:error",
24
36
  requestId,
@@ -27,6 +39,38 @@ export function handleControllerMessage(context, connection, message) {
27
39
  });
28
40
  return true;
29
41
  };
42
+ const rejectPendingSessionCommand = (sessionRow, requestId, command) => {
43
+ if (command === "cancel" || command === "close")
44
+ return false;
45
+ if (sessionRow.status === "closed")
46
+ return false;
47
+ const durableClaim = activeSessionClaim(connection.accountId, sessionRow.id);
48
+ const pending = isSessionCommandPending(connection.accountId, sessionRow.id);
49
+ if (!durableClaim && !pending)
50
+ return false;
51
+ sendError(connection, {
52
+ type: "server:error",
53
+ requestId,
54
+ code: "SESSION_BUSY",
55
+ message: "Session already has a pending operation",
56
+ sessionId: sessionRow.id,
57
+ ...(durableClaim ? { activeRequestId: durableClaim.request_id, activeTurnId: durableClaim.turn_id } : {}),
58
+ });
59
+ return true;
60
+ };
61
+ const rejectUnsupportedSessionPrimitive = (sessionRow, requestId, command) => {
62
+ const capability = sessionSnapshot(sessionRow).capabilities?.[command] ?? "unsupported";
63
+ if (capability !== "unsupported")
64
+ return false;
65
+ sendError(connection, {
66
+ type: "server:error",
67
+ requestId,
68
+ code: "CAPABILITY_UNAVAILABLE",
69
+ capability: `session.${command}`,
70
+ message: `session.${command} is not supported by this target`,
71
+ });
72
+ return true;
73
+ };
30
74
  const rejectUnsupportedAgent = (machineId, agentId, requestId) => {
31
75
  const capabilities = machineCapabilities(connection.accountId, machineId);
32
76
  const advertisedAgents = capabilities?.agents.length ? capabilities.agents : legacyMachineAgents;
@@ -60,27 +104,45 @@ export function handleControllerMessage(context, connection, message) {
60
104
  }
61
105
  if (rejectUnsupportedAgent(message.machineId, message.agent, message.requestId))
62
106
  return;
63
- const machineConnection = connectedMachine(connection.accountId, message.machineId);
64
- if (!machineConnection) {
65
- sendMachineOffline(connection, message.requestId);
66
- return;
67
- }
68
107
  const sessionId = randomId("ses");
69
108
  const createdAt = now();
70
- db.prepare(`INSERT INTO sessions
71
- (id, account_id, machine_id, agent, cwd, name, status, encrypted_metadata, created_at, updated_at)
72
- VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`).run(sessionId, connection.accountId, message.machineId, message.agent, message.cwd, message.name, "new", message.encryptedMetadata ? JSON.stringify(message.encryptedMetadata) : null, createdAt, createdAt);
73
- const session = sessionSnapshot(db.prepare("SELECT * FROM sessions WHERE id = ?").get(sessionId));
74
- broadcastControllers(connection.accountId, { type: "server:session", session });
75
- sendAck(connection, { type: "server:ack", requestId: message.requestId, ok: true, sessionId });
76
- send(machineConnection.socket, {
109
+ const machineCommand = {
77
110
  type: "machine:createSession",
78
111
  requestId: message.requestId,
79
112
  sessionId,
80
113
  agent: message.agent,
81
114
  cwd: message.cwd,
82
115
  name: message.name,
116
+ model: message.model,
83
117
  encryptedMetadata: message.encryptedMetadata,
118
+ };
119
+ db.exec("BEGIN");
120
+ try {
121
+ db.prepare(`INSERT INTO sessions
122
+ (id, account_id, machine_id, agent, cwd, name, status, encrypted_metadata, created_at, updated_at)
123
+ VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`).run(sessionId, connection.accountId, message.machineId, message.agent, message.cwd, message.name, "new", message.encryptedMetadata ? JSON.stringify(message.encryptedMetadata) : null, createdAt, createdAt);
124
+ db.prepare(`INSERT INTO relay_admissions
125
+ (account_id, request_id, session_id, machine_id, kind, turn_id, admission, dispatch, created_at, updated_at)
126
+ VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`).run(connection.accountId, message.requestId, sessionId, message.machineId, "createSession", null, "accepted", "queued", createdAt, createdAt);
127
+ db.prepare(`INSERT INTO relay_dispatch_outbox
128
+ (account_id, request_id, machine_id, session_id, command_type, message, state, created_at, updated_at)
129
+ VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)`).run(connection.accountId, message.requestId, message.machineId, sessionId, machineCommand.type, JSON.stringify(machineCommand), "queued", createdAt, createdAt);
130
+ db.exec("COMMIT");
131
+ }
132
+ catch (error) {
133
+ db.exec("ROLLBACK");
134
+ throw error;
135
+ }
136
+ const session = sessionSnapshot(db.prepare("SELECT * FROM sessions WHERE id = ?").get(sessionId));
137
+ broadcastControllers(connection.accountId, { type: "server:session", session });
138
+ const dispatch = deliverOutboxCommand(connection.accountId, message.requestId);
139
+ sendAck(connection, {
140
+ type: "server:ack",
141
+ requestId: message.requestId,
142
+ ok: true,
143
+ sessionId,
144
+ admission: "accepted",
145
+ dispatch,
84
146
  });
85
147
  return;
86
148
  }
@@ -90,28 +152,13 @@ export function handleControllerMessage(context, connection, message) {
90
152
  const sessionRow = allowControllerSession(connection, message.sessionId, message.requestId);
91
153
  if (!sessionRow)
92
154
  return;
93
- if (rejectDisallowedSessionCommand(sessionRow, message.requestId, "prompt"))
155
+ if (rejectPendingSessionCommand(sessionRow, message.requestId, "prompt"))
94
156
  return;
95
- const machineConnection = connectedMachine(connection.accountId, sessionRow.machine_id);
96
- if (!machineConnection) {
97
- const session = setSessionStatus(sessionRow.id, "offline");
98
- if (session)
99
- broadcastControllers(connection.accountId, { type: "server:session", session });
100
- sendMachineOffline(connection, message.requestId);
157
+ if (rejectDisallowedSessionCommand(sessionRow, message.requestId, "prompt"))
101
158
  return;
102
- }
103
- const event = insertEvent({
104
- accountId: connection.accountId,
105
- sessionId: sessionRow.id,
106
- machineId: sessionRow.machine_id,
107
- turnId: message.turnId,
108
- payload: message.encryptedPrompt,
109
- });
110
- broadcastControllers(connection.accountId, { type: "server:event", event });
111
- const session = setSessionStatus(sessionRow.id, "running");
112
- if (session)
113
- broadcastControllers(connection.accountId, { type: "server:session", session });
114
- send(machineConnection.socket, {
159
+ let event;
160
+ const createdAt = now();
161
+ const machineCommand = {
115
162
  type: "machine:prompt",
116
163
  requestId: message.requestId,
117
164
  sessionId: sessionRow.id,
@@ -119,9 +166,65 @@ export function handleControllerMessage(context, connection, message) {
119
166
  encryptedPrompt: message.encryptedPrompt,
120
167
  encryptedMetadata: sessionRow.encrypted_metadata ? parseJson(sessionRow.encrypted_metadata, undefined) : undefined,
121
168
  permissionMode: message.permissionMode,
169
+ model: message.model,
170
+ encryptedMemoryOptions: message.encryptedMemoryOptions,
122
171
  timeoutMs: message.timeoutMs,
172
+ };
173
+ db.exec("BEGIN");
174
+ try {
175
+ const claim = claimSessionTurn({
176
+ accountId: connection.accountId,
177
+ sessionId: sessionRow.id,
178
+ machineId: sessionRow.machine_id,
179
+ requestId: message.requestId,
180
+ turnId: message.turnId,
181
+ commandType: "prompt",
182
+ createdAt,
183
+ });
184
+ if (!claim.ok) {
185
+ db.exec("ROLLBACK");
186
+ sendError(connection, {
187
+ type: "server:error",
188
+ requestId: message.requestId,
189
+ code: "SESSION_BUSY",
190
+ message: "Session already has a running turn",
191
+ sessionId: sessionRow.id,
192
+ activeRequestId: claim.claim.request_id,
193
+ activeTurnId: claim.claim.turn_id,
194
+ });
195
+ return;
196
+ }
197
+ event = insertEvent({
198
+ accountId: connection.accountId,
199
+ sessionId: sessionRow.id,
200
+ machineId: sessionRow.machine_id,
201
+ source: "controller",
202
+ turnId: message.turnId,
203
+ payload: message.encryptedPrompt,
204
+ });
205
+ db.prepare(`INSERT INTO relay_admissions
206
+ (account_id, request_id, session_id, machine_id, kind, turn_id, admission, dispatch, created_at, updated_at)
207
+ VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`).run(connection.accountId, message.requestId, sessionRow.id, sessionRow.machine_id, "prompt", message.turnId, "accepted", "queued", createdAt, createdAt);
208
+ db.prepare(`INSERT INTO relay_dispatch_outbox
209
+ (account_id, request_id, machine_id, session_id, command_type, message, state, created_at, updated_at)
210
+ VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)`).run(connection.accountId, message.requestId, sessionRow.machine_id, sessionRow.id, machineCommand.type, JSON.stringify(machineCommand), "queued", createdAt, createdAt);
211
+ db.exec("COMMIT");
212
+ }
213
+ catch (error) {
214
+ db.exec("ROLLBACK");
215
+ throw error;
216
+ }
217
+ broadcastControllers(connection.accountId, { type: "server:event", event });
218
+ const dispatch = deliverOutboxCommand(connection.accountId, message.requestId);
219
+ sendAck(connection, {
220
+ type: "server:ack",
221
+ requestId: message.requestId,
222
+ ok: true,
223
+ sessionId: sessionRow.id,
224
+ turnId: message.turnId,
225
+ admission: "accepted",
226
+ dispatch,
123
227
  });
124
- sendAck(connection, { type: "server:ack", requestId: message.requestId, ok: true });
125
228
  return;
126
229
  }
127
230
  if (message.type === "controller:cancel") {
@@ -147,6 +250,72 @@ export function handleControllerMessage(context, connection, message) {
147
250
  sendAck(connection, { type: "server:ack", requestId: message.requestId, ok: true });
148
251
  return;
149
252
  }
253
+ if (message.type === "controller:optionResponse") {
254
+ if (!allowControllerAction(connection, "session.run", message.requestId))
255
+ return;
256
+ const sessionRow = allowControllerSession(connection, message.sessionId, message.requestId);
257
+ if (!sessionRow)
258
+ return;
259
+ if (rejectDisallowedSessionCommand(sessionRow, message.requestId, "prompt"))
260
+ return;
261
+ const machineConnection = connectedMachine(connection.accountId, sessionRow.machine_id);
262
+ if (!machineConnection) {
263
+ sendMachineOffline(connection, message.requestId);
264
+ return;
265
+ }
266
+ send(machineConnection.socket, {
267
+ type: "machine:optionResponse",
268
+ requestId: message.requestId,
269
+ sessionId: message.sessionId,
270
+ turnId: message.turnId,
271
+ optionRequestId: message.optionRequestId,
272
+ selectedOptionId: message.selectedOptionId,
273
+ text: message.text,
274
+ });
275
+ sendAck(connection, { type: "server:ack", requestId: message.requestId, ok: true });
276
+ return;
277
+ }
278
+ if (message.type === "controller:reconcileTurn") {
279
+ if (!allowControllerAction(connection, "session.run", message.requestId))
280
+ return;
281
+ const sessionRow = allowControllerSession(connection, message.sessionId, message.requestId);
282
+ if (!sessionRow)
283
+ return;
284
+ if (sessionRow.status === "closed") {
285
+ sendError(connection, {
286
+ type: "server:error",
287
+ requestId: message.requestId,
288
+ code: "SESSION_CLOSED",
289
+ message: "Session is closed",
290
+ });
291
+ return;
292
+ }
293
+ const machineConnection = connectedMachine(connection.accountId, sessionRow.machine_id);
294
+ if (!machineConnection) {
295
+ sendMachineOffline(connection, message.requestId);
296
+ return;
297
+ }
298
+ const claim = activeSessionClaim(connection.accountId, sessionRow.id);
299
+ const alias = message.turnId
300
+ ? db.prepare(`SELECT request_turn_id, runtime_turn_id, request_id
301
+ FROM session_turn_aliases
302
+ WHERE account_id = ? AND session_id = ? AND machine_id = ?
303
+ AND (request_turn_id = ? OR runtime_turn_id = ?)
304
+ ORDER BY created_at DESC
305
+ LIMIT 1`).get(connection.accountId, sessionRow.id, sessionRow.machine_id, message.turnId, message.turnId)
306
+ : undefined;
307
+ markCommandPending(connection.accountId, sessionRow.machine_id, message.requestId, { command: "reconcile", sessionId: sessionRow.id });
308
+ send(machineConnection.socket, {
309
+ type: "machine:reconcileTurn",
310
+ requestId: message.requestId,
311
+ sessionId: message.sessionId,
312
+ turnId: alias?.request_turn_id ?? message.turnId ?? claim?.turn_id ?? sessionRow.last_turn_id ?? undefined,
313
+ providerTurnId: alias?.runtime_turn_id,
314
+ activeRequestId: alias?.request_id ?? claim?.request_id ?? undefined,
315
+ encryptedMetadata: sessionRow.encrypted_metadata ? parseJson(sessionRow.encrypted_metadata, undefined) : undefined,
316
+ });
317
+ return;
318
+ }
150
319
  if (message.type === "controller:resume") {
151
320
  if (!allowControllerAction(connection, "session.resume", message.requestId))
152
321
  return;
@@ -155,6 +324,10 @@ export function handleControllerMessage(context, connection, message) {
155
324
  return;
156
325
  if (rejectDisallowedSessionCommand(sessionRow, message.requestId, "resume"))
157
326
  return;
327
+ if (rejectPendingSessionCommand(sessionRow, message.requestId, "resume"))
328
+ return;
329
+ if (rejectUnsupportedSessionPrimitive(sessionRow, message.requestId, "resume"))
330
+ return;
158
331
  const machineConnection = connectedMachine(connection.accountId, sessionRow.machine_id);
159
332
  if (!machineConnection) {
160
333
  const session = setSessionStatus(sessionRow.id, "offline");
@@ -163,11 +336,12 @@ export function handleControllerMessage(context, connection, message) {
163
336
  sendMachineOffline(connection, message.requestId);
164
337
  return;
165
338
  }
166
- markCommandPending(connection.accountId, sessionRow.machine_id, message.requestId);
339
+ markCommandPending(connection.accountId, sessionRow.machine_id, message.requestId, { command: "resume", sessionId: sessionRow.id });
167
340
  send(machineConnection.socket, {
168
341
  type: "machine:resume",
169
342
  requestId: message.requestId,
170
343
  sessionId: message.sessionId,
344
+ ...(message.syncDirection ? { syncDirection: message.syncDirection } : {}),
171
345
  encryptedMetadata: sessionRow.encrypted_metadata ? parseJson(sessionRow.encrypted_metadata, undefined) : undefined,
172
346
  });
173
347
  return;
@@ -317,6 +491,78 @@ export function handleControllerMessage(context, connection, message) {
317
491
  });
318
492
  return;
319
493
  }
494
+ if (message.type === "controller:gateway") {
495
+ if (!allowControllerAction(connection, "gateway.manage", message.requestId))
496
+ return;
497
+ if (!allowControllerMachine(connection, message.machineId, message.requestId))
498
+ return;
499
+ const machineConnection = connectedMachine(connection.accountId, message.machineId);
500
+ if (!machineConnection) {
501
+ sendMachineOffline(connection, message.requestId);
502
+ return;
503
+ }
504
+ markCommandPending(connection.accountId, message.machineId, message.requestId, { command: "gateway" });
505
+ send(machineConnection.socket, {
506
+ type: "machine:gateway",
507
+ requestId: message.requestId,
508
+ machineId: message.machineId,
509
+ action: message.action,
510
+ channelId: message.channelId,
511
+ channel: message.channel,
512
+ externalConversationId: message.externalConversationId,
513
+ externalMessageId: message.externalMessageId,
514
+ text: message.text,
515
+ });
516
+ return;
517
+ }
518
+ if (message.type === "controller:schedule") {
519
+ if (!allowControllerAction(connection, "schedule.manage", message.requestId))
520
+ return;
521
+ if (!allowControllerMachine(connection, message.machineId, message.requestId))
522
+ return;
523
+ const machineConnection = connectedMachine(connection.accountId, message.machineId);
524
+ if (!machineConnection) {
525
+ sendMachineOffline(connection, message.requestId);
526
+ return;
527
+ }
528
+ markCommandPending(connection.accountId, message.machineId, message.requestId, { command: "schedule" });
529
+ send(machineConnection.socket, {
530
+ type: "machine:schedule",
531
+ requestId: message.requestId,
532
+ machineId: message.machineId,
533
+ action: message.action,
534
+ scheduleId: message.scheduleId,
535
+ occurrenceId: message.occurrenceId,
536
+ schedule: message.schedule,
537
+ });
538
+ return;
539
+ }
540
+ if (message.type === "controller:memory") {
541
+ if (!allowControllerAction(connection, "memory.manage", message.requestId))
542
+ return;
543
+ if (!allowControllerMachine(connection, message.machineId, message.requestId))
544
+ return;
545
+ const machineConnection = connectedMachine(connection.accountId, message.machineId);
546
+ if (!machineConnection) {
547
+ sendMachineOffline(connection, message.requestId);
548
+ return;
549
+ }
550
+ markCommandPending(connection.accountId, message.machineId, message.requestId, { command: "memory" });
551
+ send(machineConnection.socket, {
552
+ type: "machine:memory",
553
+ requestId: message.requestId,
554
+ machineId: message.machineId,
555
+ action: message.action,
556
+ projectKey: message.projectKey,
557
+ path: message.path,
558
+ query: message.query,
559
+ limit: message.limit,
560
+ mode: message.mode,
561
+ write: message.write,
562
+ promote: message.promote,
563
+ });
564
+ return;
565
+ }
320
566
  if (message.type === "controller:importHistoricalSession") {
321
567
  if (!allowControllerAction(connection, "session.import", message.requestId))
322
568
  return;
@@ -341,11 +587,50 @@ export function handleControllerMessage(context, connection, message) {
341
587
  sendMachineOffline(connection, message.requestId);
342
588
  return;
343
589
  }
590
+ const existingBinding = findSessionRuntimeBinding(db, {
591
+ accountId: connection.accountId,
592
+ machineId: message.machineId,
593
+ agent: message.agent,
594
+ runtimeSessionId: message.runtimeSessionId,
595
+ });
596
+ if (existingBinding) {
597
+ const existingSession = db
598
+ .prepare("SELECT * FROM sessions WHERE id = ? AND account_id = ? AND machine_id = ?")
599
+ .get(existingBinding.session_id, connection.accountId, message.machineId);
600
+ if (existingSession && existingSession.status !== "closed" && existingBinding.status !== "closed") {
601
+ sendAck(connection, {
602
+ type: "server:ack",
603
+ requestId: message.requestId,
604
+ ok: true,
605
+ sessionId: existingSession.id,
606
+ });
607
+ return;
608
+ }
609
+ if (existingSession?.status === "closed" || existingBinding.status === "closed") {
610
+ sendError(connection, {
611
+ type: "server:error",
612
+ requestId: message.requestId,
613
+ code: "RUNTIME_SESSION_ARCHIVED",
614
+ message: "This runtime session is archived in Happy Elves. Restore the archived session before importing it again.",
615
+ sessionId: existingSession?.id ?? existingBinding.session_id,
616
+ });
617
+ return;
618
+ }
619
+ }
344
620
  const sessionId = randomId("ses");
345
621
  const createdAt = now();
346
622
  db.prepare(`INSERT INTO sessions
347
623
  (id, account_id, machine_id, agent, cwd, name, status, encrypted_metadata, created_at, updated_at)
348
624
  VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`).run(sessionId, connection.accountId, message.machineId, message.agent, message.cwd, message.name, "new", message.encryptedMetadata ? JSON.stringify(message.encryptedMetadata) : null, createdAt, createdAt);
625
+ upsertSessionRuntimeBindings(db, {
626
+ accountId: connection.accountId,
627
+ machineId: message.machineId,
628
+ agent: message.agent,
629
+ sessionId,
630
+ runtimeSessionIds: [message.runtimeSessionId],
631
+ status: "active",
632
+ ts: createdAt,
633
+ });
349
634
  const session = sessionSnapshot(db.prepare("SELECT * FROM sessions WHERE id = ?").get(sessionId));
350
635
  broadcastControllers(connection.accountId, { type: "server:session", session });
351
636
  markCommandPending(connection.accountId, message.machineId, message.requestId);
@@ -369,12 +654,16 @@ export function handleControllerMessage(context, connection, message) {
369
654
  return;
370
655
  if (rejectDisallowedSessionCommand(sessionRow, message.requestId, "rewind"))
371
656
  return;
657
+ if (rejectPendingSessionCommand(sessionRow, message.requestId, "rewind"))
658
+ return;
659
+ if (rejectUnsupportedSessionPrimitive(sessionRow, message.requestId, "rewind"))
660
+ return;
372
661
  const machineConnection = connectedMachine(connection.accountId, sessionRow.machine_id);
373
662
  if (!machineConnection) {
374
663
  sendMachineOffline(connection, message.requestId);
375
664
  return;
376
665
  }
377
- markCommandPending(connection.accountId, sessionRow.machine_id, message.requestId);
666
+ markCommandPending(connection.accountId, sessionRow.machine_id, message.requestId, { command: "rewind", sessionId: sessionRow.id });
378
667
  send(machineConnection.socket, {
379
668
  type: "machine:rewind",
380
669
  requestId: message.requestId,
@@ -392,13 +681,17 @@ export function handleControllerMessage(context, connection, message) {
392
681
  return;
393
682
  if (rejectDisallowedSessionCommand(sessionRow, message.requestId, "fork"))
394
683
  return;
684
+ if (rejectPendingSessionCommand(sessionRow, message.requestId, "fork"))
685
+ return;
686
+ if (rejectUnsupportedSessionPrimitive(sessionRow, message.requestId, "fork"))
687
+ return;
395
688
  const machineConnection = connectedMachine(connection.accountId, sessionRow.machine_id);
396
689
  if (!machineConnection) {
397
690
  sendMachineOffline(connection, message.requestId);
398
691
  return;
399
692
  }
400
693
  const targetSessionId = randomId("ses");
401
- markCommandPending(connection.accountId, sessionRow.machine_id, message.requestId);
694
+ markCommandPending(connection.accountId, sessionRow.machine_id, message.requestId, { command: "fork", sessionId: sessionRow.id });
402
695
  send(machineConnection.socket, {
403
696
  type: "machine:fork",
404
697
  requestId: message.requestId,
@@ -447,6 +740,12 @@ export function handleControllerMessage(context, connection, message) {
447
740
  const machineConnection = connectedMachine(connection.accountId, sessionRow.machine_id);
448
741
  if (!machineConnection) {
449
742
  const session = setSessionStatus(sessionRow.id, "closed");
743
+ finishSessionClaim({
744
+ accountId: connection.accountId,
745
+ sessionId: sessionRow.id,
746
+ terminalStatus: "cancelled",
747
+ errorCode: "SESSION_CLOSED",
748
+ });
450
749
  if (session)
451
750
  broadcastControllers(connection.accountId, { type: "server:session", session });
452
751
  sendAck(connection, { type: "server:ack", requestId: message.requestId, ok: true });
@@ -462,4 +761,17 @@ export function handleControllerMessage(context, connection, message) {
462
761
  });
463
762
  }
464
763
  }
764
+ function sessionLooksTranscriptPending(db, sessionRow) {
765
+ if (sessionRow.status !== "running")
766
+ return false;
767
+ if (!sessionRow.source_session_id || !sessionRow.source_checkpoint_id)
768
+ return false;
769
+ const row = db
770
+ .prepare(`SELECT 1
771
+ FROM session_events
772
+ WHERE account_id = ? AND session_id = ? AND machine_id = ?
773
+ LIMIT 1`)
774
+ .get(sessionRow.account_id, sessionRow.id, sessionRow.machine_id);
775
+ return !row;
776
+ }
465
777
  //# sourceMappingURL=controller-handlers.js.map