@mininglamp-oss/cc-channel-octo 1.0.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.
Files changed (87) hide show
  1. package/CHANGELOG.md +349 -0
  2. package/LICENSE +191 -0
  3. package/README.md +577 -0
  4. package/config.bot.example.json +15 -0
  5. package/config.example.json +33 -0
  6. package/dist/agent-bridge.d.ts +79 -0
  7. package/dist/agent-bridge.js +392 -0
  8. package/dist/agent-bridge.js.map +1 -0
  9. package/dist/commands.d.ts +57 -0
  10. package/dist/commands.js +121 -0
  11. package/dist/commands.js.map +1 -0
  12. package/dist/config.d.ts +278 -0
  13. package/dist/config.js +330 -0
  14. package/dist/config.js.map +1 -0
  15. package/dist/cron-evaluator.d.ts +53 -0
  16. package/dist/cron-evaluator.js +191 -0
  17. package/dist/cron-evaluator.js.map +1 -0
  18. package/dist/cron-fire-marker.d.ts +24 -0
  19. package/dist/cron-fire-marker.js +25 -0
  20. package/dist/cron-fire-marker.js.map +1 -0
  21. package/dist/cron-scheduler.d.ts +46 -0
  22. package/dist/cron-scheduler.js +114 -0
  23. package/dist/cron-scheduler.js.map +1 -0
  24. package/dist/cron-store.d.ts +62 -0
  25. package/dist/cron-store.js +63 -0
  26. package/dist/cron-store.js.map +1 -0
  27. package/dist/cron-tool.d.ts +44 -0
  28. package/dist/cron-tool.js +151 -0
  29. package/dist/cron-tool.js.map +1 -0
  30. package/dist/cwd-resolver.d.ts +72 -0
  31. package/dist/cwd-resolver.js +166 -0
  32. package/dist/cwd-resolver.js.map +1 -0
  33. package/dist/db-adapter.d.ts +21 -0
  34. package/dist/db-adapter.js +64 -0
  35. package/dist/db-adapter.js.map +1 -0
  36. package/dist/file-inline-wrap.d.ts +94 -0
  37. package/dist/file-inline-wrap.js +243 -0
  38. package/dist/file-inline-wrap.js.map +1 -0
  39. package/dist/gateway.d.ts +100 -0
  40. package/dist/gateway.js +420 -0
  41. package/dist/gateway.js.map +1 -0
  42. package/dist/group-config.d.ts +41 -0
  43. package/dist/group-config.js +104 -0
  44. package/dist/group-config.js.map +1 -0
  45. package/dist/group-context.d.ts +64 -0
  46. package/dist/group-context.js +396 -0
  47. package/dist/group-context.js.map +1 -0
  48. package/dist/inbound.d.ts +136 -0
  49. package/dist/inbound.js +667 -0
  50. package/dist/inbound.js.map +1 -0
  51. package/dist/index.d.ts +33 -0
  52. package/dist/index.js +922 -0
  53. package/dist/index.js.map +1 -0
  54. package/dist/media-inbound.d.ts +38 -0
  55. package/dist/media-inbound.js +131 -0
  56. package/dist/media-inbound.js.map +1 -0
  57. package/dist/mention-utils.d.ts +99 -0
  58. package/dist/mention-utils.js +185 -0
  59. package/dist/mention-utils.js.map +1 -0
  60. package/dist/octo/api.d.ts +148 -0
  61. package/dist/octo/api.js +320 -0
  62. package/dist/octo/api.js.map +1 -0
  63. package/dist/octo/socket.d.ts +102 -0
  64. package/dist/octo/socket.js +793 -0
  65. package/dist/octo/socket.js.map +1 -0
  66. package/dist/octo/types.d.ts +126 -0
  67. package/dist/octo/types.js +35 -0
  68. package/dist/octo/types.js.map +1 -0
  69. package/dist/prompt-safety.d.ts +78 -0
  70. package/dist/prompt-safety.js +148 -0
  71. package/dist/prompt-safety.js.map +1 -0
  72. package/dist/session-router.d.ts +127 -0
  73. package/dist/session-router.js +432 -0
  74. package/dist/session-router.js.map +1 -0
  75. package/dist/session-store.d.ts +89 -0
  76. package/dist/session-store.js +297 -0
  77. package/dist/session-store.js.map +1 -0
  78. package/dist/skill-linker.d.ts +31 -0
  79. package/dist/skill-linker.js +160 -0
  80. package/dist/skill-linker.js.map +1 -0
  81. package/dist/stream-relay.d.ts +42 -0
  82. package/dist/stream-relay.js +243 -0
  83. package/dist/stream-relay.js.map +1 -0
  84. package/dist/url-policy.d.ts +103 -0
  85. package/dist/url-policy.js +290 -0
  86. package/dist/url-policy.js.map +1 -0
  87. package/package.json +79 -0
@@ -0,0 +1,148 @@
1
+ import { ChannelType, type MentionEntity, type SendMessageResult } from "./types.js";
2
+ /**
3
+ * Generate a client-side idempotency key (UUID) for outbound messages.
4
+ *
5
+ * WuKongIM uses client_msg_no for server-side dedup — identical client_msg_no
6
+ * values result in only one stored message.
7
+ */
8
+ export declare function generateClientMsgNo(): string;
9
+ /**
10
+ * Parse JSON with int64 message_id protection.
11
+ * Converts 16+ digit numeric message_id values to strings before JSON.parse
12
+ * to prevent JavaScript precision loss for IDs exceeding Number.MAX_SAFE_INTEGER.
13
+ *
14
+ * Exported so other inbound paths parse Octo JSON with the same int64 safety as
15
+ * the REST client.
16
+ */
17
+ export declare function parseOctoJson<T>(text: string): T;
18
+ export declare function postJson<T>(apiUrl: string, botToken: string, path: string, payload: Record<string, unknown>, signal?: AbortSignal): Promise<T | undefined>;
19
+ export declare function sendMessage(params: {
20
+ apiUrl: string;
21
+ botToken: string;
22
+ channelId: string;
23
+ channelType: ChannelType;
24
+ content: string;
25
+ mentionUids?: string[];
26
+ mentionEntities?: MentionEntity[];
27
+ mentionAll?: boolean;
28
+ replyMsgId?: string;
29
+ clientMsgNo?: string;
30
+ signal?: AbortSignal;
31
+ }): Promise<SendMessageResult | undefined>;
32
+ /**
33
+ * Get STS temporary credentials for direct COS upload.
34
+ * GET /v1/bot/upload/credentials?filename=<encoded>
35
+ *
36
+ * Returns short-lived (typically 1h) credentials scoped to a single key.
37
+ * cc only uses this to probe the media CDN host (see index.ts); actual uploads
38
+ * are performed by the agent's octo-cli skill, not by cc itself.
39
+ */
40
+ export declare function getUploadCredentials(params: {
41
+ apiUrl: string;
42
+ botToken: string;
43
+ filename: string;
44
+ signal?: AbortSignal;
45
+ }): Promise<{
46
+ bucket: string;
47
+ region: string;
48
+ key: string;
49
+ credentials: {
50
+ tmpSecretId: string;
51
+ tmpSecretKey: string;
52
+ sessionToken: string;
53
+ };
54
+ startTime: number;
55
+ expiredTime: number;
56
+ cdnBaseUrl?: string;
57
+ }>;
58
+ export declare function sendTyping(params: {
59
+ apiUrl: string;
60
+ botToken: string;
61
+ channelId: string;
62
+ channelType: ChannelType;
63
+ signal?: AbortSignal;
64
+ }): Promise<void>;
65
+ export declare function sendHeartbeat(params: {
66
+ apiUrl: string;
67
+ botToken: string;
68
+ signal?: AbortSignal;
69
+ }): Promise<void>;
70
+ export declare function registerBot(params: {
71
+ apiUrl: string;
72
+ botToken: string;
73
+ forceRefresh?: boolean;
74
+ agentPlatform?: string;
75
+ agentVersion?: string;
76
+ signal?: AbortSignal;
77
+ }): Promise<{
78
+ robot_id: string;
79
+ im_token: string;
80
+ ws_url: string;
81
+ api_url: string;
82
+ owner_uid: string;
83
+ owner_channel_id: string;
84
+ }>;
85
+ export declare function sendReadReceipt(params: {
86
+ apiUrl: string;
87
+ botToken: string;
88
+ channelId: string;
89
+ channelType: ChannelType;
90
+ messageIds: string[];
91
+ signal?: AbortSignal;
92
+ }): Promise<void>;
93
+ export interface GroupMember {
94
+ uid: string;
95
+ name: string;
96
+ role: number;
97
+ robot?: number;
98
+ status?: number;
99
+ [key: string]: unknown;
100
+ }
101
+ export declare function getGroupMembers(params: {
102
+ apiUrl: string;
103
+ botToken: string;
104
+ groupNo: string;
105
+ }): Promise<GroupMember[]>;
106
+ export declare function fetchUserInfo(params: {
107
+ apiUrl: string;
108
+ botToken: string;
109
+ uid: string;
110
+ }): Promise<{
111
+ uid: string;
112
+ name: string;
113
+ avatar?: string;
114
+ } | null>;
115
+ /** Historical message returned by /v1/bot/messages/sync. */
116
+ export interface HistoricalMessage {
117
+ from_uid: string;
118
+ from_name?: string;
119
+ content?: string;
120
+ timestamp: number;
121
+ message_id?: string;
122
+ message_seq?: number;
123
+ /** Numeric MessageType (1=Text, 2=Image, 8=File, 14=RichText, etc.) */
124
+ type?: number;
125
+ url?: string;
126
+ name?: string;
127
+ /** Decoded full payload (server sends base64, we decode + JSON.parse). */
128
+ payload?: Record<string, unknown>;
129
+ }
130
+ /**
131
+ * Pull recent messages for a channel via the WuKongIM sync endpoint.
132
+ *
133
+ * Used by G4 to backfill conversation history when the local SQLite cache is
134
+ * empty or sparse (e.g. cold start, restored snapshot). The server payload is
135
+ * base64-encoded JSON; we decode it inline so callers get a clean object.
136
+ *
137
+ * Returns `[]` on any failure — the agent runs fine without history.
138
+ */
139
+ export declare function getChannelMessages(params: {
140
+ apiUrl: string;
141
+ botToken: string;
142
+ channelId: string;
143
+ channelType: number;
144
+ limit?: number;
145
+ startMessageSeq?: number;
146
+ endMessageSeq?: number;
147
+ signal?: AbortSignal;
148
+ }): Promise<HistoricalMessage[]>;
@@ -0,0 +1,320 @@
1
+ // Forked from openclaw-channel-octo v1.0.13 (2026-06-04)
2
+ // Source: https://github.com/Mininglamp-OSS/openclaw-channel-octo
3
+ // Removed: COS upload, GROUP.md API, OBO, rich text, media, thread/group management,
4
+ // read receipts, bot groups list, group info, mention prefs, space members.
5
+ import { MessageType, } from "./types.js";
6
+ import { randomUUID } from "node:crypto";
7
+ const DEFAULT_TIMEOUT_MS = 30_000;
8
+ /**
9
+ * Maximum base64-encoded payload length accepted from /v1/bot/messages/sync.
10
+ * D1/S7 (齐 P0-2): a malicious or buggy server could return a single payload
11
+ * of arbitrary size; Buffer.from(str, 'base64') allocates ~0.75 × input bytes
12
+ * synchronously. Cap at 256 KiB base64 ≈ 192 KiB decoded — well above any
13
+ * legitimate IM message payload.
14
+ */
15
+ const MAX_HISTORICAL_PAYLOAD_BASE64_LEN = 256 * 1024;
16
+ /**
17
+ * Generate a client-side idempotency key (UUID) for outbound messages.
18
+ *
19
+ * WuKongIM uses client_msg_no for server-side dedup — identical client_msg_no
20
+ * values result in only one stored message.
21
+ */
22
+ export function generateClientMsgNo() {
23
+ return randomUUID();
24
+ }
25
+ const DEFAULT_HEADERS = {
26
+ "Content-Type": "application/json",
27
+ };
28
+ /**
29
+ * Parse JSON with int64 message_id protection.
30
+ * Converts 16+ digit numeric message_id values to strings before JSON.parse
31
+ * to prevent JavaScript precision loss for IDs exceeding Number.MAX_SAFE_INTEGER.
32
+ *
33
+ * Exported so other inbound paths parse Octo JSON with the same int64 safety as
34
+ * the REST client.
35
+ */
36
+ export function parseOctoJson(text) {
37
+ const safeText = text.replace(/"message_id"\s*:\s*(\d{16,})/g, '"message_id":"$1"');
38
+ return JSON.parse(safeText);
39
+ }
40
+ export async function postJson(apiUrl, botToken, path, payload, signal) {
41
+ const url = `${apiUrl.replace(/\/+$/, "")}${path}`;
42
+ const effectiveSignal = signal ?? AbortSignal.timeout(DEFAULT_TIMEOUT_MS);
43
+ const response = await fetch(url, {
44
+ method: "POST",
45
+ headers: {
46
+ ...DEFAULT_HEADERS,
47
+ Authorization: `Bearer ${botToken}`,
48
+ },
49
+ body: JSON.stringify(payload),
50
+ signal: effectiveSignal,
51
+ });
52
+ if (!response.ok) {
53
+ const text = await response.text().catch(() => "");
54
+ throw new Error(`Octo API ${path} failed (${response.status}): ${text || response.statusText}`);
55
+ }
56
+ const text = await response.text();
57
+ if (!text)
58
+ return undefined;
59
+ try {
60
+ return parseOctoJson(text);
61
+ }
62
+ catch {
63
+ throw new Error(`Octo API ${path} returned invalid JSON: ${text.slice(0, 200)}`);
64
+ }
65
+ }
66
+ // ─── Message Sending ────────────────────────────────────────────────────────
67
+ export async function sendMessage(params) {
68
+ const payload = {
69
+ type: MessageType.Text,
70
+ content: params.content,
71
+ };
72
+ if ((params.mentionUids && params.mentionUids.length > 0) ||
73
+ (params.mentionEntities && params.mentionEntities.length > 0) ||
74
+ params.mentionAll) {
75
+ const mention = {};
76
+ if (params.mentionUids && params.mentionUids.length > 0) {
77
+ mention.uids = params.mentionUids;
78
+ }
79
+ if (params.mentionEntities && params.mentionEntities.length > 0) {
80
+ mention.entities = params.mentionEntities;
81
+ }
82
+ if (params.mentionAll) {
83
+ mention.all = 1;
84
+ }
85
+ payload.mention = mention;
86
+ }
87
+ if (params.replyMsgId) {
88
+ payload.reply = { message_id: params.replyMsgId };
89
+ }
90
+ return await postJson(params.apiUrl, params.botToken, "/v1/bot/sendMessage", {
91
+ channel_id: params.channelId,
92
+ channel_type: params.channelType,
93
+ payload,
94
+ client_msg_no: params.clientMsgNo ?? generateClientMsgNo(),
95
+ }, params.signal);
96
+ }
97
+ /**
98
+ * Get STS temporary credentials for direct COS upload.
99
+ * GET /v1/bot/upload/credentials?filename=<encoded>
100
+ *
101
+ * Returns short-lived (typically 1h) credentials scoped to a single key.
102
+ * cc only uses this to probe the media CDN host (see index.ts); actual uploads
103
+ * are performed by the agent's octo-cli skill, not by cc itself.
104
+ */
105
+ export async function getUploadCredentials(params) {
106
+ const base = params.apiUrl.replace(/\/+$/, "");
107
+ const url = `${base}/v1/bot/upload/credentials?filename=${encodeURIComponent(params.filename)}`;
108
+ const effectiveSignal = params.signal ?? AbortSignal.timeout(DEFAULT_TIMEOUT_MS);
109
+ const response = await fetch(url, {
110
+ method: "GET",
111
+ headers: { Authorization: `Bearer ${params.botToken}` },
112
+ signal: effectiveSignal,
113
+ });
114
+ if (!response.ok) {
115
+ const text = await response.text().catch(() => "");
116
+ // P1 from PR#34 review: server may echo request headers (incl. Authorization
117
+ // bearer token) on some error responses. Cap at 200 chars and strip any
118
+ // "Authorization" / "Bearer" tokens defensively before surfacing.
119
+ const sanitized = text
120
+ .slice(0, 200)
121
+ .replace(/Bearer\s+\S+/gi, "Bearer ***")
122
+ .replace(/(authorization"?\s*[:=]\s*"?)[^"\s,}]+/gi, "$1***");
123
+ throw new Error(`Octo API /v1/bot/upload/credentials failed (${response.status}): ${sanitized || response.statusText}`);
124
+ }
125
+ const data = await response.json();
126
+ // Validate required fields to catch backend API changes early.
127
+ const missing = ['bucket', 'region', 'key', 'credentials'].filter(k => !data[k]);
128
+ if (missing.length > 0) {
129
+ throw new Error(`Octo API /v1/bot/upload/credentials returned incomplete response: missing ${missing.join(', ')}`);
130
+ }
131
+ const creds = data.credentials;
132
+ if (!creds.tmpSecretId || !creds.tmpSecretKey || !creds.sessionToken) {
133
+ throw new Error("Octo API /v1/bot/upload/credentials returned incomplete credentials");
134
+ }
135
+ return data;
136
+ }
137
+ // ─── Typing / Heartbeat ─────────────────────────────────────────────────────
138
+ export async function sendTyping(params) {
139
+ await postJson(params.apiUrl, params.botToken, "/v1/bot/typing", {
140
+ channel_id: params.channelId,
141
+ channel_type: params.channelType,
142
+ }, params.signal);
143
+ }
144
+ export async function sendHeartbeat(params) {
145
+ await postJson(params.apiUrl, params.botToken, "/v1/bot/heartbeat", {}, params.signal);
146
+ }
147
+ // ─── Bot Registration ───────────────────────────────────────────────────────
148
+ export async function registerBot(params) {
149
+ const path = params.forceRefresh
150
+ ? "/v1/bot/register?force_refresh=true"
151
+ : "/v1/bot/register";
152
+ const body = {};
153
+ if (params.agentPlatform)
154
+ body.agent_platform = params.agentPlatform;
155
+ if (params.agentVersion)
156
+ body.agent_version = params.agentVersion;
157
+ const result = await postJson(params.apiUrl, params.botToken, path, body, params.signal);
158
+ if (!result)
159
+ throw new Error("Octo bot registration returned empty response");
160
+ return result;
161
+ }
162
+ /**
163
+ * GET request helper with consistent error handling, timeout, and int64 protection.
164
+ */
165
+ async function getJson(apiUrl, botToken, path, signal) {
166
+ const url = `${apiUrl.replace(/\/+$/, "")}${path}`;
167
+ const effectiveSignal = signal ?? AbortSignal.timeout(DEFAULT_TIMEOUT_MS);
168
+ const resp = await fetch(url, {
169
+ method: "GET",
170
+ headers: {
171
+ Authorization: `Bearer ${botToken}`,
172
+ },
173
+ signal: effectiveSignal,
174
+ });
175
+ if (!resp.ok) {
176
+ const text = await resp.text().catch(() => "");
177
+ throw new Error(`Octo API ${path} failed (${resp.status}): ${text || resp.statusText}`);
178
+ }
179
+ const text = await resp.text();
180
+ if (!text)
181
+ return {};
182
+ return parseOctoJson(text);
183
+ }
184
+ // ─── Read Receipt ──────────────────────────────────────────────────────────
185
+ export async function sendReadReceipt(params) {
186
+ await postJson(params.apiUrl, params.botToken, '/v1/bot/readReceipt', {
187
+ channel_id: params.channelId,
188
+ channel_type: params.channelType,
189
+ message_ids: params.messageIds,
190
+ }, params.signal);
191
+ }
192
+ export async function getGroupMembers(params) {
193
+ const data = await getJson(params.apiUrl, params.botToken, `/v1/bot/groups/${params.groupNo}/members`);
194
+ const members = Array.isArray(data?.members)
195
+ ? data.members
196
+ : Array.isArray(data)
197
+ ? data
198
+ : [];
199
+ return members;
200
+ }
201
+ // ─── User Info ──────────────────────────────────────────────────────────────
202
+ export async function fetchUserInfo(params) {
203
+ const url = `${params.apiUrl.replace(/\/+$/, "")}/v1/bot/user/info?uid=${encodeURIComponent(params.uid)}`;
204
+ try {
205
+ const resp = await fetch(url, {
206
+ method: "GET",
207
+ headers: { Authorization: `Bearer ${params.botToken}` },
208
+ signal: AbortSignal.timeout(5000),
209
+ });
210
+ if (resp.status === 404) {
211
+ return null;
212
+ }
213
+ if (!resp.ok) {
214
+ console.error(`octo: fetchUserInfo(${params.uid}) failed: ${resp.status}`);
215
+ return null;
216
+ }
217
+ const data = await resp.json();
218
+ if (data?.name) {
219
+ return { uid: data.uid ?? params.uid, name: data.name, avatar: data.avatar };
220
+ }
221
+ return null;
222
+ }
223
+ catch (err) {
224
+ console.error(`octo: fetchUserInfo(${params.uid}) error: ${String(err)}`);
225
+ return null;
226
+ }
227
+ }
228
+ /**
229
+ * Pull recent messages for a channel via the WuKongIM sync endpoint.
230
+ *
231
+ * Used by G4 to backfill conversation history when the local SQLite cache is
232
+ * empty or sparse (e.g. cold start, restored snapshot). The server payload is
233
+ * base64-encoded JSON; we decode it inline so callers get a clean object.
234
+ *
235
+ * Returns `[]` on any failure — the agent runs fine without history.
236
+ */
237
+ export async function getChannelMessages(params) {
238
+ try {
239
+ const result = await postJson(params.apiUrl, params.botToken, '/v1/bot/messages/sync', {
240
+ channel_id: params.channelId,
241
+ channel_type: params.channelType,
242
+ limit: params.limit ?? 20,
243
+ start_message_seq: params.startMessageSeq ?? 0,
244
+ end_message_seq: params.endMessageSeq ?? 0,
245
+ pull_mode: 1, // 1 = pull newer messages
246
+ }, params.signal);
247
+ const messages = result?.messages ?? [];
248
+ // D1/S7 (齐 P0-2): client-side cap on returned message count. The server
249
+ // could return more than `limit` requested (bug or malice); we map +
250
+ // decode each item which is O(payload size) per message.
251
+ const cap = params.limit ?? 20;
252
+ const limited = messages.length > cap ? messages.slice(0, cap) : messages;
253
+ return limited.map((m) => {
254
+ let payload;
255
+ if (typeof m.payload === 'string') {
256
+ // D1/S7 (齐 P0-2): cap base64 payload size before decoding. A 100 MB
257
+ // base64 string would force Buffer.from to allocate ~75 MB synchronously.
258
+ // 256 KiB decoded ≈ 192 KiB binary, well above any legitimate IM payload.
259
+ if (m.payload.length > MAX_HISTORICAL_PAYLOAD_BASE64_LEN) {
260
+ console.warn(`octo: getChannelMessages dropping oversized payload (${m.payload.length} base64 chars > ${MAX_HISTORICAL_PAYLOAD_BASE64_LEN})`);
261
+ }
262
+ else {
263
+ try {
264
+ payload = JSON.parse(Buffer.from(m.payload, 'base64').toString('utf-8'));
265
+ }
266
+ catch {
267
+ // Leave payload undefined if decoding fails
268
+ }
269
+ }
270
+ }
271
+ else if (m.payload && typeof m.payload === 'object') {
272
+ payload = m.payload;
273
+ }
274
+ return {
275
+ from_uid: String(m.from_uid ?? ''),
276
+ from_name: typeof m.from_name === 'string' ? m.from_name : undefined,
277
+ // C1 / P1.5 (Stage 6): WuKongIM /v1/bot/messages/sync ships per-message
278
+ // content / type / url / name INSIDE the base64-encoded payload, not at
279
+ // the top level. Without merging the decoded payload up, every Text
280
+ // history row had `content: undefined`, so seedHistoryFromApi treated
281
+ // every backfilled message as empty and skipped the placeholder branch
282
+ // — G4 backfill was effectively a no-op for Text.
283
+ //
284
+ // Strategy: prefer the top-level field when it is a usable string /
285
+ // number, otherwise fall back to the decoded payload field. We never
286
+ // overwrite a populated top-level value with a payload value, so this
287
+ // is a strict superset of the previous behavior.
288
+ content: typeof m.content === 'string' && m.content !== ''
289
+ ? m.content
290
+ : typeof payload?.content === 'string'
291
+ ? payload.content
292
+ : undefined,
293
+ timestamp: typeof m.timestamp === 'number' ? m.timestamp : 0,
294
+ message_id: typeof m.message_id === 'string' ? m.message_id : undefined,
295
+ message_seq: typeof m.message_seq === 'number' ? m.message_seq : undefined,
296
+ type: typeof m.type === 'number'
297
+ ? m.type
298
+ : typeof payload?.type === 'number'
299
+ ? payload.type
300
+ : undefined,
301
+ url: typeof m.url === 'string'
302
+ ? m.url
303
+ : typeof payload?.url === 'string'
304
+ ? payload.url
305
+ : undefined,
306
+ name: typeof m.name === 'string'
307
+ ? m.name
308
+ : typeof payload?.name === 'string'
309
+ ? payload.name
310
+ : undefined,
311
+ payload,
312
+ };
313
+ });
314
+ }
315
+ catch (err) {
316
+ console.error(`octo: getChannelMessages error: ${String(err)}`);
317
+ return [];
318
+ }
319
+ }
320
+ //# sourceMappingURL=api.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"api.js","sourceRoot":"","sources":["../../src/octo/api.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,102 @@
1
+ import { EventEmitter } from "events";
2
+ import type { BotMessage } from "./types.js";
3
+ export declare class Encoder {
4
+ private w;
5
+ writeByte(b: number): void;
6
+ writeBytes(b: number[]): void;
7
+ writeInt16(b: number): void;
8
+ writeInt32(b: number): void;
9
+ writeInt64(n: bigint): void;
10
+ writeString(s: string): void;
11
+ toUint8Array(): Uint8Array;
12
+ }
13
+ export declare class Decoder {
14
+ private data;
15
+ private offset;
16
+ constructor(data: Uint8Array);
17
+ /**
18
+ * Bounds guard: every reader calls this before touching the buffer so a
19
+ * truncated/malformed packet throws a typed error instead of silently reading
20
+ * `undefined` (which coerces to 0/NaN and produces corrupt parses — wrong
21
+ * messageID/seq → ack mismatch, message loss/dup). The packet-decode caller
22
+ * wraps decode in try/catch, so a throw cleanly rejects the bad packet.
23
+ */
24
+ private require;
25
+ readByte(): number;
26
+ readInt16(): number;
27
+ readInt32(): number;
28
+ readInt64String(): string;
29
+ readInt64BigInt(): bigint;
30
+ readString(): string;
31
+ readRemaining(): Uint8Array;
32
+ readVariableLength(): number;
33
+ }
34
+ interface WKSocketOptions {
35
+ wsUrl: string;
36
+ uid: string;
37
+ token: string;
38
+ onMessage: (msg: BotMessage) => void;
39
+ onConnected?: () => void;
40
+ onDisconnected?: () => void;
41
+ onError?: (err: Error) => void;
42
+ }
43
+ /**
44
+ * WuKongIM WebSocket client for bot connections.
45
+ *
46
+ * Implements the WuKongIM binary protocol directly over WebSocket,
47
+ * with per-instance DH key exchange, AES encryption, heartbeat,
48
+ * reconnect, and RECVACK.
49
+ *
50
+ * Each WKSocket instance maintains its own independent connection,
51
+ * enabling multiple bot accounts to run simultaneously.
52
+ */
53
+ export declare class WKSocket extends EventEmitter {
54
+ private opts;
55
+ private ws;
56
+ private connected;
57
+ private needReconnect;
58
+ private reconnectTimer;
59
+ private heartTimer;
60
+ private pingRetryCount;
61
+ private readonly pingMaxRetry;
62
+ private reconnectAttempts;
63
+ private stableTimer;
64
+ private lastConnectTime;
65
+ private rapidDisconnectCount;
66
+ private aesKey;
67
+ private aesIV;
68
+ private dhPrivateKey;
69
+ private serverVersion;
70
+ private tempBuffer;
71
+ private decryptFailCounts;
72
+ constructor(opts: WKSocketOptions);
73
+ /** Connect to WuKongIM WebSocket */
74
+ connect(): void;
75
+ /** Gracefully disconnect */
76
+ disconnect(): void;
77
+ /** Disconnect and wait for the old WS to fully close before resolving. */
78
+ disconnectAndWait(timeoutMs?: number): Promise<void>;
79
+ private doConnect;
80
+ private scheduleReconnect;
81
+ stopReconnectTimer(): void;
82
+ private startStableTimer;
83
+ private clearStableTimer;
84
+ private restartHeart;
85
+ private stopHeart;
86
+ private sendRaw;
87
+ private handleRawData;
88
+ /**
89
+ * Parse ONE packet starting at `start` in `data`. Returns the number of bytes
90
+ * consumed, or 0 if the buffer does not yet hold a complete packet (caller
91
+ * should wait for more bytes). Reads via `start + offset` and slices only the
92
+ * single packet's bytes — never the whole buffer — so repeated calls over a
93
+ * large buffer stay O(n) total, not O(n²).
94
+ */
95
+ private unpackOne;
96
+ private onPong;
97
+ private onPacket;
98
+ private onConnack;
99
+ private onRecv;
100
+ private onDisconnect;
101
+ }
102
+ export {};