@moltzap/client 2026.414.0 → 2026.425.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 (216) hide show
  1. package/dist/channel-core.d.ts +28 -15
  2. package/dist/channel-core.d.ts.map +1 -1
  3. package/dist/channel-core.js +113 -74
  4. package/dist/channel-core.js.map +1 -1
  5. package/dist/channel-core.test.js +126 -34
  6. package/dist/channel-core.test.js.map +1 -1
  7. package/dist/cli/__tests__/cli-multi-agent.int.test.d.ts +2 -0
  8. package/dist/cli/__tests__/cli-multi-agent.int.test.d.ts.map +1 -0
  9. package/dist/cli/__tests__/cli-multi-agent.int.test.js +26 -0
  10. package/dist/cli/__tests__/cli-multi-agent.int.test.js.map +1 -0
  11. package/dist/cli/commands/agents.d.ts +13 -2
  12. package/dist/cli/commands/agents.d.ts.map +1 -1
  13. package/dist/cli/commands/agents.js +30 -18
  14. package/dist/cli/commands/agents.js.map +1 -1
  15. package/dist/cli/commands/apps.d.ts +96 -0
  16. package/dist/cli/commands/apps.d.ts.map +1 -0
  17. package/dist/cli/commands/apps.js +193 -0
  18. package/dist/cli/commands/apps.js.map +1 -0
  19. package/dist/cli/commands/apps.test.d.ts +2 -0
  20. package/dist/cli/commands/apps.test.d.ts.map +1 -0
  21. package/dist/cli/commands/apps.test.js +220 -0
  22. package/dist/cli/commands/apps.test.js.map +1 -0
  23. package/dist/cli/commands/contacts.d.ts +18 -2
  24. package/dist/cli/commands/contacts.d.ts.map +1 -1
  25. package/dist/cli/commands/contacts.js +44 -52
  26. package/dist/cli/commands/contacts.js.map +1 -1
  27. package/dist/cli/commands/conversations-v2.test.d.ts +2 -0
  28. package/dist/cli/commands/conversations-v2.test.d.ts.map +1 -0
  29. package/dist/cli/commands/conversations-v2.test.js +92 -0
  30. package/dist/cli/commands/conversations-v2.test.js.map +1 -0
  31. package/dist/cli/commands/conversations.d.ts +73 -3
  32. package/dist/cli/commands/conversations.d.ts.map +1 -1
  33. package/dist/cli/commands/conversations.js +157 -108
  34. package/dist/cli/commands/conversations.js.map +1 -1
  35. package/dist/cli/commands/invite.d.ts +6 -2
  36. package/dist/cli/commands/invite.d.ts.map +1 -1
  37. package/dist/cli/commands/invite.js +8 -6
  38. package/dist/cli/commands/invite.js.map +1 -1
  39. package/dist/cli/commands/messages.d.ts +48 -0
  40. package/dist/cli/commands/messages.d.ts.map +1 -0
  41. package/dist/cli/commands/messages.js +68 -0
  42. package/dist/cli/commands/messages.js.map +1 -0
  43. package/dist/cli/commands/messages.test.d.ts +2 -0
  44. package/dist/cli/commands/messages.test.d.ts.map +1 -0
  45. package/dist/cli/commands/messages.test.js +73 -0
  46. package/dist/cli/commands/messages.test.js.map +1 -0
  47. package/dist/cli/commands/permissions.d.ts +66 -0
  48. package/dist/cli/commands/permissions.d.ts.map +1 -0
  49. package/dist/cli/commands/permissions.js +101 -0
  50. package/dist/cli/commands/permissions.js.map +1 -0
  51. package/dist/cli/commands/permissions.test.d.ts +2 -0
  52. package/dist/cli/commands/permissions.test.d.ts.map +1 -0
  53. package/dist/cli/commands/permissions.test.js +126 -0
  54. package/dist/cli/commands/permissions.test.js.map +1 -0
  55. package/dist/cli/commands/ping.d.ts +6 -2
  56. package/dist/cli/commands/ping.d.ts.map +1 -1
  57. package/dist/cli/commands/ping.js +21 -20
  58. package/dist/cli/commands/ping.js.map +1 -1
  59. package/dist/cli/commands/presence.d.ts +10 -2
  60. package/dist/cli/commands/presence.d.ts.map +1 -1
  61. package/dist/cli/commands/presence.js +27 -15
  62. package/dist/cli/commands/presence.js.map +1 -1
  63. package/dist/cli/commands/register.d.ts +24 -2
  64. package/dist/cli/commands/register.d.ts.map +1 -1
  65. package/dist/cli/commands/register.js +123 -47
  66. package/dist/cli/commands/register.js.map +1 -1
  67. package/dist/cli/commands/register.test.js +45 -27
  68. package/dist/cli/commands/register.test.js.map +1 -1
  69. package/dist/cli/commands/send.d.ts +43 -2
  70. package/dist/cli/commands/send.d.ts.map +1 -1
  71. package/dist/cli/commands/send.js +55 -13
  72. package/dist/cli/commands/send.js.map +1 -1
  73. package/dist/cli/commands/send.test.js +20 -19
  74. package/dist/cli/commands/send.test.js.map +1 -1
  75. package/dist/cli/commands/status.d.ts +6 -2
  76. package/dist/cli/commands/status.d.ts.map +1 -1
  77. package/dist/cli/commands/status.js +16 -10
  78. package/dist/cli/commands/status.js.map +1 -1
  79. package/dist/cli/commands/whoami.d.ts +7 -2
  80. package/dist/cli/commands/whoami.d.ts.map +1 -1
  81. package/dist/cli/commands/whoami.js +13 -7
  82. package/dist/cli/commands/whoami.js.map +1 -1
  83. package/dist/cli/config.d.ts +24 -8
  84. package/dist/cli/config.d.ts.map +1 -1
  85. package/dist/cli/config.js +65 -39
  86. package/dist/cli/config.js.map +1 -1
  87. package/dist/cli/config.test.js +12 -10
  88. package/dist/cli/config.test.js.map +1 -1
  89. package/dist/cli/http-client.d.ts +6 -2
  90. package/dist/cli/http-client.d.ts.map +1 -1
  91. package/dist/cli/http-client.js +25 -24
  92. package/dist/cli/http-client.js.map +1 -1
  93. package/dist/cli/index.d.ts +16 -1
  94. package/dist/cli/index.d.ts.map +1 -1
  95. package/dist/cli/index.js +160 -27
  96. package/dist/cli/index.js.map +1 -1
  97. package/dist/cli/profile.d.ts +134 -0
  98. package/dist/cli/profile.d.ts.map +1 -0
  99. package/dist/cli/profile.js +217 -0
  100. package/dist/cli/profile.js.map +1 -0
  101. package/dist/cli/profile.test.d.ts +2 -0
  102. package/dist/cli/profile.test.d.ts.map +1 -0
  103. package/dist/cli/profile.test.js +263 -0
  104. package/dist/cli/profile.test.js.map +1 -0
  105. package/dist/cli/runtime.d.ts +34 -0
  106. package/dist/cli/runtime.d.ts.map +1 -0
  107. package/dist/cli/runtime.js +94 -0
  108. package/dist/cli/runtime.js.map +1 -0
  109. package/dist/cli/socket-client.d.ts +15 -12
  110. package/dist/cli/socket-client.d.ts.map +1 -1
  111. package/dist/cli/socket-client.js +72 -75
  112. package/dist/cli/socket-client.js.map +1 -1
  113. package/dist/cli/transport.d.ts +181 -0
  114. package/dist/cli/transport.d.ts.map +1 -0
  115. package/dist/cli/transport.js +324 -0
  116. package/dist/cli/transport.js.map +1 -0
  117. package/dist/cli/transport.test.d.ts +2 -0
  118. package/dist/cli/transport.test.d.ts.map +1 -0
  119. package/dist/cli/transport.test.js +197 -0
  120. package/dist/cli/transport.test.js.map +1 -0
  121. package/dist/index.d.ts +6 -2
  122. package/dist/index.d.ts.map +1 -1
  123. package/dist/index.js +1 -0
  124. package/dist/index.js.map +1 -1
  125. package/dist/runtime/close-info.d.ts +94 -0
  126. package/dist/runtime/close-info.d.ts.map +1 -0
  127. package/dist/runtime/close-info.js +109 -0
  128. package/dist/runtime/close-info.js.map +1 -0
  129. package/dist/runtime/close-info.test.d.ts +2 -0
  130. package/dist/runtime/close-info.test.d.ts.map +1 -0
  131. package/dist/runtime/close-info.test.js +102 -0
  132. package/dist/runtime/close-info.test.js.map +1 -0
  133. package/dist/runtime/errors.d.ts +47 -0
  134. package/dist/runtime/errors.d.ts.map +1 -0
  135. package/dist/runtime/errors.js +20 -0
  136. package/dist/runtime/errors.js.map +1 -0
  137. package/dist/runtime/errors.test.d.ts +2 -0
  138. package/dist/runtime/errors.test.d.ts.map +1 -0
  139. package/dist/runtime/errors.test.js +66 -0
  140. package/dist/runtime/errors.test.js.map +1 -0
  141. package/dist/runtime/frame.d.ts +25 -0
  142. package/dist/runtime/frame.d.ts.map +1 -0
  143. package/dist/runtime/frame.js +106 -0
  144. package/dist/runtime/frame.js.map +1 -0
  145. package/dist/runtime/frame.test.d.ts +2 -0
  146. package/dist/runtime/frame.test.d.ts.map +1 -0
  147. package/dist/runtime/frame.test.js +32 -0
  148. package/dist/runtime/frame.test.js.map +1 -0
  149. package/dist/runtime/index.d.ts +3 -0
  150. package/dist/runtime/index.d.ts.map +1 -0
  151. package/dist/runtime/index.js +3 -0
  152. package/dist/runtime/index.js.map +1 -0
  153. package/dist/runtime/refs.d.ts +10 -0
  154. package/dist/runtime/refs.d.ts.map +1 -0
  155. package/dist/runtime/refs.js +10 -0
  156. package/dist/runtime/refs.js.map +1 -0
  157. package/dist/runtime/runtime.test.d.ts +2 -0
  158. package/dist/runtime/runtime.test.d.ts.map +1 -0
  159. package/dist/runtime/runtime.test.js +29 -0
  160. package/dist/runtime/runtime.test.js.map +1 -0
  161. package/dist/runtime/subscribers.d.ts +157 -0
  162. package/dist/runtime/subscribers.d.ts.map +1 -0
  163. package/dist/runtime/subscribers.js +131 -0
  164. package/dist/runtime/subscribers.js.map +1 -0
  165. package/dist/runtime/subscribers.test.d.ts +2 -0
  166. package/dist/runtime/subscribers.test.d.ts.map +1 -0
  167. package/dist/runtime/subscribers.test.js +155 -0
  168. package/dist/runtime/subscribers.test.js.map +1 -0
  169. package/dist/service.d.ts +68 -17
  170. package/dist/service.d.ts.map +1 -1
  171. package/dist/service.js +461 -307
  172. package/dist/service.js.map +1 -1
  173. package/dist/service.test.js +266 -77
  174. package/dist/service.test.js.map +1 -1
  175. package/dist/test/index.d.ts +33 -0
  176. package/dist/test/index.d.ts.map +1 -0
  177. package/dist/test/index.js +44 -0
  178. package/dist/test/index.js.map +1 -0
  179. package/dist/test-utils/channel-service-fixture.d.ts +2 -1
  180. package/dist/test-utils/channel-service-fixture.d.ts.map +1 -1
  181. package/dist/test-utils/channel-service-fixture.js +31 -11
  182. package/dist/test-utils/channel-service-fixture.js.map +1 -1
  183. package/dist/test-utils/conformance-adapter.d.ts +50 -0
  184. package/dist/test-utils/conformance-adapter.d.ts.map +1 -0
  185. package/dist/test-utils/conformance-adapter.js +206 -0
  186. package/dist/test-utils/conformance-adapter.js.map +1 -0
  187. package/dist/test-utils/fake-service.d.ts +85 -0
  188. package/dist/test-utils/fake-service.d.ts.map +1 -0
  189. package/dist/test-utils/fake-service.js +103 -0
  190. package/dist/test-utils/fake-service.js.map +1 -0
  191. package/dist/test-utils/index.d.ts +2 -0
  192. package/dist/test-utils/index.d.ts.map +1 -1
  193. package/dist/test-utils/index.js +3 -2
  194. package/dist/test-utils/index.js.map +1 -1
  195. package/dist/ws-client.d.ts +157 -18
  196. package/dist/ws-client.d.ts.map +1 -1
  197. package/dist/ws-client.js +432 -94
  198. package/dist/ws-client.js.map +1 -1
  199. package/dist/ws-client.test.d.ts +2 -0
  200. package/dist/ws-client.test.d.ts.map +1 -0
  201. package/dist/ws-client.test.js +672 -0
  202. package/dist/ws-client.test.js.map +1 -0
  203. package/package.json +23 -14
  204. package/LICENSE +0 -21
  205. package/dist/__tests__/service.integration.test.d.ts +0 -2
  206. package/dist/__tests__/service.integration.test.d.ts.map +0 -1
  207. package/dist/__tests__/service.integration.test.js +0 -1087
  208. package/dist/__tests__/service.integration.test.js.map +0 -1
  209. package/dist/cli/commands/delete.d.ts +0 -3
  210. package/dist/cli/commands/delete.d.ts.map +0 -1
  211. package/dist/cli/commands/delete.js +0 -10
  212. package/dist/cli/commands/delete.js.map +0 -1
  213. package/dist/cli/commands/react.d.ts +0 -3
  214. package/dist/cli/commands/react.d.ts.map +0 -1
  215. package/dist/cli/commands/react.js +0 -18
  216. package/dist/cli/commands/react.js.map +0 -1
@@ -1,3 +1,8 @@
1
- import { Command } from "commander";
2
- export declare const whoamiCommand: Command;
1
+ import { Command } from "@effect/cli";
2
+ /**
3
+ * `moltzap whoami` — print config path + server URL, and if registered the
4
+ * agent name + masked API key. Output is user-facing prose so it goes to
5
+ * `console.log` rather than the structured logger.
6
+ */
7
+ export declare const whoamiCommand: Command.Command<"whoami", never, never, {}>;
3
8
  //# sourceMappingURL=whoami.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"whoami.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/whoami.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAGpC,eAAO,MAAM,aAAa,SAgBtB,CAAC"}
1
+ {"version":3,"file":"whoami.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/whoami.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AAItC;;;;GAIG;AACH,eAAO,MAAM,aAAa,6CAwBsC,CAAC"}
@@ -1,9 +1,12 @@
1
- import { Command } from "commander";
2
- import { readConfig, getConfigPath } from "../config.js";
3
- export const whoamiCommand = new Command("whoami")
4
- .description("Show current agent and config")
5
- .action(() => {
6
- const config = readConfig();
1
+ import { Command } from "@effect/cli";
2
+ import { Effect } from "effect";
3
+ import { getConfigPath, loadConfig } from "../config.js";
4
+ /**
5
+ * `moltzap whoami` — print config path + server URL, and if registered the
6
+ * agent name + masked API key. Output is user-facing prose so it goes to
7
+ * `console.log` rather than the structured logger.
8
+ */
9
+ export const whoamiCommand = Command.make("whoami", {}, () => loadConfig.pipe(Effect.tap((config) => Effect.sync(() => {
7
10
  console.log(`Config: ${getConfigPath()}`);
8
11
  console.log(`Server: ${config.serverUrl}`);
9
12
  if (config.agentName && config.apiKey) {
@@ -14,5 +17,8 @@ export const whoamiCommand = new Command("whoami")
14
17
  else {
15
18
  console.log(`\nNo agent registered.`);
16
19
  }
17
- });
20
+ })), Effect.asVoid, Effect.catchAll((err) => Effect.sync(() => {
21
+ console.error(`Config load failed: ${err.message}`);
22
+ process.exit(1);
23
+ })))).pipe(Command.withDescription("Show current agent and config"));
18
24
  //# sourceMappingURL=whoami.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"whoami.js","sourceRoot":"","sources":["../../../src/cli/commands/whoami.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAEzD,MAAM,CAAC,MAAM,aAAa,GAAG,IAAI,OAAO,CAAC,QAAQ,CAAC;KAC/C,WAAW,CAAC,+BAA+B,CAAC;KAC5C,MAAM,CAAC,GAAG,EAAE;IACX,MAAM,MAAM,GAAG,UAAU,EAAE,CAAC;IAE5B,OAAO,CAAC,GAAG,CAAC,WAAW,aAAa,EAAE,EAAE,CAAC,CAAC;IAC1C,OAAO,CAAC,GAAG,CAAC,WAAW,MAAM,CAAC,SAAS,EAAE,CAAC,CAAC;IAE3C,IAAI,MAAM,CAAC,SAAS,IAAI,MAAM,CAAC,MAAM,EAAE,CAAC;QACtC,MAAM,MAAM,GACV,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,KAAK,GAAG,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;QAC/D,OAAO,CAAC,GAAG,CAAC,YAAY,MAAM,CAAC,SAAS,EAAE,CAAC,CAAC;QAC5C,OAAO,CAAC,GAAG,CAAC,cAAc,MAAM,EAAE,CAAC,CAAC;IACtC,CAAC;SAAM,CAAC;QACN,OAAO,CAAC,GAAG,CAAC,wBAAwB,CAAC,CAAC;IACxC,CAAC;AACH,CAAC,CAAC,CAAC"}
1
+ {"version":3,"file":"whoami.js","sourceRoot":"","sources":["../../../src/cli/commands/whoami.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AACtC,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAChC,OAAO,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAEzD;;;;GAIG;AACH,MAAM,CAAC,MAAM,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC,QAAQ,EAAE,EAAE,EAAE,GAAG,EAAE,CAC3D,UAAU,CAAC,IAAI,CACb,MAAM,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CACpB,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE;IACf,OAAO,CAAC,GAAG,CAAC,WAAW,aAAa,EAAE,EAAE,CAAC,CAAC;IAC1C,OAAO,CAAC,GAAG,CAAC,WAAW,MAAM,CAAC,SAAS,EAAE,CAAC,CAAC;IAC3C,IAAI,MAAM,CAAC,SAAS,IAAI,MAAM,CAAC,MAAM,EAAE,CAAC;QACtC,MAAM,MAAM,GACV,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,KAAK,GAAG,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;QAC/D,OAAO,CAAC,GAAG,CAAC,YAAY,MAAM,CAAC,SAAS,EAAE,CAAC,CAAC;QAC5C,OAAO,CAAC,GAAG,CAAC,cAAc,MAAM,EAAE,CAAC,CAAC;IACtC,CAAC;SAAM,CAAC;QACN,OAAO,CAAC,GAAG,CAAC,wBAAwB,CAAC,CAAC;IACxC,CAAC;AACH,CAAC,CAAC,CACH,EACD,MAAM,CAAC,MAAM,EACb,MAAM,CAAC,QAAQ,CAAC,CAAC,GAAG,EAAE,EAAE,CACtB,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE;IACf,OAAO,CAAC,KAAK,CAAC,uBAAuB,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC;IACpD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CACH,CACF,CACF,CAAC,IAAI,CAAC,OAAO,CAAC,eAAe,CAAC,+BAA+B,CAAC,CAAC,CAAC"}
@@ -1,16 +1,32 @@
1
+ import { Effect } from "effect";
2
+ /**
3
+ * CLI config shape. Loaded via `Effect.Config` from the on-disk JSON file
4
+ * merged with process.env overrides. `apiKey` and `agentName` are populated
5
+ * by `moltzap register`.
6
+ */
1
7
  export interface MoltZapConfig {
2
8
  serverUrl: string;
3
9
  apiKey?: string;
4
10
  agentName?: string;
5
11
  }
6
12
  export declare function getConfigPath(): string;
7
- export declare function readConfig(): MoltZapConfig;
8
- export declare function writeConfig(config: MoltZapConfig): void;
9
- export declare function updateConfig(updater: (config: MoltZapConfig) => MoltZapConfig): void;
10
- export declare function getServerUrl(): string;
11
- export declare function getHttpUrl(): string;
12
- /** Resolve agent API key: MOLTZAP_API_KEY env var → config → fail. */
13
- export declare function resolveAuth(): {
13
+ /**
14
+ * Load and validate the CLI config. Merges on-disk JSON with env overrides
15
+ * (MOLTZAP_SERVER_URL, MOLTZAP_API_KEY) through a single `ConfigProvider`.
16
+ * Missing file resolves with defaults; parse errors surface as typed
17
+ * failures so callers see them instead of getting silent defaults.
18
+ */
19
+ export declare const loadConfig: Effect.Effect<MoltZapConfig, Error>;
20
+ /** Write a new config blob to disk. Used by `moltzap register` post-registration. */
21
+ export declare const writeConfig: (config: MoltZapConfig) => Effect.Effect<void, Error>;
22
+ /** Load-modify-write helper. */
23
+ export declare const updateConfig: (updater: (config: MoltZapConfig) => MoltZapConfig) => Effect.Effect<void, Error>;
24
+ /** WebSocket server URL (env-overridable). */
25
+ export declare const getServerUrl: Effect.Effect<string, Error>;
26
+ /** HTTP base URL — ws/wss → http/https. */
27
+ export declare const getHttpUrl: Effect.Effect<string, Error>;
28
+ /** Resolve agent API key. Fails if neither env nor config has one set. */
29
+ export declare const resolveAuth: Effect.Effect<{
14
30
  agentKey: string;
15
- };
31
+ }, Error>;
16
32
  //# sourceMappingURL=config.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/cli/config.ts"],"names":[],"mappings":"AAIA,MAAM,WAAW,aAAa;IAC5B,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AASD,wBAAgB,aAAa,IAAI,MAAM,CAEtC;AAED,wBAAgB,UAAU,IAAI,aAAa,CAO1C;AAED,wBAAgB,WAAW,CAAC,MAAM,EAAE,aAAa,GAAG,IAAI,CAKvD;AAED,wBAAgB,YAAY,CAC1B,OAAO,EAAE,CAAC,MAAM,EAAE,aAAa,KAAK,aAAa,GAChD,IAAI,CAGN;AAED,wBAAgB,YAAY,IAAI,MAAM,CAErC;AAED,wBAAgB,UAAU,IAAI,MAAM,CAGnC;AAED,sEAAsE;AACtE,wBAAgB,WAAW,IAAI;IAAE,QAAQ,EAAE,MAAM,CAAA;CAAE,CAMlD"}
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/cli/config.ts"],"names":[],"mappings":"AAGA,OAAO,EAA0B,MAAM,EAAE,MAAM,QAAQ,CAAC;AAExD;;;;GAIG;AACH,MAAM,WAAW,aAAa;IAC5B,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAgBD,wBAAgB,aAAa,IAAI,MAAM,CAEtC;AAyBD;;;;;GAKG;AACH,eAAO,MAAM,UAAU,EAAE,MAAM,CAAC,MAAM,CAAC,aAAa,EAAE,KAAK,CAuB1D,CAAC;AAEF,qFAAqF;AACrF,eAAO,MAAM,WAAW,GACtB,QAAQ,aAAa,KACpB,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,KAAK,CAcxB,CAAC;AAEL,gCAAgC;AAChC,eAAO,MAAM,YAAY,GACvB,SAAS,CAAC,MAAM,EAAE,aAAa,KAAK,aAAa,KAChD,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,KAAK,CACiD,CAAC;AAE9E,8CAA8C;AAC9C,eAAO,MAAM,YAAY,EAAE,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,KAAK,CAErD,CAAC;AAEF,2CAA2C;AAC3C,eAAO,MAAM,UAAU,EAAE,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,KAAK,CAEnD,CAAC;AAEF,0EAA0E;AAC1E,eAAO,MAAM,WAAW,EAAE,MAAM,CAAC,MAAM,CAAC;IAAE,QAAQ,EAAE,MAAM,CAAA;CAAE,EAAE,KAAK,CAShE,CAAC"}
@@ -1,48 +1,74 @@
1
1
  import * as fs from "node:fs";
2
2
  import * as path from "node:path";
3
3
  import * as os from "node:os";
4
+ import { Config, ConfigProvider, Effect } from "effect";
4
5
  const CONFIG_DIR = path.join(os.homedir(), ".moltzap");
5
6
  const CONFIG_PATH = path.join(CONFIG_DIR, "config.json");
6
- const DEFAULT_CONFIG = {
7
- serverUrl: "wss://api.moltzap.xyz",
8
- };
7
+ const DEFAULT_SERVER_URL = "wss://api.moltzap.xyz";
8
+ /** Effect.Config schema. Matches the on-disk JSON shape. */
9
+ const ConfigSchema = Config.all({
10
+ serverUrl: Config.string("serverUrl").pipe(Config.withDefault(DEFAULT_SERVER_URL)),
11
+ apiKey: Config.option(Config.string("apiKey")),
12
+ agentName: Config.option(Config.string("agentName")),
13
+ });
9
14
  export function getConfigPath() {
10
15
  return CONFIG_PATH;
11
16
  }
12
- export function readConfig() {
13
- try {
14
- const raw = fs.readFileSync(CONFIG_PATH, "utf-8");
15
- return JSON.parse(raw);
16
- }
17
- catch {
18
- return { ...DEFAULT_CONFIG };
19
- }
20
- }
21
- export function writeConfig(config) {
22
- fs.mkdirSync(CONFIG_DIR, { recursive: true });
23
- fs.writeFileSync(CONFIG_PATH, JSON.stringify(config, null, 2) + "\n", {
24
- mode: 0o600,
25
- });
26
- }
27
- export function updateConfig(updater) {
28
- const config = readConfig();
29
- writeConfig(updater(config));
30
- }
31
- export function getServerUrl() {
32
- return process.env.MOLTZAP_SERVER_URL ?? readConfig().serverUrl;
33
- }
34
- export function getHttpUrl() {
35
- const wsUrl = getServerUrl();
36
- return wsUrl.replace(/^wss:/, "https:").replace(/^ws:/, "http:");
37
- }
38
- /** Resolve agent API key: MOLTZAP_API_KEY env var → config → fail. */
39
- export function resolveAuth() {
40
- const envKey = process.env.MOLTZAP_API_KEY;
41
- if (envKey)
42
- return { agentKey: envKey };
43
- const config = readConfig();
44
- if (config.apiKey)
45
- return { agentKey: config.apiKey };
46
- throw new Error("No agent registered. Run `moltzap register` first.");
47
- }
17
+ /** Read the on-disk JSON (best-effort: ENOENT → empty object). */
18
+ const readJsonFile = () => Effect.try({
19
+ try: () => {
20
+ try {
21
+ return JSON.parse(fs.readFileSync(CONFIG_PATH, "utf-8"));
22
+ }
23
+ catch (err) {
24
+ const code = err.code;
25
+ if (code === "ENOENT")
26
+ return {};
27
+ throw err;
28
+ }
29
+ },
30
+ catch: (err) => new Error(`Failed to read ${CONFIG_PATH}: ${err instanceof Error ? err.message : String(err)}`),
31
+ });
32
+ /**
33
+ * Load and validate the CLI config. Merges on-disk JSON with env overrides
34
+ * (MOLTZAP_SERVER_URL, MOLTZAP_API_KEY) through a single `ConfigProvider`.
35
+ * Missing file resolves with defaults; parse errors surface as typed
36
+ * failures so callers see them instead of getting silent defaults.
37
+ */
38
+ export const loadConfig = Effect.gen(function* () {
39
+ const json = yield* readJsonFile();
40
+ const env = {};
41
+ if (process.env.MOLTZAP_SERVER_URL)
42
+ env.serverUrl = process.env.MOLTZAP_SERVER_URL;
43
+ if (process.env.MOLTZAP_API_KEY)
44
+ env.apiKey = process.env.MOLTZAP_API_KEY;
45
+ const provider = ConfigProvider.fromJson({ ...json, ...env });
46
+ const value = yield* ConfigSchema.pipe(Effect.withConfigProvider(provider), Effect.mapError((cause) => new Error(`Invalid config in ${CONFIG_PATH}: ${cause}`)));
47
+ const result = { serverUrl: value.serverUrl };
48
+ if (value.apiKey._tag === "Some")
49
+ result.apiKey = value.apiKey.value;
50
+ if (value.agentName._tag === "Some")
51
+ result.agentName = value.agentName.value;
52
+ return result;
53
+ });
54
+ /** Write a new config blob to disk. Used by `moltzap register` post-registration. */
55
+ export const writeConfig = (config) => Effect.try({
56
+ try: () => {
57
+ fs.mkdirSync(CONFIG_DIR, { recursive: true });
58
+ fs.writeFileSync(CONFIG_PATH, JSON.stringify(config, null, 2) + "\n", {
59
+ mode: 0o600,
60
+ });
61
+ },
62
+ catch: (err) => new Error(`Failed to write ${CONFIG_PATH}: ${err instanceof Error ? err.message : String(err)}`),
63
+ });
64
+ /** Load-modify-write helper. */
65
+ export const updateConfig = (updater) => loadConfig.pipe(Effect.flatMap((current) => writeConfig(updater(current))));
66
+ /** WebSocket server URL (env-overridable). */
67
+ export const getServerUrl = loadConfig.pipe(Effect.map((c) => c.serverUrl));
68
+ /** HTTP base URL — ws/wss → http/https. */
69
+ export const getHttpUrl = getServerUrl.pipe(Effect.map((url) => url.replace(/^wss:/, "https:").replace(/^ws:/, "http:")));
70
+ /** Resolve agent API key. Fails if neither env nor config has one set. */
71
+ export const resolveAuth = loadConfig.pipe(Effect.flatMap((config) => config.apiKey
72
+ ? Effect.succeed({ agentKey: config.apiKey })
73
+ : Effect.fail(new Error("No agent registered. Run `moltzap register` first."))));
48
74
  //# sourceMappingURL=config.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/cli/config.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,SAAS,CAAC;AAC9B,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAClC,OAAO,KAAK,EAAE,MAAM,SAAS,CAAC;AAQ9B,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,UAAU,CAAC,CAAC;AACvD,MAAM,WAAW,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,aAAa,CAAC,CAAC;AAEzD,MAAM,cAAc,GAAkB;IACpC,SAAS,EAAE,uBAAuB;CACnC,CAAC;AAEF,MAAM,UAAU,aAAa;IAC3B,OAAO,WAAW,CAAC;AACrB,CAAC;AAED,MAAM,UAAU,UAAU;IACxB,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,EAAE,CAAC,YAAY,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC;QAClD,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAkB,CAAC;IAC1C,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,GAAG,cAAc,EAAE,CAAC;IAC/B,CAAC;AACH,CAAC;AAED,MAAM,UAAU,WAAW,CAAC,MAAqB;IAC/C,EAAE,CAAC,SAAS,CAAC,UAAU,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC9C,EAAE,CAAC,aAAa,CAAC,WAAW,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,GAAG,IAAI,EAAE;QACpE,IAAI,EAAE,KAAK;KACZ,CAAC,CAAC;AACL,CAAC;AAED,MAAM,UAAU,YAAY,CAC1B,OAAiD;IAEjD,MAAM,MAAM,GAAG,UAAU,EAAE,CAAC;IAC5B,WAAW,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC;AAC/B,CAAC;AAED,MAAM,UAAU,YAAY;IAC1B,OAAO,OAAO,CAAC,GAAG,CAAC,kBAAkB,IAAI,UAAU,EAAE,CAAC,SAAS,CAAC;AAClE,CAAC;AAED,MAAM,UAAU,UAAU;IACxB,MAAM,KAAK,GAAG,YAAY,EAAE,CAAC;IAC7B,OAAO,KAAK,CAAC,OAAO,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC,OAAO,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;AACnE,CAAC;AAED,sEAAsE;AACtE,MAAM,UAAU,WAAW;IACzB,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,eAAe,CAAC;IAC3C,IAAI,MAAM;QAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,CAAC;IACxC,MAAM,MAAM,GAAG,UAAU,EAAE,CAAC;IAC5B,IAAI,MAAM,CAAC,MAAM;QAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC;IACtD,MAAM,IAAI,KAAK,CAAC,oDAAoD,CAAC,CAAC;AACxE,CAAC"}
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/cli/config.ts"],"names":[],"mappings":"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"}
@@ -1,5 +1,6 @@
1
- import { describe, it, expect, beforeEach, afterEach, vi } from "vitest";
2
1
  import * as fs from "node:fs";
2
+ import { Effect } from "effect";
3
+ import { afterEach, beforeEach, describe, expect, it, vi } from "vitest";
3
4
  vi.mock("node:fs");
4
5
  import { resolveAuth } from "./config.js";
5
6
  function mockConfigFile(config) {
@@ -10,40 +11,41 @@ describe("resolveAuth", () => {
10
11
  beforeEach(() => {
11
12
  process.env = { ...originalEnv };
12
13
  delete process.env.MOLTZAP_API_KEY;
14
+ delete process.env.MOLTZAP_SERVER_URL;
13
15
  vi.mocked(fs.readFileSync).mockImplementation(() => {
14
- throw new Error("ENOENT");
16
+ throw Object.assign(new Error("ENOENT"), { code: "ENOENT" });
15
17
  });
16
18
  });
17
19
  afterEach(() => {
18
20
  process.env = originalEnv;
19
21
  vi.restoreAllMocks();
20
22
  });
21
- it("MOLTZAP_API_KEY env var takes highest priority", () => {
23
+ it("MOLTZAP_API_KEY env var takes highest priority", async () => {
22
24
  process.env.MOLTZAP_API_KEY = "moltzap_agent_envkey123";
23
25
  mockConfigFile({
24
26
  serverUrl: "wss://test",
25
27
  apiKey: "moltzap_agent_configkey",
26
28
  agentName: "myagent",
27
29
  });
28
- const result = resolveAuth();
30
+ const result = await Effect.runPromise(resolveAuth);
29
31
  expect(result).toEqual({ agentKey: "moltzap_agent_envkey123" });
30
32
  });
31
- it("config apiKey is used when no env var", () => {
33
+ it("config apiKey is used when no env var", async () => {
32
34
  mockConfigFile({
33
35
  serverUrl: "wss://test",
34
36
  apiKey: "moltzap_agent_configkey",
35
37
  agentName: "myagent",
36
38
  });
37
- const result = resolveAuth();
39
+ const result = await Effect.runPromise(resolveAuth);
38
40
  expect(result).toEqual({ agentKey: "moltzap_agent_configkey" });
39
41
  });
40
- it("throws if no env var and no config apiKey", () => {
42
+ it("fails if no env var and no config apiKey", async () => {
41
43
  mockConfigFile({ serverUrl: "wss://test" });
42
- expect(() => resolveAuth()).toThrow("No agent registered");
44
+ await expect(Effect.runPromise(resolveAuth)).rejects.toThrow("No agent registered");
43
45
  });
44
- it("throws if config file missing", () => {
46
+ it("fails if config file missing", async () => {
45
47
  // readFileSync throws ENOENT (set in beforeEach)
46
- expect(() => resolveAuth()).toThrow("No agent registered");
48
+ await expect(Effect.runPromise(resolveAuth)).rejects.toThrow("No agent registered");
47
49
  });
48
50
  });
49
51
  //# 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,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,UAAU,EAAE,SAAS,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AACzE,OAAO,KAAK,EAAE,MAAM,SAAS,CAAC;AAE9B,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,EAAE,CAAC,MAAM,CAAC,EAAE,CAAC,YAAY,CAAC,CAAC,kBAAkB,CAAC,GAAG,EAAE;YACjD,MAAM,IAAI,KAAK,CAAC,QAAQ,CAAC,CAAC;QAC5B,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,GAAG,EAAE;QACxD,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,WAAW,EAAE,CAAC;QAC7B,MAAM,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,EAAE,QAAQ,EAAE,yBAAyB,EAAE,CAAC,CAAC;IAClE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,uCAAuC,EAAE,GAAG,EAAE;QAC/C,cAAc,CAAC;YACb,SAAS,EAAE,YAAY;YACvB,MAAM,EAAE,yBAAyB;YACjC,SAAS,EAAE,SAAS;SACrB,CAAC,CAAC;QAEH,MAAM,MAAM,GAAG,WAAW,EAAE,CAAC;QAC7B,MAAM,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,EAAE,QAAQ,EAAE,yBAAyB,EAAE,CAAC,CAAC;IAClE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,2CAA2C,EAAE,GAAG,EAAE;QACnD,cAAc,CAAC,EAAE,SAAS,EAAE,YAAY,EAAE,CAAC,CAAC;QAE5C,MAAM,CAAC,GAAG,EAAE,CAAC,WAAW,EAAE,CAAC,CAAC,OAAO,CAAC,qBAAqB,CAAC,CAAC;IAC7D,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,+BAA+B,EAAE,GAAG,EAAE;QACvC,iDAAiD;QACjD,MAAM,CAAC,GAAG,EAAE,CAAC,WAAW,EAAE,CAAC,CAAC,OAAO,CAAC,qBAAqB,CAAC,CAAC;IAC7D,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
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,3 +1,7 @@
1
- import type { RegisterResult } from "@moltzap/protocol";
2
- export declare function registerAgent(name: string, inviteCode: string, description?: string): Promise<RegisterResult>;
1
+ import { Effect } from "effect";
2
+ import type { HttpClientError } from "@effect/platform";
3
+ import type { Register, Static } from "@moltzap/protocol";
4
+ type RegisterResult = Static<typeof Register.resultSchema>;
5
+ export declare function registerAgent(name: string, inviteCode: string, description?: string): Effect.Effect<RegisterResult, Error | HttpClientError.HttpClientError>;
6
+ export {};
3
7
  //# sourceMappingURL=http-client.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"http-client.d.ts","sourceRoot":"","sources":["../../src/cli/http-client.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAgCxD,wBAAsB,aAAa,CACjC,IAAI,EAAE,MAAM,EACZ,UAAU,EAAE,MAAM,EAClB,WAAW,CAAC,EAAE,MAAM,GACnB,OAAO,CAAC,cAAc,CAAC,CAOzB"}
1
+ {"version":3,"file":"http-client.d.ts","sourceRoot":"","sources":["../../src/cli/http-client.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAEhC,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AAGxD,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAE1D,KAAK,cAAc,GAAG,MAAM,CAAC,OAAO,QAAQ,CAAC,YAAY,CAAC,CAAC;AA+B3D,wBAAgB,aAAa,CAC3B,IAAI,EAAE,MAAM,EACZ,UAAU,EAAE,MAAM,EAClB,WAAW,CAAC,EAAE,MAAM,GACnB,MAAM,CAAC,MAAM,CAAC,cAAc,EAAE,KAAK,GAAG,eAAe,CAAC,eAAe,CAAC,CAMxE"}
@@ -1,28 +1,29 @@
1
+ import { Effect } from "effect";
2
+ import { HttpClient, HttpClientRequest } from "@effect/platform";
3
+ import { NodeHttpClient } from "@effect/platform-node";
1
4
  import { getHttpUrl, resolveAuth } from "./config.js";
2
- function authHeaders() {
3
- const { agentKey } = resolveAuth();
4
- return { "X-API-Key": agentKey };
5
+ /**
6
+ * POST JSON to a MoltZap REST endpoint. Transport failures surface as the
7
+ * typed `HttpClientError` union (`RequestError | ResponseError`); non-2xx
8
+ * responses surface as `Error(HTTP <status>: <body>)`.
9
+ */
10
+ function postJson(path, body, opts) {
11
+ return Effect.gen(function* () {
12
+ const baseUrl = yield* getHttpUrl;
13
+ const headers = opts?.noAuth
14
+ ? {}
15
+ : { "X-API-Key": (yield* resolveAuth).agentKey };
16
+ const client = yield* HttpClient.HttpClient;
17
+ const request = HttpClientRequest.post(`${baseUrl}${path}`).pipe(HttpClientRequest.setHeaders(headers), HttpClientRequest.bodyUnsafeJson(body));
18
+ const response = yield* client.execute(request);
19
+ if (response.status < 200 || response.status >= 300) {
20
+ const text = yield* response.text;
21
+ return yield* Effect.fail(new Error(`HTTP ${response.status}: ${text}`));
22
+ }
23
+ return (yield* response.json);
24
+ }).pipe(Effect.provide(NodeHttpClient.layer));
5
25
  }
6
- async function request(method, path, body, opts) {
7
- const baseUrl = getHttpUrl();
8
- const headers = {
9
- "Content-Type": "application/json",
10
- };
11
- if (!opts?.noAuth) {
12
- Object.assign(headers, authHeaders());
13
- }
14
- const res = await fetch(`${baseUrl}${path}`, {
15
- method,
16
- headers,
17
- body: body ? JSON.stringify(body) : undefined,
18
- });
19
- if (!res.ok) {
20
- const text = await res.text();
21
- throw new Error(`HTTP ${res.status}: ${text}`);
22
- }
23
- return (await res.json());
24
- }
25
- export async function registerAgent(name, inviteCode, description) {
26
- return request("POST", "/api/v1/auth/register", { name, inviteCode, description }, { noAuth: true });
26
+ export function registerAgent(name, inviteCode, description) {
27
+ return postJson("/api/v1/auth/register", { name, inviteCode, description }, { noAuth: true });
27
28
  }
28
29
  //# sourceMappingURL=http-client.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"http-client.js","sourceRoot":"","sources":["../../src/cli/http-client.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAGtD,SAAS,WAAW;IAClB,MAAM,EAAE,QAAQ,EAAE,GAAG,WAAW,EAAE,CAAC;IACnC,OAAO,EAAE,WAAW,EAAE,QAAQ,EAAE,CAAC;AACnC,CAAC;AAED,KAAK,UAAU,OAAO,CACpB,MAAc,EACd,IAAY,EACZ,IAAc,EACd,IAA2B;IAE3B,MAAM,OAAO,GAAG,UAAU,EAAE,CAAC;IAC7B,MAAM,OAAO,GAA2B;QACtC,cAAc,EAAE,kBAAkB;KACnC,CAAC;IACF,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE,CAAC;QAClB,MAAM,CAAC,MAAM,CAAC,OAAO,EAAE,WAAW,EAAE,CAAC,CAAC;IACxC,CAAC;IACD,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,GAAG,OAAO,GAAG,IAAI,EAAE,EAAE;QAC3C,MAAM;QACN,OAAO;QACP,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,SAAS;KAC9C,CAAC,CAAC;IACH,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC;QACZ,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,IAAI,EAAE,CAAC;QAC9B,MAAM,IAAI,KAAK,CAAC,QAAQ,GAAG,CAAC,MAAM,KAAK,IAAI,EAAE,CAAC,CAAC;IACjD,CAAC;IACD,OAAO,CAAC,MAAM,GAAG,CAAC,IAAI,EAAE,CAAM,CAAC;AACjC,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,aAAa,CACjC,IAAY,EACZ,UAAkB,EAClB,WAAoB;IAEpB,OAAO,OAAO,CACZ,MAAM,EACN,uBAAuB,EACvB,EAAE,IAAI,EAAE,UAAU,EAAE,WAAW,EAAE,EACjC,EAAE,MAAM,EAAE,IAAI,EAAE,CACjB,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"http-client.js","sourceRoot":"","sources":["../../src/cli/http-client.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAChC,OAAO,EAAE,UAAU,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AAEjE,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAKtD;;;;GAIG;AACH,SAAS,QAAQ,CACf,IAAY,EACZ,IAAa,EACb,IAA2B;IAE3B,OAAO,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC;QACzB,MAAM,OAAO,GAAG,KAAK,CAAC,CAAC,UAAU,CAAC;QAClC,MAAM,OAAO,GAA2B,IAAI,EAAE,MAAM;YAClD,CAAC,CAAC,EAAE;YACJ,CAAC,CAAC,EAAE,WAAW,EAAE,CAAC,KAAK,CAAC,CAAC,WAAW,CAAC,CAAC,QAAQ,EAAE,CAAC;QACnD,MAAM,MAAM,GAAG,KAAK,CAAC,CAAC,UAAU,CAAC,UAAU,CAAC;QAC5C,MAAM,OAAO,GAAG,iBAAiB,CAAC,IAAI,CAAC,GAAG,OAAO,GAAG,IAAI,EAAE,CAAC,CAAC,IAAI,CAC9D,iBAAiB,CAAC,UAAU,CAAC,OAAO,CAAC,EACrC,iBAAiB,CAAC,cAAc,CAAC,IAAI,CAAC,CACvC,CAAC;QACF,MAAM,QAAQ,GAAG,KAAK,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;QAChD,IAAI,QAAQ,CAAC,MAAM,GAAG,GAAG,IAAI,QAAQ,CAAC,MAAM,IAAI,GAAG,EAAE,CAAC;YACpD,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC;YAClC,OAAO,KAAK,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,KAAK,CAAC,QAAQ,QAAQ,CAAC,MAAM,KAAK,IAAI,EAAE,CAAC,CAAC,CAAC;QAC3E,CAAC;QACD,OAAO,CAAC,KAAK,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAM,CAAC;IACrC,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC,CAAC;AAChD,CAAC;AAED,MAAM,UAAU,aAAa,CAC3B,IAAY,EACZ,UAAkB,EAClB,WAAoB;IAEpB,OAAO,QAAQ,CACb,uBAAuB,EACvB,EAAE,IAAI,EAAE,UAAU,EAAE,WAAW,EAAE,EACjC,EAAE,MAAM,EAAE,IAAI,EAAE,CACjB,CAAC;AACJ,CAAC"}
@@ -1,3 +1,18 @@
1
1
  #!/usr/bin/env node
2
- export {};
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
+ };
3
18
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":""}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":";AAqCA;;;;;;;;;;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"}
package/dist/cli/index.js CHANGED
@@ -1,37 +1,170 @@
1
1
  #!/usr/bin/env node
2
2
  import { createRequire } from "node:module";
3
- import { Command } from "commander";
4
- import { registerCommand } from "./commands/register.js";
5
- import { whoamiCommand } from "./commands/whoami.js";
6
- import { sendCommand } from "./commands/send.js";
3
+ import { Command } from "@effect/cli";
4
+ import { NodeContext, NodeRuntime } from "@effect/platform-node";
5
+ import { Effect, Logger } from "effect";
6
+ import { agentsCommand } from "./commands/agents.js";
7
+ import { appsCommand } from "./commands/apps.js";
7
8
  import { contactsCommand } from "./commands/contacts.js";
8
9
  import { conversationsCommand, historyCommand, } from "./commands/conversations.js";
9
10
  import { inviteCommand } from "./commands/invite.js";
10
- import { reactCommand } from "./commands/react.js";
11
- import { deleteCommand } from "./commands/delete.js";
12
- import { presenceCommand } from "./commands/presence.js";
11
+ import { messagesCommand } from "./commands/messages.js";
12
+ import { permissionsCommand } from "./commands/permissions.js";
13
13
  import { pingCommand } from "./commands/ping.js";
14
+ import { presenceCommand } from "./commands/presence.js";
15
+ import { registerCommand } from "./commands/register.js";
16
+ import { sendCommand } from "./commands/send.js";
14
17
  import { statusCommand } from "./commands/status.js";
15
- import { agentsCommand } from "./commands/agents.js";
18
+ import { whoamiCommand } from "./commands/whoami.js";
19
+ import { LoggerLive, minLogLevel } from "./runtime.js";
20
+ import { makeTransportLayer, resolveTransportInputs, TransportConfigError, } from "./transport.js";
21
+ import { ProfileConfigReadError, ProfileInvalidNameError, ProfileNotFoundError, } from "./profile.js";
16
22
  const require = createRequire(import.meta.url);
17
23
  const { version } = require("../../package.json");
18
- const program = new Command();
19
- program
20
- .name("moltzap")
21
- .description("MoltZap CLI — messaging for OpenClaw AI agents")
22
- .version(version);
23
- program.addCommand(registerCommand);
24
- program.addCommand(whoamiCommand);
25
- program.addCommand(sendCommand);
26
- program.addCommand(contactsCommand);
27
- program.addCommand(conversationsCommand);
28
- program.addCommand(historyCommand);
29
- program.addCommand(inviteCommand);
30
- program.addCommand(reactCommand);
31
- program.addCommand(deleteCommand);
32
- program.addCommand(presenceCommand);
33
- program.addCommand(pingCommand);
34
- program.addCommand(statusCommand);
35
- program.addCommand(agentsCommand);
36
- program.parse();
24
+ /**
25
+ * Pull `--as <key>` and `--profile <name>` out of argv before handing the
26
+ * remainder to `@effect/cli`. These are semantically global flags that
27
+ * shape the transport layer for the whole invocation (spec sbd#177 rev 3
28
+ * §5.1, §5.2, Invariant §4.2). Pre-parsing keeps the @effect/cli subcommand
29
+ * tree clean of duplicated global options and guarantees `--as` can short-
30
+ * circuit config-read side effects (architect design doc rev 4 finding 1).
31
+ *
32
+ * Accepts both `--as KEY` / `--as=KEY` forms; unknown flags pass through
33
+ * to @effect/cli unchanged.
34
+ */
35
+ export const extractGlobalFlags = (argv) => {
36
+ // register parses --profile locally (spec §5.2: it writes a NEW profile).
37
+ // Intercepting at global scope would make the transport-resolver treat a
38
+ // not-yet-created profile as a lookup failure. Route --profile to register
39
+ // when register is the invoked subcommand; route globally otherwise.
40
+ const isRegister = argv.some((t, i) => t === "register" &&
41
+ argv.slice(0, i).every((prev) => !prev.startsWith("-")));
42
+ const rest = [];
43
+ let impersonateKey;
44
+ let profileName;
45
+ for (let i = 0; i < argv.length; i++) {
46
+ const token = argv[i];
47
+ if (token === "--as") {
48
+ const next = argv[i + 1];
49
+ if (next !== undefined) {
50
+ impersonateKey = next;
51
+ i++;
52
+ }
53
+ continue;
54
+ }
55
+ if (token.startsWith("--as=")) {
56
+ impersonateKey = token.slice("--as=".length);
57
+ continue;
58
+ }
59
+ if (!isRegister) {
60
+ if (token === "--profile") {
61
+ const next = argv[i + 1];
62
+ if (next !== undefined) {
63
+ profileName = next;
64
+ i++;
65
+ }
66
+ continue;
67
+ }
68
+ if (token.startsWith("--profile=")) {
69
+ profileName = token.slice("--profile=".length);
70
+ continue;
71
+ }
72
+ }
73
+ rest.push(token);
74
+ }
75
+ const out = { rest };
76
+ if (impersonateKey !== undefined)
77
+ out.impersonateKey = impersonateKey;
78
+ if (profileName !== undefined)
79
+ out.profileName = profileName;
80
+ return out;
81
+ };
82
+ /**
83
+ * Top-level `moltzap` command. Subcommands are `@effect/cli` `Command`s —
84
+ * each handler returns an Effect. The single `NodeRuntime.runMain` below is
85
+ * the ONLY bridge from the Effect graph to Node; no per-command runPromise.
86
+ *
87
+ * Global flags (`--as`, `--profile`) are pre-parsed from argv in
88
+ * `extractGlobalFlags` above and provided to subcommand handlers via the
89
+ * `Transport` Layer (see `transport.ts`).
90
+ */
91
+ const moltzap = Command.make("moltzap").pipe(Command.withDescription("MoltZap CLI — messaging for OpenClaw AI agents.\n" +
92
+ "\n" +
93
+ "Global flags (pre-parsed by the CLI before @effect/cli sees argv; " +
94
+ "shared across every subcommand):\n" +
95
+ " --as <apiKey> Dial the server as the agent owning the given " +
96
+ "API key, bypassing the local daemon. Useful for multi-agent hosts " +
97
+ "where one operator drives multiple registered agents.\n" +
98
+ " --profile <name> Load the named profile from ~/.moltzap/config.json " +
99
+ "(written by `moltzap register --profile <name>`). Equivalent to " +
100
+ "looking up that profile's apiKey and passing it as --as.\n" +
101
+ "\n" +
102
+ "Precedence: --as wins over --profile; --profile wins over the " +
103
+ "top-level default profile. `register` is the one exception — it " +
104
+ "consumes `--profile` locally (to write a NEW profile) rather than " +
105
+ "routing it through the transport.\n" +
106
+ "\n" +
107
+ "See packages/client/src/cli/README.md for an end-to-end multi-agent " +
108
+ "walkthrough."), Command.withSubcommands([
109
+ registerCommand,
110
+ whoamiCommand,
111
+ sendCommand,
112
+ contactsCommand,
113
+ conversationsCommand,
114
+ historyCommand,
115
+ inviteCommand,
116
+ presenceCommand,
117
+ pingCommand,
118
+ statusCommand,
119
+ agentsCommand,
120
+ // sbd#177 v2 additions:
121
+ appsCommand,
122
+ permissionsCommand,
123
+ messagesCommand,
124
+ ]));
125
+ const cli = Command.run(moltzap, { name: "moltzap", version });
126
+ const { impersonateKey, profileName, rest } = extractGlobalFlags(process.argv.slice(2));
127
+ const resolverInput = {};
128
+ if (impersonateKey !== undefined)
129
+ resolverInput.impersonateKey = impersonateKey;
130
+ if (profileName !== undefined)
131
+ resolverInput.profileName = profileName;
132
+ // Resolve transport inputs eagerly. On failure exit with a user-readable
133
+ // message before touching @effect/cli; the CLI parser never sees a broken
134
+ // transport config.
135
+ const transportOptions = (() => {
136
+ const exit1 = (msg) => {
137
+ console.error(`moltzap: ${msg}`);
138
+ process.exit(1);
139
+ };
140
+ try {
141
+ return Effect.runSync(resolveTransportInputs(resolverInput));
142
+ }
143
+ catch (err) {
144
+ if (err instanceof ProfileNotFoundError) {
145
+ return exit1(`profile not found: ${err.name}`);
146
+ }
147
+ if (err instanceof ProfileInvalidNameError) {
148
+ return exit1(`invalid profile name "${err.name}": ${err.reason}`);
149
+ }
150
+ if (err instanceof ProfileConfigReadError) {
151
+ const cause = err.cause instanceof Error ? err.cause.message : String(err.cause);
152
+ return exit1(`config read error at ${err.path}: ${cause}`);
153
+ }
154
+ if (err instanceof TransportConfigError) {
155
+ return exit1(`transport config: ${err.reason}`);
156
+ }
157
+ const msg = err instanceof Error ? err.message : String(err);
158
+ return exit1(msg);
159
+ }
160
+ })();
161
+ const TransportLive = makeTransportLayer(transportOptions);
162
+ // Re-assemble argv so @effect/cli sees the same process-shape it expects
163
+ // (Command.run slices off the first two tokens).
164
+ const argvForCli = [
165
+ process.argv[0] ?? "node",
166
+ process.argv[1] ?? "moltzap",
167
+ ...rest,
168
+ ];
169
+ cli(argvForCli).pipe(Effect.provide(TransportLive), Effect.provide(NodeContext.layer), Effect.provide(LoggerLive), Logger.withMinimumLogLevel(minLogLevel), NodeRuntime.runMain);
37
170
  //# sourceMappingURL=index.js.map