@moltzap/client 2026.414.0 → 2026.425.1
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.
- package/dist/channel-core.d.ts +28 -15
- package/dist/channel-core.d.ts.map +1 -1
- package/dist/channel-core.js +113 -74
- package/dist/channel-core.js.map +1 -1
- package/dist/channel-core.test.js +126 -34
- package/dist/channel-core.test.js.map +1 -1
- package/dist/cli/__tests__/cli-multi-agent.int.test.d.ts +2 -0
- package/dist/cli/__tests__/cli-multi-agent.int.test.d.ts.map +1 -0
- package/dist/cli/__tests__/cli-multi-agent.int.test.js +26 -0
- package/dist/cli/__tests__/cli-multi-agent.int.test.js.map +1 -0
- package/dist/cli/commands/agents.d.ts +13 -2
- package/dist/cli/commands/agents.d.ts.map +1 -1
- package/dist/cli/commands/agents.js +30 -18
- package/dist/cli/commands/agents.js.map +1 -1
- package/dist/cli/commands/apps.d.ts +96 -0
- package/dist/cli/commands/apps.d.ts.map +1 -0
- package/dist/cli/commands/apps.js +193 -0
- package/dist/cli/commands/apps.js.map +1 -0
- package/dist/cli/commands/apps.test.d.ts +2 -0
- package/dist/cli/commands/apps.test.d.ts.map +1 -0
- package/dist/cli/commands/apps.test.js +220 -0
- package/dist/cli/commands/apps.test.js.map +1 -0
- package/dist/cli/commands/contacts.d.ts +18 -2
- package/dist/cli/commands/contacts.d.ts.map +1 -1
- package/dist/cli/commands/contacts.js +44 -52
- package/dist/cli/commands/contacts.js.map +1 -1
- package/dist/cli/commands/conversations-v2.test.d.ts +2 -0
- package/dist/cli/commands/conversations-v2.test.d.ts.map +1 -0
- package/dist/cli/commands/conversations-v2.test.js +92 -0
- package/dist/cli/commands/conversations-v2.test.js.map +1 -0
- package/dist/cli/commands/conversations.d.ts +73 -3
- package/dist/cli/commands/conversations.d.ts.map +1 -1
- package/dist/cli/commands/conversations.js +157 -108
- package/dist/cli/commands/conversations.js.map +1 -1
- package/dist/cli/commands/invite.d.ts +6 -2
- package/dist/cli/commands/invite.d.ts.map +1 -1
- package/dist/cli/commands/invite.js +8 -6
- package/dist/cli/commands/invite.js.map +1 -1
- package/dist/cli/commands/messages.d.ts +48 -0
- package/dist/cli/commands/messages.d.ts.map +1 -0
- package/dist/cli/commands/messages.js +68 -0
- package/dist/cli/commands/messages.js.map +1 -0
- package/dist/cli/commands/messages.test.d.ts +2 -0
- package/dist/cli/commands/messages.test.d.ts.map +1 -0
- package/dist/cli/commands/messages.test.js +73 -0
- package/dist/cli/commands/messages.test.js.map +1 -0
- package/dist/cli/commands/permissions.d.ts +66 -0
- package/dist/cli/commands/permissions.d.ts.map +1 -0
- package/dist/cli/commands/permissions.js +101 -0
- package/dist/cli/commands/permissions.js.map +1 -0
- package/dist/cli/commands/permissions.test.d.ts +2 -0
- package/dist/cli/commands/permissions.test.d.ts.map +1 -0
- package/dist/cli/commands/permissions.test.js +126 -0
- package/dist/cli/commands/permissions.test.js.map +1 -0
- package/dist/cli/commands/ping.d.ts +6 -2
- package/dist/cli/commands/ping.d.ts.map +1 -1
- package/dist/cli/commands/ping.js +21 -20
- package/dist/cli/commands/ping.js.map +1 -1
- package/dist/cli/commands/presence.d.ts +10 -2
- package/dist/cli/commands/presence.d.ts.map +1 -1
- package/dist/cli/commands/presence.js +27 -15
- package/dist/cli/commands/presence.js.map +1 -1
- package/dist/cli/commands/register.d.ts +24 -2
- package/dist/cli/commands/register.d.ts.map +1 -1
- package/dist/cli/commands/register.js +123 -47
- package/dist/cli/commands/register.js.map +1 -1
- package/dist/cli/commands/register.test.js +45 -27
- package/dist/cli/commands/register.test.js.map +1 -1
- package/dist/cli/commands/send.d.ts +43 -2
- package/dist/cli/commands/send.d.ts.map +1 -1
- package/dist/cli/commands/send.js +55 -13
- package/dist/cli/commands/send.js.map +1 -1
- package/dist/cli/commands/send.test.js +20 -19
- package/dist/cli/commands/send.test.js.map +1 -1
- package/dist/cli/commands/status.d.ts +6 -2
- package/dist/cli/commands/status.d.ts.map +1 -1
- package/dist/cli/commands/status.js +16 -10
- package/dist/cli/commands/status.js.map +1 -1
- package/dist/cli/commands/whoami.d.ts +7 -2
- package/dist/cli/commands/whoami.d.ts.map +1 -1
- package/dist/cli/commands/whoami.js +13 -7
- package/dist/cli/commands/whoami.js.map +1 -1
- package/dist/cli/config.d.ts +24 -8
- package/dist/cli/config.d.ts.map +1 -1
- package/dist/cli/config.js +65 -39
- package/dist/cli/config.js.map +1 -1
- package/dist/cli/config.test.js +12 -10
- package/dist/cli/config.test.js.map +1 -1
- package/dist/cli/http-client.d.ts +6 -2
- package/dist/cli/http-client.d.ts.map +1 -1
- package/dist/cli/http-client.js +25 -24
- package/dist/cli/http-client.js.map +1 -1
- package/dist/cli/index.d.ts +16 -1
- package/dist/cli/index.d.ts.map +1 -1
- package/dist/cli/index.js +160 -27
- package/dist/cli/index.js.map +1 -1
- package/dist/cli/profile.d.ts +134 -0
- package/dist/cli/profile.d.ts.map +1 -0
- package/dist/cli/profile.js +217 -0
- package/dist/cli/profile.js.map +1 -0
- package/dist/cli/profile.test.d.ts +2 -0
- package/dist/cli/profile.test.d.ts.map +1 -0
- package/dist/cli/profile.test.js +263 -0
- package/dist/cli/profile.test.js.map +1 -0
- package/dist/cli/runtime.d.ts +34 -0
- package/dist/cli/runtime.d.ts.map +1 -0
- package/dist/cli/runtime.js +94 -0
- package/dist/cli/runtime.js.map +1 -0
- package/dist/cli/socket-client.d.ts +15 -12
- package/dist/cli/socket-client.d.ts.map +1 -1
- package/dist/cli/socket-client.js +72 -75
- package/dist/cli/socket-client.js.map +1 -1
- package/dist/cli/transport.d.ts +181 -0
- package/dist/cli/transport.d.ts.map +1 -0
- package/dist/cli/transport.js +324 -0
- package/dist/cli/transport.js.map +1 -0
- package/dist/cli/transport.test.d.ts +2 -0
- package/dist/cli/transport.test.d.ts.map +1 -0
- package/dist/cli/transport.test.js +197 -0
- package/dist/cli/transport.test.js.map +1 -0
- package/dist/index.d.ts +6 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -0
- package/dist/index.js.map +1 -1
- package/dist/runtime/close-info.d.ts +94 -0
- package/dist/runtime/close-info.d.ts.map +1 -0
- package/dist/runtime/close-info.js +109 -0
- package/dist/runtime/close-info.js.map +1 -0
- package/dist/runtime/close-info.test.d.ts +2 -0
- package/dist/runtime/close-info.test.d.ts.map +1 -0
- package/dist/runtime/close-info.test.js +102 -0
- package/dist/runtime/close-info.test.js.map +1 -0
- package/dist/runtime/errors.d.ts +47 -0
- package/dist/runtime/errors.d.ts.map +1 -0
- package/dist/runtime/errors.js +20 -0
- package/dist/runtime/errors.js.map +1 -0
- package/dist/runtime/errors.test.d.ts +2 -0
- package/dist/runtime/errors.test.d.ts.map +1 -0
- package/dist/runtime/errors.test.js +66 -0
- package/dist/runtime/errors.test.js.map +1 -0
- package/dist/runtime/frame.d.ts +25 -0
- package/dist/runtime/frame.d.ts.map +1 -0
- package/dist/runtime/frame.js +106 -0
- package/dist/runtime/frame.js.map +1 -0
- package/dist/runtime/frame.test.d.ts +2 -0
- package/dist/runtime/frame.test.d.ts.map +1 -0
- package/dist/runtime/frame.test.js +32 -0
- package/dist/runtime/frame.test.js.map +1 -0
- package/dist/runtime/index.d.ts +3 -0
- package/dist/runtime/index.d.ts.map +1 -0
- package/dist/runtime/index.js +3 -0
- package/dist/runtime/index.js.map +1 -0
- package/dist/runtime/refs.d.ts +10 -0
- package/dist/runtime/refs.d.ts.map +1 -0
- package/dist/runtime/refs.js +10 -0
- package/dist/runtime/refs.js.map +1 -0
- package/dist/runtime/runtime.test.d.ts +2 -0
- package/dist/runtime/runtime.test.d.ts.map +1 -0
- package/dist/runtime/runtime.test.js +29 -0
- package/dist/runtime/runtime.test.js.map +1 -0
- package/dist/runtime/subscribers.d.ts +157 -0
- package/dist/runtime/subscribers.d.ts.map +1 -0
- package/dist/runtime/subscribers.js +131 -0
- package/dist/runtime/subscribers.js.map +1 -0
- package/dist/runtime/subscribers.test.d.ts +2 -0
- package/dist/runtime/subscribers.test.d.ts.map +1 -0
- package/dist/runtime/subscribers.test.js +155 -0
- package/dist/runtime/subscribers.test.js.map +1 -0
- package/dist/service.d.ts +68 -17
- package/dist/service.d.ts.map +1 -1
- package/dist/service.js +461 -307
- package/dist/service.js.map +1 -1
- package/dist/service.test.js +266 -77
- package/dist/service.test.js.map +1 -1
- package/dist/test/index.d.ts +33 -0
- package/dist/test/index.d.ts.map +1 -0
- package/dist/test/index.js +44 -0
- package/dist/test/index.js.map +1 -0
- package/dist/test-utils/channel-service-fixture.d.ts +2 -1
- package/dist/test-utils/channel-service-fixture.d.ts.map +1 -1
- package/dist/test-utils/channel-service-fixture.js +31 -11
- package/dist/test-utils/channel-service-fixture.js.map +1 -1
- package/dist/test-utils/conformance-adapter.d.ts +50 -0
- package/dist/test-utils/conformance-adapter.d.ts.map +1 -0
- package/dist/test-utils/conformance-adapter.js +206 -0
- package/dist/test-utils/conformance-adapter.js.map +1 -0
- package/dist/test-utils/fake-service.d.ts +85 -0
- package/dist/test-utils/fake-service.d.ts.map +1 -0
- package/dist/test-utils/fake-service.js +103 -0
- package/dist/test-utils/fake-service.js.map +1 -0
- package/dist/test-utils/index.d.ts +2 -0
- package/dist/test-utils/index.d.ts.map +1 -1
- package/dist/test-utils/index.js +3 -2
- package/dist/test-utils/index.js.map +1 -1
- package/dist/ws-client.d.ts +157 -18
- package/dist/ws-client.d.ts.map +1 -1
- package/dist/ws-client.js +432 -94
- package/dist/ws-client.js.map +1 -1
- package/dist/ws-client.test.d.ts +2 -0
- package/dist/ws-client.test.d.ts.map +1 -0
- package/dist/ws-client.test.js +672 -0
- package/dist/ws-client.test.js.map +1 -0
- package/package.json +17 -8
- package/dist/__tests__/service.integration.test.d.ts +0 -2
- package/dist/__tests__/service.integration.test.d.ts.map +0 -1
- package/dist/__tests__/service.integration.test.js +0 -1087
- package/dist/__tests__/service.integration.test.js.map +0 -1
- package/dist/cli/commands/delete.d.ts +0 -3
- package/dist/cli/commands/delete.d.ts.map +0 -1
- package/dist/cli/commands/delete.js +0 -10
- package/dist/cli/commands/delete.js.map +0 -1
- package/dist/cli/commands/react.d.ts +0 -3
- package/dist/cli/commands/react.d.ts.map +0 -1
- package/dist/cli/commands/react.js +0 -18
- package/dist/cli/commands/react.js.map +0 -1
|
@@ -1,3 +1,8 @@
|
|
|
1
|
-
import { Command } from "
|
|
2
|
-
|
|
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,
|
|
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 "
|
|
2
|
-
import {
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
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,
|
|
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"}
|
package/dist/cli/config.d.ts
CHANGED
|
@@ -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
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
export declare
|
|
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
|
package/dist/cli/config.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/cli/config.ts"],"names":[],"mappings":"
|
|
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"}
|
package/dist/cli/config.js
CHANGED
|
@@ -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
|
|
7
|
-
|
|
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
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
})
|
|
26
|
-
}
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
const
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
const
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
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
|
package/dist/cli/config.js.map
CHANGED
|
@@ -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;
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/cli/config.ts"],"names":[],"mappings":"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"}
|
package/dist/cli/config.test.js
CHANGED
|
@@ -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("
|
|
42
|
+
it("fails if no env var and no config apiKey", async () => {
|
|
41
43
|
mockConfigFile({ serverUrl: "wss://test" });
|
|
42
|
-
expect((
|
|
44
|
+
await expect(Effect.runPromise(resolveAuth)).rejects.toThrow("No agent registered");
|
|
43
45
|
});
|
|
44
|
-
it("
|
|
46
|
+
it("fails if config file missing", async () => {
|
|
45
47
|
// readFileSync throws ENOENT (set in beforeEach)
|
|
46
|
-
expect((
|
|
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,
|
|
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
|
|
2
|
-
|
|
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":"
|
|
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"}
|
package/dist/cli/http-client.js
CHANGED
|
@@ -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
|
-
|
|
3
|
-
|
|
4
|
-
|
|
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
|
-
|
|
7
|
-
|
|
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,
|
|
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"}
|
package/dist/cli/index.d.ts
CHANGED
|
@@ -1,3 +1,18 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
|
|
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
|
package/dist/cli/index.d.ts.map
CHANGED
|
@@ -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 "
|
|
4
|
-
import {
|
|
5
|
-
import {
|
|
6
|
-
import {
|
|
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 {
|
|
11
|
-
import {
|
|
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 {
|
|
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
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
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
|