@cydm/happy-elves 0.1.0-beta.30 → 0.1.0-beta.301

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 (345) 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 +410 -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 +121 -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 +514 -5
  42. package/apps/cli/dist/commands/turn.js +221 -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 +125 -0
  54. package/apps/daemon/dist/gateway/runtime.d.ts +28 -0
  55. package/apps/daemon/dist/gateway/runtime.js +787 -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 +197 -21
  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/pie-provider/dist/index.js +2 -1
  142. package/packages/runtime/dist/index.d.ts +66 -0
  143. package/packages/runtime-acpx/dist/index.d.ts +1 -1
  144. package/packages/runtime-acpx/dist/index.js +8 -0
  145. package/packages/runtime-cli/dist/claude-history.d.ts +1 -2
  146. package/packages/runtime-cli/dist/claude-history.js +0 -3
  147. package/packages/runtime-cli/dist/claude-session-store.d.ts +0 -1
  148. package/packages/runtime-cli/dist/claude-session-store.js +1 -1
  149. package/packages/runtime-cli/dist/claude-turn.d.ts +2 -1
  150. package/packages/runtime-cli/dist/claude-turn.js +29 -9
  151. package/packages/runtime-cli/dist/codex-app-server.d.ts +8 -3
  152. package/packages/runtime-cli/dist/codex-app-server.js +128 -27
  153. package/packages/runtime-cli/dist/codex-history.d.ts +1 -2
  154. package/packages/runtime-cli/dist/codex-history.js +11 -5
  155. package/packages/runtime-cli/dist/codex-json-rpc.d.ts +2 -0
  156. package/packages/runtime-cli/dist/codex-json-rpc.js +26 -1
  157. package/packages/runtime-cli/dist/codex-protocol.d.ts +2 -2
  158. package/packages/runtime-cli/dist/codex-protocol.js +4 -4
  159. package/packages/runtime-cli/dist/history-merge.d.ts +1 -1
  160. package/packages/runtime-cli/dist/index.d.ts +1 -1
  161. package/packages/runtime-cli/dist/index.js +108 -2
  162. package/packages/runtime-cli/dist/permissions.d.ts +1 -1
  163. package/packages/runtime-cli/dist/session-store.d.ts +2 -1
  164. package/packages/runtime-cli/dist/session-store.js +9 -8
  165. package/packages/shared/dist/index.d.ts +2 -0
  166. package/packages/shared/dist/index.js +2 -0
  167. package/packages/shared/dist/protocol-schemas.d.ts +1072 -0
  168. package/packages/shared/dist/protocol-schemas.js +271 -0
  169. package/packages/shared/dist/protocol-types.d.ts +369 -3
  170. package/packages/shared/dist/protocol.d.ts +181 -2
  171. package/packages/shared/dist/protocol.js +197 -1
  172. package/packages/shared/dist/session-tags.d.ts +12 -0
  173. package/packages/shared/dist/session-tags.js +50 -0
  174. package/apps/cli/dist/commands/account.js.map +0 -1
  175. package/apps/cli/dist/commands/app.js.map +0 -1
  176. package/apps/cli/dist/commands/collect.js.map +0 -1
  177. package/apps/cli/dist/commands/command.js.map +0 -1
  178. package/apps/cli/dist/commands/config.js.map +0 -1
  179. package/apps/cli/dist/commands/daemon.js.map +0 -1
  180. package/apps/cli/dist/commands/lib/args.js.map +0 -1
  181. package/apps/cli/dist/commands/lib/audit.js.map +0 -1
  182. package/apps/cli/dist/commands/lib/bootstrap-config.js.map +0 -1
  183. package/apps/cli/dist/commands/lib/bootstrap-daemon.js.map +0 -1
  184. package/apps/cli/dist/commands/lib/bootstrap-output.js.map +0 -1
  185. package/apps/cli/dist/commands/lib/bootstrap.js.map +0 -1
  186. package/apps/cli/dist/commands/lib/config.js.map +0 -1
  187. package/apps/cli/dist/commands/lib/doctor.js.map +0 -1
  188. package/apps/cli/dist/commands/lib/exit.js.map +0 -1
  189. package/apps/cli/dist/commands/lib/index.js.map +0 -1
  190. package/apps/cli/dist/commands/lib/json.js.map +0 -1
  191. package/apps/cli/dist/commands/lib/local-daemon.js.map +0 -1
  192. package/apps/cli/dist/commands/lib/loop-store.js.map +0 -1
  193. package/apps/cli/dist/commands/lib/paths.js.map +0 -1
  194. package/apps/cli/dist/commands/lib/relay-http.js.map +0 -1
  195. package/apps/cli/dist/commands/lib/scope.js.map +0 -1
  196. package/apps/cli/dist/commands/lib/session-output.js.map +0 -1
  197. package/apps/cli/dist/commands/lib/session-view.js.map +0 -1
  198. package/apps/cli/dist/commands/lib/status.js.map +0 -1
  199. package/apps/cli/dist/commands/lib/types.js.map +0 -1
  200. package/apps/cli/dist/commands/lib/usage.js.map +0 -1
  201. package/apps/cli/dist/commands/lib/workspace.js.map +0 -1
  202. package/apps/cli/dist/commands/loop.js.map +0 -1
  203. package/apps/cli/dist/commands/machine.js.map +0 -1
  204. package/apps/cli/dist/commands/relay.js.map +0 -1
  205. package/apps/cli/dist/commands/remote.js.map +0 -1
  206. package/apps/cli/dist/commands/session.js.map +0 -1
  207. package/apps/cli/dist/commands/token.js.map +0 -1
  208. package/apps/cli/dist/commands/turn.js.map +0 -1
  209. package/apps/cli/dist/errors.js.map +0 -1
  210. package/apps/cli/dist/index.js.map +0 -1
  211. package/apps/daemon/dist/app.js.map +0 -1
  212. package/apps/daemon/dist/args.js.map +0 -1
  213. package/apps/daemon/dist/audit.js.map +0 -1
  214. package/apps/daemon/dist/cli.js.map +0 -1
  215. package/apps/daemon/dist/config.js.map +0 -1
  216. package/apps/daemon/dist/errors.js.map +0 -1
  217. package/apps/daemon/dist/loop/runner.js.map +0 -1
  218. package/apps/daemon/dist/loop/store.js.map +0 -1
  219. package/apps/daemon/dist/pair.js.map +0 -1
  220. package/apps/daemon/dist/paths.js.map +0 -1
  221. package/apps/daemon/dist/process.js.map +0 -1
  222. package/apps/daemon/dist/relay/connection.js.map +0 -1
  223. package/apps/daemon/dist/relay/devtools.js.map +0 -1
  224. package/apps/daemon/dist/relay/register.js.map +0 -1
  225. package/apps/daemon/dist/relay/send.js.map +0 -1
  226. package/apps/daemon/dist/relay-http.js.map +0 -1
  227. package/apps/daemon/dist/runtime/external-provider.js.map +0 -1
  228. package/apps/daemon/dist/runtime.js.map +0 -1
  229. package/apps/daemon/dist/session/create-session.js.map +0 -1
  230. package/apps/daemon/dist/session/directory.js.map +0 -1
  231. package/apps/daemon/dist/session/events.js.map +0 -1
  232. package/apps/daemon/dist/session/file-preview.js.map +0 -1
  233. package/apps/daemon/dist/session/lifecycle.js.map +0 -1
  234. package/apps/daemon/dist/session/metadata.js.map +0 -1
  235. package/apps/daemon/dist/session/primitives.js.map +0 -1
  236. package/apps/daemon/dist/session/prompt.js.map +0 -1
  237. package/apps/daemon/dist/session/runtime-handle.js.map +0 -1
  238. package/apps/daemon/dist/start.js.map +0 -1
  239. package/apps/daemon/dist/state.js.map +0 -1
  240. package/apps/daemon/dist/turn-coordinator.js.map +0 -1
  241. package/apps/daemon/dist/types.js.map +0 -1
  242. package/apps/daemon/dist/utils.js.map +0 -1
  243. package/apps/relay/dist/auth.js.map +0 -1
  244. package/apps/relay/dist/connections.js.map +0 -1
  245. package/apps/relay/dist/controller-handlers.js.map +0 -1
  246. package/apps/relay/dist/db.js.map +0 -1
  247. package/apps/relay/dist/errors.js.map +0 -1
  248. package/apps/relay/dist/http-routes.js.map +0 -1
  249. package/apps/relay/dist/http-schemas.js.map +0 -1
  250. package/apps/relay/dist/index.js.map +0 -1
  251. package/apps/relay/dist/machine-handlers.js.map +0 -1
  252. package/apps/relay/dist/projections.js.map +0 -1
  253. package/apps/relay/dist/relay-context.js.map +0 -1
  254. package/apps/relay/dist/repositories.js.map +0 -1
  255. package/apps/relay/dist/retention.js.map +0 -1
  256. package/apps/relay/dist/scope.js.map +0 -1
  257. package/apps/relay/dist/security.js.map +0 -1
  258. package/apps/relay/dist/types.js.map +0 -1
  259. package/apps/relay/dist/websocket.js.map +0 -1
  260. package/apps/relay/package.json +0 -29
  261. package/packages/agent-sdk/dist/index.d.ts.map +0 -1
  262. package/packages/agent-sdk/dist/index.js.map +0 -1
  263. package/packages/agent-sdk/package.json +0 -20
  264. package/packages/client/dist/account.d.ts.map +0 -1
  265. package/packages/client/dist/account.js.map +0 -1
  266. package/packages/client/dist/client.d.ts.map +0 -1
  267. package/packages/client/dist/client.js.map +0 -1
  268. package/packages/client/dist/errors.d.ts.map +0 -1
  269. package/packages/client/dist/errors.js.map +0 -1
  270. package/packages/client/dist/http.d.ts.map +0 -1
  271. package/packages/client/dist/http.js.map +0 -1
  272. package/packages/client/dist/index.d.ts.map +0 -1
  273. package/packages/client/dist/index.js.map +0 -1
  274. package/packages/client/dist/parsers.d.ts.map +0 -1
  275. package/packages/client/dist/parsers.js.map +0 -1
  276. package/packages/client/dist/transport.d.ts.map +0 -1
  277. package/packages/client/dist/transport.js.map +0 -1
  278. package/packages/client/dist/types.d.ts.map +0 -1
  279. package/packages/client/dist/types.js.map +0 -1
  280. package/packages/client/dist/validation.d.ts.map +0 -1
  281. package/packages/client/dist/validation.js.map +0 -1
  282. package/packages/client/package.json +0 -22
  283. package/packages/pie-provider/dist/index.d.ts.map +0 -1
  284. package/packages/pie-provider/dist/index.js.map +0 -1
  285. package/packages/pie-provider/package.json +0 -26
  286. package/packages/runtime/dist/index.d.ts.map +0 -1
  287. package/packages/runtime/dist/index.js.map +0 -1
  288. package/packages/runtime/package.json +0 -19
  289. package/packages/runtime-acpx/dist/index.d.ts.map +0 -1
  290. package/packages/runtime-acpx/dist/index.js.map +0 -1
  291. package/packages/runtime-acpx/package.json +0 -23
  292. package/packages/runtime-cli/dist/async-queue.d.ts.map +0 -1
  293. package/packages/runtime-cli/dist/async-queue.js.map +0 -1
  294. package/packages/runtime-cli/dist/claude-history.d.ts.map +0 -1
  295. package/packages/runtime-cli/dist/claude-history.js.map +0 -1
  296. package/packages/runtime-cli/dist/claude-json.d.ts.map +0 -1
  297. package/packages/runtime-cli/dist/claude-json.js.map +0 -1
  298. package/packages/runtime-cli/dist/claude-rename.d.ts.map +0 -1
  299. package/packages/runtime-cli/dist/claude-rename.js.map +0 -1
  300. package/packages/runtime-cli/dist/claude-session-store.d.ts.map +0 -1
  301. package/packages/runtime-cli/dist/claude-session-store.js.map +0 -1
  302. package/packages/runtime-cli/dist/claude-turn.d.ts.map +0 -1
  303. package/packages/runtime-cli/dist/claude-turn.js.map +0 -1
  304. package/packages/runtime-cli/dist/codex-app-server.d.ts.map +0 -1
  305. package/packages/runtime-cli/dist/codex-app-server.js.map +0 -1
  306. package/packages/runtime-cli/dist/codex-approvals.d.ts.map +0 -1
  307. package/packages/runtime-cli/dist/codex-approvals.js.map +0 -1
  308. package/packages/runtime-cli/dist/codex-history.d.ts.map +0 -1
  309. package/packages/runtime-cli/dist/codex-history.js.map +0 -1
  310. package/packages/runtime-cli/dist/codex-json-rpc.d.ts.map +0 -1
  311. package/packages/runtime-cli/dist/codex-json-rpc.js.map +0 -1
  312. package/packages/runtime-cli/dist/codex-lifecycle.d.ts.map +0 -1
  313. package/packages/runtime-cli/dist/codex-lifecycle.js.map +0 -1
  314. package/packages/runtime-cli/dist/codex-protocol.d.ts.map +0 -1
  315. package/packages/runtime-cli/dist/codex-protocol.js.map +0 -1
  316. package/packages/runtime-cli/dist/command-resolver.d.ts.map +0 -1
  317. package/packages/runtime-cli/dist/command-resolver.js.map +0 -1
  318. package/packages/runtime-cli/dist/history-merge.d.ts.map +0 -1
  319. package/packages/runtime-cli/dist/history-merge.js.map +0 -1
  320. package/packages/runtime-cli/dist/index.d.ts.map +0 -1
  321. package/packages/runtime-cli/dist/index.js.map +0 -1
  322. package/packages/runtime-cli/dist/permissions.d.ts.map +0 -1
  323. package/packages/runtime-cli/dist/permissions.js.map +0 -1
  324. package/packages/runtime-cli/dist/session-store.d.ts.map +0 -1
  325. package/packages/runtime-cli/dist/session-store.js.map +0 -1
  326. package/packages/runtime-cli/package.json +0 -22
  327. package/packages/shared/dist/args.d.ts.map +0 -1
  328. package/packages/shared/dist/args.js.map +0 -1
  329. package/packages/shared/dist/crypto.d.ts.map +0 -1
  330. package/packages/shared/dist/crypto.js.map +0 -1
  331. package/packages/shared/dist/ids.d.ts.map +0 -1
  332. package/packages/shared/dist/ids.js.map +0 -1
  333. package/packages/shared/dist/index.d.ts.map +0 -1
  334. package/packages/shared/dist/index.js.map +0 -1
  335. package/packages/shared/dist/protocol-schemas.d.ts.map +0 -1
  336. package/packages/shared/dist/protocol-schemas.js.map +0 -1
  337. package/packages/shared/dist/protocol-types.d.ts.map +0 -1
  338. package/packages/shared/dist/protocol-types.js.map +0 -1
  339. package/packages/shared/dist/protocol.d.ts.map +0 -1
  340. package/packages/shared/dist/protocol.js.map +0 -1
  341. package/packages/shared/dist/session-name.d.ts.map +0 -1
  342. package/packages/shared/dist/session-name.js.map +0 -1
  343. package/packages/shared/dist/session-state.d.ts.map +0 -1
  344. package/packages/shared/dist/session-state.js.map +0 -1
  345. package/packages/shared/package.json +0 -24
@@ -4,13 +4,18 @@ import { handleAccount } from "./account.js";
4
4
  import { handleCollect } from "./collect.js";
5
5
  import { handleConfig } from "./config.js";
6
6
  import { handleDaemon } from "./daemon.js";
7
+ import { handleGateway } from "./gateway.js";
7
8
  import { handleLoop } from "./loop.js";
8
9
  import { handleMachine } from "./machine.js";
10
+ import { handleMemory } from "./memory.js";
9
11
  import { handleRelay } from "./relay.js";
12
+ import { handleRelease } from "./release.js";
13
+ import { handleSchedule } from "./schedule.js";
10
14
  import { handleRemote } from "./remote.js";
11
15
  import { handleSession } from "./session.js";
12
16
  import { handleToken } from "./token.js";
13
17
  import { handleTurn } from "./turn.js";
18
+ import { handleWorkspace } from "./workspace.js";
14
19
  import { commandUsage, commandUsageText, handleCliError, parseCliFlags, skillText, startBootstrap, topLevelDoctor, topLevelStatus, usage, usageText } from "./lib/index.js";
15
20
  export { handleCliError };
16
21
  const domainHandlers = [
@@ -18,12 +23,17 @@ const domainHandlers = [
18
23
  handleConfig,
19
24
  handleRemote,
20
25
  handleToken,
26
+ handleGateway,
21
27
  handleLoop,
22
28
  handleDaemon,
23
29
  handleRelay,
30
+ handleRelease,
24
31
  handleMachine,
32
+ handleMemory,
33
+ handleSchedule,
25
34
  handleSession,
26
35
  handleTurn,
36
+ handleWorkspace,
27
37
  handleCollect,
28
38
  ];
29
39
  export async function main() {
@@ -1,6 +1,6 @@
1
1
  import os from "node:os";
2
2
  import path from "node:path";
3
- import { CliError, compactText, ControllerClient, configDir, configPath, daemonPidPath, deriveOrchestration, idleSessionStatuses, localDaemonStatus, ok, parsePairingClaimResponse, randomId, readConfig, readDaemonConfig, readLocalAuditLog, readRelayJson, redactedDaemonConfig, requirePositional, requireRelayUrl, requireString, showMachine, spawnDaemonStart, stopLocalDaemon, throwRelayHttpError, wantsJson, writeDaemonConfig } from "./lib/index.js";
3
+ import { CliError, compactText, ControllerClient, configDir, configPath, daemonPidPath, deriveOrchestration, ensureDaemonRunning, idleSessionStatuses, localDaemonStatus, ok, parsePairingClaimResponse, randomId, readConfig, readDaemonConfig, readLocalAuditLog, readRelayJson, redactedDaemonConfig, requirePositional, requireRelayUrl, requireString, restartDaemonForNewConfig, showMachine, spawnDaemonStart, stopLocalDaemon, throwRelayHttpError, waitForMachineProjection, wantsJson, writeDaemonConfig } from "./lib/index.js";
4
4
  export async function handleDaemon({ domain, action, flags }) {
5
5
  if (domain === "daemon" && action === "pair") {
6
6
  const relayUrl = requireRelayUrl(flags);
@@ -25,11 +25,87 @@ export async function handleDaemon({ domain, action, flags }) {
25
25
  machineToken: claimed.machineToken,
26
26
  accountSecret,
27
27
  };
28
+ const localBefore = await localDaemonStatus();
28
29
  const daemonConfigPath = await writeDaemonConfig(daemonConfig);
29
- ok("daemon.pair", {
30
+ let daemonStart = { skipped: true, reason: "not requested" };
31
+ let projection = { checked: false, reason: "not checked" };
32
+ let startError;
33
+ if (flags["no-start"] === true) {
34
+ daemonStart = { skipped: true, reason: "--no-start" };
35
+ projection = { checked: false, reason: "--no-start" };
36
+ }
37
+ else {
38
+ try {
39
+ const startResult = localBefore.running
40
+ ? await restartDaemonForNewConfig(relayUrl)
41
+ : await ensureDaemonRunning(relayUrl);
42
+ daemonStart = {
43
+ skipped: false,
44
+ restarted: localBefore.running,
45
+ local: startResult.local,
46
+ started: startResult.started,
47
+ ...(startResult.startedPid ? { startedPid: startResult.startedPid } : {}),
48
+ ...("stopped" in startResult ? { stop: startResult.stopped } : {}),
49
+ };
50
+ try {
51
+ const controllerConfig = await readConfig({ relay: relayUrl });
52
+ const machine = await waitForMachineProjection(new ControllerClient(controllerConfig), claimed.machineId, 10_000);
53
+ projection = {
54
+ checked: true,
55
+ online: machine?.online === true,
56
+ machineId: claimed.machineId,
57
+ ...(machine?.lastSeen ? { lastSeen: machine.lastSeen } : {}),
58
+ };
59
+ }
60
+ catch (error) {
61
+ projection = {
62
+ checked: false,
63
+ reason: error instanceof Error ? error.message : String(error),
64
+ };
65
+ }
66
+ }
67
+ catch (error) {
68
+ const code = error instanceof CliError ? error.code : "DAEMON_START_FAILED";
69
+ startError = { code, message: error instanceof Error ? error.message : String(error) };
70
+ process.exitCode = 1;
71
+ daemonStart = { skipped: true, reason: "start failed" };
72
+ projection = { checked: false, reason: "daemon did not start" };
73
+ }
74
+ }
75
+ const data = {
30
76
  path: daemonConfigPath,
31
77
  config: redactedDaemonConfig(daemonConfig),
32
- });
78
+ daemon: daemonStart,
79
+ projection,
80
+ ...(startError ? { error: startError } : {}),
81
+ };
82
+ const commandOk = !startError && !(projection.checked && !projection.online);
83
+ if (!commandOk)
84
+ process.exitCode = 1;
85
+ if (!wantsJson(flags)) {
86
+ console.log(`Paired ${machineName} with ${relayUrl}`);
87
+ console.log(`Config: ${daemonConfigPath}`);
88
+ if (startError) {
89
+ console.error(`Daemon start failed: ${startError.message}`);
90
+ }
91
+ else if (daemonStart.skipped) {
92
+ console.log(`Daemon start: skipped (${daemonStart.reason})`);
93
+ }
94
+ else {
95
+ console.log(`${daemonStart.restarted ? "Restarted" : "Started"} daemon${daemonStart.startedPid ? ` pid ${daemonStart.startedPid}` : ""}`);
96
+ }
97
+ if (projection.checked) {
98
+ console.log(`Relay projection: ${projection.online ? "online" : "offline"} (${projection.machineId})`);
99
+ if (!projection.online) {
100
+ console.log("If this stays offline, run happy-elves daemon logs --tail 100 and happy-elves daemon status --local.");
101
+ }
102
+ }
103
+ else {
104
+ console.log(`Relay projection: not checked (${projection.reason})`);
105
+ }
106
+ return true;
107
+ }
108
+ ok("daemon.pair", data, { machineId: claimed.machineId }, commandOk);
33
109
  return true;
34
110
  }
35
111
  if (domain === "daemon" && action === "doctor") {
@@ -57,9 +133,13 @@ export async function handleDaemon({ domain, action, flags }) {
57
133
  for (const check of checks) {
58
134
  console.log(`${check.ok ? "ok" : "fail"} ${check.name}: ${check.message}`);
59
135
  }
136
+ if (!data.ok)
137
+ process.exitCode = 1;
60
138
  return true;
61
139
  }
62
- ok("daemon.doctor", data);
140
+ if (!data.ok)
141
+ process.exitCode = 1;
142
+ ok("daemon.doctor", data, {}, data.ok);
63
143
  return true;
64
144
  }
65
145
  if (domain === "daemon" && action === "config") {
@@ -114,6 +194,14 @@ export async function handleDaemon({ domain, action, flags }) {
114
194
  if (domain === "daemon" && action === "start") {
115
195
  const status = await localDaemonStatus();
116
196
  if (status.running) {
197
+ const existingConfig = await readDaemonConfig();
198
+ if (typeof flags.relay === "string")
199
+ existingConfig.relayUrl = requireRelayUrl(flags);
200
+ const restarted = await ensureDaemonRunning(existingConfig.relayUrl);
201
+ if (restarted.started) {
202
+ ok("daemon.start", { ...restarted.local, started: true, startedPid: restarted.startedPid, restartedForChangedConfig: true });
203
+ return true;
204
+ }
117
205
  ok("daemon.start", { ...status, started: false });
118
206
  return true;
119
207
  }
@@ -0,0 +1,2 @@
1
+ import type { CommandInput } from "./command.js";
2
+ export declare function handleGateway({ domain, action, positional, flags }: CommandInput): Promise<boolean>;
@@ -0,0 +1,410 @@
1
+ import { createHash } from "node:crypto";
2
+ import { createServer } from "node:http";
3
+ import { encryptJson } from "../../../../packages/shared/dist/index.js";
4
+ import { CliError, ControllerClient, ok, readConfig, readGatewayStore, requireString, updateGatewayStore, wantsJson, } from "./lib/index.js";
5
+ export async function handleGateway({ domain, action, positional, flags }) {
6
+ if (domain !== "gateway")
7
+ return false;
8
+ if (action === "enable") {
9
+ const config = await readConfig(flags);
10
+ const client = new ControllerClient(config);
11
+ const type = gatewayChannelType(typeof flags.channel === "string" ? flags.channel : "fake");
12
+ const id = gatewayChannelId(flags, positional[0], type);
13
+ const targetMachineId = requireString(flags, "machine");
14
+ const targetCwd = typeof flags.cwd === "string" ? flags.cwd : undefined;
15
+ const targetSessionId = typeof flags.session === "string" ? flags.session : undefined;
16
+ if (!targetCwd && !targetSessionId)
17
+ throw new CliError("Gateway enable requires --cwd or --session", "MISSING_ARGUMENT");
18
+ const defaultAgent = typeof flags.agent === "string" ? flags.agent : "codex";
19
+ const defaultModel = typeof flags.model === "string" ? flags.model : undefined;
20
+ const appId = typeof flags["app-id"] === "string" ? flags["app-id"] : undefined;
21
+ const appSecret = flags["app-secret-stdin"] === true ? await readSecretFromStdin() : undefined;
22
+ const domainValue = typeof flags.domain === "string" ? flags.domain : "feishu";
23
+ if (domainValue !== "feishu" && domainValue !== "lark")
24
+ throw new CliError("Gateway --domain must be feishu or lark", "INVALID_ARGUMENT");
25
+ const inboundMode = typeof flags.inbound === "string" ? flags.inbound : "mention";
26
+ if (inboundMode !== "mention" && inboundMode !== "all")
27
+ throw new CliError("Gateway --inbound must be mention or all", "INVALID_ARGUMENT");
28
+ const reactionEmoji = typeof flags["reaction-emoji"] === "string" ? flags["reaction-emoji"] : "Typing";
29
+ const allowedChatIds = csvFlag(flags["allow-chat"]);
30
+ const allowedSenderIds = csvFlag(flags["allow-sender"]);
31
+ const allowAnySender = flags["allow-any-sender"] === true;
32
+ if (type === "lark" && (!appId || !appSecret)) {
33
+ throw new CliError("Lark gateway requires --app-id and --app-secret-stdin; appSecret is stored only in the target daemon config.", "MISSING_ARGUMENT");
34
+ }
35
+ if (type === "lark" && !allowAnySender && allowedChatIds.length === 0 && allowedSenderIds.length === 0) {
36
+ throw new CliError("Lark gateway requires --allow-any-sender or at least one --allow-chat/--allow-sender policy.", "MISSING_ARGUMENT");
37
+ }
38
+ if (type === "lark" && (typeof flags.token === "string" || typeof flags.secret === "string")) {
39
+ throw new CliError("Lark gateway no longer accepts --token/--secret; use --app-id and --app-secret-stdin.", "INVALID_ARGUMENT");
40
+ }
41
+ const result = await client.gateway({
42
+ machineId: targetMachineId,
43
+ action: "upsert",
44
+ channel: {
45
+ id,
46
+ type,
47
+ enabled: true,
48
+ targetMachineId,
49
+ targetSessionId,
50
+ targetCwd,
51
+ defaultAgent,
52
+ ...(defaultModel ? { defaultModel } : {}),
53
+ ...(type === "lark" ? {
54
+ domain: domainValue,
55
+ appId,
56
+ appSecret,
57
+ inboundMode,
58
+ allowAnySender,
59
+ ...(allowedChatIds.length > 0 ? { allowedChatIds } : {}),
60
+ ...(allowedSenderIds.length > 0 ? { allowedSenderIds } : {}),
61
+ processingReaction: {
62
+ enabled: flags["disable-reaction"] !== true,
63
+ emojiType: reactionEmoji,
64
+ },
65
+ } : {}),
66
+ },
67
+ });
68
+ ok("gateway.enable", { channel: result.channel });
69
+ return true;
70
+ }
71
+ if (action === "disable") {
72
+ const config = await readConfig(flags);
73
+ const client = new ControllerClient(config);
74
+ const machineId = await resolveGatewayMachineId(client, flags);
75
+ const id = gatewayChannelId(flags, positional[0], "fake");
76
+ const result = await client.gateway({ machineId, action: "disable", channelId: id });
77
+ ok("gateway.disable", { channel: result.channel });
78
+ return true;
79
+ }
80
+ if (action === "status") {
81
+ const config = await readConfig(flags);
82
+ const client = new ControllerClient(config);
83
+ const machineId = await resolveGatewayMachineId(client, flags);
84
+ const result = await client.gateway({ machineId, action: "list" });
85
+ const includeDebug = flags["include-debug"] === true;
86
+ const channels = (result.channels ?? []).filter((channel) => includeDebug || channel.type === "lark");
87
+ const data = { machineId, channels };
88
+ if (!wantsJson(flags)) {
89
+ if (data.channels.length === 0) {
90
+ console.log(includeDebug ? "No gateways configured." : "No product gateways configured.");
91
+ return true;
92
+ }
93
+ for (const channel of data.channels) {
94
+ const target = channel.targetSessionId ? `session:${channel.targetSessionId}` : channel.targetCwd ?? "";
95
+ console.log(`${channel.id} ${channel.type} ${channel.enabled ? "enabled" : "disabled"} ${target} ${channel.listening ? "listening" : "stopped"}`);
96
+ }
97
+ return true;
98
+ }
99
+ ok("gateway.status", data);
100
+ return true;
101
+ }
102
+ if (action === "test") {
103
+ const config = await readConfig(flags);
104
+ const client = new ControllerClient(config);
105
+ const machineId = await resolveGatewayMachineId(client, flags);
106
+ const channelId = gatewayChannelId(flags, positional[0], "fake");
107
+ const externalConversationId = requireString(flags, "conversation");
108
+ const externalMessageId = requireString(flags, "message-id");
109
+ const text = requireString(flags, "text");
110
+ const result = await client.gateway({
111
+ machineId,
112
+ action: "test",
113
+ channelId,
114
+ externalConversationId,
115
+ externalMessageId,
116
+ text,
117
+ });
118
+ ok("gateway.test", result);
119
+ return true;
120
+ }
121
+ if (action === "serve") {
122
+ const config = await readConfig(flags);
123
+ const port = Number(typeof flags.port === "string" ? flags.port : "8789");
124
+ if (!Number.isInteger(port) || port < 1 || port > 65_535)
125
+ throw new CliError("Invalid --port", "INVALID_ARGUMENT");
126
+ const host = typeof flags.host === "string" ? flags.host : "127.0.0.1";
127
+ const server = createServer((request, response) => {
128
+ void handleGatewayHttpRequest({ request, response, config, host, port }).catch((error) => {
129
+ writeGatewayHttpJson(response, error instanceof CliError ? 400 : 500, {
130
+ ok: false,
131
+ error: {
132
+ code: error instanceof CliError ? error.code : "GATEWAY_REQUEST_FAILED",
133
+ message: error instanceof Error ? error.message : String(error),
134
+ },
135
+ });
136
+ });
137
+ });
138
+ await new Promise((resolve) => server.listen(port, host, resolve));
139
+ if (wantsJson(flags)) {
140
+ console.log(JSON.stringify({ ok: true, type: "gateway.serve", data: { host, port } }, null, 2));
141
+ }
142
+ else {
143
+ console.log(`Gateway listening on http://${host}:${port}`);
144
+ }
145
+ await new Promise((resolve) => {
146
+ const stop = () => server.close(() => resolve());
147
+ process.once("SIGTERM", stop);
148
+ process.once("SIGINT", stop);
149
+ });
150
+ return true;
151
+ }
152
+ return false;
153
+ }
154
+ async function handleGatewayHttpRequest(input) {
155
+ const { request, response, config } = input;
156
+ if (request.method === "GET" && request.url === "/health") {
157
+ writeGatewayHttpJson(response, 200, { ok: true, service: "happy-elves-gateway" });
158
+ return;
159
+ }
160
+ const url = new URL(request.url ?? "/", `http://${input.host}:${input.port}`);
161
+ const match = /^\/gateway\/([^/]+)$/.exec(url.pathname);
162
+ if (request.method !== "POST" || !match) {
163
+ writeGatewayHttpJson(response, 404, { ok: false, error: { code: "NOT_FOUND", message: "Gateway route not found" } });
164
+ return;
165
+ }
166
+ const channelId = decodeURIComponent(match[1]);
167
+ const store = await readGatewayStore();
168
+ const channel = mustFindEnabledChannel(store, channelId);
169
+ const body = await readJsonRequestBody(request);
170
+ if (channel.type === "lark" && isLarkChallenge(body)) {
171
+ writeGatewayHttpJson(response, 200, { challenge: body.challenge });
172
+ return;
173
+ }
174
+ assertGatewayToken(channel, request, body);
175
+ const message = channel.type === "lark" ? larkMessageFromBody(body) : fakeGatewayMessageFromBody(body);
176
+ const result = await deliverGatewayMessage({
177
+ store,
178
+ channel,
179
+ client: new ControllerClient(config),
180
+ accountSecret: config.accountSecret,
181
+ externalConversationId: message.externalConversationId,
182
+ externalMessageId: message.externalMessageId,
183
+ text: message.text,
184
+ });
185
+ writeGatewayHttpJson(response, 200, { ok: true, type: "gateway.deliver", data: result });
186
+ }
187
+ async function deliverGatewayMessage(input) {
188
+ const { channel, client, accountSecret, externalConversationId, externalMessageId, text } = input;
189
+ let store = input.store;
190
+ let mapping = store.mappings.find((item) => item.channelId === channel.id && item.externalConversationId === externalConversationId);
191
+ const createRequestId = stableGatewayId("gw_create", channel.id, externalConversationId);
192
+ if (!mapping) {
193
+ const create = await client.sendCommand({
194
+ type: "controller:createSession",
195
+ requestId: createRequestId,
196
+ machineId: channel.targetMachineId,
197
+ agent: channel.defaultAgent,
198
+ cwd: channel.targetCwd,
199
+ name: `Gateway ${channel.type}: ${externalConversationId}`,
200
+ encryptedMetadata: await encryptJson(accountSecret, `gateway:create:${createRequestId}`, {
201
+ createdFrom: "gateway",
202
+ gateway: {
203
+ channelId: channel.id,
204
+ channelType: channel.type,
205
+ externalConversationId,
206
+ },
207
+ agent: channel.defaultAgent,
208
+ cwd: channel.targetCwd,
209
+ name: `Gateway ${channel.type}: ${externalConversationId}`,
210
+ }),
211
+ }, false, 15_000);
212
+ if (!create.sessionId)
213
+ throw new CliError("Gateway session admission did not return a sessionId", "GATEWAY_CREATE_FAILED");
214
+ const now = new Date().toISOString();
215
+ mapping = {
216
+ channelId: channel.id,
217
+ externalConversationId,
218
+ sessionId: create.sessionId,
219
+ createRequestId,
220
+ createdAt: now,
221
+ updatedAt: now,
222
+ };
223
+ store = await updateGatewayStore((current) => ({
224
+ ...current,
225
+ mappings: [mapping, ...current.mappings.filter((item) => !(item.channelId === channel.id && item.externalConversationId === externalConversationId))],
226
+ }));
227
+ }
228
+ const requestId = stableGatewayId("gw_msg", channel.id, externalConversationId, externalMessageId);
229
+ const turnId = stableGatewayId("turn_gw", channel.id, externalConversationId, externalMessageId);
230
+ const sent = await client.sendCommand({
231
+ type: "controller:prompt",
232
+ requestId,
233
+ sessionId: mapping.sessionId,
234
+ turnId,
235
+ encryptedPrompt: await encryptJson(accountSecret, `gateway:prompt:${mapping.sessionId}:${turnId}`, {
236
+ type: "user_prompt",
237
+ text,
238
+ }),
239
+ permissionMode: "approve-reads",
240
+ }, false, 15_000);
241
+ const deliveredAt = new Date().toISOString();
242
+ const lastDeliveredMessage = {
243
+ externalConversationId,
244
+ externalMessageId,
245
+ requestId,
246
+ sessionId: mapping.sessionId,
247
+ turnId: sent.turnId ?? turnId,
248
+ deliveredAt,
249
+ };
250
+ await updateGatewayStore((current) => ({
251
+ ...current,
252
+ channels: current.channels.map((item) => item.id === channel.id ? {
253
+ ...item,
254
+ lastError: undefined,
255
+ lastDeliveredMessage,
256
+ updatedAt: deliveredAt,
257
+ } : item),
258
+ mappings: current.mappings.map((item) => item.channelId === channel.id && item.externalConversationId === externalConversationId
259
+ ? { ...item, sessionId: mapping.sessionId, createRequestId, updatedAt: deliveredAt }
260
+ : item),
261
+ }));
262
+ return {
263
+ channelId: channel.id,
264
+ externalConversationId,
265
+ externalMessageId,
266
+ sessionId: mapping.sessionId,
267
+ requestId,
268
+ turnId: sent.turnId ?? turnId,
269
+ admission: sent.admission,
270
+ dispatch: sent.dispatch,
271
+ };
272
+ }
273
+ function stableGatewayId(prefix, ...parts) {
274
+ const hash = createHash("sha256").update(parts.join("\0")).digest("base64url").slice(0, 32);
275
+ return `${prefix}_${hash}`;
276
+ }
277
+ async function readJsonRequestBody(request) {
278
+ const chunks = [];
279
+ let size = 0;
280
+ for await (const chunk of request) {
281
+ const buffer = Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk);
282
+ size += buffer.length;
283
+ if (size > 1024 * 1024)
284
+ throw new CliError("Gateway request body is too large", "REQUEST_TOO_LARGE");
285
+ chunks.push(buffer);
286
+ }
287
+ try {
288
+ return JSON.parse(Buffer.concat(chunks).toString("utf8") || "{}");
289
+ }
290
+ catch {
291
+ throw new CliError("Gateway request body must be JSON", "INVALID_JSON");
292
+ }
293
+ }
294
+ function writeGatewayHttpJson(response, statusCode, body) {
295
+ response.writeHead(statusCode, { "content-type": "application/json; charset=utf-8" });
296
+ response.end(`${JSON.stringify(body)}\n`);
297
+ }
298
+ function isRecord(value) {
299
+ return Boolean(value) && typeof value === "object" && !Array.isArray(value);
300
+ }
301
+ function isLarkChallenge(value) {
302
+ return isRecord(value) && typeof value.challenge === "string";
303
+ }
304
+ function assertGatewayToken(channel, request, body) {
305
+ if (!channel.localToken)
306
+ return;
307
+ const auth = request.headers.authorization;
308
+ const bearer = typeof auth === "string" && auth.startsWith("Bearer ") ? auth.slice("Bearer ".length) : undefined;
309
+ const record = isRecord(body) ? body : {};
310
+ const header = isRecord(record.header) ? record.header : {};
311
+ const token = bearer ?? stringField(record, "token") ?? stringField(header, "token") ?? headerValue(request, "x-happy-elves-token");
312
+ if (token !== channel.localToken)
313
+ throw new CliError("Gateway token is invalid", "GATEWAY_TOKEN_INVALID");
314
+ }
315
+ function headerValue(request, key) {
316
+ const value = request.headers[key.toLowerCase()];
317
+ return typeof value === "string" ? value : undefined;
318
+ }
319
+ function fakeGatewayMessageFromBody(body) {
320
+ const record = isRecord(body) ? body : {};
321
+ const externalConversationId = stringField(record, "externalConversationId") ?? stringField(record, "conversationId");
322
+ const externalMessageId = stringField(record, "externalMessageId") ?? stringField(record, "messageId");
323
+ const text = stringField(record, "text");
324
+ if (!externalConversationId || !externalMessageId || !text) {
325
+ throw new CliError("Fake gateway body requires conversationId, messageId, and text", "GATEWAY_MESSAGE_INVALID");
326
+ }
327
+ return { externalConversationId, externalMessageId, text };
328
+ }
329
+ function larkMessageFromBody(body) {
330
+ const record = isRecord(body) ? body : {};
331
+ const event = isRecord(record.event) ? record.event : record;
332
+ const message = isRecord(event.message) ? event.message : event;
333
+ const sender = isRecord(event.sender) ? event.sender : {};
334
+ const senderId = isRecord(sender.sender_id) ? sender.sender_id : {};
335
+ const externalMessageId = stringField(message, "message_id") ?? stringField(event, "message_id") ?? stringField(record, "uuid");
336
+ const externalConversationId = stringField(message, "chat_id") ??
337
+ stringField(event, "chat_id") ??
338
+ stringField(event, "open_chat_id") ??
339
+ stringField(senderId, "open_id");
340
+ const text = larkTextFromContent(message.content) ?? stringField(message, "text");
341
+ if (!externalConversationId || !externalMessageId || !text) {
342
+ throw new CliError("Lark gateway event is not a supported text message", "GATEWAY_MESSAGE_INVALID");
343
+ }
344
+ return { externalConversationId, externalMessageId, text };
345
+ }
346
+ function larkTextFromContent(content) {
347
+ if (typeof content === "string") {
348
+ try {
349
+ const parsed = JSON.parse(content);
350
+ if (isRecord(parsed))
351
+ return stringField(parsed, "text");
352
+ }
353
+ catch {
354
+ return content;
355
+ }
356
+ }
357
+ if (isRecord(content))
358
+ return stringField(content, "text");
359
+ return undefined;
360
+ }
361
+ function stringField(record, key) {
362
+ const value = record[key];
363
+ return typeof value === "string" && value.length > 0 ? value : undefined;
364
+ }
365
+ function gatewayChannelType(value) {
366
+ if (value === "fake" || value === "lark")
367
+ return value;
368
+ throw new CliError("Gateway channel must be fake or lark", "INVALID_ARGUMENT");
369
+ }
370
+ function gatewayChannelId(flags, positional, fallbackType) {
371
+ return positional || (typeof flags.name === "string" ? flags.name : undefined) || (typeof flags.channel === "string" ? flags.channel : fallbackType);
372
+ }
373
+ function csvFlag(value) {
374
+ if (typeof value !== "string")
375
+ return [];
376
+ return value.split(",").map((item) => item.trim()).filter(Boolean);
377
+ }
378
+ async function readSecretFromStdin() {
379
+ let value = "";
380
+ process.stdin.setEncoding("utf8");
381
+ for await (const chunk of process.stdin) {
382
+ value += chunk;
383
+ }
384
+ const secret = value.trim();
385
+ if (!secret)
386
+ throw new CliError("--app-secret-stdin was set but stdin was empty", "MISSING_ARGUMENT");
387
+ return secret;
388
+ }
389
+ async function resolveGatewayMachineId(client, flags) {
390
+ if (typeof flags.machine === "string" && flags.machine.length > 0)
391
+ return flags.machine;
392
+ const snapshot = await client.snapshot();
393
+ const machine = snapshot.machines.find((item) => item.online) ?? snapshot.machines[0];
394
+ if (!machine)
395
+ throw new CliError("No daemon machine is available; pass --machine <machineId>", "MACHINE_NOT_FOUND");
396
+ return machine.id;
397
+ }
398
+ function mustFindChannel(store, id) {
399
+ const channel = store.channels.find((item) => item.id === id);
400
+ if (!channel)
401
+ throw new CliError("Gateway channel not found", "GATEWAY_NOT_FOUND");
402
+ return channel;
403
+ }
404
+ function mustFindEnabledChannel(store, id) {
405
+ const channel = mustFindChannel(store, id);
406
+ if (!channel.enabled)
407
+ throw new CliError("Gateway channel is disabled", "GATEWAY_DISABLED");
408
+ return channel;
409
+ }
410
+ //# sourceMappingURL=gateway.js.map