@moltzap/client 2026.511.0 → 2026.518.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.
- package/dist/auth.d.ts +12 -6
- package/dist/auth.d.ts.map +1 -1
- package/dist/auth.js +67 -29
- package/dist/auth.js.map +1 -1
- package/dist/auth.test.js +113 -76
- package/dist/auth.test.js.map +1 -1
- package/dist/channel-core-context.test.d.ts +2 -0
- package/dist/channel-core-context.test.d.ts.map +1 -0
- package/dist/channel-core-context.test.js +334 -0
- package/dist/channel-core-context.test.js.map +1 -0
- package/dist/channel-core-dispatch.test.d.ts +2 -0
- package/dist/channel-core-dispatch.test.d.ts.map +1 -0
- package/dist/channel-core-dispatch.test.js +550 -0
- package/dist/channel-core-dispatch.test.js.map +1 -0
- package/dist/channel-core-enrichment.d.ts +8 -0
- package/dist/channel-core-enrichment.d.ts.map +1 -0
- package/dist/channel-core-enrichment.js +134 -0
- package/dist/channel-core-enrichment.js.map +1 -0
- package/dist/channel-core-errors.d.ts +20 -0
- package/dist/channel-core-errors.d.ts.map +1 -0
- package/dist/channel-core-errors.js +12 -0
- package/dist/channel-core-errors.js.map +1 -0
- package/dist/channel-core-test-support.d.ts +48 -0
- package/dist/channel-core-test-support.d.ts.map +1 -0
- package/dist/channel-core-test-support.js +111 -0
- package/dist/channel-core-test-support.js.map +1 -0
- package/dist/channel-core.d.ts +30 -7
- package/dist/channel-core.d.ts.map +1 -1
- package/dist/channel-core.js +214 -237
- package/dist/channel-core.js.map +1 -1
- package/dist/channel-core.test.js +216 -1082
- package/dist/channel-core.test.js.map +1 -1
- package/dist/cli/__tests__/cli-multi-agent.int.test.js +129 -23
- package/dist/cli/__tests__/cli-multi-agent.int.test.js.map +1 -1
- package/dist/cli/commands/conversations-v2.test.js +64 -54
- package/dist/cli/commands/conversations-v2.test.js.map +1 -1
- package/dist/cli/commands/conversations.d.ts +5 -5
- package/dist/cli/commands/conversations.d.ts.map +1 -1
- package/dist/cli/commands/conversations.js +43 -36
- package/dist/cli/commands/conversations.js.map +1 -1
- package/dist/cli/commands/messages.d.ts +4 -4
- package/dist/cli/commands/messages.d.ts.map +1 -1
- package/dist/cli/commands/messages.js +4 -4
- package/dist/cli/commands/messages.js.map +1 -1
- package/dist/cli/commands/messages.test.js +61 -49
- package/dist/cli/commands/messages.test.js.map +1 -1
- package/dist/cli/commands/ping.d.ts +0 -9
- package/dist/cli/commands/ping.d.ts.map +1 -1
- package/dist/cli/commands/ping.js +1 -1
- package/dist/cli/commands/ping.js.map +1 -1
- package/dist/cli/commands/presence.d.ts +1 -1
- package/dist/cli/commands/presence.js +1 -1
- package/dist/cli/commands/register.d.ts +2 -2
- package/dist/cli/commands/register.d.ts.map +1 -1
- package/dist/cli/commands/register.js +98 -77
- package/dist/cli/commands/register.js.map +1 -1
- package/dist/cli/commands/register.test.js +63 -39
- package/dist/cli/commands/register.test.js.map +1 -1
- package/dist/cli/commands/send.d.ts +6 -6
- package/dist/cli/commands/send.js +6 -6
- package/dist/cli/commands/send.test.js +32 -28
- package/dist/cli/commands/send.test.js.map +1 -1
- package/dist/cli/commands/status.d.ts.map +1 -1
- package/dist/cli/commands/status.js +3 -4
- package/dist/cli/commands/status.js.map +1 -1
- package/dist/cli/config.d.ts +0 -2
- package/dist/cli/config.d.ts.map +1 -1
- package/dist/cli/config.js +86 -76
- package/dist/cli/config.js.map +1 -1
- package/dist/cli/config.test.js +80 -42
- package/dist/cli/config.test.js.map +1 -1
- package/dist/cli/index.d.ts +1 -16
- package/dist/cli/index.d.ts.map +1 -1
- package/dist/cli/index.js +50 -113
- package/dist/cli/index.js.map +1 -1
- package/dist/cli/process-argv.d.ts +2 -0
- package/dist/cli/process-argv.d.ts.map +1 -0
- package/dist/cli/process-argv.js +2 -0
- package/dist/cli/process-argv.js.map +1 -0
- package/dist/cli/profile.d.ts +3 -10
- package/dist/cli/profile.d.ts.map +1 -1
- package/dist/cli/profile.js +105 -104
- package/dist/cli/profile.js.map +1 -1
- package/dist/cli/profile.test.js +338 -232
- package/dist/cli/profile.test.js.map +1 -1
- package/dist/cli/runtime.d.ts +5 -17
- package/dist/cli/runtime.d.ts.map +1 -1
- package/dist/cli/runtime.js +6 -59
- package/dist/cli/runtime.js.map +1 -1
- package/dist/cli/socket-client.d.ts +10 -15
- package/dist/cli/socket-client.d.ts.map +1 -1
- package/dist/cli/socket-client.js +74 -89
- package/dist/cli/socket-client.js.map +1 -1
- package/dist/cli/transport.d.ts +9 -5
- package/dist/cli/transport.d.ts.map +1 -1
- package/dist/cli/transport.js +45 -42
- package/dist/cli/transport.js.map +1 -1
- package/dist/cli/transport.test.js +227 -133
- package/dist/cli/transport.test.js.map +1 -1
- package/dist/index.d.ts +4 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +3 -0
- package/dist/index.js.map +1 -1
- package/dist/local-daemon-rpc.d.ts +13 -0
- package/dist/local-daemon-rpc.d.ts.map +1 -0
- package/dist/local-daemon-rpc.js +17 -0
- package/dist/local-daemon-rpc.js.map +1 -0
- package/dist/local-paths.d.ts +7 -0
- package/dist/local-paths.d.ts.map +1 -0
- package/dist/local-paths.js +20 -0
- package/dist/local-paths.js.map +1 -0
- package/dist/runtime/close-info.d.ts +3 -12
- package/dist/runtime/close-info.d.ts.map +1 -1
- package/dist/runtime/close-info.js +28 -39
- package/dist/runtime/close-info.js.map +1 -1
- package/dist/runtime/close-info.test.js +77 -70
- package/dist/runtime/close-info.test.js.map +1 -1
- package/dist/runtime/errors.test.js +42 -28
- package/dist/runtime/errors.test.js.map +1 -1
- package/dist/runtime/frame.d.ts +4 -31
- package/dist/runtime/frame.d.ts.map +1 -1
- package/dist/runtime/frame.js +7 -116
- package/dist/runtime/frame.js.map +1 -1
- package/dist/runtime/frame.test.js +41 -54
- package/dist/runtime/frame.test.js.map +1 -1
- package/dist/runtime/index.d.ts +7 -0
- package/dist/runtime/index.d.ts.map +1 -1
- package/dist/runtime/index.js +7 -11
- package/dist/runtime/index.js.map +1 -1
- package/dist/runtime/local-history.d.ts +67 -0
- package/dist/runtime/local-history.d.ts.map +1 -0
- package/dist/runtime/local-history.js +77 -0
- package/dist/runtime/local-history.js.map +1 -0
- package/dist/runtime/local-service-commands.d.ts +19 -0
- package/dist/runtime/local-service-commands.d.ts.map +1 -1
- package/dist/runtime/local-service-commands.js +23 -0
- package/dist/runtime/local-service-commands.js.map +1 -1
- package/dist/runtime/local-socket-server.d.ts +20 -0
- package/dist/runtime/local-socket-server.d.ts.map +1 -0
- package/dist/runtime/local-socket-server.js +94 -0
- package/dist/runtime/local-socket-server.js.map +1 -0
- package/dist/runtime/refs.d.ts +1 -1
- package/dist/runtime/refs.js +1 -1
- package/dist/runtime/runtime.test.js +29 -21
- package/dist/runtime/runtime.test.js.map +1 -1
- package/dist/runtime/service-helpers.d.ts +32 -0
- package/dist/runtime/service-helpers.d.ts.map +1 -0
- package/dist/runtime/service-helpers.js +85 -0
- package/dist/runtime/service-helpers.js.map +1 -0
- package/dist/runtime/subscribers.d.ts +13 -17
- package/dist/runtime/subscribers.d.ts.map +1 -1
- package/dist/runtime/subscribers.js +37 -32
- package/dist/runtime/subscribers.js.map +1 -1
- package/dist/runtime/subscribers.test.js +139 -131
- package/dist/runtime/subscribers.test.js.map +1 -1
- package/dist/service-socket-path.test.d.ts +2 -0
- package/dist/service-socket-path.test.d.ts.map +1 -0
- package/dist/service-socket-path.test.js +87 -0
- package/dist/service-socket-path.test.js.map +1 -0
- package/dist/service.d.ts +46 -20
- package/dist/service.d.ts.map +1 -1
- package/dist/service.js +243 -340
- package/dist/service.js.map +1 -1
- package/dist/service.test.js +650 -571
- package/dist/service.test.js.map +1 -1
- package/dist/test/index.d.ts +30 -14
- package/dist/test/index.d.ts.map +1 -1
- package/dist/test/index.js +25 -21
- package/dist/test/index.js.map +1 -1
- package/dist/test-utils/channel-service-fixture.d.ts +1 -0
- package/dist/test-utils/channel-service-fixture.d.ts.map +1 -1
- package/dist/test-utils/channel-service-fixture.js +139 -98
- package/dist/test-utils/channel-service-fixture.js.map +1 -1
- package/dist/test-utils/conformance-adapter.d.ts.map +1 -1
- package/dist/test-utils/conformance-adapter.js +145 -124
- package/dist/test-utils/conformance-adapter.js.map +1 -1
- package/dist/test-utils/fake-service.d.ts.map +1 -1
- package/dist/test-utils/fake-service.js +3 -3
- package/dist/test-utils/fake-service.js.map +1 -1
- package/dist/test-utils/index.d.ts +25 -0
- package/dist/test-utils/index.d.ts.map +1 -1
- package/dist/test-utils/index.js +25 -8
- package/dist/test-utils/index.js.map +1 -1
- package/dist/ws-client-test-support.d.ts +180 -0
- package/dist/ws-client-test-support.d.ts.map +1 -0
- package/dist/ws-client-test-support.js +399 -0
- package/dist/ws-client-test-support.js.map +1 -0
- package/dist/ws-client.d.ts +59 -32
- package/dist/ws-client.d.ts.map +1 -1
- package/dist/ws-client.js +272 -321
- package/dist/ws-client.js.map +1 -1
- package/dist/ws-client.test.js +388 -800
- package/dist/ws-client.test.js.map +1 -1
- package/package.json +14 -10
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":"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"}
|
package/dist/cli/config.js
CHANGED
|
@@ -1,9 +1,7 @@
|
|
|
1
|
-
import
|
|
2
|
-
import
|
|
3
|
-
import
|
|
4
|
-
import {
|
|
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.
|
|
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.
|
|
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
|
|
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
|
|
35
|
-
|
|
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*
|
|
50
|
-
|
|
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
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
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
|
-
|
|
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(
|
|
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
|
-
|
|
92
|
-
|
|
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 ${
|
|
95
|
-
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: (
|
|
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: (
|
|
107
|
-
result.agentName =
|
|
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
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
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). */
|
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,
|
|
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,51 +1,89 @@
|
|
|
1
|
-
import
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
4
|
-
|
|
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
|
-
|
|
7
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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,
|
|
1
|
+
{"version":3,"file":"config.test.js","sourceRoot":"","sources":["../../src/cli/config.test.ts"],"names":[],"mappings":"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"}
|
package/dist/cli/index.d.ts
CHANGED
|
@@ -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
|
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":""}
|
package/dist/cli/index.js
CHANGED
|
@@ -1,8 +1,9 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
|
|
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
|
-
|
|
21
|
-
const { version } =
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
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
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
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
|
-
*
|
|
86
|
-
*
|
|
87
|
-
* `
|
|
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
|
|
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 (
|
|
92
|
-
"
|
|
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
|
-
|
|
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
|