@zhin.js/adapter-qq 5.0.0 → 5.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 (80) hide show
  1. package/CHANGELOG.md +16 -0
  2. package/README.md +40 -1
  3. package/dist/index.js +2 -2
  4. package/lib/adapter.d.ts +10 -3
  5. package/lib/adapter.d.ts.map +1 -1
  6. package/lib/adapter.js +12 -4
  7. package/lib/adapter.js.map +1 -1
  8. package/lib/endpoint.d.ts +5 -0
  9. package/lib/endpoint.d.ts.map +1 -1
  10. package/lib/endpoint.js +79 -2
  11. package/lib/endpoint.js.map +1 -1
  12. package/lib/group-at-normalize.d.ts.map +1 -1
  13. package/lib/group-at-normalize.js +2 -5
  14. package/lib/group-at-normalize.js.map +1 -1
  15. package/lib/inbound-action.d.ts +15 -0
  16. package/lib/inbound-action.d.ts.map +1 -0
  17. package/lib/inbound-action.js +57 -0
  18. package/lib/inbound-action.js.map +1 -0
  19. package/lib/index.js +3 -3
  20. package/lib/mention-enrich.d.ts +12 -0
  21. package/lib/mention-enrich.d.ts.map +1 -0
  22. package/lib/mention-enrich.js +52 -0
  23. package/lib/mention-enrich.js.map +1 -0
  24. package/lib/outbound-keyboard.d.ts +4 -0
  25. package/lib/outbound-keyboard.d.ts.map +1 -0
  26. package/lib/outbound-keyboard.js +96 -0
  27. package/lib/outbound-keyboard.js.map +1 -0
  28. package/lib/outbound-markdown.d.ts +16 -4
  29. package/lib/outbound-markdown.d.ts.map +1 -1
  30. package/lib/outbound-markdown.js +116 -17
  31. package/lib/outbound-markdown.js.map +1 -1
  32. package/lib/outbound-media.d.ts +2 -0
  33. package/lib/outbound-media.d.ts.map +1 -1
  34. package/lib/outbound-media.js +2 -1
  35. package/lib/outbound-media.js.map +1 -1
  36. package/lib/outbound-mixed-media.d.ts +21 -0
  37. package/lib/outbound-mixed-media.d.ts.map +1 -0
  38. package/lib/outbound-mixed-media.js +78 -0
  39. package/lib/outbound-mixed-media.js.map +1 -0
  40. package/lib/platform-permit.js +2 -2
  41. package/lib/qq-bind-api.d.ts +10 -0
  42. package/lib/qq-bind-api.d.ts.map +1 -1
  43. package/lib/qq-bind-api.js +9 -5
  44. package/lib/qq-bind-api.js.map +1 -1
  45. package/lib/qq-bind-flow.d.ts +1 -0
  46. package/lib/qq-bind-flow.d.ts.map +1 -1
  47. package/lib/qq-bind-flow.js +11 -2
  48. package/lib/qq-bind-flow.js.map +1 -1
  49. package/lib/qq-bind-persist.d.ts +11 -0
  50. package/lib/qq-bind-persist.d.ts.map +1 -0
  51. package/lib/qq-bind-persist.js +52 -0
  52. package/lib/qq-bind-persist.js.map +1 -0
  53. package/lib/qq-endpoint-manager.d.ts.map +1 -1
  54. package/lib/qq-endpoint-manager.js +43 -8
  55. package/lib/qq-endpoint-manager.js.map +1 -1
  56. package/lib/segment-mapper.d.ts +2 -0
  57. package/lib/segment-mapper.d.ts.map +1 -0
  58. package/lib/segment-mapper.js +2 -0
  59. package/lib/segment-mapper.js.map +1 -0
  60. package/lib/types.d.ts +7 -0
  61. package/lib/types.d.ts.map +1 -1
  62. package/package.json +16 -16
  63. package/skills/qq/PERMITS.md +1 -1
  64. package/src/adapter.ts +12 -4
  65. package/src/endpoint.ts +119 -6
  66. package/src/group-at-normalize.ts +2 -4
  67. package/src/inbound-action.ts +87 -0
  68. package/src/index.ts +4 -4
  69. package/src/mention-enrich.ts +71 -0
  70. package/src/outbound-keyboard.ts +118 -0
  71. package/src/outbound-markdown.ts +127 -17
  72. package/src/outbound-media.ts +2 -1
  73. package/src/outbound-mixed-media.ts +101 -0
  74. package/src/platform-permit.ts +2 -2
  75. package/src/qq-bind-api.ts +24 -5
  76. package/src/qq-bind-flow.ts +13 -3
  77. package/src/qq-bind-persist.ts +71 -0
  78. package/src/qq-endpoint-manager.ts +62 -9
  79. package/src/segment-mapper.ts +1 -0
  80. package/src/types.ts +7 -0
@@ -0,0 +1,57 @@
1
+ import { Message } from 'zhin.js';
2
+ /** `group-{openid}:{msgId}` → 平台 msg_id */
3
+ export function stripQqOutboundMessageId(storedId) {
4
+ const match = /^(?:private|group|channel|direct)-[^:]+:(.+)$/.exec(storedId);
5
+ return match ? match[1] : storedId;
6
+ }
7
+ function prependReply(content, msgId) {
8
+ const items = Array.isArray(content) ? [...content] : [content];
9
+ items.unshift({ type: 'reply', data: { id: msgId } });
10
+ return items;
11
+ }
12
+ function createQqActionReplyHandler(send) {
13
+ return async (content, quote = false) => {
14
+ const outbound = typeof quote === 'string'
15
+ ? prependReply(content, stripQqOutboundMessageId(quote))
16
+ : content;
17
+ return await send(outbound);
18
+ };
19
+ }
20
+ export function formatQqActionMessage(event, options) {
21
+ const resolved = event.data?.resolved;
22
+ const buttonId = String(resolved?.button_id ?? '');
23
+ const buttonData = resolved?.button_data != null ? String(resolved.button_data) : '';
24
+ const payload = buttonData || buttonId;
25
+ const sourceMessageId = resolved?.message_id != null ? String(resolved.message_id) : undefined;
26
+ let channelType = 'private';
27
+ let channelId = String(event.operator_id ?? '');
28
+ if (event.notice_type === 'group') {
29
+ channelType = 'group';
30
+ channelId = String(event.group_id);
31
+ }
32
+ else if (event.notice_type === 'guild') {
33
+ channelType = 'channel';
34
+ channelId = String(event.channel_id);
35
+ }
36
+ const senderId = String(event.operator_id ?? '');
37
+ return Message.from(event, {
38
+ $id: event.notice_id ?? event.event_id ?? `action:${Date.now()}`,
39
+ $adapter: 'qq',
40
+ $endpoint: options.endpointName,
41
+ $sender: { id: senderId, name: senderId },
42
+ $channel: { id: channelId, type: channelType },
43
+ $content: [{
44
+ type: 'action',
45
+ data: {
46
+ id: buttonId,
47
+ payload,
48
+ sourceMessageId,
49
+ },
50
+ }],
51
+ $raw: payload,
52
+ $timestamp: Date.now(),
53
+ $recall: async () => { },
54
+ $reply: createQqActionReplyHandler(options.send),
55
+ });
56
+ }
57
+ //# sourceMappingURL=inbound-action.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"inbound-action.js","sourceRoot":"","sources":["../src/inbound-action.ts"],"names":[],"mappings":"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"}
package/lib/index.js CHANGED
@@ -2,7 +2,7 @@
2
2
  * QQ 官方适配器入口:类型扩展、导出、注册
3
3
  */
4
4
  import path from "node:path";
5
- import { usePlugin, createGroupManagementTools } from "zhin.js";
5
+ import { usePlugin, createSceneManagementTools } from "zhin.js";
6
6
  import { QQAdapter } from "./adapter.js";
7
7
  import { platformPermit, qqGuildPermitResolver, registerQqPlatformPermitChecker, } from "./platform-permit.js";
8
8
  import { disposeQqEndpointProvision } from "./qq-endpoint-manager.js";
@@ -31,8 +31,8 @@ useContext("router", (router) => {
31
31
  useContext('tool', 'qq', (toolService, qq) => {
32
32
  const disposers = [];
33
33
  disposers.push(registerQqPlatformPermitChecker());
34
- const groupTools = createGroupManagementTools(qq, 'qq', { permitResolver: qqGuildPermitResolver, registerChecker: false });
35
- disposers.push(...groupTools.map(t => toolService.addTool(t, plugin.name)));
34
+ const sceneTools = createSceneManagementTools(qq, 'qq', { permitResolver: qqGuildPermitResolver, registerChecker: false });
35
+ disposers.push(...sceneTools.map(t => toolService.addTool(t, plugin.name)));
36
36
  // 获取频道列表
37
37
  disposers.push(toolService.addTool({
38
38
  name: 'qq_list_guilds',
@@ -0,0 +1,12 @@
1
+ import type { Segment } from 'zhin.js';
2
+ import type { QQAdapter } from './adapter.js';
3
+ type MentionWire = {
4
+ id?: string;
5
+ member_openid?: string;
6
+ username?: string;
7
+ nickname?: string;
8
+ };
9
+ /** 为 canonical mention 段补齐展示名(平台 payload / endpoint 配置)。 */
10
+ export declare function enrichCanonicalMentionNames(segments: Segment[], adapter: QQAdapter, wireMentions?: MentionWire[]): Segment[];
11
+ export {};
12
+ //# sourceMappingURL=mention-enrich.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mention-enrich.d.ts","sourceRoot":"","sources":["../src/mention-enrich.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AACvC,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAE9C,KAAK,WAAW,GAAG;IACjB,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB,CAAC;AAgCF,4DAA4D;AAC5D,wBAAgB,2BAA2B,CACzC,QAAQ,EAAE,OAAO,EAAE,EACnB,OAAO,EAAE,SAAS,EAClB,YAAY,CAAC,EAAE,WAAW,EAAE,GAC3B,OAAO,EAAE,CAyBX"}
@@ -0,0 +1,52 @@
1
+ function mentionWireId(row) {
2
+ return String(row.id ?? row.member_openid ?? '').trim();
3
+ }
4
+ function mentionWireName(row) {
5
+ const name = row.username ?? row.nickname;
6
+ return typeof name === 'string' && name.trim() ? name.trim() : undefined;
7
+ }
8
+ function endpointLookupIds(endpoint) {
9
+ const cfg = endpoint.$config;
10
+ return [
11
+ endpoint.$platformUserId,
12
+ cfg.appid,
13
+ cfg.name,
14
+ endpoint.$id,
15
+ ].filter((id) => Boolean(id)).map(String);
16
+ }
17
+ function resolveEndpointDisplayName(endpoint) {
18
+ const cfg = endpoint.$config;
19
+ return cfg.nickname?.trim() || cfg.name?.trim() || endpoint.$id;
20
+ }
21
+ /** 为 canonical mention 段补齐展示名(平台 payload / endpoint 配置)。 */
22
+ export function enrichCanonicalMentionNames(segments, adapter, wireMentions) {
23
+ const nameById = new Map();
24
+ for (const row of wireMentions ?? []) {
25
+ const id = mentionWireId(row);
26
+ const name = mentionWireName(row);
27
+ if (id && name)
28
+ nameById.set(id, name);
29
+ }
30
+ for (const endpoint of adapter.endpoints.values()) {
31
+ const display = resolveEndpointDisplayName(endpoint);
32
+ if (!display)
33
+ continue;
34
+ for (const id of endpointLookupIds(endpoint)) {
35
+ if (!nameById.has(id))
36
+ nameById.set(id, display);
37
+ }
38
+ }
39
+ return segments.map((seg) => {
40
+ if (seg.type !== 'mention')
41
+ return seg;
42
+ const data = seg.data;
43
+ const target = String(data.target ?? '').trim();
44
+ if (!target || data.name)
45
+ return seg;
46
+ const name = nameById.get(target);
47
+ if (!name)
48
+ return seg;
49
+ return { ...seg, data: { target, name } };
50
+ });
51
+ }
52
+ //# sourceMappingURL=mention-enrich.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mention-enrich.js","sourceRoot":"","sources":["../src/mention-enrich.ts"],"names":[],"mappings":"AAgBA,SAAS,aAAa,CAAC,GAAgB;IACrC,OAAO,MAAM,CAAC,GAAG,CAAC,EAAE,IAAI,GAAG,CAAC,aAAa,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;AAC1D,CAAC;AAED,SAAS,eAAe,CAAC,GAAgB;IACvC,MAAM,IAAI,GAAG,GAAG,CAAC,QAAQ,IAAI,GAAG,CAAC,QAAQ,CAAC;IAC1C,OAAO,OAAO,IAAI,KAAK,QAAQ,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC;AAC3E,CAAC;AAED,SAAS,iBAAiB,CAAC,QAAwB;IACjD,MAAM,GAAG,GAAG,QAAQ,CAAC,OAAO,CAAC;IAC7B,OAAO;QACL,QAAQ,CAAC,eAAe;QACxB,GAAG,CAAC,KAAK;QACT,GAAG,CAAC,IAAI;QACR,QAAQ,CAAC,GAAG;KACb,CAAC,MAAM,CAAC,CAAC,EAAE,EAAgB,EAAE,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;AAC1D,CAAC;AAED,SAAS,0BAA0B,CAAC,QAAwB;IAC1D,MAAM,GAAG,GAAG,QAAQ,CAAC,OAAO,CAAC;IAC7B,OAAO,GAAG,CAAC,QAAQ,EAAE,IAAI,EAAE,IAAI,GAAG,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,QAAQ,CAAC,GAAG,CAAC;AAClE,CAAC;AAED,4DAA4D;AAC5D,MAAM,UAAU,2BAA2B,CACzC,QAAmB,EACnB,OAAkB,EAClB,YAA4B;IAE5B,MAAM,QAAQ,GAAG,IAAI,GAAG,EAAkB,CAAC;IAC3C,KAAK,MAAM,GAAG,IAAI,YAAY,IAAI,EAAE,EAAE,CAAC;QACrC,MAAM,EAAE,GAAG,aAAa,CAAC,GAAG,CAAC,CAAC;QAC9B,MAAM,IAAI,GAAG,eAAe,CAAC,GAAG,CAAC,CAAC;QAClC,IAAI,EAAE,IAAI,IAAI;YAAE,QAAQ,CAAC,GAAG,CAAC,EAAE,EAAE,IAAI,CAAC,CAAC;IACzC,CAAC;IAED,KAAK,MAAM,QAAQ,IAAI,OAAO,CAAC,SAAS,CAAC,MAAM,EAAE,EAAE,CAAC;QAClD,MAAM,OAAO,GAAG,0BAA0B,CAAC,QAAQ,CAAC,CAAC;QACrD,IAAI,CAAC,OAAO;YAAE,SAAS;QACvB,KAAK,MAAM,EAAE,IAAI,iBAAiB,CAAC,QAAQ,CAAC,EAAE,CAAC;YAC7C,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;gBAAE,QAAQ,CAAC,GAAG,CAAC,EAAE,EAAE,OAAO,CAAC,CAAC;QACnD,CAAC;IACH,CAAC;IAED,OAAO,QAAQ,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE;QAC1B,IAAI,GAAG,CAAC,IAAI,KAAK,SAAS;YAAE,OAAO,GAAG,CAAC;QACvC,MAAM,IAAI,GAAG,GAAG,CAAC,IAA0C,CAAC;QAC5D,MAAM,MAAM,GAAG,MAAM,CAAC,IAAI,CAAC,MAAM,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;QAChD,IAAI,CAAC,MAAM,IAAI,IAAI,CAAC,IAAI;YAAE,OAAO,GAAG,CAAC;QACrC,MAAM,IAAI,GAAG,QAAQ,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;QAClC,IAAI,CAAC,IAAI;YAAE,OAAO,GAAG,CAAC;QACtB,OAAO,EAAE,GAAG,GAAG,EAAE,IAAI,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,EAAE,CAAC;IAC5C,CAAC,CAAC,CAAC;AACL,CAAC"}
@@ -0,0 +1,4 @@
1
+ import type { SendContent } from "zhin.js";
2
+ /** QQ 官方出站:keyboard → button 行;前置 text 合并为 markdown(按钮消息需带 markdown) */
3
+ export declare function expandKeyboardSegmentsForQq(content: SendContent): SendContent;
4
+ //# sourceMappingURL=outbound-keyboard.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"outbound-keyboard.d.ts","sourceRoot":"","sources":["../src/outbound-keyboard.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAkB,WAAW,EAAE,MAAM,SAAS,CAAC;AA8D3D,wEAAwE;AACxE,wBAAgB,2BAA2B,CAAC,OAAO,EAAE,WAAW,GAAG,WAAW,CAiD7E"}
@@ -0,0 +1,96 @@
1
+ import { isKeyboardSegment, KeyboardSegment } from "zhin.js";
2
+ function asKeyboardData(item) {
3
+ if (item instanceof KeyboardSegment)
4
+ return item.data;
5
+ if (item != null && typeof item === "object" && isKeyboardSegment(item)) {
6
+ return item.data;
7
+ }
8
+ return null;
9
+ }
10
+ function coreButtonToQq(btn) {
11
+ const isCommand = btn.mode === 'command';
12
+ const action = {
13
+ type: isCommand ? 2 : 1,
14
+ permission: { type: 2 },
15
+ data: btn.payload,
16
+ click_limit: btn.disabled ? 0 : 10,
17
+ unsupport_tips: btn.disabled ? "该按钮不可用" : "",
18
+ };
19
+ if (isCommand) {
20
+ if (btn.command?.enter != null)
21
+ action.enter = btn.command.enter;
22
+ if (btn.command?.reply != null)
23
+ action.reply = btn.command.reply;
24
+ }
25
+ return {
26
+ id: btn.id,
27
+ render_data: {
28
+ label: btn.label,
29
+ visited_label: btn.label,
30
+ style: 0,
31
+ },
32
+ action,
33
+ };
34
+ }
35
+ function keyboardDataToQqSegments(data) {
36
+ const out = [];
37
+ for (const row of data.rows) {
38
+ out.push({
39
+ type: "button",
40
+ data: {
41
+ buttons: row.map(coreButtonToQq),
42
+ },
43
+ });
44
+ }
45
+ return out;
46
+ }
47
+ /** QQ 官方出站:keyboard → button 行;前置 text 合并为 markdown(按钮消息需带 markdown) */
48
+ export function expandKeyboardSegmentsForQq(content) {
49
+ const items = Array.isArray(content) ? content : [content];
50
+ const out = [];
51
+ const textParts = [];
52
+ for (const item of items) {
53
+ if (typeof item === "string") {
54
+ textParts.push(item);
55
+ continue;
56
+ }
57
+ const keyboardData = asKeyboardData(item);
58
+ if (keyboardData) {
59
+ if (textParts.length > 0) {
60
+ out.push({
61
+ type: "markdown",
62
+ data: { content: textParts.join("\n") },
63
+ });
64
+ textParts.length = 0;
65
+ }
66
+ out.push(...keyboardDataToQqSegments(keyboardData));
67
+ continue;
68
+ }
69
+ if (item.type === "text") {
70
+ const t = item.data?.text ?? item.data?.content ?? "";
71
+ if (t)
72
+ textParts.push(String(t));
73
+ continue;
74
+ }
75
+ if (textParts.length > 0) {
76
+ out.push({
77
+ type: "markdown",
78
+ data: { content: textParts.join("\n") },
79
+ });
80
+ textParts.length = 0;
81
+ }
82
+ out.push(item);
83
+ }
84
+ if (textParts.length > 0) {
85
+ out.push({
86
+ type: "markdown",
87
+ data: { content: textParts.join("\n") },
88
+ });
89
+ }
90
+ if (out.length === 0)
91
+ return { type: "text", data: { text: "" } };
92
+ if (out.length === 1)
93
+ return out[0];
94
+ return out;
95
+ }
96
+ //# sourceMappingURL=outbound-keyboard.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"outbound-keyboard.js","sourceRoot":"","sources":["../src/outbound-keyboard.ts"],"names":[],"mappings":"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"}
@@ -1,12 +1,24 @@
1
1
  /**
2
2
  * 将 AI 出站纯文本段合并为 QQ Markdown 消息(msg_type=2)。
3
- * 官方已开放全量 Markdown,避免 **bold** 等语法以纯文本展示。
3
+ * 图文混排时合并为单条 Markdown(图片语法见 QQ 官方文档)。
4
4
  */
5
- import { type SendContent } from "zhin.js";
5
+ import { type MessageSegment, type SendContent } from "zhin.js";
6
6
  export type OutboundMarkdownMode = boolean | "auto";
7
+ export declare function asOutboundSegments(content: SendContent): MessageSegment[];
8
+ export declare function splitReplyPrefix(segments: MessageSegment[]): {
9
+ prefix: MessageSegment[];
10
+ body: MessageSegment[];
11
+ };
12
+ /** QQ Markdown 图片语法:![说明 #宽 #高](公网 URL) */
13
+ export declare function formatQqMarkdownImage(url: string, data?: Record<string, unknown>): string;
14
+ /** 将 image 段解析为 Markdown 可嵌入的 URL(https 或 data URI) */
15
+ export declare function resolveImageMarkdownUrl(data: Record<string, unknown>): string | null;
16
+ export declare function isTextImageMixedBody(body: MessageSegment[]): boolean;
17
+ /** 图文混排且含 base64/本地图(无法直接嵌入 Markdown 公网 URL) */
18
+ export declare function isTextImageMixedWithInlineMedia(body: MessageSegment[]): boolean;
7
19
  /**
8
- * 出站归一化:保留 leading `reply`,将连续 text 合并为单条 markdown 段。
9
- * 含图片/文件等富媒体时原样返回,避免破坏分条发送。
20
+ * 出站归一化:保留 leading `reply`,将连续 text 或 text+image 合并为单条 markdown 段。
21
+ * 含内联 base64 图的图文混排须走 outbound-mixed-media(msg_type=7),此处不处理。
10
22
  */
11
23
  export declare function normalizeOutboundMarkdown(content: SendContent, mode?: OutboundMarkdownMode | undefined): SendContent;
12
24
  //# sourceMappingURL=outbound-markdown.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"outbound-markdown.d.ts","sourceRoot":"","sources":["../src/outbound-markdown.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,EAAqD,KAAK,WAAW,EAAE,MAAM,SAAS,CAAC;AAM9F,MAAM,MAAM,oBAAoB,GAAG,OAAO,GAAG,MAAM,CAAC;AA4CpD;;;GAGG;AACH,wBAAgB,yBAAyB,CACvC,OAAO,EAAE,WAAW,EACpB,IAAI,GAAE,oBAAoB,GAAG,SAAkB,GAC9C,WAAW,CA+Bb"}
1
+ {"version":3,"file":"outbound-markdown.d.ts","sourceRoot":"","sources":["../src/outbound-markdown.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,EAAgC,KAAK,cAAc,EAAE,KAAK,WAAW,EAAE,MAAM,SAAS,CAAC;AAO9F,MAAM,MAAM,oBAAoB,GAAG,OAAO,GAAG,MAAM,CAAC;AAwBpD,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,WAAW,GAAG,cAAc,EAAE,CAQzE;AAED,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,cAAc,EAAE,GAAG;IAC5D,MAAM,EAAE,cAAc,EAAE,CAAC;IACzB,IAAI,EAAE,cAAc,EAAE,CAAC;CACxB,CAQA;AAkBD,2CAA2C;AAC3C,wBAAgB,qBAAqB,CACnC,GAAG,EAAE,MAAM,EACX,IAAI,GAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAM,GACjC,MAAM,CAKR;AAED,uDAAuD;AACvD,wBAAgB,uBAAuB,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,GAAG,IAAI,CAiBpF;AAED,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,cAAc,EAAE,GAAG,OAAO,CAMpE;AAED,gDAAgD;AAChD,wBAAgB,+BAA+B,CAAC,IAAI,EAAE,cAAc,EAAE,GAAG,OAAO,CAU/E;AA8BD;;;GAGG;AACH,wBAAgB,yBAAyB,CACvC,OAAO,EAAE,WAAW,EACpB,IAAI,GAAE,oBAAoB,GAAG,SAAkB,GAC9C,WAAW,CAyCb"}
@@ -1,15 +1,15 @@
1
1
  /**
2
2
  * 将 AI 出站纯文本段合并为 QQ Markdown 消息(msg_type=2)。
3
- * 官方已开放全量 Markdown,避免 **bold** 等语法以纯文本展示。
3
+ * 图文混排时合并为单条 Markdown(图片语法见 QQ 官方文档)。
4
4
  */
5
5
  import { segment } from "zhin.js";
6
+ import { resolveMediaFile } from "./outbound-media.js";
6
7
  function isMessageSegment(seg) {
7
8
  return typeof seg.type === "string";
8
9
  }
9
10
  /** 常见 AI Markdown 输出特征(auto 模式) */
10
11
  const MARKDOWN_HINT = /(?:\*\*|__|`|\[.+\]\(.+\)|^#{1,6}\s|^>\s|^\s*[-*+]\s|^```|\|.+\|)/m;
11
- const BODY_RICH_TYPES = new Set([
12
- "image",
12
+ const BLOCKING_RICH_TYPES = new Set([
13
13
  "audio",
14
14
  "video",
15
15
  "file",
@@ -20,10 +20,11 @@ const BODY_RICH_TYPES = new Set([
20
20
  "button",
21
21
  "face",
22
22
  ]);
23
+ const TEXT_IMAGE_MIX_TYPES = new Set(["text", "at", "image"]);
23
24
  function textSegment(text) {
24
25
  return { type: "text", data: { text } };
25
26
  }
26
- function asSegments(content) {
27
+ export function asOutboundSegments(content) {
27
28
  if (typeof content === "string")
28
29
  return [textSegment(content)];
29
30
  if (!Array.isArray(content)) {
@@ -31,36 +32,134 @@ function asSegments(content) {
31
32
  }
32
33
  return content.flatMap((item) => typeof item === "string" ? [textSegment(item)] : isMessageSegment(item) ? [item] : []);
33
34
  }
35
+ export function splitReplyPrefix(segments) {
36
+ const prefix = [];
37
+ let i = 0;
38
+ while (i < segments.length && segments[i].type === "reply") {
39
+ prefix.push(segments[i]);
40
+ i++;
41
+ }
42
+ return { prefix, body: segments.slice(i) };
43
+ }
34
44
  function textFromSegment(seg) {
35
45
  if (seg.type !== "text")
36
46
  return "";
37
47
  return seg.data.text ?? seg.data.content ?? "";
38
48
  }
39
- function shouldConvert(mode, bodyText) {
49
+ function isRemoteUrl(value) {
50
+ return /^https?:\/\//i.test(value);
51
+ }
52
+ function isInlineMedia(value) {
53
+ return value.startsWith("base64://")
54
+ || /^data:[^/]+\/[^;]+;base64,/i.test(value)
55
+ || value.startsWith("file://")
56
+ || (value.startsWith("/") && !isRemoteUrl(value));
57
+ }
58
+ /** QQ Markdown 图片语法:![说明 #宽 #高](公网 URL) */
59
+ export function formatQqMarkdownImage(url, data = {}) {
60
+ const width = typeof data.width === "number" && data.width > 0 ? data.width : 200;
61
+ const height = typeof data.height === "number" && data.height > 0 ? data.height : width;
62
+ const label = typeof data.name === "string" && data.name.trim() ? data.name.trim() : "图片";
63
+ return `![${label} #${width}px #${height}px](${url})`;
64
+ }
65
+ /** 将 image 段解析为 Markdown 可嵌入的 URL(https 或 data URI) */
66
+ export function resolveImageMarkdownUrl(data) {
67
+ const url = typeof data.url === "string" ? data.url : undefined;
68
+ const file = resolveMediaFile(data);
69
+ if (url && isRemoteUrl(url))
70
+ return url;
71
+ if (file && isRemoteUrl(file))
72
+ return file;
73
+ const inline = file ?? (url && isInlineMedia(url) ? url : undefined);
74
+ if (!inline)
75
+ return null;
76
+ if (inline.startsWith("base64://")) {
77
+ return `data:image/png;base64,${inline.slice(9)}`;
78
+ }
79
+ if (/^data:[^/]+\/[^;]+;base64,/i.test(inline)) {
80
+ return inline;
81
+ }
82
+ return null;
83
+ }
84
+ export function isTextImageMixedBody(body) {
85
+ if (body.length === 0)
86
+ return false;
87
+ if (body.some((seg) => !TEXT_IMAGE_MIX_TYPES.has(seg.type)))
88
+ return false;
89
+ const hasImage = body.some((seg) => seg.type === "image");
90
+ const hasText = body.some((seg) => seg.type === "text" || seg.type === "at");
91
+ return hasImage && hasText;
92
+ }
93
+ /** 图文混排且含 base64/本地图(无法直接嵌入 Markdown 公网 URL) */
94
+ export function isTextImageMixedWithInlineMedia(body) {
95
+ if (!isTextImageMixedBody(body))
96
+ return false;
97
+ return body.some((seg) => {
98
+ if (seg.type !== "image")
99
+ return false;
100
+ const url = typeof seg.data.url === "string" ? seg.data.url : undefined;
101
+ const file = resolveMediaFile(seg.data);
102
+ if (url && isRemoteUrl(url))
103
+ return false;
104
+ if (file && isRemoteUrl(file))
105
+ return false;
106
+ return Boolean(resolveMediaFile(seg.data) || (url && isInlineMedia(url)));
107
+ });
108
+ }
109
+ function segmentToMarkdownPart(seg) {
110
+ if (seg.type === "text")
111
+ return textFromSegment(seg);
112
+ if (seg.type === "at")
113
+ return `<@${String(seg.data.user_id ?? "")}>`;
114
+ if (seg.type === "image") {
115
+ const src = resolveImageMarkdownUrl(seg.data);
116
+ return src ? formatQqMarkdownImage(src, seg.data) : "";
117
+ }
118
+ return "";
119
+ }
120
+ function shouldConvertTextOnly(mode, bodyText) {
40
121
  if (mode === false)
41
122
  return false;
42
123
  if (mode === true)
43
124
  return bodyText.trim().length > 0;
44
125
  return MARKDOWN_HINT.test(bodyText);
45
126
  }
127
+ function mergeTextImageToMarkdown(prefix, body) {
128
+ if (body.some((seg) => seg.type === "image" && !resolveImageMarkdownUrl(seg.data))) {
129
+ return null;
130
+ }
131
+ const merged = body.map(segmentToMarkdownPart).join("");
132
+ if (!merged.trim())
133
+ return null;
134
+ return [...prefix, segment("markdown", { content: merged })];
135
+ }
46
136
  /**
47
- * 出站归一化:保留 leading `reply`,将连续 text 合并为单条 markdown 段。
48
- * 含图片/文件等富媒体时原样返回,避免破坏分条发送。
137
+ * 出站归一化:保留 leading `reply`,将连续 text 或 text+image 合并为单条 markdown 段。
138
+ * 含内联 base64 图的图文混排须走 outbound-mixed-media(msg_type=7),此处不处理。
49
139
  */
50
140
  export function normalizeOutboundMarkdown(content, mode = "auto") {
51
- const segments = asSegments(content);
141
+ const segments = asOutboundSegments(content);
52
142
  if (segments.length === 0)
53
143
  return content;
54
- const prefix = [];
55
- let i = 0;
56
- while (i < segments.length && segments[i].type === "reply") {
57
- prefix.push(segments[i]);
58
- i++;
59
- }
60
- const body = segments.slice(i);
144
+ const { prefix, body } = splitReplyPrefix(segments);
61
145
  if (body.length === 0)
62
146
  return content;
63
- if (body.some((seg) => BODY_RICH_TYPES.has(seg.type))) {
147
+ if (mode === false)
148
+ return content;
149
+ if (body.some((seg) => BLOCKING_RICH_TYPES.has(seg.type))) {
150
+ return content;
151
+ }
152
+ if (body.some((seg) => seg.type === "markdown")) {
153
+ return content;
154
+ }
155
+ if (isTextImageMixedBody(body)) {
156
+ if (isTextImageMixedWithInlineMedia(body)) {
157
+ return content;
158
+ }
159
+ const mixed = mergeTextImageToMarkdown(prefix, body);
160
+ return mixed ?? content;
161
+ }
162
+ if (body.some((seg) => seg.type === "image")) {
64
163
  return content;
65
164
  }
66
165
  if (body.some((seg) => seg.type !== "text" && seg.type !== "at")) {
@@ -71,7 +170,7 @@ export function normalizeOutboundMarkdown(content, mode = "auto") {
71
170
  ? `<@${String(seg.data.user_id ?? "")}>`
72
171
  : textFromSegment(seg)))
73
172
  .join("");
74
- if (!shouldConvert(mode, merged))
173
+ if (!shouldConvertTextOnly(mode, merged))
75
174
  return content;
76
175
  return [...prefix, segment("markdown", { content: merged })];
77
176
  }
@@ -1 +1 @@
1
- {"version":3,"file":"outbound-markdown.js","sourceRoot":"","sources":["../src/outbound-markdown.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"outbound-markdown.js","sourceRoot":"","sources":["../src/outbound-markdown.ts"],"names":[],"mappings":"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"}
@@ -4,6 +4,8 @@
4
4
  * base64:// / data:...;base64 须走 data.file 才会解析为 file_data。
5
5
  */
6
6
  import type { SendContent } from "zhin.js";
7
+ /** 解析 image/audio/video/file 段的本地或内联 payload(供 mixed-media 上传复用) */
8
+ export declare function resolveMediaFile(data: Record<string, unknown>): string | undefined;
7
9
  /** 将 Zhin 出站 image/base64 段转为 qq-official-bot 可识别的 file 字段 */
8
10
  export declare function normalizeOutboundMedia(content: SendContent): SendContent;
9
11
  //# sourceMappingURL=outbound-media.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"outbound-media.d.ts","sourceRoot":"","sources":["../src/outbound-media.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,OAAO,KAAK,EAAkC,WAAW,EAAE,MAAM,SAAS,CAAC;AAyC3E,8DAA8D;AAC9D,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,WAAW,GAAG,WAAW,CASxE"}
1
+ {"version":3,"file":"outbound-media.d.ts","sourceRoot":"","sources":["../src/outbound-media.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,OAAO,KAAK,EAAkC,WAAW,EAAE,MAAM,SAAS,CAAC;AAgB3E,oEAAoE;AACpE,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,GAAG,SAAS,CAUlF;AAeD,8DAA8D;AAC9D,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,WAAW,GAAG,WAAW,CASxE"}
@@ -8,7 +8,8 @@ function isRemoteUrl(value) {
8
8
  function isInlineBase64(value) {
9
9
  return value.startsWith("base64://") || /^data:[^/]+\/[^;]+;base64,/i.test(value);
10
10
  }
11
- function resolveMediaFile(data) {
11
+ /** 解析 image/audio/video/file 段的本地或内联 payload(供 mixed-media 上传复用) */
12
+ export function resolveMediaFile(data) {
12
13
  const url = typeof data.url === "string" ? data.url : undefined;
13
14
  const file = typeof data.file === "string" ? data.file : undefined;
14
15
  const base64 = typeof data.base64 === "string" ? data.base64 : undefined;
@@ -1 +1 @@
1
- {"version":3,"file":"outbound-media.js","sourceRoot":"","sources":["../src/outbound-media.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"outbound-media.js","sourceRoot":"","sources":["../src/outbound-media.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,21 @@
1
+ import type { MessageSegment, SendContent } from "zhin.js";
2
+ export declare function buildQqImageUploadPayload(imageSeg: MessageSegment): {
3
+ file_type: 1;
4
+ url?: string;
5
+ file_data?: string;
6
+ };
7
+ export declare function buildTextImageMixedBodyText(body: MessageSegment[]): string;
8
+ export declare function firstImageSegment(body: MessageSegment[]): MessageSegment | undefined;
9
+ export declare function shouldSendTextImageMixedMedia(content: SendContent, mode: boolean | "auto" | undefined): boolean;
10
+ export interface QqMixedMediaMessagePayload {
11
+ msg_type: 7;
12
+ content: string;
13
+ media: {
14
+ file_info: string;
15
+ };
16
+ msg_seq: number;
17
+ msg_id?: string;
18
+ event_id?: string;
19
+ }
20
+ export declare function buildMixedMediaMessagePayload(content: SendContent, fileInfo: string): QqMixedMediaMessagePayload;
21
+ //# sourceMappingURL=outbound-mixed-media.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"outbound-mixed-media.d.ts","sourceRoot":"","sources":["../src/outbound-mixed-media.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,cAAc,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AAyB3D,wBAAgB,yBAAyB,CACvC,QAAQ,EAAE,cAAc,GACvB;IAAE,SAAS,EAAE,CAAC,CAAC;IAAC,GAAG,CAAC,EAAE,MAAM,CAAC;IAAC,SAAS,CAAC,EAAE,MAAM,CAAA;CAAE,CAapD;AAED,wBAAgB,2BAA2B,CAAC,IAAI,EAAE,cAAc,EAAE,GAAG,MAAM,CAQ1E;AAED,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,cAAc,EAAE,GAAG,cAAc,GAAG,SAAS,CAEpF;AAED,wBAAgB,6BAA6B,CAC3C,OAAO,EAAE,WAAW,EACpB,IAAI,EAAE,OAAO,GAAG,MAAM,GAAG,SAAS,GACjC,OAAO,CAIT;AAED,MAAM,WAAW,0BAA0B;IACzC,QAAQ,EAAE,CAAC,CAAC;IACZ,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE;QAAE,SAAS,EAAE,MAAM,CAAA;KAAE,CAAC;IAC7B,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,wBAAgB,6BAA6B,CAC3C,OAAO,EAAE,WAAW,EACpB,QAAQ,EAAE,MAAM,GACf,0BAA0B,CAkB5B"}