@moltzap/client 2026.505.0 → 2026.505.2
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/cli/index.d.ts.map +1 -1
- package/dist/cli/index.js +0 -2
- package/dist/cli/index.js.map +1 -1
- package/dist/cli/transport.test.js +7 -7
- package/dist/cli/transport.test.js.map +1 -1
- package/dist/internal/__tests__/app-callback-partition-key.test.js +2 -2
- package/dist/internal/__tests__/app-callback-partition-key.test.js.map +1 -1
- package/dist/internal/__tests__/app-callback-partitioned-dispatcher-real-ws.test.js +2 -2
- package/dist/internal/__tests__/app-callback-partitioned-dispatcher-real-ws.test.js.map +1 -1
- package/dist/internal/__tests__/app-callback-partitioned-dispatcher.test.js +1 -1
- package/dist/internal/__tests__/app-callback-partitioned-dispatcher.test.js.map +1 -1
- package/dist/internal/__tests__/app-callback-test-requests.d.ts +18 -14
- package/dist/internal/__tests__/app-callback-test-requests.d.ts.map +1 -1
- package/dist/internal/__tests__/app-callback-test-requests.js +25 -25
- package/dist/internal/__tests__/app-callback-test-requests.js.map +1 -1
- package/dist/internal/app-callback-dispatcher-errors.js +1 -1
- package/dist/internal/app-callback-partition-key.d.ts +3 -3
- package/dist/internal/app-callback-partition-key.d.ts.map +1 -1
- package/dist/internal/app-callback-partition-key.js +4 -4
- package/dist/internal/app-callback-partition-key.js.map +1 -1
- package/dist/internal/app-callback-partition-worker.d.ts +1 -1
- package/dist/internal/app-callback-partition-worker.js +1 -1
- package/dist/runtime/frame.d.ts +3 -6
- package/dist/runtime/frame.d.ts.map +1 -1
- package/dist/runtime/frame.js +24 -40
- package/dist/runtime/frame.js.map +1 -1
- package/dist/runtime/frame.test.js +40 -1
- package/dist/runtime/frame.test.js.map +1 -1
- package/dist/runtime/notification-types.types-check.d.ts +2 -0
- package/dist/runtime/notification-types.types-check.d.ts.map +1 -0
- package/dist/runtime/notification-types.types-check.js +57 -0
- package/dist/runtime/notification-types.types-check.js.map +1 -0
- package/dist/runtime/subscribers.d.ts +15 -3
- package/dist/runtime/subscribers.d.ts.map +1 -1
- package/dist/runtime/subscribers.js.map +1 -1
- package/dist/runtime/subscribers.test.js +30 -13
- package/dist/runtime/subscribers.test.js.map +1 -1
- package/dist/service.d.ts +18 -9
- package/dist/service.d.ts.map +1 -1
- package/dist/service.js +14 -8
- package/dist/service.js.map +1 -1
- package/dist/service.typed-bridge.test.d.ts +2 -0
- package/dist/service.typed-bridge.test.d.ts.map +1 -0
- package/dist/service.typed-bridge.test.js +93 -0
- package/dist/service.typed-bridge.test.js.map +1 -0
- package/dist/ws-client.d.ts +46 -8
- package/dist/ws-client.d.ts.map +1 -1
- package/dist/ws-client.js +63 -15
- package/dist/ws-client.js.map +1 -1
- package/dist/ws-client.test.js +1 -1
- package/dist/ws-client.test.js.map +1 -1
- package/dist/ws-client.typed-bridge.test.d.ts +2 -0
- package/dist/ws-client.typed-bridge.test.d.ts.map +1 -0
- package/dist/ws-client.typed-bridge.test.js +105 -0
- package/dist/ws-client.typed-bridge.test.js.map +1 -0
- package/package.json +3 -3
- package/dist/cli/commands/apps.d.ts +0 -78
- package/dist/cli/commands/apps.d.ts.map +0 -1
- package/dist/cli/commands/apps.js +0 -172
- package/dist/cli/commands/apps.js.map +0 -1
- package/dist/cli/commands/apps.test.d.ts +0 -2
- package/dist/cli/commands/apps.test.d.ts.map +0 -1
- package/dist/cli/commands/apps.test.js +0 -208
- package/dist/cli/commands/apps.test.js.map +0 -1
|
@@ -1,78 +0,0 @@
|
|
|
1
|
-
import { Command } from "@effect/cli";
|
|
2
|
-
import { Effect, Option } from "effect";
|
|
3
|
-
import { type Transport, type TransportError } from "../transport.js";
|
|
4
|
-
/**
|
|
5
|
-
* Error union for the apps subcommand surface. Additional tags must be
|
|
6
|
-
* declared here, not thrown ad-hoc (Principle 3).
|
|
7
|
-
*/
|
|
8
|
-
export type AppsCommandError = TransportError | AppsInputError;
|
|
9
|
-
declare const AppsInputError_base: new <A extends Record<string, any> = {}>(args: import("effect/Types").VoidIfEmpty<{ readonly [P in keyof A as P extends "_tag" ? never : P]: A[P]; }>) => import("effect/Cause").YieldableError & {
|
|
10
|
-
readonly _tag: "AppsInputError";
|
|
11
|
-
} & Readonly<A>;
|
|
12
|
-
/** CLI argument parsing rejected a value (e.g. `--manifest` points to a missing file). */
|
|
13
|
-
export declare class AppsInputError extends AppsInputError_base<{
|
|
14
|
-
readonly message: string;
|
|
15
|
-
readonly reason: string;
|
|
16
|
-
}> {
|
|
17
|
-
}
|
|
18
|
-
/** `moltzap apps register --manifest <file>` — spec §5.3 bullet 1. */
|
|
19
|
-
export interface AppsRegisterArgs {
|
|
20
|
-
readonly manifestPath: string;
|
|
21
|
-
}
|
|
22
|
-
/**
|
|
23
|
-
* `moltzap apps create --app <id> --invite <agentId>...` — spec §5.3 bullet 2.
|
|
24
|
-
* `invitedAgentIds` is `--invite` repeated per Assumption §6.4.
|
|
25
|
-
*/
|
|
26
|
-
export interface AppsCreateArgs {
|
|
27
|
-
readonly appId: string;
|
|
28
|
-
readonly invitedAgentIds: ReadonlyArray<string>;
|
|
29
|
-
}
|
|
30
|
-
/**
|
|
31
|
-
* `moltzap apps list [--app <id>] [--status waiting|active|closed]` —
|
|
32
|
-
* spec §5.3 bullet 3. `status` is a discriminated union so impl and
|
|
33
|
-
* tests branch exhaustively.
|
|
34
|
-
*/
|
|
35
|
-
export interface AppsListArgs {
|
|
36
|
-
readonly appId?: string;
|
|
37
|
-
readonly status?: AppSessionStatus;
|
|
38
|
-
readonly limit?: number;
|
|
39
|
-
}
|
|
40
|
-
/** Mirror of the protocol's `apps/listSessions.params.status` enum. */
|
|
41
|
-
export type AppSessionStatus = "waiting" | "active" | "closed";
|
|
42
|
-
/** `moltzap apps get <sessionId>` — spec §5.3 bullet 4. */
|
|
43
|
-
export interface AppsGetArgs {
|
|
44
|
-
readonly sessionId: string;
|
|
45
|
-
}
|
|
46
|
-
/** `moltzap apps close <sessionId>` — spec §5.3 bullet 5. */
|
|
47
|
-
export interface AppsCloseArgs {
|
|
48
|
-
readonly sessionId: string;
|
|
49
|
-
}
|
|
50
|
-
/** Wraps `apps/register`. Prints the registered app id to stdout. */
|
|
51
|
-
export declare const appsRegisterHandler: (args: AppsRegisterArgs) => Effect.Effect<void, AppsCommandError, Transport>;
|
|
52
|
-
/** Wraps `apps/create`. Prints `session.id` to stdout. */
|
|
53
|
-
export declare const appsCreateHandler: (args: AppsCreateArgs) => Effect.Effect<void, AppsCommandError, Transport>;
|
|
54
|
-
/** Wraps `apps/listSessions`. Emits one session per line. */
|
|
55
|
-
export declare const appsListHandler: (args: AppsListArgs) => Effect.Effect<void, AppsCommandError, Transport>;
|
|
56
|
-
/** Wraps `apps/getSession`. Prints the session record as JSON. */
|
|
57
|
-
export declare const appsGetHandler: (args: AppsGetArgs) => Effect.Effect<void, AppsCommandError, Transport>;
|
|
58
|
-
/** Wraps `apps/closeSession`. Prints the closed session id. */
|
|
59
|
-
export declare const appsCloseHandler: (args: AppsCloseArgs) => Effect.Effect<void, AppsCommandError, Transport>;
|
|
60
|
-
/** `moltzap apps [register|create|list|get|close]` — subcommand group. */
|
|
61
|
-
export declare const appsCommand: Command.Command<"apps", Transport, never, {
|
|
62
|
-
readonly subcommand: Option.Option<{
|
|
63
|
-
readonly manifest: string;
|
|
64
|
-
} | {
|
|
65
|
-
readonly app: string;
|
|
66
|
-
readonly invite: string[];
|
|
67
|
-
} | {
|
|
68
|
-
readonly app: Option.Option<string>;
|
|
69
|
-
readonly status: Option.Option<"active" | "waiting" | "closed">;
|
|
70
|
-
readonly limit: Option.Option<number>;
|
|
71
|
-
} | {
|
|
72
|
-
readonly sessionId: string;
|
|
73
|
-
} | {
|
|
74
|
-
readonly sessionId: string;
|
|
75
|
-
}>;
|
|
76
|
-
}>;
|
|
77
|
-
export {};
|
|
78
|
-
//# sourceMappingURL=apps.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"apps.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/apps.ts"],"names":[],"mappings":"AAqBA,OAAO,EAAQ,OAAO,EAAW,MAAM,aAAa,CAAC;AACrD,OAAO,EAAQ,MAAM,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAC9C,OAAO,EAGL,KAAK,SAAS,EACd,KAAK,cAAc,EACpB,MAAM,iBAAiB,CAAC;AAazB;;;GAGG;AACH,MAAM,MAAM,gBAAgB,GAAG,cAAc,GAAG,cAAc,CAAC;;;;AAE/D,0FAA0F;AAC1F,qBAAa,cAAe,SAAQ,oBAAmC;IACrE,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;CACzB,CAAC;CAAG;AAML,sEAAsE;AACtE,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;CAC/B;AAED;;;GAGG;AACH,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,eAAe,EAAE,aAAa,CAAC,MAAM,CAAC,CAAC;CACjD;AAED;;;;GAIG;AACH,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,MAAM,CAAC,EAAE,gBAAgB,CAAC;IACnC,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;CACzB;AAED,uEAAuE;AACvE,MAAM,MAAM,gBAAgB,GAAG,SAAS,GAAG,QAAQ,GAAG,QAAQ,CAAC;AAE/D,2DAA2D;AAC3D,MAAM,WAAW,WAAW;IAC1B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;CAC5B;AAED,6DAA6D;AAC7D,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;CAC5B;AAID,qEAAqE;AACrE,eAAO,MAAM,mBAAmB,GAC9B,MAAM,gBAAgB,KACrB,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,gBAAgB,EAAE,SAAS,CA2C9C,CAAC;AAEL,0DAA0D;AAC1D,eAAO,MAAM,iBAAiB,GAC5B,MAAM,cAAc,KACnB,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,gBAAgB,EAAE,SAAS,CAS9C,CAAC;AAEL,6DAA6D;AAC7D,eAAO,MAAM,eAAe,GAC1B,MAAM,YAAY,KACjB,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,gBAAgB,EAAE,SAAS,CAa9C,CAAC;AAEL,kEAAkE;AAClE,eAAO,MAAM,cAAc,GACzB,MAAM,WAAW,KAChB,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,gBAAgB,EAAE,SAAS,CAQ9C,CAAC;AAEL,+DAA+D;AAC/D,eAAO,MAAM,gBAAgB,GAC3B,MAAM,aAAa,KAClB,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,gBAAgB,EAAE,SAAS,CAQ9C,CAAC;AAuGL,0EAA0E;AAC1E,eAAO,MAAM,WAAW;;;;;;;;;;;;;;;EAoBvB,CAAC"}
|
|
@@ -1,172 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* `moltzap apps <subcommand>` — handlers for spec sbd#177 rev 3 §5.3.
|
|
3
|
-
*
|
|
4
|
-
* Five subcommands, each a one-to-one wrap of a JSON-RPC method defined in
|
|
5
|
-
* `packages/protocol/src/schema/methods/apps.ts`:
|
|
6
|
-
*
|
|
7
|
-
* apps register → apps/register
|
|
8
|
-
* apps create → apps/create
|
|
9
|
-
* apps list → apps/listSessions
|
|
10
|
-
* apps get → apps/getSession
|
|
11
|
-
* apps close → apps/closeSession
|
|
12
|
-
*
|
|
13
|
-
* Every handler is an Effect requiring the {@link Transport} tag; impl-staff
|
|
14
|
-
* wires each into `Command.make(...)` per the existing `@effect/cli` pattern
|
|
15
|
-
* already used by `commands/conversations.ts` and adds the top-level
|
|
16
|
-
* `appsCommand` to `cli/index.ts`.
|
|
17
|
-
*
|
|
18
|
-
* Invariant §4.6 (exit codes): success ⇒ exit 0, structural output on stdout.
|
|
19
|
-
* RPC errors ⇒ non-zero exit, message on stderr, no silent swallow.
|
|
20
|
-
*/
|
|
21
|
-
import * as fs from "node:fs";
|
|
22
|
-
import { Args, Command, Options } from "@effect/cli";
|
|
23
|
-
import { Data, Effect, Option } from "effect";
|
|
24
|
-
import { rpc, runHandler, } from "../transport.js";
|
|
25
|
-
import { agentId, AppsCloseSession, AppsCreate, AppsGetSession, AppsListSessions, AppsRegister, } from "@moltzap/protocol";
|
|
26
|
-
/** CLI argument parsing rejected a value (e.g. `--manifest` points to a missing file). */
|
|
27
|
-
export class AppsInputError extends Data.TaggedError("AppsInputError") {
|
|
28
|
-
}
|
|
29
|
-
const JSON_INDENT_SPACES = 2;
|
|
30
|
-
// ─── Handlers ──────────────────────────────────────────────────────────────
|
|
31
|
-
/** Wraps `apps/register`. Prints the registered app id to stdout. */
|
|
32
|
-
export const appsRegisterHandler = (args) => Effect.gen(function* () {
|
|
33
|
-
let manifestText;
|
|
34
|
-
try {
|
|
35
|
-
manifestText = fs.readFileSync(args.manifestPath, "utf-8");
|
|
36
|
-
}
|
|
37
|
-
catch (err) {
|
|
38
|
-
const reason = `manifest not readable at ${args.manifestPath}: ${err instanceof Error ? err.message : String(err)}`;
|
|
39
|
-
return yield* Effect.fail(new AppsInputError({
|
|
40
|
-
message: reason,
|
|
41
|
-
reason,
|
|
42
|
-
}));
|
|
43
|
-
}
|
|
44
|
-
let manifest;
|
|
45
|
-
try {
|
|
46
|
-
manifest = JSON.parse(manifestText);
|
|
47
|
-
}
|
|
48
|
-
catch (err) {
|
|
49
|
-
const reason = `manifest at ${args.manifestPath} is not valid JSON: ${err instanceof Error ? err.message : String(err)}`;
|
|
50
|
-
return yield* Effect.fail(new AppsInputError({
|
|
51
|
-
message: reason,
|
|
52
|
-
reason,
|
|
53
|
-
}));
|
|
54
|
-
}
|
|
55
|
-
const params = { manifest };
|
|
56
|
-
if (!AppsRegister.validateParams(params)) {
|
|
57
|
-
return yield* Effect.fail(new AppsInputError({
|
|
58
|
-
message: `manifest at ${args.manifestPath} does not match the app manifest schema`,
|
|
59
|
-
reason: "invalid app manifest",
|
|
60
|
-
}));
|
|
61
|
-
}
|
|
62
|
-
const result = yield* rpc(AppsRegister, params);
|
|
63
|
-
yield* Effect.sync(() => {
|
|
64
|
-
console.log(result.appId);
|
|
65
|
-
});
|
|
66
|
-
});
|
|
67
|
-
/** Wraps `apps/create`. Prints `session.id` to stdout. */
|
|
68
|
-
export const appsCreateHandler = (args) => Effect.gen(function* () {
|
|
69
|
-
const result = yield* rpc(AppsCreate, {
|
|
70
|
-
appId: args.appId,
|
|
71
|
-
invitedAgentIds: args.invitedAgentIds.map(agentId),
|
|
72
|
-
});
|
|
73
|
-
yield* Effect.sync(() => {
|
|
74
|
-
console.log(result.session.id);
|
|
75
|
-
});
|
|
76
|
-
});
|
|
77
|
-
/** Wraps `apps/listSessions`. Emits one session per line. */
|
|
78
|
-
export const appsListHandler = (args) => Effect.gen(function* () {
|
|
79
|
-
const params = {
|
|
80
|
-
...(args.appId !== undefined ? { appId: args.appId } : {}),
|
|
81
|
-
...(args.status !== undefined ? { status: args.status } : {}),
|
|
82
|
-
...(args.limit !== undefined ? { limit: args.limit } : {}),
|
|
83
|
-
};
|
|
84
|
-
const result = yield* rpc(AppsListSessions, params);
|
|
85
|
-
yield* Effect.sync(() => {
|
|
86
|
-
for (const s of result.sessions) {
|
|
87
|
-
console.log(`${s.id}\t${s.appId}\t${s.status}`);
|
|
88
|
-
}
|
|
89
|
-
});
|
|
90
|
-
});
|
|
91
|
-
/** Wraps `apps/getSession`. Prints the session record as JSON. */
|
|
92
|
-
export const appsGetHandler = (args) => Effect.gen(function* () {
|
|
93
|
-
const result = yield* rpc(AppsGetSession, {
|
|
94
|
-
sessionId: args.sessionId,
|
|
95
|
-
});
|
|
96
|
-
yield* Effect.sync(() => {
|
|
97
|
-
console.log(JSON.stringify(result.session, null, JSON_INDENT_SPACES));
|
|
98
|
-
});
|
|
99
|
-
});
|
|
100
|
-
/** Wraps `apps/closeSession`. Prints the closed session id. */
|
|
101
|
-
export const appsCloseHandler = (args) => Effect.gen(function* () {
|
|
102
|
-
yield* rpc(AppsCloseSession, {
|
|
103
|
-
sessionId: args.sessionId,
|
|
104
|
-
});
|
|
105
|
-
yield* Effect.sync(() => {
|
|
106
|
-
console.log(args.sessionId);
|
|
107
|
-
});
|
|
108
|
-
});
|
|
109
|
-
// ─── CLI commands ──────────────────────────────────────────────────────────
|
|
110
|
-
const manifestOption = Options.file("manifest").pipe(Options.withDescription("App manifest file"));
|
|
111
|
-
const appsRegisterCommand = Command.make("register", { manifest: manifestOption }, ({ manifest }) => runHandler(appsRegisterHandler({ manifestPath: manifest }))).pipe(Command.withDescription("Register an app via apps/register"));
|
|
112
|
-
const appOption = Options.text("app").pipe(Options.withDescription("App id — matches the `appId` field in the manifest previously " +
|
|
113
|
-
"submitted via `moltzap apps register --manifest ...`."));
|
|
114
|
-
const inviteOption = Options.text("invite").pipe(Options.withDescription("Invited agent id (UUID, not the friendly agent-name). " +
|
|
115
|
-
"Get it from the `Agent ID:` line printed by `moltzap register` or " +
|
|
116
|
-
"from `moltzap whoami` on the peer's host. Repeat the flag to invite " +
|
|
117
|
-
"multiple agents: --invite <uuid1> --invite <uuid2>."), Options.repeated);
|
|
118
|
-
/**
|
|
119
|
-
* `moltzap apps create --app <appId> --invite <agentId>...`
|
|
120
|
-
*
|
|
121
|
-
* Initiator is the CALLER: whichever identity the transport layer resolves
|
|
122
|
-
* from the global `--as` / `--profile` flags (or the default profile when
|
|
123
|
-
* neither is given) becomes `initiatorAgentId` on the server side — see
|
|
124
|
-
* `apps/create` handler at packages/server/src/app/handlers/apps.handlers.ts
|
|
125
|
-
* (uses `ctx.agentId`). The initiator is NOT passed as a CLI argument and
|
|
126
|
-
* does NOT appear in `--invite`.
|
|
127
|
-
*
|
|
128
|
-
* Typical multi-agent flow:
|
|
129
|
-
* # as the initiator (e.g. alice):
|
|
130
|
-
* moltzap --profile alice apps create --app myapp \
|
|
131
|
-
* --invite $BOB_AGENT_ID --invite $CAROL_AGENT_ID
|
|
132
|
-
*
|
|
133
|
-
* Prints the new session id to stdout (one line) on success.
|
|
134
|
-
*/
|
|
135
|
-
const appsCreateCommand = Command.make("create", { app: appOption, invite: inviteOption }, ({ app, invite }) => runHandler(appsCreateHandler({ appId: app, invitedAgentIds: invite }))).pipe(Command.withDescription("Create a new app session. Caller becomes the initiator; --invite " +
|
|
136
|
-
"takes an agent id (UUID) and is repeatable."));
|
|
137
|
-
const appFilterOption = Options.text("app").pipe(Options.withDescription("Filter by app id"), Options.optional);
|
|
138
|
-
const statusOption = Options.choice("status", [
|
|
139
|
-
"waiting",
|
|
140
|
-
"active",
|
|
141
|
-
"closed",
|
|
142
|
-
]).pipe(Options.optional);
|
|
143
|
-
const limitOption = Options.integer("limit").pipe(Options.optional);
|
|
144
|
-
const appsListCommand = Command.make("list", {
|
|
145
|
-
app: appFilterOption,
|
|
146
|
-
status: statusOption,
|
|
147
|
-
limit: limitOption,
|
|
148
|
-
}, ({ app, status, limit }) => {
|
|
149
|
-
const args = {
|
|
150
|
-
...(Option.isSome(app) ? { appId: app.value } : {}),
|
|
151
|
-
...(Option.isSome(status) ? { status: status.value } : {}),
|
|
152
|
-
...(Option.isSome(limit) ? { limit: limit.value } : {}),
|
|
153
|
-
};
|
|
154
|
-
return runHandler(appsListHandler(args));
|
|
155
|
-
}).pipe(Command.withDescription("List app sessions"));
|
|
156
|
-
const sessionIdArg = Args.text({ name: "sessionId" }).pipe(Args.withDescription("Session id"));
|
|
157
|
-
const appsGetCommand = Command.make("get", { sessionId: sessionIdArg }, ({ sessionId }) => runHandler(appsGetHandler({ sessionId }))).pipe(Command.withDescription("Get an app session as JSON"));
|
|
158
|
-
const appsCloseCommand = Command.make("close", { sessionId: sessionIdArg }, ({ sessionId }) => runHandler(appsCloseHandler({ sessionId }))).pipe(Command.withDescription("Close an app session"));
|
|
159
|
-
/** `moltzap apps [register|create|list|get|close]` — subcommand group. */
|
|
160
|
-
export const appsCommand = Command.make("apps", {}, () => Effect.sync(() => {
|
|
161
|
-
console.log("Usage: moltzap apps <register|create|list|get|close> [options]");
|
|
162
|
-
})).pipe(Command.withDescription("Manage MoltZap apps and sessions. Every subcommand runs as the " +
|
|
163
|
-
"identity selected by the global --as / --profile flags (see " +
|
|
164
|
-
"`moltzap --help`); in particular `apps create` makes the caller " +
|
|
165
|
-
"the session initiator."), Command.withSubcommands([
|
|
166
|
-
appsRegisterCommand,
|
|
167
|
-
appsCreateCommand,
|
|
168
|
-
appsListCommand,
|
|
169
|
-
appsGetCommand,
|
|
170
|
-
appsCloseCommand,
|
|
171
|
-
]));
|
|
172
|
-
//# sourceMappingURL=apps.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"apps.js","sourceRoot":"","sources":["../../../src/cli/commands/apps.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"apps.test.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/apps.test.ts"],"names":[],"mappings":""}
|
|
@@ -1,208 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Unit tests for `moltzap apps <subcommand>` handlers. Provides a fake
|
|
3
|
-
* `Transport` via `Effect.provideService(Transport, fake)`; asserts on
|
|
4
|
-
* (method, params) tuples recorded by the fake.
|
|
5
|
-
*
|
|
6
|
-
* Spec test-coverage floor (sbd#177 §"Cross-cutting acceptance floors"):
|
|
7
|
-
* at least one success path and one RPC-failure path per handler.
|
|
8
|
-
*/
|
|
9
|
-
import { mkdtempSync, rmSync, writeFileSync } from "node:fs";
|
|
10
|
-
import { tmpdir } from "node:os";
|
|
11
|
-
import { join } from "node:path";
|
|
12
|
-
import { Effect } from "effect";
|
|
13
|
-
import { afterEach, beforeEach, describe, expect, it, vi, } from "vitest";
|
|
14
|
-
import { appsCloseHandler, appsCreateHandler, appsGetHandler, appsListHandler, appsRegisterHandler, } from "./apps.js";
|
|
15
|
-
import { Transport } from "../transport.js";
|
|
16
|
-
import { makeFakeTransport } from "./test-transport.js";
|
|
17
|
-
import { AppsCloseSession, AppsCreate, AppsGetSession, AppsListSessions, AppsRegister, } from "@moltzap/protocol";
|
|
18
|
-
describe("apps register", () => {
|
|
19
|
-
let tmp;
|
|
20
|
-
let stdout;
|
|
21
|
-
let stderr;
|
|
22
|
-
beforeEach(() => {
|
|
23
|
-
tmp = mkdtempSync(join(tmpdir(), "moltzap-apps-"));
|
|
24
|
-
stdout = vi.spyOn(console, "log").mockImplementation(() => { });
|
|
25
|
-
stderr = vi.spyOn(console, "error").mockImplementation(() => { });
|
|
26
|
-
});
|
|
27
|
-
afterEach(() => {
|
|
28
|
-
rmSync(tmp, { recursive: true, force: true });
|
|
29
|
-
stdout.mockRestore();
|
|
30
|
-
stderr.mockRestore();
|
|
31
|
-
});
|
|
32
|
-
it("calls apps/register with the manifest body and prints appId", async () => {
|
|
33
|
-
const manifestPath = join(tmp, "m.json");
|
|
34
|
-
const manifest = {
|
|
35
|
-
appId: "demo-app",
|
|
36
|
-
name: "Demo App",
|
|
37
|
-
conversations: [
|
|
38
|
-
{ key: "main", name: "Main", participantFilter: "all" },
|
|
39
|
-
],
|
|
40
|
-
};
|
|
41
|
-
writeFileSync(manifestPath, JSON.stringify(manifest));
|
|
42
|
-
const { calls, transport } = makeFakeTransport(() => ({
|
|
43
|
-
appId: "app-xyz",
|
|
44
|
-
}));
|
|
45
|
-
await Effect.runPromise(appsRegisterHandler({ manifestPath }).pipe(Effect.provideService(Transport, transport)));
|
|
46
|
-
expect(calls).toEqual([
|
|
47
|
-
{ method: AppsRegister.name, params: { manifest } },
|
|
48
|
-
]);
|
|
49
|
-
expect(stdout).toHaveBeenCalledWith("app-xyz");
|
|
50
|
-
});
|
|
51
|
-
it("rejects a missing manifest file with AppsInputError", async () => {
|
|
52
|
-
const { transport } = makeFakeTransport(() => ({ appId: "never" }));
|
|
53
|
-
const result = await Effect.runPromiseExit(appsRegisterHandler({ manifestPath: join(tmp, "missing.json") }).pipe(Effect.provideService(Transport, transport)));
|
|
54
|
-
expect(result._tag).toBe("Failure");
|
|
55
|
-
if (result._tag === "Failure") {
|
|
56
|
-
// Effect failure cause wraps the AppsInputError.
|
|
57
|
-
const s = JSON.stringify(result.cause);
|
|
58
|
-
expect(s).toMatch(/AppsInputError/);
|
|
59
|
-
}
|
|
60
|
-
});
|
|
61
|
-
it("surfaces TransportRpcError as a failure", async () => {
|
|
62
|
-
const manifestPath = join(tmp, "m.json");
|
|
63
|
-
writeFileSync(manifestPath, JSON.stringify({}));
|
|
64
|
-
const { transport } = makeFakeTransport(() => new Error("invalid manifest"));
|
|
65
|
-
const result = await Effect.runPromiseExit(appsRegisterHandler({ manifestPath }).pipe(Effect.provideService(Transport, transport)));
|
|
66
|
-
expect(result._tag).toBe("Failure");
|
|
67
|
-
});
|
|
68
|
-
});
|
|
69
|
-
describe("apps create", () => {
|
|
70
|
-
let stdout;
|
|
71
|
-
beforeEach(() => {
|
|
72
|
-
stdout = vi.spyOn(console, "log").mockImplementation(() => { });
|
|
73
|
-
});
|
|
74
|
-
afterEach(() => stdout.mockRestore());
|
|
75
|
-
it("calls apps/create with appId and invitedAgentIds and prints session.id", async () => {
|
|
76
|
-
const SESS_ID = "00000000-0000-4000-8000-0000000005e5";
|
|
77
|
-
const AGENT_A = "00000000-0000-4000-8000-00000000000a";
|
|
78
|
-
const AGENT_B = "00000000-0000-4000-8000-00000000000b";
|
|
79
|
-
const INITIATOR = "00000000-0000-4000-8000-000000001717";
|
|
80
|
-
const CONV_MAIN = "00000000-0000-4000-8000-000000000c01";
|
|
81
|
-
const { calls, transport } = makeFakeTransport(() => ({
|
|
82
|
-
session: {
|
|
83
|
-
id: SESS_ID,
|
|
84
|
-
appId: "app-1",
|
|
85
|
-
initiatorAgentId: INITIATOR,
|
|
86
|
-
status: "active",
|
|
87
|
-
conversations: { main: CONV_MAIN },
|
|
88
|
-
createdAt: "2026-05-04T00:00:00.000Z",
|
|
89
|
-
},
|
|
90
|
-
}));
|
|
91
|
-
await Effect.runPromise(appsCreateHandler({
|
|
92
|
-
appId: "app-1",
|
|
93
|
-
invitedAgentIds: [AGENT_A, AGENT_B],
|
|
94
|
-
}).pipe(Effect.provideService(Transport, transport)));
|
|
95
|
-
expect(calls).toEqual([
|
|
96
|
-
{
|
|
97
|
-
method: AppsCreate.name,
|
|
98
|
-
params: { appId: "app-1", invitedAgentIds: [AGENT_A, AGENT_B] },
|
|
99
|
-
},
|
|
100
|
-
]);
|
|
101
|
-
expect(stdout).toHaveBeenCalledWith(SESS_ID);
|
|
102
|
-
});
|
|
103
|
-
it("surfaces TransportRpcError", async () => {
|
|
104
|
-
const { transport } = makeFakeTransport(() => new Error("nope"));
|
|
105
|
-
const result = await Effect.runPromiseExit(appsCreateHandler({ appId: "app-1", invitedAgentIds: [] }).pipe(Effect.provideService(Transport, transport)));
|
|
106
|
-
expect(result._tag).toBe("Failure");
|
|
107
|
-
});
|
|
108
|
-
});
|
|
109
|
-
describe("apps list", () => {
|
|
110
|
-
let stdout;
|
|
111
|
-
beforeEach(() => {
|
|
112
|
-
stdout = vi.spyOn(console, "log").mockImplementation(() => { });
|
|
113
|
-
});
|
|
114
|
-
afterEach(() => stdout.mockRestore());
|
|
115
|
-
it("calls apps/listSessions with optional filters and prints one per line", async () => {
|
|
116
|
-
const SESS_1 = "00000000-0000-4000-8000-000000000501";
|
|
117
|
-
const SESS_2 = "00000000-0000-4000-8000-000000000502";
|
|
118
|
-
const INITIATOR = "00000000-0000-4000-8000-000000001717";
|
|
119
|
-
const CONV_MAIN = "00000000-0000-4000-8000-000000000c01";
|
|
120
|
-
const baseSession = {
|
|
121
|
-
appId: "app-1",
|
|
122
|
-
initiatorAgentId: INITIATOR,
|
|
123
|
-
conversations: { main: CONV_MAIN },
|
|
124
|
-
createdAt: "2026-05-04T00:00:00.000Z",
|
|
125
|
-
};
|
|
126
|
-
const { calls, transport } = makeFakeTransport(() => ({
|
|
127
|
-
sessions: [
|
|
128
|
-
{ ...baseSession, id: SESS_1, status: "active" },
|
|
129
|
-
{ ...baseSession, id: SESS_2, status: "closed" },
|
|
130
|
-
],
|
|
131
|
-
}));
|
|
132
|
-
await Effect.runPromise(appsListHandler({ appId: "app-1", status: "active", limit: 10 }).pipe(Effect.provideService(Transport, transport)));
|
|
133
|
-
expect(calls).toEqual([
|
|
134
|
-
{
|
|
135
|
-
method: AppsListSessions.name,
|
|
136
|
-
params: { appId: "app-1", status: "active", limit: 10 },
|
|
137
|
-
},
|
|
138
|
-
]);
|
|
139
|
-
expect(stdout).toHaveBeenCalledTimes(2);
|
|
140
|
-
});
|
|
141
|
-
it("omits absent filters from the params object", async () => {
|
|
142
|
-
const { calls, transport } = makeFakeTransport(() => ({ sessions: [] }));
|
|
143
|
-
await Effect.runPromise(appsListHandler({}).pipe(Effect.provideService(Transport, transport)));
|
|
144
|
-
expect(calls[0]?.params).toEqual({});
|
|
145
|
-
});
|
|
146
|
-
it("surfaces TransportRpcError", async () => {
|
|
147
|
-
const { transport } = makeFakeTransport(() => new Error("boom"));
|
|
148
|
-
const result = await Effect.runPromiseExit(appsListHandler({}).pipe(Effect.provideService(Transport, transport)));
|
|
149
|
-
expect(result._tag).toBe("Failure");
|
|
150
|
-
});
|
|
151
|
-
});
|
|
152
|
-
describe("apps get", () => {
|
|
153
|
-
let stdout;
|
|
154
|
-
beforeEach(() => {
|
|
155
|
-
stdout = vi.spyOn(console, "log").mockImplementation(() => { });
|
|
156
|
-
});
|
|
157
|
-
afterEach(() => stdout.mockRestore());
|
|
158
|
-
it("calls apps/getSession and prints session as JSON", async () => {
|
|
159
|
-
const SESS_1 = "00000000-0000-4000-8000-000000000501";
|
|
160
|
-
const INITIATOR = "00000000-0000-4000-8000-000000001717";
|
|
161
|
-
const CONV_MAIN = "00000000-0000-4000-8000-000000000c01";
|
|
162
|
-
const sessionObj = {
|
|
163
|
-
id: SESS_1,
|
|
164
|
-
appId: "app-1",
|
|
165
|
-
initiatorAgentId: INITIATOR,
|
|
166
|
-
status: "active",
|
|
167
|
-
conversations: { main: CONV_MAIN },
|
|
168
|
-
createdAt: "2026-05-04T00:00:00.000Z",
|
|
169
|
-
};
|
|
170
|
-
const { calls, transport } = makeFakeTransport(() => ({
|
|
171
|
-
session: sessionObj,
|
|
172
|
-
}));
|
|
173
|
-
await Effect.runPromise(appsGetHandler({ sessionId: SESS_1 }).pipe(Effect.provideService(Transport, transport)));
|
|
174
|
-
expect(calls[0]).toEqual({
|
|
175
|
-
method: AppsGetSession.name,
|
|
176
|
-
params: { sessionId: SESS_1 },
|
|
177
|
-
});
|
|
178
|
-
expect(stdout).toHaveBeenCalledWith(JSON.stringify(sessionObj, null, 2));
|
|
179
|
-
});
|
|
180
|
-
it("surfaces TransportRpcError", async () => {
|
|
181
|
-
const { transport } = makeFakeTransport(() => new Error("404"));
|
|
182
|
-
const result = await Effect.runPromiseExit(appsGetHandler({ sessionId: "s1" }).pipe(Effect.provideService(Transport, transport)));
|
|
183
|
-
expect(result._tag).toBe("Failure");
|
|
184
|
-
});
|
|
185
|
-
});
|
|
186
|
-
describe("apps close", () => {
|
|
187
|
-
let stdout;
|
|
188
|
-
beforeEach(() => {
|
|
189
|
-
stdout = vi.spyOn(console, "log").mockImplementation(() => { });
|
|
190
|
-
});
|
|
191
|
-
afterEach(() => stdout.mockRestore());
|
|
192
|
-
const SESS_42 = "00000000-0000-4000-8000-000000000042";
|
|
193
|
-
it("calls apps/closeSession and prints the closed session id", async () => {
|
|
194
|
-
const { calls, transport } = makeFakeTransport(() => ({ closed: true }));
|
|
195
|
-
await Effect.runPromise(appsCloseHandler({ sessionId: SESS_42 }).pipe(Effect.provideService(Transport, transport)));
|
|
196
|
-
expect(calls[0]).toEqual({
|
|
197
|
-
method: AppsCloseSession.name,
|
|
198
|
-
params: { sessionId: SESS_42 },
|
|
199
|
-
});
|
|
200
|
-
expect(stdout).toHaveBeenCalledWith(SESS_42);
|
|
201
|
-
});
|
|
202
|
-
it("surfaces TransportRpcError", async () => {
|
|
203
|
-
const { transport } = makeFakeTransport(() => new Error("nope"));
|
|
204
|
-
const result = await Effect.runPromiseExit(appsCloseHandler({ sessionId: SESS_42 }).pipe(Effect.provideService(Transport, transport)));
|
|
205
|
-
expect(result._tag).toBe("Failure");
|
|
206
|
-
});
|
|
207
|
-
});
|
|
208
|
-
//# sourceMappingURL=apps.test.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"apps.test.js","sourceRoot":"","sources":["../../../src/cli/commands/apps.test.ts"],"names":[],"mappings":"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"}
|