@moltzap/client 2026.511.1 → 2026.519.0

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 (218) hide show
  1. package/dist/auth.d.ts +12 -6
  2. package/dist/auth.d.ts.map +1 -1
  3. package/dist/auth.js +67 -29
  4. package/dist/auth.js.map +1 -1
  5. package/dist/auth.test.js +113 -76
  6. package/dist/auth.test.js.map +1 -1
  7. package/dist/channel-base/format-cross-conv.d.ts +43 -0
  8. package/dist/channel-base/format-cross-conv.d.ts.map +1 -0
  9. package/dist/channel-base/format-cross-conv.js +69 -0
  10. package/dist/channel-base/format-cross-conv.js.map +1 -0
  11. package/dist/channel-base/format-group-block.d.ts +43 -0
  12. package/dist/channel-base/format-group-block.d.ts.map +1 -0
  13. package/dist/channel-base/format-group-block.js +59 -0
  14. package/dist/channel-base/format-group-block.js.map +1 -0
  15. package/dist/channel-base/index.d.ts +21 -0
  16. package/dist/channel-base/index.d.ts.map +1 -0
  17. package/dist/channel-base/index.js +24 -0
  18. package/dist/channel-base/index.js.map +1 -0
  19. package/dist/channel-base/lease-guard.d.ts +30 -0
  20. package/dist/channel-base/lease-guard.d.ts.map +1 -0
  21. package/dist/channel-base/lease-guard.js +40 -0
  22. package/dist/channel-base/lease-guard.js.map +1 -0
  23. package/dist/channel-base/lease-store.d.ts +30 -0
  24. package/dist/channel-base/lease-store.d.ts.map +1 -0
  25. package/dist/channel-base/lease-store.js +58 -0
  26. package/dist/channel-base/lease-store.js.map +1 -0
  27. package/dist/channel-base/lease.d.ts +94 -0
  28. package/dist/channel-base/lease.d.ts.map +1 -0
  29. package/dist/channel-base/lease.js +110 -0
  30. package/dist/channel-base/lease.js.map +1 -0
  31. package/dist/channel-core-context.test.d.ts +2 -0
  32. package/dist/channel-core-context.test.d.ts.map +1 -0
  33. package/dist/channel-core-context.test.js +334 -0
  34. package/dist/channel-core-context.test.js.map +1 -0
  35. package/dist/channel-core-dispatch.test.d.ts +2 -0
  36. package/dist/channel-core-dispatch.test.d.ts.map +1 -0
  37. package/dist/channel-core-dispatch.test.js +550 -0
  38. package/dist/channel-core-dispatch.test.js.map +1 -0
  39. package/dist/channel-core-enrichment.d.ts +8 -0
  40. package/dist/channel-core-enrichment.d.ts.map +1 -0
  41. package/dist/channel-core-enrichment.js +134 -0
  42. package/dist/channel-core-enrichment.js.map +1 -0
  43. package/dist/channel-core-errors.d.ts +20 -0
  44. package/dist/channel-core-errors.d.ts.map +1 -0
  45. package/dist/channel-core-errors.js +12 -0
  46. package/dist/channel-core-errors.js.map +1 -0
  47. package/dist/channel-core-test-support.d.ts +48 -0
  48. package/dist/channel-core-test-support.d.ts.map +1 -0
  49. package/dist/channel-core-test-support.js +111 -0
  50. package/dist/channel-core-test-support.js.map +1 -0
  51. package/dist/channel-core.d.ts +30 -7
  52. package/dist/channel-core.d.ts.map +1 -1
  53. package/dist/channel-core.js +214 -237
  54. package/dist/channel-core.js.map +1 -1
  55. package/dist/channel-core.test.js +216 -1082
  56. package/dist/channel-core.test.js.map +1 -1
  57. package/dist/cli/__tests__/cli-multi-agent.int.test.js +129 -23
  58. package/dist/cli/__tests__/cli-multi-agent.int.test.js.map +1 -1
  59. package/dist/cli/commands/conversations-v2.test.js +64 -54
  60. package/dist/cli/commands/conversations-v2.test.js.map +1 -1
  61. package/dist/cli/commands/conversations.d.ts +5 -5
  62. package/dist/cli/commands/conversations.d.ts.map +1 -1
  63. package/dist/cli/commands/conversations.js +43 -36
  64. package/dist/cli/commands/conversations.js.map +1 -1
  65. package/dist/cli/commands/messages.d.ts +4 -4
  66. package/dist/cli/commands/messages.d.ts.map +1 -1
  67. package/dist/cli/commands/messages.js +4 -4
  68. package/dist/cli/commands/messages.js.map +1 -1
  69. package/dist/cli/commands/messages.test.js +61 -49
  70. package/dist/cli/commands/messages.test.js.map +1 -1
  71. package/dist/cli/commands/ping.d.ts +0 -9
  72. package/dist/cli/commands/ping.d.ts.map +1 -1
  73. package/dist/cli/commands/ping.js +1 -1
  74. package/dist/cli/commands/ping.js.map +1 -1
  75. package/dist/cli/commands/presence.d.ts +1 -1
  76. package/dist/cli/commands/presence.js +1 -1
  77. package/dist/cli/commands/register.d.ts +2 -2
  78. package/dist/cli/commands/register.d.ts.map +1 -1
  79. package/dist/cli/commands/register.js +98 -77
  80. package/dist/cli/commands/register.js.map +1 -1
  81. package/dist/cli/commands/register.test.js +63 -39
  82. package/dist/cli/commands/register.test.js.map +1 -1
  83. package/dist/cli/commands/send.d.ts +6 -6
  84. package/dist/cli/commands/send.js +6 -6
  85. package/dist/cli/commands/send.test.js +32 -28
  86. package/dist/cli/commands/send.test.js.map +1 -1
  87. package/dist/cli/commands/status.d.ts.map +1 -1
  88. package/dist/cli/commands/status.js +3 -4
  89. package/dist/cli/commands/status.js.map +1 -1
  90. package/dist/cli/config.d.ts +0 -2
  91. package/dist/cli/config.d.ts.map +1 -1
  92. package/dist/cli/config.js +86 -76
  93. package/dist/cli/config.js.map +1 -1
  94. package/dist/cli/config.test.js +80 -42
  95. package/dist/cli/config.test.js.map +1 -1
  96. package/dist/cli/index.d.ts +1 -16
  97. package/dist/cli/index.d.ts.map +1 -1
  98. package/dist/cli/index.js +50 -113
  99. package/dist/cli/index.js.map +1 -1
  100. package/dist/cli/process-argv.d.ts +2 -0
  101. package/dist/cli/process-argv.d.ts.map +1 -0
  102. package/dist/cli/process-argv.js +2 -0
  103. package/dist/cli/process-argv.js.map +1 -0
  104. package/dist/cli/profile.d.ts +3 -10
  105. package/dist/cli/profile.d.ts.map +1 -1
  106. package/dist/cli/profile.js +105 -104
  107. package/dist/cli/profile.js.map +1 -1
  108. package/dist/cli/profile.test.js +338 -232
  109. package/dist/cli/profile.test.js.map +1 -1
  110. package/dist/cli/runtime.d.ts +5 -17
  111. package/dist/cli/runtime.d.ts.map +1 -1
  112. package/dist/cli/runtime.js +6 -59
  113. package/dist/cli/runtime.js.map +1 -1
  114. package/dist/cli/socket-client.d.ts +10 -15
  115. package/dist/cli/socket-client.d.ts.map +1 -1
  116. package/dist/cli/socket-client.js +74 -89
  117. package/dist/cli/socket-client.js.map +1 -1
  118. package/dist/cli/transport.d.ts +9 -5
  119. package/dist/cli/transport.d.ts.map +1 -1
  120. package/dist/cli/transport.js +45 -42
  121. package/dist/cli/transport.js.map +1 -1
  122. package/dist/cli/transport.test.js +227 -133
  123. package/dist/cli/transport.test.js.map +1 -1
  124. package/dist/index.d.ts +4 -1
  125. package/dist/index.d.ts.map +1 -1
  126. package/dist/index.js +3 -0
  127. package/dist/index.js.map +1 -1
  128. package/dist/local-daemon-rpc.d.ts +13 -0
  129. package/dist/local-daemon-rpc.d.ts.map +1 -0
  130. package/dist/local-daemon-rpc.js +17 -0
  131. package/dist/local-daemon-rpc.js.map +1 -0
  132. package/dist/local-paths.d.ts +7 -0
  133. package/dist/local-paths.d.ts.map +1 -0
  134. package/dist/local-paths.js +20 -0
  135. package/dist/local-paths.js.map +1 -0
  136. package/dist/runtime/close-info.d.ts +3 -12
  137. package/dist/runtime/close-info.d.ts.map +1 -1
  138. package/dist/runtime/close-info.js +28 -39
  139. package/dist/runtime/close-info.js.map +1 -1
  140. package/dist/runtime/close-info.test.js +77 -70
  141. package/dist/runtime/close-info.test.js.map +1 -1
  142. package/dist/runtime/errors.test.js +42 -28
  143. package/dist/runtime/errors.test.js.map +1 -1
  144. package/dist/runtime/frame.d.ts +4 -31
  145. package/dist/runtime/frame.d.ts.map +1 -1
  146. package/dist/runtime/frame.js +7 -116
  147. package/dist/runtime/frame.js.map +1 -1
  148. package/dist/runtime/frame.test.js +41 -54
  149. package/dist/runtime/frame.test.js.map +1 -1
  150. package/dist/runtime/index.d.ts +7 -0
  151. package/dist/runtime/index.d.ts.map +1 -1
  152. package/dist/runtime/index.js +7 -11
  153. package/dist/runtime/index.js.map +1 -1
  154. package/dist/runtime/local-history.d.ts +67 -0
  155. package/dist/runtime/local-history.d.ts.map +1 -0
  156. package/dist/runtime/local-history.js +77 -0
  157. package/dist/runtime/local-history.js.map +1 -0
  158. package/dist/runtime/local-service-commands.d.ts +19 -0
  159. package/dist/runtime/local-service-commands.d.ts.map +1 -1
  160. package/dist/runtime/local-service-commands.js +23 -0
  161. package/dist/runtime/local-service-commands.js.map +1 -1
  162. package/dist/runtime/local-socket-server.d.ts +20 -0
  163. package/dist/runtime/local-socket-server.d.ts.map +1 -0
  164. package/dist/runtime/local-socket-server.js +94 -0
  165. package/dist/runtime/local-socket-server.js.map +1 -0
  166. package/dist/runtime/refs.d.ts +1 -1
  167. package/dist/runtime/refs.js +1 -1
  168. package/dist/runtime/runtime.test.js +29 -21
  169. package/dist/runtime/runtime.test.js.map +1 -1
  170. package/dist/runtime/service-helpers.d.ts +32 -0
  171. package/dist/runtime/service-helpers.d.ts.map +1 -0
  172. package/dist/runtime/service-helpers.js +85 -0
  173. package/dist/runtime/service-helpers.js.map +1 -0
  174. package/dist/runtime/subscribers.d.ts +13 -17
  175. package/dist/runtime/subscribers.d.ts.map +1 -1
  176. package/dist/runtime/subscribers.js +37 -32
  177. package/dist/runtime/subscribers.js.map +1 -1
  178. package/dist/runtime/subscribers.test.js +139 -131
  179. package/dist/runtime/subscribers.test.js.map +1 -1
  180. package/dist/service-socket-path.test.d.ts +2 -0
  181. package/dist/service-socket-path.test.d.ts.map +1 -0
  182. package/dist/service-socket-path.test.js +87 -0
  183. package/dist/service-socket-path.test.js.map +1 -0
  184. package/dist/service.d.ts +23 -20
  185. package/dist/service.d.ts.map +1 -1
  186. package/dist/service.js +192 -340
  187. package/dist/service.js.map +1 -1
  188. package/dist/service.test.js +652 -653
  189. package/dist/service.test.js.map +1 -1
  190. package/dist/test/index.d.ts +30 -14
  191. package/dist/test/index.d.ts.map +1 -1
  192. package/dist/test/index.js +25 -21
  193. package/dist/test/index.js.map +1 -1
  194. package/dist/test-utils/channel-service-fixture.d.ts +1 -0
  195. package/dist/test-utils/channel-service-fixture.d.ts.map +1 -1
  196. package/dist/test-utils/channel-service-fixture.js +139 -98
  197. package/dist/test-utils/channel-service-fixture.js.map +1 -1
  198. package/dist/test-utils/conformance-adapter.d.ts.map +1 -1
  199. package/dist/test-utils/conformance-adapter.js +145 -124
  200. package/dist/test-utils/conformance-adapter.js.map +1 -1
  201. package/dist/test-utils/fake-service.d.ts.map +1 -1
  202. package/dist/test-utils/fake-service.js +3 -3
  203. package/dist/test-utils/fake-service.js.map +1 -1
  204. package/dist/test-utils/index.d.ts +25 -0
  205. package/dist/test-utils/index.d.ts.map +1 -1
  206. package/dist/test-utils/index.js +25 -8
  207. package/dist/test-utils/index.js.map +1 -1
  208. package/dist/ws-client-test-support.d.ts +180 -0
  209. package/dist/ws-client-test-support.d.ts.map +1 -0
  210. package/dist/ws-client-test-support.js +399 -0
  211. package/dist/ws-client-test-support.js.map +1 -0
  212. package/dist/ws-client.d.ts +59 -32
  213. package/dist/ws-client.d.ts.map +1 -1
  214. package/dist/ws-client.js +272 -321
  215. package/dist/ws-client.js.map +1 -1
  216. package/dist/ws-client.test.js +388 -800
  217. package/dist/ws-client.test.js.map +1 -1
  218. package/package.json +18 -10
@@ -1 +1 @@
1
- {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/cli/config.ts"],"names":[],"mappings":"AAGA,OAAO,EAAgC,MAAM,EAAU,MAAM,QAAQ,CAAC;AAEtE;;;;GAIG;AACH,MAAM,WAAW,aAAa;IAC5B,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AASD,MAAM,MAAM,cAAc,GACtB,eAAe,GACf,gBAAgB,GAChB,kBAAkB,GAClB,sBAAsB,CAAC;;;;AAE3B,qBAAa,eAAgB,SAAQ,qBAAoC;IACvE,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAC;IACxB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;CACvB,CAAC;CAAG;;;;AAEL,qBAAa,gBAAiB,SAAQ,sBAAqC;IACzE,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAC;IACxB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;CACvB,CAAC;CAAG;;;;AAEL,qBAAa,kBAAmB,SAAQ,wBAAuC;IAC7E,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAC;IACxB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;CACvB,CAAC;CAAG;;;;AAEL,qBAAa,sBAAuB,SAAQ,4BAE1C;IACA,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;CAC1B,CAAC;CAAG;AAeL,wBAAgB,aAAa,IAAI,MAAM,CAEtC;AAsDD;;;;;GAKG;AACH,eAAO,MAAM,UAAU,EAAE,MAAM,CAAC,MAAM,CACpC,aAAa,EACb,eAAe,GAAG,kBAAkB,CAoDpC,CAAC;AAEH,qFAAqF;AACrF,eAAO,MAAM,WAAW,GACtB,QAAQ,aAAa,KACpB,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,gBAAgB,CAoBnC,CAAC;AAEL,gCAAgC;AAChC,eAAO,MAAM,YAAY,GACvB,SAAS,CAAC,MAAM,EAAE,aAAa,KAAK,aAAa,KAChD,MAAM,CAAC,MAAM,CACd,IAAI,EACJ,kBAAkB,GAAG,eAAe,GAAG,gBAAgB,CAEoB,CAAC;AAE9E,8CAA8C;AAC9C,eAAO,MAAM,YAAY,EAAE,MAAM,CAAC,MAAM,CACtC,MAAM,EACN,kBAAkB,GAAG,eAAe,CACa,CAAC;AAEpD,2CAA2C;AAC3C,eAAO,MAAM,UAAU,EAAE,MAAM,CAAC,MAAM,CACpC,MAAM,EACN,kBAAkB,GAAG,eAAe,CAGrC,CAAC;AAEF,0EAA0E;AAC1E,eAAO,MAAM,WAAW,EAAE,MAAM,CAAC,MAAM,CACrC;IAAE,QAAQ,EAAE,MAAM,CAAA;CAAE,EACpB,sBAAsB,GAAG,kBAAkB,GAAG,eAAe,CAW9D,CAAC"}
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/cli/config.ts"],"names":[],"mappings":"AAEA,OAAO,EAIL,MAAM,EAIP,MAAM,QAAQ,CAAC;AAGhB;;;;GAIG;AACH,MAAM,WAAW,aAAa;IAC5B,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAMD,MAAM,MAAM,cAAc,GACtB,eAAe,GACf,gBAAgB,GAChB,kBAAkB,GAClB,sBAAsB,CAAC;;;;AAE3B,qBAAa,eAAgB,SAAQ,qBAAoC;IACvE,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAC;IACxB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;CACvB,CAAC;CAAG;;;;AAEL,qBAAa,gBAAiB,SAAQ,sBAAqC;IACzE,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAC;IACxB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;CACvB,CAAC;CAAG;;;;AAEL,qBAAa,kBAAmB,SAAQ,wBAAuC;IAC7E,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAC;IACxB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;CACvB,CAAC;CAAG;;;;AAEL,qBAAa,sBAAuB,SAAQ,4BAE1C;IACA,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;CAC1B,CAAC;CAAG;AA0BL,wBAAgB,aAAa,IAAI,MAAM,CAEtC;AAiJD;;;;;GAKG;AACH,eAAO,MAAM,UAAU,EAAE,MAAM,CAAC,MAAM,CACpC,aAAa,EACb,eAAe,GAAG,kBAAkB,CAOA,CAAC;AAqCvC,gCAAgC;AAChC,eAAO,MAAM,YAAY,GACvB,SAAS,CAAC,MAAM,EAAE,aAAa,KAAK,aAAa,KAChD,MAAM,CAAC,MAAM,CACd,IAAI,EACJ,kBAAkB,GAAG,eAAe,GAAG,gBAAgB,CAEoB,CAAC;AAE9E,8CAA8C;AAC9C,eAAO,MAAM,YAAY,EAAE,MAAM,CAAC,MAAM,CACtC,MAAM,EACN,kBAAkB,GAAG,eAAe,CACa,CAAC;AAEpD,2CAA2C;AAC3C,eAAO,MAAM,UAAU,EAAE,MAAM,CAAC,MAAM,CACpC,MAAM,EACN,kBAAkB,GAAG,eAAe,CAGrC,CAAC;AAEF,0EAA0E;AAC1E,eAAO,MAAM,WAAW,EAAE,MAAM,CAAC,MAAM,CACrC;IAAE,QAAQ,EAAE,MAAM,CAAA;CAAE,EACpB,sBAAsB,GAAG,kBAAkB,GAAG,eAAe,CAW9D,CAAC"}
@@ -1,9 +1,7 @@
1
- import * as fs from "node:fs";
2
- import * as path from "node:path";
3
- import * as os from "node:os";
4
- import { Config, ConfigProvider, Data, Effect, Option } from "effect";
5
- const CONFIG_DIR = path.join(os.homedir(), ".moltzap");
6
- const CONFIG_PATH = path.join(CONFIG_DIR, "config.json");
1
+ import { FileSystem } from "@effect/platform";
2
+ import { NodeFileSystem } from "@effect/platform-node";
3
+ import { Config, ConfigProvider, Data, Effect, Either, Option, Redacted, } from "effect";
4
+ import { getMoltZapConfigDir, getMoltZapConfigPath } from "../local-paths.js";
7
5
  const DEFAULT_SERVER_URL = "wss://api.moltzap.xyz";
8
6
  const CONFIG_FILE_MODE = 0o600;
9
7
  const JSON_INDENT_SPACES = 2;
@@ -18,111 +16,123 @@ export class AuthNotConfiguredError extends Data.TaggedError("AuthNotConfiguredE
18
16
  /** Effect.Config schema. Matches the on-disk JSON shape. */
19
17
  const ConfigSchema = Config.all({
20
18
  serverUrl: Config.string("serverUrl").pipe(Config.withDefault(DEFAULT_SERVER_URL)),
21
- apiKey: Config.option(Config.string("apiKey")),
19
+ apiKey: Config.option(Config.redacted("apiKey")),
22
20
  agentName: Config.option(Config.string("agentName")),
23
21
  });
24
22
  const EnvOverrideSchema = Config.all({
25
- apiKey: Config.option(Config.string("MOLTZAP_API_KEY")),
23
+ apiKey: Config.option(Config.redacted("MOLTZAP_API_KEY")),
26
24
  serverUrl: Config.option(Config.string("MOLTZAP_SERVER_URL")),
27
25
  });
28
26
  export function getConfigPath() {
29
- return CONFIG_PATH;
27
+ return getMoltZapConfigPath();
30
28
  }
29
+ const getConfigDir = getMoltZapConfigDir;
31
30
  const isRecord = (value) => typeof value === "object" && value !== null && !Array.isArray(value);
31
+ function describeCause(cause) {
32
+ return cause instanceof Error ? cause.message : String(cause);
33
+ }
34
+ function configReadError(configPath, cause, detail) {
35
+ return new ConfigReadError({
36
+ cause,
37
+ message: `Failed to ${detail} ${configPath}: ${describeCause(cause)}`,
38
+ path: configPath,
39
+ });
40
+ }
41
+ const readConfigFileText = (configPath) => FileSystem.FileSystem.pipe(Effect.flatMap((fileSystem) => fileSystem
42
+ .exists(configPath)
43
+ .pipe(Effect.flatMap((exists) => exists
44
+ ? fileSystem.readFileString(configPath, "utf-8")
45
+ : Effect.succeed(null)))), Effect.provide(NodeFileSystem.layer), Effect.mapError((cause) => configReadError(configPath, cause, "read")));
46
+ const parseConfigJson = (configPath, text) => Effect.try({
47
+ try: () => JSON.parse(text),
48
+ catch: (err) => configReadError(configPath, err, "parse"),
49
+ });
50
+ const requireConfigRecord = (configPath, parsed) => isRecord(parsed)
51
+ ? Effect.succeed(parsed)
52
+ : Effect.fail(new ConfigReadError({
53
+ cause: "config root is not a JSON object",
54
+ message: `Failed to parse ${configPath}: config root is not a JSON object`,
55
+ path: configPath,
56
+ }));
32
57
  /** Read the on-disk JSON (best-effort: ENOENT → empty object). */
33
58
  const readJsonFile = () => Effect.gen(function* () {
34
- const text = yield* Effect.try({
35
- try: () => fs.readFileSync(CONFIG_PATH, "utf-8"),
36
- catch: (err) => err,
37
- }).pipe(Effect.catchAll((err) => {
38
- const code = err.code;
39
- return code === "ENOENT"
40
- ? Effect.succeed(null)
41
- : Effect.fail(new ConfigReadError({
42
- cause: err,
43
- message: `Failed to read ${CONFIG_PATH}: ${err instanceof Error ? err.message : String(err)}`,
44
- path: CONFIG_PATH,
45
- }));
46
- }));
59
+ const configPath = getConfigPath();
60
+ const text = yield* readConfigFileText(configPath);
47
61
  if (text === null)
48
62
  return {};
49
- const parsed = yield* Effect.try({
50
- try: () => JSON.parse(text),
51
- catch: (err) => new ConfigReadError({
52
- cause: err,
53
- message: `Failed to parse ${CONFIG_PATH}: ${err instanceof Error ? err.message : String(err)}`,
54
- path: CONFIG_PATH,
55
- }),
56
- });
57
- if (!isRecord(parsed)) {
58
- return yield* Effect.fail(new ConfigReadError({
59
- cause: "config root is not a JSON object",
60
- message: `Failed to parse ${CONFIG_PATH}: config root is not a JSON object`,
61
- path: CONFIG_PATH,
62
- }));
63
- }
64
- return parsed;
63
+ const parsed = yield* parseConfigJson(configPath, text);
64
+ return yield* requireConfigRecord(configPath, parsed);
65
65
  });
66
- /**
67
- * Load and validate the CLI config. Merges on-disk JSON with env overrides
68
- * (MOLTZAP_SERVER_URL, MOLTZAP_API_KEY) through a single `ConfigProvider`.
69
- * Missing file resolves with defaults; parse errors surface as typed
70
- * failures so callers see them instead of getting silent defaults.
71
- */
72
- export const loadConfig = Effect.gen(function* () {
73
- const json = yield* readJsonFile();
66
+ const readEnvOverrides = () => EnvOverrideSchema.pipe(Effect.withConfigProvider(ConfigProvider.fromEnv()), Effect.orElseSucceed(() => ({
67
+ apiKey: Option.none(),
68
+ serverUrl: Option.none(),
69
+ })));
70
+ function envRecordFromOverrides(overrides) {
74
71
  const env = {};
75
- const envOverrides = yield* EnvOverrideSchema.pipe(Effect.withConfigProvider(ConfigProvider.fromEnv()), Effect.orElseSucceed(() => ({
76
- apiKey: Option.none(),
77
- serverUrl: Option.none(),
78
- })));
79
- Option.match(envOverrides.serverUrl, {
72
+ Option.match(overrides.serverUrl, {
80
73
  onNone: () => undefined,
81
74
  onSome: (value) => {
82
75
  env.serverUrl = value;
83
76
  },
84
77
  });
85
- Option.match(envOverrides.apiKey, {
78
+ Option.match(overrides.apiKey, {
86
79
  onNone: () => undefined,
87
80
  onSome: (value) => {
88
- env.apiKey = value;
81
+ env.apiKey = Redacted.value(value);
89
82
  },
90
83
  });
91
- const provider = ConfigProvider.fromJson({ ...json, ...env });
92
- const value = yield* ConfigSchema.pipe(Effect.withConfigProvider(provider), Effect.mapError((cause) => new ConfigInvalidError({
84
+ return env;
85
+ }
86
+ const decodeConfigValue = (configPath, provider) => ConfigSchema.pipe(Effect.withConfigProvider(provider), Effect.either, Effect.flatMap(Either.match({
87
+ onLeft: (cause) => Effect.fail(new ConfigInvalidError({
93
88
  cause,
94
- message: `Invalid config in ${CONFIG_PATH}: ${cause}`,
95
- path: CONFIG_PATH,
96
- })));
89
+ message: `Invalid config in ${configPath}: ${cause}`,
90
+ path: configPath,
91
+ })),
92
+ onRight: (value) => Effect.succeed(value),
93
+ })));
94
+ function toMoltZapConfig(value) {
97
95
  const result = { serverUrl: value.serverUrl };
98
96
  Option.match(value.apiKey, {
99
97
  onNone: () => undefined,
100
- onSome: (value) => {
101
- result.apiKey = value;
98
+ onSome: (apiKey) => {
99
+ result.apiKey = Redacted.value(apiKey);
102
100
  },
103
101
  });
104
102
  Option.match(value.agentName, {
105
103
  onNone: () => undefined,
106
- onSome: (value) => {
107
- result.agentName = value;
104
+ onSome: (agentName) => {
105
+ result.agentName = agentName;
108
106
  },
109
107
  });
110
108
  return result;
111
- });
109
+ }
110
+ /**
111
+ * Load and validate the CLI config. Merges on-disk JSON with env overrides
112
+ * (MOLTZAP_SERVER_URL, MOLTZAP_API_KEY) through a single `ConfigProvider`.
113
+ * Missing file resolves with defaults; parse errors surface as typed
114
+ * failures so callers see them instead of getting silent defaults.
115
+ */
116
+ export const loadConfig = Effect.gen(function* () {
117
+ const configPath = getConfigPath();
118
+ const json = yield* readJsonFile();
119
+ const env = envRecordFromOverrides(yield* readEnvOverrides());
120
+ const provider = ConfigProvider.fromJson({ ...json, ...env });
121
+ return toMoltZapConfig(yield* decodeConfigValue(configPath, provider));
122
+ }).pipe(Effect.withSpan("loadConfig"));
112
123
  /** Write a new config blob to disk. Used by `moltzap register` post-registration. */
113
- export const writeConfig = (config) => Effect.try({
114
- try: () => {
115
- fs.mkdirSync(CONFIG_DIR, { recursive: true });
116
- fs.writeFileSync(CONFIG_PATH, JSON.stringify(config, null, JSON_INDENT_SPACES) + "\n", {
117
- mode: CONFIG_FILE_MODE,
118
- });
119
- },
120
- catch: (err) => new ConfigWriteError({
121
- cause: err,
122
- message: `Failed to write ${CONFIG_PATH}: ${err instanceof Error ? err.message : String(err)}`,
123
- path: CONFIG_PATH,
124
- }),
125
- });
124
+ const writeConfig = (config) => FileSystem.FileSystem.pipe(Effect.flatMap((fileSystem) => {
125
+ const configDir = getConfigDir();
126
+ const configPath = getConfigPath();
127
+ return fileSystem.makeDirectory(configDir, { recursive: true }).pipe(Effect.zipRight(fileSystem.writeFileString(configPath, JSON.stringify(config, null, JSON_INDENT_SPACES) + "\n", { mode: CONFIG_FILE_MODE })), Effect.either, Effect.flatMap(Either.match({
128
+ onLeft: (cause) => Effect.fail(new ConfigWriteError({
129
+ cause,
130
+ message: `Failed to write ${configPath}: ${cause.message}`,
131
+ path: configPath,
132
+ })),
133
+ onRight: (value) => Effect.succeed(value),
134
+ })));
135
+ }), Effect.provide(NodeFileSystem.layer));
126
136
  /** Load-modify-write helper. */
127
137
  export const updateConfig = (updater) => loadConfig.pipe(Effect.flatMap((current) => writeConfig(updater(current))));
128
138
  /** WebSocket server URL (env-overridable). */
@@ -1 +1 @@
1
- {"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/cli/config.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/cli/config.ts"],"names":[],"mappings":"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"}
@@ -1,51 +1,89 @@
1
- import * as fs from "node:fs";
2
- import { Effect } from "effect";
3
- import { afterEach, beforeEach, describe, expect, it, vi } from "vitest";
4
- vi.mock("node:fs");
1
+ import { FileSystem, Path } from "@effect/platform";
2
+ import { NodeContext } from "@effect/platform-node";
3
+ import { it as effectIt } from "@effect/vitest";
4
+ import { Effect, Exit } from "effect";
5
+ import * as fc from "fast-check";
6
+ import { afterEach, beforeEach, describe, expect, vi } from "vitest";
5
7
  import { resolveAuth } from "./config.js";
6
- function mockConfigFile(config) {
7
- vi.mocked(fs.readFileSync).mockReturnValue(JSON.stringify(config));
8
+ const it = effectIt.scoped;
9
+ const CONFIG_FILE_NAME = "config.json";
10
+ const CONFIG_HOME_PREFIX = "moltzap-client-";
11
+ const ENV_AGENT_KEY = "moltzap_agent_envkey123";
12
+ const CONFIG_AGENT_KEY = "moltzap_agent_configkey";
13
+ const TEST_SERVER_URL = "wss://test";
14
+ const TEST_AGENT_NAME = "myagent";
15
+ const MISSING_REGISTRATION_MESSAGE = "No agent registered";
16
+ const apiKeyArbitrary = fc.stringMatching(/^moltzap_agent_[a-z0-9]{1,16}$/);
17
+ const authConfig = (apiKey) => ({
18
+ serverUrl: TEST_SERVER_URL,
19
+ apiKey,
20
+ agentName: TEST_AGENT_NAME,
21
+ });
22
+ const makeConfigHome = Effect.gen(function* () {
23
+ const fileSystem = yield* FileSystem.FileSystem;
24
+ const configHome = yield* fileSystem.makeTempDirectoryScoped({
25
+ prefix: CONFIG_HOME_PREFIX,
26
+ });
27
+ vi.stubEnv("MOLTZAP_CONFIG_HOME", configHome);
28
+ return configHome;
29
+ });
30
+ const writeConfigFile = (config) => Effect.gen(function* () {
31
+ const fileSystem = yield* FileSystem.FileSystem;
32
+ const path = yield* Path.Path;
33
+ const configHome = yield* makeConfigHome;
34
+ yield* fileSystem.writeFileString(path.join(configHome, CONFIG_FILE_NAME), JSON.stringify(config));
35
+ });
36
+ const withNodeContext = (effect) => effect.pipe(Effect.provide(NodeContext.layer));
37
+ function expectAuthConfigPreservesKey(apiKey) {
38
+ expect(authConfig(apiKey).apiKey).toBe(apiKey);
39
+ }
40
+ function authConfigPreservesGeneratedKeys() {
41
+ return Effect.sync(() => {
42
+ fc.assert(fc.property(apiKeyArbitrary, expectAuthConfigPreservesKey));
43
+ });
44
+ }
45
+ function envApiKeyTakesPriority() {
46
+ return withNodeContext(Effect.gen(function* () {
47
+ vi.stubEnv("MOLTZAP_API_KEY", ENV_AGENT_KEY);
48
+ yield* writeConfigFile(authConfig(CONFIG_AGENT_KEY));
49
+ const result = yield* resolveAuth;
50
+ expect(result).toEqual({ agentKey: ENV_AGENT_KEY });
51
+ }));
52
+ }
53
+ function configApiKeyIsUsed() {
54
+ return withNodeContext(Effect.gen(function* () {
55
+ yield* writeConfigFile(authConfig(CONFIG_AGENT_KEY));
56
+ const result = yield* resolveAuth;
57
+ expect(result).toEqual({ agentKey: CONFIG_AGENT_KEY });
58
+ }));
59
+ }
60
+ function missingConfigApiKeyFails() {
61
+ return withNodeContext(Effect.gen(function* () {
62
+ yield* writeConfigFile({ serverUrl: TEST_SERVER_URL });
63
+ const exit = yield* Effect.exit(resolveAuth);
64
+ expect(Exit.isFailure(exit)).toBe(true);
65
+ expect(String(exit)).toContain(MISSING_REGISTRATION_MESSAGE);
66
+ }));
67
+ }
68
+ function missingConfigFileFails() {
69
+ return withNodeContext(Effect.gen(function* () {
70
+ yield* makeConfigHome;
71
+ const exit = yield* Effect.exit(resolveAuth);
72
+ expect(Exit.isFailure(exit)).toBe(true);
73
+ expect(String(exit)).toContain(MISSING_REGISTRATION_MESSAGE);
74
+ }));
8
75
  }
9
76
  describe("resolveAuth", () => {
10
- const originalEnv = process.env;
11
77
  beforeEach(() => {
12
- process.env = { ...originalEnv };
13
- delete process.env.MOLTZAP_API_KEY;
14
- delete process.env.MOLTZAP_SERVER_URL;
15
- vi.mocked(fs.readFileSync).mockImplementation(() => {
16
- throw Object.assign(new Error("ENOENT"), { code: "ENOENT" });
17
- });
78
+ vi.unstubAllEnvs();
18
79
  });
19
80
  afterEach(() => {
20
- process.env = originalEnv;
21
- vi.restoreAllMocks();
22
- });
23
- it("MOLTZAP_API_KEY env var takes highest priority", async () => {
24
- process.env.MOLTZAP_API_KEY = "moltzap_agent_envkey123";
25
- mockConfigFile({
26
- serverUrl: "wss://test",
27
- apiKey: "moltzap_agent_configkey",
28
- agentName: "myagent",
29
- });
30
- const result = await Effect.runPromise(resolveAuth);
31
- expect(result).toEqual({ agentKey: "moltzap_agent_envkey123" });
32
- });
33
- it("config apiKey is used when no env var", async () => {
34
- mockConfigFile({
35
- serverUrl: "wss://test",
36
- apiKey: "moltzap_agent_configkey",
37
- agentName: "myagent",
38
- });
39
- const result = await Effect.runPromise(resolveAuth);
40
- expect(result).toEqual({ agentKey: "moltzap_agent_configkey" });
41
- });
42
- it("fails if no env var and no config apiKey", async () => {
43
- mockConfigFile({ serverUrl: "wss://test" });
44
- await expect(Effect.runPromise(resolveAuth)).rejects.toThrow("No agent registered");
45
- });
46
- it("fails if config file missing", async () => {
47
- // readFileSync throws ENOENT (set in beforeEach)
48
- await expect(Effect.runPromise(resolveAuth)).rejects.toThrow("No agent registered");
81
+ vi.unstubAllEnvs();
49
82
  });
83
+ it("auth config fixture preserves generated api keys", authConfigPreservesGeneratedKeys);
84
+ it("MOLTZAP_API_KEY env var takes highest priority", envApiKeyTakesPriority);
85
+ it("config apiKey is used when no env var", configApiKeyIsUsed);
86
+ it("fails if no env var and no config apiKey", missingConfigApiKeyFails);
87
+ it("fails if config file missing", missingConfigFileFails);
50
88
  });
51
89
  //# sourceMappingURL=config.test.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"config.test.js","sourceRoot":"","sources":["../../src/cli/config.test.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,SAAS,CAAC;AAC9B,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAChC,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAEzE,EAAE,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;AAEnB,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAE1C,SAAS,cAAc,CAAC,MAAc;IACpC,EAAE,CAAC,MAAM,CAAC,EAAE,CAAC,YAAY,CAAC,CAAC,eAAe,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC;AACrE,CAAC;AAED,QAAQ,CAAC,aAAa,EAAE,GAAG,EAAE;IAC3B,MAAM,WAAW,GAAG,OAAO,CAAC,GAAG,CAAC;IAEhC,UAAU,CAAC,GAAG,EAAE;QACd,OAAO,CAAC,GAAG,GAAG,EAAE,GAAG,WAAW,EAAE,CAAC;QACjC,OAAO,OAAO,CAAC,GAAG,CAAC,eAAe,CAAC;QACnC,OAAO,OAAO,CAAC,GAAG,CAAC,kBAAkB,CAAC;QACtC,EAAE,CAAC,MAAM,CAAC,EAAE,CAAC,YAAY,CAAC,CAAC,kBAAkB,CAAC,GAAG,EAAE;YACjD,MAAM,MAAM,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC,CAAC;QAC/D,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,SAAS,CAAC,GAAG,EAAE;QACb,OAAO,CAAC,GAAG,GAAG,WAAW,CAAC;QAC1B,EAAE,CAAC,eAAe,EAAE,CAAC;IACvB,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,gDAAgD,EAAE,KAAK,IAAI,EAAE;QAC9D,OAAO,CAAC,GAAG,CAAC,eAAe,GAAG,yBAAyB,CAAC;QACxD,cAAc,CAAC;YACb,SAAS,EAAE,YAAY;YACvB,MAAM,EAAE,yBAAyB;YACjC,SAAS,EAAE,SAAS;SACrB,CAAC,CAAC;QAEH,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,UAAU,CAAC,WAAW,CAAC,CAAC;QACpD,MAAM,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,EAAE,QAAQ,EAAE,yBAAyB,EAAE,CAAC,CAAC;IAClE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,uCAAuC,EAAE,KAAK,IAAI,EAAE;QACrD,cAAc,CAAC;YACb,SAAS,EAAE,YAAY;YACvB,MAAM,EAAE,yBAAyB;YACjC,SAAS,EAAE,SAAS;SACrB,CAAC,CAAC;QAEH,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,UAAU,CAAC,WAAW,CAAC,CAAC;QACpD,MAAM,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,EAAE,QAAQ,EAAE,yBAAyB,EAAE,CAAC,CAAC;IAClE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,0CAA0C,EAAE,KAAK,IAAI,EAAE;QACxD,cAAc,CAAC,EAAE,SAAS,EAAE,YAAY,EAAE,CAAC,CAAC;QAE5C,MAAM,MAAM,CAAC,MAAM,CAAC,UAAU,CAAC,WAAW,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAC1D,qBAAqB,CACtB,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,8BAA8B,EAAE,KAAK,IAAI,EAAE;QAC5C,iDAAiD;QACjD,MAAM,MAAM,CAAC,MAAM,CAAC,UAAU,CAAC,WAAW,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAC1D,qBAAqB,CACtB,CAAC;IACJ,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
1
+ {"version":3,"file":"config.test.js","sourceRoot":"","sources":["../../src/cli/config.test.ts"],"names":[],"mappings":"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"}
@@ -1,18 +1,3 @@
1
1
  #!/usr/bin/env node
2
- /**
3
- * Pull `--as <key>` and `--profile <name>` out of argv before handing the
4
- * remainder to `@effect/cli`. These are semantically global flags that
5
- * shape the transport layer for the whole invocation (spec sbd#177 rev 3
6
- * §5.1, §5.2, Invariant §4.2). Pre-parsing keeps the @effect/cli subcommand
7
- * tree clean of duplicated global options and guarantees `--as` can short-
8
- * circuit config-read side effects (architect design doc rev 4 finding 1).
9
- *
10
- * Accepts both `--as KEY` / `--as=KEY` forms; unknown flags pass through
11
- * to @effect/cli unchanged.
12
- */
13
- export declare const extractGlobalFlags: (argv: ReadonlyArray<string>) => {
14
- impersonateKey?: string;
15
- profileName?: string;
16
- rest: Array<string>;
17
- };
2
+ export {};
18
3
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":";AAmCA;;;;;;;;;;GAUG;AACH,eAAO,MAAM,kBAAkB,GAC7B,MAAM,aAAa,CAAC,MAAM,CAAC,KAC1B;IACD,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,IAAI,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC;CAqDrB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":""}
package/dist/cli/index.js CHANGED
@@ -1,8 +1,9 @@
1
1
  #!/usr/bin/env node
2
- import { createRequire } from "node:module";
3
- import { Command } from "@effect/cli";
2
+ /** @file MoltZap CLI entrypoint and global transport option wiring. */
3
+ import { Command, Options } from "@effect/cli";
4
4
  import { NodeContext, NodeRuntime } from "@effect/platform-node";
5
- import { Effect, Logger } from "effect";
5
+ import { Effect, Layer, Logger, Option } from "effect";
6
+ import packageJson from "../../package.json" with { type: "json" };
6
7
  import { agentsCommand } from "./commands/agents.js";
7
8
  import { contactsCommand } from "./commands/contacts.js";
8
9
  import { conversationsCommand, historyCommand, } from "./commands/conversations.js";
@@ -17,79 +18,58 @@ import { whoamiCommand } from "./commands/whoami.js";
17
18
  import { LoggerLive, minLogLevel } from "./runtime.js";
18
19
  import { makeTransportLayer, resolveTransportInputs, TransportConfigError, } from "./transport.js";
19
20
  import { ProfileConfigReadError, ProfileInvalidNameError, ProfileNotFoundError, } from "./profile.js";
20
- const require = createRequire(import.meta.url);
21
- const { version } = require("../../package.json");
22
- /**
23
- * Pull `--as <key>` and `--profile <name>` out of argv before handing the
24
- * remainder to `@effect/cli`. These are semantically global flags that
25
- * shape the transport layer for the whole invocation (spec sbd#177 rev 3
26
- * §5.1, §5.2, Invariant §4.2). Pre-parsing keeps the @effect/cli subcommand
27
- * tree clean of duplicated global options and guarantees `--as` can short-
28
- * circuit config-read side effects (architect design doc rev 4 finding 1).
29
- *
30
- * Accepts both `--as KEY` / `--as=KEY` forms; unknown flags pass through
31
- * to @effect/cli unchanged.
32
- */
33
- export const extractGlobalFlags = (argv) => {
34
- // register parses --profile locally (spec §5.2: it writes a NEW profile).
35
- // Intercepting at global scope would make the transport-resolver treat a
36
- // not-yet-created profile as a lookup failure. Route --profile to register
37
- // when register is the invoked subcommand; route globally otherwise.
38
- const isRegister = argv.some((t, i) => t === "register" &&
39
- argv.slice(0, i).every((prev) => !prev.startsWith("-")));
40
- const rest = [];
41
- let impersonateKey;
42
- let profileName;
43
- for (let i = 0; i < argv.length; i++) {
44
- const token = argv[i];
45
- if (token === "--as") {
46
- const next = argv[i + 1];
47
- if (next !== undefined) {
48
- impersonateKey = next;
49
- i++;
50
- }
51
- continue;
52
- }
53
- if (token.startsWith("--as=")) {
54
- impersonateKey = token.slice("--as=".length);
55
- continue;
56
- }
57
- if (!isRegister) {
58
- if (token === "--profile") {
59
- const next = argv[i + 1];
60
- if (next !== undefined) {
61
- profileName = next;
62
- i++;
63
- }
64
- continue;
65
- }
66
- if (token.startsWith("--profile=")) {
67
- profileName = token.slice("--profile=".length);
68
- continue;
69
- }
70
- }
71
- rest.push(token);
21
+ import { currentArgv } from "./process-argv.js";
22
+ const { version } = packageJson;
23
+ const asOption = Options.text("as").pipe(Options.withDescription("Dial the server as the agent owning this API key, bypassing the local daemon."), Options.optional);
24
+ const globalProfileOption = Options.text("profile").pipe(Options.withDescription("Load an existing named profile from ~/.moltzap/config.json for this invocation."), Options.optional);
25
+ function resolverInputFromConfig(config) {
26
+ const impersonateKey = Option.getOrUndefined(config.as);
27
+ const profileName = Option.getOrUndefined(config.profile);
28
+ return {
29
+ ...(impersonateKey !== undefined ? { impersonateKey } : {}),
30
+ ...(profileName !== undefined ? { profileName } : {}),
31
+ };
32
+ }
33
+ function exitWithCliError(message) {
34
+ console.error(`moltzap: ${message}`);
35
+ process.exit(1);
36
+ }
37
+ function transportResolutionMessage(err) {
38
+ if (err instanceof ProfileNotFoundError) {
39
+ return `profile not found: ${err.name}`;
40
+ }
41
+ if (err instanceof ProfileInvalidNameError) {
42
+ return `invalid profile name "${err.name}": ${err.reason}`;
72
43
  }
73
- const out = { rest };
74
- if (impersonateKey !== undefined)
75
- out.impersonateKey = impersonateKey;
76
- if (profileName !== undefined)
77
- out.profileName = profileName;
78
- return out;
79
- };
44
+ if (err instanceof ProfileConfigReadError) {
45
+ const cause = err.cause instanceof Error ? err.cause.message : String(err.cause);
46
+ return `config read error at ${err.path}: ${cause}`;
47
+ }
48
+ if (err instanceof TransportConfigError) {
49
+ return `transport config: ${err.reason}`;
50
+ }
51
+ return err instanceof Error ? err.message : String(err);
52
+ }
53
+ function resolveTransportOptionsOrExit(input) {
54
+ return resolveTransportInputs(input).pipe(Effect.catchAll((err) => Effect.sync(() => exitWithCliError(transportResolutionMessage(err)))));
55
+ }
56
+ const transportLayerFromConfig = (config) => Layer.unwrapEffect(resolveTransportOptionsOrExit(resolverInputFromConfig(config)).pipe(Effect.map(makeTransportLayer)));
80
57
  /**
81
58
  * Top-level `moltzap` command. Subcommands are `@effect/cli` `Command`s —
82
59
  * each handler returns an Effect. The single `NodeRuntime.runMain` below is
83
60
  * the ONLY bridge from the Effect graph to Node; no per-command runPromise.
84
61
  *
85
- * Global flags (`--as`, `--profile`) are pre-parsed from argv in
86
- * `extractGlobalFlags` above and provided to subcommand handlers via the
87
- * `Transport` Layer (see `transport.ts`).
62
+ * Parent options (`--as`, `--profile`) are parsed by `@effect/cli` and
63
+ * provided to subcommand handlers via the `Transport` Layer (see
64
+ * `transport.ts`).
88
65
  */
89
- const moltzap = Command.make("moltzap").pipe(Command.withDescription("MoltZap CLI — messaging for OpenClaw AI agents.\n" +
66
+ const moltzapBase = Command.make("moltzap", {
67
+ as: asOption,
68
+ profile: globalProfileOption,
69
+ }).pipe(Command.withDescription("MoltZap CLI — messaging for OpenClaw AI agents.\n" +
90
70
  "\n" +
91
- "Global flags (pre-parsed by the CLI before @effect/cli sees argv; " +
92
- "shared across every subcommand):\n" +
71
+ "Global flags (parsed by @effect/cli before the selected subcommand " +
72
+ "runs):\n" +
93
73
  " --as <apiKey> Dial the server as the agent owning the given " +
94
74
  "API key, bypassing the local daemon. Useful for multi-agent hosts " +
95
75
  "where one operator drives multiple registered agents.\n" +
@@ -118,50 +98,7 @@ const moltzap = Command.make("moltzap").pipe(Command.withDescription("MoltZap CL
118
98
  // sbd#177 v2 additions:
119
99
  messagesCommand,
120
100
  ]));
101
+ const moltzap = Command.provide(moltzapBase, (config) => transportLayerFromConfig(config));
121
102
  const cli = Command.run(moltzap, { name: "moltzap", version });
122
- const NODE_ARGV_USER_ARGS_OFFSET = 2;
123
- const { impersonateKey, profileName, rest } = extractGlobalFlags(process.argv.slice(NODE_ARGV_USER_ARGS_OFFSET));
124
- const resolverInput = {};
125
- if (impersonateKey !== undefined)
126
- resolverInput.impersonateKey = impersonateKey;
127
- if (profileName !== undefined)
128
- resolverInput.profileName = profileName;
129
- // Resolve transport inputs eagerly. On failure exit with a user-readable
130
- // message before touching @effect/cli; the CLI parser never sees a broken
131
- // transport config.
132
- const transportOptions = (() => {
133
- const exit1 = (msg) => {
134
- console.error(`moltzap: ${msg}`);
135
- process.exit(1);
136
- };
137
- try {
138
- return Effect.runSync(resolveTransportInputs(resolverInput));
139
- }
140
- catch (err) {
141
- if (err instanceof ProfileNotFoundError) {
142
- return exit1(`profile not found: ${err.name}`);
143
- }
144
- if (err instanceof ProfileInvalidNameError) {
145
- return exit1(`invalid profile name "${err.name}": ${err.reason}`);
146
- }
147
- if (err instanceof ProfileConfigReadError) {
148
- const cause = err.cause instanceof Error ? err.cause.message : String(err.cause);
149
- return exit1(`config read error at ${err.path}: ${cause}`);
150
- }
151
- if (err instanceof TransportConfigError) {
152
- return exit1(`transport config: ${err.reason}`);
153
- }
154
- const msg = err instanceof Error ? err.message : String(err);
155
- return exit1(msg);
156
- }
157
- })();
158
- const TransportLive = makeTransportLayer(transportOptions);
159
- // Re-assemble argv so @effect/cli sees the same process-shape it expects
160
- // (Command.run slices off the first two tokens).
161
- const argvForCli = [
162
- process.argv[0] ?? "node",
163
- process.argv[1] ?? "moltzap",
164
- ...rest,
165
- ];
166
- cli(argvForCli).pipe(Effect.provide(TransportLive), Effect.provide(NodeContext.layer), Effect.provide(LoggerLive), Logger.withMinimumLogLevel(minLogLevel), NodeRuntime.runMain);
103
+ cli(currentArgv()).pipe(Effect.provide(NodeContext.layer), Effect.provide(LoggerLive), Logger.withMinimumLogLevel(minLogLevel), NodeRuntime.runMain);
167
104
  //# sourceMappingURL=index.js.map