@zhin.js/core 1.3.1 → 1.3.2
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.
- package/README.md +59 -4
- package/lib/adapter.d.ts +19 -1
- package/lib/adapter.d.ts.map +1 -1
- package/lib/adapter.js +39 -5
- package/lib/adapter.js.map +1 -1
- package/lib/built/adapter-process.d.ts +11 -1
- package/lib/built/adapter-process.d.ts.map +1 -1
- package/lib/built/adapter-process.js +43 -1
- package/lib/built/adapter-process.js.map +1 -1
- package/lib/built/command.d.ts +2 -0
- package/lib/built/command.d.ts.map +1 -1
- package/lib/built/command.js +13 -1
- package/lib/built/command.js.map +1 -1
- package/lib/built/endpoint-commands.d.ts +4 -0
- package/lib/built/endpoint-commands.d.ts.map +1 -0
- package/lib/built/endpoint-commands.js +102 -0
- package/lib/built/endpoint-commands.js.map +1 -0
- package/lib/built/endpoint-lifecycle-service.d.ts +27 -0
- package/lib/built/endpoint-lifecycle-service.d.ts.map +1 -0
- package/lib/built/endpoint-lifecycle-service.js +219 -0
- package/lib/built/endpoint-lifecycle-service.js.map +1 -0
- package/lib/built/endpoint-manager.d.ts +35 -0
- package/lib/built/endpoint-manager.d.ts.map +1 -0
- package/lib/built/endpoint-manager.js +2 -0
- package/lib/built/endpoint-manager.js.map +1 -0
- package/lib/built/generated-qrcode.d.ts +25 -0
- package/lib/built/generated-qrcode.d.ts.map +1 -0
- package/lib/built/generated-qrcode.js +46 -0
- package/lib/built/generated-qrcode.js.map +1 -0
- package/lib/built/html-renderer-loader.d.ts +12 -0
- package/lib/built/html-renderer-loader.d.ts.map +1 -0
- package/lib/built/html-renderer-loader.js +29 -0
- package/lib/built/html-renderer-loader.js.map +1 -0
- package/lib/built/html-segment-fallback.d.ts +2 -1
- package/lib/built/html-segment-fallback.d.ts.map +1 -1
- package/lib/built/html-segment-fallback.js.map +1 -1
- package/lib/built/introspection-format.d.ts +11 -0
- package/lib/built/introspection-format.d.ts.map +1 -0
- package/lib/built/introspection-format.js +28 -0
- package/lib/built/introspection-format.js.map +1 -0
- package/lib/built/login-assist.d.ts +1 -1
- package/lib/built/login-assist.d.ts.map +1 -1
- package/lib/built/management-command-guard.d.ts +11 -0
- package/lib/built/management-command-guard.d.ts.map +1 -0
- package/lib/built/management-command-guard.js +21 -0
- package/lib/built/management-command-guard.js.map +1 -0
- package/lib/built/outbound-media-contract.d.ts +23 -0
- package/lib/built/outbound-media-contract.d.ts.map +1 -0
- package/lib/built/outbound-media-contract.js +11 -0
- package/lib/built/outbound-media-contract.js.map +1 -0
- package/lib/built/outbound-media-utils.d.ts +10 -0
- package/lib/built/outbound-media-utils.d.ts.map +1 -0
- package/lib/built/outbound-media-utils.js +63 -0
- package/lib/built/outbound-media-utils.js.map +1 -0
- package/lib/built/qrcode-segment.d.ts +19 -0
- package/lib/built/qrcode-segment.d.ts.map +1 -0
- package/lib/built/qrcode-segment.js +79 -0
- package/lib/built/qrcode-segment.js.map +1 -0
- package/lib/built/rich-segments/adapter-policies.d.ts +10 -0
- package/lib/built/rich-segments/adapter-policies.d.ts.map +1 -0
- package/lib/built/rich-segments/adapter-policies.js +28 -0
- package/lib/built/rich-segments/adapter-policies.js.map +1 -0
- package/lib/built/rich-segments/base.d.ts +12 -0
- package/lib/built/rich-segments/base.d.ts.map +1 -0
- package/lib/built/rich-segments/base.js +25 -0
- package/lib/built/rich-segments/base.js.map +1 -0
- package/lib/built/rich-segments/builtins.d.ts +5 -0
- package/lib/built/rich-segments/builtins.d.ts.map +1 -0
- package/lib/built/rich-segments/builtins.js +41 -0
- package/lib/built/rich-segments/builtins.js.map +1 -0
- package/lib/built/rich-segments/capabilities.d.ts +7 -0
- package/lib/built/rich-segments/capabilities.d.ts.map +1 -0
- package/lib/built/rich-segments/capabilities.js +40 -0
- package/lib/built/rich-segments/capabilities.js.map +1 -0
- package/lib/built/rich-segments/html-segment.d.ts +16 -0
- package/lib/built/rich-segments/html-segment.d.ts.map +1 -0
- package/lib/built/rich-segments/html-segment.js +66 -0
- package/lib/built/rich-segments/html-segment.js.map +1 -0
- package/lib/built/rich-segments/index.d.ts +14 -0
- package/lib/built/rich-segments/index.d.ts.map +1 -0
- package/lib/built/rich-segments/index.js +14 -0
- package/lib/built/rich-segments/index.js.map +1 -0
- package/lib/built/rich-segments/markdown-segment.d.ts +15 -0
- package/lib/built/rich-segments/markdown-segment.d.ts.map +1 -0
- package/lib/built/rich-segments/markdown-segment.js +62 -0
- package/lib/built/rich-segments/markdown-segment.js.map +1 -0
- package/lib/built/rich-segments/markdown-to-text.d.ts +4 -0
- package/lib/built/rich-segments/markdown-to-text.d.ts.map +1 -0
- package/lib/built/rich-segments/markdown-to-text.js +28 -0
- package/lib/built/rich-segments/markdown-to-text.js.map +1 -0
- package/lib/built/rich-segments/qrcode-segment.d.ts +19 -0
- package/lib/built/rich-segments/qrcode-segment.d.ts.map +1 -0
- package/lib/built/rich-segments/qrcode-segment.js +74 -0
- package/lib/built/rich-segments/qrcode-segment.js.map +1 -0
- package/lib/built/rich-segments/registry.d.ts +17 -0
- package/lib/built/rich-segments/registry.d.ts.map +1 -0
- package/lib/built/rich-segments/registry.js +53 -0
- package/lib/built/rich-segments/registry.js.map +1 -0
- package/lib/built/rich-segments/resolve.d.ts +6 -0
- package/lib/built/rich-segments/resolve.d.ts.map +1 -0
- package/lib/built/rich-segments/resolve.js +88 -0
- package/lib/built/rich-segments/resolve.js.map +1 -0
- package/lib/built/rich-segments/tts-segment.d.ts +14 -0
- package/lib/built/rich-segments/tts-segment.d.ts.map +1 -0
- package/lib/built/rich-segments/tts-segment.js +52 -0
- package/lib/built/rich-segments/tts-segment.js.map +1 -0
- package/lib/built/rich-segments/types.d.ts +85 -0
- package/lib/built/rich-segments/types.d.ts.map +1 -0
- package/lib/built/rich-segments/types.js +18 -0
- package/lib/built/rich-segments/types.js.map +1 -0
- package/lib/built/schema-endpoint-manager.d.ts +18 -0
- package/lib/built/schema-endpoint-manager.d.ts.map +1 -0
- package/lib/built/schema-endpoint-manager.js +74 -0
- package/lib/built/schema-endpoint-manager.js.map +1 -0
- package/lib/built/speech-loader.d.ts +13 -0
- package/lib/built/speech-loader.d.ts.map +1 -0
- package/lib/built/speech-loader.js +28 -0
- package/lib/built/speech-loader.js.map +1 -0
- package/lib/index.d.ts +14 -0
- package/lib/index.d.ts.map +1 -1
- package/lib/index.js +13 -0
- package/lib/index.js.map +1 -1
- package/lib/message.d.ts +8 -0
- package/lib/message.d.ts.map +1 -1
- package/lib/message.js.map +1 -1
- package/lib/plugin.d.ts.map +1 -1
- package/lib/plugin.js +3 -16
- package/lib/plugin.js.map +1 -1
- package/lib/prompt.js +1 -1
- package/lib/prompt.js.map +1 -1
- package/lib/utils.d.ts +21 -11
- package/lib/utils.d.ts.map +1 -1
- package/lib/utils.js +29 -2
- package/lib/utils.js.map +1 -1
- package/package.json +8 -6
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
const MEDIA_SEGMENT_TYPES = new Set(['image', 'audio', 'video', 'file']);
|
|
2
|
+
export function isRemoteUrl(value) {
|
|
3
|
+
return /^https?:\/\//i.test(value);
|
|
4
|
+
}
|
|
5
|
+
/** 从 message 段 data 提取 base64 Buffer(data: URL / base64:// / raw base64) */
|
|
6
|
+
export function extractBase64Buffer(data) {
|
|
7
|
+
const url = typeof data.url === 'string' ? data.url : undefined;
|
|
8
|
+
const file = typeof data.file === 'string' ? data.file : undefined;
|
|
9
|
+
const base64 = typeof data.base64 === 'string' ? data.base64 : undefined;
|
|
10
|
+
if (url?.startsWith('base64://')) {
|
|
11
|
+
return Buffer.from(url.slice(9), 'base64');
|
|
12
|
+
}
|
|
13
|
+
if (url && /^data:[^/]+\/[^;]+;base64,/i.test(url)) {
|
|
14
|
+
return Buffer.from(url.replace(/^data:[^/]+\/[^;]+;base64,/, ''), 'base64');
|
|
15
|
+
}
|
|
16
|
+
if (file?.startsWith('base64://')) {
|
|
17
|
+
return Buffer.from(file.slice(9), 'base64');
|
|
18
|
+
}
|
|
19
|
+
if (base64) {
|
|
20
|
+
const raw = base64.startsWith('base64://') ? base64.slice(9) : base64;
|
|
21
|
+
return Buffer.from(raw, 'base64');
|
|
22
|
+
}
|
|
23
|
+
return undefined;
|
|
24
|
+
}
|
|
25
|
+
/** 解析本地文件路径(非 http(s) / base64) */
|
|
26
|
+
export function resolveLocalMediaPath(data) {
|
|
27
|
+
const url = typeof data.url === 'string' ? data.url : undefined;
|
|
28
|
+
const file = typeof data.file === 'string' ? data.file : undefined;
|
|
29
|
+
const candidate = file ?? url;
|
|
30
|
+
if (!candidate || isRemoteUrl(candidate))
|
|
31
|
+
return undefined;
|
|
32
|
+
if (candidate.startsWith('base64://') || /^data:/.test(candidate))
|
|
33
|
+
return undefined;
|
|
34
|
+
if (candidate.startsWith('file://') || candidate.startsWith('/') || !candidate.includes('://')) {
|
|
35
|
+
return candidate;
|
|
36
|
+
}
|
|
37
|
+
return undefined;
|
|
38
|
+
}
|
|
39
|
+
export function asMessageElements(content) {
|
|
40
|
+
if (typeof content === 'string') {
|
|
41
|
+
return [{ type: 'text', data: { text: content } }];
|
|
42
|
+
}
|
|
43
|
+
if (!Array.isArray(content)) {
|
|
44
|
+
return [content];
|
|
45
|
+
}
|
|
46
|
+
return content.map((item) => typeof item === 'string' ? { type: 'text', data: { text: item } } : item);
|
|
47
|
+
}
|
|
48
|
+
export function isMediaSegmentType(type) {
|
|
49
|
+
return MEDIA_SEGMENT_TYPES.has(type);
|
|
50
|
+
}
|
|
51
|
+
export function collectOutboundMediaKinds(content) {
|
|
52
|
+
if (content == null)
|
|
53
|
+
return [];
|
|
54
|
+
const kinds = new Set();
|
|
55
|
+
for (const item of asMessageElements(content)) {
|
|
56
|
+
const t = item?.type;
|
|
57
|
+
if (typeof t === 'string' && isMediaSegmentType(t)) {
|
|
58
|
+
kinds.add(t);
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
return [...kinds];
|
|
62
|
+
}
|
|
63
|
+
//# sourceMappingURL=outbound-media-utils.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"outbound-media-utils.js","sourceRoot":"","sources":["../../src/built/outbound-media-utils.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 出站 `qrcode` 消息段(legacy 导出;新代码请用 rich-segments)。
|
|
3
|
+
* @deprecated 出站渲染由 Adapter.renderSendMessage → resolveRichSegments 统一处理
|
|
4
|
+
*/
|
|
5
|
+
import type { SendContent } from '../types.js';
|
|
6
|
+
import { QrcodeSegment, readQrcodeSegmentData, type QrcodeSegmentData } from './rich-segments/qrcode-segment.js';
|
|
7
|
+
export type { QrcodeSegmentData };
|
|
8
|
+
export { QrcodeSegment, readQrcodeSegmentData };
|
|
9
|
+
export type QrcodeOutboundMode = 'image' | 'terminal' | 'text';
|
|
10
|
+
export declare function hasQrcodeSegment(content: SendContent | undefined): boolean;
|
|
11
|
+
/** 创建 qrcode 出站段 */
|
|
12
|
+
export declare function qrcodeSegment(text: string, options?: Omit<QrcodeSegmentData, 'text'>): QrcodeSegment;
|
|
13
|
+
/** IM 适配器:qrcode → image(data URL + base64) */
|
|
14
|
+
export declare function resolveQrcodeSegmentsToImages(content: SendContent | undefined): Promise<SendContent | undefined>;
|
|
15
|
+
/** process 适配器:终端 ASCII + 文本占位(legacy;process endpoint 现解释 origin qrcode) */
|
|
16
|
+
export declare function resolveQrcodeSegmentsToTerminal(content: SendContent | undefined): Promise<SendContent | undefined>;
|
|
17
|
+
/** 不支持图片的平台:仅输出链接文本 */
|
|
18
|
+
export declare function coerceQrcodeSegmentsToText(content: SendContent): SendContent;
|
|
19
|
+
//# sourceMappingURL=qrcode-segment.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"qrcode-segment.d.ts","sourceRoot":"","sources":["../../src/built/qrcode-segment.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,KAAK,EAAkB,WAAW,EAAE,MAAM,aAAa,CAAC;AAG/D,OAAO,EACL,aAAa,EACb,qBAAqB,EACrB,KAAK,iBAAiB,EACvB,MAAM,mCAAmC,CAAC;AAE3C,YAAY,EAAE,iBAAiB,EAAE,CAAC;AAClC,OAAO,EAAE,aAAa,EAAE,qBAAqB,EAAE,CAAC;AAEhD,MAAM,MAAM,kBAAkB,GAAG,OAAO,GAAG,UAAU,GAAG,MAAM,CAAC;AAY/D,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,WAAW,GAAG,SAAS,GAAG,OAAO,CAG1E;AAED,oBAAoB;AACpB,wBAAgB,aAAa,CAC3B,IAAI,EAAE,MAAM,EACZ,OAAO,GAAE,IAAI,CAAC,iBAAiB,EAAE,MAAM,CAAM,GAC5C,aAAa,CAEf;AAQD,+CAA+C;AAC/C,wBAAsB,6BAA6B,CACjD,OAAO,EAAE,WAAW,GAAG,SAAS,GAC/B,OAAO,CAAC,WAAW,GAAG,SAAS,CAAC,CAIlC;AAED,6EAA6E;AAC7E,wBAAsB,+BAA+B,CACnD,OAAO,EAAE,WAAW,GAAG,SAAS,GAC/B,OAAO,CAAC,WAAW,GAAG,SAAS,CAAC,CAwBlC;AAED,uBAAuB;AACvB,wBAAgB,0BAA0B,CAAC,OAAO,EAAE,WAAW,GAAG,WAAW,CAgB5E"}
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
import { segment } from '../utils.js';
|
|
2
|
+
import { GeneratedQrCode } from './generated-qrcode.js';
|
|
3
|
+
import { QrcodeSegment, readQrcodeSegmentData, } from './rich-segments/qrcode-segment.js';
|
|
4
|
+
export { QrcodeSegment, readQrcodeSegmentData };
|
|
5
|
+
function asArray(content) {
|
|
6
|
+
return Array.isArray(content) ? content : [content];
|
|
7
|
+
}
|
|
8
|
+
function packSegments(out) {
|
|
9
|
+
if (out.length === 0)
|
|
10
|
+
return segment.text('');
|
|
11
|
+
if (out.length === 1)
|
|
12
|
+
return out[0];
|
|
13
|
+
return out;
|
|
14
|
+
}
|
|
15
|
+
export function hasQrcodeSegment(content) {
|
|
16
|
+
if (content == null)
|
|
17
|
+
return false;
|
|
18
|
+
return asArray(content).some((item) => typeof item !== 'string' && item?.type === 'qrcode');
|
|
19
|
+
}
|
|
20
|
+
/** 创建 qrcode 出站段 */
|
|
21
|
+
export function qrcodeSegment(text, options = {}) {
|
|
22
|
+
return new QrcodeSegment({ text, ...options });
|
|
23
|
+
}
|
|
24
|
+
const LEGACY_QRCODE_ONLY_POLICY = {
|
|
25
|
+
qrcode: 'image',
|
|
26
|
+
html: 'origin',
|
|
27
|
+
markdown: 'origin',
|
|
28
|
+
};
|
|
29
|
+
/** IM 适配器:qrcode → image(data URL + base64) */
|
|
30
|
+
export async function resolveQrcodeSegmentsToImages(content) {
|
|
31
|
+
if (content == null)
|
|
32
|
+
return content;
|
|
33
|
+
const { resolveRichSegments } = await import('./rich-segments/index.js');
|
|
34
|
+
return resolveRichSegments(content, LEGACY_QRCODE_ONLY_POLICY);
|
|
35
|
+
}
|
|
36
|
+
/** process 适配器:终端 ASCII + 文本占位(legacy;process endpoint 现解释 origin qrcode) */
|
|
37
|
+
export async function resolveQrcodeSegmentsToTerminal(content) {
|
|
38
|
+
if (content == null)
|
|
39
|
+
return content;
|
|
40
|
+
if (!hasQrcodeSegment(content))
|
|
41
|
+
return content;
|
|
42
|
+
const items = asArray(content);
|
|
43
|
+
const out = [];
|
|
44
|
+
for (const item of items) {
|
|
45
|
+
if (typeof item === 'string') {
|
|
46
|
+
out.push(item);
|
|
47
|
+
continue;
|
|
48
|
+
}
|
|
49
|
+
if (item.type !== 'qrcode') {
|
|
50
|
+
out.push(item);
|
|
51
|
+
continue;
|
|
52
|
+
}
|
|
53
|
+
const payload = readQrcodeSegmentData(item.data ?? {});
|
|
54
|
+
const qr = await GeneratedQrCode.generate(payload.text, payload);
|
|
55
|
+
await qr.printToTerminal({ small: payload.small ?? true });
|
|
56
|
+
out.push(segment.text(`[二维码] ${payload.text}`));
|
|
57
|
+
}
|
|
58
|
+
return packSegments(out);
|
|
59
|
+
}
|
|
60
|
+
/** 不支持图片的平台:仅输出链接文本 */
|
|
61
|
+
export function coerceQrcodeSegmentsToText(content) {
|
|
62
|
+
const items = asArray(content);
|
|
63
|
+
const out = [];
|
|
64
|
+
for (const item of items) {
|
|
65
|
+
if (typeof item === 'string') {
|
|
66
|
+
out.push(item);
|
|
67
|
+
continue;
|
|
68
|
+
}
|
|
69
|
+
if (item?.type === 'qrcode') {
|
|
70
|
+
const text = typeof item.data?.text === 'string' ? item.data.text : '';
|
|
71
|
+
if (text)
|
|
72
|
+
out.push(segment.text(`[二维码] ${text}`));
|
|
73
|
+
continue;
|
|
74
|
+
}
|
|
75
|
+
out.push(item);
|
|
76
|
+
}
|
|
77
|
+
return packSegments(out);
|
|
78
|
+
}
|
|
79
|
+
//# sourceMappingURL=qrcode-segment.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"qrcode-segment.js","sourceRoot":"","sources":["../../src/built/qrcode-segment.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { OutboundRichSegmentPolicy } from './types.js';
|
|
2
|
+
/** 全功能 IM:html/markdown/qrcode→image,tts→audio */
|
|
3
|
+
export declare const OUTBOUND_RICH_SEGMENT_POLICY_IM_FULL: OutboundRichSegmentPolicy;
|
|
4
|
+
/** 仅文本降级(无富媒体出站能力) */
|
|
5
|
+
export declare const OUTBOUND_RICH_SEGMENT_POLICY_TEXT_ONLY: OutboundRichSegmentPolicy;
|
|
6
|
+
/** 默认 registry 等价(html/markdown 文本,qrcode 图片,tts 音频) */
|
|
7
|
+
export declare const OUTBOUND_RICH_SEGMENT_POLICY_IM_DEFAULT: OutboundRichSegmentPolicy;
|
|
8
|
+
/** 无音频出站(tts 降级 text) */
|
|
9
|
+
export declare const OUTBOUND_RICH_SEGMENT_POLICY_NO_AUDIO: OutboundRichSegmentPolicy;
|
|
10
|
+
//# sourceMappingURL=adapter-policies.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"adapter-policies.d.ts","sourceRoot":"","sources":["../../../src/built/rich-segments/adapter-policies.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,YAAY,CAAC;AAG5D,kDAAkD;AAClD,eAAO,MAAM,oCAAoC,EAAE,yBAKlD,CAAC;AAEF,sBAAsB;AACtB,eAAO,MAAM,sCAAsC,EAAE,yBAKpD,CAAC;AAEF,wDAAwD;AACxD,eAAO,MAAM,uCAAuC,EAAE,yBAKrD,CAAC;AAEF,yBAAyB;AACzB,eAAO,MAAM,qCAAqC,EAAE,yBAGnD,CAAC"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import { BUILTIN_RICH_SEGMENT_KINDS, RICH_SEGMENT_MODE } from './types.js';
|
|
2
|
+
/** 全功能 IM:html/markdown/qrcode→image,tts→audio */
|
|
3
|
+
export const OUTBOUND_RICH_SEGMENT_POLICY_IM_FULL = {
|
|
4
|
+
[BUILTIN_RICH_SEGMENT_KINDS.QRCODE]: RICH_SEGMENT_MODE.IMAGE,
|
|
5
|
+
[BUILTIN_RICH_SEGMENT_KINDS.HTML]: RICH_SEGMENT_MODE.IMAGE,
|
|
6
|
+
[BUILTIN_RICH_SEGMENT_KINDS.MARKDOWN]: RICH_SEGMENT_MODE.IMAGE,
|
|
7
|
+
[BUILTIN_RICH_SEGMENT_KINDS.TTS]: RICH_SEGMENT_MODE.AUDIO,
|
|
8
|
+
};
|
|
9
|
+
/** 仅文本降级(无富媒体出站能力) */
|
|
10
|
+
export const OUTBOUND_RICH_SEGMENT_POLICY_TEXT_ONLY = {
|
|
11
|
+
[BUILTIN_RICH_SEGMENT_KINDS.QRCODE]: RICH_SEGMENT_MODE.TEXT,
|
|
12
|
+
[BUILTIN_RICH_SEGMENT_KINDS.HTML]: RICH_SEGMENT_MODE.TEXT,
|
|
13
|
+
[BUILTIN_RICH_SEGMENT_KINDS.MARKDOWN]: RICH_SEGMENT_MODE.TEXT,
|
|
14
|
+
[BUILTIN_RICH_SEGMENT_KINDS.TTS]: RICH_SEGMENT_MODE.TEXT,
|
|
15
|
+
};
|
|
16
|
+
/** 默认 registry 等价(html/markdown 文本,qrcode 图片,tts 音频) */
|
|
17
|
+
export const OUTBOUND_RICH_SEGMENT_POLICY_IM_DEFAULT = {
|
|
18
|
+
[BUILTIN_RICH_SEGMENT_KINDS.QRCODE]: RICH_SEGMENT_MODE.IMAGE,
|
|
19
|
+
[BUILTIN_RICH_SEGMENT_KINDS.HTML]: RICH_SEGMENT_MODE.TEXT,
|
|
20
|
+
[BUILTIN_RICH_SEGMENT_KINDS.MARKDOWN]: RICH_SEGMENT_MODE.TEXT,
|
|
21
|
+
[BUILTIN_RICH_SEGMENT_KINDS.TTS]: RICH_SEGMENT_MODE.AUDIO,
|
|
22
|
+
};
|
|
23
|
+
/** 无音频出站(tts 降级 text) */
|
|
24
|
+
export const OUTBOUND_RICH_SEGMENT_POLICY_NO_AUDIO = {
|
|
25
|
+
...OUTBOUND_RICH_SEGMENT_POLICY_IM_FULL,
|
|
26
|
+
[BUILTIN_RICH_SEGMENT_KINDS.TTS]: RICH_SEGMENT_MODE.TEXT,
|
|
27
|
+
};
|
|
28
|
+
//# sourceMappingURL=adapter-policies.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"adapter-policies.js","sourceRoot":"","sources":["../../../src/built/rich-segments/adapter-policies.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,0BAA0B,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAE3E,kDAAkD;AAClD,MAAM,CAAC,MAAM,oCAAoC,GAA8B;IAC7E,CAAC,0BAA0B,CAAC,MAAM,CAAC,EAAE,iBAAiB,CAAC,KAAK;IAC5D,CAAC,0BAA0B,CAAC,IAAI,CAAC,EAAE,iBAAiB,CAAC,KAAK;IAC1D,CAAC,0BAA0B,CAAC,QAAQ,CAAC,EAAE,iBAAiB,CAAC,KAAK;IAC9D,CAAC,0BAA0B,CAAC,GAAG,CAAC,EAAE,iBAAiB,CAAC,KAAK;CAC1D,CAAC;AAEF,sBAAsB;AACtB,MAAM,CAAC,MAAM,sCAAsC,GAA8B;IAC/E,CAAC,0BAA0B,CAAC,MAAM,CAAC,EAAE,iBAAiB,CAAC,IAAI;IAC3D,CAAC,0BAA0B,CAAC,IAAI,CAAC,EAAE,iBAAiB,CAAC,IAAI;IACzD,CAAC,0BAA0B,CAAC,QAAQ,CAAC,EAAE,iBAAiB,CAAC,IAAI;IAC7D,CAAC,0BAA0B,CAAC,GAAG,CAAC,EAAE,iBAAiB,CAAC,IAAI;CACzD,CAAC;AAEF,wDAAwD;AACxD,MAAM,CAAC,MAAM,uCAAuC,GAA8B;IAChF,CAAC,0BAA0B,CAAC,MAAM,CAAC,EAAE,iBAAiB,CAAC,KAAK;IAC5D,CAAC,0BAA0B,CAAC,IAAI,CAAC,EAAE,iBAAiB,CAAC,IAAI;IACzD,CAAC,0BAA0B,CAAC,QAAQ,CAAC,EAAE,iBAAiB,CAAC,IAAI;IAC7D,CAAC,0BAA0B,CAAC,GAAG,CAAC,EAAE,iBAAiB,CAAC,KAAK;CAC1D,CAAC;AAEF,yBAAyB;AACzB,MAAM,CAAC,MAAM,qCAAqC,GAA8B;IAC9E,GAAG,oCAAoC;IACvC,CAAC,0BAA0B,CAAC,GAAG,CAAC,EAAE,iBAAiB,CAAC,IAAI;CACzD,CAAC"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import type { MessageElement } from '../../types.js';
|
|
2
|
+
import type { RichSegmentRenderContext, RichSegmentRenderResult } from './types.js';
|
|
3
|
+
export declare abstract class RichSegment<TData> {
|
|
4
|
+
readonly data: TData;
|
|
5
|
+
abstract readonly segmentType: string;
|
|
6
|
+
constructor(data: TData);
|
|
7
|
+
abstract render(mode: string, ctx?: RichSegmentRenderContext): Promise<RichSegmentRenderResult>;
|
|
8
|
+
toJSON(): MessageElement;
|
|
9
|
+
}
|
|
10
|
+
export declare function isRichSegment(item: unknown): item is RichSegment<unknown>;
|
|
11
|
+
export declare function richSegmentKind(item: MessageElement | string): string | null;
|
|
12
|
+
//# sourceMappingURL=base.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"base.d.ts","sourceRoot":"","sources":["../../../src/built/rich-segments/base.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAErD,OAAO,KAAK,EACV,wBAAwB,EACxB,uBAAuB,EACxB,MAAM,YAAY,CAAC;AAEpB,8BAAsB,WAAW,CAAC,KAAK;IAGzB,QAAQ,CAAC,IAAI,EAAE,KAAK;IAFhC,QAAQ,CAAC,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;gBAEjB,IAAI,EAAE,KAAK;IAEhC,QAAQ,CAAC,MAAM,CACb,IAAI,EAAE,MAAM,EACZ,GAAG,CAAC,EAAE,wBAAwB,GAC7B,OAAO,CAAC,uBAAuB,CAAC;IAEnC,MAAM,IAAI,cAAc;CAGzB;AAED,wBAAgB,aAAa,CAAC,IAAI,EAAE,OAAO,GAAG,IAAI,IAAI,WAAW,CAAC,OAAO,CAAC,CAEzE;AAED,wBAAgB,eAAe,CAAC,IAAI,EAAE,cAAc,GAAG,MAAM,GAAG,MAAM,GAAG,IAAI,CAQ5E"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { richSegmentRegistry } from './registry.js';
|
|
2
|
+
export class RichSegment {
|
|
3
|
+
data;
|
|
4
|
+
constructor(data) {
|
|
5
|
+
this.data = data;
|
|
6
|
+
}
|
|
7
|
+
toJSON() {
|
|
8
|
+
return { type: this.segmentType, data: this.data };
|
|
9
|
+
}
|
|
10
|
+
}
|
|
11
|
+
export function isRichSegment(item) {
|
|
12
|
+
return item instanceof RichSegment;
|
|
13
|
+
}
|
|
14
|
+
export function richSegmentKind(item) {
|
|
15
|
+
if (typeof item === 'string')
|
|
16
|
+
return null;
|
|
17
|
+
const type = item.type;
|
|
18
|
+
if (typeof type !== 'string')
|
|
19
|
+
return null;
|
|
20
|
+
if (richSegmentRegistry.has(type)) {
|
|
21
|
+
return type;
|
|
22
|
+
}
|
|
23
|
+
return null;
|
|
24
|
+
}
|
|
25
|
+
//# sourceMappingURL=base.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"base.js","sourceRoot":"","sources":["../../../src/built/rich-segments/base.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,mBAAmB,EAAE,MAAM,eAAe,CAAC;AAMpD,MAAM,OAAgB,WAAW;IAGV;IAArB,YAAqB,IAAW;QAAX,SAAI,GAAJ,IAAI,CAAO;IAAG,CAAC;IAOpC,MAAM;QACJ,OAAO,EAAE,IAAI,EAAE,IAAI,CAAC,WAAW,EAAE,IAAI,EAAE,IAAI,CAAC,IAA+B,EAAE,CAAC;IAChF,CAAC;CACF;AAED,MAAM,UAAU,aAAa,CAAC,IAAa;IACzC,OAAO,IAAI,YAAY,WAAW,CAAC;AACrC,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,IAA6B;IAC3D,IAAI,OAAO,IAAI,KAAK,QAAQ;QAAE,OAAO,IAAI,CAAC;IAC1C,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC;IACvB,IAAI,OAAO,IAAI,KAAK,QAAQ;QAAE,OAAO,IAAI,CAAC;IAC1C,IAAI,mBAAmB,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;QAClC,OAAO,IAAI,CAAC;IACd,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
/** 内置 kind 的默认出站 policy(由 registry 生成,增 kind 时自动包含) */
|
|
2
|
+
export declare const DEFAULT_OUTBOUND_RICH_SEGMENT_POLICY: import("./types.js").OutboundRichSegmentPolicy;
|
|
3
|
+
/** 测试:清空 registry 后重新注册内置 kind */
|
|
4
|
+
export declare function resetBuiltinRichSegmentKindsForTests(): void;
|
|
5
|
+
//# sourceMappingURL=builtins.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"builtins.d.ts","sourceRoot":"","sources":["../../../src/built/rich-segments/builtins.ts"],"names":[],"mappings":"AAuCA,uDAAuD;AACvD,eAAO,MAAM,oCAAoC,gDAA2C,CAAC;AAE7F,kCAAkC;AAClC,wBAAgB,oCAAoC,IAAI,IAAI,CAG3D"}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import { registerRichSegmentKind, richSegmentRegistry } from './registry.js';
|
|
2
|
+
import { wrapQrcodeSegment } from './qrcode-segment.js';
|
|
3
|
+
import { wrapHtmlSegment } from './html-segment.js';
|
|
4
|
+
import { wrapMarkdownSegment } from './markdown-segment.js';
|
|
5
|
+
import { wrapTtsSegment } from './tts-segment.js';
|
|
6
|
+
import { BUILTIN_RICH_SEGMENT_KINDS, RICH_SEGMENT_MODE } from './types.js';
|
|
7
|
+
function registerBuiltinRichSegmentKinds() {
|
|
8
|
+
registerRichSegmentKind({
|
|
9
|
+
kind: BUILTIN_RICH_SEGMENT_KINDS.QRCODE,
|
|
10
|
+
defaultMode: RICH_SEGMENT_MODE.IMAGE,
|
|
11
|
+
modes: [RICH_SEGMENT_MODE.IMAGE, RICH_SEGMENT_MODE.TEXT, RICH_SEGMENT_MODE.ORIGIN],
|
|
12
|
+
wrap: wrapQrcodeSegment,
|
|
13
|
+
});
|
|
14
|
+
registerRichSegmentKind({
|
|
15
|
+
kind: BUILTIN_RICH_SEGMENT_KINDS.HTML,
|
|
16
|
+
defaultMode: RICH_SEGMENT_MODE.TEXT,
|
|
17
|
+
modes: [RICH_SEGMENT_MODE.IMAGE, RICH_SEGMENT_MODE.TEXT, RICH_SEGMENT_MODE.ORIGIN],
|
|
18
|
+
wrap: wrapHtmlSegment,
|
|
19
|
+
});
|
|
20
|
+
registerRichSegmentKind({
|
|
21
|
+
kind: BUILTIN_RICH_SEGMENT_KINDS.MARKDOWN,
|
|
22
|
+
defaultMode: RICH_SEGMENT_MODE.TEXT,
|
|
23
|
+
modes: [RICH_SEGMENT_MODE.IMAGE, RICH_SEGMENT_MODE.TEXT, RICH_SEGMENT_MODE.ORIGIN],
|
|
24
|
+
wrap: wrapMarkdownSegment,
|
|
25
|
+
});
|
|
26
|
+
registerRichSegmentKind({
|
|
27
|
+
kind: BUILTIN_RICH_SEGMENT_KINDS.TTS,
|
|
28
|
+
defaultMode: RICH_SEGMENT_MODE.AUDIO,
|
|
29
|
+
modes: [RICH_SEGMENT_MODE.ORIGIN, RICH_SEGMENT_MODE.AUDIO, RICH_SEGMENT_MODE.TEXT],
|
|
30
|
+
wrap: wrapTtsSegment,
|
|
31
|
+
});
|
|
32
|
+
}
|
|
33
|
+
registerBuiltinRichSegmentKinds();
|
|
34
|
+
/** 内置 kind 的默认出站 policy(由 registry 生成,增 kind 时自动包含) */
|
|
35
|
+
export const DEFAULT_OUTBOUND_RICH_SEGMENT_POLICY = richSegmentRegistry.buildDefaultPolicy();
|
|
36
|
+
/** 测试:清空 registry 后重新注册内置 kind */
|
|
37
|
+
export function resetBuiltinRichSegmentKindsForTests() {
|
|
38
|
+
richSegmentRegistry.clearForTests();
|
|
39
|
+
registerBuiltinRichSegmentKinds();
|
|
40
|
+
}
|
|
41
|
+
//# sourceMappingURL=builtins.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"builtins.js","sourceRoot":"","sources":["../../../src/built/rich-segments/builtins.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,uBAAuB,EAAE,mBAAmB,EAAE,MAAM,eAAe,CAAC;AAC7E,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AACxD,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AACpD,OAAO,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AAC5D,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAClD,OAAO,EAAE,0BAA0B,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAE3E,SAAS,+BAA+B;IACtC,uBAAuB,CAAC;QACtB,IAAI,EAAE,0BAA0B,CAAC,MAAM;QACvC,WAAW,EAAE,iBAAiB,CAAC,KAAK;QACpC,KAAK,EAAE,CAAC,iBAAiB,CAAC,KAAK,EAAE,iBAAiB,CAAC,IAAI,EAAE,iBAAiB,CAAC,MAAM,CAAC;QAClF,IAAI,EAAE,iBAAiB;KACxB,CAAC,CAAC;IAEH,uBAAuB,CAAC;QACtB,IAAI,EAAE,0BAA0B,CAAC,IAAI;QACrC,WAAW,EAAE,iBAAiB,CAAC,IAAI;QACnC,KAAK,EAAE,CAAC,iBAAiB,CAAC,KAAK,EAAE,iBAAiB,CAAC,IAAI,EAAE,iBAAiB,CAAC,MAAM,CAAC;QAClF,IAAI,EAAE,eAAe;KACtB,CAAC,CAAC;IAEH,uBAAuB,CAAC;QACtB,IAAI,EAAE,0BAA0B,CAAC,QAAQ;QACzC,WAAW,EAAE,iBAAiB,CAAC,IAAI;QACnC,KAAK,EAAE,CAAC,iBAAiB,CAAC,KAAK,EAAE,iBAAiB,CAAC,IAAI,EAAE,iBAAiB,CAAC,MAAM,CAAC;QAClF,IAAI,EAAE,mBAAmB;KAC1B,CAAC,CAAC;IAEH,uBAAuB,CAAC;QACtB,IAAI,EAAE,0BAA0B,CAAC,GAAG;QACpC,WAAW,EAAE,iBAAiB,CAAC,KAAK;QACpC,KAAK,EAAE,CAAC,iBAAiB,CAAC,MAAM,EAAE,iBAAiB,CAAC,KAAK,EAAE,iBAAiB,CAAC,IAAI,CAAC;QAClF,IAAI,EAAE,cAAc;KACrB,CAAC,CAAC;AACL,CAAC;AAED,+BAA+B,EAAE,CAAC;AAElC,uDAAuD;AACvD,MAAM,CAAC,MAAM,oCAAoC,GAAG,mBAAmB,CAAC,kBAAkB,EAAE,CAAC;AAE7F,kCAAkC;AAClC,MAAM,UAAU,oCAAoC;IAClD,mBAAmB,CAAC,aAAa,EAAE,CAAC;IACpC,+BAA+B,EAAE,CAAC;AACpC,CAAC"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import type { RichSegmentCapabilityLoader, RichSegmentCapabilityLoaderOptions, RichSegmentRenderContext } from './types.js';
|
|
2
|
+
/** 注册 optional 包能力(如 html-renderer、未来 media-pipeline) */
|
|
3
|
+
export declare function registerRichSegmentCapabilityLoader(id: string, loader: RichSegmentCapabilityLoader): void;
|
|
4
|
+
/** 测试隔离 */
|
|
5
|
+
export declare function resetRichSegmentCapabilityLoadersForTests(): void;
|
|
6
|
+
export declare function createRichSegmentRenderContext(options?: RichSegmentCapabilityLoaderOptions): RichSegmentRenderContext;
|
|
7
|
+
//# sourceMappingURL=capabilities.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"capabilities.d.ts","sourceRoot":"","sources":["../../../src/built/rich-segments/capabilities.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAEV,2BAA2B,EAC3B,kCAAkC,EAClC,wBAAwB,EAEzB,MAAM,YAAY,CAAC;AAIpB,yDAAyD;AACzD,wBAAgB,mCAAmC,CACjD,EAAE,EAAE,MAAM,EACV,MAAM,EAAE,2BAA2B,GAClC,IAAI,CAEN;AAED,WAAW;AACX,wBAAgB,yCAAyC,IAAI,IAAI,CAGhE;AAmBD,wBAAgB,8BAA8B,CAC5C,OAAO,GAAE,kCAAuC,GAC/C,wBAAwB,CAiB1B"}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import { loadHtmlRenderer } from '../html-renderer-loader.js';
|
|
2
|
+
import { loadSpeechPipeline } from '../speech-loader.js';
|
|
3
|
+
const capabilityLoaders = new Map();
|
|
4
|
+
/** 注册 optional 包能力(如 html-renderer、未来 media-pipeline) */
|
|
5
|
+
export function registerRichSegmentCapabilityLoader(id, loader) {
|
|
6
|
+
capabilityLoaders.set(id, loader);
|
|
7
|
+
}
|
|
8
|
+
/** 测试隔离 */
|
|
9
|
+
export function resetRichSegmentCapabilityLoadersForTests() {
|
|
10
|
+
capabilityLoaders.clear();
|
|
11
|
+
registerCoreRichSegmentCapabilityLoaders();
|
|
12
|
+
}
|
|
13
|
+
function registerCoreRichSegmentCapabilityLoaders() {
|
|
14
|
+
registerRichSegmentCapabilityLoader('html-renderer', async (options) => loadHtmlRenderer({
|
|
15
|
+
getConfig: options.getConfig,
|
|
16
|
+
warn: options.warn,
|
|
17
|
+
}));
|
|
18
|
+
registerRichSegmentCapabilityLoader('speech', async (options) => loadSpeechPipeline({
|
|
19
|
+
getConfig: options.getConfig,
|
|
20
|
+
warn: options.warn,
|
|
21
|
+
}));
|
|
22
|
+
}
|
|
23
|
+
registerCoreRichSegmentCapabilityLoaders();
|
|
24
|
+
export function createRichSegmentRenderContext(options = {}) {
|
|
25
|
+
const cache = new Map();
|
|
26
|
+
const resolveCapability = async (id) => {
|
|
27
|
+
if (!cache.has(id)) {
|
|
28
|
+
const loader = capabilityLoaders.get(id);
|
|
29
|
+
cache.set(id, loader ? loader(options) : Promise.resolve(undefined));
|
|
30
|
+
}
|
|
31
|
+
return cache.get(id);
|
|
32
|
+
};
|
|
33
|
+
return {
|
|
34
|
+
resolveCapability,
|
|
35
|
+
getHtmlRenderer: () => resolveCapability('html-renderer'),
|
|
36
|
+
warn: options.warn,
|
|
37
|
+
logContentChain: options.logContentChain,
|
|
38
|
+
};
|
|
39
|
+
}
|
|
40
|
+
//# sourceMappingURL=capabilities.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"capabilities.js","sourceRoot":"","sources":["../../../src/built/rich-segments/capabilities.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,4BAA4B,CAAC;AAC9D,OAAO,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAC;AASzD,MAAM,iBAAiB,GAAG,IAAI,GAAG,EAAuC,CAAC;AAEzE,yDAAyD;AACzD,MAAM,UAAU,mCAAmC,CACjD,EAAU,EACV,MAAmC;IAEnC,iBAAiB,CAAC,GAAG,CAAC,EAAE,EAAE,MAAM,CAAC,CAAC;AACpC,CAAC;AAED,WAAW;AACX,MAAM,UAAU,yCAAyC;IACvD,iBAAiB,CAAC,KAAK,EAAE,CAAC;IAC1B,wCAAwC,EAAE,CAAC;AAC7C,CAAC;AAED,SAAS,wCAAwC;IAC/C,mCAAmC,CAAC,eAAe,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE,CACrE,gBAAgB,CAAC;QACf,SAAS,EAAE,OAAO,CAAC,SAAS;QAC5B,IAAI,EAAE,OAAO,CAAC,IAAI;KACnB,CAAoD,CACtD,CAAC;IACF,mCAAmC,CAAC,QAAQ,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE,CAC9D,kBAAkB,CAAC;QACjB,SAAS,EAAE,OAAO,CAAC,SAAS;QAC5B,IAAI,EAAE,OAAO,CAAC,IAAI;KACnB,CAAsD,CACxD,CAAC;AACJ,CAAC;AAED,wCAAwC,EAAE,CAAC;AAE3C,MAAM,UAAU,8BAA8B,CAC5C,UAA8C,EAAE;IAEhD,MAAM,KAAK,GAAG,IAAI,GAAG,EAA4B,CAAC;IAElD,MAAM,iBAAiB,GAAG,KAAK,EAAK,EAAU,EAA0B,EAAE;QACxE,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC;YACnB,MAAM,MAAM,GAAG,iBAAiB,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YACzC,KAAK,CAAC,GAAG,CAAC,EAAE,EAAE,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC;QACvE,CAAC;QACD,OAAO,KAAK,CAAC,GAAG,CAAC,EAAE,CAA2B,CAAC;IACjD,CAAC,CAAC;IAEF,OAAO;QACL,iBAAiB;QACjB,eAAe,EAAE,GAAG,EAAE,CAAC,iBAAiB,CAA6B,eAAe,CAAC;QACrF,IAAI,EAAE,OAAO,CAAC,IAAI;QAClB,eAAe,EAAE,OAAO,CAAC,eAAe;KACzC,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { RichSegment } from './base.js';
|
|
2
|
+
import type { RichSegmentRenderContext, RichSegmentRenderResult } from './types.js';
|
|
3
|
+
export interface HtmlSegmentData {
|
|
4
|
+
html: string;
|
|
5
|
+
text?: string;
|
|
6
|
+
width?: number;
|
|
7
|
+
backgroundColor?: string;
|
|
8
|
+
fileName?: string;
|
|
9
|
+
}
|
|
10
|
+
export declare class HtmlSegment extends RichSegment<HtmlSegmentData> {
|
|
11
|
+
readonly segmentType: "html";
|
|
12
|
+
readonly type: "html";
|
|
13
|
+
render(mode: string, ctx?: RichSegmentRenderContext): Promise<RichSegmentRenderResult>;
|
|
14
|
+
}
|
|
15
|
+
export declare function wrapHtmlSegment(data: Record<string, unknown>): HtmlSegment;
|
|
16
|
+
//# sourceMappingURL=html-segment.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"html-segment.d.ts","sourceRoot":"","sources":["../../../src/built/rich-segments/html-segment.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AACxC,OAAO,KAAK,EAEV,wBAAwB,EACxB,uBAAuB,EACxB,MAAM,YAAY,CAAC;AAGpB,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAYD,qBAAa,WAAY,SAAQ,WAAW,CAAC,eAAe,CAAC;IAC3D,QAAQ,CAAC,WAAW,EAAG,MAAM,CAAU;IACvC,QAAQ,CAAC,IAAI,EAAG,MAAM,CAAU;IAE1B,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,CAAC,EAAE,wBAAwB,GAAG,OAAO,CAAC,uBAAuB,CAAC;CA8C7F;AAED,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,WAAW,CAS1E"}
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
import { segment } from '../../utils.js';
|
|
2
|
+
import { htmlToFallbackText } from '../html-to-text.js';
|
|
3
|
+
import { RichSegment } from './base.js';
|
|
4
|
+
import { RICH_SEGMENT_MODE } from './types.js';
|
|
5
|
+
async function resolveHtmlRenderer(ctx) {
|
|
6
|
+
if (!ctx)
|
|
7
|
+
return undefined;
|
|
8
|
+
if (ctx.resolveCapability) {
|
|
9
|
+
return ctx.resolveCapability('html-renderer');
|
|
10
|
+
}
|
|
11
|
+
return ctx.getHtmlRenderer?.();
|
|
12
|
+
}
|
|
13
|
+
export class HtmlSegment extends RichSegment {
|
|
14
|
+
segmentType = 'html';
|
|
15
|
+
type = 'html';
|
|
16
|
+
async render(mode, ctx) {
|
|
17
|
+
if (mode === RICH_SEGMENT_MODE.ORIGIN) {
|
|
18
|
+
return this.toJSON();
|
|
19
|
+
}
|
|
20
|
+
if (mode === RICH_SEGMENT_MODE.TEXT) {
|
|
21
|
+
if (typeof this.data.text === 'string' && this.data.text.length > 0) {
|
|
22
|
+
return segment.text(this.data.text);
|
|
23
|
+
}
|
|
24
|
+
const html = typeof this.data.html === 'string' ? this.data.html : '';
|
|
25
|
+
return segment.text(html ? htmlToFallbackText(html) : '');
|
|
26
|
+
}
|
|
27
|
+
if (mode === RICH_SEGMENT_MODE.IMAGE) {
|
|
28
|
+
const html = typeof this.data.html === 'string' ? this.data.html : '';
|
|
29
|
+
if (!html) {
|
|
30
|
+
return segment.text('');
|
|
31
|
+
}
|
|
32
|
+
const renderer = await resolveHtmlRenderer(ctx);
|
|
33
|
+
if (!renderer) {
|
|
34
|
+
return this.render(RICH_SEGMENT_MODE.TEXT, ctx);
|
|
35
|
+
}
|
|
36
|
+
try {
|
|
37
|
+
const result = await renderer.render(html, {
|
|
38
|
+
width: typeof this.data.width === 'number' ? this.data.width : 540,
|
|
39
|
+
format: 'png',
|
|
40
|
+
backgroundColor: typeof this.data.backgroundColor === 'string' ? this.data.backgroundColor : '#d8dce3',
|
|
41
|
+
});
|
|
42
|
+
if (result.format !== 'png' || typeof result.data !== 'object') {
|
|
43
|
+
return this.render(RICH_SEGMENT_MODE.TEXT, ctx);
|
|
44
|
+
}
|
|
45
|
+
const base64 = Buffer.from(result.data).toString('base64');
|
|
46
|
+
const fileName = typeof this.data.fileName === 'string' ? this.data.fileName : 'card.png';
|
|
47
|
+
return segment('image', { url: `base64://${base64}`, name: fileName });
|
|
48
|
+
}
|
|
49
|
+
catch {
|
|
50
|
+
return this.render(RICH_SEGMENT_MODE.TEXT, ctx);
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
return this.render(RICH_SEGMENT_MODE.TEXT, ctx);
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
export function wrapHtmlSegment(data) {
|
|
57
|
+
const html = typeof data.html === 'string' ? data.html : '';
|
|
58
|
+
return new HtmlSegment({
|
|
59
|
+
html,
|
|
60
|
+
text: typeof data.text === 'string' ? data.text : undefined,
|
|
61
|
+
width: typeof data.width === 'number' ? data.width : undefined,
|
|
62
|
+
backgroundColor: typeof data.backgroundColor === 'string' ? data.backgroundColor : undefined,
|
|
63
|
+
fileName: typeof data.fileName === 'string' ? data.fileName : undefined,
|
|
64
|
+
});
|
|
65
|
+
}
|
|
66
|
+
//# sourceMappingURL=html-segment.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"html-segment.js","sourceRoot":"","sources":["../../../src/built/rich-segments/html-segment.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import './builtins.js';
|
|
2
|
+
export * from './types.js';
|
|
3
|
+
export * from './registry.js';
|
|
4
|
+
export * from './capabilities.js';
|
|
5
|
+
export { DEFAULT_OUTBOUND_RICH_SEGMENT_POLICY, resetBuiltinRichSegmentKindsForTests, } from './builtins.js';
|
|
6
|
+
export * from './base.js';
|
|
7
|
+
export * from './qrcode-segment.js';
|
|
8
|
+
export * from './html-segment.js';
|
|
9
|
+
export * from './markdown-segment.js';
|
|
10
|
+
export * from './tts-segment.js';
|
|
11
|
+
export * from './markdown-to-text.js';
|
|
12
|
+
export * from './resolve.js';
|
|
13
|
+
export * from './adapter-policies.js';
|
|
14
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/built/rich-segments/index.ts"],"names":[],"mappings":"AAAA,OAAO,eAAe,CAAC;AAEvB,cAAc,YAAY,CAAC;AAC3B,cAAc,eAAe,CAAC;AAC9B,cAAc,mBAAmB,CAAC;AAClC,OAAO,EACL,oCAAoC,EACpC,oCAAoC,GACrC,MAAM,eAAe,CAAC;AACvB,cAAc,WAAW,CAAC;AAC1B,cAAc,qBAAqB,CAAC;AACpC,cAAc,mBAAmB,CAAC;AAClC,cAAc,uBAAuB,CAAC;AACtC,cAAc,kBAAkB,CAAC;AACjC,cAAc,uBAAuB,CAAC;AACtC,cAAc,cAAc,CAAC;AAC7B,cAAc,uBAAuB,CAAC"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import './builtins.js';
|
|
2
|
+
export * from './types.js';
|
|
3
|
+
export * from './registry.js';
|
|
4
|
+
export * from './capabilities.js';
|
|
5
|
+
export { DEFAULT_OUTBOUND_RICH_SEGMENT_POLICY, resetBuiltinRichSegmentKindsForTests, } from './builtins.js';
|
|
6
|
+
export * from './base.js';
|
|
7
|
+
export * from './qrcode-segment.js';
|
|
8
|
+
export * from './html-segment.js';
|
|
9
|
+
export * from './markdown-segment.js';
|
|
10
|
+
export * from './tts-segment.js';
|
|
11
|
+
export * from './markdown-to-text.js';
|
|
12
|
+
export * from './resolve.js';
|
|
13
|
+
export * from './adapter-policies.js';
|
|
14
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/built/rich-segments/index.ts"],"names":[],"mappings":"AAAA,OAAO,eAAe,CAAC;AAEvB,cAAc,YAAY,CAAC;AAC3B,cAAc,eAAe,CAAC;AAC9B,cAAc,mBAAmB,CAAC;AAClC,OAAO,EACL,oCAAoC,EACpC,oCAAoC,GACrC,MAAM,eAAe,CAAC;AACvB,cAAc,WAAW,CAAC;AAC1B,cAAc,qBAAqB,CAAC;AACpC,cAAc,mBAAmB,CAAC;AAClC,cAAc,uBAAuB,CAAC;AACtC,cAAc,kBAAkB,CAAC;AACjC,cAAc,uBAAuB,CAAC;AACtC,cAAc,cAAc,CAAC;AAC7B,cAAc,uBAAuB,CAAC"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { RichSegment } from './base.js';
|
|
2
|
+
import type { RichSegmentRenderContext, RichSegmentRenderResult } from './types.js';
|
|
3
|
+
export interface MarkdownSegmentData {
|
|
4
|
+
content: string;
|
|
5
|
+
width?: number;
|
|
6
|
+
backgroundColor?: string;
|
|
7
|
+
fileName?: string;
|
|
8
|
+
}
|
|
9
|
+
export declare class MarkdownSegment extends RichSegment<MarkdownSegmentData> {
|
|
10
|
+
readonly segmentType: "markdown";
|
|
11
|
+
readonly type: "markdown";
|
|
12
|
+
render(mode: string, ctx?: RichSegmentRenderContext): Promise<RichSegmentRenderResult>;
|
|
13
|
+
}
|
|
14
|
+
export declare function wrapMarkdownSegment(data: Record<string, unknown>): MarkdownSegment;
|
|
15
|
+
//# sourceMappingURL=markdown-segment.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"markdown-segment.d.ts","sourceRoot":"","sources":["../../../src/built/rich-segments/markdown-segment.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AAExC,OAAO,KAAK,EAEV,wBAAwB,EACxB,uBAAuB,EACxB,MAAM,YAAY,CAAC;AAGpB,MAAM,WAAW,mBAAmB;IAClC,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAYD,qBAAa,eAAgB,SAAQ,WAAW,CAAC,mBAAmB,CAAC;IACnE,QAAQ,CAAC,WAAW,EAAG,UAAU,CAAU;IAC3C,QAAQ,CAAC,IAAI,EAAG,UAAU,CAAU;IAE9B,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,CAAC,EAAE,wBAAwB,GAAG,OAAO,CAAC,uBAAuB,CAAC;CAsC7F;AAED,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,eAAe,CAalF"}
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
import { segment } from '../../utils.js';
|
|
2
|
+
import { RichSegment } from './base.js';
|
|
3
|
+
import { markdownToHtmlForRender, markdownToPlainText } from './markdown-to-text.js';
|
|
4
|
+
import { RICH_SEGMENT_MODE } from './types.js';
|
|
5
|
+
async function resolveHtmlRenderer(ctx) {
|
|
6
|
+
if (!ctx)
|
|
7
|
+
return undefined;
|
|
8
|
+
if (ctx.resolveCapability) {
|
|
9
|
+
return ctx.resolveCapability('html-renderer');
|
|
10
|
+
}
|
|
11
|
+
return ctx.getHtmlRenderer?.();
|
|
12
|
+
}
|
|
13
|
+
export class MarkdownSegment extends RichSegment {
|
|
14
|
+
segmentType = 'markdown';
|
|
15
|
+
type = 'markdown';
|
|
16
|
+
async render(mode, ctx) {
|
|
17
|
+
if (mode === RICH_SEGMENT_MODE.ORIGIN) {
|
|
18
|
+
return { type: 'markdown', data: { content: this.data.content } };
|
|
19
|
+
}
|
|
20
|
+
if (mode === RICH_SEGMENT_MODE.TEXT) {
|
|
21
|
+
return segment.text(markdownToPlainText(this.data.content));
|
|
22
|
+
}
|
|
23
|
+
if (mode === RICH_SEGMENT_MODE.IMAGE) {
|
|
24
|
+
const renderer = await resolveHtmlRenderer(ctx);
|
|
25
|
+
if (!renderer) {
|
|
26
|
+
return this.render(RICH_SEGMENT_MODE.TEXT, ctx);
|
|
27
|
+
}
|
|
28
|
+
try {
|
|
29
|
+
const html = markdownToHtmlForRender(this.data.content);
|
|
30
|
+
const result = await renderer.render(html, {
|
|
31
|
+
width: typeof this.data.width === 'number' ? this.data.width : 540,
|
|
32
|
+
format: 'png',
|
|
33
|
+
backgroundColor: typeof this.data.backgroundColor === 'string' ? this.data.backgroundColor : '#ffffff',
|
|
34
|
+
});
|
|
35
|
+
if (result.format !== 'png' || typeof result.data !== 'object') {
|
|
36
|
+
return this.render(RICH_SEGMENT_MODE.TEXT, ctx);
|
|
37
|
+
}
|
|
38
|
+
const base64 = Buffer.from(result.data).toString('base64');
|
|
39
|
+
const fileName = typeof this.data.fileName === 'string' ? this.data.fileName : 'markdown.png';
|
|
40
|
+
return segment('image', { url: `base64://${base64}`, name: fileName });
|
|
41
|
+
}
|
|
42
|
+
catch {
|
|
43
|
+
return this.render(RICH_SEGMENT_MODE.TEXT, ctx);
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
return this.render(RICH_SEGMENT_MODE.TEXT, ctx);
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
export function wrapMarkdownSegment(data) {
|
|
50
|
+
const content = typeof data.content === 'string'
|
|
51
|
+
? data.content
|
|
52
|
+
: typeof data.text === 'string'
|
|
53
|
+
? data.text
|
|
54
|
+
: '';
|
|
55
|
+
return new MarkdownSegment({
|
|
56
|
+
content,
|
|
57
|
+
width: typeof data.width === 'number' ? data.width : undefined,
|
|
58
|
+
backgroundColor: typeof data.backgroundColor === 'string' ? data.backgroundColor : undefined,
|
|
59
|
+
fileName: typeof data.fileName === 'string' ? data.fileName : undefined,
|
|
60
|
+
});
|
|
61
|
+
}
|
|
62
|
+
//# sourceMappingURL=markdown-segment.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"markdown-segment.js","sourceRoot":"","sources":["../../../src/built/rich-segments/markdown-segment.ts"],"names":[],"mappings":"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"}
|