@cydm/happy-elves 0.1.0-beta.2 → 0.1.0-beta.240

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 (316) hide show
  1. package/apps/cli/dist/commands/account.d.ts +2 -0
  2. package/apps/cli/dist/commands/account.js +52 -0
  3. package/apps/cli/dist/commands/app.d.ts +3 -0
  4. package/apps/cli/dist/commands/app.js +108 -0
  5. package/apps/cli/dist/commands/collect.d.ts +2 -0
  6. package/apps/cli/dist/commands/collect.js +31 -0
  7. package/apps/cli/dist/commands/command.d.ts +6 -0
  8. package/apps/cli/dist/commands/command.js +2 -0
  9. package/apps/cli/dist/commands/config.d.ts +2 -0
  10. package/apps/cli/dist/commands/config.js +31 -0
  11. package/apps/cli/dist/commands/daemon.d.ts +2 -0
  12. package/apps/cli/dist/commands/daemon.js +307 -0
  13. package/apps/cli/dist/commands/gateway.d.ts +2 -0
  14. package/apps/cli/dist/commands/gateway.js +410 -0
  15. package/apps/cli/dist/commands/lib/args.d.ts +4 -0
  16. package/apps/cli/dist/commands/lib/args.js +119 -0
  17. package/apps/cli/dist/commands/lib/audit.d.ts +1 -0
  18. package/apps/cli/dist/commands/lib/audit.js +26 -0
  19. package/apps/cli/dist/commands/lib/bootstrap-config.d.ts +28 -0
  20. package/apps/cli/dist/commands/lib/bootstrap-config.js +150 -0
  21. package/apps/cli/dist/commands/lib/bootstrap-daemon.d.ts +15 -0
  22. package/apps/cli/dist/commands/lib/bootstrap-daemon.js +46 -0
  23. package/apps/cli/dist/commands/lib/bootstrap-output.d.ts +18 -0
  24. package/apps/cli/dist/commands/lib/bootstrap-output.js +40 -0
  25. package/apps/cli/dist/commands/lib/bootstrap.d.ts +1 -0
  26. package/apps/cli/dist/commands/lib/bootstrap.js +96 -0
  27. package/apps/cli/dist/commands/lib/config.d.ts +18 -0
  28. package/apps/cli/dist/commands/lib/config.js +149 -0
  29. package/apps/cli/dist/commands/lib/doctor.d.ts +12 -0
  30. package/apps/cli/dist/commands/lib/doctor.js +314 -0
  31. package/apps/cli/dist/commands/lib/exit.d.ts +1 -0
  32. package/apps/cli/dist/commands/lib/exit.js +132 -0
  33. package/apps/cli/dist/commands/lib/gateway-store.d.ts +38 -0
  34. package/apps/cli/dist/commands/lib/gateway-store.js +33 -0
  35. package/apps/cli/dist/commands/lib/index.d.ts +26 -0
  36. package/apps/cli/dist/commands/lib/index.js +27 -0
  37. package/apps/cli/dist/commands/lib/json.d.ts +5 -0
  38. package/apps/cli/dist/commands/lib/json.js +20 -0
  39. package/apps/cli/dist/commands/lib/local-daemon.d.ts +14 -0
  40. package/apps/cli/dist/commands/lib/local-daemon.js +147 -0
  41. package/apps/cli/dist/commands/lib/loop-store.d.ts +5 -0
  42. package/apps/cli/dist/commands/lib/loop-store.js +78 -0
  43. package/apps/cli/dist/commands/lib/paths.d.ts +10 -0
  44. package/apps/cli/dist/commands/lib/paths.js +15 -0
  45. package/apps/cli/dist/commands/lib/relay-db-audit.d.ts +37 -0
  46. package/apps/cli/dist/commands/lib/relay-db-audit.js +300 -0
  47. package/apps/cli/dist/commands/lib/relay-http.d.ts +18 -0
  48. package/apps/cli/dist/commands/lib/relay-http.js +102 -0
  49. package/apps/cli/dist/commands/lib/scope.d.ts +17 -0
  50. package/apps/cli/dist/commands/lib/scope.js +100 -0
  51. package/apps/cli/dist/commands/lib/session-output.d.ts +73 -0
  52. package/apps/cli/dist/commands/lib/session-output.js +425 -0
  53. package/apps/cli/dist/commands/lib/session-view.d.ts +80 -0
  54. package/apps/cli/dist/commands/lib/session-view.js +197 -0
  55. package/apps/cli/dist/commands/lib/status.d.ts +1 -0
  56. package/apps/cli/dist/commands/lib/status.js +67 -0
  57. package/apps/cli/dist/commands/lib/types.d.ts +82 -0
  58. package/apps/cli/dist/commands/lib/types.js +2 -0
  59. package/apps/cli/dist/commands/lib/usage.d.ts +5 -0
  60. package/apps/cli/dist/commands/lib/usage.js +330 -0
  61. package/apps/cli/dist/commands/lib/workspace.d.ts +25 -0
  62. package/apps/cli/dist/commands/lib/workspace.js +71 -0
  63. package/apps/cli/dist/commands/loop.d.ts +2 -0
  64. package/apps/cli/dist/commands/loop.js +165 -0
  65. package/apps/cli/dist/commands/machine.d.ts +2 -0
  66. package/apps/cli/dist/commands/machine.js +302 -0
  67. package/apps/cli/dist/commands/memory.d.ts +2 -0
  68. package/apps/cli/dist/commands/memory.js +178 -0
  69. package/apps/cli/dist/commands/relay.d.ts +2 -0
  70. package/apps/cli/dist/commands/relay.js +88 -0
  71. package/apps/cli/dist/commands/remote.d.ts +2 -0
  72. package/apps/cli/dist/commands/remote.js +151 -0
  73. package/apps/cli/dist/commands/schedule.d.ts +2 -0
  74. package/apps/cli/dist/commands/schedule.js +228 -0
  75. package/apps/cli/dist/commands/session.d.ts +2 -0
  76. package/apps/cli/dist/commands/session.js +748 -0
  77. package/apps/cli/dist/commands/token.d.ts +2 -0
  78. package/apps/cli/dist/commands/token.js +51 -0
  79. package/apps/cli/dist/commands/turn.d.ts +2 -0
  80. package/apps/cli/dist/commands/turn.js +449 -0
  81. package/apps/cli/dist/commands/workspace.d.ts +2 -0
  82. package/apps/cli/dist/commands/workspace.js +65 -0
  83. package/apps/cli/dist/errors.d.ts +4 -0
  84. package/apps/cli/dist/errors.js +9 -0
  85. package/apps/cli/dist/index.js +2 -1873
  86. package/apps/cli/package.json +6 -0
  87. package/apps/daemon/dist/app.d.ts +2 -0
  88. package/apps/daemon/dist/app.js +118 -0
  89. package/apps/daemon/dist/args.d.ts +2 -0
  90. package/apps/daemon/dist/args.js +15 -0
  91. package/apps/daemon/dist/audit.d.ts +9 -0
  92. package/apps/daemon/dist/audit.js +51 -0
  93. package/apps/daemon/dist/cli.js +2 -1775
  94. package/apps/daemon/dist/config.d.ts +8 -0
  95. package/apps/daemon/dist/config.js +91 -0
  96. package/apps/daemon/dist/errors.d.ts +6 -0
  97. package/apps/daemon/dist/errors.js +22 -0
  98. package/apps/daemon/dist/gateway/adapters.d.ts +38 -0
  99. package/apps/daemon/dist/gateway/adapters.js +2 -0
  100. package/apps/daemon/dist/gateway/feishu.d.ts +65 -0
  101. package/apps/daemon/dist/gateway/feishu.js +493 -0
  102. package/apps/daemon/dist/gateway/format.d.ts +2 -0
  103. package/apps/daemon/dist/gateway/format.js +19 -0
  104. package/apps/daemon/dist/gateway/handler.d.ts +7 -0
  105. package/apps/daemon/dist/gateway/handler.js +125 -0
  106. package/apps/daemon/dist/gateway/runtime.d.ts +28 -0
  107. package/apps/daemon/dist/gateway/runtime.js +785 -0
  108. package/apps/daemon/dist/gateway/store.d.ts +92 -0
  109. package/apps/daemon/dist/gateway/store.js +268 -0
  110. package/apps/daemon/dist/loop/runner.d.ts +2 -0
  111. package/apps/daemon/dist/loop/runner.js +213 -0
  112. package/apps/daemon/dist/loop/store.d.ts +3 -0
  113. package/apps/daemon/dist/loop/store.js +64 -0
  114. package/apps/daemon/dist/memory/handler.d.ts +7 -0
  115. package/apps/daemon/dist/memory/handler.js +105 -0
  116. package/apps/daemon/dist/memory/manager.d.ts +44 -0
  117. package/apps/daemon/dist/memory/manager.js +359 -0
  118. package/apps/daemon/dist/pair.d.ts +1 -0
  119. package/apps/daemon/dist/pair.js +46 -0
  120. package/apps/daemon/dist/paths.d.ts +14 -0
  121. package/apps/daemon/dist/paths.js +20 -0
  122. package/apps/daemon/dist/process.d.ts +14 -0
  123. package/apps/daemon/dist/process.js +100 -0
  124. package/apps/daemon/dist/relay/admission.d.ts +28 -0
  125. package/apps/daemon/dist/relay/admission.js +31 -0
  126. package/apps/daemon/dist/relay/connection.d.ts +2 -0
  127. package/apps/daemon/dist/relay/connection.js +179 -0
  128. package/apps/daemon/dist/relay/devtools.d.ts +4 -0
  129. package/apps/daemon/dist/relay/devtools.js +355 -0
  130. package/apps/daemon/dist/relay/register.d.ts +2 -0
  131. package/apps/daemon/dist/relay/register.js +60 -0
  132. package/apps/daemon/dist/relay/send.d.ts +16 -0
  133. package/apps/daemon/dist/relay/send.js +218 -0
  134. package/apps/daemon/dist/relay-http.d.ts +8 -0
  135. package/apps/daemon/dist/relay-http.js +71 -0
  136. package/apps/daemon/dist/runtime/external-provider.d.ts +20 -0
  137. package/apps/daemon/dist/runtime/external-provider.js +878 -0
  138. package/apps/daemon/dist/runtime.d.ts +12 -0
  139. package/apps/daemon/dist/runtime.js +79 -0
  140. package/apps/daemon/dist/schedule/handler.d.ts +7 -0
  141. package/apps/daemon/dist/schedule/handler.js +134 -0
  142. package/apps/daemon/dist/schedule/runner.d.ts +20 -0
  143. package/apps/daemon/dist/schedule/runner.js +527 -0
  144. package/apps/daemon/dist/schedule/store.d.ts +9 -0
  145. package/apps/daemon/dist/schedule/store.js +143 -0
  146. package/apps/daemon/dist/session/create-session.d.ts +23 -0
  147. package/apps/daemon/dist/session/create-session.js +29 -0
  148. package/apps/daemon/dist/session/directory.d.ts +3 -0
  149. package/apps/daemon/dist/session/directory.js +104 -0
  150. package/apps/daemon/dist/session/events.d.ts +33 -0
  151. package/apps/daemon/dist/session/events.js +183 -0
  152. package/apps/daemon/dist/session/file-preview.d.ts +4 -0
  153. package/apps/daemon/dist/session/file-preview.js +173 -0
  154. package/apps/daemon/dist/session/lifecycle.d.ts +30 -0
  155. package/apps/daemon/dist/session/lifecycle.js +780 -0
  156. package/apps/daemon/dist/session/metadata.d.ts +7 -0
  157. package/apps/daemon/dist/session/metadata.js +115 -0
  158. package/apps/daemon/dist/session/primitives.d.ts +5 -0
  159. package/apps/daemon/dist/session/primitives.js +417 -0
  160. package/apps/daemon/dist/session/prompt.d.ts +30 -0
  161. package/apps/daemon/dist/session/prompt.js +436 -0
  162. package/apps/daemon/dist/session/reconcile.d.ts +3 -0
  163. package/apps/daemon/dist/session/reconcile.js +235 -0
  164. package/apps/daemon/dist/session/runtime-handle.d.ts +7 -0
  165. package/apps/daemon/dist/session/runtime-handle.js +48 -0
  166. package/apps/daemon/dist/start.d.ts +1 -0
  167. package/apps/daemon/dist/start.js +47 -0
  168. package/apps/daemon/dist/state.d.ts +16 -0
  169. package/apps/daemon/dist/state.js +11 -0
  170. package/apps/daemon/dist/turn-coordinator.d.ts +28 -0
  171. package/apps/daemon/dist/turn-coordinator.js +84 -0
  172. package/apps/daemon/dist/types.d.ts +123 -0
  173. package/apps/daemon/dist/types.js +2 -0
  174. package/apps/daemon/dist/utils.d.ts +1 -0
  175. package/apps/daemon/dist/utils.js +4 -0
  176. package/apps/daemon/package.json +3 -23
  177. package/apps/relay/dist/auth.d.ts +1 -0
  178. package/apps/relay/dist/auth.js +16 -0
  179. package/apps/relay/dist/connections.d.ts +13 -0
  180. package/apps/relay/dist/connections.js +11 -0
  181. package/apps/relay/dist/controller-handlers.d.ts +78 -0
  182. package/apps/relay/dist/controller-handlers.js +690 -0
  183. package/apps/relay/dist/db.d.ts +5 -0
  184. package/apps/relay/dist/db.js +323 -2
  185. package/apps/relay/dist/errors.d.ts +6 -0
  186. package/apps/relay/dist/errors.js +12 -0
  187. package/apps/relay/dist/http-routes.d.ts +3 -0
  188. package/apps/relay/dist/http-routes.js +982 -0
  189. package/apps/relay/dist/http-schemas.d.ts +142 -1
  190. package/apps/relay/dist/http-schemas.js +92 -4
  191. package/apps/relay/dist/index.js +62 -1295
  192. package/apps/relay/dist/machine-handlers.d.ts +57 -0
  193. package/apps/relay/dist/machine-handlers.js +870 -0
  194. package/apps/relay/dist/projections.d.ts +3 -2
  195. package/apps/relay/dist/projections.js +77 -3
  196. package/apps/relay/dist/relay-context.d.ts +136 -0
  197. package/apps/relay/dist/relay-context.js +674 -0
  198. package/apps/relay/dist/repositories.d.ts +13 -0
  199. package/apps/relay/dist/repositories.js +98 -0
  200. package/apps/relay/dist/retention.d.ts +9 -0
  201. package/apps/relay/dist/retention.js +26 -0
  202. package/apps/relay/dist/scope.d.ts +20 -0
  203. package/apps/relay/dist/scope.js +60 -0
  204. package/apps/relay/dist/security.d.ts +0 -1
  205. package/apps/relay/dist/security.js +0 -3
  206. package/apps/relay/dist/types.d.ts +63 -1
  207. package/apps/relay/dist/websocket.d.ts +3 -0
  208. package/apps/relay/dist/websocket.js +142 -0
  209. package/package.json +6 -8
  210. package/packages/agent-sdk/dist/index.d.ts +382 -0
  211. package/packages/agent-sdk/dist/index.js +172 -0
  212. package/packages/client/dist/account.d.ts +57 -0
  213. package/packages/client/dist/account.js +175 -0
  214. package/packages/client/dist/client.d.ts +104 -0
  215. package/packages/client/dist/client.js +657 -0
  216. package/packages/client/dist/errors.d.ts +20 -0
  217. package/packages/client/dist/errors.js +28 -0
  218. package/packages/client/dist/http.d.ts +10 -0
  219. package/packages/client/dist/http.js +82 -0
  220. package/packages/client/dist/index.d.ts +3 -240
  221. package/packages/client/dist/index.js +2 -979
  222. package/packages/client/dist/parsers.d.ts +51 -0
  223. package/packages/client/dist/parsers.js +345 -0
  224. package/packages/client/dist/transport.d.ts +61 -0
  225. package/packages/client/dist/transport.js +330 -0
  226. package/packages/client/dist/types.d.ts +423 -0
  227. package/packages/client/dist/types.js +2 -0
  228. package/packages/client/dist/validation.d.ts +15 -0
  229. package/packages/client/dist/validation.js +87 -0
  230. package/packages/pie-provider/dist/index.d.ts +3 -0
  231. package/packages/pie-provider/dist/index.js +1003 -0
  232. package/packages/runtime/dist/index.d.ts +99 -5
  233. package/packages/runtime-acpx/dist/index.d.ts +2 -1
  234. package/packages/runtime-acpx/dist/index.js +79 -1
  235. package/packages/runtime-cli/dist/claude-history.d.ts +7 -0
  236. package/packages/runtime-cli/dist/claude-history.js +344 -0
  237. package/packages/runtime-cli/dist/claude-json.d.ts +29 -0
  238. package/packages/runtime-cli/dist/claude-json.js +29 -0
  239. package/packages/runtime-cli/dist/claude-rename.d.ts +6 -0
  240. package/packages/runtime-cli/dist/claude-rename.js +15 -0
  241. package/packages/runtime-cli/dist/claude-session-store.d.ts +3 -1
  242. package/packages/runtime-cli/dist/claude-session-store.js +51 -14
  243. package/packages/runtime-cli/dist/claude-turn.d.ts +13 -0
  244. package/packages/runtime-cli/dist/claude-turn.js +121 -0
  245. package/packages/runtime-cli/dist/codex-app-server.d.ts +23 -13
  246. package/packages/runtime-cli/dist/codex-app-server.js +302 -348
  247. package/packages/runtime-cli/dist/codex-approvals.d.ts +8 -0
  248. package/packages/runtime-cli/dist/codex-approvals.js +33 -0
  249. package/packages/runtime-cli/dist/codex-history.d.ts +17 -0
  250. package/packages/runtime-cli/dist/codex-history.js +711 -0
  251. package/packages/runtime-cli/dist/codex-json-rpc.d.ts +30 -0
  252. package/packages/runtime-cli/dist/codex-json-rpc.js +150 -0
  253. package/packages/runtime-cli/dist/codex-lifecycle.d.ts +25 -0
  254. package/packages/runtime-cli/dist/codex-lifecycle.js +72 -0
  255. package/packages/runtime-cli/dist/codex-protocol.d.ts +6 -0
  256. package/packages/runtime-cli/dist/codex-protocol.js +53 -0
  257. package/packages/runtime-cli/dist/command-resolver.d.ts +24 -0
  258. package/packages/runtime-cli/dist/command-resolver.js +101 -0
  259. package/packages/runtime-cli/dist/history-merge.d.ts +18 -0
  260. package/packages/runtime-cli/dist/history-merge.js +274 -0
  261. package/packages/runtime-cli/dist/index.d.ts +3 -1
  262. package/packages/runtime-cli/dist/index.js +207 -356
  263. package/packages/runtime-cli/dist/permissions.d.ts +6 -0
  264. package/packages/runtime-cli/dist/permissions.js +22 -0
  265. package/packages/runtime-cli/dist/session-store.d.ts +32 -0
  266. package/packages/runtime-cli/dist/session-store.js +92 -0
  267. package/packages/shared/dist/args.d.ts +10 -0
  268. package/packages/shared/dist/args.js +35 -0
  269. package/packages/shared/dist/index.d.ts +3 -0
  270. package/packages/shared/dist/index.js +3 -0
  271. package/packages/shared/dist/protocol-schemas.d.ts +1438 -0
  272. package/packages/shared/dist/protocol-schemas.js +444 -0
  273. package/packages/shared/dist/protocol-types.d.ts +564 -0
  274. package/packages/shared/dist/protocol-types.js +2 -0
  275. package/packages/shared/dist/protocol.d.ts +305 -145
  276. package/packages/shared/dist/protocol.js +333 -85
  277. package/packages/shared/dist/session-name.d.ts +4 -0
  278. package/packages/shared/dist/session-name.js +26 -0
  279. package/packages/shared/dist/session-state.d.ts +16 -0
  280. package/packages/shared/dist/session-state.js +48 -0
  281. package/apps/cli/dist/index.js.map +0 -1
  282. package/apps/daemon/dist/cli.js.map +0 -1
  283. package/apps/relay/dist/db.js.map +0 -1
  284. package/apps/relay/dist/http-schemas.js.map +0 -1
  285. package/apps/relay/dist/index.js.map +0 -1
  286. package/apps/relay/dist/projections.js.map +0 -1
  287. package/apps/relay/dist/security.js.map +0 -1
  288. package/apps/relay/dist/types.js.map +0 -1
  289. package/apps/relay/package.json +0 -29
  290. package/packages/client/dist/index.d.ts.map +0 -1
  291. package/packages/client/dist/index.js.map +0 -1
  292. package/packages/client/package.json +0 -22
  293. package/packages/runtime/dist/index.d.ts.map +0 -1
  294. package/packages/runtime/dist/index.js.map +0 -1
  295. package/packages/runtime/package.json +0 -19
  296. package/packages/runtime-acpx/dist/index.d.ts.map +0 -1
  297. package/packages/runtime-acpx/dist/index.js.map +0 -1
  298. package/packages/runtime-acpx/package.json +0 -23
  299. package/packages/runtime-cli/dist/async-queue.d.ts.map +0 -1
  300. package/packages/runtime-cli/dist/async-queue.js.map +0 -1
  301. package/packages/runtime-cli/dist/claude-session-store.d.ts.map +0 -1
  302. package/packages/runtime-cli/dist/claude-session-store.js.map +0 -1
  303. package/packages/runtime-cli/dist/codex-app-server.d.ts.map +0 -1
  304. package/packages/runtime-cli/dist/codex-app-server.js.map +0 -1
  305. package/packages/runtime-cli/dist/index.d.ts.map +0 -1
  306. package/packages/runtime-cli/dist/index.js.map +0 -1
  307. package/packages/runtime-cli/package.json +0 -22
  308. package/packages/shared/dist/crypto.d.ts.map +0 -1
  309. package/packages/shared/dist/crypto.js.map +0 -1
  310. package/packages/shared/dist/ids.d.ts.map +0 -1
  311. package/packages/shared/dist/ids.js.map +0 -1
  312. package/packages/shared/dist/index.d.ts.map +0 -1
  313. package/packages/shared/dist/index.js.map +0 -1
  314. package/packages/shared/dist/protocol.d.ts.map +0 -1
  315. package/packages/shared/dist/protocol.js.map +0 -1
  316. package/packages/shared/package.json +0 -24
@@ -0,0 +1,2 @@
1
+ import type { CommandInput } from "./command.js";
2
+ export declare function handleAccount({ domain, action, flags }: CommandInput): Promise<boolean>;
@@ -0,0 +1,52 @@
1
+ import fs from "node:fs/promises";
2
+ import os from "node:os";
3
+ import path from "node:path";
4
+ import { configDir, configPath, generateAccountSecret, ok, parsePairingStartResponse, randomId, readRelayJson, requireRelayUrl, stopLocalDaemon, throwRelayHttpError, writeConfig } from "./lib/index.js";
5
+ export async function handleAccount({ domain, action, flags }) {
6
+ if (domain === "account" && action === "create") {
7
+ const relayUrl = requireRelayUrl(flags);
8
+ const deviceId = typeof flags["device-id"] === "string" ? flags["device-id"] : randomId("dev");
9
+ const deviceName = typeof flags["device-name"] === "string" ? flags["device-name"] : os.hostname();
10
+ const accountSecret = generateAccountSecret();
11
+ const response = await fetch(`${relayUrl}/api/pairing/start`, {
12
+ method: "POST",
13
+ headers: { "content-type": "application/json" },
14
+ body: JSON.stringify({ deviceId, deviceName }),
15
+ });
16
+ if (!response.ok) {
17
+ await throwRelayHttpError(response, "Account creation failed");
18
+ }
19
+ const paired = parsePairingStartResponse(await readRelayJson(response, "Account creation response is not valid JSON"));
20
+ const config = {
21
+ relayUrl,
22
+ controllerToken: paired.controllerToken,
23
+ accountSecret,
24
+ };
25
+ await writeConfig(config);
26
+ ok("account.create", {
27
+ accountId: paired.accountId,
28
+ configPath,
29
+ relayUrl,
30
+ deviceId,
31
+ controllerToken: paired.controllerToken,
32
+ accountSecret,
33
+ pairingCode: paired.pairingCode,
34
+ expiresAt: paired.expiresAt,
35
+ });
36
+ return true;
37
+ }
38
+ if (domain === "account" && action === "reset") {
39
+ const stop = await stopLocalDaemon().catch((error) => ({
40
+ error: error instanceof Error ? error.message : String(error),
41
+ }));
42
+ await fs.rm(configPath, { force: true });
43
+ await fs.rm(path.join(configDir, "daemon.json"), { force: true });
44
+ ok("account.reset", {
45
+ removed: [configPath, path.join(configDir, "daemon.json")],
46
+ stop,
47
+ });
48
+ return true;
49
+ }
50
+ return false;
51
+ }
52
+ //# sourceMappingURL=account.js.map
@@ -0,0 +1,3 @@
1
+ import { handleCliError } from "./lib/index.js";
2
+ export { handleCliError };
3
+ export declare function main(): Promise<void>;
@@ -0,0 +1,108 @@
1
+ import fs from "node:fs";
2
+ import path from "node:path";
3
+ import { handleAccount } from "./account.js";
4
+ import { handleCollect } from "./collect.js";
5
+ import { handleConfig } from "./config.js";
6
+ import { handleDaemon } from "./daemon.js";
7
+ import { handleGateway } from "./gateway.js";
8
+ import { handleLoop } from "./loop.js";
9
+ import { handleMachine } from "./machine.js";
10
+ import { handleMemory } from "./memory.js";
11
+ import { handleRelay } from "./relay.js";
12
+ import { handleSchedule } from "./schedule.js";
13
+ import { handleRemote } from "./remote.js";
14
+ import { handleSession } from "./session.js";
15
+ import { handleToken } from "./token.js";
16
+ import { handleTurn } from "./turn.js";
17
+ import { handleWorkspace } from "./workspace.js";
18
+ import { commandUsage, commandUsageText, handleCliError, parseCliFlags, skillText, startBootstrap, topLevelDoctor, topLevelStatus, usage, usageText } from "./lib/index.js";
19
+ export { handleCliError };
20
+ const domainHandlers = [
21
+ handleAccount,
22
+ handleConfig,
23
+ handleRemote,
24
+ handleToken,
25
+ handleGateway,
26
+ handleLoop,
27
+ handleDaemon,
28
+ handleRelay,
29
+ handleMachine,
30
+ handleMemory,
31
+ handleSchedule,
32
+ handleSession,
33
+ handleTurn,
34
+ handleWorkspace,
35
+ handleCollect,
36
+ ];
37
+ export async function main() {
38
+ const argv = process.argv.slice(2);
39
+ const [domain] = argv;
40
+ if (!domain)
41
+ usage();
42
+ if (domain === "--skill" || domain === "skill") {
43
+ console.log(skillText());
44
+ return;
45
+ }
46
+ if (domain === "--help" || domain === "-h" || domain === "help") {
47
+ console.log(usageText());
48
+ return;
49
+ }
50
+ if (domain === "--version" || domain === "-v" || domain === "version") {
51
+ console.log(cliVersion());
52
+ return;
53
+ }
54
+ const topLevelHelpRequested = argv[1] === "help" || argv.slice(1).some((arg) => arg === "--help" || arg === "-h");
55
+ if (topLevelHelpRequested && commandUsageText(domain)) {
56
+ console.log(commandUsageText(domain));
57
+ return;
58
+ }
59
+ if (domain === "start") {
60
+ const { flags } = parseCliFlags(argv.slice(1));
61
+ await startBootstrap(flags);
62
+ return;
63
+ }
64
+ if (domain === "doctor") {
65
+ const { flags } = parseCliFlags(argv.slice(1));
66
+ await topLevelDoctor(flags);
67
+ return;
68
+ }
69
+ if (domain === "status") {
70
+ const { flags } = parseCliFlags(argv.slice(1));
71
+ await topLevelStatus(flags);
72
+ return;
73
+ }
74
+ const action = argv[1];
75
+ const rest = argv.slice(2);
76
+ if ((!action || action.startsWith("-")) && commandUsageText(domain)) {
77
+ commandUsage(domain);
78
+ }
79
+ const { positional, flags } = parseCliFlags(rest);
80
+ if (action === "--help" || action === "-h" || action === "help" || flags.help === true || flags.h === true) {
81
+ console.log(commandUsageText(domain) ?? usageText());
82
+ return;
83
+ }
84
+ const input = { domain, action, positional, flags };
85
+ for (const handle of domainHandlers) {
86
+ if (await handle(input))
87
+ return;
88
+ }
89
+ usage();
90
+ }
91
+ function cliVersion() {
92
+ for (const candidate of [
93
+ path.resolve(import.meta.dirname, "..", "..", "..", "..", "package.json"),
94
+ path.resolve(import.meta.dirname, "..", "..", "..", "package.json"),
95
+ path.resolve(import.meta.dirname, "..", "..", "package.json"),
96
+ ]) {
97
+ try {
98
+ const parsed = JSON.parse(fs.readFileSync(candidate, "utf8"));
99
+ if (typeof parsed.version === "string" && parsed.version.trim())
100
+ return parsed.version.trim();
101
+ }
102
+ catch {
103
+ // Try the next packaged/source layout.
104
+ }
105
+ }
106
+ return "0.1.0";
107
+ }
108
+ //# sourceMappingURL=app.js.map
@@ -0,0 +1,2 @@
1
+ import type { CommandInput } from "./command.js";
2
+ export declare function handleCollect({ domain, action, flags }: CommandInput): Promise<boolean>;
@@ -0,0 +1,31 @@
1
+ import { CliError, ControllerClient, conciseEvents, ok, parseEventCursor, printConciseEvents, readConfig, requirePositional, wantsJson, wantsVerbose } from "./lib/index.js";
2
+ export async function handleCollect({ domain, action, flags }) {
3
+ if (domain !== "collect")
4
+ return false;
5
+ const config = await readConfig(flags);
6
+ const client = new ControllerClient(config);
7
+ const sessionId = requirePositional(action, "sessionId");
8
+ const since = parseEventCursor(flags.since);
9
+ const limit = typeof flags.limit === "string" ? Number(flags.limit) : undefined;
10
+ if (limit !== undefined && (!Number.isInteger(limit) || limit <= 0)) {
11
+ throw new CliError(`Invalid --limit: ${flags.limit}`, "INVALID_ARGUMENT");
12
+ }
13
+ const events = await client.collect(sessionId, { since, limit });
14
+ const lastEventId = events.at(-1)?.id;
15
+ const nextSince = lastEventId === undefined ? (since ?? null) : `cursor_${lastEventId}`;
16
+ if (wantsJson(flags) || wantsVerbose(flags)) {
17
+ ok("session.collect", {
18
+ sessionId,
19
+ debugOnly: true,
20
+ cursor: nextSince,
21
+ nextSince,
22
+ ...(wantsVerbose(flags) ? { events } : { events: conciseEvents(events) }),
23
+ }, { sessionId });
24
+ }
25
+ else {
26
+ printConciseEvents(events);
27
+ console.log(`nextSince: ${nextSince ?? "none"}`);
28
+ }
29
+ return true;
30
+ }
31
+ //# sourceMappingURL=collect.js.map
@@ -0,0 +1,6 @@
1
+ export type CommandInput = {
2
+ domain: string;
3
+ action: string | undefined;
4
+ positional: string[];
5
+ flags: Record<string, string | boolean>;
6
+ };
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=command.js.map
@@ -0,0 +1,2 @@
1
+ import type { CommandInput } from "./command.js";
2
+ export declare function handleConfig({ domain, action, flags }: CommandInput): Promise<boolean>;
@@ -0,0 +1,31 @@
1
+ import { configPath, ok, readConfig, redactedControllerConfig, requireRelayUrl, requireString, wantsJson, writeConfig } from "./lib/index.js";
2
+ export async function handleConfig({ domain, action, flags }) {
3
+ if (domain === "config" && action === "init") {
4
+ const config = {
5
+ relayUrl: requireRelayUrl(flags),
6
+ controllerToken: requireString(flags, "token"),
7
+ accountSecret: requireString(flags, "secret"),
8
+ };
9
+ await writeConfig(config);
10
+ ok("config.init", { path: configPath, relayUrl: config.relayUrl });
11
+ return true;
12
+ }
13
+ if (domain === "config" && action === "show") {
14
+ const config = await readConfig(flags);
15
+ if (!wantsJson(flags)) {
16
+ const redacted = redactedControllerConfig(config);
17
+ console.log(`Config: ${configPath}`);
18
+ console.log(`Relay: ${redacted.relayUrl}`);
19
+ console.log(`Controller token: ${redacted.hasControllerToken ? "configured" : "missing"}`);
20
+ console.log(`Account secret: ${redacted.hasAccountSecret ? "configured" : "missing"}`);
21
+ return true;
22
+ }
23
+ ok("config.show", {
24
+ path: configPath,
25
+ config: redactedControllerConfig(config),
26
+ });
27
+ return true;
28
+ }
29
+ return false;
30
+ }
31
+ //# sourceMappingURL=config.js.map
@@ -0,0 +1,2 @@
1
+ import type { CommandInput } from "./command.js";
2
+ export declare function handleDaemon({ domain, action, flags }: CommandInput): Promise<boolean>;
@@ -0,0 +1,307 @@
1
+ import os from "node:os";
2
+ import path from "node:path";
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
+ export async function handleDaemon({ domain, action, flags }) {
5
+ if (domain === "daemon" && action === "pair") {
6
+ const relayUrl = requireRelayUrl(flags);
7
+ const code = requireString(flags, "code");
8
+ const accountSecret = requireString(flags, "secret");
9
+ const machineName = typeof flags.name === "string" && flags.name.trim() ? flags.name.trim() : os.hostname();
10
+ const machineId = typeof flags["machine-id"] === "string" ? flags["machine-id"] : randomId("mach");
11
+ const response = await fetch(`${relayUrl}/api/pairing/claim`, {
12
+ method: "POST",
13
+ headers: { "content-type": "application/json" },
14
+ body: JSON.stringify({ code, machineId }),
15
+ });
16
+ if (!response.ok) {
17
+ await throwRelayHttpError(response, "Pairing failed");
18
+ }
19
+ const claimed = parsePairingClaimResponse(await readRelayJson(response, "Pairing response is not valid JSON"));
20
+ const daemonConfig = {
21
+ relayUrl,
22
+ accountId: claimed.accountId,
23
+ machineId: claimed.machineId,
24
+ machineName,
25
+ machineToken: claimed.machineToken,
26
+ accountSecret,
27
+ };
28
+ const localBefore = await localDaemonStatus();
29
+ const daemonConfigPath = await writeDaemonConfig(daemonConfig);
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 = {
76
+ path: daemonConfigPath,
77
+ config: redactedDaemonConfig(daemonConfig),
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);
109
+ return true;
110
+ }
111
+ if (domain === "daemon" && action === "doctor") {
112
+ const checks = [];
113
+ let config;
114
+ try {
115
+ config = await readConfig(flags);
116
+ checks.push({ name: "config", ok: true, message: configPath });
117
+ }
118
+ catch (error) {
119
+ checks.push({ name: "config", ok: false, message: error instanceof Error ? error.message : String(error) });
120
+ }
121
+ if (config) {
122
+ try {
123
+ const response = await fetch(`${config.relayUrl}/health`);
124
+ checks.push({ name: "relay", ok: response.ok, message: response.ok ? "reachable" : await response.text() });
125
+ }
126
+ catch (error) {
127
+ checks.push({ name: "relay", ok: false, message: error instanceof Error ? error.message : String(error) });
128
+ }
129
+ }
130
+ const data = { ok: checks.every((check) => check.ok), checks };
131
+ if (!wantsJson(flags)) {
132
+ console.log(`Daemon doctor: ${data.ok ? "ok" : "issues found"}`);
133
+ for (const check of checks) {
134
+ console.log(`${check.ok ? "ok" : "fail"} ${check.name}: ${check.message}`);
135
+ }
136
+ if (!data.ok)
137
+ process.exitCode = 1;
138
+ return true;
139
+ }
140
+ if (!data.ok)
141
+ process.exitCode = 1;
142
+ ok("daemon.doctor", data, {}, data.ok);
143
+ return true;
144
+ }
145
+ if (domain === "daemon" && action === "config") {
146
+ const daemonConfig = await readDaemonConfig();
147
+ const redacted = redactedDaemonConfig(daemonConfig);
148
+ if (!wantsJson(flags)) {
149
+ console.log(`Config: ${path.join(configDir, "daemon.json")}`);
150
+ console.log(`Relay: ${redacted.relayUrl}`);
151
+ console.log(`Account: ${redacted.accountId}`);
152
+ console.log(`Machine: ${redacted.machineName} (${redacted.machineId})`);
153
+ console.log(`Machine token: ${redacted.hasMachineToken ? "configured" : "missing"}`);
154
+ console.log(`Account secret: ${redacted.hasAccountSecret ? "configured" : "missing"}`);
155
+ return true;
156
+ }
157
+ ok("daemon.config", {
158
+ path: path.join(configDir, "daemon.json"),
159
+ config: redacted,
160
+ });
161
+ return true;
162
+ }
163
+ if (domain === "daemon" && action === "logs") {
164
+ const tail = typeof flags.tail === "string" ? Number(flags.tail) : 100;
165
+ if (!Number.isInteger(tail) || tail <= 0) {
166
+ throw new CliError(`Invalid --tail: ${flags.tail}`, "INVALID_ARGUMENT");
167
+ }
168
+ const entries = await readLocalAuditLog(tail);
169
+ if (!wantsJson(flags)) {
170
+ if (entries.length === 0) {
171
+ console.log("No daemon audit log entries.");
172
+ return true;
173
+ }
174
+ for (const entry of entries) {
175
+ const record = entry;
176
+ const createdAt = typeof record.createdAt === "string" ? record.createdAt : "-";
177
+ const action = typeof record.action === "string" ? record.action : "unknown";
178
+ const actor = typeof record.actor === "string" ? record.actor : "unknown";
179
+ const sessionId = typeof record.sessionId === "string" ? record.sessionId : undefined;
180
+ const summary = typeof record.summary === "string" ? record.summary : JSON.stringify(record);
181
+ console.log(`${createdAt} ${action} ${actor}`);
182
+ if (sessionId)
183
+ console.log(` session: ${sessionId}`);
184
+ console.log(` ${compactText(summary, 160)}`);
185
+ }
186
+ return true;
187
+ }
188
+ ok("daemon.logs", {
189
+ path: path.join(configDir, "audit.jsonl"),
190
+ entries,
191
+ });
192
+ return true;
193
+ }
194
+ if (domain === "daemon" && action === "start") {
195
+ const status = await localDaemonStatus();
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
+ }
205
+ ok("daemon.start", { ...status, started: false });
206
+ return true;
207
+ }
208
+ await readDaemonConfig();
209
+ const startArgs = typeof flags.relay === "string" ? ["--relay", flags.relay] : [];
210
+ const pid = spawnDaemonStart(startArgs);
211
+ ok("daemon.start", { pid, pidPath: daemonPidPath, started: true });
212
+ return true;
213
+ }
214
+ if (domain === "daemon" && action === "stop") {
215
+ ok("daemon.stop", await stopLocalDaemon());
216
+ return true;
217
+ }
218
+ if (domain === "daemon" && action === "restart") {
219
+ await readDaemonConfig();
220
+ const stop = await stopLocalDaemon();
221
+ const startArgs = typeof flags.relay === "string" ? ["--relay", flags.relay] : [];
222
+ const pid = spawnDaemonStart(startArgs);
223
+ ok("daemon.restart", { stop, startedPid: pid, pidPath: daemonPidPath });
224
+ return true;
225
+ }
226
+ if (domain === "daemon" && action === "status" && flags.local === true) {
227
+ const local = await localDaemonStatus();
228
+ if (!wantsJson(flags)) {
229
+ console.log(local.running ? `Daemon: running${local.pid ? ` pid ${local.pid}` : ""}` : "Daemon: stopped");
230
+ console.log(`Pid file: ${local.pidPath}`);
231
+ return true;
232
+ }
233
+ ok("daemon.status", { local });
234
+ return true;
235
+ }
236
+ if (domain === "daemon" && action === "status") {
237
+ const config = await readConfig(flags);
238
+ const client = new ControllerClient(config);
239
+ const local = await localDaemonStatus();
240
+ const response = await fetch(`${config.relayUrl}/health`);
241
+ const snapshot = await client.snapshot();
242
+ const machineFilter = flags.machine === true ? requirePositional(undefined, "machineId") : typeof flags.machine === "string" ? flags.machine : undefined;
243
+ const machines = machineFilter
244
+ ? snapshot.machines.filter((machine) => machine.id === machineFilter)
245
+ : snapshot.machines;
246
+ if (machineFilter && machines.length === 0)
247
+ throw new CliError("Machine not found", "MACHINE_NOT_FOUND");
248
+ const machineIds = new Set(machines.map((machine) => machine.id));
249
+ const sessions = snapshot.sessions.filter((session) => machineIds.has(session.machineId));
250
+ const projectedMachines = await Promise.all(machines.map((machine) => showMachine(client, machine)));
251
+ const projectedSessions = await Promise.all(sessions.map(async (session) => ({
252
+ sessionId: session.id,
253
+ machineId: session.machineId,
254
+ agent: session.agent,
255
+ status: session.status,
256
+ orchestration: deriveOrchestration(session, await client.history(session.id, 20)),
257
+ updatedAt: session.updatedAt,
258
+ capabilities: session.capabilities,
259
+ })));
260
+ const data = {
261
+ configPath,
262
+ local,
263
+ relayUrl: config.relayUrl,
264
+ relayReachable: response.ok,
265
+ relay: response.ok ? await response.json() : await response.text(),
266
+ machines: projectedMachines.map((machine) => ({
267
+ machineId: machine.id,
268
+ name: machine.metadata.name ?? machine.name,
269
+ online: machine.online,
270
+ lastSeen: machine.lastSeen,
271
+ defaultCwd: machine.defaultCwd,
272
+ daemonVersion: machine.capabilities.daemonVersion,
273
+ acpxVersion: machine.capabilities.acpxVersion,
274
+ sessionPrimitives: machine.capabilities.sessionPrimitives,
275
+ agents: machine.capabilities.agents,
276
+ metadata: machine.metadata,
277
+ })),
278
+ sessions: projectedSessions,
279
+ summary: {
280
+ machineCount: machines.length,
281
+ onlineMachineCount: machines.filter((machine) => machine.online).length,
282
+ sessionCount: projectedSessions.length,
283
+ runningSessionCount: projectedSessions.filter((session) => session.status === "running").length,
284
+ idleSessionCount: projectedSessions.filter((session) => idleSessionStatuses.includes(session.status)).length,
285
+ blockedSessionCount: projectedSessions.filter((session) => session.orchestration.blocked).length,
286
+ activeSessionCount: projectedSessions.filter((session) => session.orchestration.state === "active").length,
287
+ completedSessionCount: projectedSessions.filter((session) => session.orchestration.completed).length,
288
+ needsUserSessionCount: projectedSessions.filter((session) => session.orchestration.needsUser).length,
289
+ },
290
+ };
291
+ if (!wantsJson(flags)) {
292
+ console.log(`Relay: ${data.relayUrl} ${data.relayReachable ? "ok" : "unreachable"}`);
293
+ console.log(data.local.running ? `Local daemon: running${data.local.pid ? ` pid ${data.local.pid}` : ""}` : "Local daemon: stopped");
294
+ console.log(`Machines: ${data.summary.onlineMachineCount}/${data.summary.machineCount} online`);
295
+ console.log(`Sessions: ${data.summary.sessionCount} total, ${data.summary.runningSessionCount} running, ${data.summary.needsUserSessionCount} needs user`);
296
+ for (const machine of data.machines) {
297
+ console.log(`- ${machine.name} (${machine.machineId}) ${machine.online ? "online" : "offline"}`);
298
+ console.log(` cwd: ${machine.defaultCwd ?? "-"}`);
299
+ }
300
+ return true;
301
+ }
302
+ ok("daemon.status", data, machineFilter ? { machineId: machineFilter } : {});
303
+ return true;
304
+ }
305
+ return false;
306
+ }
307
+ //# sourceMappingURL=daemon.js.map
@@ -0,0 +1,2 @@
1
+ import type { CommandInput } from "./command.js";
2
+ export declare function handleGateway({ domain, action, positional, flags }: CommandInput): Promise<boolean>;