@midscene/core 1.10.2-beta-20260706032158.0 → 1.10.3
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/dist/es/agent/agent.mjs +40 -1
- package/dist/es/agent/agent.mjs.map +1 -1
- package/dist/es/agent/metrics.mjs +81 -0
- package/dist/es/agent/metrics.mjs.map +1 -0
- package/dist/es/agent/task-builder.mjs +1 -1
- package/dist/es/agent/task-builder.mjs.map +1 -1
- package/dist/es/agent/utils.mjs +1 -1
- package/dist/es/ai-model/connectivity/run-connectivity-test.mjs +9 -3
- package/dist/es/ai-model/connectivity/run-connectivity-test.mjs.map +1 -1
- package/dist/es/ai-model/inspect.mjs +3 -3
- package/dist/es/ai-model/inspect.mjs.map +1 -1
- package/dist/es/ai-model/llm-planning.mjs +1 -1
- package/dist/es/ai-model/llm-planning.mjs.map +1 -1
- package/dist/es/ai-model/model-adapter/resolve.mjs +2 -2
- package/dist/es/ai-model/model-adapter/resolve.mjs.map +1 -1
- package/dist/es/ai-model/models/default.mjs +2 -1
- package/dist/es/ai-model/models/default.mjs.map +1 -1
- package/dist/es/ai-model/models/doubao.mjs +38 -60
- package/dist/es/ai-model/models/doubao.mjs.map +1 -1
- package/dist/es/ai-model/models/gemini.mjs +4 -15
- package/dist/es/ai-model/models/gemini.mjs.map +1 -1
- package/dist/es/ai-model/models/glm.mjs +4 -0
- package/dist/es/ai-model/models/glm.mjs.map +1 -1
- package/dist/es/ai-model/models/gpt.mjs +5 -1
- package/dist/es/ai-model/models/gpt.mjs.map +1 -1
- package/dist/es/ai-model/models/kimi.mjs +4 -0
- package/dist/es/ai-model/models/kimi.mjs.map +1 -1
- package/dist/es/ai-model/models/mimo.mjs +3 -2
- package/dist/es/ai-model/models/mimo.mjs.map +1 -1
- package/dist/es/ai-model/models/qwen.mjs.map +1 -1
- package/dist/es/ai-model/models/ui-tars/adapter.mjs +2 -41
- package/dist/es/ai-model/models/ui-tars/adapter.mjs.map +1 -1
- package/dist/es/ai-model/models/utils/intent.mjs +6 -0
- package/dist/es/ai-model/models/utils/intent.mjs.map +1 -0
- package/dist/es/ai-model/prompt/describe.mjs +31 -34
- package/dist/es/ai-model/prompt/describe.mjs.map +1 -1
- package/dist/es/ai-model/prompt/extraction.mjs +15 -9
- package/dist/es/ai-model/prompt/extraction.mjs.map +1 -1
- package/dist/es/ai-model/prompt/llm-planning.mjs +19 -19
- package/dist/es/ai-model/prompt/llm-planning.mjs.map +1 -1
- package/dist/es/ai-model/prompt/locate-grounding-rules.mjs +7 -3
- package/dist/es/ai-model/prompt/locate-grounding-rules.mjs.map +1 -1
- package/dist/es/ai-model/prompt/recorder-metadata-generator.mjs +2 -1
- package/dist/es/ai-model/prompt/recorder-metadata-generator.mjs.map +1 -1
- package/dist/es/ai-model/service-caller/index.mjs +40 -19
- package/dist/es/ai-model/service-caller/index.mjs.map +1 -1
- package/dist/es/ai-model/service-caller/json.mjs +31 -28
- package/dist/es/ai-model/service-caller/json.mjs.map +1 -1
- package/dist/es/device/index.mjs +2 -4
- package/dist/es/device/index.mjs.map +1 -1
- package/dist/es/dump/html-utils.mjs +63 -1
- package/dist/es/dump/html-utils.mjs.map +1 -1
- package/dist/es/dump/screenshot-restoration.mjs +6 -0
- package/dist/es/dump/screenshot-restoration.mjs.map +1 -1
- package/dist/es/element-describer.mjs +36 -18
- package/dist/es/element-describer.mjs.map +1 -1
- package/dist/es/index.mjs +2 -2
- package/dist/es/index.mjs.map +1 -1
- package/dist/es/report-generator.mjs +28 -1
- package/dist/es/report-generator.mjs.map +1 -1
- package/dist/es/report-markdown.mjs +300 -35
- package/dist/es/report-markdown.mjs.map +1 -1
- package/dist/es/report.mjs +29 -1
- package/dist/es/report.mjs.map +1 -1
- package/dist/es/service/index.mjs +101 -25
- package/dist/es/service/index.mjs.map +1 -1
- package/dist/es/service/utils.mjs +65 -1
- package/dist/es/service/utils.mjs.map +1 -1
- package/dist/es/types.mjs.map +1 -1
- package/dist/es/utils.mjs +2 -2
- package/dist/lib/agent/agent.js +40 -1
- package/dist/lib/agent/agent.js.map +1 -1
- package/dist/lib/agent/metrics.js +115 -0
- package/dist/lib/agent/metrics.js.map +1 -0
- package/dist/lib/agent/task-builder.js +1 -1
- package/dist/lib/agent/task-builder.js.map +1 -1
- package/dist/lib/agent/utils.js +1 -1
- package/dist/lib/ai-model/connectivity/run-connectivity-test.js +9 -3
- package/dist/lib/ai-model/connectivity/run-connectivity-test.js.map +1 -1
- package/dist/lib/ai-model/inspect.js +3 -3
- package/dist/lib/ai-model/inspect.js.map +1 -1
- package/dist/lib/ai-model/llm-planning.js +1 -1
- package/dist/lib/ai-model/llm-planning.js.map +1 -1
- package/dist/lib/ai-model/model-adapter/resolve.js +1 -1
- package/dist/lib/ai-model/model-adapter/resolve.js.map +1 -1
- package/dist/lib/ai-model/models/default.js +2 -1
- package/dist/lib/ai-model/models/default.js.map +1 -1
- package/dist/lib/ai-model/models/doubao.js +38 -69
- package/dist/lib/ai-model/models/doubao.js.map +1 -1
- package/dist/lib/ai-model/models/gemini.js +4 -15
- package/dist/lib/ai-model/models/gemini.js.map +1 -1
- package/dist/lib/ai-model/models/glm.js +4 -0
- package/dist/lib/ai-model/models/glm.js.map +1 -1
- package/dist/lib/ai-model/models/gpt.js +5 -1
- package/dist/lib/ai-model/models/gpt.js.map +1 -1
- package/dist/lib/ai-model/models/kimi.js +4 -0
- package/dist/lib/ai-model/models/kimi.js.map +1 -1
- package/dist/lib/ai-model/models/mimo.js +3 -2
- package/dist/lib/ai-model/models/mimo.js.map +1 -1
- package/dist/lib/ai-model/models/qwen.js.map +1 -1
- package/dist/lib/ai-model/models/ui-tars/adapter.js +1 -40
- package/dist/lib/ai-model/models/ui-tars/adapter.js.map +1 -1
- package/dist/lib/ai-model/models/utils/intent.js +40 -0
- package/dist/lib/ai-model/models/utils/intent.js.map +1 -0
- package/dist/lib/ai-model/prompt/describe.js +31 -34
- package/dist/lib/ai-model/prompt/describe.js.map +1 -1
- package/dist/lib/ai-model/prompt/extraction.js +14 -8
- package/dist/lib/ai-model/prompt/extraction.js.map +1 -1
- package/dist/lib/ai-model/prompt/llm-planning.js +19 -19
- package/dist/lib/ai-model/prompt/llm-planning.js.map +1 -1
- package/dist/lib/ai-model/prompt/locate-grounding-rules.js +7 -3
- package/dist/lib/ai-model/prompt/locate-grounding-rules.js.map +1 -1
- package/dist/lib/ai-model/prompt/recorder-metadata-generator.js +4 -3
- package/dist/lib/ai-model/prompt/recorder-metadata-generator.js.map +1 -1
- package/dist/lib/ai-model/service-caller/index.js +44 -23
- package/dist/lib/ai-model/service-caller/index.js.map +1 -1
- package/dist/lib/ai-model/service-caller/json.js +33 -33
- package/dist/lib/ai-model/service-caller/json.js.map +1 -1
- package/dist/lib/device/index.js +2 -4
- package/dist/lib/device/index.js.map +1 -1
- package/dist/lib/dump/html-utils.js +65 -0
- package/dist/lib/dump/html-utils.js.map +1 -1
- package/dist/lib/dump/screenshot-restoration.js +6 -0
- package/dist/lib/dump/screenshot-restoration.js.map +1 -1
- package/dist/lib/element-describer.js +37 -22
- package/dist/lib/element-describer.js.map +1 -1
- package/dist/lib/index.js +1 -4
- package/dist/lib/index.js.map +1 -1
- package/dist/lib/report-generator.js +27 -0
- package/dist/lib/report-generator.js.map +1 -1
- package/dist/lib/report-markdown.js +300 -35
- package/dist/lib/report-markdown.js.map +1 -1
- package/dist/lib/report.js +28 -0
- package/dist/lib/report.js.map +1 -1
- package/dist/lib/service/index.js +99 -23
- package/dist/lib/service/index.js.map +1 -1
- package/dist/lib/service/utils.js +98 -1
- package/dist/lib/service/utils.js.map +1 -1
- package/dist/lib/types.js.map +1 -1
- package/dist/lib/utils.js +2 -2
- package/dist/types/agent/agent.d.ts +15 -2
- package/dist/types/agent/index.d.ts +1 -0
- package/dist/types/agent/metrics.d.ts +48 -0
- package/dist/types/ai-model/model-adapter/types.d.ts +8 -0
- package/dist/types/ai-model/models/doubao.d.ts +1 -4
- package/dist/types/ai-model/models/gemini.d.ts +1 -1
- package/dist/types/ai-model/models/registry.d.ts +1 -1
- package/dist/types/ai-model/models/utils/intent.d.ts +2 -0
- package/dist/types/ai-model/service-caller/index.d.ts +8 -3
- package/dist/types/ai-model/service-caller/json.d.ts +19 -2
- package/dist/types/device/device-options.d.ts +0 -28
- package/dist/types/device/index.d.ts +0 -5
- package/dist/types/dump/html-utils.d.ts +2 -0
- package/dist/types/dump/screenshot-restoration.d.ts +1 -1
- package/dist/types/element-describer.d.ts +3 -6
- package/dist/types/index.d.ts +2 -2
- package/dist/types/report-generator.d.ts +6 -0
- package/dist/types/service/index.d.ts +1 -1
- package/dist/types/service/utils.d.ts +21 -2
- package/dist/types/types.d.ts +12 -2
- package/package.json +3 -3
|
@@ -27,10 +27,12 @@ __webpack_require__.d(__webpack_exports__, {
|
|
|
27
27
|
executionToMarkdown: ()=>executionToMarkdown,
|
|
28
28
|
reportToMarkdown: ()=>reportToMarkdown
|
|
29
29
|
});
|
|
30
|
-
const external_node_path_namespaceObject = require("node:path");
|
|
31
30
|
const ui_utils_js_namespaceObject = require("./agent/ui-utils.js");
|
|
32
31
|
const external_screenshot_item_js_namespaceObject = require("./screenshot-item.js");
|
|
33
32
|
const screenshot_store_js_namespaceObject = require("./dump/screenshot-store.js");
|
|
33
|
+
const screenshotDataUrlPattern = /^data:image\/(png|jpeg|jpg);base64,([\s\S]*)$/i;
|
|
34
|
+
const rawBase64BodyPattern = /^[a-zA-Z0-9+/=\s]+$/;
|
|
35
|
+
const jsonContextMaxStringLength = 12000;
|
|
34
36
|
function toExecutionDump(execution) {
|
|
35
37
|
if (!execution || 'object' != typeof execution) throw new Error('executionToMarkdown: execution is required');
|
|
36
38
|
if (!Array.isArray(execution.tasks)) throw new Error('executionToMarkdown: execution.tasks must be an array');
|
|
@@ -46,6 +48,165 @@ function formatTime(ts) {
|
|
|
46
48
|
if ('number' != typeof ts || Number.isNaN(ts)) return 'N/A';
|
|
47
49
|
return new Date(ts).toISOString();
|
|
48
50
|
}
|
|
51
|
+
function formatValue(value) {
|
|
52
|
+
if (null == value || '' === value) return 'N/A';
|
|
53
|
+
if ('number' == typeof value) return Number.isFinite(value) ? String(value) : 'N/A';
|
|
54
|
+
return String(value);
|
|
55
|
+
}
|
|
56
|
+
function escapeTableCell(value) {
|
|
57
|
+
return formatValue(value).replace(/\|/g, '\\|').replace(/\n/g, '<br>');
|
|
58
|
+
}
|
|
59
|
+
function markdownTable(headers, rows) {
|
|
60
|
+
return [
|
|
61
|
+
`| ${headers.map(escapeTableCell).join(' | ')} |`,
|
|
62
|
+
`| ${headers.map(()=>'---').join(' | ')} |`,
|
|
63
|
+
...rows.map((row)=>`| ${row.map(escapeTableCell).join(' | ')} |`)
|
|
64
|
+
];
|
|
65
|
+
}
|
|
66
|
+
function modelBriefRows(modelBriefs) {
|
|
67
|
+
return modelBriefs.map((brief)=>[
|
|
68
|
+
brief.intent || 'default',
|
|
69
|
+
brief.name || 'N/A',
|
|
70
|
+
brief.modelDescription || 'N/A'
|
|
71
|
+
]);
|
|
72
|
+
}
|
|
73
|
+
function modelRowsFromUsage(report) {
|
|
74
|
+
const rows = new Map();
|
|
75
|
+
const addUsage = (source, usage)=>{
|
|
76
|
+
if (!hasUsage(usage)) return;
|
|
77
|
+
const intent = usage.intent || source;
|
|
78
|
+
const model = usage.model_name || usage.response_model_name;
|
|
79
|
+
const description = usage.model_description;
|
|
80
|
+
const key = `${intent}\0${model || ''}\0${description || ''}`;
|
|
81
|
+
if (rows.has(key)) return;
|
|
82
|
+
rows.set(key, [
|
|
83
|
+
intent,
|
|
84
|
+
model || 'N/A',
|
|
85
|
+
description || 'N/A'
|
|
86
|
+
]);
|
|
87
|
+
};
|
|
88
|
+
for (const execution of report.executions)for (const task of execution.tasks){
|
|
89
|
+
const taskWithUsage = task;
|
|
90
|
+
addUsage('main', taskWithUsage.usage);
|
|
91
|
+
addUsage('searchArea', taskWithUsage.searchAreaUsage);
|
|
92
|
+
}
|
|
93
|
+
return Array.from(rows.values());
|
|
94
|
+
}
|
|
95
|
+
function usageValue(usage, key) {
|
|
96
|
+
const value = usage?.[key];
|
|
97
|
+
return 'number' == typeof value && Number.isFinite(value) ? value : 0;
|
|
98
|
+
}
|
|
99
|
+
function hasUsage(usage) {
|
|
100
|
+
if (!usage) return false;
|
|
101
|
+
return [
|
|
102
|
+
'intent',
|
|
103
|
+
'model_name',
|
|
104
|
+
"model_description",
|
|
105
|
+
'prompt_tokens',
|
|
106
|
+
'cached_input',
|
|
107
|
+
'completion_tokens',
|
|
108
|
+
'total_tokens',
|
|
109
|
+
'time_cost',
|
|
110
|
+
'request_id'
|
|
111
|
+
].some((key)=>void 0 !== usage[key] && null !== usage[key]);
|
|
112
|
+
}
|
|
113
|
+
function usageTotalTokens(usage) {
|
|
114
|
+
const explicitTotal = usageValue(usage, 'total_tokens');
|
|
115
|
+
if (explicitTotal > 0) return explicitTotal;
|
|
116
|
+
return usageValue(usage, 'prompt_tokens') + usageValue(usage, 'completion_tokens');
|
|
117
|
+
}
|
|
118
|
+
function usageModelName(usage) {
|
|
119
|
+
return usage.model_name || usage.response_model_name || usage.model_description || usage.intent || 'Unknown';
|
|
120
|
+
}
|
|
121
|
+
function usageRowsForTask(task) {
|
|
122
|
+
const taskWithUsage = task;
|
|
123
|
+
const rows = [];
|
|
124
|
+
const appendUsage = (source, usage)=>{
|
|
125
|
+
if (!hasUsage(usage)) return;
|
|
126
|
+
rows.push([
|
|
127
|
+
source,
|
|
128
|
+
usage.intent,
|
|
129
|
+
usage.model_name || usage.response_model_name,
|
|
130
|
+
usage.model_description,
|
|
131
|
+
usageValue(usage, 'prompt_tokens'),
|
|
132
|
+
usageValue(usage, 'cached_input'),
|
|
133
|
+
usageValue(usage, 'completion_tokens'),
|
|
134
|
+
usageTotalTokens(usage),
|
|
135
|
+
usageValue(usage, 'time_cost'),
|
|
136
|
+
usage.request_id
|
|
137
|
+
]);
|
|
138
|
+
};
|
|
139
|
+
appendUsage('main', taskWithUsage.usage);
|
|
140
|
+
appendUsage('searchArea', taskWithUsage.searchAreaUsage);
|
|
141
|
+
return rows;
|
|
142
|
+
}
|
|
143
|
+
function collectUsageTotals(report) {
|
|
144
|
+
const totalsByModel = new Map();
|
|
145
|
+
const addUsage = (usage)=>{
|
|
146
|
+
if (!hasUsage(usage)) return;
|
|
147
|
+
const modelName = usageModelName(usage);
|
|
148
|
+
const current = totalsByModel.get(modelName) ?? {
|
|
149
|
+
calls: 0,
|
|
150
|
+
prompt: 0,
|
|
151
|
+
cachedInput: 0,
|
|
152
|
+
completion: 0,
|
|
153
|
+
total: 0,
|
|
154
|
+
timeCost: 0
|
|
155
|
+
};
|
|
156
|
+
totalsByModel.set(modelName, {
|
|
157
|
+
calls: current.calls + 1,
|
|
158
|
+
prompt: current.prompt + usageValue(usage, 'prompt_tokens'),
|
|
159
|
+
cachedInput: current.cachedInput + usageValue(usage, 'cached_input'),
|
|
160
|
+
completion: current.completion + usageValue(usage, 'completion_tokens'),
|
|
161
|
+
total: current.total + usageTotalTokens(usage),
|
|
162
|
+
timeCost: current.timeCost + usageValue(usage, 'time_cost')
|
|
163
|
+
});
|
|
164
|
+
};
|
|
165
|
+
for (const execution of report.executions)for (const task of execution.tasks){
|
|
166
|
+
const taskWithUsage = task;
|
|
167
|
+
addUsage(taskWithUsage.usage);
|
|
168
|
+
addUsage(taskWithUsage.searchAreaUsage);
|
|
169
|
+
}
|
|
170
|
+
return totalsByModel;
|
|
171
|
+
}
|
|
172
|
+
function sanitizeJsonForMarkdown(value, seen = new WeakSet()) {
|
|
173
|
+
if ('string' == typeof value) {
|
|
174
|
+
if (screenshotDataUrlPattern.test(value) || value.length > 1000000 || /^[a-zA-Z0-9+/=\s]{100000,}$/.test(value)) return `[omitted image/base64 string, length=${value.length}]`;
|
|
175
|
+
if (value.length > jsonContextMaxStringLength) return `${value.slice(0, jsonContextMaxStringLength)}\n[truncated, original length=${value.length}]`;
|
|
176
|
+
return value;
|
|
177
|
+
}
|
|
178
|
+
if (null === value || 'number' == typeof value || 'boolean' == typeof value) return value;
|
|
179
|
+
if ('function' == typeof value) return '[omitted function]';
|
|
180
|
+
if ('object' != typeof value || void 0 === value) return;
|
|
181
|
+
if (seen.has(value)) return '[omitted circular reference]';
|
|
182
|
+
seen.add(value);
|
|
183
|
+
if (Array.isArray(value)) return value.map((item)=>sanitizeJsonForMarkdown(item, seen));
|
|
184
|
+
const input = value;
|
|
185
|
+
const output = {};
|
|
186
|
+
for (const [key, entry] of Object.entries(input))if (void 0 !== entry && 'function' != typeof entry) {
|
|
187
|
+
if ('string' == typeof entry && /(^|_|-)(base64|screenshotBase64|imageBase64)$/i.test(key)) {
|
|
188
|
+
output[key] = `[omitted base64 string, length=${entry.length}]`;
|
|
189
|
+
continue;
|
|
190
|
+
}
|
|
191
|
+
output[key] = sanitizeJsonForMarkdown(entry, seen);
|
|
192
|
+
}
|
|
193
|
+
seen.delete(value);
|
|
194
|
+
return output;
|
|
195
|
+
}
|
|
196
|
+
function appendJsonSection(lines, title, value) {
|
|
197
|
+
if (null == value || '' === value) return;
|
|
198
|
+
const sanitized = sanitizeJsonForMarkdown(value);
|
|
199
|
+
if (void 0 === sanitized) return;
|
|
200
|
+
lines.push('', `### ${title}`, '', '```json');
|
|
201
|
+
lines.push(JSON.stringify(sanitized, null, 2));
|
|
202
|
+
lines.push('```');
|
|
203
|
+
}
|
|
204
|
+
function appendTextSection(lines, title, value) {
|
|
205
|
+
if ('string' != typeof value || !value.trim()) return;
|
|
206
|
+
lines.push('', `### ${title}`, '', '```text');
|
|
207
|
+
lines.push(value.replace(/```/g, '` ` `'));
|
|
208
|
+
lines.push('```');
|
|
209
|
+
}
|
|
49
210
|
function resolveTaskTiming(task) {
|
|
50
211
|
const timing = task.timing;
|
|
51
212
|
if (!timing) return {};
|
|
@@ -86,16 +247,35 @@ function extractLocateCenter(task) {
|
|
|
86
247
|
];
|
|
87
248
|
}
|
|
88
249
|
function tryExtractBase64(screenshot) {
|
|
250
|
+
if ('string' == typeof screenshot) {
|
|
251
|
+
const trimmedScreenshot = screenshot.trim();
|
|
252
|
+
const dataUrlMatch = trimmedScreenshot.match(screenshotDataUrlPattern);
|
|
253
|
+
if (dataUrlMatch) {
|
|
254
|
+
const format = 'jpg' === dataUrlMatch[1].toLowerCase() ? 'jpeg' : 'png';
|
|
255
|
+
const base64Body = dataUrlMatch[2].replace(/\s/g, '');
|
|
256
|
+
if (!base64Body) return;
|
|
257
|
+
return `data:image/${format};base64,${base64Body}`;
|
|
258
|
+
}
|
|
259
|
+
if (trimmedScreenshot.startsWith('data:') || !rawBase64BodyPattern.test(trimmedScreenshot)) return;
|
|
260
|
+
const base64Body = trimmedScreenshot.replace(/\s/g, '');
|
|
261
|
+
return base64Body ? `data:image/png;base64,${base64Body}` : void 0;
|
|
262
|
+
}
|
|
89
263
|
if (!screenshot || 'object' != typeof screenshot) return;
|
|
90
264
|
const s = screenshot;
|
|
91
265
|
if ('string' == typeof s.base64 && s.base64.length > 0) return s.base64;
|
|
92
266
|
}
|
|
93
|
-
function
|
|
267
|
+
function restoredSourceRef(screenshot) {
|
|
268
|
+
if (!screenshot || 'object' != typeof screenshot) return;
|
|
269
|
+
const sourceRef = screenshot.sourceRef;
|
|
270
|
+
return (0, screenshot_store_js_namespaceObject.normalizeScreenshotRef)(sourceRef) ?? void 0;
|
|
271
|
+
}
|
|
272
|
+
function screenshotAttachment(screenshot, screenshotBaseDir, executionIndex, taskIndex, options) {
|
|
273
|
+
const markdownLabel = options?.label || `task-${taskIndex + 1}`;
|
|
94
274
|
if (screenshot instanceof external_screenshot_item_js_namespaceObject.ScreenshotItem) {
|
|
95
275
|
const ext = screenshot.extension;
|
|
96
276
|
const suggestedFileName = `execution-${executionIndex + 1}-task-${taskIndex + 1}-${screenshot.id}.${ext}`;
|
|
97
277
|
return {
|
|
98
|
-
markdown: `\n`,
|
|
99
279
|
attachment: {
|
|
100
280
|
id: screenshot.id,
|
|
101
281
|
suggestedFileName,
|
|
@@ -111,7 +291,7 @@ function screenshotAttachment(screenshot, screenshotBaseDir, executionIndex, tas
|
|
|
111
291
|
const ext = 'image/jpeg' === ref.mimeType ? 'jpeg' : 'png';
|
|
112
292
|
const suggestedFileName = `execution-${executionIndex + 1}-task-${taskIndex + 1}-${ref.id}.${ext}`;
|
|
113
293
|
return {
|
|
114
|
-
markdown: `\n`,
|
|
115
295
|
attachment: {
|
|
116
296
|
id: ref.id,
|
|
117
297
|
suggestedFileName,
|
|
@@ -123,13 +303,31 @@ function screenshotAttachment(screenshot, screenshotBaseDir, executionIndex, tas
|
|
|
123
303
|
}
|
|
124
304
|
};
|
|
125
305
|
}
|
|
306
|
+
const sourceRef = restoredSourceRef(screenshot);
|
|
307
|
+
if (sourceRef) {
|
|
308
|
+
const ext = 'image/jpeg' === sourceRef.mimeType ? 'jpeg' : 'png';
|
|
309
|
+
const suggestedFileName = `execution-${executionIndex + 1}-task-${taskIndex + 1}-${sourceRef.id}.${ext}`;
|
|
310
|
+
return {
|
|
311
|
+
markdown: `\n`,
|
|
312
|
+
attachment: {
|
|
313
|
+
id: sourceRef.id,
|
|
314
|
+
suggestedFileName,
|
|
315
|
+
sourceRef,
|
|
316
|
+
mimeType: sourceRef.mimeType,
|
|
317
|
+
executionIndex,
|
|
318
|
+
taskIndex,
|
|
319
|
+
base64Data: tryExtractBase64(screenshot)
|
|
320
|
+
}
|
|
321
|
+
};
|
|
322
|
+
}
|
|
126
323
|
const base64 = tryExtractBase64(screenshot);
|
|
127
324
|
if (base64) {
|
|
128
325
|
const ext = base64.startsWith('data:image/jpeg') ? 'jpeg' : 'png';
|
|
129
|
-
const
|
|
326
|
+
const idSuffix = options?.fallbackIdSuffix ? `-${options.fallbackIdSuffix}` : '';
|
|
327
|
+
const id = `restored-${executionIndex + 1}-${taskIndex + 1}${idSuffix}`;
|
|
130
328
|
const suggestedFileName = `execution-${executionIndex + 1}-task-${taskIndex + 1}-${id}.${ext}`;
|
|
131
329
|
return {
|
|
132
|
-
markdown: `\n`,
|
|
133
331
|
attachment: {
|
|
134
332
|
id,
|
|
135
333
|
suggestedFileName,
|
|
@@ -142,27 +340,46 @@ function screenshotAttachment(screenshot, screenshotBaseDir, executionIndex, tas
|
|
|
142
340
|
}
|
|
143
341
|
throw new Error(`executionToMarkdown: missing screenshot for execution #${executionIndex + 1} task #${taskIndex + 1}`);
|
|
144
342
|
}
|
|
145
|
-
function
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
};
|
|
343
|
+
function imageLabelSuffix(value) {
|
|
344
|
+
return value.toLowerCase().replace(/[^a-z0-9._-]+/g, '-').replace(/-+/g, '-').replace(/^-|-$/g, '') || 'screenshot';
|
|
345
|
+
}
|
|
346
|
+
function screenshotsMarkdownSection(task, screenshotBaseDir, executionIndex, taskIndex) {
|
|
150
347
|
const lines = [
|
|
151
348
|
'',
|
|
152
|
-
'###
|
|
349
|
+
'### Screenshots'
|
|
153
350
|
];
|
|
154
351
|
const attachments = [];
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
352
|
+
let screenshotIndex = 0;
|
|
353
|
+
if (task.uiContext?.screenshot) {
|
|
354
|
+
const imageResult = screenshotAttachment(task.uiContext.screenshot, screenshotBaseDir, executionIndex, taskIndex, {
|
|
355
|
+
fallbackIdSuffix: 'ui-context',
|
|
356
|
+
label: `task-${taskIndex + 1}-ui-context`
|
|
357
|
+
});
|
|
358
|
+
const time = resolveTaskTiming(task);
|
|
359
|
+
screenshotIndex += 1;
|
|
360
|
+
lines.push(`- #${screenshotIndex} type=ui-context, ts=${formatTime(time.start)}, timing=ui-context`);
|
|
361
|
+
lines.push(imageResult.markdown);
|
|
362
|
+
attachments.push(imageResult.attachment);
|
|
363
|
+
}
|
|
364
|
+
task.recorder?.forEach((item, recorderIndex)=>{
|
|
158
365
|
if (!item.screenshot) return;
|
|
159
|
-
const
|
|
366
|
+
const descriptionText = item.description ? `, description=${item.description}` : '';
|
|
367
|
+
const timing = item.timing || 'N/A';
|
|
368
|
+
screenshotIndex += 1;
|
|
369
|
+
lines.push(`- #${screenshotIndex} type=${item.type}, ts=${formatTime(item.ts)}, timing=${timing}${descriptionText}`);
|
|
370
|
+
const imageResult = screenshotAttachment(item.screenshot, screenshotBaseDir, executionIndex, taskIndex, {
|
|
371
|
+
fallbackIdSuffix: `recorder-${recorderIndex + 1}`,
|
|
372
|
+
label: `task-${taskIndex + 1}-${imageLabelSuffix(timing)}`
|
|
373
|
+
});
|
|
160
374
|
lines.push(imageResult.markdown);
|
|
161
375
|
attachments.push(imageResult.attachment);
|
|
162
376
|
});
|
|
163
|
-
return {
|
|
377
|
+
return screenshotIndex > 0 ? {
|
|
164
378
|
lines,
|
|
165
379
|
attachments
|
|
380
|
+
} : {
|
|
381
|
+
lines: [],
|
|
382
|
+
attachments
|
|
166
383
|
};
|
|
167
384
|
}
|
|
168
385
|
function renderExecution(executionRaw, executionIndex, options) {
|
|
@@ -174,11 +391,15 @@ function renderExecution(executionRaw, executionIndex, options) {
|
|
|
174
391
|
if (execution.description) lines.push('', execution.description);
|
|
175
392
|
lines.push('', `- Execution start: ${formatTime(execution.logTime)}`);
|
|
176
393
|
lines.push(`- Task count: ${execution.tasks.length}`);
|
|
394
|
+
if (execution.aiActContext) appendTextSection(lines, 'AI Action Context', execution.aiActContext);
|
|
177
395
|
execution.tasks.forEach((task, taskIndex)=>{
|
|
178
396
|
const title = (0, ui_utils_js_namespaceObject.typeStr)(task);
|
|
179
397
|
const detail = safeTaskParam(task);
|
|
180
398
|
const time = resolveTaskTiming(task);
|
|
181
399
|
lines.push('', `## ${taskIndex + 1}. ${title}${detail ? ` - ${detail}` : ''}`);
|
|
400
|
+
lines.push(`- Task ID: ${task.taskId || 'N/A'}`);
|
|
401
|
+
lines.push(`- Type: ${task.type || 'N/A'}`);
|
|
402
|
+
lines.push(`- SubType: ${task.subType || 'N/A'}`);
|
|
182
403
|
lines.push(`- Status: ${task.status || 'unknown'}`);
|
|
183
404
|
lines.push(`- Start: ${formatTime(time.start)}`);
|
|
184
405
|
lines.push(`- End: ${formatTime(time.end)}`);
|
|
@@ -189,15 +410,31 @@ function renderExecution(executionRaw, executionIndex, options) {
|
|
|
189
410
|
if (locateCenter) lines.push(`- Locate center: (${locateCenter[0]}, ${locateCenter[1]})`);
|
|
190
411
|
}
|
|
191
412
|
if (task.errorMessage) lines.push(`- Error: ${task.errorMessage}`);
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
lines.push(
|
|
195
|
-
|
|
413
|
+
const usageRows = usageRowsForTask(task);
|
|
414
|
+
if (usageRows.length) {
|
|
415
|
+
lines.push('', '### Model Usage');
|
|
416
|
+
lines.push(...markdownTable([
|
|
417
|
+
'Source',
|
|
418
|
+
'Intent',
|
|
419
|
+
'Model',
|
|
420
|
+
"Description",
|
|
421
|
+
'Prompt Tokens',
|
|
422
|
+
'Cached Input',
|
|
423
|
+
'Completion Tokens',
|
|
424
|
+
'Total Tokens',
|
|
425
|
+
'Time Cost(ms)',
|
|
426
|
+
'Request ID'
|
|
427
|
+
], usageRows));
|
|
196
428
|
}
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
429
|
+
appendJsonSection(lines, 'Param', task.param);
|
|
430
|
+
appendJsonSection(lines, 'Output', task.output);
|
|
431
|
+
appendJsonSection(lines, 'Log', task.log);
|
|
432
|
+
appendTextSection(lines, 'Thought', task.thought);
|
|
433
|
+
appendTextSection(lines, 'Reasoning Content', task.reasoning_content);
|
|
434
|
+
const screenshotsSection = screenshotsMarkdownSection(task, screenshotBaseDir, executionIndex, taskIndex);
|
|
435
|
+
if (screenshotsSection.lines.length) {
|
|
436
|
+
lines.push(...screenshotsSection.lines);
|
|
437
|
+
attachments.push(...screenshotsSection.attachments);
|
|
201
438
|
}
|
|
202
439
|
});
|
|
203
440
|
return {
|
|
@@ -205,10 +442,6 @@ function renderExecution(executionRaw, executionIndex, options) {
|
|
|
205
442
|
attachments
|
|
206
443
|
};
|
|
207
444
|
}
|
|
208
|
-
function reportFileName(execution, executionIndex) {
|
|
209
|
-
const safeName = execution.name.trim().replace(/\s+/g, '-').replace(/[^a-zA-Z0-9-_]/g, '') || `execution-${executionIndex + 1}`;
|
|
210
|
-
return `${executionIndex + 1}-${(0, external_node_path_namespaceObject.basename)(safeName)}.md`;
|
|
211
|
-
}
|
|
212
445
|
function executionToMarkdown(execution, options) {
|
|
213
446
|
return renderExecution(execution, 0, options);
|
|
214
447
|
}
|
|
@@ -217,21 +450,53 @@ function reportToMarkdown(report) {
|
|
|
217
450
|
const executionResults = reportDump.executions.map((execution, index)=>{
|
|
218
451
|
const rendered = renderExecution(execution, index);
|
|
219
452
|
return {
|
|
220
|
-
executionIndex: index,
|
|
221
|
-
executionName: execution.name,
|
|
222
453
|
markdown: rendered.markdown,
|
|
223
|
-
attachments: rendered.attachments
|
|
224
|
-
suggestedFileName: reportFileName(execution, index)
|
|
454
|
+
attachments: rendered.attachments
|
|
225
455
|
};
|
|
226
456
|
});
|
|
227
457
|
const attachments = executionResults.flatMap((item)=>item.attachments);
|
|
458
|
+
const usageTotals = collectUsageTotals(reportDump);
|
|
459
|
+
const modelRows = reportDump.modelBriefs?.length ? modelBriefRows(reportDump.modelBriefs) : modelRowsFromUsage(reportDump);
|
|
460
|
+
const modelInfoLines = [
|
|
461
|
+
'\n## Model Info',
|
|
462
|
+
...modelRows.length ? markdownTable([
|
|
463
|
+
'Intent',
|
|
464
|
+
'Model',
|
|
465
|
+
"Description"
|
|
466
|
+
], modelRows) : [
|
|
467
|
+
'- No model metadata recorded.'
|
|
468
|
+
]
|
|
469
|
+
];
|
|
470
|
+
const tokenSummaryLines = [
|
|
471
|
+
'\n## Token Usage Summary',
|
|
472
|
+
...usageTotals.size ? markdownTable([
|
|
473
|
+
'Model',
|
|
474
|
+
'Calls',
|
|
475
|
+
'Prompt Tokens',
|
|
476
|
+
'Cached Input',
|
|
477
|
+
'Completion Tokens',
|
|
478
|
+
'Total Tokens',
|
|
479
|
+
'Time Cost(ms)'
|
|
480
|
+
], Array.from(usageTotals.entries()).map(([modelName, totals])=>[
|
|
481
|
+
modelName,
|
|
482
|
+
totals.calls,
|
|
483
|
+
totals.prompt,
|
|
484
|
+
totals.cachedInput,
|
|
485
|
+
totals.completion,
|
|
486
|
+
totals.total,
|
|
487
|
+
totals.timeCost
|
|
488
|
+
])) : [
|
|
489
|
+
'- No token usage recorded.'
|
|
490
|
+
]
|
|
491
|
+
];
|
|
228
492
|
const header = [
|
|
229
493
|
`# ${reportDump.groupName}`,
|
|
230
494
|
reportDump.groupDescription ? `\n${reportDump.groupDescription}` : '',
|
|
231
495
|
`\n- SDK Version: ${reportDump.sdkVersion}`,
|
|
496
|
+
reportDump.deviceType ? `- Device Type: ${reportDump.deviceType}` : '',
|
|
232
497
|
`- Execution count: ${reportDump.executions.length}`,
|
|
233
|
-
|
|
234
|
-
...
|
|
498
|
+
...modelInfoLines,
|
|
499
|
+
...tokenSummaryLines
|
|
235
500
|
].filter(Boolean).join('\n');
|
|
236
501
|
return {
|
|
237
502
|
markdown: `${header}\n\n${executionResults.map((item)=>item.markdown).join('\n\n---\n\n')}`,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"report-markdown.js","sources":["webpack/runtime/define_property_getters","webpack/runtime/has_own_property","webpack/runtime/make_namespace_object","../../src/report-markdown.ts"],"sourcesContent":["__webpack_require__.d = (exports, definition) => {\n\tfor(var key in definition) {\n if(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n Object.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n }\n }\n};","__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))","// define __esModule on exports\n__webpack_require__.r = (exports) => {\n\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n\t}\n\tObject.defineProperty(exports, '__esModule', { value: true });\n};","import { basename } from 'node:path';\nimport { extractInsightParam, paramStr, typeStr } from '@/agent/ui-utils';\nimport { ScreenshotItem } from '@/screenshot-item';\nimport type {\n ExecutionDump,\n ExecutionRecorderItem,\n ExecutionTask,\n IExecutionDump,\n IReportActionDump,\n ReportActionDump,\n} from '@/types';\nimport type { ScreenshotRef } from './dump/screenshot-store';\nimport { normalizeScreenshotRef } from './dump/screenshot-store';\n\nexport interface MarkdownAttachment {\n id: string;\n /**\n * Stable, prefixed file name for the exported copy. The markdown image link\n * always points at `${screenshotBaseDir}/${suggestedFileName}`, so consumers\n * write the screenshot under this name to keep links in sync. See #2392.\n */\n suggestedFileName: string;\n mimeType?: string;\n /**\n * Reference to the screenshot in the source report, used to locate the\n * original bytes when copying them to the exported name. Absent for in-memory\n * screenshots, which carry their data in `base64Data` instead.\n */\n sourceRef?: ScreenshotRef;\n executionIndex: number;\n taskIndex: number;\n /** Populated when screenshot data is available in memory (e.g. browser context). */\n base64Data?: string;\n}\n\nexport interface ExecutionMarkdownOptions {\n screenshotBaseDir?: string;\n}\n\nexport interface ExecutionMarkdownResult {\n markdown: string;\n attachments: MarkdownAttachment[];\n}\n\nexport interface ReportMarkdownResult {\n markdown: string;\n attachments: MarkdownAttachment[];\n}\n\nfunction toExecutionDump(\n execution: ExecutionDump | IExecutionDump,\n): IExecutionDump {\n if (!execution || typeof execution !== 'object') {\n throw new Error('executionToMarkdown: execution is required');\n }\n\n if (!Array.isArray(execution.tasks)) {\n throw new Error('executionToMarkdown: execution.tasks must be an array');\n }\n\n if (!execution.name) {\n throw new Error('executionToMarkdown: execution.name is required');\n }\n\n return execution;\n}\n\nfunction toReportDump(\n report: ReportActionDump | IReportActionDump,\n): IReportActionDump {\n if (!report || typeof report !== 'object') {\n throw new Error('reportToMarkdown: report is required');\n }\n\n if (!Array.isArray(report.executions)) {\n throw new Error('reportToMarkdown: report.executions must be an array');\n }\n\n return report;\n}\n\nfunction formatTime(ts?: number): string {\n if (typeof ts !== 'number' || Number.isNaN(ts)) {\n return 'N/A';\n }\n return new Date(ts).toISOString();\n}\n\nfunction resolveTaskTiming(task: ExecutionTask): {\n start?: number;\n end?: number;\n cost?: number;\n} {\n const timing = task.timing;\n if (!timing) {\n return {};\n }\n\n const start = timing.start ?? timing.callAiStart ?? timing.callActionStart;\n const end =\n timing.end ??\n timing.callAiEnd ??\n timing.callActionEnd ??\n timing.captureAfterCallingSnapshotEnd;\n const cost =\n timing.cost ??\n (typeof start === 'number' && typeof end === 'number'\n ? end - start\n : undefined);\n\n return { start, end, cost };\n}\n\nfunction safeTaskParam(task: ExecutionTask): string {\n const readable = paramStr(task);\n if (readable) {\n return readable;\n }\n\n if (task.type === 'Insight') {\n return extractInsightParam((task as any).param).content;\n }\n\n return '';\n}\n\nfunction formatSize(\n size?: { width?: number; height?: number } | null,\n): string | undefined {\n if (\n !size ||\n typeof size.width !== 'number' ||\n typeof size.height !== 'number' ||\n Number.isNaN(size.width) ||\n Number.isNaN(size.height)\n ) {\n return undefined;\n }\n\n return `${size.width} x ${size.height}`;\n}\n\nfunction extractLocateCenter(\n task: ExecutionTask,\n): [number, number] | undefined {\n const outputCenter = (task.output as { element?: { center?: unknown } })\n ?.element?.center;\n if (\n Array.isArray(outputCenter) &&\n outputCenter.length >= 2 &&\n typeof outputCenter[0] === 'number' &&\n typeof outputCenter[1] === 'number'\n ) {\n return [outputCenter[0], outputCenter[1]];\n }\n\n const paramLocateCenter = (task.param as { locate?: { center?: unknown } })\n ?.locate?.center;\n if (\n Array.isArray(paramLocateCenter) &&\n paramLocateCenter.length >= 2 &&\n typeof paramLocateCenter[0] === 'number' &&\n typeof paramLocateCenter[1] === 'number'\n ) {\n return [paramLocateCenter[0], paramLocateCenter[1]];\n }\n\n const paramCenter = (task.param as { center?: unknown })?.center;\n if (\n Array.isArray(paramCenter) &&\n paramCenter.length >= 2 &&\n typeof paramCenter[0] === 'number' &&\n typeof paramCenter[1] === 'number'\n ) {\n return [paramCenter[0], paramCenter[1]];\n }\n\n return undefined;\n}\n\nfunction tryExtractBase64(screenshot: unknown): string | undefined {\n if (!screenshot || typeof screenshot !== 'object') return undefined;\n const s = screenshot as Record<string, unknown>;\n if (typeof s.base64 === 'string' && s.base64.length > 0) {\n return s.base64;\n }\n return undefined;\n}\n\nfunction screenshotAttachment(\n screenshot: unknown,\n screenshotBaseDir: string,\n executionIndex: number,\n taskIndex: number,\n): { markdown: string; attachment: MarkdownAttachment } {\n if (screenshot instanceof ScreenshotItem) {\n const ext = screenshot.extension;\n const suggestedFileName = `execution-${executionIndex + 1}-task-${taskIndex + 1}-${screenshot.id}.${ext}`;\n return {\n markdown: `\\n`,\n attachment: {\n id: screenshot.id,\n suggestedFileName,\n mimeType: `image/${ext === 'jpeg' ? 'jpeg' : 'png'}`,\n executionIndex,\n taskIndex,\n base64Data: tryExtractBase64(screenshot),\n },\n };\n }\n\n const ref = normalizeScreenshotRef(screenshot);\n if (ref) {\n const ext = ref.mimeType === 'image/jpeg' ? 'jpeg' : 'png';\n const suggestedFileName = `execution-${executionIndex + 1}-task-${taskIndex + 1}-${ref.id}.${ext}`;\n return {\n markdown: `\\n`,\n attachment: {\n id: ref.id,\n suggestedFileName,\n sourceRef: ref,\n mimeType: ref.mimeType,\n executionIndex,\n taskIndex,\n base64Data: tryExtractBase64(screenshot),\n },\n };\n }\n\n const base64 = tryExtractBase64(screenshot);\n if (base64) {\n const ext = base64.startsWith('data:image/jpeg') ? 'jpeg' : 'png';\n const id = `restored-${executionIndex + 1}-${taskIndex + 1}`;\n const suggestedFileName = `execution-${executionIndex + 1}-task-${taskIndex + 1}-${id}.${ext}`;\n return {\n markdown: `\\n`,\n attachment: {\n id,\n suggestedFileName,\n mimeType: `image/${ext}`,\n executionIndex,\n taskIndex,\n base64Data: base64,\n },\n };\n }\n\n throw new Error(\n `executionToMarkdown: missing screenshot for execution #${executionIndex + 1} task #${taskIndex + 1}`,\n );\n}\n\nfunction recorderMarkdownSection(\n recorder: ExecutionRecorderItem[] | undefined,\n screenshotBaseDir: string,\n executionIndex: number,\n taskIndex: number,\n): { lines: string[]; attachments: MarkdownAttachment[] } {\n if (!recorder?.length) {\n return { lines: [], attachments: [] };\n }\n\n const lines: string[] = ['', '### Recorder'];\n const attachments: MarkdownAttachment[] = [];\n\n recorder.forEach((item, recorderIndex) => {\n const descriptionText = item.description\n ? `, description=${item.description}`\n : '';\n lines.push(\n `- #${recorderIndex + 1} type=${item.type}, ts=${formatTime(item.ts)}, timing=${item.timing || 'N/A'}${descriptionText}`,\n );\n\n if (!item.screenshot) {\n return;\n }\n\n const imageResult = screenshotAttachment(\n item.screenshot,\n screenshotBaseDir,\n executionIndex,\n taskIndex,\n );\n\n lines.push(imageResult.markdown);\n attachments.push(imageResult.attachment);\n });\n\n return { lines, attachments };\n}\n\nfunction renderExecution(\n executionRaw: ExecutionDump | IExecutionDump,\n executionIndex: number,\n options?: ExecutionMarkdownOptions,\n): ExecutionMarkdownResult {\n const execution = toExecutionDump(executionRaw);\n const screenshotBaseDir = options?.screenshotBaseDir ?? './screenshots';\n\n const lines: string[] = [];\n const attachments: MarkdownAttachment[] = [];\n\n lines.push(`# ${execution.name}`);\n if (execution.description) {\n lines.push('', execution.description);\n }\n\n lines.push('', `- Execution start: ${formatTime(execution.logTime)}`);\n lines.push(`- Task count: ${execution.tasks.length}`);\n\n execution.tasks.forEach((task, taskIndex) => {\n const title = typeStr(task);\n const detail = safeTaskParam(task);\n const time = resolveTaskTiming(task);\n\n lines.push(\n '',\n `## ${taskIndex + 1}. ${title}${detail ? ` - ${detail}` : ''}`,\n );\n lines.push(`- Status: ${task.status || 'unknown'}`);\n lines.push(`- Start: ${formatTime(time.start)}`);\n lines.push(`- End: ${formatTime(time.end)}`);\n lines.push(\n `- Cost(ms): ${typeof time.cost === 'number' ? time.cost : 'N/A'}`,\n );\n lines.push(\n `- Screen size: ${formatSize(task.uiContext?.shotSize) || 'N/A'}`,\n );\n\n if (task.subType === 'Locate') {\n const locateCenter = extractLocateCenter(task);\n if (locateCenter) {\n lines.push(`- Locate center: (${locateCenter[0]}, ${locateCenter[1]})`);\n }\n }\n\n if (task.errorMessage) {\n lines.push(`- Error: ${task.errorMessage}`);\n }\n\n if (task.uiContext?.screenshot) {\n const imageResult = screenshotAttachment(\n task.uiContext.screenshot,\n screenshotBaseDir,\n executionIndex,\n taskIndex,\n );\n\n lines.push(imageResult.markdown);\n attachments.push(imageResult.attachment);\n }\n\n const recorderSection = recorderMarkdownSection(\n task.recorder,\n screenshotBaseDir,\n executionIndex,\n taskIndex,\n );\n if (recorderSection.lines.length) {\n lines.push(...recorderSection.lines);\n attachments.push(...recorderSection.attachments);\n }\n });\n\n return {\n markdown: lines.join('\\n'),\n attachments,\n };\n}\n\nfunction reportFileName(\n execution: IExecutionDump,\n executionIndex: number,\n): string {\n const safeName =\n execution.name\n .trim()\n .replace(/\\s+/g, '-')\n .replace(/[^a-zA-Z0-9-_]/g, '') || `execution-${executionIndex + 1}`;\n return `${executionIndex + 1}-${basename(safeName)}.md`;\n}\n\nexport function executionToMarkdown(\n execution: ExecutionDump | IExecutionDump,\n options?: ExecutionMarkdownOptions,\n): ExecutionMarkdownResult {\n return renderExecution(execution, 0, options);\n}\n\nexport function reportToMarkdown(\n report: ReportActionDump | IReportActionDump,\n): ReportMarkdownResult {\n const reportDump = toReportDump(report);\n\n const executionResults = reportDump.executions.map((execution, index) => {\n const rendered = renderExecution(execution, index);\n return {\n executionIndex: index,\n executionName: execution.name,\n markdown: rendered.markdown,\n attachments: rendered.attachments,\n suggestedFileName: reportFileName(execution, index),\n };\n });\n\n const attachments = executionResults.flatMap((item) => item.attachments);\n\n const header = [\n `# ${reportDump.groupName}`,\n reportDump.groupDescription ? `\\n${reportDump.groupDescription}` : '',\n `\\n- SDK Version: ${reportDump.sdkVersion}`,\n `- Execution count: ${reportDump.executions.length}`,\n '\\n## Suggested execution markdown files',\n ...executionResults.map(\n (item) => `- ${item.suggestedFileName} (${item.executionName})`,\n ),\n ]\n .filter(Boolean)\n .join('\\n');\n\n return {\n markdown: `${header}\\n\\n${executionResults.map((item) => item.markdown).join('\\n\\n---\\n\\n')}`,\n attachments,\n };\n}\n"],"names":["__webpack_require__","definition","key","Object","obj","prop","Symbol","toExecutionDump","execution","Error","Array","toReportDump","report","formatTime","ts","Number","Date","resolveTaskTiming","task","timing","start","end","cost","undefined","safeTaskParam","readable","paramStr","extractInsightParam","formatSize","size","extractLocateCenter","outputCenter","paramLocateCenter","paramCenter","tryExtractBase64","screenshot","s","screenshotAttachment","screenshotBaseDir","executionIndex","taskIndex","ScreenshotItem","ext","suggestedFileName","ref","normalizeScreenshotRef","base64","id","recorderMarkdownSection","recorder","lines","attachments","item","recorderIndex","descriptionText","imageResult","renderExecution","executionRaw","options","title","typeStr","detail","time","locateCenter","recorderSection","reportFileName","safeName","basename","executionToMarkdown","reportToMarkdown","reportDump","executionResults","index","rendered","header","Boolean"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"report-markdown.js","sources":["webpack/runtime/define_property_getters","webpack/runtime/has_own_property","webpack/runtime/make_namespace_object","../../src/report-markdown.ts"],"sourcesContent":["__webpack_require__.d = (exports, definition) => {\n\tfor(var key in definition) {\n if(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n Object.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n }\n }\n};","__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))","// define __esModule on exports\n__webpack_require__.r = (exports) => {\n\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n\t}\n\tObject.defineProperty(exports, '__esModule', { value: true });\n};","import { extractInsightParam, paramStr, typeStr } from '@/agent/ui-utils';\nimport { ScreenshotItem } from '@/screenshot-item';\nimport type {\n AIUsageInfo,\n ExecutionDump,\n ExecutionTask,\n IExecutionDump,\n IReportActionDump,\n ModelBrief,\n ReportActionDump,\n} from '@/types';\nimport type { ScreenshotRef } from './dump/screenshot-store';\nimport { normalizeScreenshotRef } from './dump/screenshot-store';\n\nconst screenshotDataUrlPattern =\n /^data:image\\/(png|jpeg|jpg);base64,([\\s\\S]*)$/i;\nconst rawBase64BodyPattern = /^[a-zA-Z0-9+/=\\s]+$/;\nconst jsonContextMaxStringLength = 12_000;\n\ntype ExecutionTaskWithExtraUsage = ExecutionTask & {\n searchAreaUsage?: AIUsageInfo;\n reasoning_content?: string;\n};\n\ninterface UsageTotals {\n calls: number;\n prompt: number;\n cachedInput: number;\n completion: number;\n total: number;\n timeCost: number;\n}\n\nexport interface MarkdownAttachment {\n id: string;\n /**\n * Stable, prefixed file name for the exported copy. The markdown image link\n * always points at `${screenshotBaseDir}/${suggestedFileName}`, so consumers\n * write the screenshot under this name to keep links in sync. See #2392.\n */\n suggestedFileName: string;\n mimeType?: string;\n /**\n * Reference to the screenshot in the source report, used to locate the\n * original bytes when copying them to the exported name. Absent for in-memory\n * screenshots, which carry their data in `base64Data` instead.\n */\n sourceRef?: ScreenshotRef;\n executionIndex: number;\n taskIndex: number;\n /** Populated when screenshot data is available in memory (e.g. browser context). */\n base64Data?: string;\n}\n\nexport interface ExecutionMarkdownOptions {\n screenshotBaseDir?: string;\n}\n\nexport interface ExecutionMarkdownResult {\n markdown: string;\n attachments: MarkdownAttachment[];\n}\n\nexport interface ReportMarkdownResult {\n markdown: string;\n attachments: MarkdownAttachment[];\n}\n\nfunction toExecutionDump(\n execution: ExecutionDump | IExecutionDump,\n): IExecutionDump {\n if (!execution || typeof execution !== 'object') {\n throw new Error('executionToMarkdown: execution is required');\n }\n\n if (!Array.isArray(execution.tasks)) {\n throw new Error('executionToMarkdown: execution.tasks must be an array');\n }\n\n if (!execution.name) {\n throw new Error('executionToMarkdown: execution.name is required');\n }\n\n return execution;\n}\n\nfunction toReportDump(\n report: ReportActionDump | IReportActionDump,\n): IReportActionDump {\n if (!report || typeof report !== 'object') {\n throw new Error('reportToMarkdown: report is required');\n }\n\n if (!Array.isArray(report.executions)) {\n throw new Error('reportToMarkdown: report.executions must be an array');\n }\n\n return report;\n}\n\nfunction formatTime(ts?: number): string {\n if (typeof ts !== 'number' || Number.isNaN(ts)) {\n return 'N/A';\n }\n return new Date(ts).toISOString();\n}\n\nfunction formatValue(value: unknown): string {\n if (value === undefined || value === null || value === '') {\n return 'N/A';\n }\n if (typeof value === 'number') {\n return Number.isFinite(value) ? String(value) : 'N/A';\n }\n return String(value);\n}\n\nfunction escapeTableCell(value: unknown): string {\n return formatValue(value).replace(/\\|/g, '\\\\|').replace(/\\n/g, '<br>');\n}\n\nfunction markdownTable(headers: string[], rows: unknown[][]): string[] {\n return [\n `| ${headers.map(escapeTableCell).join(' | ')} |`,\n `| ${headers.map(() => '---').join(' | ')} |`,\n ...rows.map((row) => `| ${row.map(escapeTableCell).join(' | ')} |`),\n ];\n}\n\nfunction modelBriefRows(modelBriefs: ModelBrief[]): unknown[][] {\n return modelBriefs.map((brief) => [\n brief.intent || 'default',\n brief.name || 'N/A',\n brief.modelDescription || 'N/A',\n ]);\n}\n\nfunction modelRowsFromUsage(report: IReportActionDump): unknown[][] {\n const rows = new Map<string, unknown[]>();\n const addUsage = (source: string, usage?: AIUsageInfo) => {\n if (!hasUsage(usage)) return;\n const intent = usage.intent || source;\n const model = usage.model_name || usage.response_model_name;\n const description = usage.model_description;\n const key = `${intent}\\0${model || ''}\\0${description || ''}`;\n if (rows.has(key)) {\n return;\n }\n rows.set(key, [intent, model || 'N/A', description || 'N/A']);\n };\n\n for (const execution of report.executions) {\n for (const task of execution.tasks) {\n const taskWithUsage = task as ExecutionTaskWithExtraUsage;\n addUsage('main', taskWithUsage.usage);\n addUsage('searchArea', taskWithUsage.searchAreaUsage);\n }\n }\n\n return Array.from(rows.values());\n}\n\nfunction usageValue(usage: AIUsageInfo | undefined, key: string): number {\n const value = usage?.[key];\n return typeof value === 'number' && Number.isFinite(value) ? value : 0;\n}\n\nfunction hasUsage(usage: AIUsageInfo | undefined): usage is AIUsageInfo {\n if (!usage) return false;\n return [\n 'intent',\n 'model_name',\n 'model_description',\n 'prompt_tokens',\n 'cached_input',\n 'completion_tokens',\n 'total_tokens',\n 'time_cost',\n 'request_id',\n ].some((key) => usage[key] !== undefined && usage[key] !== null);\n}\n\nfunction usageTotalTokens(usage: AIUsageInfo): number {\n const explicitTotal = usageValue(usage, 'total_tokens');\n if (explicitTotal > 0) {\n return explicitTotal;\n }\n return (\n usageValue(usage, 'prompt_tokens') + usageValue(usage, 'completion_tokens')\n );\n}\n\nfunction usageModelName(usage: AIUsageInfo): string {\n return (\n usage.model_name ||\n usage.response_model_name ||\n usage.model_description ||\n usage.intent ||\n 'Unknown'\n );\n}\n\nfunction usageRowsForTask(task: ExecutionTask): unknown[][] {\n const taskWithUsage = task as ExecutionTaskWithExtraUsage;\n const rows: unknown[][] = [];\n const appendUsage = (source: string, usage?: AIUsageInfo) => {\n if (!hasUsage(usage)) return;\n rows.push([\n source,\n usage.intent,\n usage.model_name || usage.response_model_name,\n usage.model_description,\n usageValue(usage, 'prompt_tokens'),\n usageValue(usage, 'cached_input'),\n usageValue(usage, 'completion_tokens'),\n usageTotalTokens(usage),\n usageValue(usage, 'time_cost'),\n usage.request_id,\n ]);\n };\n\n appendUsage('main', taskWithUsage.usage);\n appendUsage('searchArea', taskWithUsage.searchAreaUsage);\n return rows;\n}\n\nfunction collectUsageTotals(\n report: IReportActionDump,\n): Map<string, UsageTotals> {\n const totalsByModel = new Map<string, UsageTotals>();\n const addUsage = (usage?: AIUsageInfo) => {\n if (!hasUsage(usage)) return;\n const modelName = usageModelName(usage);\n const current = totalsByModel.get(modelName) ?? {\n calls: 0,\n prompt: 0,\n cachedInput: 0,\n completion: 0,\n total: 0,\n timeCost: 0,\n };\n\n totalsByModel.set(modelName, {\n calls: current.calls + 1,\n prompt: current.prompt + usageValue(usage, 'prompt_tokens'),\n cachedInput: current.cachedInput + usageValue(usage, 'cached_input'),\n completion: current.completion + usageValue(usage, 'completion_tokens'),\n total: current.total + usageTotalTokens(usage),\n timeCost: current.timeCost + usageValue(usage, 'time_cost'),\n });\n };\n\n for (const execution of report.executions) {\n for (const task of execution.tasks) {\n const taskWithUsage = task as ExecutionTaskWithExtraUsage;\n addUsage(taskWithUsage.usage);\n addUsage(taskWithUsage.searchAreaUsage);\n }\n }\n\n return totalsByModel;\n}\n\nfunction sanitizeJsonForMarkdown(\n value: unknown,\n seen = new WeakSet<object>(),\n): unknown {\n if (typeof value === 'string') {\n if (\n screenshotDataUrlPattern.test(value) ||\n value.length > 1_000_000 ||\n /^[a-zA-Z0-9+/=\\s]{100000,}$/.test(value)\n ) {\n return `[omitted image/base64 string, length=${value.length}]`;\n }\n if (value.length > jsonContextMaxStringLength) {\n return `${value.slice(0, jsonContextMaxStringLength)}\\n[truncated, original length=${value.length}]`;\n }\n return value;\n }\n\n if (\n value === null ||\n typeof value === 'number' ||\n typeof value === 'boolean'\n ) {\n return value;\n }\n\n if (typeof value === 'function') {\n return '[omitted function]';\n }\n\n if (typeof value !== 'object' || value === undefined) {\n return undefined;\n }\n\n if (seen.has(value)) {\n return '[omitted circular reference]';\n }\n seen.add(value);\n\n if (Array.isArray(value)) {\n return value.map((item) => sanitizeJsonForMarkdown(item, seen));\n }\n\n const input = value as Record<string, unknown>;\n const output: Record<string, unknown> = {};\n for (const [key, entry] of Object.entries(input)) {\n if (entry === undefined || typeof entry === 'function') {\n continue;\n }\n if (\n typeof entry === 'string' &&\n /(^|_|-)(base64|screenshotBase64|imageBase64)$/i.test(key)\n ) {\n output[key] = `[omitted base64 string, length=${entry.length}]`;\n continue;\n }\n output[key] = sanitizeJsonForMarkdown(entry, seen);\n }\n seen.delete(value);\n return output;\n}\n\nfunction appendJsonSection(\n lines: string[],\n title: string,\n value: unknown,\n): void {\n if (value === undefined || value === null || value === '') {\n return;\n }\n const sanitized = sanitizeJsonForMarkdown(value);\n if (sanitized === undefined) {\n return;\n }\n\n lines.push('', `### ${title}`, '', '```json');\n lines.push(JSON.stringify(sanitized, null, 2));\n lines.push('```');\n}\n\nfunction appendTextSection(\n lines: string[],\n title: string,\n value: unknown,\n): void {\n if (typeof value !== 'string' || !value.trim()) {\n return;\n }\n lines.push('', `### ${title}`, '', '```text');\n lines.push(value.replace(/```/g, '` ` `'));\n lines.push('```');\n}\n\nfunction resolveTaskTiming(task: ExecutionTask): {\n start?: number;\n end?: number;\n cost?: number;\n} {\n const timing = task.timing;\n if (!timing) {\n return {};\n }\n\n const start = timing.start ?? timing.callAiStart ?? timing.callActionStart;\n const end =\n timing.end ??\n timing.callAiEnd ??\n timing.callActionEnd ??\n timing.captureAfterCallingSnapshotEnd;\n const cost =\n timing.cost ??\n (typeof start === 'number' && typeof end === 'number'\n ? end - start\n : undefined);\n\n return { start, end, cost };\n}\n\nfunction safeTaskParam(task: ExecutionTask): string {\n const readable = paramStr(task);\n if (readable) {\n return readable;\n }\n\n if (task.type === 'Insight') {\n return extractInsightParam((task as any).param).content;\n }\n\n return '';\n}\n\nfunction formatSize(\n size?: { width?: number; height?: number } | null,\n): string | undefined {\n if (\n !size ||\n typeof size.width !== 'number' ||\n typeof size.height !== 'number' ||\n Number.isNaN(size.width) ||\n Number.isNaN(size.height)\n ) {\n return undefined;\n }\n\n return `${size.width} x ${size.height}`;\n}\n\nfunction extractLocateCenter(\n task: ExecutionTask,\n): [number, number] | undefined {\n const outputCenter = (task.output as { element?: { center?: unknown } })\n ?.element?.center;\n if (\n Array.isArray(outputCenter) &&\n outputCenter.length >= 2 &&\n typeof outputCenter[0] === 'number' &&\n typeof outputCenter[1] === 'number'\n ) {\n return [outputCenter[0], outputCenter[1]];\n }\n\n const paramLocateCenter = (task.param as { locate?: { center?: unknown } })\n ?.locate?.center;\n if (\n Array.isArray(paramLocateCenter) &&\n paramLocateCenter.length >= 2 &&\n typeof paramLocateCenter[0] === 'number' &&\n typeof paramLocateCenter[1] === 'number'\n ) {\n return [paramLocateCenter[0], paramLocateCenter[1]];\n }\n\n const paramCenter = (task.param as { center?: unknown })?.center;\n if (\n Array.isArray(paramCenter) &&\n paramCenter.length >= 2 &&\n typeof paramCenter[0] === 'number' &&\n typeof paramCenter[1] === 'number'\n ) {\n return [paramCenter[0], paramCenter[1]];\n }\n\n return undefined;\n}\n\nfunction tryExtractBase64(screenshot: unknown): string | undefined {\n if (typeof screenshot === 'string') {\n const trimmedScreenshot = screenshot.trim();\n const dataUrlMatch = trimmedScreenshot.match(screenshotDataUrlPattern);\n if (dataUrlMatch) {\n const format = dataUrlMatch[1].toLowerCase() === 'jpg' ? 'jpeg' : 'png';\n const base64Body = dataUrlMatch[2].replace(/\\s/g, '');\n if (!base64Body) {\n return undefined;\n }\n return `data:image/${format};base64,${base64Body}`;\n }\n\n if (\n trimmedScreenshot.startsWith('data:') ||\n !rawBase64BodyPattern.test(trimmedScreenshot)\n ) {\n return undefined;\n }\n\n const base64Body = trimmedScreenshot.replace(/\\s/g, '');\n return base64Body ? `data:image/png;base64,${base64Body}` : undefined;\n }\n\n if (!screenshot || typeof screenshot !== 'object') return undefined;\n const s = screenshot as Record<string, unknown>;\n if (typeof s.base64 === 'string' && s.base64.length > 0) {\n return s.base64;\n }\n return undefined;\n}\n\nfunction restoredSourceRef(screenshot: unknown): ScreenshotRef | undefined {\n if (!screenshot || typeof screenshot !== 'object') {\n return undefined;\n }\n\n const sourceRef = (screenshot as Record<string, unknown>).sourceRef;\n return normalizeScreenshotRef(sourceRef) ?? undefined;\n}\n\nfunction screenshotAttachment(\n screenshot: unknown,\n screenshotBaseDir: string,\n executionIndex: number,\n taskIndex: number,\n options?: {\n fallbackIdSuffix?: string;\n label?: string;\n },\n): { markdown: string; attachment: MarkdownAttachment } {\n const markdownLabel = options?.label || `task-${taskIndex + 1}`;\n\n if (screenshot instanceof ScreenshotItem) {\n const ext = screenshot.extension;\n const suggestedFileName = `execution-${executionIndex + 1}-task-${taskIndex + 1}-${screenshot.id}.${ext}`;\n return {\n markdown: `\\n`,\n attachment: {\n id: screenshot.id,\n suggestedFileName,\n mimeType: `image/${ext === 'jpeg' ? 'jpeg' : 'png'}`,\n executionIndex,\n taskIndex,\n base64Data: tryExtractBase64(screenshot),\n },\n };\n }\n\n const ref = normalizeScreenshotRef(screenshot);\n if (ref) {\n const ext = ref.mimeType === 'image/jpeg' ? 'jpeg' : 'png';\n const suggestedFileName = `execution-${executionIndex + 1}-task-${taskIndex + 1}-${ref.id}.${ext}`;\n return {\n markdown: `\\n`,\n attachment: {\n id: ref.id,\n suggestedFileName,\n sourceRef: ref,\n mimeType: ref.mimeType,\n executionIndex,\n taskIndex,\n base64Data: tryExtractBase64(screenshot),\n },\n };\n }\n\n const sourceRef = restoredSourceRef(screenshot);\n if (sourceRef) {\n const ext = sourceRef.mimeType === 'image/jpeg' ? 'jpeg' : 'png';\n const suggestedFileName = `execution-${executionIndex + 1}-task-${taskIndex + 1}-${sourceRef.id}.${ext}`;\n return {\n markdown: `\\n`,\n attachment: {\n id: sourceRef.id,\n suggestedFileName,\n sourceRef,\n mimeType: sourceRef.mimeType,\n executionIndex,\n taskIndex,\n base64Data: tryExtractBase64(screenshot),\n },\n };\n }\n\n const base64 = tryExtractBase64(screenshot);\n if (base64) {\n const ext = base64.startsWith('data:image/jpeg') ? 'jpeg' : 'png';\n const idSuffix = options?.fallbackIdSuffix\n ? `-${options.fallbackIdSuffix}`\n : '';\n const id = `restored-${executionIndex + 1}-${taskIndex + 1}${idSuffix}`;\n const suggestedFileName = `execution-${executionIndex + 1}-task-${taskIndex + 1}-${id}.${ext}`;\n return {\n markdown: `\\n`,\n attachment: {\n id,\n suggestedFileName,\n mimeType: `image/${ext}`,\n executionIndex,\n taskIndex,\n base64Data: base64,\n },\n };\n }\n\n throw new Error(\n `executionToMarkdown: missing screenshot for execution #${executionIndex + 1} task #${taskIndex + 1}`,\n );\n}\n\nfunction imageLabelSuffix(value: string): string {\n return (\n value\n .toLowerCase()\n .replace(/[^a-z0-9._-]+/g, '-')\n .replace(/-+/g, '-')\n .replace(/^-|-$/g, '') || 'screenshot'\n );\n}\n\nfunction screenshotsMarkdownSection(\n task: ExecutionTask,\n screenshotBaseDir: string,\n executionIndex: number,\n taskIndex: number,\n): { lines: string[]; attachments: MarkdownAttachment[] } {\n const lines: string[] = ['', '### Screenshots'];\n const attachments: MarkdownAttachment[] = [];\n let screenshotIndex = 0;\n\n if (task.uiContext?.screenshot) {\n const imageResult = screenshotAttachment(\n task.uiContext.screenshot,\n screenshotBaseDir,\n executionIndex,\n taskIndex,\n {\n fallbackIdSuffix: 'ui-context',\n label: `task-${taskIndex + 1}-ui-context`,\n },\n );\n const time = resolveTaskTiming(task);\n screenshotIndex += 1;\n lines.push(\n `- #${screenshotIndex} type=ui-context, ts=${formatTime(time.start)}, timing=ui-context`,\n );\n lines.push(imageResult.markdown);\n attachments.push(imageResult.attachment);\n }\n\n task.recorder?.forEach((item, recorderIndex) => {\n if (!item.screenshot) {\n return;\n }\n\n const descriptionText = item.description\n ? `, description=${item.description}`\n : '';\n const timing = item.timing || 'N/A';\n screenshotIndex += 1;\n lines.push(\n `- #${screenshotIndex} type=${item.type}, ts=${formatTime(item.ts)}, timing=${timing}${descriptionText}`,\n );\n\n const imageResult = screenshotAttachment(\n item.screenshot,\n screenshotBaseDir,\n executionIndex,\n taskIndex,\n {\n fallbackIdSuffix: `recorder-${recorderIndex + 1}`,\n label: `task-${taskIndex + 1}-${imageLabelSuffix(timing)}`,\n },\n );\n\n lines.push(imageResult.markdown);\n attachments.push(imageResult.attachment);\n });\n\n return screenshotIndex > 0\n ? { lines, attachments }\n : { lines: [], attachments };\n}\n\nfunction renderExecution(\n executionRaw: ExecutionDump | IExecutionDump,\n executionIndex: number,\n options?: ExecutionMarkdownOptions,\n): ExecutionMarkdownResult {\n const execution = toExecutionDump(executionRaw);\n const screenshotBaseDir = options?.screenshotBaseDir ?? './screenshots';\n\n const lines: string[] = [];\n const attachments: MarkdownAttachment[] = [];\n\n lines.push(`# ${execution.name}`);\n if (execution.description) {\n lines.push('', execution.description);\n }\n\n lines.push('', `- Execution start: ${formatTime(execution.logTime)}`);\n lines.push(`- Task count: ${execution.tasks.length}`);\n if (execution.aiActContext) {\n appendTextSection(lines, 'AI Action Context', execution.aiActContext);\n }\n\n execution.tasks.forEach((task, taskIndex) => {\n const title = typeStr(task);\n const detail = safeTaskParam(task);\n const time = resolveTaskTiming(task);\n\n lines.push(\n '',\n `## ${taskIndex + 1}. ${title}${detail ? ` - ${detail}` : ''}`,\n );\n lines.push(`- Task ID: ${task.taskId || 'N/A'}`);\n lines.push(`- Type: ${task.type || 'N/A'}`);\n lines.push(`- SubType: ${task.subType || 'N/A'}`);\n lines.push(`- Status: ${task.status || 'unknown'}`);\n lines.push(`- Start: ${formatTime(time.start)}`);\n lines.push(`- End: ${formatTime(time.end)}`);\n lines.push(\n `- Cost(ms): ${typeof time.cost === 'number' ? time.cost : 'N/A'}`,\n );\n lines.push(\n `- Screen size: ${formatSize(task.uiContext?.shotSize) || 'N/A'}`,\n );\n\n if (task.subType === 'Locate') {\n const locateCenter = extractLocateCenter(task);\n if (locateCenter) {\n lines.push(`- Locate center: (${locateCenter[0]}, ${locateCenter[1]})`);\n }\n }\n\n if (task.errorMessage) {\n lines.push(`- Error: ${task.errorMessage}`);\n }\n\n const usageRows = usageRowsForTask(task);\n if (usageRows.length) {\n lines.push('', '### Model Usage');\n lines.push(\n ...markdownTable(\n [\n 'Source',\n 'Intent',\n 'Model',\n 'Description',\n 'Prompt Tokens',\n 'Cached Input',\n 'Completion Tokens',\n 'Total Tokens',\n 'Time Cost(ms)',\n 'Request ID',\n ],\n usageRows,\n ),\n );\n }\n\n appendJsonSection(lines, 'Param', task.param);\n appendJsonSection(lines, 'Output', task.output);\n appendJsonSection(lines, 'Log', task.log);\n appendTextSection(lines, 'Thought', task.thought);\n appendTextSection(\n lines,\n 'Reasoning Content',\n (task as ExecutionTaskWithExtraUsage).reasoning_content,\n );\n\n const screenshotsSection = screenshotsMarkdownSection(\n task,\n screenshotBaseDir,\n executionIndex,\n taskIndex,\n );\n if (screenshotsSection.lines.length) {\n lines.push(...screenshotsSection.lines);\n attachments.push(...screenshotsSection.attachments);\n }\n });\n\n return {\n markdown: lines.join('\\n'),\n attachments,\n };\n}\n\nexport function executionToMarkdown(\n execution: ExecutionDump | IExecutionDump,\n options?: ExecutionMarkdownOptions,\n): ExecutionMarkdownResult {\n return renderExecution(execution, 0, options);\n}\n\nexport function reportToMarkdown(\n report: ReportActionDump | IReportActionDump,\n): ReportMarkdownResult {\n const reportDump = toReportDump(report);\n\n const executionResults = reportDump.executions.map((execution, index) => {\n const rendered = renderExecution(execution, index);\n return {\n markdown: rendered.markdown,\n attachments: rendered.attachments,\n };\n });\n\n const attachments = executionResults.flatMap((item) => item.attachments);\n const usageTotals = collectUsageTotals(reportDump);\n const modelRows = reportDump.modelBriefs?.length\n ? modelBriefRows(reportDump.modelBriefs)\n : modelRowsFromUsage(reportDump);\n\n const modelInfoLines = [\n '\\n## Model Info',\n ...(modelRows.length\n ? markdownTable(['Intent', 'Model', 'Description'], modelRows)\n : ['- No model metadata recorded.']),\n ];\n\n const tokenSummaryLines = [\n '\\n## Token Usage Summary',\n ...(usageTotals.size\n ? markdownTable(\n [\n 'Model',\n 'Calls',\n 'Prompt Tokens',\n 'Cached Input',\n 'Completion Tokens',\n 'Total Tokens',\n 'Time Cost(ms)',\n ],\n Array.from(usageTotals.entries()).map(([modelName, totals]) => [\n modelName,\n totals.calls,\n totals.prompt,\n totals.cachedInput,\n totals.completion,\n totals.total,\n totals.timeCost,\n ]),\n )\n : ['- No token usage recorded.']),\n ];\n\n const header = [\n `# ${reportDump.groupName}`,\n reportDump.groupDescription ? `\\n${reportDump.groupDescription}` : '',\n `\\n- SDK Version: ${reportDump.sdkVersion}`,\n reportDump.deviceType ? `- Device Type: ${reportDump.deviceType}` : '',\n `- Execution count: ${reportDump.executions.length}`,\n ...modelInfoLines,\n ...tokenSummaryLines,\n ]\n .filter(Boolean)\n .join('\\n');\n\n return {\n markdown: `${header}\\n\\n${executionResults.map((item) => item.markdown).join('\\n\\n---\\n\\n')}`,\n attachments,\n };\n}\n"],"names":["__webpack_require__","definition","key","Object","obj","prop","Symbol","screenshotDataUrlPattern","rawBase64BodyPattern","jsonContextMaxStringLength","toExecutionDump","execution","Error","Array","toReportDump","report","formatTime","ts","Number","Date","formatValue","value","String","escapeTableCell","markdownTable","headers","rows","row","modelBriefRows","modelBriefs","brief","modelRowsFromUsage","Map","addUsage","source","usage","hasUsage","intent","model","description","task","taskWithUsage","usageValue","undefined","usageTotalTokens","explicitTotal","usageModelName","usageRowsForTask","appendUsage","collectUsageTotals","totalsByModel","modelName","current","sanitizeJsonForMarkdown","seen","WeakSet","item","input","output","entry","appendJsonSection","lines","title","sanitized","JSON","appendTextSection","resolveTaskTiming","timing","start","end","cost","safeTaskParam","readable","paramStr","extractInsightParam","formatSize","size","extractLocateCenter","outputCenter","paramLocateCenter","paramCenter","tryExtractBase64","screenshot","trimmedScreenshot","dataUrlMatch","format","base64Body","s","restoredSourceRef","sourceRef","normalizeScreenshotRef","screenshotAttachment","screenshotBaseDir","executionIndex","taskIndex","options","markdownLabel","ScreenshotItem","ext","suggestedFileName","ref","base64","idSuffix","id","imageLabelSuffix","screenshotsMarkdownSection","attachments","screenshotIndex","imageResult","time","recorderIndex","descriptionText","renderExecution","executionRaw","typeStr","detail","locateCenter","usageRows","screenshotsSection","executionToMarkdown","reportToMarkdown","reportDump","executionResults","index","rendered","usageTotals","modelRows","modelInfoLines","tokenSummaryLines","totals","header","Boolean"],"mappings":"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"}
|