@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
|
@@ -0,0 +1,324 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* CLI transport layer — the single seam between the command handlers and
|
|
3
|
+
* the wire. Decides between the singleton daemon (Unix socket) and a
|
|
4
|
+
* direct WebSocket per invocation.
|
|
5
|
+
*
|
|
6
|
+
* This file is the `--as <apiKey>` branch point (spec sbd#177 rev 3 §5.1,
|
|
7
|
+
* Invariant §4.2). Command handlers pull `Transport` from Effect context;
|
|
8
|
+
* they do NOT open sockets or construct clients themselves. The kind of
|
|
9
|
+
* transport in effect is decided once at CLI boot by {@link makeTransportLayer}
|
|
10
|
+
* and is immutable for the lifetime of the process.
|
|
11
|
+
*
|
|
12
|
+
* Test seam: integration tests swap {@link makeTransportLayer} for a layer
|
|
13
|
+
* that provides a recording `Transport`; unit tests provide `Transport`
|
|
14
|
+
* directly via `Effect.provideService`.
|
|
15
|
+
*/
|
|
16
|
+
import * as net from "node:net";
|
|
17
|
+
import { Context, Data, Effect, Layer, Scope } from "effect";
|
|
18
|
+
import { MoltZapService } from "../service.js";
|
|
19
|
+
import { MoltZapWsClient } from "../ws-client.js";
|
|
20
|
+
import { request as daemonRequest } from "./socket-client.js";
|
|
21
|
+
import { loadLayeredConfig, parseProfileName, resolveProfileAuth, } from "./profile.js";
|
|
22
|
+
/**
|
|
23
|
+
* The daemon socket path did not exist or refused connection. Only raised
|
|
24
|
+
* by the daemon branch; the direct branch never raises this.
|
|
25
|
+
*/
|
|
26
|
+
export class ServiceUnreachableError extends Data.TaggedError("ServiceUnreachableError") {
|
|
27
|
+
}
|
|
28
|
+
/** RPC exceeded the per-call deadline without a response frame. */
|
|
29
|
+
export class TransportTimeoutError extends Data.TaggedError("TransportTimeoutError") {
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Server returned a structured error response frame. `code` matches the
|
|
33
|
+
* JSON-RPC-style error code emitted by `packages/server`.
|
|
34
|
+
*/
|
|
35
|
+
export class TransportRpcError extends Data.TaggedError("TransportRpcError") {
|
|
36
|
+
}
|
|
37
|
+
/** Response frame failed to parse or did not match the expected RPC result shape. */
|
|
38
|
+
export class TransportDecodeError extends Data.TaggedError("TransportDecodeError") {
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* Transport inputs were self-inconsistent (e.g., `--as` set with no
|
|
42
|
+
* `serverUrl` resolvable). Surfaces at Layer construction, not at RPC time.
|
|
43
|
+
*/
|
|
44
|
+
export class TransportConfigError extends Data.TaggedError("TransportConfigError") {
|
|
45
|
+
}
|
|
46
|
+
export const Transport = Context.GenericTag("moltzap/cli/Transport");
|
|
47
|
+
const DEFAULT_SERVER_URL = "wss://api.moltzap.xyz";
|
|
48
|
+
/**
|
|
49
|
+
* Decision function — Effect-returning because the env-fallback branch
|
|
50
|
+
* may invoke the `probeDaemon` thunk. The as-flag branch short-circuits
|
|
51
|
+
* BEFORE any probe: `impersonateKey` present ⇒ returns
|
|
52
|
+
* `UseDirect{as-flag}` without calling `probeDaemon`, without reading
|
|
53
|
+
* env, without any side effect (Invariant §4.2).
|
|
54
|
+
*/
|
|
55
|
+
export const decideTransport = (options) => Effect.gen(function* () {
|
|
56
|
+
if (options.impersonateKey !== undefined) {
|
|
57
|
+
return { _tag: "UseDirect", reason: "as-flag" };
|
|
58
|
+
}
|
|
59
|
+
if (options.profileKey !== undefined) {
|
|
60
|
+
return { _tag: "UseDirect", reason: "profile" };
|
|
61
|
+
}
|
|
62
|
+
// Env-fallback branch: MOLTZAP_API_KEY is set AND daemon is unreachable.
|
|
63
|
+
const hasEnvKey = process.env.MOLTZAP_API_KEY !== undefined;
|
|
64
|
+
if (hasEnvKey && options.probeDaemon !== undefined) {
|
|
65
|
+
const reachable = yield* options.probeDaemon();
|
|
66
|
+
if (!reachable) {
|
|
67
|
+
return { _tag: "UseDirect", reason: "env-fallback" };
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
// Default: daemon branch.
|
|
71
|
+
const socketPath = options.socketPath ?? MoltZapService.SOCKET_PATH;
|
|
72
|
+
return { _tag: "UseDaemon", socketPath };
|
|
73
|
+
});
|
|
74
|
+
// Map daemon-branch Error to TransportError tags. The daemon socket client
|
|
75
|
+
// surfaces a generic Error; we re-tag at the boundary so command handlers
|
|
76
|
+
// can discriminate.
|
|
77
|
+
const tagDaemonError = (method, err) => {
|
|
78
|
+
const msg = err.message;
|
|
79
|
+
if (msg.includes("not running") ||
|
|
80
|
+
msg.includes("ENOENT") ||
|
|
81
|
+
msg.includes("ECONNREFUSED")) {
|
|
82
|
+
return new ServiceUnreachableError({
|
|
83
|
+
socketPath: MoltZapService.SOCKET_PATH,
|
|
84
|
+
cause: err,
|
|
85
|
+
});
|
|
86
|
+
}
|
|
87
|
+
if (msg.includes("timed out") || msg.includes("aborted")) {
|
|
88
|
+
return new TransportTimeoutError({ method, timeoutMs: 10_000 });
|
|
89
|
+
}
|
|
90
|
+
if (msg.startsWith("Malformed")) {
|
|
91
|
+
return new TransportDecodeError({ method, cause: err });
|
|
92
|
+
}
|
|
93
|
+
// Remote error surfaces as a bare message from the service.
|
|
94
|
+
return new TransportRpcError({
|
|
95
|
+
method,
|
|
96
|
+
code: -32000,
|
|
97
|
+
message: msg,
|
|
98
|
+
});
|
|
99
|
+
};
|
|
100
|
+
const makeDaemonTransport = (socketPath) => ({
|
|
101
|
+
kind: "daemon",
|
|
102
|
+
rpc: (method, params) => daemonRequest(method, params, socketPath).pipe(Effect.map((v) => v), Effect.mapError((err) => tagDaemonError(method, err))),
|
|
103
|
+
});
|
|
104
|
+
// Map ws-client errors (NotConnectedError | RpcTimeoutError | RpcServerError)
|
|
105
|
+
// to TransportError tags. Names are matched via _tag rather than instanceof
|
|
106
|
+
// to avoid a circular import chain through runtime/errors.
|
|
107
|
+
/** @internal exported for decoder-fixture tests only (sbd#198). */
|
|
108
|
+
export const tagWsError = (method, err) => {
|
|
109
|
+
switch (err._tag) {
|
|
110
|
+
case "NotConnectedError":
|
|
111
|
+
return new ServiceUnreachableError({
|
|
112
|
+
socketPath: "(direct-ws)",
|
|
113
|
+
cause: err,
|
|
114
|
+
});
|
|
115
|
+
case "RpcTimeoutError":
|
|
116
|
+
return new TransportTimeoutError({
|
|
117
|
+
method,
|
|
118
|
+
timeoutMs: err.timeoutMs ?? 30_000,
|
|
119
|
+
});
|
|
120
|
+
case "RpcServerError":
|
|
121
|
+
return new TransportRpcError({
|
|
122
|
+
method,
|
|
123
|
+
code: err.code ?? -32000,
|
|
124
|
+
message: err.message ?? "RPC error",
|
|
125
|
+
data: err.data,
|
|
126
|
+
});
|
|
127
|
+
default:
|
|
128
|
+
return new TransportDecodeError({ method, cause: err });
|
|
129
|
+
}
|
|
130
|
+
};
|
|
131
|
+
/**
|
|
132
|
+
* Build a direct-WebSocket transport. Requires `Scope` so `Layer.scoped`
|
|
133
|
+
* can install a finalizer via `Effect.addFinalizer`. The finalizer fires on
|
|
134
|
+
* fiber interruption (SIGINT/SIGTERM) — closing the ws-client and its internal
|
|
135
|
+
* ManagedRuntime — and also runs on normal completion so the event loop drains
|
|
136
|
+
* naturally without a forced `process.exit`. This replaces the fragile
|
|
137
|
+
* `process.once("beforeExit", ...)` hook that never fired because the reader
|
|
138
|
+
* fiber kept the event loop non-empty (sbd#198 Bug-2 / moltzap#228).
|
|
139
|
+
*
|
|
140
|
+
* `MoltZapWsClient` is constructed lazily inside `Effect.cached` so commands
|
|
141
|
+
* that never reach the wire (e.g. help-text display, input validation failure)
|
|
142
|
+
* do not pay for a ManagedRuntime spin-up.
|
|
143
|
+
*
|
|
144
|
+
* `sendRpc` is composed entirely in Effect-land — no `Effect.runPromise`
|
|
145
|
+
* bridge — so typed errors (`NotConnectedError`, `RpcTimeoutError`,
|
|
146
|
+
* `RpcServerError`) flow through `tagWsError` with their `_tag` intact.
|
|
147
|
+
*/
|
|
148
|
+
const makeDirectTransport = (serverUrl, agentKey) => Effect.gen(function* () {
|
|
149
|
+
if (!serverUrl) {
|
|
150
|
+
return yield* Effect.fail(new TransportConfigError({
|
|
151
|
+
reason: "direct transport requires a serverUrl",
|
|
152
|
+
}));
|
|
153
|
+
}
|
|
154
|
+
if (!agentKey) {
|
|
155
|
+
return yield* Effect.fail(new TransportConfigError({
|
|
156
|
+
reason: "direct transport requires an agentKey",
|
|
157
|
+
}));
|
|
158
|
+
}
|
|
159
|
+
// Lazily-created client: null until the first rpc() call fires connectOnce.
|
|
160
|
+
// The finalizer checks the current value at scope-close time so help/
|
|
161
|
+
// validation paths that never open a socket incur no cleanup cost.
|
|
162
|
+
let client = null;
|
|
163
|
+
yield* Effect.addFinalizer(() => client !== null ? client.close() : Effect.void);
|
|
164
|
+
// Memoize the connect handshake: only one round-trip per invocation,
|
|
165
|
+
// cached for the lifetime of this scope.
|
|
166
|
+
const connectOnce = yield* Effect.cached(Effect.gen(function* () {
|
|
167
|
+
const c = new MoltZapWsClient({ serverUrl, agentKey });
|
|
168
|
+
client = c;
|
|
169
|
+
yield* c
|
|
170
|
+
.connect()
|
|
171
|
+
.pipe(Effect.mapError((e) => tagWsError("connect", e)));
|
|
172
|
+
return c;
|
|
173
|
+
}));
|
|
174
|
+
return {
|
|
175
|
+
kind: "direct",
|
|
176
|
+
rpc: (method, params) => connectOnce.pipe(Effect.flatMap((c) => c
|
|
177
|
+
.sendRpc(method, params)
|
|
178
|
+
.pipe(Effect.mapError((e) => tagWsError(method, e)))), Effect.map((v) => v)),
|
|
179
|
+
};
|
|
180
|
+
});
|
|
181
|
+
/**
|
|
182
|
+
* Build the Layer that provides {@link Transport} for the current invocation.
|
|
183
|
+
*
|
|
184
|
+
* Branch points (in priority order):
|
|
185
|
+
* 1. `options.impersonateKey` → direct WS, Invariant §4.2 isolation guaranteed.
|
|
186
|
+
* 2. `process.env.MOLTZAP_API_KEY` present AND daemon unreachable → direct WS.
|
|
187
|
+
* 3. `options.profileKey` set → direct WS with that key.
|
|
188
|
+
* 4. otherwise → daemon transport over `options.socketPath`.
|
|
189
|
+
*
|
|
190
|
+
* The direct branch must NOT open the daemon socket, mutate
|
|
191
|
+
* `~/.moltzap/config.json`, or share any Effect fiber with the daemon.
|
|
192
|
+
* Integration test §7 of the design doc verifies this with a two-agent
|
|
193
|
+
* concurrent roster.
|
|
194
|
+
*/
|
|
195
|
+
export const makeTransportLayer = (options) => Layer.scoped(Transport, Effect.gen(function* () {
|
|
196
|
+
const decision = yield* decideTransport(options);
|
|
197
|
+
switch (decision._tag) {
|
|
198
|
+
case "UseDaemon":
|
|
199
|
+
return makeDaemonTransport(decision.socketPath);
|
|
200
|
+
case "UseDirect": {
|
|
201
|
+
let key;
|
|
202
|
+
switch (decision.reason) {
|
|
203
|
+
case "as-flag":
|
|
204
|
+
key = options.impersonateKey;
|
|
205
|
+
break;
|
|
206
|
+
case "profile":
|
|
207
|
+
key = options.profileKey;
|
|
208
|
+
break;
|
|
209
|
+
case "env-fallback":
|
|
210
|
+
key = process.env.MOLTZAP_API_KEY;
|
|
211
|
+
break;
|
|
212
|
+
}
|
|
213
|
+
if (key === undefined) {
|
|
214
|
+
return yield* Effect.fail(new TransportConfigError({
|
|
215
|
+
reason: `direct transport (${decision.reason}) requires an apiKey`,
|
|
216
|
+
}));
|
|
217
|
+
}
|
|
218
|
+
return yield* makeDirectTransport(options.serverUrl, key);
|
|
219
|
+
}
|
|
220
|
+
case "UseTest":
|
|
221
|
+
return yield* Effect.fail(new TransportConfigError({
|
|
222
|
+
reason: "UseTest is a test-only branch; provide Transport via Effect.provideService",
|
|
223
|
+
}));
|
|
224
|
+
default:
|
|
225
|
+
return absurd(decision);
|
|
226
|
+
}
|
|
227
|
+
}));
|
|
228
|
+
/**
|
|
229
|
+
* Convenience for command handlers: pull the Transport tag and call rpc.
|
|
230
|
+
* Every new subcommand routes through this helper; raw `socket-client.request`
|
|
231
|
+
* imports in new commands are a lint-level violation (see design doc §3).
|
|
232
|
+
*/
|
|
233
|
+
export const rpc = (method, params) => Effect.flatMap(Transport, (t) => t.rpc(method, params));
|
|
234
|
+
/**
|
|
235
|
+
* Uniform error-to-exit adapter for subcommand handlers. Catches every error
|
|
236
|
+
* channel, prints `Failed: <msg>` to stderr, and exits non-zero. Uses the
|
|
237
|
+
* tagged-error `message` field if present, otherwise the `_tag`, otherwise
|
|
238
|
+
* a generic fallback. Shared across every v2 subcommand wrapper so the
|
|
239
|
+
* exit-code contract (Invariant §4.6) has a single implementation.
|
|
240
|
+
*
|
|
241
|
+
* On success, this returns normally and relies on the `Layer.scoped`
|
|
242
|
+
* finalizer in `makeDirectTransport` to close the ws-client and drain
|
|
243
|
+
* the event loop (sbd#198 / moltzap#228 Bug-2 fix). No forced
|
|
244
|
+
* `process.exit(0)` — that would truncate piped stdout on large payloads.
|
|
245
|
+
*/
|
|
246
|
+
export const runHandler = (effect) => effect.pipe(Effect.catchAll((err) => Effect.sync(() => {
|
|
247
|
+
const msg = err.message !== undefined && err.message !== ""
|
|
248
|
+
? err.message
|
|
249
|
+
: (err._tag ?? "unknown error");
|
|
250
|
+
console.error(`Failed: ${msg}`);
|
|
251
|
+
process.exit(1);
|
|
252
|
+
})));
|
|
253
|
+
/**
|
|
254
|
+
* Lazy resolver invoked by the CLI entrypoint BEFORE constructing the
|
|
255
|
+
* transport layer. Closes the composition-boundary leak (architect design
|
|
256
|
+
* doc rev 4 finding 1): with `impersonateKey` set, this function does NOT
|
|
257
|
+
* call `cli/config.ts:loadConfig`, does NOT read `MOLTZAP_API_KEY` env,
|
|
258
|
+
* does NOT open `~/.moltzap/config.json`. The only resolution performed on
|
|
259
|
+
* the as-flag branch is `MOLTZAP_SERVER_URL` (or the hard-coded default).
|
|
260
|
+
*
|
|
261
|
+
* This function is the true CLI-boundary gate on Invariant §4.2 — without
|
|
262
|
+
* it, eager config-read side effects leak even when `decideTransport` is
|
|
263
|
+
* later short-circuited. Unit tests assert on `fs.open` and `env` read
|
|
264
|
+
* spies that zero calls happen on the `impersonateKey` branch.
|
|
265
|
+
*/
|
|
266
|
+
export const resolveTransportInputs = (parsed) => Effect.gen(function* () {
|
|
267
|
+
// ─── Branch A: impersonate (--as) ──────────────────────────────────────
|
|
268
|
+
// Invariant §4.2: no loadConfig, no MOLTZAP_API_KEY read, no config.json open.
|
|
269
|
+
if (parsed.impersonateKey !== undefined) {
|
|
270
|
+
const serverUrl = process.env.MOLTZAP_SERVER_URL ?? DEFAULT_SERVER_URL;
|
|
271
|
+
return {
|
|
272
|
+
impersonateKey: parsed.impersonateKey,
|
|
273
|
+
serverUrl,
|
|
274
|
+
};
|
|
275
|
+
}
|
|
276
|
+
// ─── Branch B: profile ─────────────────────────────────────────────────
|
|
277
|
+
if (parsed.profileName !== undefined) {
|
|
278
|
+
const name = yield* parseProfileName(parsed.profileName);
|
|
279
|
+
const layered = yield* loadLayeredConfig;
|
|
280
|
+
const record = yield* resolveProfileAuth(name);
|
|
281
|
+
const serverUrl = process.env.MOLTZAP_SERVER_URL ?? record.serverUrl ?? layered.serverUrl;
|
|
282
|
+
return {
|
|
283
|
+
profileKey: record.apiKey,
|
|
284
|
+
serverUrl,
|
|
285
|
+
socketPath: MoltZapService.SOCKET_PATH,
|
|
286
|
+
probeDaemon: probeDaemonDefault,
|
|
287
|
+
};
|
|
288
|
+
}
|
|
289
|
+
// ─── Branch C: legacy daemon / env fallback ────────────────────────────
|
|
290
|
+
const serverUrl = process.env.MOLTZAP_SERVER_URL ?? DEFAULT_SERVER_URL;
|
|
291
|
+
return {
|
|
292
|
+
serverUrl,
|
|
293
|
+
socketPath: MoltZapService.SOCKET_PATH,
|
|
294
|
+
probeDaemon: probeDaemonDefault,
|
|
295
|
+
};
|
|
296
|
+
});
|
|
297
|
+
/**
|
|
298
|
+
* Default daemon reachability probe: attempt a real connect to the daemon
|
|
299
|
+
* socket and resolve on `connect`. A bare `fs.existsSync` would mis-report
|
|
300
|
+
* a stale socket file as "reachable" and route env-fallback callers into
|
|
301
|
+
* a broken daemon branch; a real connect is the only honest reachability
|
|
302
|
+
* check. 250ms cap keeps boot latency invisible on the common fast-local
|
|
303
|
+
* path and still fails fast when the socket refuses or hangs.
|
|
304
|
+
*/
|
|
305
|
+
const probeDaemonDefault = () => Effect.async((resume) => {
|
|
306
|
+
let settled = false;
|
|
307
|
+
const done = (reachable) => {
|
|
308
|
+
if (settled)
|
|
309
|
+
return;
|
|
310
|
+
settled = true;
|
|
311
|
+
clearTimeout(timer);
|
|
312
|
+
conn.removeAllListeners();
|
|
313
|
+
conn.destroy();
|
|
314
|
+
resume(Effect.succeed(reachable));
|
|
315
|
+
};
|
|
316
|
+
const conn = net.createConnection(MoltZapService.SOCKET_PATH);
|
|
317
|
+
const timer = setTimeout(() => done(false), 250);
|
|
318
|
+
conn.once("connect", () => done(true));
|
|
319
|
+
conn.once("error", () => done(false));
|
|
320
|
+
});
|
|
321
|
+
function absurd(x) {
|
|
322
|
+
throw new Error(`unreachable: ${String(x)}`);
|
|
323
|
+
}
|
|
324
|
+
//# sourceMappingURL=transport.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"transport.js","sourceRoot":"","sources":["../../src/cli/transport.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"transport.test.d.ts","sourceRoot":"","sources":["../../src/cli/transport.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,197 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Unit tests for the transport layer — pure decision table + composition-
|
|
3
|
+
* boundary checks. Integration coverage of the direct-WS branch lives in
|
|
4
|
+
* the E2E fixture (`__tests__/cli-multi-agent.int.test.ts`).
|
|
5
|
+
*/
|
|
6
|
+
import { Cause, Effect, Exit, Option } from "effect";
|
|
7
|
+
import { afterEach, beforeEach, describe, expect, it, vi } from "vitest";
|
|
8
|
+
import { RpcServerError } from "../runtime/errors.js";
|
|
9
|
+
import { decideTransport, makeTransportLayer, resolveTransportInputs, tagWsError, Transport, TransportDecodeError, TransportRpcError, ServiceUnreachableError, TransportTimeoutError, } from "./transport.js";
|
|
10
|
+
/**
|
|
11
|
+
* Module-level mock so transport.ts's `new MoltZapWsClient(...)` call is
|
|
12
|
+
* intercepted for the composed-rpc test below. Existing tests (decideTransport,
|
|
13
|
+
* tagWsError, resolveTransportInputs) do not exercise the ws-client path, so
|
|
14
|
+
* the mock is a no-op for them.
|
|
15
|
+
*/
|
|
16
|
+
vi.mock("../ws-client.js", async () => {
|
|
17
|
+
const effect = await import("effect");
|
|
18
|
+
const errors = await import("../runtime/errors.js");
|
|
19
|
+
return {
|
|
20
|
+
MoltZapWsClient: vi.fn().mockImplementation(() => ({
|
|
21
|
+
connect: () => effect.Effect.void,
|
|
22
|
+
sendRpc: (_method, _params) => effect.Effect.fail(new errors.RpcServerError({
|
|
23
|
+
code: -32001,
|
|
24
|
+
message: "item not found",
|
|
25
|
+
})),
|
|
26
|
+
close: () => effect.Effect.void,
|
|
27
|
+
})),
|
|
28
|
+
};
|
|
29
|
+
});
|
|
30
|
+
const makeOpts = (over = {}) => ({
|
|
31
|
+
serverUrl: "wss://example.test",
|
|
32
|
+
...over,
|
|
33
|
+
});
|
|
34
|
+
describe("decideTransport", () => {
|
|
35
|
+
const originalEnv = process.env;
|
|
36
|
+
beforeEach(() => {
|
|
37
|
+
process.env = { ...originalEnv };
|
|
38
|
+
delete process.env.MOLTZAP_API_KEY;
|
|
39
|
+
});
|
|
40
|
+
afterEach(() => {
|
|
41
|
+
process.env = originalEnv;
|
|
42
|
+
});
|
|
43
|
+
it("returns UseDirect{as-flag} when impersonateKey is set", async () => {
|
|
44
|
+
const probe = { invoked: 0 };
|
|
45
|
+
const decision = await Effect.runPromise(decideTransport(makeOpts({
|
|
46
|
+
impersonateKey: "key-1",
|
|
47
|
+
probeDaemon: () => Effect.sync(() => {
|
|
48
|
+
probe.invoked++;
|
|
49
|
+
return true;
|
|
50
|
+
}),
|
|
51
|
+
})));
|
|
52
|
+
expect(decision).toEqual({ _tag: "UseDirect", reason: "as-flag" });
|
|
53
|
+
expect(probe.invoked).toBe(0);
|
|
54
|
+
});
|
|
55
|
+
it("returns UseDirect{profile} when profileKey set and no --as", async () => {
|
|
56
|
+
const decision = await Effect.runPromise(decideTransport(makeOpts({ profileKey: "pk-1" })));
|
|
57
|
+
expect(decision).toEqual({ _tag: "UseDirect", reason: "profile" });
|
|
58
|
+
});
|
|
59
|
+
it("returns UseDirect{env-fallback} when MOLTZAP_API_KEY env + daemonReachable=false", async () => {
|
|
60
|
+
process.env.MOLTZAP_API_KEY = "env-key";
|
|
61
|
+
const decision = await Effect.runPromise(decideTransport(makeOpts({ probeDaemon: () => Effect.succeed(false) })));
|
|
62
|
+
expect(decision).toEqual({ _tag: "UseDirect", reason: "env-fallback" });
|
|
63
|
+
});
|
|
64
|
+
it("returns UseDaemon when MOLTZAP_API_KEY env + daemonReachable=true", async () => {
|
|
65
|
+
process.env.MOLTZAP_API_KEY = "env-key";
|
|
66
|
+
const decision = await Effect.runPromise(decideTransport(makeOpts({
|
|
67
|
+
socketPath: "/tmp/sock",
|
|
68
|
+
probeDaemon: () => Effect.succeed(true),
|
|
69
|
+
})));
|
|
70
|
+
expect(decision._tag).toBe("UseDaemon");
|
|
71
|
+
});
|
|
72
|
+
it("returns UseDaemon when neither as-flag nor env-fallback nor profile", async () => {
|
|
73
|
+
const decision = await Effect.runPromise(decideTransport(makeOpts({ socketPath: "/tmp/sock" })));
|
|
74
|
+
expect(decision).toEqual({ _tag: "UseDaemon", socketPath: "/tmp/sock" });
|
|
75
|
+
});
|
|
76
|
+
it("never invokes probeDaemon when impersonateKey is set (Invariant §4.2)", async () => {
|
|
77
|
+
let invocations = 0;
|
|
78
|
+
await Effect.runPromise(decideTransport(makeOpts({
|
|
79
|
+
impersonateKey: "key-1",
|
|
80
|
+
probeDaemon: () => Effect.sync(() => {
|
|
81
|
+
invocations++;
|
|
82
|
+
return true;
|
|
83
|
+
}),
|
|
84
|
+
})));
|
|
85
|
+
expect(invocations).toBe(0);
|
|
86
|
+
});
|
|
87
|
+
});
|
|
88
|
+
/**
|
|
89
|
+
* Regression guard for sbd#198: the original v2 implementation at 069135d
|
|
90
|
+
* used `Effect.runPromise(sendRpc)` inside `Effect.tryPromise`. In Effect 3.21,
|
|
91
|
+
* `runPromise` wraps typed failures in `FiberFailureImpl` (no `_tag`), so
|
|
92
|
+
* `tagWsError`'s switch hit the default branch and emitted `TransportDecodeError`
|
|
93
|
+
* for every ws error. Fixed by code-guard commit ff2de0d; these tests guard
|
|
94
|
+
* against regression to that pattern.
|
|
95
|
+
*
|
|
96
|
+
* `tagWsError` is `@internal`-exported so this suite can reach it directly
|
|
97
|
+
* without a mock WS server.
|
|
98
|
+
*/
|
|
99
|
+
describe("tagWsError — maps ws-client error tags to TransportError variants", () => {
|
|
100
|
+
it("RpcServerError maps to TransportRpcError (not TransportDecodeError)", () => {
|
|
101
|
+
const err = tagWsError("apps/listSessions", {
|
|
102
|
+
_tag: "RpcServerError",
|
|
103
|
+
code: -32001,
|
|
104
|
+
message: "session not found",
|
|
105
|
+
});
|
|
106
|
+
expect(err).toBeInstanceOf(TransportRpcError);
|
|
107
|
+
expect(err._tag).toBe("TransportRpcError");
|
|
108
|
+
if (err instanceof TransportRpcError) {
|
|
109
|
+
expect(err.code).toBe(-32001);
|
|
110
|
+
expect(err.message).toBe("session not found");
|
|
111
|
+
}
|
|
112
|
+
});
|
|
113
|
+
it("NotConnectedError maps to ServiceUnreachableError", () => {
|
|
114
|
+
const err = tagWsError("apps/listSessions", { _tag: "NotConnectedError" });
|
|
115
|
+
expect(err).toBeInstanceOf(ServiceUnreachableError);
|
|
116
|
+
expect(err._tag).toBe("ServiceUnreachableError");
|
|
117
|
+
});
|
|
118
|
+
it("RpcTimeoutError maps to TransportTimeoutError with timeoutMs forwarded", () => {
|
|
119
|
+
const err = tagWsError("apps/listSessions", {
|
|
120
|
+
_tag: "RpcTimeoutError",
|
|
121
|
+
timeoutMs: 15_000,
|
|
122
|
+
});
|
|
123
|
+
expect(err).toBeInstanceOf(TransportTimeoutError);
|
|
124
|
+
if (err instanceof TransportTimeoutError) {
|
|
125
|
+
expect(err.timeoutMs).toBe(15_000);
|
|
126
|
+
}
|
|
127
|
+
});
|
|
128
|
+
it("FiberFailureImpl-shaped error (no _tag) maps to TransportDecodeError — not to TransportRpcError", () => {
|
|
129
|
+
// Guards the regression: a future runPromise bridge would produce an object
|
|
130
|
+
// with no _tag (FiberFailureImpl shape). This pins the default branch to
|
|
131
|
+
// TransportDecodeError so the error is observable, not silently swallowed.
|
|
132
|
+
const err = tagWsError("apps/listSessions", {
|
|
133
|
+
message: "some unknown error",
|
|
134
|
+
});
|
|
135
|
+
expect(err).toBeInstanceOf(TransportDecodeError);
|
|
136
|
+
expect(err._tag).toBe("TransportDecodeError");
|
|
137
|
+
});
|
|
138
|
+
});
|
|
139
|
+
describe("resolveTransportInputs (composition-boundary gate)", () => {
|
|
140
|
+
const originalEnv = process.env;
|
|
141
|
+
beforeEach(() => {
|
|
142
|
+
process.env = { ...originalEnv };
|
|
143
|
+
delete process.env.MOLTZAP_API_KEY;
|
|
144
|
+
delete process.env.MOLTZAP_SERVER_URL;
|
|
145
|
+
});
|
|
146
|
+
afterEach(() => {
|
|
147
|
+
process.env = originalEnv;
|
|
148
|
+
});
|
|
149
|
+
it("impersonateKey branch does NOT read MOLTZAP_API_KEY env", async () => {
|
|
150
|
+
process.env.MOLTZAP_API_KEY = "leaked-key";
|
|
151
|
+
const opts = await Effect.runPromise(resolveTransportInputs({ impersonateKey: "explicit-key" }));
|
|
152
|
+
expect(opts.impersonateKey).toBe("explicit-key");
|
|
153
|
+
// The returned TransportOptions does NOT expose MOLTZAP_API_KEY as profileKey.
|
|
154
|
+
expect(opts.profileKey).toBeUndefined();
|
|
155
|
+
});
|
|
156
|
+
it("impersonateKey branch uses MOLTZAP_SERVER_URL if present, else default", async () => {
|
|
157
|
+
process.env.MOLTZAP_SERVER_URL = "wss://override.test";
|
|
158
|
+
const opts = await Effect.runPromise(resolveTransportInputs({ impersonateKey: "k" }));
|
|
159
|
+
expect(opts.serverUrl).toBe("wss://override.test");
|
|
160
|
+
});
|
|
161
|
+
it("empty input falls through to legacy daemon path (no impersonate, no profile)", async () => {
|
|
162
|
+
const opts = await Effect.runPromise(resolveTransportInputs({}));
|
|
163
|
+
expect(opts.impersonateKey).toBeUndefined();
|
|
164
|
+
expect(opts.profileKey).toBeUndefined();
|
|
165
|
+
expect(opts.socketPath).toBeDefined();
|
|
166
|
+
});
|
|
167
|
+
});
|
|
168
|
+
/**
|
|
169
|
+
* Composed rpc() failure path — pins the full call chain so a future
|
|
170
|
+
* regression to `Effect.runPromise(sendRpc)` inside `Effect.tryPromise`
|
|
171
|
+
* is caught here, not just in the isolated `tagWsError` suite above.
|
|
172
|
+
*
|
|
173
|
+
* The ws-client mock (module-level `vi.mock("../ws-client.js")`) makes
|
|
174
|
+
* `sendRpc` return `Effect.fail(new RpcServerError(...))` so the test
|
|
175
|
+
* exercises: connect (success) → sendRpc (RpcServerError) → tagWsError
|
|
176
|
+
* → TransportRpcError. A runPromise bridge would wrap RpcServerError in
|
|
177
|
+
* FiberFailureImpl (no _tag) and the result would be TransportDecodeError.
|
|
178
|
+
*/
|
|
179
|
+
describe("makeDirectTransport — composed rpc() failure path", () => {
|
|
180
|
+
it("RpcServerError from sendRpc propagates as TransportRpcError through tagWsError", async () => {
|
|
181
|
+
const opts = {
|
|
182
|
+
impersonateKey: "test-key",
|
|
183
|
+
serverUrl: "wss://test.example",
|
|
184
|
+
};
|
|
185
|
+
const exit = await Effect.runPromise(Transport.pipe(Effect.flatMap((t) => t.rpc("apps/listSessions", {})), Effect.exit, Effect.provide(makeTransportLayer(opts))));
|
|
186
|
+
expect(Exit.isFailure(exit)).toBe(true);
|
|
187
|
+
if (Exit.isFailure(exit)) {
|
|
188
|
+
const failure = Cause.failureOption(exit.cause);
|
|
189
|
+
expect(Option.isSome(failure)).toBe(true);
|
|
190
|
+
if (Option.isSome(failure)) {
|
|
191
|
+
expect(failure.value).toBeInstanceOf(TransportRpcError);
|
|
192
|
+
expect(failure.value._tag).toBe("TransportRpcError");
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
});
|
|
196
|
+
});
|
|
197
|
+
//# sourceMappingURL=transport.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"transport.test.js","sourceRoot":"","sources":["../../src/cli/transport.test.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
CHANGED
|
@@ -1,4 +1,8 @@
|
|
|
1
|
-
export { MoltZapService, formatCrossConversationBlock, sanitizeForSystemReminder, type ConversationMeta, type ContextOptions, type CrossConvMessage, type CrossConversationEntry, type ServiceOptions, } from "./service.js";
|
|
1
|
+
export { MoltZapService, formatCrossConversationBlock, sanitizeForSystemReminder, type ConversationMeta, type ContextOptions, type CrossConvMessage, type CrossConversationEntry, type ServiceOptions, type ServiceRpcError, } from "./service.js";
|
|
2
|
+
export type { PermissionsRequiredEvent } from "@moltzap/protocol";
|
|
3
|
+
export { AgentNotFoundError, NotConnectedError, RpcServerError, RpcTimeoutError, MalformedFrameError, } from "./runtime/errors.js";
|
|
2
4
|
export { MoltZapChannelCore, type ChannelCoreOptions, type ChannelService, type ContextBlocks, type EnrichedConversationMeta, type EnrichedInboundMessage, type EnrichedSender, type InboundHandler, } from "./channel-core.js";
|
|
3
|
-
export { MoltZapWsClient, type WsClientLogger, type MoltZapWsClientOptions, } from "./ws-client.js";
|
|
5
|
+
export { MoltZapWsClient, type WsClientLogger, type MoltZapWsClientOptions, type TrackedRpcResponse, } from "./ws-client.js";
|
|
6
|
+
export type { SubscriptionFilter, SubscriptionId, EventSubscription, SubscriberHandler, } from "./runtime/subscribers.js";
|
|
7
|
+
export type { CloseInfo } from "./runtime/close-info.js";
|
|
4
8
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,cAAc,EACd,4BAA4B,EAC5B,yBAAyB,EACzB,KAAK,gBAAgB,EACrB,KAAK,cAAc,EACnB,KAAK,gBAAgB,EACrB,KAAK,sBAAsB,EAC3B,KAAK,cAAc,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,cAAc,EACd,4BAA4B,EAC5B,yBAAyB,EACzB,KAAK,gBAAgB,EACrB,KAAK,cAAc,EACnB,KAAK,gBAAgB,EACrB,KAAK,sBAAsB,EAC3B,KAAK,cAAc,EACnB,KAAK,eAAe,GACrB,MAAM,cAAc,CAAC;AACtB,YAAY,EAAE,wBAAwB,EAAE,MAAM,mBAAmB,CAAC;AAClE,OAAO,EACL,kBAAkB,EAClB,iBAAiB,EACjB,cAAc,EACd,eAAe,EACf,mBAAmB,GACpB,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EACL,kBAAkB,EAClB,KAAK,kBAAkB,EACvB,KAAK,cAAc,EACnB,KAAK,aAAa,EAClB,KAAK,wBAAwB,EAC7B,KAAK,sBAAsB,EAC3B,KAAK,cAAc,EACnB,KAAK,cAAc,GACpB,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EACL,eAAe,EACf,KAAK,cAAc,EACnB,KAAK,sBAAsB,EAC3B,KAAK,kBAAkB,GACxB,MAAM,gBAAgB,CAAC;AACxB,YAAY,EACV,kBAAkB,EAClB,cAAc,EACd,iBAAiB,EACjB,iBAAiB,GAClB,MAAM,0BAA0B,CAAC;AAClC,YAAY,EAAE,SAAS,EAAE,MAAM,yBAAyB,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
export { MoltZapService, formatCrossConversationBlock, sanitizeForSystemReminder, } from "./service.js";
|
|
2
|
+
export { AgentNotFoundError, NotConnectedError, RpcServerError, RpcTimeoutError, MalformedFrameError, } from "./runtime/errors.js";
|
|
2
3
|
export { MoltZapChannelCore, } from "./channel-core.js";
|
|
3
4
|
export { MoltZapWsClient, } from "./ws-client.js";
|
|
4
5
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,cAAc,EACd,4BAA4B,EAC5B,yBAAyB,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,cAAc,EACd,4BAA4B,EAC5B,yBAAyB,GAO1B,MAAM,cAAc,CAAC;AAEtB,OAAO,EACL,kBAAkB,EAClB,iBAAiB,EACjB,cAAc,EACd,eAAe,EACf,mBAAmB,GACpB,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EACL,kBAAkB,GAQnB,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EACL,eAAe,GAIhB,MAAM,gBAAgB,CAAC"}
|