agent-messenger 2.15.0 → 2.16.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 (85) hide show
  1. package/.claude-plugin/plugin.json +1 -1
  2. package/README.md +1 -1
  3. package/dist/package.json +1 -1
  4. package/dist/src/platforms/kakaotalk/attachment-router.d.ts +25 -0
  5. package/dist/src/platforms/kakaotalk/attachment-router.d.ts.map +1 -0
  6. package/dist/src/platforms/kakaotalk/attachment-router.js +29 -0
  7. package/dist/src/platforms/kakaotalk/attachment-router.js.map +1 -0
  8. package/dist/src/platforms/kakaotalk/client.d.ts +14 -1
  9. package/dist/src/platforms/kakaotalk/client.d.ts.map +1 -1
  10. package/dist/src/platforms/kakaotalk/client.js +216 -0
  11. package/dist/src/platforms/kakaotalk/client.js.map +1 -1
  12. package/dist/src/platforms/kakaotalk/commands/message.d.ts.map +1 -1
  13. package/dist/src/platforms/kakaotalk/commands/message.js +49 -0
  14. package/dist/src/platforms/kakaotalk/commands/message.js.map +1 -1
  15. package/dist/src/platforms/kakaotalk/image-meta.d.ts +7 -0
  16. package/dist/src/platforms/kakaotalk/image-meta.d.ts.map +1 -0
  17. package/dist/src/platforms/kakaotalk/image-meta.js +153 -0
  18. package/dist/src/platforms/kakaotalk/image-meta.js.map +1 -0
  19. package/dist/src/platforms/kakaotalk/index.d.ts +6 -2
  20. package/dist/src/platforms/kakaotalk/index.d.ts.map +1 -1
  21. package/dist/src/platforms/kakaotalk/index.js +4 -1
  22. package/dist/src/platforms/kakaotalk/index.js.map +1 -1
  23. package/dist/src/platforms/kakaotalk/media-upload.d.ts +3 -0
  24. package/dist/src/platforms/kakaotalk/media-upload.d.ts.map +1 -0
  25. package/dist/src/platforms/kakaotalk/media-upload.js +44 -0
  26. package/dist/src/platforms/kakaotalk/media-upload.js.map +1 -0
  27. package/dist/src/platforms/kakaotalk/protocol/connection.d.ts +1 -0
  28. package/dist/src/platforms/kakaotalk/protocol/connection.d.ts.map +1 -1
  29. package/dist/src/platforms/kakaotalk/protocol/connection.js +11 -0
  30. package/dist/src/platforms/kakaotalk/protocol/connection.js.map +1 -1
  31. package/dist/src/platforms/kakaotalk/protocol/media-uploader.d.ts +25 -0
  32. package/dist/src/platforms/kakaotalk/protocol/media-uploader.d.ts.map +1 -0
  33. package/dist/src/platforms/kakaotalk/protocol/media-uploader.js +99 -0
  34. package/dist/src/platforms/kakaotalk/protocol/media-uploader.js.map +1 -0
  35. package/dist/src/platforms/kakaotalk/protocol/session.d.ts +6 -0
  36. package/dist/src/platforms/kakaotalk/protocol/session.d.ts.map +1 -1
  37. package/dist/src/platforms/kakaotalk/protocol/session.js +61 -0
  38. package/dist/src/platforms/kakaotalk/protocol/session.js.map +1 -1
  39. package/dist/src/platforms/kakaotalk/types.d.ts +44 -0
  40. package/dist/src/platforms/kakaotalk/types.d.ts.map +1 -1
  41. package/dist/src/platforms/kakaotalk/types.js +9 -0
  42. package/dist/src/platforms/kakaotalk/types.js.map +1 -1
  43. package/dist/src/platforms/slack/commands/auth.d.ts.map +1 -1
  44. package/dist/src/platforms/slack/commands/auth.js +6 -2
  45. package/dist/src/platforms/slack/commands/auth.js.map +1 -1
  46. package/dist/src/platforms/slack/ensure-auth.d.ts +8 -2
  47. package/dist/src/platforms/slack/ensure-auth.d.ts.map +1 -1
  48. package/dist/src/platforms/slack/ensure-auth.js +67 -10
  49. package/dist/src/platforms/slack/ensure-auth.js.map +1 -1
  50. package/docs/content/docs/cli/kakaotalk.mdx +47 -2
  51. package/docs/content/docs/sdk/kakaotalk.mdx +32 -0
  52. package/package.json +1 -1
  53. package/skills/agent-channeltalk/SKILL.md +1 -1
  54. package/skills/agent-channeltalkbot/SKILL.md +1 -1
  55. package/skills/agent-discord/SKILL.md +1 -1
  56. package/skills/agent-discordbot/SKILL.md +1 -1
  57. package/skills/agent-instagram/SKILL.md +1 -1
  58. package/skills/agent-kakaotalk/SKILL.md +62 -4
  59. package/skills/agent-kakaotalk/references/common-patterns.md +50 -11
  60. package/skills/agent-line/SKILL.md +1 -1
  61. package/skills/agent-slack/SKILL.md +1 -1
  62. package/skills/agent-slackbot/SKILL.md +1 -1
  63. package/skills/agent-teams/SKILL.md +1 -1
  64. package/skills/agent-telegram/SKILL.md +1 -1
  65. package/skills/agent-telegrambot/SKILL.md +1 -1
  66. package/skills/agent-webex/SKILL.md +1 -1
  67. package/skills/agent-wechatbot/SKILL.md +1 -1
  68. package/skills/agent-whatsapp/SKILL.md +1 -1
  69. package/skills/agent-whatsappbot/SKILL.md +1 -1
  70. package/src/platforms/kakaotalk/attachment-router.test.ts +102 -0
  71. package/src/platforms/kakaotalk/attachment-router.ts +50 -0
  72. package/src/platforms/kakaotalk/client.ts +315 -8
  73. package/src/platforms/kakaotalk/commands/message.ts +66 -0
  74. package/src/platforms/kakaotalk/image-meta.test.ts +90 -0
  75. package/src/platforms/kakaotalk/image-meta.ts +176 -0
  76. package/src/platforms/kakaotalk/index.ts +7 -0
  77. package/src/platforms/kakaotalk/media-upload.ts +44 -0
  78. package/src/platforms/kakaotalk/protocol/connection.ts +11 -0
  79. package/src/platforms/kakaotalk/protocol/media-uploader.ts +129 -0
  80. package/src/platforms/kakaotalk/protocol/session.ts +67 -0
  81. package/src/platforms/kakaotalk/types.ts +57 -0
  82. package/src/platforms/slack/commands/auth.ts +6 -4
  83. package/src/platforms/slack/ensure-auth.test.ts +223 -1
  84. package/src/platforms/slack/ensure-auth.ts +80 -11
  85. package/src/platforms/telegrambot/cli.ts +0 -0
@@ -1 +1 @@
1
- {"version":3,"file":"message.js","sourceRoot":"","sources":["../../../../../src/platforms/kakaotalk/commands/message.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"message.js","sourceRoot":"","sources":["../../../../../src/platforms/kakaotalk/commands/message.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ export interface ImageDimensions {
2
+ width: number;
3
+ height: number;
4
+ mimeType: string;
5
+ }
6
+ export declare function detectImageDimensions(buffer: Uint8Array): ImageDimensions;
7
+ //# sourceMappingURL=image-meta.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"image-meta.d.ts","sourceRoot":"","sources":["../../../../src/platforms/kakaotalk/image-meta.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,eAAe;IAC9B,KAAK,EAAE,MAAM,CAAA;IACb,MAAM,EAAE,MAAM,CAAA;IACd,QAAQ,EAAE,MAAM,CAAA;CACjB;AASD,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,UAAU,GAAG,eAAe,CAsCzE"}
@@ -0,0 +1,153 @@
1
+ // Extracts width/height/mime by reading the file's magic bytes and headers
2
+ // directly. Avoids pulling in `image-size` or `sharp` so the SDK stays
3
+ // dependency-light. Supports JPEG, PNG, GIF, WebP — the formats KakaoTalk
4
+ // actually renders inline. Throws for anything else (including truncated
5
+ // headers whose magic matches but whose length is short of the dimension
6
+ // fields, to avoid an unhandled DataView RangeError); the caller should fall
7
+ // back to `sendFile` (type=18) for unknown types.
8
+ export function detectImageDimensions(buffer) {
9
+ const view = new DataView(buffer.buffer, buffer.byteOffset, buffer.byteLength);
10
+ if (isPng(buffer)) {
11
+ if (buffer.length < 24) {
12
+ throw new Error('Truncated PNG: header is shorter than 24 bytes');
13
+ }
14
+ return {
15
+ width: view.getUint32(16, false),
16
+ height: view.getUint32(20, false),
17
+ mimeType: 'image/png',
18
+ };
19
+ }
20
+ if (isJpeg(buffer)) {
21
+ const dim = readJpegDimensions(buffer);
22
+ return { ...dim, mimeType: 'image/jpeg' };
23
+ }
24
+ if (isGif(buffer)) {
25
+ if (buffer.length < 10) {
26
+ throw new Error('Truncated GIF: header is shorter than 10 bytes');
27
+ }
28
+ return {
29
+ width: view.getUint16(6, true),
30
+ height: view.getUint16(8, true),
31
+ mimeType: 'image/gif',
32
+ };
33
+ }
34
+ if (isWebp(buffer)) {
35
+ if (buffer.length < 16) {
36
+ throw new Error('Truncated WebP: header is shorter than 16 bytes');
37
+ }
38
+ return { ...readWebpDimensions(buffer), mimeType: 'image/webp' };
39
+ }
40
+ throw new Error('Unsupported image format (expected JPEG, PNG, GIF, or WebP)');
41
+ }
42
+ // Full PNG signature: 89 50 4E 47 0D 0A 1A 0A — checking only the first 4 bytes
43
+ // would let a file that happens to start with "\x89PNG" but isn't really a PNG
44
+ // reach the dimension reader and either crash or return garbage. The trailing
45
+ // CRLF/EOF/LF bytes pin it to a real PNG header.
46
+ function isPng(b) {
47
+ return (b[0] === 0x89 &&
48
+ b[1] === 0x50 &&
49
+ b[2] === 0x4e &&
50
+ b[3] === 0x47 &&
51
+ b[4] === 0x0d &&
52
+ b[5] === 0x0a &&
53
+ b[6] === 0x1a &&
54
+ b[7] === 0x0a);
55
+ }
56
+ function isJpeg(b) {
57
+ return b[0] === 0xff && b[1] === 0xd8;
58
+ }
59
+ // GIF signature is "GIF87a" or "GIF89a". Checking only "GIF" would match any
60
+ // payload that starts with those three bytes (other Compuserve formats, etc.).
61
+ function isGif(b) {
62
+ return (b[0] === 0x47 &&
63
+ b[1] === 0x49 &&
64
+ b[2] === 0x46 &&
65
+ b[3] === 0x38 &&
66
+ (b[4] === 0x37 || b[4] === 0x39) &&
67
+ b[5] === 0x61);
68
+ }
69
+ function isWebp(b) {
70
+ return (b[0] === 0x52 &&
71
+ b[1] === 0x49 &&
72
+ b[2] === 0x46 &&
73
+ b[3] === 0x46 &&
74
+ b[8] === 0x57 &&
75
+ b[9] === 0x45 &&
76
+ b[10] === 0x42 &&
77
+ b[11] === 0x50);
78
+ }
79
+ // JPEG dimensions live in an SOF (Start Of Frame) marker (0xFFC0..0xFFCF except
80
+ // 0xFFC4, 0xFFC8, 0xFFCC which are not SOF). We scan markers until we hit one.
81
+ //
82
+ // The scan has to handle two JPEG quirks (ITU-T T.81 §B.1):
83
+ // 1. Fill bytes — any number of 0xFF bytes may precede a marker, so on a
84
+ // 0xFF byte we look at the next byte for the actual marker code and skip
85
+ // forward by 1 if it's another 0xFF (without trying to read a length).
86
+ // 2. Standalone markers — SOI/EOI/RST0-7/TEM (0xFFD0..0xFFD9, 0xFF01) have
87
+ // no length field, so we step past them with a fixed +2 instead of
88
+ // reading garbage as a segment length.
89
+ // Treating either case as a length-prefixed segment desynchronizes the scan
90
+ // and either skips past the SOF or runs off the end of the buffer.
91
+ function readJpegDimensions(buffer) {
92
+ const view = new DataView(buffer.buffer, buffer.byteOffset, buffer.byteLength);
93
+ let i = 2;
94
+ while (i < buffer.length - 9) {
95
+ if (buffer[i] !== 0xff) {
96
+ i++;
97
+ continue;
98
+ }
99
+ const marker = buffer[i + 1] ?? 0;
100
+ if (marker === 0xff) {
101
+ i++;
102
+ continue;
103
+ }
104
+ if (marker >= 0xc0 && marker <= 0xcf && marker !== 0xc4 && marker !== 0xc8 && marker !== 0xcc) {
105
+ const height = view.getUint16(i + 5, false);
106
+ const width = view.getUint16(i + 7, false);
107
+ return { width, height };
108
+ }
109
+ if (marker === 0x01 || (marker >= 0xd0 && marker <= 0xd9)) {
110
+ i += 2;
111
+ continue;
112
+ }
113
+ const segmentLength = view.getUint16(i + 2, false);
114
+ i += 2 + segmentLength;
115
+ }
116
+ throw new Error('JPEG SOF marker not found');
117
+ }
118
+ // WebP supports several variants: VP8 (lossy), VP8L (lossless), VP8X (extended).
119
+ // Dimensions live at different offsets per variant; we cover all three.
120
+ function readWebpDimensions(buffer) {
121
+ const view = new DataView(buffer.buffer, buffer.byteOffset, buffer.byteLength);
122
+ const fourCC = String.fromCharCode(buffer[12], buffer[13], buffer[14], buffer[15]);
123
+ if (fourCC === 'VP8 ') {
124
+ if (buffer.length < 30) {
125
+ throw new Error('Truncated WebP VP8: header is shorter than 30 bytes');
126
+ }
127
+ const width = view.getUint16(26, true) & 0x3fff;
128
+ const height = view.getUint16(28, true) & 0x3fff;
129
+ return { width, height };
130
+ }
131
+ if (fourCC === 'VP8L') {
132
+ if (buffer.length < 25) {
133
+ throw new Error('Truncated WebP VP8L: header is shorter than 25 bytes');
134
+ }
135
+ const b0 = buffer[21];
136
+ const b1 = buffer[22];
137
+ const b2 = buffer[23];
138
+ const b3 = buffer[24];
139
+ const width = 1 + (((b1 & 0x3f) << 8) | b0);
140
+ const height = 1 + (((b3 & 0x0f) << 10) | (b2 << 2) | ((b1 & 0xc0) >> 6));
141
+ return { width, height };
142
+ }
143
+ if (fourCC === 'VP8X') {
144
+ if (buffer.length < 31) {
145
+ throw new Error('Truncated WebP VP8X: header is shorter than 31 bytes');
146
+ }
147
+ const width = 1 + (view.getUint32(24, true) & 0xffffff);
148
+ const height = 1 + (view.getUint32(27, true) & 0xffffff);
149
+ return { width, height };
150
+ }
151
+ throw new Error(`Unsupported WebP variant: ${fourCC}`);
152
+ }
153
+ //# sourceMappingURL=image-meta.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"image-meta.js","sourceRoot":"","sources":["../../../../src/platforms/kakaotalk/image-meta.ts"],"names":[],"mappings":"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"}
@@ -4,6 +4,10 @@ export type { KakaoChatKind } from './chat-classifier.js';
4
4
  export { KakaoCredentialManager, CredentialManager } from './credential-manager.js';
5
5
  export { KakaoTalkListener } from './listener.js';
6
6
  export type { PendingLoginState } from './credential-manager.js';
7
- export type { KakaoAccountCredentials, KakaoAuthMethod, KakaoChat, KakaoConfig, KakaoDeviceType, KakaoEmoticonKind, KakaoEmoticonMessageType, KakaoMember, KakaoMessage, KakaoProfile, KakaoSendResult, KakaoTalkListenerEventMap, KakaoTalkPushEmoticonEvent, KakaoTalkPushEvent, KakaoTalkPushGenericEvent, KakaoTalkPushMemberEvent, KakaoTalkPushMessageEvent, KakaoTalkPushReadEvent, } from './types.js';
8
- export { KAKAO_EMOTICON_KIND_BY_TYPE, KAKAO_EMOTICON_MESSAGE_TYPES, KakaoAccountCredentialsSchema, KakaoChatSchema, KakaoConfigSchema, KakaoMemberSchema, KakaoMessageSchema, KakaoProfileSchema, KakaoSendResultSchema, KakaoTalkPushEmoticonEventSchema, KakaoTalkPushMemberEventSchema, KakaoTalkPushMessageEventSchema, KakaoTalkPushReadEventSchema, } from './types.js';
7
+ export type { KakaoAccountCredentials, KakaoAuthMethod, KakaoChat, KakaoConfig, KakaoDeviceType, KakaoEmoticonKind, KakaoEmoticonMessageType, KakaoFileExtra, KakaoMember, KakaoMessage, KakaoPhotoExtra, KakaoProfile, KakaoSendResult, KakaoTalkListenerEventMap, KakaoTalkPushEmoticonEvent, KakaoTalkPushEvent, KakaoTalkPushGenericEvent, KakaoTalkPushMemberEvent, KakaoTalkPushMessageEvent, KakaoTalkPushReadEvent, } from './types.js';
8
+ export { KAKAO_EMOTICON_KIND_BY_TYPE, KAKAO_EMOTICON_MESSAGE_TYPES, KAKAO_MESSAGE_TYPE, KakaoAccountCredentialsSchema, KakaoChatSchema, KakaoConfigSchema, KakaoMemberSchema, KakaoMessageSchema, KakaoProfileSchema, KakaoSendResultSchema, KakaoTalkPushEmoticonEventSchema, KakaoTalkPushMemberEventSchema, KakaoTalkPushMessageEventSchema, KakaoTalkPushReadEventSchema, } from './types.js';
9
+ export { sha1Hex } from './media-upload.js';
10
+ export { detectImageDimensions } from './image-meta.js';
11
+ export type { AttachmentInput, AttachmentPlan, ResolvedAttachment, SingleAttachmentKind } from './attachment-router.js';
12
+ export { planAttachments, resolveAttachment } from './attachment-router.js';
9
13
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/platforms/kakaotalk/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,UAAU,CAAA;AAC1D,OAAO,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAA;AACrD,YAAY,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAA;AACtD,OAAO,EAAE,sBAAsB,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAA;AAChF,OAAO,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAA;AAC9C,YAAY,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAA;AAC7D,YAAY,EACV,uBAAuB,EACvB,eAAe,EACf,SAAS,EACT,WAAW,EACX,eAAe,EACf,iBAAiB,EACjB,wBAAwB,EACxB,WAAW,EACX,YAAY,EACZ,YAAY,EACZ,eAAe,EACf,yBAAyB,EACzB,0BAA0B,EAC1B,kBAAkB,EAClB,yBAAyB,EACzB,wBAAwB,EACxB,yBAAyB,EACzB,sBAAsB,GACvB,MAAM,SAAS,CAAA;AAChB,OAAO,EACL,2BAA2B,EAC3B,4BAA4B,EAC5B,6BAA6B,EAC7B,eAAe,EACf,iBAAiB,EACjB,iBAAiB,EACjB,kBAAkB,EAClB,kBAAkB,EAClB,qBAAqB,EACrB,gCAAgC,EAChC,8BAA8B,EAC9B,+BAA+B,EAC/B,4BAA4B,GAC7B,MAAM,SAAS,CAAA"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/platforms/kakaotalk/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,UAAU,CAAA;AAC1D,OAAO,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAA;AACrD,YAAY,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAA;AACtD,OAAO,EAAE,sBAAsB,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAA;AAChF,OAAO,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAA;AAC9C,YAAY,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAA;AAC7D,YAAY,EACV,uBAAuB,EACvB,eAAe,EACf,SAAS,EACT,WAAW,EACX,eAAe,EACf,iBAAiB,EACjB,wBAAwB,EACxB,cAAc,EACd,WAAW,EACX,YAAY,EACZ,eAAe,EACf,YAAY,EACZ,eAAe,EACf,yBAAyB,EACzB,0BAA0B,EAC1B,kBAAkB,EAClB,yBAAyB,EACzB,wBAAwB,EACxB,yBAAyB,EACzB,sBAAsB,GACvB,MAAM,SAAS,CAAA;AAChB,OAAO,EACL,2BAA2B,EAC3B,4BAA4B,EAC5B,kBAAkB,EAClB,6BAA6B,EAC7B,eAAe,EACf,iBAAiB,EACjB,iBAAiB,EACjB,kBAAkB,EAClB,kBAAkB,EAClB,qBAAqB,EACrB,gCAAgC,EAChC,8BAA8B,EAC9B,+BAA+B,EAC/B,4BAA4B,GAC7B,MAAM,SAAS,CAAA;AAChB,OAAO,EAAE,OAAO,EAAE,MAAM,gBAAgB,CAAA;AACxC,OAAO,EAAE,qBAAqB,EAAE,MAAM,cAAc,CAAA;AACpD,YAAY,EAAE,eAAe,EAAE,cAAc,EAAE,kBAAkB,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAA;AACpH,OAAO,EAAE,eAAe,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAA"}
@@ -2,5 +2,8 @@ export { KakaoTalkClient, KakaoTalkError } from './client.js';
2
2
  export { classifyKakaoChat } from './chat-classifier.js';
3
3
  export { KakaoCredentialManager, CredentialManager } from './credential-manager.js';
4
4
  export { KakaoTalkListener } from './listener.js';
5
- export { KAKAO_EMOTICON_KIND_BY_TYPE, KAKAO_EMOTICON_MESSAGE_TYPES, KakaoAccountCredentialsSchema, KakaoChatSchema, KakaoConfigSchema, KakaoMemberSchema, KakaoMessageSchema, KakaoProfileSchema, KakaoSendResultSchema, KakaoTalkPushEmoticonEventSchema, KakaoTalkPushMemberEventSchema, KakaoTalkPushMessageEventSchema, KakaoTalkPushReadEventSchema, } from './types.js';
5
+ export { KAKAO_EMOTICON_KIND_BY_TYPE, KAKAO_EMOTICON_MESSAGE_TYPES, KAKAO_MESSAGE_TYPE, KakaoAccountCredentialsSchema, KakaoChatSchema, KakaoConfigSchema, KakaoMemberSchema, KakaoMessageSchema, KakaoProfileSchema, KakaoSendResultSchema, KakaoTalkPushEmoticonEventSchema, KakaoTalkPushMemberEventSchema, KakaoTalkPushMessageEventSchema, KakaoTalkPushReadEventSchema, } from './types.js';
6
+ export { sha1Hex } from './media-upload.js';
7
+ export { detectImageDimensions } from './image-meta.js';
8
+ export { planAttachments, resolveAttachment } from './attachment-router.js';
6
9
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/platforms/kakaotalk/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,UAAU,CAAA;AAC1D,OAAO,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAA;AAErD,OAAO,EAAE,sBAAsB,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAA;AAChF,OAAO,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAA;AAsB9C,OAAO,EACL,2BAA2B,EAC3B,4BAA4B,EAC5B,6BAA6B,EAC7B,eAAe,EACf,iBAAiB,EACjB,iBAAiB,EACjB,kBAAkB,EAClB,kBAAkB,EAClB,qBAAqB,EACrB,gCAAgC,EAChC,8BAA8B,EAC9B,+BAA+B,EAC/B,4BAA4B,GAC7B,MAAM,SAAS,CAAA"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/platforms/kakaotalk/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,UAAU,CAAA;AAC1D,OAAO,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAA;AAErD,OAAO,EAAE,sBAAsB,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAA;AAChF,OAAO,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAA;AAwB9C,OAAO,EACL,2BAA2B,EAC3B,4BAA4B,EAC5B,kBAAkB,EAClB,6BAA6B,EAC7B,eAAe,EACf,iBAAiB,EACjB,iBAAiB,EACjB,kBAAkB,EAClB,kBAAkB,EAClB,qBAAqB,EACrB,gCAAgC,EAChC,8BAA8B,EAC9B,+BAA+B,EAC/B,4BAA4B,GAC7B,MAAM,SAAS,CAAA;AAChB,OAAO,EAAE,OAAO,EAAE,MAAM,gBAAgB,CAAA;AACxC,OAAO,EAAE,qBAAqB,EAAE,MAAM,cAAc,CAAA;AAEpD,OAAO,EAAE,eAAe,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAA"}
@@ -0,0 +1,3 @@
1
+ export declare function sha1Hex(data: Uint8Array): Promise<string>;
2
+ export declare function guessMimeFromFilename(filename: string): string;
3
+ //# sourceMappingURL=media-upload.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"media-upload.d.ts","sourceRoot":"","sources":["../../../../src/platforms/kakaotalk/media-upload.ts"],"names":[],"mappings":"AAGA,wBAAsB,OAAO,CAAC,IAAI,EAAE,UAAU,GAAG,OAAO,CAAC,MAAM,CAAC,CAK/D;AA8BD,wBAAgB,qBAAqB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAK9D"}
@@ -0,0 +1,44 @@
1
+ // SHA-1 hex (uppercase, 40 chars) — required as the `cs` (checksum) field
2
+ // on SHIP requests and on the inbound photo `extra` JSON. Verified by inbound
3
+ // capture of a real KakaoTalk client photo (2026-05).
4
+ export async function sha1Hex(data) {
5
+ const hashBuf = await crypto.subtle.digest('SHA-1', data);
6
+ return Array.from(new Uint8Array(hashBuf))
7
+ .map((b) => b.toString(16).padStart(2, '0').toUpperCase())
8
+ .join('');
9
+ }
10
+ const MIME_BY_EXT = {
11
+ jpg: 'image/jpeg',
12
+ jpeg: 'image/jpeg',
13
+ png: 'image/png',
14
+ gif: 'image/gif',
15
+ webp: 'image/webp',
16
+ mp4: 'video/mp4',
17
+ mov: 'video/quicktime',
18
+ webm: 'video/webm',
19
+ mkv: 'video/x-matroska',
20
+ m4v: 'video/x-m4v',
21
+ m4a: 'audio/m4a',
22
+ mp3: 'audio/mpeg',
23
+ wav: 'audio/wav',
24
+ ogg: 'audio/ogg',
25
+ pdf: 'application/pdf',
26
+ csv: 'text/csv',
27
+ txt: 'text/plain',
28
+ json: 'application/json',
29
+ zip: 'application/zip',
30
+ doc: 'application/msword',
31
+ docx: 'application/vnd.openxmlformats-officedocument.wordprocessingml.document',
32
+ xls: 'application/vnd.ms-excel',
33
+ xlsx: 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',
34
+ ppt: 'application/vnd.ms-powerpoint',
35
+ pptx: 'application/vnd.openxmlformats-officedocument.presentationml.presentation',
36
+ };
37
+ export function guessMimeFromFilename(filename) {
38
+ const dot = filename.lastIndexOf('.');
39
+ if (dot < 0 || dot === filename.length - 1)
40
+ return 'application/octet-stream';
41
+ const ext = filename.slice(dot + 1).toLowerCase();
42
+ return MIME_BY_EXT[ext] ?? 'application/octet-stream';
43
+ }
44
+ //# sourceMappingURL=media-upload.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"media-upload.js","sourceRoot":"","sources":["../../../../src/platforms/kakaotalk/media-upload.ts"],"names":[],"mappings":"AAAA,0EAA0E;AAC1E,8EAA8E;AAC9E,sDAAsD;AACtD,MAAM,CAAC,KAAK,UAAU,OAAO,CAAC,IAAgB;IAC5C,MAAM,OAAO,GAAG,MAAM,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,OAAO,EAAE,IAAI,CAAC,CAAA;IACzD,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,UAAU,CAAC,OAAO,CAAC,CAAC;SACvC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,WAAW,EAAE,CAAC;SACzD,IAAI,CAAC,EAAE,CAAC,CAAA;AACb,CAAC;AAED,MAAM,WAAW,GAA2B;IAC1C,GAAG,EAAE,YAAY;IACjB,IAAI,EAAE,YAAY;IAClB,GAAG,EAAE,WAAW;IAChB,GAAG,EAAE,WAAW;IAChB,IAAI,EAAE,YAAY;IAClB,GAAG,EAAE,WAAW;IAChB,GAAG,EAAE,iBAAiB;IACtB,IAAI,EAAE,YAAY;IAClB,GAAG,EAAE,kBAAkB;IACvB,GAAG,EAAE,aAAa;IAClB,GAAG,EAAE,WAAW;IAChB,GAAG,EAAE,YAAY;IACjB,GAAG,EAAE,WAAW;IAChB,GAAG,EAAE,WAAW;IAChB,GAAG,EAAE,iBAAiB;IACtB,GAAG,EAAE,UAAU;IACf,GAAG,EAAE,YAAY;IACjB,IAAI,EAAE,kBAAkB;IACxB,GAAG,EAAE,iBAAiB;IACtB,GAAG,EAAE,oBAAoB;IACzB,IAAI,EAAE,yEAAyE;IAC/E,GAAG,EAAE,0BAA0B;IAC/B,IAAI,EAAE,mEAAmE;IACzE,GAAG,EAAE,+BAA+B;IACpC,IAAI,EAAE,2EAA2E;CAClF,CAAA;AAED,MAAM,UAAU,qBAAqB,CAAC,QAAgB;IACpD,MAAM,GAAG,GAAG,QAAQ,CAAC,WAAW,CAAC,GAAG,CAAC,CAAA;IACrC,IAAI,GAAG,GAAG,CAAC,IAAI,GAAG,KAAK,QAAQ,CAAC,MAAM,GAAG,CAAC;QAAE,OAAO,0BAA0B,CAAA;IAC7E,MAAM,GAAG,GAAG,QAAQ,CAAC,KAAK,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,WAAW,EAAE,CAAA;IACjD,OAAO,WAAW,CAAC,GAAG,CAAC,IAAI,0BAA0B,CAAA;AACvD,CAAC"}
@@ -12,6 +12,7 @@ export declare class LocoConnection {
12
12
  connectTls(host: string, port: number): Promise<void>;
13
13
  connectSecure(host: string, port: number): Promise<void>;
14
14
  private performHandshake;
15
+ writeRaw(data: Buffer): Promise<void>;
15
16
  sendPacket(method: string, body?: Record<string, unknown>): Promise<LocoPacket>;
16
17
  onPush(handler: (packet: LocoPacket) => void): void;
17
18
  onClose(handler: () => void): void;
@@ -1 +1 @@
1
- {"version":3,"file":"connection.d.ts","sourceRoot":"","sources":["../../../../../src/platforms/kakaotalk/protocol/connection.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,SAAS,CAAA;AAIzC,qBAAa,cAAc;IACzB,OAAO,CAAC,MAAM,CAAsB;IACpC,OAAO,CAAC,MAAM,CAA0B;IACxC,OAAO,CAAC,MAAM,CAAkB;IAChC,OAAO,CAAC,eAAe,CAAkB;IACzC,OAAO,CAAC,eAAe,CAAI;IAC3B,OAAO,CAAC,gBAAgB,CAGrB;IACH,OAAO,CAAC,WAAW,CAAoB;IACvC,OAAO,CAAC,WAAW,CAA8C;IACjE,OAAO,CAAC,YAAY,CAA4B;IAE1C,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAUrD,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;YAWhD,gBAAgB;IAMxB,UAAU,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,GAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAM,GAAG,OAAO,CAAC,UAAU,CAAC;IAwBzF,MAAM,CAAC,OAAO,EAAE,CAAC,MAAM,EAAE,UAAU,KAAK,IAAI,GAAG,IAAI;IAInD,OAAO,CAAC,OAAO,EAAE,MAAM,IAAI,GAAG,IAAI;IAIlC,KAAK,IAAI,IAAI;IAMb,OAAO,CAAC,KAAK;IAUb,OAAO,CAAC,MAAM;IAKd,OAAO,CAAC,aAAa;IAqCrB,OAAO,CAAC,cAAc;IAatB,OAAO,CAAC,WAAW;CAQpB"}
1
+ {"version":3,"file":"connection.d.ts","sourceRoot":"","sources":["../../../../../src/platforms/kakaotalk/protocol/connection.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,SAAS,CAAA;AAIzC,qBAAa,cAAc;IACzB,OAAO,CAAC,MAAM,CAAsB;IACpC,OAAO,CAAC,MAAM,CAA0B;IACxC,OAAO,CAAC,MAAM,CAAkB;IAChC,OAAO,CAAC,eAAe,CAAkB;IACzC,OAAO,CAAC,eAAe,CAAI;IAC3B,OAAO,CAAC,gBAAgB,CAGrB;IACH,OAAO,CAAC,WAAW,CAAoB;IACvC,OAAO,CAAC,WAAW,CAA8C;IACjE,OAAO,CAAC,YAAY,CAA4B;IAE1C,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAUrD,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;YAWhD,gBAAgB;IAWxB,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAMrC,UAAU,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,GAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAM,GAAG,OAAO,CAAC,UAAU,CAAC;IAwBzF,MAAM,CAAC,OAAO,EAAE,CAAC,MAAM,EAAE,UAAU,KAAK,IAAI,GAAG,IAAI;IAInD,OAAO,CAAC,OAAO,EAAE,MAAM,IAAI,GAAG,IAAI;IAIlC,KAAK,IAAI,IAAI;IAMb,OAAO,CAAC,KAAK;IAUb,OAAO,CAAC,MAAM;IAKd,OAAO,CAAC,aAAa;IAqCrB,OAAO,CAAC,cAAc;IAatB,OAAO,CAAC,WAAW;CAQpB"}
@@ -38,6 +38,17 @@ export class LocoConnection {
38
38
  const handshakePacket = this.crypto.buildHandshakePacket();
39
39
  await this.write(handshakePacket);
40
40
  }
41
+ // Writes raw bytes onto the LOCO stream after applying the same AES-128-GCM
42
+ // framing as encrypted packets — used by the media-upload POST step where
43
+ // the protocol expects the file payload to follow the POST request inside
44
+ // the same encrypted channel (chunked into N frames automatically by the
45
+ // crypto layer's 4-byte-size + nonce + ciphertext + tag wrapping).
46
+ async writeRaw(data) {
47
+ if (!this.crypto)
48
+ throw new Error('crypto not initialised');
49
+ const encrypted = this.crypto.encrypt(data);
50
+ await this.write(encrypted);
51
+ }
41
52
  async sendPacket(method, body = {}) {
42
53
  const packetId = ++this.packetIdCounter;
43
54
  const packet = {
@@ -1 +1 @@
1
- {"version":3,"file":"connection.js","sourceRoot":"","sources":["../../../../../src/platforms/kakaotalk/protocol/connection.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"connection.js","sourceRoot":"","sources":["../../../../../src/platforms/kakaotalk/protocol/connection.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,25 @@
1
+ import { Long } from 'bson';
2
+ import type { KakaoDeviceType } from '../types.js';
3
+ import type { LocoPacket } from './types.js';
4
+ export interface UploadToLocoOptions {
5
+ shipToken: string;
6
+ shipHost: string;
7
+ shipPort: number;
8
+ chatId: Long;
9
+ msgType: number;
10
+ userId: string;
11
+ filename: string;
12
+ data: Uint8Array;
13
+ width?: number;
14
+ height?: number;
15
+ deviceType: KakaoDeviceType;
16
+ onProgress?: (sent: number, total: number) => void;
17
+ }
18
+ export interface UploadToLocoResult {
19
+ completePacket: LocoPacket | null;
20
+ postStatusCode: number;
21
+ postOffset: number;
22
+ }
23
+ export declare function uploadMediaToLoco(opts: UploadToLocoOptions): Promise<UploadToLocoResult>;
24
+ export declare function uploadMultiMediaEntry(opts: UploadToLocoOptions): Promise<UploadToLocoResult>;
25
+ //# sourceMappingURL=media-uploader.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"media-uploader.d.ts","sourceRoot":"","sources":["../../../../../src/platforms/kakaotalk/protocol/media-uploader.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAA;AAE3B,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,UAAU,CAAA;AAG/C,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,SAAS,CAAA;AAEzC,MAAM,WAAW,mBAAmB;IAClC,SAAS,EAAE,MAAM,CAAA;IACjB,QAAQ,EAAE,MAAM,CAAA;IAChB,QAAQ,EAAE,MAAM,CAAA;IAChB,MAAM,EAAE,IAAI,CAAA;IACZ,OAAO,EAAE,MAAM,CAAA;IACf,MAAM,EAAE,MAAM,CAAA;IACd,QAAQ,EAAE,MAAM,CAAA;IAChB,IAAI,EAAE,UAAU,CAAA;IAChB,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,UAAU,EAAE,eAAe,CAAA;IAC3B,UAAU,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,KAAK,IAAI,CAAA;CACnD;AAED,MAAM,WAAW,kBAAkB;IACjC,cAAc,EAAE,UAAU,GAAG,IAAI,CAAA;IACjC,cAAc,EAAE,MAAM,CAAA;IACtB,UAAU,EAAE,MAAM,CAAA;CACnB;AAeD,wBAAsB,iBAAiB,CAAC,IAAI,EAAE,mBAAmB,GAAG,OAAO,CAAC,kBAAkB,CAAC,CAE9F;AAMD,wBAAsB,qBAAqB,CAAC,IAAI,EAAE,mBAAmB,GAAG,OAAO,CAAC,kBAAkB,CAAC,CAElG"}
@@ -0,0 +1,99 @@
1
+ import { Long } from 'bson';
2
+ import { MCCMNC, getLocoDeviceConfig } from './config.js';
3
+ import { LocoConnection } from './connection.js';
4
+ const DEFAULT_NETWORK_TYPE = 0;
5
+ const DEFAULT_COMPLETE_TIMEOUT_MS = 60_000;
6
+ // Drives the SHIP → connect → POST → stream → COMPLETE pipeline that KakaoTalk
7
+ // uses for chat-media uploads. The caller has already done SHIP on the main
8
+ // session and received {k, vh, p}; this opens a dedicated TCP+LOCO connection
9
+ // to (vh, p), sends POST with the ticket + chat metadata, streams the raw file
10
+ // bytes, and waits for the server's COMPLETE push that triggers the actual
11
+ // chat-message registration.
12
+ //
13
+ // Field names (u/k/t/s/c/mid/w/h/mm/nt/os/av/f/ns) match the APK's
14
+ // `SR/g0.java` (PostJob) verbatim. The COMPLETE handshake is a server-pushed
15
+ // packet whose body contains the resulting chatLog struct.
16
+ export async function uploadMediaToLoco(opts) {
17
+ return runPostStreamComplete(opts, 'POST');
18
+ }
19
+ // Single-entry MPOST upload — runs the same connect → POST → stream → COMPLETE
20
+ // pipeline as uploadMediaToLoco but with MPOST as the opcode (used after MSHIP
21
+ // for each entry in a multi-photo batch). Callers fan-out across all entries
22
+ // in parallel and then issue one FORWARD to register the gallery message.
23
+ export async function uploadMultiMediaEntry(opts) {
24
+ return runPostStreamComplete(opts, 'MPOST');
25
+ }
26
+ async function runPostStreamComplete(opts, opcode) {
27
+ const device = getLocoDeviceConfig(opts.deviceType);
28
+ const conn = new LocoConnection();
29
+ await conn.connectSecure(opts.shipHost, opts.shipPort);
30
+ const totalSize = opts.data.byteLength;
31
+ let completeResolve = null;
32
+ let completeTimeout = null;
33
+ const completePromise = new Promise((resolve) => {
34
+ completeResolve = resolve;
35
+ completeTimeout = setTimeout(() => {
36
+ completeTimeout = null;
37
+ resolve(null);
38
+ }, DEFAULT_COMPLETE_TIMEOUT_MS);
39
+ });
40
+ conn.onPush((push) => {
41
+ if (push.method === 'COMPLETE' && completeResolve) {
42
+ if (completeTimeout) {
43
+ clearTimeout(completeTimeout);
44
+ completeTimeout = null;
45
+ }
46
+ completeResolve(push);
47
+ completeResolve = null;
48
+ }
49
+ });
50
+ try {
51
+ const postBody = {
52
+ k: opts.shipToken,
53
+ s: totalSize,
54
+ t: opts.msgType,
55
+ u: Long.fromString(opts.userId),
56
+ os: device.os,
57
+ av: device.appVersion,
58
+ nt: DEFAULT_NETWORK_TYPE,
59
+ mm: MCCMNC,
60
+ };
61
+ if (opcode === 'POST') {
62
+ postBody.f = opts.filename;
63
+ postBody.c = opts.chatId;
64
+ postBody.mid = Long.ONE;
65
+ postBody.ns = true;
66
+ if (typeof opts.width === 'number')
67
+ postBody.w = opts.width;
68
+ if (typeof opts.height === 'number')
69
+ postBody.h = opts.height;
70
+ }
71
+ else {
72
+ postBody.dt = 0;
73
+ postBody.scp = 0;
74
+ }
75
+ const postResp = await conn.sendPacket(opcode, postBody);
76
+ const postOffsetRaw = postResp.body.o;
77
+ const postOffset = typeof postOffsetRaw === 'number' ? postOffsetRaw : 0;
78
+ const bytesToSend = opts.data.subarray(postOffset);
79
+ if (bytesToSend.length > 0) {
80
+ await conn.writeRaw(Buffer.from(bytesToSend));
81
+ opts.onProgress?.(totalSize, totalSize);
82
+ }
83
+ const completePacket = await completePromise;
84
+ const postStatusCode = postResp.statusCode;
85
+ return {
86
+ completePacket,
87
+ postStatusCode,
88
+ postOffset,
89
+ };
90
+ }
91
+ finally {
92
+ if (completeTimeout) {
93
+ clearTimeout(completeTimeout);
94
+ completeTimeout = null;
95
+ }
96
+ conn.close();
97
+ }
98
+ }
99
+ //# sourceMappingURL=media-uploader.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"media-uploader.js","sourceRoot":"","sources":["../../../../../src/platforms/kakaotalk/protocol/media-uploader.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAA;AAG3B,OAAO,EAAE,MAAM,EAAE,mBAAmB,EAAE,MAAM,UAAU,CAAA;AACtD,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAA;AAwB7C,MAAM,oBAAoB,GAAG,CAAC,CAAA;AAC9B,MAAM,2BAA2B,GAAG,MAAM,CAAA;AAE1C,+EAA+E;AAC/E,4EAA4E;AAC5E,8EAA8E;AAC9E,+EAA+E;AAC/E,2EAA2E;AAC3E,6BAA6B;AAC7B,EAAE;AACF,mEAAmE;AACnE,6EAA6E;AAC7E,2DAA2D;AAC3D,MAAM,CAAC,KAAK,UAAU,iBAAiB,CAAC,IAAyB;IAC/D,OAAO,qBAAqB,CAAC,IAAI,EAAE,MAAM,CAAC,CAAA;AAC5C,CAAC;AAED,+EAA+E;AAC/E,+EAA+E;AAC/E,6EAA6E;AAC7E,0EAA0E;AAC1E,MAAM,CAAC,KAAK,UAAU,qBAAqB,CAAC,IAAyB;IACnE,OAAO,qBAAqB,CAAC,IAAI,EAAE,OAAO,CAAC,CAAA;AAC7C,CAAC;AAED,KAAK,UAAU,qBAAqB,CAAC,IAAyB,EAAE,MAAwB;IACtF,MAAM,MAAM,GAAG,mBAAmB,CAAC,IAAI,CAAC,UAAU,CAAC,CAAA;IAEnD,MAAM,IAAI,GAAG,IAAI,cAAc,EAAE,CAAA;IACjC,MAAM,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAA;IAEtD,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,CAAA;IACtC,IAAI,eAAe,GAA4C,IAAI,CAAA;IACnE,IAAI,eAAe,GAAyC,IAAI,CAAA;IAChE,MAAM,eAAe,GAAG,IAAI,OAAO,CAAoB,CAAC,OAAO,EAAE,EAAE;QACjE,eAAe,GAAG,OAAO,CAAA;QACzB,eAAe,GAAG,UAAU,CAAC,GAAG,EAAE;YAChC,eAAe,GAAG,IAAI,CAAA;YACtB,OAAO,CAAC,IAAI,CAAC,CAAA;QACf,CAAC,EAAE,2BAA2B,CAAC,CAAA;IACjC,CAAC,CAAC,CAAA;IACF,IAAI,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE;QACnB,IAAI,IAAI,CAAC,MAAM,KAAK,UAAU,IAAI,eAAe,EAAE,CAAC;YAClD,IAAI,eAAe,EAAE,CAAC;gBACpB,YAAY,CAAC,eAAe,CAAC,CAAA;gBAC7B,eAAe,GAAG,IAAI,CAAA;YACxB,CAAC;YACD,eAAe,CAAC,IAAI,CAAC,CAAA;YACrB,eAAe,GAAG,IAAI,CAAA;QACxB,CAAC;IACH,CAAC,CAAC,CAAA;IAEF,IAAI,CAAC;QACH,MAAM,QAAQ,GAA4B;YACxC,CAAC,EAAE,IAAI,CAAC,SAAS;YACjB,CAAC,EAAE,SAAS;YACZ,CAAC,EAAE,IAAI,CAAC,OAAO;YACf,CAAC,EAAE,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,MAAM,CAAC;YAC/B,EAAE,EAAE,MAAM,CAAC,EAAE;YACb,EAAE,EAAE,MAAM,CAAC,UAAU;YACrB,EAAE,EAAE,oBAAoB;YACxB,EAAE,EAAE,MAAM;SACX,CAAA;QACD,IAAI,MAAM,KAAK,MAAM,EAAE,CAAC;YACtB,QAAQ,CAAC,CAAC,GAAG,IAAI,CAAC,QAAQ,CAAA;YAC1B,QAAQ,CAAC,CAAC,GAAG,IAAI,CAAC,MAAM,CAAA;YACxB,QAAQ,CAAC,GAAG,GAAG,IAAI,CAAC,GAAG,CAAA;YACvB,QAAQ,CAAC,EAAE,GAAG,IAAI,CAAA;YAClB,IAAI,OAAO,IAAI,CAAC,KAAK,KAAK,QAAQ;gBAAE,QAAQ,CAAC,CAAC,GAAG,IAAI,CAAC,KAAK,CAAA;YAC3D,IAAI,OAAO,IAAI,CAAC,MAAM,KAAK,QAAQ;gBAAE,QAAQ,CAAC,CAAC,GAAG,IAAI,CAAC,MAAM,CAAA;QAC/D,CAAC;aAAM,CAAC;YACN,QAAQ,CAAC,EAAE,GAAG,CAAC,CAAA;YACf,QAAQ,CAAC,GAAG,GAAG,CAAC,CAAA;QAClB,CAAC;QAED,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAA;QACxD,MAAM,aAAa,GAAI,QAAQ,CAAC,IAAgC,CAAC,CAAC,CAAA;QAClE,MAAM,UAAU,GAAG,OAAO,aAAa,KAAK,QAAQ,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,CAAA;QAExE,MAAM,WAAW,GAAG,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAA;QAClD,IAAI,WAAW,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC3B,MAAM,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,CAAA;YAC7C,IAAI,CAAC,UAAU,EAAE,CAAC,SAAS,EAAE,SAAS,CAAC,CAAA;QACzC,CAAC;QAED,MAAM,cAAc,GAAG,MAAM,eAAe,CAAA;QAC5C,MAAM,cAAc,GAAG,QAAQ,CAAC,UAAU,CAAA;QAE1C,OAAO;YACL,cAAc;YACd,cAAc;YACd,UAAU;SACX,CAAA;IACH,CAAC;YAAS,CAAC;QACT,IAAI,eAAe,EAAE,CAAC;YACpB,YAAY,CAAC,eAAe,CAAC,CAAA;YAC7B,eAAe,GAAG,IAAI,CAAA;QACxB,CAAC;QACD,IAAI,CAAC,KAAK,EAAE,CAAA;IACd,CAAC;AACH,CAAC"}
@@ -1,5 +1,6 @@
1
1
  import { Long } from 'bson';
2
2
  import type { KakaoDeviceType } from '../types.js';
3
+ import { LocoConnection } from './connection.js';
3
4
  import type { LoginListResponse, LocoPacket, SyncState } from './types.js';
4
5
  export declare class LocoSession {
5
6
  private connection;
@@ -10,6 +11,11 @@ export declare class LocoSession {
10
11
  login(oauthToken: string, userId: string, deviceUuid: string, syncState?: SyncState, deviceType?: KakaoDeviceType): Promise<LoginListResponse>;
11
12
  private bookAndCheckin;
12
13
  sendMessage(chatId: Long, text: string): Promise<LocoPacket>;
14
+ sendAttachment(chatId: Long, type: number, extra: Record<string, unknown>, caption?: string): Promise<LocoPacket>;
15
+ shipMedia(chatId: Long, type: number, size: number, checksum: string, extension: string): Promise<LocoPacket>;
16
+ shipMultiMedia(chatId: Long, type: number, sizes: number[], checksums: string[], extensions: string[]): Promise<LocoPacket>;
17
+ forwardChat(chatId: Long, type: number, extra: Record<string, unknown>, caption?: string): Promise<LocoPacket>;
18
+ getConnection(): LocoConnection | null;
13
19
  syncMessages(chatId: Long, count?: number, cursor?: Long, maxLogId?: Long): Promise<LocoPacket>;
14
20
  getChatLogs(chatIds: Long[], sinces: Long[]): Promise<LocoPacket>;
15
21
  getChatInfo(chatId: Long): Promise<LocoPacket>;
@@ -1 +1 @@
1
- {"version":3,"file":"session.d.ts","sourceRoot":"","sources":["../../../../../src/platforms/kakaotalk/protocol/session.ts"],"names":[],"mappings":"AAAA,OAAO,EAAU,IAAI,EAAE,MAAM,MAAM,CAAA;AAEnC,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,UAAU,CAAA;AAe/C,OAAO,KAAK,EAAoC,iBAAiB,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,SAAS,CAAA;AAEzG,qBAAa,WAAW;IACtB,OAAO,CAAC,UAAU,CAA8B;IAChD,OAAO,CAAC,SAAS,CAA8C;IAC/D,OAAO,CAAC,WAAW,CAA8C;IACjE,OAAO,CAAC,YAAY,CAA4B;IAChD,OAAO,CAAC,UAAU,CAA4B;IAExC,KAAK,CACT,UAAU,EAAE,MAAM,EAClB,MAAM,EAAE,MAAM,EACd,UAAU,EAAE,MAAM,EAClB,SAAS,CAAC,EAAE,SAAS,EACrB,UAAU,CAAC,EAAE,eAAe,GAC3B,OAAO,CAAC,iBAAiB,CAAC;YA4Cf,cAAc;IA0CtB,WAAW,CAAC,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC;IAU5D,YAAY,CAAC,MAAM,EAAE,IAAI,EAAE,KAAK,SAAK,EAAE,MAAM,CAAC,EAAE,IAAI,EAAE,QAAQ,CAAC,EAAE,IAAI,GAAG,OAAO,CAAC,UAAU,CAAC;IAU3F,WAAW,CAAC,OAAO,EAAE,IAAI,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,OAAO,CAAC,UAAU,CAAC;IAQjE,WAAW,CAAC,MAAM,EAAE,IAAI,GAAG,OAAO,CAAC,UAAU,CAAC;IAKpD;;;;;OAKG;IACG,cAAc,CAAC,MAAM,EAAE,IAAI,GAAG,OAAO,CAAC,UAAU,CAAC;IAKvD;;;;;OAKG;IACG,eAAe,CAAC,OAAO,EAAE,IAAI,EAAE,GAAG,OAAO,CAAC,UAAU,CAAC;IAK3D;;;;;OAKG;IACG,aAAa,CAAC,MAAM,EAAE,IAAI,GAAG,OAAO,CAAC,UAAU,CAAC;IAKtD;;;;;OAKG;IACG,eAAe,CAAC,MAAM,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,GAAG,OAAO,CAAC,UAAU,CAAC;IAKrE,WAAW,CAAC,WAAW,CAAC,EAAE,IAAI,EAAE,UAAU,CAAC,EAAE,IAAI,GAAG,OAAO,CAAC,UAAU,CAAC;IAU7E;;;;OAIG;IACG,QAAQ,CAAC,MAAM,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,MAAM,CAAC,EAAE,IAAI,GAAG,OAAO,CAAC,UAAU,CAAC;IASjF,MAAM,CAAC,OAAO,EAAE,CAAC,MAAM,EAAE,UAAU,KAAK,IAAI,GAAG,IAAI;IAOnD,OAAO,CAAC,OAAO,EAAE,MAAM,IAAI,GAAG,IAAI;IAOlC,OAAO,CAAC,SAAS;IAMjB,KAAK,IAAI,IAAI;CAQd"}
1
+ {"version":3,"file":"session.d.ts","sourceRoot":"","sources":["../../../../../src/platforms/kakaotalk/protocol/session.ts"],"names":[],"mappings":"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"}
@@ -86,6 +86,67 @@ export class LocoSession {
86
86
  noSeen: false,
87
87
  });
88
88
  }
89
+ // Sends a WRITE with non-text message_type plus the JSON-stringified `extra`
90
+ // payload that KakaoTalk clients render as the attachment (photo, file, etc).
91
+ // See types.ts → KakaoPhotoExtra / KakaoFileExtra for the per-type shape.
92
+ async sendAttachment(chatId, type, extra, caption = '') {
93
+ if (!this.connection)
94
+ throw new Error('Not connected');
95
+ return this.connection.sendPacket('WRITE', {
96
+ chatId,
97
+ msg: caption,
98
+ type,
99
+ noSeen: false,
100
+ extra: JSON.stringify(extra),
101
+ });
102
+ }
103
+ // SHIP — request a media-upload ticket. Reserves a slot on a media LOCO
104
+ // server and returns the token (k), host (vh), and port (p) the client must
105
+ // connect to next. Sent on the main session.
106
+ async shipMedia(chatId, type, size, checksum, extension) {
107
+ if (!this.connection)
108
+ throw new Error('Not connected');
109
+ const body = {
110
+ c: chatId,
111
+ t: type,
112
+ s: Long.fromNumber(size),
113
+ cs: checksum,
114
+ };
115
+ if (extension.length > 0)
116
+ body.e = extension;
117
+ return this.connection.sendPacket('SHIP', body);
118
+ }
119
+ // MSHIP — multi-file equivalent of SHIP. Per-file fields become parallel
120
+ // arrays (sl/csl/el) and the response carries kl/vhl/pl arrays the caller
121
+ // must fan out across — one MPOST connection per entry.
122
+ async shipMultiMedia(chatId, type, sizes, checksums, extensions) {
123
+ if (!this.connection)
124
+ throw new Error('Not connected');
125
+ return this.connection.sendPacket('MSHIP', {
126
+ c: chatId,
127
+ t: type,
128
+ sl: sizes.map((s) => Long.fromNumber(s)),
129
+ csl: checksums,
130
+ el: extensions,
131
+ });
132
+ }
133
+ // FORWARD — used after MPOST: registers a multi-attachment chatlog as one
134
+ // message. Same shape as WRITE but the server routes the attachment to
135
+ // multi-media rendering (galleries, multi-photo posts).
136
+ async forwardChat(chatId, type, extra, caption = '') {
137
+ if (!this.connection)
138
+ throw new Error('Not connected');
139
+ return this.connection.sendPacket('FORWARD', {
140
+ chatId,
141
+ msg: caption,
142
+ type,
143
+ noSeen: false,
144
+ extra: JSON.stringify(extra),
145
+ });
146
+ }
147
+ getConnection() {
148
+ return this.connection;
149
+ }
89
150
  async syncMessages(chatId, count = 20, cursor, maxLogId) {
90
151
  if (!this.connection)
91
152
  throw new Error('Not connected');