@cicctencent/agent-server 0.2.40 → 0.2.42
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 +17 -1
- package/dist/cjs/agent/agent-server.d.ts.map +1 -1
- package/dist/cjs/agent/agent-server.js +11 -86
- package/dist/cjs/agent/agent-server.js.map +1 -1
- package/dist/cjs/doc-generator/config-loader.d.ts +27 -0
- package/dist/cjs/doc-generator/config-loader.d.ts.map +1 -0
- package/dist/cjs/doc-generator/config-loader.js +200 -0
- package/dist/cjs/doc-generator/config-loader.js.map +1 -0
- package/dist/cjs/doc-generator/docx-renderer.d.ts +14 -0
- package/dist/cjs/doc-generator/docx-renderer.d.ts.map +1 -0
- package/dist/cjs/doc-generator/docx-renderer.js +354 -0
- package/dist/cjs/doc-generator/docx-renderer.js.map +1 -0
- package/dist/cjs/doc-generator/index.d.ts +23 -0
- package/dist/cjs/doc-generator/index.d.ts.map +1 -0
- package/dist/cjs/doc-generator/index.js +251 -0
- package/dist/cjs/doc-generator/index.js.map +1 -0
- package/dist/cjs/doc-generator/pdf-renderer.d.ts +14 -0
- package/dist/cjs/doc-generator/pdf-renderer.d.ts.map +1 -0
- package/dist/cjs/doc-generator/pdf-renderer.js +378 -0
- package/dist/cjs/doc-generator/pdf-renderer.js.map +1 -0
- package/dist/cjs/doc-generator/pptx-renderer.d.ts +14 -0
- package/dist/cjs/doc-generator/pptx-renderer.d.ts.map +1 -0
- package/dist/cjs/doc-generator/pptx-renderer.js +649 -0
- package/dist/cjs/doc-generator/pptx-renderer.js.map +1 -0
- package/dist/cjs/doc-generator/report-renderer.d.ts +88 -0
- package/dist/cjs/doc-generator/report-renderer.d.ts.map +1 -0
- package/dist/cjs/doc-generator/report-renderer.js +699 -0
- package/dist/cjs/doc-generator/report-renderer.js.map +1 -0
- package/dist/cjs/doc-generator/types.d.ts +193 -0
- package/dist/cjs/doc-generator/types.d.ts.map +1 -0
- package/dist/cjs/doc-generator/types.js +7 -0
- package/dist/cjs/doc-generator/types.js.map +1 -0
- package/dist/cjs/index.d.ts +4 -0
- package/dist/cjs/index.d.ts.map +1 -1
- package/dist/cjs/index.js +45 -36
- package/dist/cjs/index.js.map +1 -1
- package/dist/cjs/prompt/prompt-builder.d.ts +1 -1
- package/dist/cjs/prompt/prompt-builder.d.ts.map +1 -1
- package/dist/cjs/prompt/prompt-builder.js +14 -1
- package/dist/cjs/prompt/prompt-builder.js.map +1 -1
- package/dist/cjs/prompt/shared-fragments.d.ts +3 -3
- package/dist/cjs/prompt/shared-fragments.d.ts.map +1 -1
- package/dist/cjs/prompt/shared-fragments.js +5 -3
- package/dist/cjs/prompt/shared-fragments.js.map +1 -1
- package/dist/cjs/tool/builtin.d.ts +10 -3
- package/dist/cjs/tool/builtin.d.ts.map +1 -1
- package/dist/cjs/tool/builtin.js +10 -3
- package/dist/cjs/tool/builtin.js.map +1 -1
- package/dist/cjs/tool/tools/docgen.d.ts +5 -0
- package/dist/cjs/tool/tools/docgen.d.ts.map +1 -0
- package/dist/cjs/tool/tools/docgen.js +388 -0
- package/dist/cjs/tool/tools/docgen.js.map +1 -0
- package/dist/cjs/tool/tools/sandbox.js +2 -2
- package/dist/cjs/tool/tools/sandbox.js.map +1 -1
- package/dist/cjs/tool/tools/web.js +2 -2
- package/dist/cjs/tool/tools/web.js.map +1 -1
- package/dist/esm/agent/agent-server.d.ts.map +1 -1
- package/dist/esm/agent/agent-server.js +11 -86
- package/dist/esm/agent/agent-server.js.map +1 -1
- package/dist/esm/doc-generator/config-loader.d.ts +27 -0
- package/dist/esm/doc-generator/config-loader.d.ts.map +1 -0
- package/dist/esm/doc-generator/config-loader.js +160 -0
- package/dist/esm/doc-generator/config-loader.js.map +1 -0
- package/dist/esm/doc-generator/docx-renderer.d.ts +14 -0
- package/dist/esm/doc-generator/docx-renderer.d.ts.map +1 -0
- package/dist/esm/doc-generator/docx-renderer.js +318 -0
- package/dist/esm/doc-generator/docx-renderer.js.map +1 -0
- package/dist/esm/doc-generator/index.d.ts +23 -0
- package/dist/esm/doc-generator/index.d.ts.map +1 -0
- package/dist/esm/doc-generator/index.js +212 -0
- package/dist/esm/doc-generator/index.js.map +1 -0
- package/dist/esm/doc-generator/pdf-renderer.d.ts +14 -0
- package/dist/esm/doc-generator/pdf-renderer.d.ts.map +1 -0
- package/dist/esm/doc-generator/pdf-renderer.js +339 -0
- package/dist/esm/doc-generator/pdf-renderer.js.map +1 -0
- package/dist/esm/doc-generator/pptx-renderer.d.ts +14 -0
- package/dist/esm/doc-generator/pptx-renderer.d.ts.map +1 -0
- package/dist/esm/doc-generator/pptx-renderer.js +643 -0
- package/dist/esm/doc-generator/pptx-renderer.js.map +1 -0
- package/dist/esm/doc-generator/report-renderer.d.ts +88 -0
- package/dist/esm/doc-generator/report-renderer.d.ts.map +1 -0
- package/dist/esm/doc-generator/report-renderer.js +663 -0
- package/dist/esm/doc-generator/report-renderer.js.map +1 -0
- package/dist/esm/doc-generator/types.d.ts +193 -0
- package/dist/esm/doc-generator/types.d.ts.map +1 -0
- package/dist/esm/doc-generator/types.js +6 -0
- package/dist/esm/doc-generator/types.js.map +1 -0
- package/dist/esm/index.d.ts +4 -0
- package/dist/esm/index.d.ts.map +1 -1
- package/dist/esm/index.js +3 -0
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/prompt/prompt-builder.d.ts +1 -1
- package/dist/esm/prompt/prompt-builder.d.ts.map +1 -1
- package/dist/esm/prompt/prompt-builder.js +14 -1
- package/dist/esm/prompt/prompt-builder.js.map +1 -1
- package/dist/esm/prompt/shared-fragments.d.ts +3 -3
- package/dist/esm/prompt/shared-fragments.d.ts.map +1 -1
- package/dist/esm/prompt/shared-fragments.js +5 -3
- package/dist/esm/prompt/shared-fragments.js.map +1 -1
- package/dist/esm/tool/builtin.d.ts +10 -3
- package/dist/esm/tool/builtin.d.ts.map +1 -1
- package/dist/esm/tool/builtin.js +10 -3
- package/dist/esm/tool/builtin.js.map +1 -1
- package/dist/esm/tool/tools/docgen.d.ts +5 -0
- package/dist/esm/tool/tools/docgen.d.ts.map +1 -0
- package/dist/esm/tool/tools/docgen.js +352 -0
- package/dist/esm/tool/tools/docgen.js.map +1 -0
- package/dist/esm/tool/tools/sandbox.js +2 -2
- package/dist/esm/tool/tools/sandbox.js.map +1 -1
- package/dist/esm/tool/tools/web.js +2 -2
- package/dist/esm/tool/tools/web.js.map +1 -1
- package/package.json +7 -2
|
@@ -0,0 +1,354 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* @file DOCX 渲染器
|
|
4
|
+
* @description 使用 docx 库将结构化文档数据渲染为 .docx 文件
|
|
5
|
+
*/
|
|
6
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
7
|
+
if (k2 === undefined) k2 = k;
|
|
8
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
9
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
10
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
11
|
+
}
|
|
12
|
+
Object.defineProperty(o, k2, desc);
|
|
13
|
+
}) : (function(o, m, k, k2) {
|
|
14
|
+
if (k2 === undefined) k2 = k;
|
|
15
|
+
o[k2] = m[k];
|
|
16
|
+
}));
|
|
17
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
18
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
19
|
+
}) : function(o, v) {
|
|
20
|
+
o["default"] = v;
|
|
21
|
+
});
|
|
22
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
23
|
+
var ownKeys = function(o) {
|
|
24
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
25
|
+
var ar = [];
|
|
26
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
27
|
+
return ar;
|
|
28
|
+
};
|
|
29
|
+
return ownKeys(o);
|
|
30
|
+
};
|
|
31
|
+
return function (mod) {
|
|
32
|
+
if (mod && mod.__esModule) return mod;
|
|
33
|
+
var result = {};
|
|
34
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
35
|
+
__setModuleDefault(result, mod);
|
|
36
|
+
return result;
|
|
37
|
+
};
|
|
38
|
+
})();
|
|
39
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
40
|
+
exports.renderDocx = renderDocx;
|
|
41
|
+
const docx_1 = require("docx");
|
|
42
|
+
const fs = __importStar(require("fs"));
|
|
43
|
+
const config_loader_ts_1 = require("./config-loader.js");
|
|
44
|
+
/** 将 hex 颜色转 DOCX 格式(去掉 #) */
|
|
45
|
+
function hex(color) {
|
|
46
|
+
if (!color)
|
|
47
|
+
return '000000';
|
|
48
|
+
return color.replace('#', '');
|
|
49
|
+
}
|
|
50
|
+
/** 页面尺寸映射 (DXA units, 1440 DXA = 1 inch) */
|
|
51
|
+
const PAGE_SIZES = {
|
|
52
|
+
A4: { width: 11906, height: 16838 },
|
|
53
|
+
letter: { width: 12240, height: 15840 },
|
|
54
|
+
legal: { width: 12240, height: 20160 },
|
|
55
|
+
};
|
|
56
|
+
/** 渲染 DOCX */
|
|
57
|
+
async function renderDocx(data, templatesDir) {
|
|
58
|
+
const theme = (0, config_loader_ts_1.loadTheme)('docx', data.theme, templatesDir);
|
|
59
|
+
const opts = data.options || {};
|
|
60
|
+
// 页面配置
|
|
61
|
+
const pageSizeKey = opts.pageSize || theme.page?.size || 'A4';
|
|
62
|
+
const pageSize = PAGE_SIZES[pageSizeKey] || PAGE_SIZES.A4;
|
|
63
|
+
const margins = opts.margins || theme.page?.margin || { top: 1440, right: 1440, bottom: 1440, left: 1440 };
|
|
64
|
+
// 内容宽度 (DXA)
|
|
65
|
+
const contentWidth = pageSize.width - margins.left - margins.right;
|
|
66
|
+
// 构建文档 children
|
|
67
|
+
const children = [];
|
|
68
|
+
// 可选目录
|
|
69
|
+
if (opts.includeToc) {
|
|
70
|
+
children.push(new docx_1.TableOfContents('Table of Contents', {
|
|
71
|
+
hyperlink: true,
|
|
72
|
+
headingStyleRange: '1-3',
|
|
73
|
+
}));
|
|
74
|
+
children.push(new docx_1.Paragraph({ children: [new docx_1.PageBreak()] }));
|
|
75
|
+
}
|
|
76
|
+
// 渲染每个区块
|
|
77
|
+
for (const block of data.blocks) {
|
|
78
|
+
const rendered = renderBlock(block, theme, contentWidth);
|
|
79
|
+
children.push(...rendered);
|
|
80
|
+
}
|
|
81
|
+
// 构建文档
|
|
82
|
+
const doc = new docx_1.Document({
|
|
83
|
+
styles: {
|
|
84
|
+
default: {
|
|
85
|
+
document: {
|
|
86
|
+
run: { font: theme.fonts.body, size: (theme.sizes.body || 12) * 2 },
|
|
87
|
+
},
|
|
88
|
+
},
|
|
89
|
+
paragraphStyles: buildParagraphStyles(theme),
|
|
90
|
+
},
|
|
91
|
+
numbering: {
|
|
92
|
+
config: [
|
|
93
|
+
{
|
|
94
|
+
reference: 'bullets',
|
|
95
|
+
levels: [{
|
|
96
|
+
level: 0,
|
|
97
|
+
format: docx_1.LevelFormat.BULLET,
|
|
98
|
+
text: '\u2022',
|
|
99
|
+
alignment: docx_1.AlignmentType.LEFT,
|
|
100
|
+
style: { paragraph: { indent: { left: 720, hanging: 360 } } },
|
|
101
|
+
}],
|
|
102
|
+
},
|
|
103
|
+
{
|
|
104
|
+
reference: 'numbers',
|
|
105
|
+
levels: [{
|
|
106
|
+
level: 0,
|
|
107
|
+
format: docx_1.LevelFormat.DECIMAL,
|
|
108
|
+
text: '%1.',
|
|
109
|
+
alignment: docx_1.AlignmentType.LEFT,
|
|
110
|
+
style: { paragraph: { indent: { left: 720, hanging: 360 } } },
|
|
111
|
+
}],
|
|
112
|
+
},
|
|
113
|
+
],
|
|
114
|
+
},
|
|
115
|
+
sections: [{
|
|
116
|
+
properties: {
|
|
117
|
+
page: {
|
|
118
|
+
size: { width: pageSize.width, height: pageSize.height },
|
|
119
|
+
margin: margins,
|
|
120
|
+
},
|
|
121
|
+
},
|
|
122
|
+
headers: opts.headerText ? {
|
|
123
|
+
default: new docx_1.Header({
|
|
124
|
+
children: [new docx_1.Paragraph({
|
|
125
|
+
border: { bottom: { style: docx_1.BorderStyle.SINGLE, size: 6, color: hex(theme.colors.primary), space: 1 } },
|
|
126
|
+
children: [new docx_1.TextRun({ text: opts.headerText, font: theme.fonts.caption, size: (theme.sizes.caption || 10) * 2, color: hex(theme.colors.caption) })],
|
|
127
|
+
})],
|
|
128
|
+
}),
|
|
129
|
+
} : undefined,
|
|
130
|
+
footers: (opts.showPageNumbers !== false || opts.footerText) ? {
|
|
131
|
+
default: new docx_1.Footer({
|
|
132
|
+
children: [new docx_1.Paragraph({
|
|
133
|
+
alignment: docx_1.AlignmentType.CENTER,
|
|
134
|
+
children: [
|
|
135
|
+
...(opts.footerText ? [new docx_1.TextRun({ text: opts.footerText + ' | ', font: theme.fonts.caption, size: (theme.sizes.caption || 10) * 2, color: hex(theme.colors.caption) })] : []),
|
|
136
|
+
new docx_1.TextRun({ text: 'Page ', font: theme.fonts.caption, size: (theme.sizes.caption || 10) * 2, color: hex(theme.colors.caption) }),
|
|
137
|
+
new docx_1.TextRun({ children: [docx_1.PageNumber.CURRENT], font: theme.fonts.caption, size: (theme.sizes.caption || 10) * 2, color: hex(theme.colors.caption) }),
|
|
138
|
+
],
|
|
139
|
+
})],
|
|
140
|
+
}),
|
|
141
|
+
} : undefined,
|
|
142
|
+
children,
|
|
143
|
+
}],
|
|
144
|
+
});
|
|
145
|
+
const buffer = await docx_1.Packer.toBuffer(doc);
|
|
146
|
+
const filename = data.filename || `${sanitizeFilename(data.title)}.docx`;
|
|
147
|
+
return {
|
|
148
|
+
buffer,
|
|
149
|
+
filename,
|
|
150
|
+
mimeType: 'application/vnd.openxmlformats-officedocument.wordprocessingml.document',
|
|
151
|
+
size: buffer.length,
|
|
152
|
+
};
|
|
153
|
+
}
|
|
154
|
+
function buildParagraphStyles(theme) {
|
|
155
|
+
const sizes = theme.sizes;
|
|
156
|
+
return [
|
|
157
|
+
{
|
|
158
|
+
id: 'Heading1', name: 'Heading 1', basedOn: 'Normal', next: 'Normal', quickFormat: true,
|
|
159
|
+
run: { size: (sizes.h1 || 24) * 2, bold: true, font: theme.fonts.heading, color: hex(theme.colors.heading || theme.colors.primary) },
|
|
160
|
+
paragraph: { spacing: { before: theme.spacing.headingBefore || 240, after: theme.spacing.headingAfter || 120 }, outlineLevel: 0 },
|
|
161
|
+
},
|
|
162
|
+
{
|
|
163
|
+
id: 'Heading2', name: 'Heading 2', basedOn: 'Normal', next: 'Normal', quickFormat: true,
|
|
164
|
+
run: { size: (sizes.h2 || 20) * 2, bold: true, font: theme.fonts.heading, color: hex(theme.colors.heading || theme.colors.primary) },
|
|
165
|
+
paragraph: { spacing: { before: theme.spacing.headingBefore || 240, after: theme.spacing.headingAfter || 120 }, outlineLevel: 1 },
|
|
166
|
+
},
|
|
167
|
+
{
|
|
168
|
+
id: 'Heading3', name: 'Heading 3', basedOn: 'Normal', next: 'Normal', quickFormat: true,
|
|
169
|
+
run: { size: (sizes.h3 || 16) * 2, bold: true, font: theme.fonts.heading, color: hex(theme.colors.heading || theme.colors.primary) },
|
|
170
|
+
paragraph: { spacing: { before: 180, after: 120 }, outlineLevel: 2 },
|
|
171
|
+
},
|
|
172
|
+
{
|
|
173
|
+
id: 'Heading4', name: 'Heading 4', basedOn: 'Normal', next: 'Normal', quickFormat: true,
|
|
174
|
+
run: { size: (sizes.h4 || 14) * 2, bold: true, font: theme.fonts.heading, color: hex(theme.colors.heading || theme.colors.primary) },
|
|
175
|
+
paragraph: { spacing: { before: 120, after: 80 }, outlineLevel: 3 },
|
|
176
|
+
},
|
|
177
|
+
];
|
|
178
|
+
}
|
|
179
|
+
function renderBlock(block, theme, contentWidth) {
|
|
180
|
+
const result = [];
|
|
181
|
+
const c = theme.colors;
|
|
182
|
+
const f = theme.fonts;
|
|
183
|
+
const s = theme.sizes;
|
|
184
|
+
const sp = theme.spacing;
|
|
185
|
+
switch (block.type) {
|
|
186
|
+
case 'heading': {
|
|
187
|
+
const levelMap = {
|
|
188
|
+
1: docx_1.HeadingLevel.HEADING_1,
|
|
189
|
+
2: docx_1.HeadingLevel.HEADING_2,
|
|
190
|
+
3: docx_1.HeadingLevel.HEADING_3,
|
|
191
|
+
4: docx_1.HeadingLevel.HEADING_4,
|
|
192
|
+
};
|
|
193
|
+
result.push(new docx_1.Paragraph({
|
|
194
|
+
heading: levelMap[block.level || 1] || docx_1.HeadingLevel.HEADING_1,
|
|
195
|
+
children: [new docx_1.TextRun({ text: block.text || '' })],
|
|
196
|
+
}));
|
|
197
|
+
break;
|
|
198
|
+
}
|
|
199
|
+
case 'paragraph': {
|
|
200
|
+
if (block.runs?.length) {
|
|
201
|
+
result.push(new docx_1.Paragraph({
|
|
202
|
+
spacing: { after: sp.paragraphAfter || 120, line: sp.lineSpacing || 276 },
|
|
203
|
+
children: block.runs.map(run => new docx_1.TextRun({
|
|
204
|
+
text: run.text,
|
|
205
|
+
bold: run.bold,
|
|
206
|
+
italics: run.italic,
|
|
207
|
+
underline: run.underline ? {} : undefined,
|
|
208
|
+
color: run.color ? hex(run.color) : undefined,
|
|
209
|
+
size: run.fontSize ? run.fontSize * 2 : undefined,
|
|
210
|
+
font: f.body,
|
|
211
|
+
})),
|
|
212
|
+
}));
|
|
213
|
+
}
|
|
214
|
+
else {
|
|
215
|
+
result.push(new docx_1.Paragraph({
|
|
216
|
+
spacing: { after: sp.paragraphAfter || 120, line: sp.lineSpacing || 276 },
|
|
217
|
+
children: [new docx_1.TextRun({ text: block.text || '', font: f.body, size: (s.body || 12) * 2, color: hex(c.body || c.textPrimary) })],
|
|
218
|
+
}));
|
|
219
|
+
}
|
|
220
|
+
break;
|
|
221
|
+
}
|
|
222
|
+
case 'bullets': {
|
|
223
|
+
if (block.items?.length) {
|
|
224
|
+
for (const item of block.items) {
|
|
225
|
+
result.push(new docx_1.Paragraph({
|
|
226
|
+
numbering: { reference: 'bullets', level: 0 },
|
|
227
|
+
spacing: { after: 60 },
|
|
228
|
+
children: [new docx_1.TextRun({ text: item, font: f.body, size: (s.body || 12) * 2, color: hex(c.body || c.textPrimary) })],
|
|
229
|
+
}));
|
|
230
|
+
}
|
|
231
|
+
}
|
|
232
|
+
break;
|
|
233
|
+
}
|
|
234
|
+
case 'numbers': {
|
|
235
|
+
if (block.items?.length) {
|
|
236
|
+
for (const item of block.items) {
|
|
237
|
+
result.push(new docx_1.Paragraph({
|
|
238
|
+
numbering: { reference: 'numbers', level: 0 },
|
|
239
|
+
spacing: { after: 60 },
|
|
240
|
+
children: [new docx_1.TextRun({ text: item, font: f.body, size: (s.body || 12) * 2, color: hex(c.body || c.textPrimary) })],
|
|
241
|
+
}));
|
|
242
|
+
}
|
|
243
|
+
}
|
|
244
|
+
break;
|
|
245
|
+
}
|
|
246
|
+
case 'table': {
|
|
247
|
+
if (block.table) {
|
|
248
|
+
result.push(renderDocxTable(block.table, theme, contentWidth));
|
|
249
|
+
}
|
|
250
|
+
break;
|
|
251
|
+
}
|
|
252
|
+
case 'image': {
|
|
253
|
+
if (block.image_url) {
|
|
254
|
+
try {
|
|
255
|
+
const imgData = fs.existsSync(block.image_url)
|
|
256
|
+
? fs.readFileSync(block.image_url)
|
|
257
|
+
: Buffer.alloc(0);
|
|
258
|
+
if (imgData.length > 0) {
|
|
259
|
+
const ext = block.image_url.split('.').pop()?.toLowerCase() || 'png';
|
|
260
|
+
result.push(new docx_1.Paragraph({
|
|
261
|
+
children: [new docx_1.ImageRun({
|
|
262
|
+
type: ext,
|
|
263
|
+
data: imgData,
|
|
264
|
+
transformation: {
|
|
265
|
+
width: block.image_width || 400,
|
|
266
|
+
height: block.image_height || 300,
|
|
267
|
+
},
|
|
268
|
+
altText: {
|
|
269
|
+
title: block.image_alt || 'Image',
|
|
270
|
+
description: block.image_alt || 'Image',
|
|
271
|
+
name: block.image_alt || 'image',
|
|
272
|
+
},
|
|
273
|
+
})],
|
|
274
|
+
}));
|
|
275
|
+
}
|
|
276
|
+
}
|
|
277
|
+
catch {
|
|
278
|
+
result.push(new docx_1.Paragraph({
|
|
279
|
+
children: [new docx_1.TextRun({ text: `[Image: ${block.image_url}]`, italics: true, color: hex(c.caption) })],
|
|
280
|
+
}));
|
|
281
|
+
}
|
|
282
|
+
}
|
|
283
|
+
break;
|
|
284
|
+
}
|
|
285
|
+
case 'page_break': {
|
|
286
|
+
result.push(new docx_1.Paragraph({ children: [new docx_1.PageBreak()] }));
|
|
287
|
+
break;
|
|
288
|
+
}
|
|
289
|
+
case 'toc': {
|
|
290
|
+
result.push(new docx_1.TableOfContents('Table of Contents', {
|
|
291
|
+
hyperlink: true,
|
|
292
|
+
headingStyleRange: '1-3',
|
|
293
|
+
}));
|
|
294
|
+
break;
|
|
295
|
+
}
|
|
296
|
+
case 'spacer': {
|
|
297
|
+
result.push(new docx_1.Paragraph({ spacing: { after: block.height || 200 }, children: [] }));
|
|
298
|
+
break;
|
|
299
|
+
}
|
|
300
|
+
}
|
|
301
|
+
return result;
|
|
302
|
+
}
|
|
303
|
+
function renderDocxTable(table, theme, contentWidth) {
|
|
304
|
+
const c = theme.colors;
|
|
305
|
+
const f = theme.fonts;
|
|
306
|
+
const s = theme.sizes;
|
|
307
|
+
const border = { style: docx_1.BorderStyle.SINGLE, size: 1, color: hex(c.tableBorder || 'CCCCCC') };
|
|
308
|
+
const borders = { top: border, bottom: border, left: border, right: border };
|
|
309
|
+
const colCount = table.headers.length;
|
|
310
|
+
const colWidth = Math.floor(contentWidth / colCount);
|
|
311
|
+
const headerRow = new docx_1.TableRow({
|
|
312
|
+
children: table.headers.map(h => new docx_1.TableCell({
|
|
313
|
+
borders,
|
|
314
|
+
width: { size: colWidth, type: docx_1.WidthType.DXA },
|
|
315
|
+
shading: { fill: hex(c.tableHeader || 'D5E8F0'), type: docx_1.ShadingType.CLEAR },
|
|
316
|
+
margins: { top: 80, bottom: 80, left: 120, right: 120 },
|
|
317
|
+
children: [new docx_1.Paragraph({
|
|
318
|
+
alignment: docx_1.AlignmentType.CENTER,
|
|
319
|
+
children: [new docx_1.TextRun({
|
|
320
|
+
text: h,
|
|
321
|
+
bold: true,
|
|
322
|
+
font: f.body,
|
|
323
|
+
size: (s.body || 12) * 2,
|
|
324
|
+
color: hex(c.tableHeaderText || c.textPrimary),
|
|
325
|
+
})],
|
|
326
|
+
})],
|
|
327
|
+
})),
|
|
328
|
+
});
|
|
329
|
+
const dataRows = table.rows.map((row, rowIdx) => new docx_1.TableRow({
|
|
330
|
+
children: row.map(cell => new docx_1.TableCell({
|
|
331
|
+
borders,
|
|
332
|
+
width: { size: colWidth, type: docx_1.WidthType.DXA },
|
|
333
|
+
shading: rowIdx % 2 === 1 ? { fill: hex(c.tableAltRow || 'F5F9FC'), type: docx_1.ShadingType.CLEAR } : undefined,
|
|
334
|
+
margins: { top: 80, bottom: 80, left: 120, right: 120 },
|
|
335
|
+
children: [new docx_1.Paragraph({
|
|
336
|
+
children: [new docx_1.TextRun({
|
|
337
|
+
text: String(cell),
|
|
338
|
+
font: f.body,
|
|
339
|
+
size: (s.body || 12) * 2,
|
|
340
|
+
color: hex(c.body || c.textPrimary),
|
|
341
|
+
})],
|
|
342
|
+
})],
|
|
343
|
+
})),
|
|
344
|
+
}));
|
|
345
|
+
return new docx_1.Table({
|
|
346
|
+
width: { size: contentWidth, type: docx_1.WidthType.DXA },
|
|
347
|
+
columnWidths: Array(colCount).fill(colWidth),
|
|
348
|
+
rows: [headerRow, ...dataRows],
|
|
349
|
+
});
|
|
350
|
+
}
|
|
351
|
+
function sanitizeFilename(name) {
|
|
352
|
+
return name.replace(/[^a-zA-Z0-9\u4e00-\u9fff_-]/g, '_').slice(0, 50);
|
|
353
|
+
}
|
|
354
|
+
//# sourceMappingURL=docx-renderer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"docx-renderer.js","sourceRoot":"","sources":["../../../src/doc-generator/docx-renderer.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @file 文档生成模块 - 统一入口
|
|
3
|
+
* @description 为 Agent 工具提供结构化文档生成能力(PPTX / DOCX / PDF / HTML Report)
|
|
4
|
+
*/
|
|
5
|
+
import type { ToolContext } from '@cicctencent/agent-core';
|
|
6
|
+
import { renderReport } from './report-renderer.js';
|
|
7
|
+
import { listThemes } from './config-loader.js';
|
|
8
|
+
import type { PresentationData, DocumentData, RenderResult } from './types.js';
|
|
9
|
+
import type { ReportData } from './report-renderer.js';
|
|
10
|
+
export type { PresentationData, DocumentData, RenderResult, ReportData };
|
|
11
|
+
export { listThemes, renderReport };
|
|
12
|
+
/**
|
|
13
|
+
* 生成文档并保存为 Artifact
|
|
14
|
+
* @param jsonFilePath 可选:沙箱内的 JSON 数据文件路径(用于大型文档,LLM 先 write_file 再调用)
|
|
15
|
+
* @returns Artifact 保存结果描述字符串
|
|
16
|
+
*/
|
|
17
|
+
export declare function generateAndSave(type: 'pptx' | 'docx' | 'pdf', data: PresentationData | DocumentData, ctx: ToolContext, jsonFilePath?: string, templatesDir?: string): Promise<string>;
|
|
18
|
+
/**
|
|
19
|
+
* 生成 HTML Report 并保存为 Artifact + 推送 Widget 事件
|
|
20
|
+
* 专为 create_report 工具设计:一步完成渲染、保存、内联展示
|
|
21
|
+
*/
|
|
22
|
+
export declare function generateReportAndDisplay(data: ReportData, ctx: ToolContext, jsonFilePath?: string): Promise<string>;
|
|
23
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/doc-generator/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAIH,OAAO,KAAK,EAAW,WAAW,EAAgB,MAAM,yBAAyB,CAAC;AAKlF,OAAO,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AACpD,OAAO,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAChD,OAAO,KAAK,EAAE,gBAAgB,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAC/E,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAGvD,YAAY,EAAE,gBAAgB,EAAE,YAAY,EAAE,YAAY,EAAE,UAAU,EAAE,CAAC;AACzE,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,CAAC;AAiBpC;;;;GAIG;AACH,wBAAsB,eAAe,CACnC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,KAAK,EAC7B,IAAI,EAAE,gBAAgB,GAAG,YAAY,EACrC,GAAG,EAAE,WAAW,EAChB,YAAY,CAAC,EAAE,MAAM,EACrB,YAAY,CAAC,EAAE,MAAM,GACpB,OAAO,CAAC,MAAM,CAAC,CAgHjB;AAED;;;GAGG;AACH,wBAAsB,wBAAwB,CAC5C,IAAI,EAAE,UAAU,EAChB,GAAG,EAAE,WAAW,EAChB,YAAY,CAAC,EAAE,MAAM,GACpB,OAAO,CAAC,MAAM,CAAC,CAgEjB"}
|
|
@@ -0,0 +1,251 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* @file 文档生成模块 - 统一入口
|
|
4
|
+
* @description 为 Agent 工具提供结构化文档生成能力(PPTX / DOCX / PDF / HTML Report)
|
|
5
|
+
*/
|
|
6
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
7
|
+
if (k2 === undefined) k2 = k;
|
|
8
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
9
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
10
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
11
|
+
}
|
|
12
|
+
Object.defineProperty(o, k2, desc);
|
|
13
|
+
}) : (function(o, m, k, k2) {
|
|
14
|
+
if (k2 === undefined) k2 = k;
|
|
15
|
+
o[k2] = m[k];
|
|
16
|
+
}));
|
|
17
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
18
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
19
|
+
}) : function(o, v) {
|
|
20
|
+
o["default"] = v;
|
|
21
|
+
});
|
|
22
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
23
|
+
var ownKeys = function(o) {
|
|
24
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
25
|
+
var ar = [];
|
|
26
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
27
|
+
return ar;
|
|
28
|
+
};
|
|
29
|
+
return ownKeys(o);
|
|
30
|
+
};
|
|
31
|
+
return function (mod) {
|
|
32
|
+
if (mod && mod.__esModule) return mod;
|
|
33
|
+
var result = {};
|
|
34
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
35
|
+
__setModuleDefault(result, mod);
|
|
36
|
+
return result;
|
|
37
|
+
};
|
|
38
|
+
})();
|
|
39
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
40
|
+
exports.renderReport = exports.listThemes = void 0;
|
|
41
|
+
exports.generateAndSave = generateAndSave;
|
|
42
|
+
exports.generateReportAndDisplay = generateReportAndDisplay;
|
|
43
|
+
const path = __importStar(require("path"));
|
|
44
|
+
const fs = __importStar(require("fs"));
|
|
45
|
+
const artifact_service_ts_1 = require("../service/artifact.service.js");
|
|
46
|
+
const pptx_renderer_ts_1 = require("./pptx-renderer.js");
|
|
47
|
+
const docx_renderer_ts_1 = require("./docx-renderer.js");
|
|
48
|
+
const pdf_renderer_ts_1 = require("./pdf-renderer.js");
|
|
49
|
+
const report_renderer_ts_1 = require("./report-renderer.js");
|
|
50
|
+
Object.defineProperty(exports, "renderReport", { enumerable: true, get: function () { return report_renderer_ts_1.renderReport; } });
|
|
51
|
+
const config_loader_ts_1 = require("./config-loader.js");
|
|
52
|
+
Object.defineProperty(exports, "listThemes", { enumerable: true, get: function () { return config_loader_ts_1.listThemes; } });
|
|
53
|
+
/** 各类型对应的文件扩展名 */
|
|
54
|
+
const EXT_MAP = { pptx: '.pptx', docx: '.docx', pdf: '.pdf', html: '.html' };
|
|
55
|
+
/** 确保文件名带有正确的扩展名 */
|
|
56
|
+
function ensureExtension(filename, type) {
|
|
57
|
+
const ext = EXT_MAP[type];
|
|
58
|
+
if (!ext)
|
|
59
|
+
return filename;
|
|
60
|
+
// 如果没有扩展名,补上
|
|
61
|
+
if (!filename.includes('.'))
|
|
62
|
+
return filename + ext;
|
|
63
|
+
// 如果扩展名不对(比如 LLM 传了 .ppt 而不是 .pptx),替换
|
|
64
|
+
const currentExt = path.extname(filename).toLowerCase();
|
|
65
|
+
if (currentExt !== ext)
|
|
66
|
+
return filename.replace(new RegExp(`\\${currentExt}$`, 'i'), ext);
|
|
67
|
+
return filename;
|
|
68
|
+
}
|
|
69
|
+
/**
|
|
70
|
+
* 生成文档并保存为 Artifact
|
|
71
|
+
* @param jsonFilePath 可选:沙箱内的 JSON 数据文件路径(用于大型文档,LLM 先 write_file 再调用)
|
|
72
|
+
* @returns Artifact 保存结果描述字符串
|
|
73
|
+
*/
|
|
74
|
+
async function generateAndSave(type, data, ctx, jsonFilePath, templatesDir) {
|
|
75
|
+
// 如果提供了 json_file,从沙箱读取 JSON 并合并到 data
|
|
76
|
+
if (jsonFilePath) {
|
|
77
|
+
const sandbox = ctx.custom?.sandbox;
|
|
78
|
+
if (!sandbox)
|
|
79
|
+
return 'Error: Sandbox not available. Cannot read json_file.';
|
|
80
|
+
const resolvedPath = path.isAbsolute(jsonFilePath)
|
|
81
|
+
? jsonFilePath
|
|
82
|
+
: path.join(sandbox.rootDir, jsonFilePath);
|
|
83
|
+
// 安全检查:确保路径在沙箱内
|
|
84
|
+
if (!resolvedPath.startsWith(sandbox.rootDir)) {
|
|
85
|
+
return `Error: json_file path must be within sandbox directory.`;
|
|
86
|
+
}
|
|
87
|
+
try {
|
|
88
|
+
const raw = fs.readFileSync(resolvedPath, 'utf-8');
|
|
89
|
+
const jsonData = JSON.parse(raw);
|
|
90
|
+
// 合并:JSON 文件中的字段优先(slides/blocks 等大字段),内联参数作为 fallback
|
|
91
|
+
if (type === 'pptx') {
|
|
92
|
+
const d = data;
|
|
93
|
+
data = {
|
|
94
|
+
...jsonData,
|
|
95
|
+
title: d.title || jsonData.title,
|
|
96
|
+
theme: d.theme || jsonData.theme,
|
|
97
|
+
filename: d.filename || jsonData.filename,
|
|
98
|
+
};
|
|
99
|
+
}
|
|
100
|
+
else {
|
|
101
|
+
const d = data;
|
|
102
|
+
data = {
|
|
103
|
+
...jsonData,
|
|
104
|
+
title: d.title || jsonData.title,
|
|
105
|
+
theme: d.theme || jsonData.theme,
|
|
106
|
+
options: d.options || jsonData.options,
|
|
107
|
+
filename: d.filename || jsonData.filename,
|
|
108
|
+
};
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
catch (err) {
|
|
112
|
+
return `Error: Failed to read or parse json_file "${jsonFilePath}": ${err?.message || err}`;
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
// 1. 渲染文档
|
|
116
|
+
let result;
|
|
117
|
+
switch (type) {
|
|
118
|
+
case 'pptx':
|
|
119
|
+
result = await (0, pptx_renderer_ts_1.renderPptx)(data, templatesDir);
|
|
120
|
+
break;
|
|
121
|
+
case 'docx':
|
|
122
|
+
result = await (0, docx_renderer_ts_1.renderDocx)(data, templatesDir);
|
|
123
|
+
break;
|
|
124
|
+
case 'pdf':
|
|
125
|
+
result = await (0, pdf_renderer_ts_1.renderPdf)(data, templatesDir);
|
|
126
|
+
break;
|
|
127
|
+
default:
|
|
128
|
+
return `Error: Unsupported document type: ${type}`;
|
|
129
|
+
}
|
|
130
|
+
// 确保文件名带正确扩展名(LLM 可能传入无后缀的文件名)
|
|
131
|
+
result.filename = ensureExtension(result.filename, type);
|
|
132
|
+
// 2. 保存到沙箱
|
|
133
|
+
const sandbox = ctx.custom?.sandbox;
|
|
134
|
+
if (!sandbox) {
|
|
135
|
+
return 'Error: Sandbox not available. Cannot save document artifact.';
|
|
136
|
+
}
|
|
137
|
+
const fsExec = sandbox.getFileSystemExecutor();
|
|
138
|
+
if (!fsExec) {
|
|
139
|
+
return 'Error: FileSystem executor not available in sandbox.';
|
|
140
|
+
}
|
|
141
|
+
// 写入临时文件到 Artifact 临时目录,避免污染沙箱根目录
|
|
142
|
+
const tempDir = '_artifacts/.tmp';
|
|
143
|
+
const tempPath = `${tempDir}/${result.filename}`;
|
|
144
|
+
try {
|
|
145
|
+
if (fsExec.writeFile) {
|
|
146
|
+
// 对于二进制文件,需要通过 shell 写入
|
|
147
|
+
const shell = sandbox.getShellExecutor();
|
|
148
|
+
const base64 = result.buffer.toString('base64');
|
|
149
|
+
// 分段写入 base64 以避免命令过长
|
|
150
|
+
const chunkSize = 50000;
|
|
151
|
+
await shell.exec(`mkdir -p "${tempDir}" && echo -n "" > "${tempPath}.b64"`, 5000);
|
|
152
|
+
for (let i = 0; i < base64.length; i += chunkSize) {
|
|
153
|
+
const chunk = base64.slice(i, i + chunkSize);
|
|
154
|
+
await shell.exec(`echo -n "${chunk}" >> "${tempPath}.b64"`, 5000);
|
|
155
|
+
}
|
|
156
|
+
await shell.exec(`base64 -d "${tempPath}.b64" > "${tempPath}" && rm "${tempPath}.b64"`, 10000);
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
catch (err) {
|
|
160
|
+
return `Error: Failed to write document file to sandbox: ${err?.message || err}`;
|
|
161
|
+
}
|
|
162
|
+
// 3. 保存为 Artifact
|
|
163
|
+
try {
|
|
164
|
+
const sessionId = ctx.sessionId || 'default';
|
|
165
|
+
const artifactResult = (0, artifact_service_ts_1.saveArtifact)(sandbox.rootDir, sessionId, result.filename, result.buffer);
|
|
166
|
+
// 通过 SSE 推送到前端(去重命中时跳过)
|
|
167
|
+
const emitArtifact = ctx.emitArtifact;
|
|
168
|
+
if (emitArtifact && !artifactResult.dedup) {
|
|
169
|
+
emitArtifact({
|
|
170
|
+
artifactId: artifactResult.artifactId,
|
|
171
|
+
filename: artifactResult.filename,
|
|
172
|
+
mimeType: artifactResult.mimeType,
|
|
173
|
+
size: artifactResult.size,
|
|
174
|
+
url: artifactResult.url,
|
|
175
|
+
description: `${type.toUpperCase()} document: ${data.title}`,
|
|
176
|
+
});
|
|
177
|
+
}
|
|
178
|
+
return `Document created: ${artifactResult.filename} (${artifactResult.size} bytes). It has been added to the artifact panel for preview and download.`;
|
|
179
|
+
}
|
|
180
|
+
catch (err) {
|
|
181
|
+
return `Error: Failed to save artifact: ${err?.message || err}`;
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
/**
|
|
185
|
+
* 生成 HTML Report 并保存为 Artifact + 推送 Widget 事件
|
|
186
|
+
* 专为 create_report 工具设计:一步完成渲染、保存、内联展示
|
|
187
|
+
*/
|
|
188
|
+
async function generateReportAndDisplay(data, ctx, jsonFilePath) {
|
|
189
|
+
// 如果提供了 json_file,从沙箱读取 JSON 并合并
|
|
190
|
+
if (jsonFilePath) {
|
|
191
|
+
const sandbox = ctx.custom?.sandbox;
|
|
192
|
+
if (!sandbox)
|
|
193
|
+
return 'Error: Sandbox not available. Cannot read json_file.';
|
|
194
|
+
const resolvedPath = path.isAbsolute(jsonFilePath)
|
|
195
|
+
? jsonFilePath
|
|
196
|
+
: path.join(sandbox.rootDir, jsonFilePath);
|
|
197
|
+
if (!resolvedPath.startsWith(sandbox.rootDir)) {
|
|
198
|
+
return `Error: json_file path must be within sandbox directory.`;
|
|
199
|
+
}
|
|
200
|
+
try {
|
|
201
|
+
const raw = fs.readFileSync(resolvedPath, 'utf-8');
|
|
202
|
+
const jsonData = JSON.parse(raw);
|
|
203
|
+
data = {
|
|
204
|
+
...jsonData,
|
|
205
|
+
title: data.title || jsonData.title,
|
|
206
|
+
theme: data.theme || jsonData.theme,
|
|
207
|
+
subtitle: data.subtitle || jsonData.subtitle,
|
|
208
|
+
date: data.date || jsonData.date,
|
|
209
|
+
};
|
|
210
|
+
}
|
|
211
|
+
catch (err) {
|
|
212
|
+
return `Error: Failed to read or parse json_file "${jsonFilePath}": ${err?.message || err}`;
|
|
213
|
+
}
|
|
214
|
+
}
|
|
215
|
+
if (!data.title)
|
|
216
|
+
return 'Error: title is required for report generation.';
|
|
217
|
+
// 1. 渲染 HTML
|
|
218
|
+
const html = (0, report_renderer_ts_1.renderReport)(data);
|
|
219
|
+
const buffer = Buffer.from(html, 'utf-8');
|
|
220
|
+
const filename = data.filename
|
|
221
|
+
? ensureExtension(data.filename, 'html')
|
|
222
|
+
: `${data.title.replace(/[^\w\u4e00-\u9fff]+/g, '_').slice(0, 50)}.html`;
|
|
223
|
+
// 2. 保存到沙箱 + Artifact
|
|
224
|
+
const sandbox = ctx.custom?.sandbox;
|
|
225
|
+
if (!sandbox)
|
|
226
|
+
return 'Error: Sandbox not available.';
|
|
227
|
+
let artifactSize = buffer.length;
|
|
228
|
+
try {
|
|
229
|
+
const sessionId = ctx.sessionId || 'default';
|
|
230
|
+
const artifactResult = (0, artifact_service_ts_1.saveArtifact)(sandbox.rootDir, sessionId, filename, buffer);
|
|
231
|
+
artifactSize = artifactResult.size;
|
|
232
|
+
// 推送 artifact 事件
|
|
233
|
+
const emitArtifact = ctx.emitArtifact;
|
|
234
|
+
if (emitArtifact && !artifactResult.dedup) {
|
|
235
|
+
emitArtifact({
|
|
236
|
+
artifactId: artifactResult.artifactId,
|
|
237
|
+
filename: artifactResult.filename,
|
|
238
|
+
mimeType: 'text/html',
|
|
239
|
+
size: artifactResult.size,
|
|
240
|
+
url: artifactResult.url,
|
|
241
|
+
description: `HTML Report: ${data.title}`,
|
|
242
|
+
});
|
|
243
|
+
}
|
|
244
|
+
}
|
|
245
|
+
catch (err) {
|
|
246
|
+
return `Error: Failed to save report artifact: ${err?.message || err}`;
|
|
247
|
+
}
|
|
248
|
+
// 3. 不再推送 Widget 事件 — artifact 卡片自带预览入口,避免与 ArtifactCard 重复展示相同内容
|
|
249
|
+
return `Report created: ${filename} (${artifactSize} bytes). It has been added to the artifact panel for preview and download.`;
|
|
250
|
+
}
|
|
251
|
+
//# sourceMappingURL=index.js.map
|