@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
@@ -0,0 +1,359 @@
1
+ import { createHash } from "node:crypto";
2
+ import path from "node:path";
3
+ import fs from "node:fs/promises";
4
+ import { memoryRootDir } from "../paths.js";
5
+ const defaultMemoryMode = "readonly";
6
+ const maxSearchFiles = 400;
7
+ const memoryProjectWriteChains = new Map();
8
+ export async function memoryOverview(projectKey, mode = defaultMemoryMode) {
9
+ const root = projectMemoryRoot(projectKey);
10
+ await ensureMemoryFiles(projectKey);
11
+ const files = await listMemoryFiles(projectKey);
12
+ return {
13
+ projectKey,
14
+ mode,
15
+ root,
16
+ files,
17
+ updatedAt: new Date().toISOString(),
18
+ };
19
+ }
20
+ export async function readMemoryFile(projectKey, requestedPath) {
21
+ const resolved = resolveMemoryPath(projectKey, requestedPath);
22
+ const content = await fs.readFile(resolved.absPath, "utf8");
23
+ const lineCount = content.split(/\r?\n/).length;
24
+ const contentHash = hashContent(content);
25
+ return {
26
+ path: resolved.relPath,
27
+ layer: layerForPath(resolved.relPath),
28
+ content,
29
+ citations: [{ path: resolved.relPath, startLine: 1, endLine: Math.max(1, lineCount), contentHash }],
30
+ };
31
+ }
32
+ export async function writeMemory(input) {
33
+ return await withMemoryProjectWriteLock(input.projectKey, async () => writeMemoryUnlocked(input));
34
+ }
35
+ async function writeMemoryUnlocked(input) {
36
+ const text = input.text.trim();
37
+ if (!text)
38
+ throw new Error("memory text is required");
39
+ const target = memoryPathForLayer(input.projectKey, input.layer, input.date);
40
+ await ensureMemoryFiles(input.projectKey);
41
+ await fs.mkdir(path.dirname(target.absPath), { recursive: true });
42
+ const entry = formatMemoryEntry(input.layer, text, input.title);
43
+ await fs.appendFile(target.absPath, entry, "utf8");
44
+ return await summarizeFile(target.absPath, target.relPath, input.layer);
45
+ }
46
+ export async function searchMemory(projectKey, query, limit = 5, options = {}) {
47
+ await ensureMemoryFiles(projectKey);
48
+ const terms = query.toLowerCase().split(/[^\p{L}\p{N}_-]+/u).filter((term) => term.length >= 2);
49
+ const files = (await listMemoryFiles(projectKey))
50
+ .filter((file) => options.includeDaily !== false || file.layer !== "daily")
51
+ .slice(0, maxSearchFiles);
52
+ const results = [];
53
+ for (const file of files) {
54
+ const resolved = resolveMemoryPath(projectKey, file.path);
55
+ const content = await fs.readFile(resolved.absPath, "utf8").catch(() => "");
56
+ const contentHash = hashContent(content);
57
+ const chunks = chunkMarkdown(content, file.path, file.layer, contentHash);
58
+ for (const chunk of chunks) {
59
+ const score = scoreChunk(chunk.text, query, terms, file.layer);
60
+ if (score <= 0)
61
+ continue;
62
+ results.push({
63
+ id: stableMemoryId(projectKey, chunk.citation.path, String(chunk.citation.startLine), chunk.text),
64
+ layer: file.layer,
65
+ path: file.path,
66
+ ...(chunk.title ? { title: chunk.title } : {}),
67
+ snippet: compactSnippet(chunk.text),
68
+ citation: chunk.citation,
69
+ score,
70
+ updatedAt: file.updatedAt,
71
+ });
72
+ }
73
+ }
74
+ return results
75
+ .sort((left, right) => right.score - left.score || right.updatedAt.localeCompare(left.updatedAt))
76
+ .slice(0, Math.max(1, limit));
77
+ }
78
+ export async function prepareMemoryContext(options, promptText) {
79
+ if (options.mode === "off")
80
+ return { text: promptText, used: [], options };
81
+ const topN = Math.max(1, Math.min(8, options.topN ?? 3));
82
+ const used = await searchMemory(options.projectKey, promptText, topN, { includeDaily: false });
83
+ if (used.length === 0)
84
+ return { text: promptText, used, options };
85
+ const block = [
86
+ "Memory context for this turn:",
87
+ ...used.map((item, index) => `${index + 1}. [${item.path}:${item.citation.startLine}-${item.citation.endLine}] ${item.snippet}`),
88
+ "Use this context only when it is relevant. Do not reveal internal memory paths unless the user asks.",
89
+ ].join("\n");
90
+ return { text: `${block}\n\n${promptText}`, used, options };
91
+ }
92
+ export async function writeTurnMemory(options, input) {
93
+ if (!options || options.mode !== "readwrite")
94
+ return undefined;
95
+ const summary = [
96
+ `Request: ${input.requestId}`,
97
+ `Turn: ${input.turnId}`,
98
+ `Status: ${input.status}`,
99
+ "",
100
+ "Prompt:",
101
+ input.promptText.slice(0, 4000),
102
+ "",
103
+ "Output preview:",
104
+ input.outputPreview.slice(0, 4000) || "(no output preview)",
105
+ ].join("\n");
106
+ return await writeMemory({
107
+ projectKey: options.projectKey,
108
+ layer: "daily",
109
+ title: `Turn ${input.turnId}`,
110
+ text: summary,
111
+ date: new Date().toISOString().slice(0, 10),
112
+ });
113
+ }
114
+ export async function maybePromoteMemory(options, promptText) {
115
+ if (!options || options.mode !== "readwrite")
116
+ return undefined;
117
+ if (!/\bremember this\b|记住|记忆下来|save this memory/i.test(promptText))
118
+ return undefined;
119
+ const cleaned = promptText
120
+ .replace(/\bremember this\b[::]?/ig, "")
121
+ .replace(/记住[::]?/g, "")
122
+ .replace(/记忆下来[::]?/g, "")
123
+ .replace(/save this memory[::]?/ig, "")
124
+ .trim();
125
+ if (!cleaned)
126
+ return undefined;
127
+ return await writeMemory({
128
+ projectKey: options.projectKey,
129
+ layer: "curated",
130
+ title: "Promoted from read-write turn",
131
+ text: cleaned,
132
+ });
133
+ }
134
+ export async function promoteMemory(input) {
135
+ return await withMemoryProjectWriteLock(input.projectKey, async () => {
136
+ const resolved = resolveMemoryPath(input.projectKey, input.source.path);
137
+ const content = await fs.readFile(resolved.absPath, "utf8");
138
+ const currentHash = hashContent(content);
139
+ const citation = {
140
+ ...input.source,
141
+ contentHash: input.source.contentHash ?? currentHash,
142
+ stale: Boolean(input.source.contentHash && input.source.contentHash !== currentHash),
143
+ };
144
+ const lines = content.split(/\r?\n/);
145
+ const selected = lines.slice(Math.max(0, citation.startLine - 1), Math.max(citation.startLine, citation.endLine)).join("\n").trim();
146
+ if (!selected)
147
+ throw new Error("memory promotion source is empty");
148
+ const stalePrefix = citation.stale ? `Source changed since citation ${input.source.contentHash}. Current hash ${currentHash}.\n\n` : "";
149
+ return await writeMemoryUnlocked({
150
+ projectKey: input.projectKey,
151
+ layer: input.targetLayer,
152
+ title: input.title ?? `Promoted from ${citation.path}:${citation.startLine}-${citation.endLine}`,
153
+ text: `${stalePrefix}${selected}`,
154
+ });
155
+ });
156
+ }
157
+ export async function ensureMemoryFiles(projectKey) {
158
+ const root = projectMemoryRoot(projectKey);
159
+ await fs.mkdir(path.join(root, "memory"), { recursive: true });
160
+ await ensureFile(path.join(root, "USER.md"), "# User Memory\n\n");
161
+ await ensureFile(path.join(root, "MEMORY.md"), "# Project Memory\n\n");
162
+ const today = new Date().toISOString().slice(0, 10);
163
+ await ensureFile(path.join(root, "memory", `${today}.md`), `# Daily Memory ${today}\n\n`);
164
+ }
165
+ async function listMemoryFiles(projectKey) {
166
+ const root = projectMemoryRoot(projectKey);
167
+ const files = [];
168
+ for (const relPath of ["USER.md", "MEMORY.md"]) {
169
+ const absPath = path.join(root, relPath);
170
+ const summary = await summarizeFile(absPath, relPath, layerForPath(relPath)).catch(() => undefined);
171
+ if (summary)
172
+ files.push(summary);
173
+ }
174
+ const dailyDir = path.join(root, "memory");
175
+ const daily = await fs.readdir(dailyDir).catch(() => []);
176
+ for (const name of daily.filter((item) => /^\d{4}-\d{2}-\d{2}\.md$/.test(item)).sort().reverse()) {
177
+ const relPath = `memory/${name}`;
178
+ const summary = await summarizeFile(path.join(root, relPath), relPath, "daily").catch(() => undefined);
179
+ if (summary)
180
+ files.push(summary);
181
+ }
182
+ return files;
183
+ }
184
+ export async function memoryDocumentSnapshots(projectKey) {
185
+ await ensureMemoryFiles(projectKey);
186
+ const snapshots = [];
187
+ for (const file of await listMemoryFiles(projectKey)) {
188
+ const resolved = resolveMemoryPath(projectKey, file.path);
189
+ snapshots.push({ path: file.path, layer: file.layer, content: await fs.readFile(resolved.absPath, "utf8"), summary: file });
190
+ }
191
+ return snapshots;
192
+ }
193
+ export async function applyMemoryDocumentSnapshot(projectKey, snapshot) {
194
+ return await withMemoryProjectWriteLock(projectKey, async () => {
195
+ await ensureMemoryFiles(projectKey);
196
+ const resolved = resolveMemoryPath(projectKey, snapshot.path);
197
+ await fs.mkdir(path.dirname(resolved.absPath), { recursive: true });
198
+ const local = await fs.readFile(resolved.absPath, "utf8").catch(() => "");
199
+ const localContentHash = local ? hashContent(local) : undefined;
200
+ let next = snapshot.content;
201
+ let conflicted = false;
202
+ if (local && local !== snapshot.content) {
203
+ if (local.includes(snapshot.content))
204
+ next = local;
205
+ else if (snapshot.content.includes(local))
206
+ next = snapshot.content;
207
+ else {
208
+ conflicted = true;
209
+ next = `${local.trimEnd()}\n\n## Sync conflict ${new Date().toISOString()}\n\n${snapshot.content.trim()}\n`;
210
+ }
211
+ }
212
+ await fs.writeFile(resolved.absPath, next, { mode: 0o600 });
213
+ const summary = await summarizeFile(resolved.absPath, resolved.relPath, snapshot.layer);
214
+ return {
215
+ summary,
216
+ ...(conflicted ? {
217
+ conflict: {
218
+ path: resolved.relPath,
219
+ layer: snapshot.layer,
220
+ ...(localContentHash ? { localContentHash } : {}),
221
+ ...(snapshot.contentHash ? { remoteContentHash: snapshot.contentHash } : {}),
222
+ mergedContentHash: summary.contentHash,
223
+ },
224
+ } : {}),
225
+ };
226
+ });
227
+ }
228
+ function projectMemoryRoot(projectKey) {
229
+ return path.join(memoryRootDir, safeSegment(projectKey));
230
+ }
231
+ function resolveMemoryPath(projectKey, requestedPath) {
232
+ const relPath = normalizeRelMemoryPath(requestedPath);
233
+ const root = projectMemoryRoot(projectKey);
234
+ const absPath = path.resolve(root, relPath);
235
+ if (!absPath.startsWith(path.resolve(root) + path.sep) && absPath !== path.resolve(root)) {
236
+ throw new Error("memory path escapes project root");
237
+ }
238
+ return { absPath, relPath };
239
+ }
240
+ function memoryPathForLayer(projectKey, layer, date) {
241
+ const root = projectMemoryRoot(projectKey);
242
+ if (layer === "user")
243
+ return { absPath: path.join(root, "USER.md"), relPath: "USER.md" };
244
+ if (layer === "curated")
245
+ return { absPath: path.join(root, "MEMORY.md"), relPath: "MEMORY.md" };
246
+ const day = sanitizeDate(date ?? new Date().toISOString().slice(0, 10));
247
+ return { absPath: path.join(root, "memory", `${day}.md`), relPath: `memory/${day}.md` };
248
+ }
249
+ function layerForPath(relPath) {
250
+ if (relPath === "USER.md")
251
+ return "user";
252
+ if (relPath === "MEMORY.md")
253
+ return "curated";
254
+ return "daily";
255
+ }
256
+ async function ensureFile(filePath, initial) {
257
+ try {
258
+ await fs.access(filePath);
259
+ }
260
+ catch {
261
+ await fs.mkdir(path.dirname(filePath), { recursive: true });
262
+ await fs.writeFile(filePath, initial, { mode: 0o600 });
263
+ }
264
+ }
265
+ async function withMemoryProjectWriteLock(projectKey, run) {
266
+ const previous = memoryProjectWriteChains.get(projectKey) ?? Promise.resolve();
267
+ const next = previous.then(run, run);
268
+ memoryProjectWriteChains.set(projectKey, next.catch(() => undefined));
269
+ try {
270
+ return await next;
271
+ }
272
+ finally {
273
+ if (memoryProjectWriteChains.get(projectKey) === next)
274
+ memoryProjectWriteChains.delete(projectKey);
275
+ }
276
+ }
277
+ async function summarizeFile(absPath, relPath, layer) {
278
+ const [stat, content] = await Promise.all([fs.stat(absPath), fs.readFile(absPath, "utf8")]);
279
+ return {
280
+ path: relPath,
281
+ layer,
282
+ updatedAt: new Date(stat.mtimeMs).toISOString(),
283
+ lineCount: content.length === 0 ? 0 : content.split(/\r?\n/).length,
284
+ byteSize: stat.size,
285
+ contentHash: hashContent(content),
286
+ };
287
+ }
288
+ function chunkMarkdown(content, relPath, layer, contentHash) {
289
+ const lines = content.split(/\r?\n/);
290
+ const chunks = [];
291
+ let start = 1;
292
+ let title;
293
+ let buffer = [];
294
+ const flush = (endLine) => {
295
+ const text = buffer.join("\n").trim();
296
+ if (text)
297
+ chunks.push({ ...(title ? { title } : {}), text, citation: { path: relPath, startLine: start, endLine: Math.max(start, endLine), contentHash } });
298
+ buffer = [];
299
+ };
300
+ for (let index = 0; index < lines.length; index += 1) {
301
+ const line = lines[index];
302
+ const heading = line.match(/^(#{1,3})\s+(.+)$/);
303
+ if (heading && buffer.length > 0) {
304
+ flush(index);
305
+ start = index + 1;
306
+ title = heading[2].trim();
307
+ }
308
+ else if (heading) {
309
+ start = index + 1;
310
+ title = heading[2].trim();
311
+ }
312
+ buffer.push(line);
313
+ }
314
+ flush(lines.length);
315
+ if (chunks.length === 0 && content.trim()) {
316
+ chunks.push({ text: content.trim(), citation: { path: relPath, startLine: 1, endLine: lines.length, contentHash }, ...(layer !== "daily" ? { title: relPath } : {}) });
317
+ }
318
+ return chunks;
319
+ }
320
+ function hashContent(content) {
321
+ return createHash("sha256").update(content).digest("hex");
322
+ }
323
+ function scoreChunk(text, query, terms, layer) {
324
+ const haystack = text.toLowerCase();
325
+ const exact = query.trim() && haystack.includes(query.toLowerCase()) ? 20 : 0;
326
+ const termScore = terms.reduce((score, term) => score + (haystack.includes(term) ? 3 : 0), 0);
327
+ const layerBoost = layer === "user" ? 4 : layer === "curated" ? 3 : 1;
328
+ return exact + termScore + (termScore > 0 || exact > 0 ? layerBoost : 0);
329
+ }
330
+ function compactSnippet(text) {
331
+ const compact = text.replace(/\s+/g, " ").trim();
332
+ return compact.length <= 420 ? compact : `${compact.slice(0, 417)}...`;
333
+ }
334
+ function formatMemoryEntry(layer, text, title) {
335
+ const now = new Date().toISOString();
336
+ const heading = title?.trim() || (layer === "daily" ? `Working note ${now}` : `Memory ${now}`);
337
+ return `\n## ${heading}\n\n${text.trim()}\n`;
338
+ }
339
+ function stableMemoryId(...parts) {
340
+ return `mem_${createHash("sha256").update(parts.join("\0")).digest("base64url").slice(0, 24)}`;
341
+ }
342
+ function safeSegment(value) {
343
+ const hash = createHash("sha256").update(value).digest("base64url").slice(0, 16);
344
+ const readable = value.replace(/[^a-zA-Z0-9._-]+/g, "_").slice(0, 48) || "default";
345
+ return `${readable}_${hash}`;
346
+ }
347
+ function normalizeRelMemoryPath(value) {
348
+ const normalized = value.replace(/\\/g, "/").replace(/^\/+/, "");
349
+ if (normalized === "USER.md" || normalized === "MEMORY.md" || /^memory\/\d{4}-\d{2}-\d{2}\.md$/.test(normalized))
350
+ return normalized;
351
+ throw new Error("unsupported memory path");
352
+ }
353
+ function sanitizeDate(value) {
354
+ const match = value.match(/^(\d{4}-\d{2}-\d{2})/);
355
+ if (!match)
356
+ throw new Error("invalid memory date");
357
+ return match[1];
358
+ }
359
+ //# sourceMappingURL=manager.js.map
@@ -5,6 +5,9 @@ export declare const auditLogPath: string;
5
5
  export declare const relayOutboxPath: string;
6
6
  export declare const loopStorePath: string;
7
7
  export declare const loopStoreLockPath: string;
8
+ export declare const gatewayStorePath: string;
9
+ export declare const scheduleStorePath: string;
10
+ export declare const memoryRootDir: string;
8
11
  export declare const pidPath: string;
9
12
  export declare const daemonScriptPath: string;
10
13
  export declare const daemonScriptRelativePath: string;
@@ -10,6 +10,9 @@ export const auditLogPath = path.join(configDir, "audit.jsonl");
10
10
  export const relayOutboxPath = path.join(configDir, "outbox.jsonl");
11
11
  export const loopStorePath = path.join(configDir, "loops.json");
12
12
  export const loopStoreLockPath = path.join(configDir, "loops.json.lock");
13
+ export const gatewayStorePath = path.join(configDir, "gateway.json");
14
+ export const scheduleStorePath = path.join(configDir, "schedules.json");
15
+ export const memoryRootDir = path.join(configDir, "memory");
13
16
  export const pidPath = path.join(configDir, "daemon.pid");
14
17
  export const daemonScriptPath = fileURLToPath(new URL(import.meta.url.endsWith(".ts") ? "./cli.ts" : "./cli.js", import.meta.url));
15
18
  export const daemonScriptRelativePath = path.relative(process.cwd(), daemonScriptPath);
@@ -0,0 +1,30 @@
1
+ import type { EncryptedEnvelope, PermissionMode } from "../../../../packages/shared/dist/index.js";
2
+ import type { DaemonConfig } from "../types.js";
3
+ export type MachineAdmissionAck = {
4
+ type: "server:ack";
5
+ requestId: string;
6
+ ok: true;
7
+ sessionId?: string;
8
+ turnId?: string;
9
+ admission?: "accepted" | "replayed";
10
+ dispatch?: "queued" | "delivered";
11
+ };
12
+ export declare function admitMachineCreateSession(config: DaemonConfig, input: {
13
+ requestId: string;
14
+ sessionId?: string;
15
+ agent: string;
16
+ cwd: string;
17
+ name: string;
18
+ model?: string;
19
+ encryptedMetadata?: EncryptedEnvelope;
20
+ }): Promise<MachineAdmissionAck>;
21
+ export declare function admitMachinePrompt(config: DaemonConfig, input: {
22
+ requestId: string;
23
+ sessionId: string;
24
+ turnId: string;
25
+ encryptedPrompt: EncryptedEnvelope;
26
+ encryptedMemoryOptions?: EncryptedEnvelope;
27
+ permissionMode?: PermissionMode;
28
+ model?: string;
29
+ timeoutMs?: number;
30
+ }): Promise<MachineAdmissionAck>;
@@ -0,0 +1,31 @@
1
+ import { readRelayJson, relayHttpError } from "../relay-http.js";
2
+ async function postMachineAdmission(config, path, body, fallback) {
3
+ const response = await fetch(`${config.relayUrl}${path}`, {
4
+ method: "POST",
5
+ headers: {
6
+ authorization: `Bearer ${config.machineToken}`,
7
+ "content-type": "application/json",
8
+ },
9
+ body: JSON.stringify(body),
10
+ });
11
+ if (!response.ok)
12
+ throw await relayHttpError(response, fallback);
13
+ const parsed = await readRelayJson(response, `${fallback}: relay response is not valid JSON`);
14
+ if (!isMachineAdmissionAck(parsed)) {
15
+ throw new Error(`${fallback}: relay did not return an admission ack`);
16
+ }
17
+ return parsed;
18
+ }
19
+ export async function admitMachineCreateSession(config, input) {
20
+ return await postMachineAdmission(config, "/api/machine/admissions/create-session", input, "Machine session admission failed");
21
+ }
22
+ export async function admitMachinePrompt(config, input) {
23
+ return await postMachineAdmission(config, "/api/machine/admissions/prompt", input, "Machine prompt admission failed");
24
+ }
25
+ function isMachineAdmissionAck(value) {
26
+ if (!value || typeof value !== "object" || Array.isArray(value))
27
+ return false;
28
+ const record = value;
29
+ return record.type === "server:ack" && record.ok === true && typeof record.requestId === "string";
30
+ }
31
+ //# sourceMappingURL=admission.js.map
@@ -1,10 +1,15 @@
1
1
  import { appendAudit } from "../audit.js";
2
+ import { handleGatewayCommand } from "../gateway/handler.js";
2
3
  import { tickLoops } from "../loop/runner.js";
4
+ import { handleMemoryCommand } from "../memory/handler.js";
5
+ import { handleScheduleCommand } from "../schedule/handler.js";
6
+ import { tickSchedules } from "../schedule/runner.js";
3
7
  import { handleListDirectory } from "../session/directory.js";
4
8
  import { handlePreviewFile } from "../session/file-preview.js";
5
9
  import { handleClose, handleCreateSession, handleImportHistoricalSession, handleListHistoricalSessions, handleResume } from "../session/lifecycle.js";
6
- import { handleCancel, handlePrompt } from "../session/prompt.js";
10
+ import { handleCancel, handleOptionResponse, handlePrompt } from "../session/prompt.js";
7
11
  import { handleFork, handleRename, handleRewind } from "../session/primitives.js";
12
+ import { handleReconcileTurn } from "../session/reconcile.js";
8
13
  import { parseRelayMessage, relayWsUrl } from "../relay-http.js";
9
14
  import { handleDevExec, handleDiagnose } from "./devtools.js";
10
15
  import { registerMachine } from "./register.js";
@@ -58,6 +63,18 @@ async function handleServerMessage(ws, config, message) {
58
63
  await handleDevExec(ws, config, message);
59
64
  return;
60
65
  }
66
+ if (message.type === "machine:gateway") {
67
+ await handleGatewayCommand(ws, config, message);
68
+ return;
69
+ }
70
+ if (message.type === "machine:schedule") {
71
+ await handleScheduleCommand(ws, config, message);
72
+ return;
73
+ }
74
+ if (message.type === "machine:memory") {
75
+ await handleMemoryCommand(ws, config, message);
76
+ return;
77
+ }
61
78
  if (message.type === "machine:importHistoricalSession") {
62
79
  await handleImportHistoricalSession(ws, config, message);
63
80
  return;
@@ -70,6 +87,14 @@ async function handleServerMessage(ws, config, message) {
70
87
  await handleCancel(ws, config, message);
71
88
  return;
72
89
  }
90
+ if (message.type === "machine:optionResponse") {
91
+ await handleOptionResponse(ws, config, message);
92
+ return;
93
+ }
94
+ if (message.type === "machine:reconcileTurn") {
95
+ await handleReconcileTurn(ws, config, message);
96
+ return;
97
+ }
73
98
  if (message.type === "machine:resume") {
74
99
  await handleResume(ws, config, message);
75
100
  return;
@@ -95,8 +120,10 @@ export async function connectOnce(config) {
95
120
  const ws = new WebSocket(relayWsUrl(config.relayUrl));
96
121
  console.log(`Connecting ${config.machineName} to ${relayWsUrl(config.relayUrl)}`);
97
122
  let loopTimer;
123
+ let scheduleTimer;
98
124
  await new Promise((resolve) => {
99
125
  ws.addEventListener("open", () => {
126
+ const onlineSinceMs = Date.now();
100
127
  setActiveRelaySocket(ws);
101
128
  send(ws, {
102
129
  type: "hello",
@@ -109,6 +136,11 @@ export async function connectOnce(config) {
109
136
  console.error(`Loop tick failed: ${error instanceof Error ? error.message : String(error)}`);
110
137
  });
111
138
  }, 1000);
139
+ scheduleTimer = setInterval(() => {
140
+ void tickSchedules(config, onlineSinceMs).catch((error) => {
141
+ console.error(`Schedule tick failed: ${error instanceof Error ? error.message : String(error)}`);
142
+ });
143
+ }, 1000);
112
144
  });
113
145
  ws.addEventListener("message", (event) => {
114
146
  let message;
@@ -133,6 +165,8 @@ export async function connectOnce(config) {
133
165
  clearActiveRelaySocket(ws);
134
166
  if (loopTimer)
135
167
  clearInterval(loopTimer);
168
+ if (scheduleTimer)
169
+ clearInterval(scheduleTimer);
136
170
  console.log("Relay connection closed; reconnecting...");
137
171
  resolve();
138
172
  });
@@ -140,6 +174,8 @@ export async function connectOnce(config) {
140
174
  clearActiveRelaySocket(ws);
141
175
  if (loopTimer)
142
176
  clearInterval(loopTimer);
177
+ if (scheduleTimer)
178
+ clearInterval(scheduleTimer);
143
179
  resolve();
144
180
  });
145
181
  });
@@ -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 handleDiagnose(ws: WebSocket, config: DaemonConfig, command: MachineCommand): Promise<void>;
4
4
  export declare function handleDevExec(ws: WebSocket, config: DaemonConfig, command: MachineCommand): Promise<void>;
@@ -22,6 +22,8 @@ function agentProfileForRegister(agent) {
22
22
  id: agent.id,
23
23
  label: agent.label,
24
24
  ...(agent.command ? { command: agent.command } : {}),
25
+ ...(agent.defaultModel ? { defaultModel: agent.defaultModel } : {}),
26
+ ...(agent.models && agent.models.length > 0 ? { models: agent.models } : {}),
25
27
  ...(agent.historyModel ? { historyModel: agent.historyModel } : {}),
26
28
  ...(agent.sessionPrimitives ? { sessionPrimitives: runtimeAgentPrimitives(agent.sessionPrimitives) } : {}),
27
29
  };
@@ -1,5 +1,5 @@
1
- import type { MachineClientMessage } from "@happy-elves/shared";
2
- import type { RuntimeTurn } from "@happy-elves/runtime";
1
+ import type { MachineClientMessage } from "../../../../packages/shared/dist/index.js";
2
+ import type { RuntimeTurn } from "../../../../packages/runtime/dist/index.js";
3
3
  import type { DaemonConfig } from "../types.js";
4
4
  export declare function send(ws: WebSocket, message: unknown): void;
5
5
  export declare function configureRelaySender(config: DaemonConfig): void;
@@ -8,12 +8,14 @@ const criticalMessageTypes = new Set([
8
8
  "machine:event",
9
9
  "machine:sessionTranscriptReplaced",
10
10
  "machine:sessionTranscriptPrepended",
11
+ "machine:sessionHeadAdvanced",
11
12
  "machine:turnDone",
12
13
  "machine:sessionResumed",
13
14
  "machine:sessionRewound",
14
15
  "machine:sessionForked",
15
16
  "machine:sessionRenamed",
16
17
  "machine:sessionClosed",
18
+ "machine:turnReconciled",
17
19
  "machine:error",
18
20
  ]);
19
21
  let activeRelaySocket = null;
@@ -1,4 +1,4 @@
1
- import { type PairingClaimResponse, type ServerMessage } from "@happy-elves/shared";
1
+ import { type PairingClaimResponse, type ServerMessage } from "../../../packages/shared/dist/index.js";
2
2
  import { DaemonCliError } from "./errors.js";
3
3
  export declare function relayHttpError(response: Response, fallback: string): Promise<DaemonCliError>;
4
4
  export declare function readRelayJson(response: Response, fallback: string): Promise<unknown>;
@@ -1,4 +1,4 @@
1
- import type { HappyElvesRuntime } from "@happy-elves/runtime";
1
+ import type { HappyElvesRuntime } from "../../../../packages/runtime/dist/index.js";
2
2
  export type ExternalProviderConfig = {
3
3
  id: string;
4
4
  command: string;