@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,20 +1,47 @@
1
- import { decryptJson, encryptJson, normalizeSessionName, parseServerMessage, randomId, } from "../../shared/dist/index.js";
2
- import { addControllerDevice, claimControllerInvite, createControllerInvite, createPairingCode, createScopedToken, listDevices, listScopedTokens, revokeDevice, revokeScopedToken, tokenSelf, } from "./account.js";
1
+ import { decryptJson, encryptJson, normalizeSessionTags, sessionTagKeys, sessionTagsMatch, normalizeSessionName, parseServerMessage, randomId, } from "../../shared/dist/index.js";
2
+ import { addControllerDevice, claimControllerInvite, createControllerInvite, createPairingCode, createScopedToken, deleteMemory as deleteMemoryRecord, listDevices, listEncryptedMemories, listMemorySettings, renameDevice, markSessionRecent, pinWorkspaceCwd, listScopedTokens, revokeDevice, revokeScopedToken, saveEncryptedMemory, setSessionStar, setMemorySettings, setWorkspaceProjectPreference, tokenSelf, unpinWorkspaceCwd, workspaceSyncState, } from "./account.js";
3
3
  import { ControllerClientError, ControllerCommandError } from "./errors.js";
4
- import { authenticatedJson, normalizeRelayUrl, readRelayJson, relayHttpError } from "./http.js";
5
- import { parseSessionEventsResponse, } from "./parsers.js";
6
- import { sendAndWaitForDirectoryListing, sendAndWaitForFilePreview, sendAndWaitForHistoricalSessions, sendAndWaitForMachineDevExecResult, sendAndWaitForMachineDiagnostics, sendCommand, subscribe, } from "./transport.js";
4
+ import { authenticatedJson, authenticatedJsonRaw, normalizeRelayUrl, readRelayJson, relayHttpError } from "./http.js";
5
+ import { parseRepairSessionHeadResult, parseSessionEventsResponse, } from "./parsers.js";
6
+ import { sendAndWaitForDirectoryListing, sendAndWaitForFilePreview, sendAndWaitForGatewayResult, sendAndWaitForHistoricalSessions, sendAndWaitForMachineDevExecResult, sendAndWaitForMachineDiagnostics, sendAndWaitForMemoryResult, sendAndWaitForScheduleResult, sendAndWaitForTurnReconcileResult, sendCommand, subscribe, } from "./transport.js";
7
7
  import { DEFAULT_SESSION_CREATE_WAIT_MS, } from "./types.js";
8
8
  import { isWaitCondition, matchesWaitCondition, parseEventCursor, parseEventLimit, parsePositiveDuration, requireNonEmpty, sleep, } from "./validation.js";
9
- const DEFAULT_RUN_SETTLEMENT_WAIT_MS = 15_000;
10
9
  const DEFAULT_BLOCKING_RUN_WAIT_MS = 30 * 60 * 1000;
10
+ const RESUME_COMMAND_TIMEOUT_MS = 60_000;
11
+ function addRuntimeSessionId(ids, value) {
12
+ if (typeof value === "string" && value.trim())
13
+ ids.add(value.trim());
14
+ }
15
+ function runtimeSessionIdsForMetadata(metadata) {
16
+ const ids = new Set();
17
+ addRuntimeSessionId(ids, metadata.importedFromRuntimeSessionId);
18
+ const runtime = metadata.runtime;
19
+ if (runtime && typeof runtime === "object" && !Array.isArray(runtime)) {
20
+ const record = runtime;
21
+ addRuntimeSessionId(ids, record.backendSessionId);
22
+ addRuntimeSessionId(ids, record.agentSessionId);
23
+ addRuntimeSessionId(ids, record.acpxRecordId);
24
+ const externalHandle = record.externalHandle;
25
+ if (externalHandle && typeof externalHandle === "object" && !Array.isArray(externalHandle)) {
26
+ addRuntimeSessionId(ids, externalHandle.sessionId);
27
+ }
28
+ }
29
+ return ids;
30
+ }
31
+ function isCanonicalRuntimeSessionCandidate(left, right) {
32
+ return left.createdAt < right.createdAt || (left.createdAt === right.createdAt && left.id < right.id);
33
+ }
11
34
  function runSettlementTimeoutMs(options) {
12
35
  if (options.waitTimeoutMs !== undefined)
13
36
  return options.waitTimeoutMs;
14
- if (options.runtimeTimeoutMs !== undefined)
15
- return options.runtimeTimeoutMs + DEFAULT_RUN_SETTLEMENT_WAIT_MS;
16
37
  return DEFAULT_BLOCKING_RUN_WAIT_MS;
17
38
  }
39
+ function memoryScore(memory, query, terms) {
40
+ const haystack = `${memory.title ?? ""}\n${memory.text}\n${memory.tags?.join(" ") ?? ""}`.toLowerCase();
41
+ const exact = haystack.includes(query.toLowerCase()) ? 10 : 0;
42
+ const termScore = terms.reduce((score, term) => score + (haystack.includes(term) ? 1 : 0), 0);
43
+ return exact + termScore;
44
+ }
18
45
  export class ControllerClient {
19
46
  config;
20
47
  constructor(config) {
@@ -65,6 +92,76 @@ export class ControllerClient {
65
92
  async revokeDevice(deviceId) {
66
93
  return await revokeDevice(this.config, deviceId);
67
94
  }
95
+ async renameDevice(deviceId, name) {
96
+ return await renameDevice(this.config, deviceId, name);
97
+ }
98
+ async workspaceSync() {
99
+ return await workspaceSyncState(this.config);
100
+ }
101
+ async starSession(sessionId) {
102
+ return await setSessionStar(this.config, sessionId, true);
103
+ }
104
+ async unstarSession(sessionId) {
105
+ return await setSessionStar(this.config, sessionId, false);
106
+ }
107
+ async markSessionRecent(sessionId) {
108
+ return await markSessionRecent(this.config, sessionId);
109
+ }
110
+ async pinWorkspaceCwd(input) {
111
+ return await pinWorkspaceCwd(this.config, input);
112
+ }
113
+ async unpinWorkspaceCwd(input) {
114
+ return await unpinWorkspaceCwd(this.config, input);
115
+ }
116
+ async setWorkspaceProjectPreference(input) {
117
+ return await setWorkspaceProjectPreference(this.config, input);
118
+ }
119
+ async saveMemory(input) {
120
+ const id = input.id ?? randomId("mem");
121
+ const projectKey = requireNonEmpty(input.projectKey, "projectKey");
122
+ const text = requireNonEmpty(input.text, "text");
123
+ const payload = {
124
+ text,
125
+ ...(input.title ? { title: input.title } : {}),
126
+ ...(input.tags ? { tags: input.tags } : {}),
127
+ };
128
+ const saved = await saveEncryptedMemory(this.config, {
129
+ id,
130
+ projectKey,
131
+ encryptedMemory: await encryptJson(this.config.accountSecret, `memory:${projectKey}:${id}`, payload),
132
+ });
133
+ return await this.decodeMemory(saved);
134
+ }
135
+ async listMemories(projectKey) {
136
+ const { memories } = await listEncryptedMemories(this.config, projectKey);
137
+ const decoded = [];
138
+ for (const memory of memories) {
139
+ decoded.push(await this.decodeMemory(memory));
140
+ }
141
+ return decoded;
142
+ }
143
+ async searchMemories(input) {
144
+ const projectKey = requireNonEmpty(input.projectKey, "projectKey");
145
+ const query = requireNonEmpty(input.query, "query");
146
+ const settings = await this.memorySettings(projectKey);
147
+ if (settings[0]?.disabled === true)
148
+ return [];
149
+ const terms = query.toLowerCase().split(/\W+/).filter((term) => term.length >= 2);
150
+ const scored = (await this.listMemories(projectKey))
151
+ .map((memory) => ({ memory, score: memoryScore(memory, query, terms) }))
152
+ .filter((item) => item.score > 0)
153
+ .sort((left, right) => right.score - left.score || right.memory.updatedAt - left.memory.updatedAt);
154
+ return scored.slice(0, Math.max(1, input.limit ?? 5)).map((item) => item.memory);
155
+ }
156
+ async deleteMemory(id) {
157
+ return await deleteMemoryRecord(this.config, id);
158
+ }
159
+ async memorySettings(projectKey) {
160
+ return (await listMemorySettings(this.config, projectKey)).settings;
161
+ }
162
+ async setMemorySettings(input) {
163
+ return await setMemorySettings(this.config, input);
164
+ }
68
165
  async tokenSelf() {
69
166
  return await tokenSelf(this.config);
70
167
  }
@@ -90,6 +187,8 @@ export class ControllerClient {
90
187
  continue;
91
188
  if (filter.name && (metadata.name ?? session.name) !== filter.name)
92
189
  continue;
190
+ if (filter.tags && !sessionTagsMatch(metadata.tags, filter.tags))
191
+ continue;
93
192
  result.push(session);
94
193
  }
95
194
  return result;
@@ -108,7 +207,22 @@ export class ControllerClient {
108
207
  const agent = requireNonEmpty(input.agent, "agent");
109
208
  const name = requireNonEmpty(input.name, "name");
110
209
  const requestedRuntimeName = input.runtimeName === undefined ? undefined : normalizeSessionName(input.runtimeName);
210
+ const model = normalizeOptionalString(input.model);
211
+ const tags = normalizeSessionTags(input.tags);
111
212
  const requestId = randomId("req");
213
+ const metadata = {
214
+ agent,
215
+ cwd: input.cwd,
216
+ name,
217
+ ...(model ? { model } : {}),
218
+ ...(requestedRuntimeName ? { requestedRuntimeName } : {}),
219
+ createdFrom: input.createdFrom ?? "cli",
220
+ createRequestId: requestId,
221
+ permissionMode: input.permissionMode,
222
+ ...(tags.length > 0 ? { tags, tagKeys: sessionTagKeys(tags) } : {}),
223
+ ...(input.hiddenFromWorkspace ? { hiddenFromWorkspace: true } : {}),
224
+ ...(input.source ? { source: input.source } : {}),
225
+ };
112
226
  const result = await this.sendCommand({
113
227
  type: "controller:createSession",
114
228
  requestId,
@@ -116,23 +230,71 @@ export class ControllerClient {
116
230
  agent,
117
231
  cwd: input.cwd,
118
232
  name,
119
- encryptedMetadata: await encryptJson(this.config.accountSecret, `session:create:${requestId}`, {
120
- agent,
121
- cwd: input.cwd,
122
- name,
123
- ...(requestedRuntimeName ? { requestedRuntimeName } : {}),
124
- createdFrom: input.createdFrom ?? "cli",
125
- createRequestId: requestId,
126
- permissionMode: input.permissionMode,
127
- }),
233
+ ...(model ? { model } : {}),
234
+ encryptedMetadata: await encryptJson(this.config.accountSecret, `session:create:${requestId}`, metadata),
128
235
  });
129
- if (result.sessionId) {
130
- const session = await this.waitForCreatedSession(result.sessionId, requestId, "Session creation failed", "SESSION_CREATE_FAILED", "Machine disconnected before session became ready");
131
- if (requestedRuntimeName && session.name !== requestedRuntimeName) {
132
- await this.recoverCreatedSessionName(result.sessionId, requestId, requestedRuntimeName, session.name);
236
+ return { ...result, requestId };
237
+ }
238
+ async updateSessionMetadata(sessionId, metadata) {
239
+ const checkedSessionId = requireNonEmpty(sessionId, "sessionId");
240
+ const encryptedMetadata = await encryptJson(this.config.accountSecret, `session:${checkedSessionId}:metadata:${Date.now()}`, metadata);
241
+ const response = await authenticatedJsonRaw(this.config, `/api/sessions/${encodeURIComponent(checkedSessionId)}/metadata`, {
242
+ method: "POST",
243
+ headers: { "content-type": "application/json" },
244
+ body: JSON.stringify({ encryptedMetadata }),
245
+ });
246
+ if (!response || typeof response !== "object" || !("session" in response)) {
247
+ throw new ControllerClientError("Session metadata response is invalid", "RELAY_RESPONSE_INVALID");
248
+ }
249
+ const session = response.session;
250
+ const message = parseServerMessage({ type: "server:session", session });
251
+ if (message.type !== "server:session") {
252
+ throw new ControllerClientError("Session metadata response is invalid", "RELAY_RESPONSE_INVALID");
253
+ }
254
+ return message.session;
255
+ }
256
+ async setSessionTags(sessionId, tags) {
257
+ const checkedSessionId = requireNonEmpty(sessionId, "sessionId");
258
+ const session = await this.getSession(checkedSessionId);
259
+ if (!session)
260
+ throw new ControllerClientError(`Session not found: ${checkedSessionId}`, "SESSION_NOT_FOUND");
261
+ const normalized = normalizeSessionTags(tags);
262
+ const metadata = await this.decodeSessionMetadata(session);
263
+ const nextMetadata = {
264
+ ...metadata,
265
+ tags: normalized,
266
+ tagKeys: sessionTagKeys(normalized),
267
+ };
268
+ if (normalized.length === 0) {
269
+ delete nextMetadata.tags;
270
+ delete nextMetadata.tagKeys;
271
+ }
272
+ const updated = await this.updateSessionMetadata(checkedSessionId, nextMetadata);
273
+ return { session: updated, tags: normalized };
274
+ }
275
+ async findLoadedRuntimeSession(input) {
276
+ const machineId = requireNonEmpty(input.machineId, "machineId");
277
+ const agent = requireNonEmpty(input.agent, "agent");
278
+ const runtimeSessionId = requireNonEmpty(input.runtimeSessionId, "runtimeSessionId");
279
+ let selected;
280
+ let closed;
281
+ for (const session of (await this.snapshot()).sessions) {
282
+ if (session.machineId !== machineId || session.agent !== agent)
283
+ continue;
284
+ const metadata = await this.decodeSessionMetadata(session);
285
+ if (!runtimeSessionIdsForMetadata(metadata).has(runtimeSessionId))
286
+ continue;
287
+ if (session.status === "closed") {
288
+ closed ??= session;
289
+ continue;
133
290
  }
291
+ if (!selected || isCanonicalRuntimeSessionCandidate(session, selected))
292
+ selected = session;
134
293
  }
135
- return { ...result, requestId };
294
+ if (!selected && closed) {
295
+ throw new ControllerClientError("This runtime session is archived in Happy Elves. Restore the archived session before importing it again.", "RUNTIME_SESSION_ARCHIVED", { sessionId: closed.id });
296
+ }
297
+ return selected;
136
298
  }
137
299
  async collect(sessionId, input = {}) {
138
300
  return (await this.collectPage(sessionId, input)).events;
@@ -161,6 +323,29 @@ export class ControllerClient {
161
323
  ...(page.oldestEventId === undefined ? {} : { oldestEventId: page.oldestEventId }),
162
324
  };
163
325
  }
326
+ async repairSessionHead(sessionId, input) {
327
+ const checkedSessionId = requireNonEmpty(sessionId, "sessionId");
328
+ const currentHead = requireNonEmpty(input.currentHead, "currentHead");
329
+ const lastTurnId = requireNonEmpty(input.lastTurnId, "lastTurnId");
330
+ const status = input.status;
331
+ const turnId = requireNonEmpty(input.basis.turnId, "basis.turnId");
332
+ const eventMessageId = requireNonEmpty(input.basis.eventMessageId, "basis.eventMessageId");
333
+ return await authenticatedJson(this.config, `/api/sessions/${encodeURIComponent(checkedSessionId)}/head`, {
334
+ method: "POST",
335
+ headers: { "content-type": "application/json" },
336
+ body: JSON.stringify({
337
+ currentHead,
338
+ lastTurnId,
339
+ ...(status ? { status } : {}),
340
+ basis: {
341
+ turnId,
342
+ eventMessageId,
343
+ turnSeq: input.basis.turnSeq,
344
+ ...(input.basis.occurredAt === undefined ? {} : { occurredAt: input.basis.occurredAt }),
345
+ },
346
+ }),
347
+ }, parseRepairSessionHeadResult);
348
+ }
164
349
  async wait(sessionId, input = {}) {
165
350
  const checkedSessionId = requireNonEmpty(sessionId, "sessionId");
166
351
  const until = input.until ?? "idle";
@@ -182,10 +367,15 @@ export class ControllerClient {
182
367
  await sleep(intervalMs);
183
368
  }
184
369
  }
185
- async resume(sessionId) {
370
+ async resume(sessionId, options = {}) {
186
371
  const checkedSessionId = requireNonEmpty(sessionId, "sessionId");
187
372
  const requestId = randomId("req");
188
- return await this.sendCommand({ type: "controller:resume", requestId, sessionId: checkedSessionId });
373
+ return await this.sendCommand({
374
+ type: "controller:resume",
375
+ requestId,
376
+ sessionId: checkedSessionId,
377
+ ...(options.syncDirection ? { syncDirection: options.syncDirection } : {}),
378
+ }, false, RESUME_COMMAND_TIMEOUT_MS);
189
379
  }
190
380
  async listHistoricalSessionsPage(input) {
191
381
  const machineId = requireNonEmpty(input.machineId, "machineId");
@@ -269,11 +459,69 @@ export class ControllerClient {
269
459
  }, input.waitTimeoutMs);
270
460
  return message.result;
271
461
  }
462
+ async gateway(input) {
463
+ const machineId = requireNonEmpty(input.machineId, "machineId");
464
+ const requestId = randomId("req");
465
+ const channel = input.channel ? { ...input.channel } : undefined;
466
+ if (channel?.appSecret) {
467
+ channel.encryptedAppSecret = await encryptJson(this.config.accountSecret, `gateway:secret:${requestId}:${channel.id ?? channel.type}`, {
468
+ appSecret: channel.appSecret,
469
+ });
470
+ delete channel.appSecret;
471
+ }
472
+ const message = await sendAndWaitForGatewayResult(this.config, {
473
+ type: "controller:gateway",
474
+ requestId,
475
+ machineId,
476
+ action: input.action,
477
+ channelId: input.channelId,
478
+ channel,
479
+ externalConversationId: input.externalConversationId,
480
+ externalMessageId: input.externalMessageId,
481
+ text: input.text,
482
+ });
483
+ return message.result;
484
+ }
485
+ async schedule(input) {
486
+ const machineId = requireNonEmpty(input.machineId, "machineId");
487
+ const requestId = randomId("req");
488
+ const message = await sendAndWaitForScheduleResult(this.config, {
489
+ type: "controller:schedule",
490
+ requestId,
491
+ machineId,
492
+ action: input.action,
493
+ scheduleId: input.scheduleId,
494
+ occurrenceId: input.occurrenceId,
495
+ schedule: input.schedule,
496
+ });
497
+ return message.result;
498
+ }
499
+ async memory(input) {
500
+ const machineId = requireNonEmpty(input.machineId, "machineId");
501
+ const requestId = randomId("req");
502
+ const message = await sendAndWaitForMemoryResult(this.config, {
503
+ type: "controller:memory",
504
+ requestId,
505
+ machineId,
506
+ action: input.action,
507
+ projectKey: input.projectKey,
508
+ path: input.path,
509
+ query: input.query,
510
+ limit: input.limit,
511
+ mode: input.mode,
512
+ write: input.write,
513
+ promote: input.promote,
514
+ });
515
+ return message.result;
516
+ }
272
517
  async importHistoricalSession(input) {
273
518
  const machineId = requireNonEmpty(input.machineId, "machineId");
274
519
  const agent = requireNonEmpty(input.agent, "agent");
275
520
  const runtimeSessionId = requireNonEmpty(input.runtimeSessionId, "runtimeSessionId");
276
521
  const name = requireNonEmpty(input.name, "name");
522
+ const existing = await this.findLoadedRuntimeSession({ machineId, agent, runtimeSessionId });
523
+ if (existing)
524
+ return { sessionId: existing.id, mode: "existing", events: [] };
277
525
  const requestId = randomId("req");
278
526
  const result = await this.sendCommand({
279
527
  type: "controller:importHistoricalSession",
@@ -286,6 +534,7 @@ export class ControllerClient {
286
534
  encryptedMetadata: await encryptJson(this.config.accountSecret, `session:import:${requestId}`, {
287
535
  agent,
288
536
  cwd: input.cwd,
537
+ importRequestId: requestId,
289
538
  name,
290
539
  ...(input.providerName ? { providerName: input.providerName } : {}),
291
540
  importedFromRuntimeSessionId: runtimeSessionId,
@@ -308,6 +557,7 @@ export class ControllerClient {
308
557
  const checkedSessionId = requireNonEmpty(sessionId, "sessionId");
309
558
  const from = requireNonEmpty(input.from, "from");
310
559
  const name = requireNonEmpty(input.name, "name");
560
+ const tags = normalizeSessionTags(input.tags);
311
561
  const requestId = randomId("req");
312
562
  return await this.sendCommand({
313
563
  type: "controller:fork",
@@ -319,6 +569,7 @@ export class ControllerClient {
319
569
  sourceSessionId: checkedSessionId,
320
570
  from,
321
571
  name,
572
+ ...(tags.length > 0 ? { tags, tagKeys: sessionTagKeys(tags) } : {}),
322
573
  }),
323
574
  });
324
575
  }
@@ -344,19 +595,28 @@ export class ControllerClient {
344
595
  const promptText = requireNonEmpty(text, "text");
345
596
  const requestId = randomId("req");
346
597
  const turnId = randomId("turn");
347
- const wait = options.wait ?? true;
598
+ const wait = options.wait ?? false;
348
599
  const timeoutMs = wait ? options.waitTimeoutMs : options.ackTimeoutMs;
600
+ const model = normalizeOptionalString(options.model);
349
601
  const result = await this.sendCommand({
350
602
  type: "controller:prompt",
351
603
  requestId,
352
604
  sessionId: checkedSessionId,
353
605
  turnId,
606
+ ...(model ? { model } : {}),
354
607
  encryptedPrompt: await encryptJson(this.config.accountSecret, `prompt:${checkedSessionId}:${turnId}`, {
355
608
  type: "user_prompt",
356
609
  text: promptText,
357
610
  }),
358
611
  permissionMode: options.permissionMode ?? "approve-reads",
359
- timeoutMs: options.runtimeTimeoutMs,
612
+ encryptedMemoryOptions: options.memoryMode && options.memoryProjectKey
613
+ ? await encryptJson(this.config.accountSecret, `prompt:${checkedSessionId}:${turnId}:memory`, {
614
+ mode: options.memoryMode,
615
+ projectKey: options.memoryProjectKey,
616
+ ...(options.memoryTopN ? { topN: options.memoryTopN } : {}),
617
+ })
618
+ : undefined,
619
+ timeoutMs: options.inactivityTimeoutMs ?? options.runtimeTimeoutMs,
360
620
  }, wait, timeoutMs);
361
621
  if (wait) {
362
622
  await this.waitForRunSettlement(checkedSessionId, turnId, runSettlementTimeoutMs(options));
@@ -364,6 +624,17 @@ export class ControllerClient {
364
624
  }
365
625
  return { ...result, requestId, turnId };
366
626
  }
627
+ async reconcileTurn(sessionId, turnId) {
628
+ const checkedSessionId = requireNonEmpty(sessionId, "sessionId");
629
+ const requestId = randomId("req");
630
+ const response = await sendAndWaitForTurnReconcileResult(this.config, {
631
+ type: "controller:reconcileTurn",
632
+ requestId,
633
+ sessionId: checkedSessionId,
634
+ ...(turnId ? { turnId: requireNonEmpty(turnId, "turnId") } : {}),
635
+ });
636
+ return { ...response.result, machineId: response.machineId, requestId: response.result.requestId ?? requestId };
637
+ }
367
638
  async cancel(sessionId, input = {}) {
368
639
  const checkedSessionId = requireNonEmpty(sessionId, "sessionId");
369
640
  const turnId = input.turnId === undefined ? undefined : requireNonEmpty(input.turnId, "turnId");
@@ -423,6 +694,18 @@ export class ControllerClient {
423
694
  return {};
424
695
  }
425
696
  }
697
+ async decodeMemory(memory) {
698
+ const payload = await decryptJson(this.config.accountSecret, memory.encryptedMemory);
699
+ return {
700
+ id: memory.id,
701
+ projectKey: memory.projectKey,
702
+ ...(payload.title ? { title: payload.title } : {}),
703
+ text: typeof payload.text === "string" ? payload.text : JSON.stringify(payload),
704
+ ...(Array.isArray(payload.tags) ? { tags: payload.tags.filter((tag) => typeof tag === "string") } : {}),
705
+ createdAt: memory.createdAt,
706
+ updatedAt: memory.updatedAt,
707
+ };
708
+ }
426
709
  async sendCommand(command, waitForDone = false, timeoutMs) {
427
710
  return await sendCommand({
428
711
  config: this.config,
@@ -440,38 +723,6 @@ export class ControllerClient {
440
723
  }
441
724
  return session;
442
725
  }
443
- async recoverCreatedSessionName(sessionId, createRequestId, expectedName, observedName) {
444
- try {
445
- await this.renameSession(sessionId, expectedName);
446
- const renamed = await this.waitForSessionName(sessionId, expectedName, 5_000);
447
- if (renamed?.name === expectedName)
448
- return;
449
- throw new Error(`expected "${expectedName}", got "${renamed?.name ?? observedName}"`);
450
- }
451
- catch (error) {
452
- const detail = error instanceof Error ? error.message : String(error);
453
- let cleanupDetail = "";
454
- try {
455
- await this.close(sessionId, "runtime name was not confirmed after create");
456
- cleanupDetail = " The created session was closed to avoid a half-named worker.";
457
- }
458
- catch (cleanupError) {
459
- cleanupDetail = ` Cleanup close also failed: ${cleanupError instanceof Error ? cleanupError.message : String(cleanupError)}.`;
460
- }
461
- throw new ControllerCommandError(`Session runtime name was not confirmed after create: expected "${expectedName}", got "${observedName}". Rename recovery failed: ${detail}.${cleanupDetail}`, "SESSION_RENAME_FAILED", undefined, createRequestId);
462
- }
463
- }
464
- async waitForSessionName(sessionId, expectedName, timeoutMs) {
465
- const startedAt = Date.now();
466
- let latest;
467
- while (Date.now() - startedAt <= timeoutMs) {
468
- latest = await this.getSession(sessionId);
469
- if (latest?.name === expectedName)
470
- return latest;
471
- await sleep(150);
472
- }
473
- return latest;
474
- }
475
726
  async waitForRunSettlement(sessionId, turnId, timeoutMs) {
476
727
  const startedAt = Date.now();
477
728
  while (true) {
@@ -510,4 +761,7 @@ export class ControllerClient {
510
761
  return await authenticatedJson(this.config, `/api/sessions/${encodeURIComponent(sessionId)}/events${suffix}`, { method: "GET" }, parseSessionEventsResponse);
511
762
  }
512
763
  }
764
+ function normalizeOptionalString(value) {
765
+ return typeof value === "string" && value.trim() ? value.trim() : undefined;
766
+ }
513
767
  //# sourceMappingURL=client.js.map
@@ -1,4 +1,4 @@
1
1
  export { ControllerClient } from "./client.js";
2
2
  export { ControllerClientError, ControllerCommandError } from "./errors.js";
3
- export type { AddControllerDeviceInput, AddControllerDeviceResult, CancelInput, CollectInput, CommandResult, ControllerClientConfig, ControllerDevice, ControllerInviteClaimInput, ControllerInviteClaimResult, ControllerInviteCreateInput, ControllerInviteCreateResult, ControllerSnapshot, ControllerSubscriptionHandlers, CreateScopedTokenInput, CreateSessionInput, DecodedSessionEvent, DecodedSessionEventsPage, DeviceListResponse, DirectoryInput, DirectoryListResponse, FilePreviewInput, FilePreviewResponse, EventCursor, ForkInput, HistoricalSessionListPage, HistoricalSessionListResponse, HistoricalSessionsInput, ImportHistoricalSessionInput, MachineListResponse, MachineMetadata, PermissionMode, RunOptions, ScopedTokenInfo, ScopedTokenScope, ScopedTokenSelf, SessionFilter, SessionMetadata, WaitCondition, WaitInput, } from "./types.js";
3
+ export type { AddControllerDeviceInput, AddControllerDeviceResult, CancelInput, CollectInput, CommandResult, ControllerClientConfig, ControllerDevice, ControllerInviteClaimInput, ControllerInviteClaimResult, ControllerInviteCreateInput, ControllerInviteCreateResult, ControllerSnapshot, ControllerSubscriptionHandlers, CreateScopedTokenInput, CreateSessionInput, DecodedSessionEvent, DecodedSessionEventsPage, DeviceListResponse, DirectoryInput, DirectoryListResponse, FilePreviewInput, FilePreviewResponse, EventCursor, ForkInput, HistoricalSessionListPage, HistoricalSessionListResponse, HistoricalSessionsInput, ImportHistoricalSessionInput, MachineListResponse, MachineMetadata, DecodedMemoryRecord, EncryptedMemoryRecord, MemoryPayload, MemoryCommandInput, MemoryCommandResponse, MemorySaveInput, MemorySearchInput, MemorySettings, PermissionMode, RepairSessionHeadInput, RepairSessionHeadResult, RunOptions, ScopedTokenInfo, ScopedTokenScope, ScopedTokenSelf, SessionFilter, SessionMetadata, WaitCondition, WaitInput, WorkspaceCwdPin, WorkspaceCwdPinInput, WorkspaceProjectPreference, WorkspaceProjectPreferenceInput, WorkspaceRecentSession, WorkspaceSessionStar, WorkspaceSessionStarResult, WorkspaceSyncState, } from "./types.js";
4
4
  //# sourceMappingURL=index.d.ts.map
@@ -1,5 +1,5 @@
1
- import { type PairingStartResponse } from "@happy-elves/shared";
2
- import type { AddControllerDeviceResult, ControllerInviteClaimResult, ControllerInviteCreateResult, DeviceListResponse, ScopedTokenInfo, ScopedTokenSelf, SessionEventsResponse } from "./types.js";
1
+ import { type PairingStartResponse } from "../../shared/dist/index.js";
2
+ import type { AddControllerDeviceResult, ControllerInviteClaimResult, ControllerInviteCreateResult, DeviceListResponse, EncryptedMemoryRecord, MemorySettings, RenameDeviceResult, ScopedTokenInfo, ScopedTokenSelf, RepairSessionHeadResult, SessionEventsResponse, WorkspaceCwdPin, WorkspaceProjectPreference, WorkspaceRecentSession, WorkspaceSessionStarResult, WorkspaceSyncState } from "./types.js";
3
3
  export declare function parsePairingStartResponse(value: unknown): PairingStartResponse;
4
4
  export declare function parseDevicesResponse(value: unknown): DeviceListResponse;
5
5
  export declare function parseAddControllerDeviceResult(value: unknown): AddControllerDeviceResult;
@@ -9,6 +9,31 @@ export declare function parseRevokeDeviceResult(value: unknown): {
9
9
  deviceId: string;
10
10
  revokedAt: number;
11
11
  };
12
+ export declare function parseRenameDeviceResult(value: unknown): RenameDeviceResult;
13
+ export declare function parseWorkspaceSyncState(value: unknown): WorkspaceSyncState;
14
+ export declare function parseWorkspaceSessionStarResult(value: unknown): WorkspaceSessionStarResult;
15
+ export declare function parseWorkspaceRecentSessionResult(value: unknown): WorkspaceRecentSession;
16
+ export declare function parseWorkspaceCwdPinResult(value: unknown): WorkspaceCwdPin;
17
+ export declare function parseWorkspaceCwdUnpinResult(value: unknown): {
18
+ machineId: string;
19
+ cwd: string;
20
+ removed: boolean;
21
+ removedAt: number;
22
+ };
23
+ export declare function parseWorkspaceProjectPreferenceResult(value: unknown): WorkspaceProjectPreference;
24
+ export declare function parseMemoryListResponse(value: unknown): {
25
+ memories: EncryptedMemoryRecord[];
26
+ };
27
+ export declare function parseMemorySaveResult(value: unknown): EncryptedMemoryRecord;
28
+ export declare function parseMemoryDeleteResult(value: unknown): {
29
+ id: string;
30
+ deleted: boolean;
31
+ deletedAt: number;
32
+ };
33
+ export declare function parseMemorySettingsList(value: unknown): {
34
+ settings: MemorySettings[];
35
+ };
36
+ export declare function parseMemorySettingsResult(value: unknown): MemorySettings;
12
37
  export declare function parseScopedTokenSelf(value: unknown): ScopedTokenSelf;
13
38
  export declare function parseScopedTokenCreate(value: unknown): {
14
39
  token: string;
@@ -22,4 +47,5 @@ export declare function parseScopedTokenRevoke(value: unknown): {
22
47
  revokedAt: number;
23
48
  };
24
49
  export declare function parseSessionEventsResponse(value: unknown): SessionEventsResponse;
50
+ export declare function parseRepairSessionHeadResult(value: unknown): RepairSessionHeadResult;
25
51
  //# sourceMappingURL=parsers.d.ts.map