@moltzap/openclaw-channel 2026.327.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.
@@ -0,0 +1,24 @@
1
+ import { mapMessageToEnvelope } from "./mapping.js";
2
+ /**
3
+ * OpenClaw Channel Plugin for MoltZap.
4
+ *
5
+ * Lifecycle:
6
+ * 1. Gateway loads plugin, calls setup() with channel config
7
+ * 2. Plugin connects to MoltZap server via WebSocket
8
+ * 3. Incoming MoltZap messages are converted to InboundEnvelopes
9
+ * 4. Outgoing OpenClaw responses are sent via messages/send RPC
10
+ * 5. On disconnect, auto-reconnects with exponential backoff
11
+ *
12
+ * Config: ~/.openclaw/config.json -> channels.moltzap.accounts[].{apiKey,serverUrl,agentName}
13
+ */
14
+ export declare class MoltZapChannelPlugin {
15
+ private client;
16
+ private config;
17
+ private onInboundMessage;
18
+ get channelId(): string;
19
+ setup(rawConfig: unknown, onInbound: (envelope: ReturnType<typeof mapMessageToEnvelope>) => void): Promise<void>;
20
+ send(conversationId: string, text: string): Promise<void>;
21
+ teardown(): Promise<void>;
22
+ private handleEvent;
23
+ }
24
+ //# sourceMappingURL=channel.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"channel.d.ts","sourceRoot":"","sources":["../src/channel.ts"],"names":[],"mappings":"AAEA,OAAO,EAAkB,oBAAoB,EAAE,MAAM,cAAc,CAAC;AAGpE;;;;;;;;;;;GAWG;AACH,qBAAa,oBAAoB;IAC/B,OAAO,CAAC,MAAM,CAAgC;IAC9C,OAAO,CAAC,MAAM,CAAqC;IACnD,OAAO,CAAC,gBAAgB,CAER;IAEhB,IAAI,SAAS,WAEZ;IAEK,KAAK,CACT,SAAS,EAAE,OAAO,EAClB,SAAS,EAAE,CAAC,QAAQ,EAAE,UAAU,CAAC,OAAO,oBAAoB,CAAC,KAAK,IAAI;IAoBlE,IAAI,CAAC,cAAc,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IASzD,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC;IAI/B,OAAO,CAAC,WAAW;CAOpB"}
@@ -0,0 +1,58 @@
1
+ import { MoltZapWsClient } from "./ws-client.js";
2
+ import { validateConfig } from "./config.js";
3
+ import { extractMessage, mapMessageToEnvelope } from "./mapping.js";
4
+ /**
5
+ * OpenClaw Channel Plugin for MoltZap.
6
+ *
7
+ * Lifecycle:
8
+ * 1. Gateway loads plugin, calls setup() with channel config
9
+ * 2. Plugin connects to MoltZap server via WebSocket
10
+ * 3. Incoming MoltZap messages are converted to InboundEnvelopes
11
+ * 4. Outgoing OpenClaw responses are sent via messages/send RPC
12
+ * 5. On disconnect, auto-reconnects with exponential backoff
13
+ *
14
+ * Config: ~/.openclaw/config.json -> channels.moltzap.accounts[].{apiKey,serverUrl,agentName}
15
+ */
16
+ export class MoltZapChannelPlugin {
17
+ client = null;
18
+ config = null;
19
+ onInboundMessage = null;
20
+ get channelId() {
21
+ return "moltzap";
22
+ }
23
+ async setup(rawConfig, onInbound) {
24
+ this.config = validateConfig(rawConfig);
25
+ this.onInboundMessage = onInbound;
26
+ this.client = new MoltZapWsClient({
27
+ serverUrl: this.config.serverUrl,
28
+ agentKey: this.config.apiKey,
29
+ onEvent: (event) => this.handleEvent(event),
30
+ onDisconnect: () => {
31
+ // Logged by ws-client, gateway handles presence
32
+ },
33
+ onReconnect: () => {
34
+ // Logged by ws-client
35
+ },
36
+ });
37
+ await this.client.connect();
38
+ }
39
+ async send(conversationId, text) {
40
+ if (!this.client)
41
+ throw new Error("MoltZap channel not connected");
42
+ await this.client.sendRpc("messages/send", {
43
+ conversationId,
44
+ parts: [{ type: "text", text }],
45
+ });
46
+ }
47
+ async teardown() {
48
+ this.client?.close();
49
+ }
50
+ handleEvent(event) {
51
+ const message = extractMessage(event);
52
+ if (message && this.onInboundMessage) {
53
+ const envelope = mapMessageToEnvelope(message);
54
+ this.onInboundMessage(envelope);
55
+ }
56
+ }
57
+ }
58
+ //# sourceMappingURL=channel.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"channel.js","sourceRoot":"","sources":["../src/channel.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AACjD,OAAO,EAAE,cAAc,EAA6B,MAAM,aAAa,CAAC;AACxE,OAAO,EAAE,cAAc,EAAE,oBAAoB,EAAE,MAAM,cAAc,CAAC;AAGpE;;;;;;;;;;;GAWG;AACH,MAAM,OAAO,oBAAoB;IACvB,MAAM,GAA2B,IAAI,CAAC;IACtC,MAAM,GAAgC,IAAI,CAAC;IAC3C,gBAAgB,GAEb,IAAI,CAAC;IAEhB,IAAI,SAAS;QACX,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,KAAK,CAAC,KAAK,CACT,SAAkB,EAClB,SAAsE;QAEtE,IAAI,CAAC,MAAM,GAAG,cAAc,CAAC,SAAS,CAAC,CAAC;QACxC,IAAI,CAAC,gBAAgB,GAAG,SAAS,CAAC;QAElC,IAAI,CAAC,MAAM,GAAG,IAAI,eAAe,CAAC;YAChC,SAAS,EAAE,IAAI,CAAC,MAAM,CAAC,SAAS;YAChC,QAAQ,EAAE,IAAI,CAAC,MAAM,CAAC,MAAM;YAC5B,OAAO,EAAE,CAAC,KAAiB,EAAE,EAAE,CAAC,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC;YACvD,YAAY,EAAE,GAAG,EAAE;gBACjB,gDAAgD;YAClD,CAAC;YACD,WAAW,EAAE,GAAG,EAAE;gBAChB,sBAAsB;YACxB,CAAC;SACF,CAAC,CAAC;QAEH,MAAM,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;IAC9B,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,cAAsB,EAAE,IAAY;QAC7C,IAAI,CAAC,IAAI,CAAC,MAAM;YAAE,MAAM,IAAI,KAAK,CAAC,+BAA+B,CAAC,CAAC;QAEnE,MAAM,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,eAAe,EAAE;YACzC,cAAc;YACd,KAAK,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC;SAChC,CAAC,CAAC;IACL,CAAC;IAED,KAAK,CAAC,QAAQ;QACZ,IAAI,CAAC,MAAM,EAAE,KAAK,EAAE,CAAC;IACvB,CAAC;IAEO,WAAW,CAAC,KAAiB;QACnC,MAAM,OAAO,GAAG,cAAc,CAAC,KAAK,CAAC,CAAC;QACtC,IAAI,OAAO,IAAI,IAAI,CAAC,gBAAgB,EAAE,CAAC;YACrC,MAAM,QAAQ,GAAG,oBAAoB,CAAC,OAAO,CAAC,CAAC;YAC/C,IAAI,CAAC,gBAAgB,CAAC,QAAQ,CAAC,CAAC;QAClC,CAAC;IACH,CAAC;CACF"}
@@ -0,0 +1,23 @@
1
+ /**
2
+ * MoltZap channel config -- stored in ~/.openclaw/config.json:
3
+ *
4
+ * {
5
+ * "channels": {
6
+ * "moltzap": {
7
+ * "accounts": [{
8
+ * "id": "default",
9
+ * "apiKey": "moltzap_agent_...",
10
+ * "serverUrl": "wss://api.moltzap.xyz",
11
+ * "agentName": "atlas"
12
+ * }]
13
+ * }
14
+ * }
15
+ * }
16
+ */
17
+ export interface MoltZapChannelConfig {
18
+ apiKey: string;
19
+ serverUrl: string;
20
+ agentName: string;
21
+ }
22
+ export declare function validateConfig(config: unknown): MoltZapChannelConfig;
23
+ //# sourceMappingURL=config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AACH,MAAM,WAAW,oBAAoB;IACnC,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,wBAAgB,cAAc,CAAC,MAAM,EAAE,OAAO,GAAG,oBAAoB,CAgBpE"}
package/dist/config.js ADDED
@@ -0,0 +1,18 @@
1
+ export function validateConfig(config) {
2
+ const c = config;
3
+ if (!c.apiKey || typeof c.apiKey !== "string") {
4
+ throw new Error("MoltZap channel: missing apiKey");
5
+ }
6
+ if (!c.serverUrl || typeof c.serverUrl !== "string") {
7
+ throw new Error("MoltZap channel: missing serverUrl");
8
+ }
9
+ if (!c.agentName || typeof c.agentName !== "string") {
10
+ throw new Error("MoltZap channel: missing agentName");
11
+ }
12
+ return {
13
+ apiKey: c.apiKey,
14
+ serverUrl: c.serverUrl,
15
+ agentName: c.agentName,
16
+ };
17
+ }
18
+ //# sourceMappingURL=config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAsBA,MAAM,UAAU,cAAc,CAAC,MAAe;IAC5C,MAAM,CAAC,GAAG,MAAiC,CAAC;IAC5C,IAAI,CAAC,CAAC,CAAC,MAAM,IAAI,OAAO,CAAC,CAAC,MAAM,KAAK,QAAQ,EAAE,CAAC;QAC9C,MAAM,IAAI,KAAK,CAAC,iCAAiC,CAAC,CAAC;IACrD,CAAC;IACD,IAAI,CAAC,CAAC,CAAC,SAAS,IAAI,OAAO,CAAC,CAAC,SAAS,KAAK,QAAQ,EAAE,CAAC;QACpD,MAAM,IAAI,KAAK,CAAC,oCAAoC,CAAC,CAAC;IACxD,CAAC;IACD,IAAI,CAAC,CAAC,CAAC,SAAS,IAAI,OAAO,CAAC,CAAC,SAAS,KAAK,QAAQ,EAAE,CAAC;QACpD,MAAM,IAAI,KAAK,CAAC,oCAAoC,CAAC,CAAC;IACxD,CAAC;IACD,OAAO;QACL,MAAM,EAAE,CAAC,CAAC,MAAM;QAChB,SAAS,EAAE,CAAC,CAAC,SAAS;QACtB,SAAS,EAAE,CAAC,CAAC,SAAS;KACvB,CAAC;AACJ,CAAC"}
@@ -0,0 +1,112 @@
1
+ import type { Message, EventFrame } from "@moltzap/protocol";
2
+ /**
3
+ * MoltZap message -> OpenClaw InboundEnvelope mapping:
4
+ *
5
+ * MoltZap -> OpenClaw
6
+ * ------------------------------------------
7
+ * message.sender.type -> peer.kind ("user"|"bot")
8
+ * message.sender.id -> peer.id
9
+ * message.conversationId -> session context
10
+ * message.parts[].text -> text (joined with newlines)
11
+ * message.replyToId -> replyToId
12
+ * message.id -> messageId
13
+ */
14
+ export declare function mapMessageToEnvelope(message: Message, opts?: {
15
+ senderName?: string;
16
+ chatType?: "direct" | "group";
17
+ groupSubject?: string;
18
+ groupMembers?: string;
19
+ conversationLabel?: string;
20
+ }): {
21
+ conversationLabel?: string | undefined;
22
+ groupMembers?: string | undefined;
23
+ groupSubject?: string | undefined;
24
+ chatType?: "direct" | "group" | undefined;
25
+ senderName?: string | undefined;
26
+ channel: "moltzap";
27
+ accountId: string;
28
+ peer: {
29
+ kind: "user" | "bot";
30
+ id: string;
31
+ };
32
+ text: string;
33
+ conversationId: string;
34
+ messageId: string;
35
+ replyToId: string | undefined;
36
+ };
37
+ export declare function isMessageEvent(frame: EventFrame): boolean;
38
+ export declare function extractMessage(frame: EventFrame): Message | null;
39
+ export declare function extractReadReceipt(frame: EventFrame): {
40
+ conversationId: string;
41
+ participant: {
42
+ type: string;
43
+ id: string;
44
+ };
45
+ seq: number;
46
+ } | null;
47
+ export declare function extractReaction(frame: EventFrame): {
48
+ messageId: string;
49
+ emoji: string;
50
+ participant: {
51
+ type: string;
52
+ id: string;
53
+ };
54
+ action: string;
55
+ } | null;
56
+ export declare function extractDelivery(frame: EventFrame): {
57
+ messageId: string;
58
+ conversationId: string;
59
+ participant: {
60
+ type: string;
61
+ id: string;
62
+ };
63
+ } | null;
64
+ export declare function extractDeletion(frame: EventFrame): {
65
+ messageId: string;
66
+ conversationId: string;
67
+ } | null;
68
+ export declare function extractConversationCreated(frame: EventFrame): {
69
+ conversation: {
70
+ id: string;
71
+ type: string;
72
+ name?: string;
73
+ };
74
+ } | null;
75
+ export declare function extractConversationUpdated(frame: EventFrame): {
76
+ conversation: {
77
+ id: string;
78
+ type: string;
79
+ name?: string;
80
+ };
81
+ } | null;
82
+ export declare function extractContactRequest(frame: EventFrame): {
83
+ contact: {
84
+ id: string;
85
+ requesterId: string;
86
+ targetId: string;
87
+ status: string;
88
+ };
89
+ } | null;
90
+ export declare function extractContactAccepted(frame: EventFrame): {
91
+ contact: {
92
+ id: string;
93
+ requesterId: string;
94
+ targetId: string;
95
+ status: string;
96
+ };
97
+ } | null;
98
+ export declare function extractPresenceChanged(frame: EventFrame): {
99
+ participant: {
100
+ type: string;
101
+ id: string;
102
+ };
103
+ status: string;
104
+ } | null;
105
+ export declare function extractTypingIndicator(frame: EventFrame): {
106
+ conversationId: string;
107
+ participant: {
108
+ type: string;
109
+ id: string;
110
+ };
111
+ } | null;
112
+ //# sourceMappingURL=mapping.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mapping.d.ts","sourceRoot":"","sources":["../src/mapping.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,144 @@
1
+ import { EventNames } from "@moltzap/protocol";
2
+ /**
3
+ * MoltZap message -> OpenClaw InboundEnvelope mapping:
4
+ *
5
+ * MoltZap -> OpenClaw
6
+ * ------------------------------------------
7
+ * message.sender.type -> peer.kind ("user"|"bot")
8
+ * message.sender.id -> peer.id
9
+ * message.conversationId -> session context
10
+ * message.parts[].text -> text (joined with newlines)
11
+ * message.replyToId -> replyToId
12
+ * message.id -> messageId
13
+ */
14
+ export function mapMessageToEnvelope(message, opts) {
15
+ return {
16
+ channel: "moltzap",
17
+ accountId: "default",
18
+ peer: {
19
+ kind: message.sender.type === "user" ? "user" : "bot",
20
+ id: `${message.sender.type}:${message.sender.id}`,
21
+ },
22
+ text: message.parts
23
+ .filter((p) => p.type === "text")
24
+ .map((p) => p.text)
25
+ .join("\n"),
26
+ conversationId: message.conversationId,
27
+ messageId: message.id,
28
+ replyToId: message.replyToId ?? undefined,
29
+ ...(opts?.senderName ? { senderName: opts.senderName } : {}),
30
+ ...(opts?.chatType ? { chatType: opts.chatType } : {}),
31
+ ...(opts?.groupSubject ? { groupSubject: opts.groupSubject } : {}),
32
+ ...(opts?.groupMembers ? { groupMembers: opts.groupMembers } : {}),
33
+ ...(opts?.conversationLabel
34
+ ? { conversationLabel: opts.conversationLabel }
35
+ : {}),
36
+ };
37
+ }
38
+ export function isMessageEvent(frame) {
39
+ return frame.event === EventNames.MessageReceived;
40
+ }
41
+ export function extractMessage(frame) {
42
+ if (!isMessageEvent(frame))
43
+ return null;
44
+ const data = frame.data;
45
+ return data?.message ?? null;
46
+ }
47
+ // --- Event extractors for all 11 event types ---
48
+ export function extractReadReceipt(frame) {
49
+ if (frame.event !== EventNames.MessageRead)
50
+ return null;
51
+ const data = frame.data;
52
+ if (!data?.conversationId || !data.participant || data.seq == null)
53
+ return null;
54
+ return {
55
+ conversationId: data.conversationId,
56
+ participant: data.participant,
57
+ seq: data.seq,
58
+ };
59
+ }
60
+ export function extractReaction(frame) {
61
+ if (frame.event !== EventNames.MessageReacted)
62
+ return null;
63
+ const data = frame.data;
64
+ if (!data?.messageId || !data.emoji || !data.participant || !data.action)
65
+ return null;
66
+ return {
67
+ messageId: data.messageId,
68
+ emoji: data.emoji,
69
+ participant: data.participant,
70
+ action: data.action,
71
+ };
72
+ }
73
+ export function extractDelivery(frame) {
74
+ if (frame.event !== EventNames.MessageDelivered)
75
+ return null;
76
+ const data = frame.data;
77
+ if (!data?.messageId || !data.conversationId || !data.participant)
78
+ return null;
79
+ return {
80
+ messageId: data.messageId,
81
+ conversationId: data.conversationId,
82
+ participant: data.participant,
83
+ };
84
+ }
85
+ export function extractDeletion(frame) {
86
+ if (frame.event !== EventNames.MessageDeleted)
87
+ return null;
88
+ const data = frame.data;
89
+ if (!data?.messageId || !data.conversationId)
90
+ return null;
91
+ return { messageId: data.messageId, conversationId: data.conversationId };
92
+ }
93
+ export function extractConversationCreated(frame) {
94
+ if (frame.event !== EventNames.ConversationCreated)
95
+ return null;
96
+ const data = frame.data;
97
+ if (!data?.conversation)
98
+ return null;
99
+ return { conversation: data.conversation };
100
+ }
101
+ export function extractConversationUpdated(frame) {
102
+ if (frame.event !== EventNames.ConversationUpdated)
103
+ return null;
104
+ const data = frame.data;
105
+ if (!data?.conversation)
106
+ return null;
107
+ return { conversation: data.conversation };
108
+ }
109
+ export function extractContactRequest(frame) {
110
+ if (frame.event !== EventNames.ContactRequest)
111
+ return null;
112
+ const data = frame.data;
113
+ if (!data?.contact)
114
+ return null;
115
+ return { contact: data.contact };
116
+ }
117
+ export function extractContactAccepted(frame) {
118
+ if (frame.event !== EventNames.ContactAccepted)
119
+ return null;
120
+ const data = frame.data;
121
+ if (!data?.contact)
122
+ return null;
123
+ return { contact: data.contact };
124
+ }
125
+ export function extractPresenceChanged(frame) {
126
+ if (frame.event !== EventNames.PresenceChanged)
127
+ return null;
128
+ const data = frame.data;
129
+ if (!data?.participant || !data.status)
130
+ return null;
131
+ return { participant: data.participant, status: data.status };
132
+ }
133
+ export function extractTypingIndicator(frame) {
134
+ if (frame.event !== EventNames.TypingIndicator)
135
+ return null;
136
+ const data = frame.data;
137
+ if (!data?.conversationId || !data.participant)
138
+ return null;
139
+ return {
140
+ conversationId: data.conversationId,
141
+ participant: data.participant,
142
+ };
143
+ }
144
+ //# sourceMappingURL=mapping.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mapping.js","sourceRoot":"","sources":["../src/mapping.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAE/C;;;;;;;;;;;GAWG;AACH,MAAM,UAAU,oBAAoB,CAClC,OAAgB,EAChB,IAMC;IAED,OAAO;QACL,OAAO,EAAE,SAAkB;QAC3B,SAAS,EAAE,SAAS;QACpB,IAAI,EAAE;YACJ,IAAI,EACF,OAAO,CAAC,MAAM,CAAC,IAAI,KAAK,MAAM,CAAC,CAAC,CAAE,MAAgB,CAAC,CAAC,CAAE,KAAe;YACvE,EAAE,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC,IAAI,IAAI,OAAO,CAAC,MAAM,CAAC,EAAE,EAAE;SAClD;QACD,IAAI,EAAE,OAAO,CAAC,KAAK;aAChB,MAAM,CAAC,CAAC,CAAC,EAAuC,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,MAAM,CAAC;aACrE,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;aAClB,IAAI,CAAC,IAAI,CAAC;QACb,cAAc,EAAE,OAAO,CAAC,cAAc;QACtC,SAAS,EAAE,OAAO,CAAC,EAAE;QACrB,SAAS,EAAE,OAAO,CAAC,SAAS,IAAI,SAAS;QACzC,GAAG,CAAC,IAAI,EAAE,UAAU,CAAC,CAAC,CAAC,EAAE,UAAU,EAAE,IAAI,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAC5D,GAAG,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACtD,GAAG,CAAC,IAAI,EAAE,YAAY,CAAC,CAAC,CAAC,EAAE,YAAY,EAAE,IAAI,CAAC,YAAY,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAClE,GAAG,CAAC,IAAI,EAAE,YAAY,CAAC,CAAC,CAAC,EAAE,YAAY,EAAE,IAAI,CAAC,YAAY,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAClE,GAAG,CAAC,IAAI,EAAE,iBAAiB;YACzB,CAAC,CAAC,EAAE,iBAAiB,EAAE,IAAI,CAAC,iBAAiB,EAAE;YAC/C,CAAC,CAAC,EAAE,CAAC;KACR,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,KAAiB;IAC9C,OAAO,KAAK,CAAC,KAAK,KAAK,UAAU,CAAC,eAAe,CAAC;AACpD,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,KAAiB;IAC9C,IAAI,CAAC,cAAc,CAAC,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC;IACxC,MAAM,IAAI,GAAG,KAAK,CAAC,IAAyC,CAAC;IAC7D,OAAO,IAAI,EAAE,OAAO,IAAI,IAAI,CAAC;AAC/B,CAAC;AAED,kDAAkD;AAElD,MAAM,UAAU,kBAAkB,CAAC,KAAiB;IAKlD,IAAI,KAAK,CAAC,KAAK,KAAK,UAAU,CAAC,WAAW;QAAE,OAAO,IAAI,CAAC;IACxD,MAAM,IAAI,GAAG,KAAK,CAAC,IAMN,CAAC;IACd,IAAI,CAAC,IAAI,EAAE,cAAc,IAAI,CAAC,IAAI,CAAC,WAAW,IAAI,IAAI,CAAC,GAAG,IAAI,IAAI;QAChE,OAAO,IAAI,CAAC;IACd,OAAO;QACL,cAAc,EAAE,IAAI,CAAC,cAAc;QACnC,WAAW,EAAE,IAAI,CAAC,WAAW;QAC7B,GAAG,EAAE,IAAI,CAAC,GAAG;KACd,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,KAAiB;IAM/C,IAAI,KAAK,CAAC,KAAK,KAAK,UAAU,CAAC,cAAc;QAAE,OAAO,IAAI,CAAC;IAC3D,MAAM,IAAI,GAAG,KAAK,CAAC,IAON,CAAC;IACd,IAAI,CAAC,IAAI,EAAE,SAAS,IAAI,CAAC,IAAI,CAAC,KAAK,IAAI,CAAC,IAAI,CAAC,WAAW,IAAI,CAAC,IAAI,CAAC,MAAM;QACtE,OAAO,IAAI,CAAC;IACd,OAAO;QACL,SAAS,EAAE,IAAI,CAAC,SAAS;QACzB,KAAK,EAAE,IAAI,CAAC,KAAK;QACjB,WAAW,EAAE,IAAI,CAAC,WAAW;QAC7B,MAAM,EAAE,IAAI,CAAC,MAAM;KACpB,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,KAAiB;IAK/C,IAAI,KAAK,CAAC,KAAK,KAAK,UAAU,CAAC,gBAAgB;QAAE,OAAO,IAAI,CAAC;IAC7D,MAAM,IAAI,GAAG,KAAK,CAAC,IAMN,CAAC;IACd,IAAI,CAAC,IAAI,EAAE,SAAS,IAAI,CAAC,IAAI,CAAC,cAAc,IAAI,CAAC,IAAI,CAAC,WAAW;QAC/D,OAAO,IAAI,CAAC;IACd,OAAO;QACL,SAAS,EAAE,IAAI,CAAC,SAAS;QACzB,cAAc,EAAE,IAAI,CAAC,cAAc;QACnC,WAAW,EAAE,IAAI,CAAC,WAAW;KAC9B,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,eAAe,CAC7B,KAAiB;IAEjB,IAAI,KAAK,CAAC,KAAK,KAAK,UAAU,CAAC,cAAc;QAAE,OAAO,IAAI,CAAC;IAC3D,MAAM,IAAI,GAAG,KAAK,CAAC,IAEN,CAAC;IACd,IAAI,CAAC,IAAI,EAAE,SAAS,IAAI,CAAC,IAAI,CAAC,cAAc;QAAE,OAAO,IAAI,CAAC;IAC1D,OAAO,EAAE,SAAS,EAAE,IAAI,CAAC,SAAS,EAAE,cAAc,EAAE,IAAI,CAAC,cAAc,EAAE,CAAC;AAC5E,CAAC;AAED,MAAM,UAAU,0BAA0B,CAAC,KAAiB;IAG1D,IAAI,KAAK,CAAC,KAAK,KAAK,UAAU,CAAC,mBAAmB;QAAE,OAAO,IAAI,CAAC;IAChE,MAAM,IAAI,GAAG,KAAK,CAAC,IAEN,CAAC;IACd,IAAI,CAAC,IAAI,EAAE,YAAY;QAAE,OAAO,IAAI,CAAC;IACrC,OAAO,EAAE,YAAY,EAAE,IAAI,CAAC,YAAY,EAAE,CAAC;AAC7C,CAAC;AAED,MAAM,UAAU,0BAA0B,CAAC,KAAiB;IAG1D,IAAI,KAAK,CAAC,KAAK,KAAK,UAAU,CAAC,mBAAmB;QAAE,OAAO,IAAI,CAAC;IAChE,MAAM,IAAI,GAAG,KAAK,CAAC,IAEN,CAAC;IACd,IAAI,CAAC,IAAI,EAAE,YAAY;QAAE,OAAO,IAAI,CAAC;IACrC,OAAO,EAAE,YAAY,EAAE,IAAI,CAAC,YAAY,EAAE,CAAC;AAC7C,CAAC;AAED,MAAM,UAAU,qBAAqB,CAAC,KAAiB;IAQrD,IAAI,KAAK,CAAC,KAAK,KAAK,UAAU,CAAC,cAAc;QAAE,OAAO,IAAI,CAAC;IAC3D,MAAM,IAAI,GAAG,KAAK,CAAC,IASN,CAAC;IACd,IAAI,CAAC,IAAI,EAAE,OAAO;QAAE,OAAO,IAAI,CAAC;IAChC,OAAO,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,CAAC;AACnC,CAAC;AAED,MAAM,UAAU,sBAAsB,CAAC,KAAiB;IAQtD,IAAI,KAAK,CAAC,KAAK,KAAK,UAAU,CAAC,eAAe;QAAE,OAAO,IAAI,CAAC;IAC5D,MAAM,IAAI,GAAG,KAAK,CAAC,IASN,CAAC;IACd,IAAI,CAAC,IAAI,EAAE,OAAO;QAAE,OAAO,IAAI,CAAC;IAChC,OAAO,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,CAAC;AACnC,CAAC;AAED,MAAM,UAAU,sBAAsB,CAAC,KAAiB;IAItD,IAAI,KAAK,CAAC,KAAK,KAAK,UAAU,CAAC,eAAe;QAAE,OAAO,IAAI,CAAC;IAC5D,MAAM,IAAI,GAAG,KAAK,CAAC,IAEN,CAAC;IACd,IAAI,CAAC,IAAI,EAAE,WAAW,IAAI,CAAC,IAAI,CAAC,MAAM;QAAE,OAAO,IAAI,CAAC;IACpD,OAAO,EAAE,WAAW,EAAE,IAAI,CAAC,WAAW,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,CAAC;AAChE,CAAC;AAED,MAAM,UAAU,sBAAsB,CAAC,KAAiB;IAItD,IAAI,KAAK,CAAC,KAAK,KAAK,UAAU,CAAC,eAAe;QAAE,OAAO,IAAI,CAAC;IAC5D,MAAM,IAAI,GAAG,KAAK,CAAC,IAKN,CAAC;IACd,IAAI,CAAC,IAAI,EAAE,cAAc,IAAI,CAAC,IAAI,CAAC,WAAW;QAAE,OAAO,IAAI,CAAC;IAC5D,OAAO;QACL,cAAc,EAAE,IAAI,CAAC,cAAc;QACnC,WAAW,EAAE,IAAI,CAAC,WAAW;KAC9B,CAAC;AACJ,CAAC"}
@@ -0,0 +1,169 @@
1
+ /**
2
+ * OpenClaw plugin entry point for MoltZap.
3
+ *
4
+ * Wraps the existing MoltZapWsClient + mapping modules into the
5
+ * ChannelPlugin shape expected by OpenClaw's api.registerChannel().
6
+ *
7
+ * Installed via: openclaw plugin install @moltzap/openclaw-channel
8
+ * Config: channels.moltzap.accounts[].{apiKey, serverUrl, agentName}
9
+ */
10
+ type MoltZapAccount = {
11
+ id: string;
12
+ apiKey: string;
13
+ serverUrl: string;
14
+ agentName: string;
15
+ enabled?: boolean;
16
+ };
17
+ type OpenClawConfig = Record<string, unknown> & {
18
+ channels?: {
19
+ moltzap?: {
20
+ accounts?: MoltZapAccount[];
21
+ };
22
+ };
23
+ };
24
+ /** Cache: accountId → (agentName → conversationId) for auto-created DM conversations. */
25
+ export declare const agentConversationCache: Map<string, Map<string, string>>;
26
+ export declare const moltzapChannelPlugin: {
27
+ id: "moltzap";
28
+ meta: {
29
+ id: "moltzap";
30
+ label: string;
31
+ selectionLabel: string;
32
+ docsPath: string;
33
+ docsLabel: string;
34
+ blurb: string;
35
+ detailLabel: string;
36
+ aliases: string[];
37
+ order: number;
38
+ };
39
+ capabilities: {
40
+ chatTypes: ("group" | "dm")[];
41
+ };
42
+ messaging: {
43
+ targetResolver: {
44
+ looksLikeId(raw: string): boolean;
45
+ hint: string;
46
+ resolveTarget(params: {
47
+ cfg: OpenClawConfig;
48
+ accountId?: string | null;
49
+ input: string;
50
+ normalized: string;
51
+ preferredKind?: "user" | "group" | "channel";
52
+ }): Promise<{
53
+ to: string;
54
+ kind: "user" | "group" | "channel";
55
+ display?: string;
56
+ source?: "normalized" | "directory";
57
+ } | null>;
58
+ };
59
+ };
60
+ directory: {
61
+ listPeers(params: {
62
+ cfg: OpenClawConfig;
63
+ accountId?: string | null;
64
+ query?: string | null;
65
+ limit?: number | null;
66
+ }): Promise<{
67
+ id: string;
68
+ name: string;
69
+ kind: "user";
70
+ }[]>;
71
+ listGroups(params: {
72
+ cfg: OpenClawConfig;
73
+ accountId?: string | null;
74
+ query?: string | null;
75
+ limit?: number | null;
76
+ }): Promise<{
77
+ id: string;
78
+ name: string;
79
+ kind: "group";
80
+ }[]>;
81
+ };
82
+ config: {
83
+ listAccountIds(cfg: OpenClawConfig): string[];
84
+ resolveAccount(cfg: OpenClawConfig, accountId?: string | null): MoltZapAccount;
85
+ isConfigured(account: MoltZapAccount): boolean;
86
+ unconfiguredReason(): string;
87
+ isEnabled(account: MoltZapAccount): boolean;
88
+ };
89
+ gateway: {
90
+ startAccount(ctx: {
91
+ cfg: OpenClawConfig;
92
+ accountId: string;
93
+ account: MoltZapAccount;
94
+ abortSignal: AbortSignal;
95
+ log?: {
96
+ info?: (...args: unknown[]) => void;
97
+ warn?: (...args: unknown[]) => void;
98
+ error?: (...args: unknown[]) => void;
99
+ debug?: (...args: unknown[]) => void;
100
+ };
101
+ setStatus: (next: Record<string, unknown>) => void;
102
+ channelRuntime?: {
103
+ reply?: {
104
+ dispatchReplyWithBufferedBlockDispatcher?: (params: {
105
+ ctx: Record<string, string | undefined>;
106
+ cfg: OpenClawConfig;
107
+ dispatcherOptions: {
108
+ deliver: (payload: {
109
+ text?: string;
110
+ body?: string;
111
+ }, info?: {
112
+ kind?: string;
113
+ }) => Promise<boolean>;
114
+ };
115
+ }) => Promise<{
116
+ queuedFinal: boolean;
117
+ }>;
118
+ };
119
+ };
120
+ }): Promise<void>;
121
+ stopAccount(ctx: {
122
+ accountId: string;
123
+ log?: {
124
+ info?: (...args: unknown[]) => void;
125
+ };
126
+ }): Promise<void>;
127
+ };
128
+ outbound: {
129
+ deliveryMode: "gateway";
130
+ resolveTarget(params: {
131
+ to?: string;
132
+ cfg?: OpenClawConfig;
133
+ accountId?: string | null;
134
+ mode?: string;
135
+ }): {
136
+ ok: true;
137
+ to: string;
138
+ } | {
139
+ ok: false;
140
+ error: Error;
141
+ };
142
+ sendText(ctx: {
143
+ cfg: OpenClawConfig;
144
+ to: string;
145
+ text: string;
146
+ accountId?: string | null;
147
+ replyToId?: string;
148
+ }): Promise<{
149
+ ok: false;
150
+ error: Error;
151
+ } | {
152
+ ok: true;
153
+ error?: undefined;
154
+ }>;
155
+ };
156
+ };
157
+ declare const plugin: {
158
+ id: string;
159
+ name: string;
160
+ description: string;
161
+ configSchema: {};
162
+ register(api: {
163
+ registerChannel: (params: {
164
+ plugin: typeof moltzapChannelPlugin;
165
+ }) => void;
166
+ }): void;
167
+ };
168
+ export default plugin;
169
+ //# sourceMappingURL=openclaw-entry.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"openclaw-entry.d.ts","sourceRoot":"","sources":["../src/openclaw-entry.ts"],"names":[],"mappings":"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"}