@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,10 +1,10 @@
1
- import { normalizeSessionName } from "../../../../packages/shared/dist/index.js";
1
+ import { normalizeSessionName, normalizeSessionTags } from "../../../../packages/shared/dist/index.js";
2
2
  import { appendAudit } from "../audit.js";
3
3
  import { getRuntime } from "../runtime.js";
4
4
  import { sessions } from "../state.js";
5
5
  import { claimCommandRequest, sendCommandResponse } from "../relay/send.js";
6
6
  import { createSessionFailureAuditEvent, createSessionFailureResponse } from "./create-session.js";
7
- import { emitHistoricalEvents, emitRuntimeTailEvents, emitTranscriptPrepended, emitTranscriptReplacement } from "./events.js";
7
+ import { emitHistoricalEvents, emitRuntimeTailEvents, emitSessionHeadAdvanced, emitTranscriptPrepended, emitTranscriptReplacement, latestCompletedHistoricalHead, } from "./events.js";
8
8
  import { commandSessionMetadata, encryptedSessionMetadata, sessionFallbackFromCommand } from "./metadata.js";
9
9
  const historicalBackfillEventLimit = 200;
10
10
  export async function handleCreateSession(ws, config, command) {
@@ -15,6 +15,8 @@ export async function handleCreateSession(ws, config, command) {
15
15
  const cwd = command.cwd || process.cwd();
16
16
  try {
17
17
  const metadata = await commandSessionMetadata(config, command.encryptedMetadata);
18
+ const model = modelFromCommand(command.model ?? metadata?.model);
19
+ const tags = normalizeSessionTags(metadata?.tags);
18
20
  const runtime = getRuntime(cwd);
19
21
  let handle = await runtime.ensureSession({
20
22
  sessionKey: command.sessionId,
@@ -22,6 +24,7 @@ export async function handleCreateSession(ws, config, command) {
22
24
  mode: "persistent",
23
25
  cwd,
24
26
  permissionMode: metadata?.permissionMode,
27
+ model,
25
28
  });
26
29
  let providerName;
27
30
  const requestedRuntimeName = metadata?.requestedRuntimeName;
@@ -39,6 +42,8 @@ export async function handleCreateSession(ws, config, command) {
39
42
  agent: command.agent,
40
43
  cwd,
41
44
  name: providerName ?? command.name,
45
+ ...(model ? { model } : {}),
46
+ ...(tags.length > 0 ? { tags } : {}),
42
47
  handle,
43
48
  };
44
49
  sessions.set(command.sessionId, state);
@@ -53,6 +58,7 @@ export async function handleCreateSession(ws, config, command) {
53
58
  agent: command.agent,
54
59
  cwd,
55
60
  name: state.name,
61
+ model,
56
62
  requestedRuntimeName: requestedRuntimeName ? true : undefined,
57
63
  runtime: {
58
64
  acpxRecordId: handle.acpxRecordId,
@@ -66,6 +72,7 @@ export async function handleCreateSession(ws, config, command) {
66
72
  requestId: command.requestId,
67
73
  sessionId: command.sessionId,
68
74
  ...(providerName ? { name: providerName } : {}),
75
+ ...runtimeIdentityProjection(state),
69
76
  encryptedMetadata: await encryptedSessionMetadata(config, command.sessionId, state, {
70
77
  emptyRuntimeSession: true,
71
78
  ...(providerName ? { providerName, renamedAt: new Date().toISOString() } : {}),
@@ -78,6 +85,9 @@ export async function handleCreateSession(ws, config, command) {
78
85
  await sendCommandResponse(ws, createSessionFailureResponse(command, error));
79
86
  }
80
87
  }
88
+ function modelFromCommand(value) {
89
+ return typeof value === "string" && value.trim() ? value.trim() : undefined;
90
+ }
81
91
  export async function handleImportHistoricalSession(ws, config, command) {
82
92
  if (command.type !== "machine:importHistoricalSession")
83
93
  return;
@@ -92,6 +102,7 @@ export async function handleImportHistoricalSession(ws, config, command) {
92
102
  resumeSessionId: command.runtimeSessionId,
93
103
  cwd,
94
104
  });
105
+ assertImportedRuntimeHandleMatches(command.runtimeSessionId, handle);
95
106
  const state = {
96
107
  sessionId: command.sessionId,
97
108
  agent: command.agent,
@@ -136,6 +147,7 @@ export async function handleImportHistoricalSession(ws, config, command) {
136
147
  type: "machine:sessionReady",
137
148
  requestId: command.requestId,
138
149
  sessionId: command.sessionId,
150
+ ...runtimeIdentityProjection(backfilledState, command.runtimeSessionId),
139
151
  encryptedMetadata: await encryptedSessionMetadata(config, command.sessionId, backfilledState, {
140
152
  ...importedMetadataBase,
141
153
  ...historicalBackfillMetadata(backfill),
@@ -246,12 +258,19 @@ function historicalSessionPage(value) {
246
258
  return { sessions: value };
247
259
  return value;
248
260
  }
249
- export async function resumeSession(ws, config, sessionId, requestId, fallback, announceSuccess = true) {
261
+ export async function resumeSession(ws, config, sessionId, requestId, fallback, announceSuccess = true, syncDirection = "auto") {
250
262
  const existing = sessions.get(sessionId);
251
263
  if (existing) {
252
- const refreshed = await refreshRuntimeSessionName(existing);
264
+ const hydratedExisting = fallback?.tags && fallback.tags.length > 0
265
+ ? { ...existing, tags: fallback.tags }
266
+ : existing;
267
+ if (hydratedExisting !== existing)
268
+ sessions.set(sessionId, hydratedExisting);
269
+ const refreshed = await refreshRuntimeSessionName(hydratedExisting);
253
270
  const nameChanged = refreshed.name !== existing.name;
254
- const backfill = await backfillHistoricalEvents(ws, config, refreshed, undefined, refreshed.historicalBackfill ?? fallback?.historicalBackfill);
271
+ const backfill = await backfillHistoricalEvents(ws, config, refreshed, undefined, refreshed.historicalBackfill ?? fallback?.historicalBackfill, {
272
+ direction: syncDirection,
273
+ });
255
274
  const resumed = withHistoricalBackfill(refreshed, backfill);
256
275
  sessions.set(sessionId, resumed);
257
276
  await appendAudit({
@@ -274,6 +293,7 @@ export async function resumeSession(ws, config, sessionId, requestId, fallback,
274
293
  requestId,
275
294
  sessionId,
276
295
  ...(nameChanged ? { name: resumed.name } : {}),
296
+ ...runtimeIdentityProjection(resumed),
277
297
  encryptedMetadata: await encryptedSessionMetadata(config, sessionId, resumed, {
278
298
  resumedAt: new Date().toISOString(),
279
299
  ...historicalBackfillMetadata(backfill),
@@ -298,10 +318,19 @@ export async function resumeSession(ws, config, sessionId, requestId, fallback,
298
318
  cwd,
299
319
  restartableEmptySession: fallback?.emptyRuntimeSession === true,
300
320
  });
301
- const state = await refreshRuntimeSessionName({ sessionId, agent, cwd, name, handle });
321
+ const state = await refreshRuntimeSessionName({
322
+ sessionId,
323
+ agent,
324
+ cwd,
325
+ name,
326
+ ...(fallback?.tags && fallback.tags.length > 0 ? { tags: fallback.tags } : {}),
327
+ handle,
328
+ });
302
329
  sessions.set(sessionId, state);
303
330
  const nameChanged = state.name !== name;
304
- const backfill = await backfillHistoricalEvents(ws, config, state, resumeSessionId, fallback?.historicalBackfill);
331
+ const backfill = await backfillHistoricalEvents(ws, config, state, resumeSessionId, fallback?.historicalBackfill, {
332
+ direction: syncDirection,
333
+ });
305
334
  const resumed = withHistoricalBackfill(state, backfill);
306
335
  sessions.set(sessionId, resumed);
307
336
  await appendAudit({
@@ -324,6 +353,7 @@ export async function resumeSession(ws, config, sessionId, requestId, fallback,
324
353
  requestId,
325
354
  sessionId,
326
355
  ...(nameChanged ? { name: resumed.name } : {}),
356
+ ...runtimeIdentityProjection(resumed, resumeSessionId),
327
357
  encryptedMetadata: await encryptedSessionMetadata(config, sessionId, resumed, {
328
358
  resumedAt: new Date().toISOString(),
329
359
  ...historicalBackfillMetadata(backfill),
@@ -421,6 +451,49 @@ function runtimeHandleFromFallback(sessionId, agent, cwd, fallback) {
421
451
  externalHandle: runtime.externalHandle,
422
452
  };
423
453
  }
454
+ function assertImportedRuntimeHandleMatches(runtimeSessionId, handle) {
455
+ const ids = runtimeHandleSessionIds(handle);
456
+ if (ids.has(runtimeSessionId))
457
+ return;
458
+ const actual = [...ids].join(", ") || "none";
459
+ throw new Error(`Runtime import returned a different session handle: requested ${runtimeSessionId}, got ${actual}`);
460
+ }
461
+ function runtimeHandleSessionIds(handle) {
462
+ const ids = new Set();
463
+ addRuntimeHandleSessionId(ids, handle.acpxRecordId);
464
+ addRuntimeHandleSessionId(ids, handle.backendSessionId);
465
+ addRuntimeHandleSessionId(ids, handle.agentSessionId);
466
+ addRuntimeHandleSessionId(ids, handle.externalHandle?.sessionId);
467
+ return ids;
468
+ }
469
+ function addRuntimeHandleSessionId(ids, value) {
470
+ if (typeof value === "string" && value.trim().length > 0)
471
+ ids.add(value);
472
+ }
473
+ function runtimeIdentityProjection(session, explicitRuntimeSessionId) {
474
+ const ids = runtimeSessionIdsForState(session, explicitRuntimeSessionId);
475
+ return {
476
+ ...(ids[0] ? { runtimeSessionId: ids[0] } : {}),
477
+ ...(ids.length > 0 ? { runtimeSessionIds: ids } : {}),
478
+ };
479
+ }
480
+ function runtimeSessionIdsForState(session, explicitRuntimeSessionId) {
481
+ const ids = new Set();
482
+ addRuntimeSessionId(ids, explicitRuntimeSessionId);
483
+ addRuntimeSessionId(ids, session.handle.backendSessionId);
484
+ addRuntimeSessionId(ids, session.handle.agentSessionId);
485
+ addRuntimeSessionId(ids, session.handle.acpxRecordId);
486
+ addRuntimeSessionId(ids, session.handle.externalHandle?.sessionId);
487
+ return [...ids];
488
+ }
489
+ function addRuntimeSessionId(ids, value) {
490
+ if (typeof value !== "string")
491
+ return;
492
+ const id = value.trim();
493
+ if (!id || id.startsWith("event:"))
494
+ return;
495
+ ids.add(id);
496
+ }
424
497
  export function usesAuthoritativeTranscript(session) {
425
498
  const runtime = getRuntime(session.cwd);
426
499
  const listAgents = "listAgents" in runtime && typeof runtime.listAgents === "function" ? runtime.listAgents : undefined;
@@ -441,8 +514,10 @@ export async function replaceAuthoritativeTranscript(ws, config, session, runtim
441
514
  }
442
515
  const result = authoritativeBackfillResult(page);
443
516
  await emitTranscriptReplacement(ws, config, session.sessionId, page.events, {
517
+ requestId: input.requestId,
444
518
  currentHead: input.currentHead ?? page.currentHead,
445
519
  lastTurnId: input.lastTurnId ?? page.lastTurnId,
520
+ replacementKind: input.replacementKind,
446
521
  status: input.status,
447
522
  hasMoreBefore: page.hasMoreBefore,
448
523
  nextBefore: page.nextBefore,
@@ -527,7 +602,7 @@ async function backfillHistoricalEvents(ws, config, session, runtimeSessionId =
527
602
  if (!runtimeSessionId)
528
603
  return completedBackfillResult(0);
529
604
  if (usesAuthoritativeTranscript(session)) {
530
- if (previousBackfill?.status === "partial" && previousBackfill.providerCursor) {
605
+ if ((options.direction ?? "auto") === "older" && previousBackfill?.status === "partial" && previousBackfill.providerCursor) {
531
606
  return await prependAuthoritativeTranscript(ws, config, session, runtimeSessionId, previousBackfill, { strict: options.strict });
532
607
  }
533
608
  return await replaceAuthoritativeTranscript(ws, config, session, runtimeSessionId, { strict: options.strict });
@@ -549,26 +624,58 @@ async function backfillHistoricalEvents(ws, config, session, runtimeSessionId =
549
624
  throw error;
550
625
  historicalEvents = [];
551
626
  }
552
- const tailWindow = historicalTailWindowByTurn(historicalEvents, previousBackfill?.totalEvents);
627
+ const direction = options.direction ?? "auto";
628
+ const plan = planAppendOnlyHistoricalBackfill(historicalEvents, previousBackfill, direction);
629
+ const tailWindow = plan.tailWindow;
553
630
  if (tailWindow.events.length > 0) {
554
631
  await emitRuntimeTailEvents(ws, config, session.sessionId, tailWindow.events, tailWindow.startIndex);
555
632
  }
556
- const cursor = normalizedBackfillCursor(previousBackfill, historicalEvents.length);
557
- const olderWindow = historicalEventsWindowByTurn(historicalEvents, cursor, historicalBackfillEventLimit);
633
+ const olderWindow = plan.olderWindow;
558
634
  if (olderWindow.events.length > 0) {
559
635
  await emitHistoricalEvents(ws, config, session.sessionId, olderWindow.events, olderWindow.startIndex);
560
636
  }
561
- const status = olderWindow.nextCursor > 0 ? "partial" : "completed";
562
- return {
637
+ const computedHead = direction === "older" && previousBackfill
638
+ ? previousBackfill.head
639
+ : latestCompletedHistoricalHead(session.sessionId, historicalEvents, {
640
+ ...(previousBackfill?.totalEvents !== undefined && previousBackfill.head === undefined
641
+ ? { preferTailBasisForExistingEvents: true }
642
+ : {}),
643
+ ...(previousBackfill?.totalEvents !== undefined ? { previousTotalEvents: previousBackfill.totalEvents } : {}),
644
+ ...(tailWindow.events.length > 0 ? { tailStartIndex: tailWindow.startIndex } : {}),
645
+ });
646
+ const head = direction === "older" && previousBackfill
647
+ ? previousBackfill.head
648
+ : preferPersistedHistoricalHeadBasis(computedHead, previousBackfill?.head);
649
+ const result = {
563
650
  emittedEvents: tailWindow.events.length + olderWindow.events.length,
564
651
  availableEvents: historicalEvents.length,
565
- cursor: olderWindow.nextCursor,
652
+ cursor: plan.cursor,
566
653
  olderBackfilledEvents: olderWindow.events.length,
567
- status,
654
+ status: plan.status,
568
655
  tailRepairedEvents: tailWindow.events.length,
569
656
  totalEvents: historicalEvents.length,
570
- truncated: status === "partial",
657
+ truncated: plan.truncated,
658
+ ...(head ? { head } : {}),
571
659
  };
660
+ if (head) {
661
+ const backfilledSession = withHistoricalBackfill(session, result);
662
+ await emitSessionHeadAdvanced(ws, session.sessionId, head, await encryptedSessionMetadata(config, session.sessionId, backfilledSession, {
663
+ ...historicalBackfillMetadata(result),
664
+ historicalBackfilledAt: new Date().toISOString(),
665
+ }), "completed");
666
+ }
667
+ return result;
668
+ }
669
+ function preferPersistedHistoricalHeadBasis(computed, persisted) {
670
+ if (!computed || !persisted)
671
+ return computed;
672
+ if (computed.currentHead === persisted.currentHead &&
673
+ computed.lastTurnId === persisted.lastTurnId &&
674
+ computed.basis.turnId === persisted.basis.turnId &&
675
+ computed.basis.turnSeq === persisted.basis.turnSeq) {
676
+ return persisted;
677
+ }
678
+ return computed;
572
679
  }
573
680
  function completedBackfillResult(totalEvents) {
574
681
  return {
@@ -589,6 +696,23 @@ function normalizedBackfillCursor(previousBackfill, totalEvents) {
589
696
  return 0;
590
697
  return Math.max(0, Math.min(previousBackfill.cursor, totalEvents));
591
698
  }
699
+ export function planAppendOnlyHistoricalBackfill(historicalEvents, previousBackfill, direction = "auto", maxEvents = historicalBackfillEventLimit) {
700
+ const tailWindow = direction === "latest" || direction === "auto"
701
+ ? historicalTailWindowByTurn(historicalEvents, previousBackfill?.totalEvents)
702
+ : { events: [], startIndex: historicalEvents.length };
703
+ const cursor = normalizedBackfillCursor(previousBackfill, historicalEvents.length);
704
+ const olderWindow = direction === "older" || direction === "auto" || previousBackfill === undefined
705
+ ? historicalEventsWindowByTurn(historicalEvents, cursor, maxEvents)
706
+ : { events: [], nextCursor: cursor, startIndex: cursor };
707
+ const status = olderWindow.nextCursor > 0 ? "partial" : "completed";
708
+ return {
709
+ cursor: olderWindow.nextCursor,
710
+ olderWindow,
711
+ status,
712
+ tailWindow,
713
+ truncated: status === "partial",
714
+ };
715
+ }
592
716
  function historicalTailWindowByTurn(events, previousTotalEvents) {
593
717
  if (previousTotalEvents === undefined || events.length <= previousTotalEvents) {
594
718
  return { events: [], startIndex: events.length };
@@ -645,6 +769,7 @@ function withHistoricalBackfill(session, backfill) {
645
769
  ...session,
646
770
  historicalBackfill: {
647
771
  cursor: backfill.cursor,
772
+ ...(backfill.head ? { head: backfill.head } : {}),
648
773
  providerCursor: backfill.providerCursor,
649
774
  status: backfill.status,
650
775
  totalEvents: backfill.totalEvents,
@@ -661,6 +786,8 @@ function historicalBackfillMetadata(backfill) {
661
786
  backfilledEvents: backfill.emittedEvents,
662
787
  historicalOlderBackfilledEvents: backfill.olderBackfilledEvents,
663
788
  historicalTailRepairedEvents: backfill.tailRepairedEvents,
789
+ historicalHead: backfill.head,
790
+ runtimeCurrentEventCount: backfill.totalEvents,
664
791
  availableHistoricalEvents: backfill.availableEvents,
665
792
  truncatedHistoricalBackfill: backfill.truncated,
666
793
  };
@@ -670,7 +797,7 @@ export async function handleResume(ws, config, command) {
670
797
  return;
671
798
  if (!claimCommandRequest(ws, command.requestId))
672
799
  return;
673
- await resumeSession(ws, config, command.sessionId, command.requestId, await sessionFallbackFromCommand(config, command));
800
+ await resumeSession(ws, config, command.sessionId, command.requestId, await sessionFallbackFromCommand(config, command), true, command.syncDirection ?? "auto");
674
801
  }
675
802
  export async function handleClose(ws, config, command) {
676
803
  if (command.type !== "machine:close")
@@ -679,11 +806,22 @@ export async function handleClose(ws, config, command) {
679
806
  return;
680
807
  const session = sessions.get(command.sessionId);
681
808
  const fallback = session ? undefined : await sessionFallbackFromCommand(config, command);
809
+ const fallbackHandle = fallback ? runtimeHandleFromFallback(command.sessionId, fallback.agent, fallback.cwd, fallback) : undefined;
810
+ const sessionForClose = session ?? (fallback && fallbackHandle
811
+ ? {
812
+ sessionId: command.sessionId,
813
+ agent: fallback.agent,
814
+ cwd: fallback.cwd,
815
+ name: fallback.name,
816
+ handle: fallbackHandle,
817
+ historicalBackfill: fallback.historicalBackfill,
818
+ }
819
+ : undefined);
682
820
  let runtimeCloseError;
683
- if (session) {
821
+ if (sessionForClose) {
684
822
  try {
685
- await getRuntime(session.cwd).close({
686
- handle: session.handle,
823
+ await getRuntime(sessionForClose.cwd).close({
824
+ handle: sessionForClose.handle,
687
825
  reason: command.reason ?? "closed by controller",
688
826
  });
689
827
  }
@@ -702,8 +840,9 @@ export async function handleClose(ws, config, command) {
702
840
  requestId: command.requestId,
703
841
  reason: command.reason,
704
842
  loaded: Boolean(session),
705
- agent: session?.agent ?? fallback?.agent,
706
- cwd: session?.cwd ?? fallback?.cwd,
843
+ ...(!session && fallbackHandle ? { runtimeHandleFallback: true } : {}),
844
+ agent: sessionForClose?.agent ?? fallback?.agent,
845
+ cwd: sessionForClose?.cwd ?? fallback?.cwd,
707
846
  runtimeCloseError,
708
847
  },
709
848
  });
@@ -1,6 +1,6 @@
1
- import { type EncryptedEnvelope, type MachineCommand } from "@happy-elves/shared";
1
+ import { type EncryptedEnvelope, type MachineCommand } from "../../../../packages/shared/dist/index.js";
2
2
  import type { DaemonConfig, SessionFallback, SessionMetadata, SessionState } from "../types.js";
3
- export declare function encryptedSessionMetadata(config: DaemonConfig, sessionId: string, state: Pick<SessionState, "agent" | "cwd" | "name" | "handle">, extra: Record<string, unknown>): Promise<EncryptedEnvelope>;
3
+ export declare function encryptedSessionMetadata(config: DaemonConfig, sessionId: string, state: Pick<SessionState, "agent" | "cwd" | "name" | "handle" | "model" | "tags">, extra: Record<string, unknown>): Promise<EncryptedEnvelope>;
4
4
  export declare function commandSessionMetadata(config: DaemonConfig, encryptedMetadata?: EncryptedEnvelope): Promise<SessionMetadata | undefined>;
5
5
  export declare function sessionFallbackFromCommand(config: DaemonConfig, command: Extract<MachineCommand, {
6
6
  type: "machine:prompt" | "machine:resume" | "machine:rewind" | "machine:fork" | "machine:renameSession" | "machine:close";
@@ -1,9 +1,11 @@
1
- import { decryptJson, encryptJson } from "../../../../packages/shared/dist/index.js";
1
+ import { decryptJson, encryptJson, normalizeSessionTags, sessionTagKeys } from "../../../../packages/shared/dist/index.js";
2
2
  export function encryptedSessionMetadata(config, sessionId, state, extra) {
3
3
  return encryptJson(config.accountSecret, `session:${sessionId}:metadata`, {
4
4
  agent: state.agent,
5
5
  cwd: state.cwd,
6
6
  name: state.name,
7
+ ...(state.model ? { model: state.model } : {}),
8
+ ...(state.tags && state.tags.length > 0 ? { tags: state.tags, tagKeys: sessionTagKeys(state.tags) } : {}),
7
9
  runtime: {
8
10
  backend: state.handle.backend,
9
11
  runtimeSessionName: state.handle.runtimeSessionName,
@@ -32,10 +34,13 @@ export async function sessionFallbackFromCommand(config, command) {
32
34
  return undefined;
33
35
  try {
34
36
  const metadata = await decryptJson(config.accountSecret, encryptedMetadata);
37
+ const tags = safeSessionTags(metadata.tags);
35
38
  return {
36
39
  agent: metadata.agent ?? "codex",
37
40
  cwd: metadata.cwd || process.cwd(),
38
41
  name: metadata.name ?? command.sessionId,
42
+ ...(typeof metadata.model === "string" && metadata.model.trim() ? { model: metadata.model.trim() } : {}),
43
+ ...(tags.length > 0 ? { tags } : {}),
39
44
  emptyRuntimeSession: metadata.emptyRuntimeSession === true,
40
45
  historicalBackfill: historicalBackfillStateFromMetadata(metadata),
41
46
  runtime: metadata.runtime,
@@ -45,6 +50,14 @@ export async function sessionFallbackFromCommand(config, command) {
45
50
  return undefined;
46
51
  }
47
52
  }
53
+ function safeSessionTags(value) {
54
+ try {
55
+ return normalizeSessionTags(Array.isArray(value) ? value : undefined);
56
+ }
57
+ catch {
58
+ return [];
59
+ }
60
+ }
48
61
  function historicalBackfillStateFromMetadata(metadata) {
49
62
  const status = historicalBackfillStatus(metadata.historicalBackfillStatus ?? metadata.historicalBackfill);
50
63
  const totalEvents = nonNegativeInteger(metadata.historicalBackfillTotalEvents ?? metadata.availableHistoricalEvents);
@@ -52,6 +65,7 @@ function historicalBackfillStateFromMetadata(metadata) {
52
65
  if (status && totalEvents !== undefined && cursor !== undefined) {
53
66
  return {
54
67
  cursor: Math.min(cursor, totalEvents),
68
+ ...(historicalHeadStateFromMetadata(metadata) ? { head: historicalHeadStateFromMetadata(metadata) } : {}),
55
69
  ...(typeof metadata.historicalBackfillProviderCursor === "string" ? { providerCursor: metadata.historicalBackfillProviderCursor } : {}),
56
70
  status,
57
71
  totalEvents,
@@ -60,6 +74,7 @@ function historicalBackfillStateFromMetadata(metadata) {
60
74
  if (status === "completed") {
61
75
  return {
62
76
  cursor: 0,
77
+ ...(historicalHeadStateFromMetadata(metadata) ? { head: historicalHeadStateFromMetadata(metadata) } : {}),
63
78
  ...(typeof metadata.historicalBackfillProviderCursor === "string" ? { providerCursor: metadata.historicalBackfillProviderCursor } : {}),
64
79
  status: "completed",
65
80
  totalEvents: totalEvents ?? 0,
@@ -70,6 +85,7 @@ function historicalBackfillStateFromMetadata(metadata) {
70
85
  if (totalEvents !== undefined && backfilledEvents !== undefined) {
71
86
  return {
72
87
  cursor: Math.max(0, totalEvents - backfilledEvents),
88
+ ...(historicalHeadStateFromMetadata(metadata) ? { head: historicalHeadStateFromMetadata(metadata) } : {}),
73
89
  ...(typeof metadata.historicalBackfillProviderCursor === "string" ? { providerCursor: metadata.historicalBackfillProviderCursor } : {}),
74
90
  status: "partial",
75
91
  totalEvents,
@@ -78,6 +94,31 @@ function historicalBackfillStateFromMetadata(metadata) {
78
94
  }
79
95
  return undefined;
80
96
  }
97
+ function historicalHeadStateFromMetadata(metadata) {
98
+ const head = metadata.historicalHead;
99
+ if (!head || typeof head !== "object")
100
+ return undefined;
101
+ const basis = head.basis;
102
+ if (typeof head.currentHead !== "string" ||
103
+ typeof head.lastTurnId !== "string" ||
104
+ !basis ||
105
+ typeof basis !== "object" ||
106
+ typeof basis.turnId !== "string" ||
107
+ typeof basis.eventMessageId !== "string" ||
108
+ !Number.isInteger(basis.turnSeq)) {
109
+ return undefined;
110
+ }
111
+ return {
112
+ currentHead: head.currentHead,
113
+ lastTurnId: head.lastTurnId,
114
+ basis: {
115
+ turnId: basis.turnId,
116
+ eventMessageId: basis.eventMessageId,
117
+ turnSeq: basis.turnSeq,
118
+ ...(typeof basis.occurredAt === "number" ? { occurredAt: basis.occurredAt } : {}),
119
+ },
120
+ };
121
+ }
81
122
  function historicalBackfillStatus(value) {
82
123
  return value === "partial" || value === "completed" ? value : undefined;
83
124
  }
@@ -1,4 +1,4 @@
1
- import { type MachineCommand } from "@happy-elves/shared";
1
+ import { type MachineCommand } from "../../../../packages/shared/dist/index.js";
2
2
  import type { DaemonConfig } from "../types.js";
3
3
  export declare function handleRewind(ws: WebSocket, config: DaemonConfig, command: MachineCommand): Promise<void>;
4
4
  export declare function handleFork(ws: WebSocket, config: DaemonConfig, command: MachineCommand): Promise<void>;
@@ -54,9 +54,10 @@ export async function handleRewind(ws, config, command) {
54
54
  return;
55
55
  if (!claimCommandRequest(ws, command.requestId))
56
56
  return;
57
- const session = sessions.get(command.sessionId) ?? (await resumeSession(ws, config, command.sessionId, command.requestId, await sessionFallbackFromCommand(config, command), false));
57
+ let session = sessions.get(command.sessionId) ?? (await resumeSession(ws, config, command.sessionId, command.requestId, await sessionFallbackFromCommand(config, command), false));
58
58
  if (!session)
59
59
  return;
60
+ session = await hydrateSessionTagsFromCommand(config, command, session);
60
61
  const runtimeWithPrimitives = getRuntime(session.cwd);
61
62
  if (typeof runtimeWithPrimitives.rewindSession !== "function") {
62
63
  await emitCapabilityUnavailable(ws, config, command, "session.rewind", true);
@@ -113,7 +114,11 @@ export async function handleRewind(ws, config, command) {
113
114
  });
114
115
  if (usesAuthoritativeTranscript(nextSession)) {
115
116
  try {
116
- const backfill = await replaceAuthoritativeTranscript(ws, config, nextSession, undefined, head);
117
+ const backfill = await replaceAuthoritativeTranscript(ws, config, nextSession, undefined, {
118
+ ...head,
119
+ replacementKind: "command",
120
+ requestId: command.requestId,
121
+ });
117
122
  sessions.set(command.sessionId, {
118
123
  ...nextSession,
119
124
  historicalBackfill: {
@@ -218,14 +223,16 @@ export async function handleFork(ws, config, command) {
218
223
  });
219
224
  return;
220
225
  }
226
+ const sourceMetadata = await commandSessionMetadata(config, command.sourceEncryptedMetadata);
227
+ const targetMetadata = await commandSessionMetadata(config, command.encryptedMetadata);
221
228
  const forkState = {
222
229
  sessionId: command.targetSessionId,
223
230
  agent: source.agent,
224
231
  cwd: source.cwd,
225
232
  name: command.name,
233
+ ...(targetMetadata?.tags && targetMetadata.tags.length > 0 ? { tags: targetMetadata.tags } : {}),
226
234
  handle: forkHandle,
227
235
  };
228
- const sourceMetadata = await commandSessionMetadata(config, command.sourceEncryptedMetadata);
229
236
  sessions.set(command.targetSessionId, forkState);
230
237
  await appendAudit({
231
238
  sessionId: command.sessionId,
@@ -241,6 +248,7 @@ export async function handleFork(ws, config, command) {
241
248
  ...primitiveRuntimeEvidence(source.handle, forkState.handle),
242
249
  },
243
250
  });
251
+ const authoritativeForkTranscript = usesAuthoritativeTranscript(forkState);
244
252
  await sendCommandResponse(ws, {
245
253
  type: "machine:sessionForked",
246
254
  requestId: command.requestId,
@@ -248,6 +256,7 @@ export async function handleFork(ws, config, command) {
248
256
  sourceCheckpointId,
249
257
  sessionId: command.targetSessionId,
250
258
  name: command.name,
259
+ ...(authoritativeForkTranscript ? { transcriptPending: true } : {}),
251
260
  encryptedMetadata: await encryptedSessionMetadata(config, command.targetSessionId, forkState, {
252
261
  forkedAt: new Date().toISOString(),
253
262
  importedFromRuntimeSessionId: sourceMetadata?.importedFromRuntimeSessionId,
@@ -256,10 +265,15 @@ export async function handleFork(ws, config, command) {
256
265
  sourceCheckpointId,
257
266
  }),
258
267
  });
259
- if (usesAuthoritativeTranscript(forkState)) {
268
+ if (authoritativeForkTranscript) {
260
269
  try {
261
270
  const targetHead = primitiveResultHead(result);
262
- const backfill = await replaceAuthoritativeTranscript(ws, config, forkState, undefined, targetHead);
271
+ const backfill = await replaceAuthoritativeTranscript(ws, config, forkState, undefined, {
272
+ ...targetHead,
273
+ replacementKind: "command",
274
+ requestId: command.requestId,
275
+ status: "completed",
276
+ });
263
277
  sessions.set(command.targetSessionId, {
264
278
  ...forkState,
265
279
  historicalBackfill: {
@@ -279,6 +293,14 @@ export async function handleFork(ws, config, command) {
279
293
  summary: `Failed to refresh fork target transcript ${command.targetSessionId}`,
280
294
  evidence: { requestId: command.requestId, sourceSessionId: command.sessionId, error: error instanceof Error ? error.message : String(error) },
281
295
  });
296
+ await sendCommandResponse(ws, {
297
+ type: "machine:error",
298
+ requestId: command.requestId,
299
+ sessionId: command.targetSessionId,
300
+ code: "SESSION_TRANSCRIPT_REPLACE_FAILED",
301
+ capability: "session.history",
302
+ message: error instanceof Error ? error.message : String(error),
303
+ });
282
304
  }
283
305
  }
284
306
  }
@@ -304,9 +326,10 @@ export async function handleRename(ws, config, command) {
304
326
  });
305
327
  return;
306
328
  }
307
- const session = sessions.get(command.sessionId) ?? (await resumeSession(ws, config, command.sessionId, command.requestId, await sessionFallbackFromCommand(config, command), false));
329
+ let session = sessions.get(command.sessionId) ?? (await resumeSession(ws, config, command.sessionId, command.requestId, await sessionFallbackFromCommand(config, command), false));
308
330
  if (!session)
309
331
  return;
332
+ session = await hydrateSessionTagsFromCommand(config, command, session);
310
333
  const runtimeWithPrimitives = getRuntime(session.cwd);
311
334
  if (typeof runtimeWithPrimitives.renameSession !== "function") {
312
335
  await emitCapabilityUnavailable(ws, config, command, "session.rename", true);
@@ -370,6 +393,14 @@ function capabilityUnavailableEvidence(command) {
370
393
  return { requestId: command.requestId, nameLength: command.name.length };
371
394
  return { requestId: command.requestId, from: command.from, targetSessionId: command.targetSessionId, name: command.name };
372
395
  }
396
+ async function hydrateSessionTagsFromCommand(config, command, session) {
397
+ const metadata = await commandSessionMetadata(config, command.encryptedMetadata);
398
+ if (!metadata?.tags || metadata.tags.length === 0)
399
+ return session;
400
+ const next = { ...session, tags: metadata.tags };
401
+ sessions.set(session.sessionId, next);
402
+ return next;
403
+ }
373
404
  function primitiveRuntimeEvidence(previous, next) {
374
405
  return {
375
406
  runtime: {
@@ -1,4 +1,31 @@
1
- import { type MachineCommand } from "@happy-elves/shared";
1
+ import { type MachineCommand } from "../../../../packages/shared/dist/index.js";
2
2
  import type { DaemonConfig } from "../types.js";
3
+ type PromptCommand = Extract<MachineCommand, {
4
+ type: "machine:prompt";
5
+ }>;
6
+ type PromptExecutionPhase = "decrypt-prompt" | "prepare-attachments" | "decrypt-memory-options" | "prepare-memory-context" | "emit-submitted" | "emit-memory-status" | "start-turn" | "attach-turn" | "audit-turn-start" | "stream-turn" | "await-turn-result" | "write-memory" | "refresh-runtime-metadata" | "emit-terminal" | "refresh-authoritative-transcript" | "send-turn-done" | "terminal-hooks";
3
7
  export declare function handlePrompt(ws: WebSocket, config: DaemonConfig, command: MachineCommand): Promise<void>;
8
+ export declare function handleOptionResponse(ws: WebSocket, config: DaemonConfig, command: MachineCommand): Promise<void>;
9
+ export declare function promptFailureResponse(command: PromptCommand, phase: PromptExecutionPhase, error: unknown): {
10
+ type: "machine:error";
11
+ requestId: string;
12
+ sessionId: string;
13
+ code: string;
14
+ message: string;
15
+ };
16
+ export declare function promptFailureAuditEvent(config: Pick<DaemonConfig, "machineId">, command: PromptCommand, phase: PromptExecutionPhase, error: unknown): {
17
+ sessionId: string;
18
+ machineId: string;
19
+ actor: "system";
20
+ action: string;
21
+ summary: string;
22
+ evidence: {
23
+ requestId: string;
24
+ turnId: string;
25
+ code: string;
26
+ phase: PromptExecutionPhase;
27
+ message: string;
28
+ };
29
+ };
4
30
  export declare function handleCancel(ws: WebSocket, config: DaemonConfig, command: MachineCommand): Promise<void>;
31
+ export {};