@moltzap/client 2026.407.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (94) hide show
  1. package/LICENSE +21 -0
  2. package/dist/__tests__/service.integration.test.d.ts +2 -0
  3. package/dist/__tests__/service.integration.test.d.ts.map +1 -0
  4. package/dist/__tests__/service.integration.test.js +999 -0
  5. package/dist/__tests__/service.integration.test.js.map +1 -0
  6. package/dist/cli/commands/agents.d.ts +3 -0
  7. package/dist/cli/commands/agents.d.ts.map +1 -0
  8. package/dist/cli/commands/agents.js +42 -0
  9. package/dist/cli/commands/agents.js.map +1 -0
  10. package/dist/cli/commands/contacts.d.ts +3 -0
  11. package/dist/cli/commands/contacts.d.ts.map +1 -0
  12. package/dist/cli/commands/contacts.js +67 -0
  13. package/dist/cli/commands/contacts.js.map +1 -0
  14. package/dist/cli/commands/conversations.d.ts +4 -0
  15. package/dist/cli/commands/conversations.d.ts.map +1 -0
  16. package/dist/cli/commands/conversations.js +157 -0
  17. package/dist/cli/commands/conversations.js.map +1 -0
  18. package/dist/cli/commands/delete.d.ts +3 -0
  19. package/dist/cli/commands/delete.d.ts.map +1 -0
  20. package/dist/cli/commands/delete.js +10 -0
  21. package/dist/cli/commands/delete.js.map +1 -0
  22. package/dist/cli/commands/invite.d.ts +3 -0
  23. package/dist/cli/commands/invite.d.ts.map +1 -0
  24. package/dist/cli/commands/invite.js +9 -0
  25. package/dist/cli/commands/invite.js.map +1 -0
  26. package/dist/cli/commands/ping.d.ts +3 -0
  27. package/dist/cli/commands/ping.d.ts.map +1 -0
  28. package/dist/cli/commands/ping.js +23 -0
  29. package/dist/cli/commands/ping.js.map +1 -0
  30. package/dist/cli/commands/presence.d.ts +3 -0
  31. package/dist/cli/commands/presence.d.ts.map +1 -0
  32. package/dist/cli/commands/presence.js +19 -0
  33. package/dist/cli/commands/presence.js.map +1 -0
  34. package/dist/cli/commands/react.d.ts +3 -0
  35. package/dist/cli/commands/react.d.ts.map +1 -0
  36. package/dist/cli/commands/react.js +18 -0
  37. package/dist/cli/commands/react.js.map +1 -0
  38. package/dist/cli/commands/register.d.ts +3 -0
  39. package/dist/cli/commands/register.d.ts.map +1 -0
  40. package/dist/cli/commands/register.js +67 -0
  41. package/dist/cli/commands/register.js.map +1 -0
  42. package/dist/cli/commands/register.test.d.ts +2 -0
  43. package/dist/cli/commands/register.test.d.ts.map +1 -0
  44. package/dist/cli/commands/register.test.js +49 -0
  45. package/dist/cli/commands/register.test.js.map +1 -0
  46. package/dist/cli/commands/send.d.ts +3 -0
  47. package/dist/cli/commands/send.d.ts.map +1 -0
  48. package/dist/cli/commands/send.js +23 -0
  49. package/dist/cli/commands/send.js.map +1 -0
  50. package/dist/cli/commands/send.test.d.ts +2 -0
  51. package/dist/cli/commands/send.test.d.ts.map +1 -0
  52. package/dist/cli/commands/send.test.js +56 -0
  53. package/dist/cli/commands/send.test.js.map +1 -0
  54. package/dist/cli/commands/status.d.ts +3 -0
  55. package/dist/cli/commands/status.d.ts.map +1 -0
  56. package/dist/cli/commands/status.js +11 -0
  57. package/dist/cli/commands/status.js.map +1 -0
  58. package/dist/cli/commands/whoami.d.ts +3 -0
  59. package/dist/cli/commands/whoami.d.ts.map +1 -0
  60. package/dist/cli/commands/whoami.js +18 -0
  61. package/dist/cli/commands/whoami.js.map +1 -0
  62. package/dist/cli/config.d.ts +16 -0
  63. package/dist/cli/config.d.ts.map +1 -0
  64. package/dist/cli/config.js +48 -0
  65. package/dist/cli/config.js.map +1 -0
  66. package/dist/cli/config.test.d.ts +2 -0
  67. package/dist/cli/config.test.d.ts.map +1 -0
  68. package/dist/cli/config.test.js +49 -0
  69. package/dist/cli/config.test.js.map +1 -0
  70. package/dist/cli/http-client.d.ts +3 -0
  71. package/dist/cli/http-client.d.ts.map +1 -0
  72. package/dist/cli/http-client.js +28 -0
  73. package/dist/cli/http-client.js.map +1 -0
  74. package/dist/cli/index.d.ts +3 -0
  75. package/dist/cli/index.d.ts.map +1 -0
  76. package/dist/cli/index.js +37 -0
  77. package/dist/cli/index.js.map +1 -0
  78. package/dist/cli/socket-client.d.ts +18 -0
  79. package/dist/cli/socket-client.d.ts.map +1 -0
  80. package/dist/cli/socket-client.js +98 -0
  81. package/dist/cli/socket-client.js.map +1 -0
  82. package/dist/index.d.ts +3 -0
  83. package/dist/index.d.ts.map +1 -0
  84. package/dist/index.js +3 -0
  85. package/dist/index.js.map +1 -0
  86. package/dist/service.d.ts +91 -0
  87. package/dist/service.d.ts.map +1 -0
  88. package/dist/service.js +423 -0
  89. package/dist/service.js.map +1 -0
  90. package/dist/ws-client.d.ts +41 -0
  91. package/dist/ws-client.d.ts.map +1 -0
  92. package/dist/ws-client.js +138 -0
  93. package/dist/ws-client.js.map +1 -0
  94. package/package.json +44 -0
@@ -0,0 +1,98 @@
1
+ import * as net from "node:net";
2
+ import * as fs from "node:fs";
3
+ import { MoltZapService } from "../service.js";
4
+ /**
5
+ * Send a request to the MoltZapService via Unix socket and return the result.
6
+ * Throws if the service is not running or the request fails.
7
+ */
8
+ export async function request(method, params, socketPath) {
9
+ const sockPath = socketPath ?? MoltZapService.SOCKET_PATH;
10
+ return new Promise((resolve, reject) => {
11
+ const conn = net.createConnection(sockPath);
12
+ let buffer = "";
13
+ let settled = false;
14
+ const timer = setTimeout(() => {
15
+ if (settled)
16
+ return;
17
+ settled = true;
18
+ conn.destroy();
19
+ reject(new Error("Socket request timed out"));
20
+ }, 10_000);
21
+ conn.on("connect", () => {
22
+ conn.write(JSON.stringify({ method, params }) + "\n");
23
+ });
24
+ conn.on("data", (chunk) => {
25
+ buffer += chunk.toString();
26
+ const idx = buffer.indexOf("\n");
27
+ if (idx !== -1) {
28
+ const line = buffer.slice(0, idx);
29
+ conn.end();
30
+ clearTimeout(timer);
31
+ if (settled)
32
+ return;
33
+ settled = true;
34
+ try {
35
+ const response = JSON.parse(line);
36
+ if (response.error) {
37
+ reject(new Error(response.error));
38
+ }
39
+ else {
40
+ resolve(response.result);
41
+ }
42
+ }
43
+ catch {
44
+ reject(new Error("Malformed response from service"));
45
+ }
46
+ }
47
+ });
48
+ conn.on("error", (err) => {
49
+ clearTimeout(timer);
50
+ if (settled)
51
+ return;
52
+ settled = true;
53
+ const code = err.code;
54
+ if (code === "ENOENT" || code === "ECONNREFUSED") {
55
+ reject(new Error("MoltZap service is not running. Start the OpenClaw channel plugin first."));
56
+ }
57
+ else {
58
+ reject(err);
59
+ }
60
+ });
61
+ });
62
+ }
63
+ /**
64
+ * Wrap a Commander action to catch errors and exit cleanly.
65
+ * Commander's .action() accepts (...args: any[]) => void, so the
66
+ * generic signature here just preserves the caller's argument types.
67
+ */
68
+ export function action(fn) {
69
+ return (...args) => {
70
+ fn(...args).catch((err) => {
71
+ console.error(`Failed: ${err instanceof Error ? err.message : String(err)}`);
72
+ process.exit(1);
73
+ });
74
+ };
75
+ }
76
+ const UUID_RE = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;
77
+ /** Resolve "agent:name" or "agent:<uuid>" to { type, id }. */
78
+ export async function resolveParticipant(raw) {
79
+ const colon = raw.indexOf(":");
80
+ if (colon === -1)
81
+ throw new Error(`Invalid: "${raw}". Use agent:name`);
82
+ const type = raw.slice(0, colon);
83
+ const value = raw.slice(colon + 1);
84
+ if (UUID_RE.test(value))
85
+ return { type, id: value };
86
+ if (type !== "agent")
87
+ throw new Error(`Cannot resolve "${raw}"`);
88
+ const result = (await request("agents/lookupByName", {
89
+ names: [value],
90
+ }));
91
+ if (result.agents.length === 0)
92
+ throw new Error(`Agent "${value}" not found`);
93
+ return { type: "agent", id: result.agents[0].id };
94
+ }
95
+ export function isServiceRunning() {
96
+ return fs.existsSync(MoltZapService.SOCKET_PATH);
97
+ }
98
+ //# sourceMappingURL=socket-client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"socket-client.js","sourceRoot":"","sources":["../../src/cli/socket-client.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ export { MoltZapService, type ConversationMeta, type ContextOptions, type ServiceOptions, } from "./service.js";
2
+ export { MoltZapWsClient, type WsClientLogger, type MoltZapWsClientOptions, } from "./ws-client.js";
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,cAAc,EACd,KAAK,gBAAgB,EACrB,KAAK,cAAc,EACnB,KAAK,cAAc,GACpB,MAAM,cAAc,CAAC;AACtB,OAAO,EACL,eAAe,EACf,KAAK,cAAc,EACnB,KAAK,sBAAsB,GAC5B,MAAM,gBAAgB,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,3 @@
1
+ export { MoltZapService, } from "./service.js";
2
+ export { MoltZapWsClient, } from "./ws-client.js";
3
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,cAAc,GAIf,MAAM,cAAc,CAAC;AACtB,OAAO,EACL,eAAe,GAGhB,MAAM,gBAAgB,CAAC"}
@@ -0,0 +1,91 @@
1
+ import { type EventFrame, type Message } from "@moltzap/protocol";
2
+ import { type WsClientLogger } from "./ws-client.js";
3
+ export interface ConversationMeta {
4
+ id: string;
5
+ type: string;
6
+ name?: string;
7
+ participants: string[];
8
+ }
9
+ export interface ContextOptions {
10
+ type: "cross-conversation";
11
+ maxConversations?: number;
12
+ maxMessagesPerConv?: number;
13
+ }
14
+ export interface ServiceOptions {
15
+ serverUrl: string;
16
+ agentKey: string;
17
+ logger?: WsClientLogger;
18
+ }
19
+ type EventHandler<T> = (data: T) => void;
20
+ interface HelloOk {
21
+ agentId: string;
22
+ conversations?: Array<{
23
+ id: string;
24
+ type: string;
25
+ name?: string;
26
+ participants?: Array<{
27
+ type: string;
28
+ id: string;
29
+ }>;
30
+ }>;
31
+ unreadCounts?: Record<string, number>;
32
+ }
33
+ /**
34
+ * Stateful MoltZap client that manages connection, conversation tracking,
35
+ * agent name resolution, and cross-conversation context generation.
36
+ */
37
+ export declare class MoltZapService {
38
+ private opts;
39
+ private client;
40
+ private _connected;
41
+ private conversations;
42
+ private messages;
43
+ private agentNames;
44
+ private lastNotified;
45
+ private lastRead;
46
+ private messageHandlers;
47
+ private rawEventHandlers;
48
+ private disconnectHandlers;
49
+ private reconnectHandlers;
50
+ private pendingNameLookups;
51
+ ownAgentId: string | undefined;
52
+ constructor(opts: ServiceOptions);
53
+ get connected(): boolean;
54
+ connect(): Promise<HelloOk>;
55
+ close(): void;
56
+ private socketServer;
57
+ private activeSocketPath;
58
+ /** Default socket path for CLI discovery. Per-instance path uses agentId. */
59
+ static readonly SOCKET_PATH: string;
60
+ /** Per-instance socket path based on connected agentId. */
61
+ get socketPath(): string;
62
+ startSocketServer(): void;
63
+ stopSocketServer(): void;
64
+ private handleSocketLine;
65
+ private handleSocketRequest;
66
+ getConversation(convId: string): ConversationMeta | undefined;
67
+ getConversations(): ConversationMeta[];
68
+ getHistory(convId: string, limit?: number): Message[];
69
+ getAgentName(agentId: string): string | undefined;
70
+ resolveAgentName(agentId: string): Promise<string>;
71
+ send(convId: string, text: string, opts?: {
72
+ replyTo?: string;
73
+ }): Promise<void>;
74
+ /**
75
+ * Generate a system reminder with updates from other conversations.
76
+ * Each conversation has its own view of what's "new" — markers are tracked
77
+ * per viewing conversation and advanced after notification.
78
+ */
79
+ getContext(currentConvId: string, opts?: ContextOptions): string | null;
80
+ on(event: "message", handler: EventHandler<Message>): void;
81
+ on(event: "rawEvent", handler: EventHandler<EventFrame>): void;
82
+ on(event: "disconnect", handler: EventHandler<void>): void;
83
+ on(event: "reconnect", handler: EventHandler<HelloOk>): void;
84
+ sendRpc(method: string, params?: unknown): Promise<unknown>;
85
+ private populateFromHello;
86
+ private handleEvent;
87
+ private storeMessage;
88
+ private resolveSenderLabel;
89
+ }
90
+ export {};
91
+ //# sourceMappingURL=service.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"service.d.ts","sourceRoot":"","sources":["../src/service.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,423 @@
1
+ import * as net from "node:net";
2
+ import * as fs from "node:fs";
3
+ import * as path from "node:path";
4
+ import * as os from "node:os";
5
+ import { EventNames, } from "@moltzap/protocol";
6
+ import { MoltZapWsClient } from "./ws-client.js";
7
+ const MAX_MESSAGES_PER_CONV = 20;
8
+ function renderPart(p) {
9
+ switch (p.type) {
10
+ case "text":
11
+ return p.text;
12
+ case "image":
13
+ return "[image]";
14
+ case "file":
15
+ return `[file: ${p.name}]`;
16
+ default:
17
+ return `[${p.type}]`;
18
+ }
19
+ }
20
+ /**
21
+ * Stateful MoltZap client that manages connection, conversation tracking,
22
+ * agent name resolution, and cross-conversation context generation.
23
+ */
24
+ export class MoltZapService {
25
+ opts;
26
+ client = null;
27
+ _connected = false;
28
+ conversations = new Map();
29
+ messages = new Map();
30
+ agentNames = new Map();
31
+ lastNotified = new Map();
32
+ lastRead = new Map();
33
+ messageHandlers = [];
34
+ rawEventHandlers = [];
35
+ disconnectHandlers = [];
36
+ reconnectHandlers = [];
37
+ pendingNameLookups = new Map();
38
+ ownAgentId;
39
+ constructor(opts) {
40
+ this.opts = opts;
41
+ }
42
+ get connected() {
43
+ return this._connected;
44
+ }
45
+ async connect() {
46
+ this.client = new MoltZapWsClient({
47
+ serverUrl: this.opts.serverUrl,
48
+ agentKey: this.opts.agentKey,
49
+ logger: this.opts.logger,
50
+ onEvent: (event) => this.handleEvent(event),
51
+ onDisconnect: () => {
52
+ this._connected = false;
53
+ for (const h of this.disconnectHandlers)
54
+ h();
55
+ },
56
+ onReconnect: (helloOk) => {
57
+ this._connected = true;
58
+ const hello = helloOk;
59
+ this.populateFromHello(hello);
60
+ for (const h of this.reconnectHandlers)
61
+ h(hello);
62
+ },
63
+ });
64
+ const helloOk = (await this.client.connect());
65
+ this._connected = true;
66
+ this.ownAgentId = helloOk.agentId;
67
+ this.populateFromHello(helloOk);
68
+ return helloOk;
69
+ }
70
+ close() {
71
+ this._connected = false;
72
+ this.stopSocketServer();
73
+ this.client?.close();
74
+ this.client = null;
75
+ this.conversations.clear();
76
+ this.messages.clear();
77
+ this.agentNames.clear();
78
+ this.lastNotified.clear();
79
+ this.lastRead.clear();
80
+ }
81
+ // --- Socket Server ---
82
+ socketServer = null;
83
+ activeSocketPath = null;
84
+ /** Default socket path for CLI discovery. Per-instance path uses agentId. */
85
+ static SOCKET_PATH = path.join(os.homedir(), ".moltzap", "service.sock");
86
+ /** Per-instance socket path based on connected agentId. */
87
+ get socketPath() {
88
+ const id = this.ownAgentId ?? "default";
89
+ return path.join(os.homedir(), ".moltzap", `service-${id}.sock`);
90
+ }
91
+ startSocketServer() {
92
+ const sockPath = this.socketPath;
93
+ this.activeSocketPath = sockPath;
94
+ try {
95
+ fs.unlinkSync(sockPath);
96
+ }
97
+ catch { }
98
+ fs.mkdirSync(path.dirname(sockPath), { recursive: true });
99
+ this.socketServer = net.createServer((conn) => {
100
+ let buffer = "";
101
+ conn.on("data", (chunk) => {
102
+ buffer += chunk.toString();
103
+ const lines = buffer.split("\n");
104
+ buffer = lines.pop();
105
+ for (const line of lines) {
106
+ if (!line.trim())
107
+ continue;
108
+ void this.handleSocketLine(line, conn);
109
+ }
110
+ });
111
+ });
112
+ this.socketServer.listen(sockPath);
113
+ // Symlink default path to this instance for CLI discovery
114
+ try {
115
+ fs.unlinkSync(MoltZapService.SOCKET_PATH);
116
+ }
117
+ catch { }
118
+ try {
119
+ fs.symlinkSync(sockPath, MoltZapService.SOCKET_PATH);
120
+ }
121
+ catch { }
122
+ }
123
+ stopSocketServer() {
124
+ this.socketServer?.close();
125
+ this.socketServer = null;
126
+ const sockPath = this.activeSocketPath ?? this.socketPath;
127
+ this.activeSocketPath = null;
128
+ try {
129
+ fs.unlinkSync(sockPath);
130
+ }
131
+ catch { }
132
+ // Remove default symlink if it points to this instance
133
+ try {
134
+ const target = fs.readlinkSync(MoltZapService.SOCKET_PATH);
135
+ if (target === sockPath)
136
+ fs.unlinkSync(MoltZapService.SOCKET_PATH);
137
+ }
138
+ catch { }
139
+ }
140
+ async handleSocketLine(line, conn) {
141
+ try {
142
+ const req = JSON.parse(line);
143
+ if (typeof req.method !== "string" || !req.method) {
144
+ throw new Error("method is required and must be a string");
145
+ }
146
+ const params = req.params != null && typeof req.params === "object"
147
+ ? req.params
148
+ : {};
149
+ const result = await this.handleSocketRequest(req.method, params);
150
+ conn.write(JSON.stringify({ result }) + "\n");
151
+ }
152
+ catch (err) {
153
+ conn.write(JSON.stringify({
154
+ error: err instanceof Error ? err.message : String(err),
155
+ }) + "\n");
156
+ }
157
+ }
158
+ async handleSocketRequest(method, params) {
159
+ switch (method) {
160
+ case "ping":
161
+ return { ok: true, agentId: this.ownAgentId };
162
+ case "status":
163
+ return {
164
+ agentId: this.ownAgentId,
165
+ connected: this._connected,
166
+ conversations: this.getConversations().length,
167
+ };
168
+ case "history": {
169
+ if (typeof params.conversationId !== "string" ||
170
+ !params.conversationId) {
171
+ throw new Error("conversationId is required and must be a string");
172
+ }
173
+ if (params.limit !== undefined && typeof params.limit !== "number") {
174
+ throw new Error("limit must be a number");
175
+ }
176
+ const convId = params.conversationId;
177
+ const limit = params.limit ?? 10;
178
+ const sessionKey = params.sessionKey;
179
+ const afterSeq = params.afterSeq;
180
+ const beforeSeq = params.beforeSeq;
181
+ const result = (await this.sendRpc("messages/list", {
182
+ conversationId: convId,
183
+ limit,
184
+ ...(afterSeq !== undefined ? { afterSeq } : {}),
185
+ ...(beforeSeq !== undefined ? { beforeSeq } : {}),
186
+ }));
187
+ // Resolve agent names (batch) + fetch conversation metadata (concurrent)
188
+ const unknownAgentIds = [
189
+ ...new Set(result.messages
190
+ .filter((m) => m.sender.type === "agent")
191
+ .map((m) => m.sender.id)),
192
+ ].filter((id) => !this.agentNames.has(id));
193
+ const [, convMeta] = await Promise.all([
194
+ unknownAgentIds.length > 0
195
+ ? this.sendRpc("agents/lookup", { agentIds: unknownAgentIds }).then((res) => {
196
+ for (const a of res.agents) {
197
+ this.agentNames.set(a.id, a.name);
198
+ }
199
+ })
200
+ : Promise.resolve(),
201
+ this.sendRpc("conversations/get", { conversationId: convId })
202
+ .then((res) => res
203
+ .conversation)
204
+ .catch(() => undefined),
205
+ ]);
206
+ // Determine what's "new" using lastRead (not lastNotified).
207
+ // lastNotified is advanced by getContext() (system-reminder).
208
+ // lastRead is advanced here when the agent explicitly reads history.
209
+ // This means messages stay "new" until the agent reads them via history,
210
+ // even if the system-reminder already notified about them.
211
+ const readMarkers = sessionKey
212
+ ? (this.lastRead.get(sessionKey) ?? new Map())
213
+ : null;
214
+ const lastReadSeq = readMarkers?.get(convId) ?? 0;
215
+ const messages = result.messages.map((m) => {
216
+ const text = m.parts.map(renderPart).join(" ");
217
+ return {
218
+ seq: m.seq,
219
+ senderId: m.sender.id,
220
+ senderName: m.sender.id === this.ownAgentId
221
+ ? "you"
222
+ : (this.agentNames.get(m.sender.id) ?? m.sender.id),
223
+ isOwn: m.sender.id === this.ownAgentId,
224
+ text,
225
+ createdAt: m.createdAt,
226
+ isNew: sessionKey ? m.seq > lastReadSeq : false,
227
+ };
228
+ });
229
+ // Advance lastRead to the highest seq in the returned page.
230
+ // The agent has seen these messages; older ones (if paginated) remain
231
+ // accessible via afterSeq/beforeSeq cursors.
232
+ if (sessionKey && result.messages.length > 0) {
233
+ const maxSeq = Math.max(...result.messages.map((m) => m.seq));
234
+ if (!this.lastRead.has(sessionKey)) {
235
+ this.lastRead.set(sessionKey, new Map());
236
+ }
237
+ const current = this.lastRead.get(sessionKey).get(convId) ?? 0;
238
+ if (maxSeq > current) {
239
+ this.lastRead.get(sessionKey).set(convId, maxSeq);
240
+ }
241
+ }
242
+ return {
243
+ messages,
244
+ hasMore: result.hasMore,
245
+ conversationMeta: convMeta,
246
+ newCount: messages.filter((m) => m.isNew).length,
247
+ };
248
+ }
249
+ default:
250
+ // Passthrough: forward any other method to the MoltZap server via RPC
251
+ return this.sendRpc(method, params);
252
+ }
253
+ }
254
+ // --- Conversations ---
255
+ getConversation(convId) {
256
+ return this.conversations.get(convId);
257
+ }
258
+ getConversations() {
259
+ return [...this.conversations.values()];
260
+ }
261
+ // --- Messages ---
262
+ getHistory(convId, limit = 20) {
263
+ const msgs = this.messages.get(convId) ?? [];
264
+ return msgs.slice(-limit);
265
+ }
266
+ // --- Agent Names ---
267
+ getAgentName(agentId) {
268
+ return this.agentNames.get(agentId);
269
+ }
270
+ async resolveAgentName(agentId) {
271
+ const cached = this.agentNames.get(agentId);
272
+ if (cached)
273
+ return cached;
274
+ const pending = this.pendingNameLookups.get(agentId);
275
+ if (pending)
276
+ return pending;
277
+ const promise = (async () => {
278
+ const result = (await this.sendRpc("agents/lookup", {
279
+ agentIds: [agentId],
280
+ }));
281
+ const agent = result.agents[0];
282
+ if (agent) {
283
+ this.agentNames.set(agentId, agent.name);
284
+ return agent.name;
285
+ }
286
+ return agentId;
287
+ })();
288
+ this.pendingNameLookups.set(agentId, promise);
289
+ try {
290
+ return await promise;
291
+ }
292
+ finally {
293
+ this.pendingNameLookups.delete(agentId);
294
+ }
295
+ }
296
+ // --- Messaging ---
297
+ async send(convId, text, opts) {
298
+ await this.sendRpc("messages/send", {
299
+ conversationId: convId,
300
+ parts: [{ type: "text", text }],
301
+ ...(opts?.replyTo ? { replyToId: opts.replyTo } : {}),
302
+ });
303
+ }
304
+ // --- Cross-Conversation Context ---
305
+ /**
306
+ * Generate a system reminder with updates from other conversations.
307
+ * Each conversation has its own view of what's "new" — markers are tracked
308
+ * per viewing conversation and advanced after notification.
309
+ */
310
+ getContext(currentConvId, opts) {
311
+ const maxConvs = opts?.maxConversations ?? 5;
312
+ const maxMsgsPerConv = opts?.maxMessagesPerConv ?? 3;
313
+ const viewMarkers = this.lastNotified.get(currentConvId) ?? new Map();
314
+ const updates = [];
315
+ for (const [convId, msgs] of this.messages) {
316
+ if (convId === currentConvId || msgs.length === 0)
317
+ continue;
318
+ if (updates.length >= maxConvs)
319
+ break;
320
+ const lastSeenSeq = viewMarkers.get(convId) ?? 0;
321
+ const newMsgs = msgs.filter((m) => m.seq > lastSeenSeq);
322
+ if (newMsgs.length === 0)
323
+ continue;
324
+ const reportable = newMsgs.slice(-maxMsgsPerConv);
325
+ const last = reportable[reportable.length - 1];
326
+ const senderName = this.resolveSenderLabel(last.sender.id);
327
+ const ago = Math.max(0, Math.round((Date.now() - new Date(last.createdAt).getTime()) / 60_000));
328
+ const text = last.parts.map(renderPart).join(" ");
329
+ updates.push(`@${senderName} (${ago}m ago): (${reportable.length} new) "${text.slice(0, 120)}"`);
330
+ viewMarkers.set(convId, last.seq);
331
+ }
332
+ this.lastNotified.set(currentConvId, viewMarkers);
333
+ if (updates.length === 0)
334
+ return null;
335
+ return [
336
+ "<system-reminder>",
337
+ `Recent updates (you are in conv:${currentConvId}):`,
338
+ ...updates,
339
+ "</system-reminder>",
340
+ ].join("\n");
341
+ }
342
+ on(event,
343
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
344
+ handler) {
345
+ switch (event) {
346
+ case "message":
347
+ this.messageHandlers.push(handler);
348
+ break;
349
+ case "rawEvent":
350
+ this.rawEventHandlers.push(handler);
351
+ break;
352
+ case "disconnect":
353
+ this.disconnectHandlers.push(handler);
354
+ break;
355
+ case "reconnect":
356
+ this.reconnectHandlers.push(handler);
357
+ break;
358
+ }
359
+ }
360
+ // --- RPC passthrough ---
361
+ async sendRpc(method, params) {
362
+ if (!this.client)
363
+ throw new Error("Not connected");
364
+ return this.client.sendRpc(method, params);
365
+ }
366
+ // --- Internals ---
367
+ populateFromHello(hello) {
368
+ if (!hello.conversations)
369
+ return;
370
+ for (const conv of hello.conversations) {
371
+ this.conversations.set(conv.id, {
372
+ id: conv.id,
373
+ type: conv.type,
374
+ name: conv.name,
375
+ participants: (conv.participants ?? []).map((p) => `${p.type}:${p.id}`),
376
+ });
377
+ }
378
+ }
379
+ handleEvent(event) {
380
+ for (const h of this.rawEventHandlers)
381
+ h(event);
382
+ switch (event.event) {
383
+ case EventNames.MessageReceived: {
384
+ const msg = event.data.message;
385
+ this.storeMessage(msg);
386
+ // Resolve sender name in background
387
+ if (msg.sender.type === "agent" &&
388
+ !this.agentNames.has(msg.sender.id)) {
389
+ void this.resolveAgentName(msg.sender.id);
390
+ }
391
+ // Emit to external handlers (only non-own messages)
392
+ if (msg.sender.id !== this.ownAgentId) {
393
+ for (const h of this.messageHandlers)
394
+ h(msg);
395
+ }
396
+ break;
397
+ }
398
+ case EventNames.ConversationCreated:
399
+ case EventNames.ConversationUpdated: {
400
+ const data = event.data;
401
+ const existing = this.conversations.get(data.conversation.id);
402
+ this.conversations.set(data.conversation.id, {
403
+ id: data.conversation.id,
404
+ type: data.conversation.type,
405
+ name: data.conversation.name,
406
+ participants: existing?.participants ?? [],
407
+ });
408
+ break;
409
+ }
410
+ }
411
+ }
412
+ storeMessage(msg) {
413
+ const buf = this.messages.get(msg.conversationId) ?? [];
414
+ buf.push(msg);
415
+ if (buf.length > MAX_MESSAGES_PER_CONV)
416
+ buf.shift();
417
+ this.messages.set(msg.conversationId, buf);
418
+ }
419
+ resolveSenderLabel(senderId) {
420
+ return this.agentNames.get(senderId) ?? senderId;
421
+ }
422
+ }
423
+ //# sourceMappingURL=service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"service.js","sourceRoot":"","sources":["../src/service.ts"],"names":[],"mappings":"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"}