n8n-nodes-cursor-agent 2.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,180 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.AssistantTimelineBuilder = void 0;
4
+ exports.flattenToolCallsFromTimeline = flattenToolCallsFromTimeline;
5
+ exports.mergeThinkingFromTimeline = mergeThinkingFromTimeline;
6
+ exports.mergeMarkdownFromTimeline = mergeMarkdownFromTimeline;
7
+ const cursorStreamProtocol_1 = require("./cursorStreamProtocol");
8
+ /** 按 SDK 事件顺序组装时间线 */
9
+ class AssistantTimelineBuilder {
10
+ blocks = [];
11
+ suggestions = [];
12
+ finalized = false;
13
+ openThinking = -1;
14
+ openTools = -1;
15
+ openMarkdown = -1;
16
+ onThinkingStart() {
17
+ this.closeMarkdownSegment();
18
+ if (this.openThinking >= 0)
19
+ return;
20
+ this.openThinking = this.blocks.length;
21
+ this.blocks.push({ type: 'thinking', content: '', streaming: true });
22
+ }
23
+ onThinkingChunk(text) {
24
+ const chunk = (0, cursorStreamProtocol_1.sanitizeThinkingChunk)(text);
25
+ if (!chunk)
26
+ return;
27
+ if (this.openThinking < 0)
28
+ this.onThinkingStart();
29
+ const block = this.blocks[this.openThinking];
30
+ if (block.content.includes(chunk))
31
+ return;
32
+ block.content += chunk;
33
+ }
34
+ onThinkingEnd(durationMs) {
35
+ if (this.openThinking < 0)
36
+ return;
37
+ const block = this.blocks[this.openThinking];
38
+ block.streaming = false;
39
+ if (durationMs !== undefined)
40
+ block.durationMs = durationMs;
41
+ block.content = (0, cursorStreamProtocol_1.sanitizeThinkingChunk)(block.content);
42
+ this.openThinking = -1;
43
+ }
44
+ onToolStart(tool) {
45
+ this.onThinkingEnd();
46
+ this.closeMarkdownSegment();
47
+ if (this.openTools >= 0) {
48
+ const block = this.blocks[this.openTools];
49
+ block.calls.push({ ...tool });
50
+ return;
51
+ }
52
+ this.openTools = this.blocks.length;
53
+ this.blocks.push({ type: 'tools', calls: [{ ...tool }] });
54
+ }
55
+ onToolEnd(callId) {
56
+ if (this.openTools < 0)
57
+ return;
58
+ const block = this.blocks[this.openTools];
59
+ const rec = block.calls.find((c) => c.id === callId);
60
+ if (rec)
61
+ rec.done = true;
62
+ if (block.calls.every((c) => c.done)) {
63
+ this.openTools = -1;
64
+ }
65
+ }
66
+ onResponseText(text) {
67
+ if (!text)
68
+ return;
69
+ this.onThinkingEnd();
70
+ if (this.openMarkdown >= 0) {
71
+ const block = this.blocks[this.openMarkdown];
72
+ block.content += text;
73
+ return;
74
+ }
75
+ this.openMarkdown = this.blocks.length;
76
+ this.blocks.push({ type: 'markdown', content: text });
77
+ }
78
+ onTodoUpdate(items) {
79
+ if (!items.length)
80
+ return;
81
+ this.onThinkingEnd();
82
+ this.closeMarkdownSegment();
83
+ const idx = this.findLastTodosBlockIndex();
84
+ if (idx >= 0) {
85
+ const block = this.blocks[idx];
86
+ block.items = items.map((item) => ({ ...item }));
87
+ return;
88
+ }
89
+ this.blocks.push({
90
+ type: 'todos',
91
+ items: items.map((item) => ({ ...item })),
92
+ });
93
+ }
94
+ findLastTodosBlockIndex() {
95
+ for (let i = this.blocks.length - 1; i >= 0; i--) {
96
+ if (this.blocks[i].type === 'todos')
97
+ return i;
98
+ }
99
+ return -1;
100
+ }
101
+ finalize() {
102
+ if (this.finalized)
103
+ return;
104
+ this.finalized = true;
105
+ this.onThinkingEnd();
106
+ this.openTools = -1;
107
+ this.closeMarkdownSegment();
108
+ for (const block of this.blocks) {
109
+ if (block.type === 'thinking') {
110
+ block.streaming = false;
111
+ block.content = (0, cursorStreamProtocol_1.sanitizeThinkingChunk)(block.content);
112
+ }
113
+ }
114
+ (0, cursorStreamProtocol_1.stripPostToolThinkingBlocks)(this.blocks);
115
+ this.blocks = this.pruneBlocks(this.blocks);
116
+ this.suggestions = (0, cursorStreamProtocol_1.finalizeTimelineNextTags)(this.blocks);
117
+ }
118
+ pruneBlocks(blocks) {
119
+ const pruned = [];
120
+ for (const block of blocks) {
121
+ if (block.type === 'thinking') {
122
+ if (!(0, cursorStreamProtocol_1.isMeaningfulThinkingContent)(block.content))
123
+ continue;
124
+ pruned.push({ ...block, streaming: false });
125
+ continue;
126
+ }
127
+ if (block.type === 'markdown') {
128
+ const content = block.content.trim();
129
+ if (!content)
130
+ continue;
131
+ const last = pruned.at(-1);
132
+ if (last?.type === 'markdown') {
133
+ last.content = `${last.content.replace(/\n+$/, '')}\n\n${content}`;
134
+ }
135
+ else {
136
+ pruned.push({ type: 'markdown', content });
137
+ }
138
+ continue;
139
+ }
140
+ if (block.type === 'tools' && block.calls.length > 0) {
141
+ pruned.push({ type: 'tools', calls: block.calls.map((t) => ({ ...t })) });
142
+ }
143
+ else if (block.type === 'todos' && block.items.length > 0) {
144
+ pruned.push({
145
+ type: 'todos',
146
+ items: block.items.map((item) => ({ ...item })),
147
+ title: block.title,
148
+ status: block.status,
149
+ });
150
+ }
151
+ }
152
+ return pruned;
153
+ }
154
+ closeMarkdownSegment() {
155
+ this.openMarkdown = -1;
156
+ }
157
+ }
158
+ exports.AssistantTimelineBuilder = AssistantTimelineBuilder;
159
+ function flattenToolCallsFromTimeline(blocks) {
160
+ const out = [];
161
+ for (const block of blocks) {
162
+ if (block.type === 'tools')
163
+ out.push(...block.calls);
164
+ }
165
+ return out;
166
+ }
167
+ function mergeThinkingFromTimeline(blocks) {
168
+ return blocks
169
+ .filter((b) => b.type === 'thinking')
170
+ .map((b) => b.content.trim())
171
+ .filter(Boolean)
172
+ .join('\n\n');
173
+ }
174
+ function mergeMarkdownFromTimeline(blocks) {
175
+ return blocks
176
+ .filter((b) => b.type === 'markdown')
177
+ .map((b) => b.content)
178
+ .join('');
179
+ }
180
+ //# sourceMappingURL=assistantTimeline.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"assistantTimeline.js","sourceRoot":"","sources":["../../../../nodes/CursorAgent/lib/assistantTimeline.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,70 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.mergeThinkingForMeta = mergeThinkingForMeta;
4
+ exports.stripCursorMessageMeta = stripCursorMessageMeta;
5
+ exports.extractThinkingFromOutput = extractThinkingFromOutput;
6
+ exports.embedCursorMessageMeta = embedCursorMessageMeta;
7
+ const CURSOR_META_RE = /<cursor_meta>([\s\S]*?)<\/cursor_meta>/i;
8
+ const CURSOR_THINKING_TAG = '(?:redacted_thinking|think)';
9
+ const THINKING_BLOCK_RE = new RegExp(`<\\s*${CURSOR_THINKING_TAG}\\s*>([\\s\\S]*?)<\\s*\\/\\s*${CURSOR_THINKING_TAG}\\s*>`, 'gi');
10
+ /** 合并 output 标签提取与 SDK thinkingBuffer,避免只落库第一块 */
11
+ function mergeThinkingForMeta(extracted, buffered) {
12
+ const fromTags = extracted.trim();
13
+ const fromBuffer = buffered.trim();
14
+ if (!fromTags)
15
+ return fromBuffer;
16
+ if (!fromBuffer)
17
+ return fromTags;
18
+ if (fromTags.includes(fromBuffer))
19
+ return fromTags;
20
+ if (fromBuffer.includes(fromTags))
21
+ return fromBuffer;
22
+ return `${fromTags}\n\n${fromBuffer}`;
23
+ }
24
+ function stripCursorMessageMeta(content) {
25
+ if (!content)
26
+ return '';
27
+ return content.replace(CURSOR_META_RE, '').trimEnd();
28
+ }
29
+ /** 从 output 中提取全部 thinking 块正文 */
30
+ function extractThinkingFromOutput(output) {
31
+ if (!output)
32
+ return '';
33
+ const parts = [];
34
+ const re = new RegExp(THINKING_BLOCK_RE.source, 'gi');
35
+ let match;
36
+ while ((match = re.exec(output)) !== null) {
37
+ const chunk = match[1].trim();
38
+ if (chunk)
39
+ parts.push(chunk);
40
+ }
41
+ return parts.join('\n\n');
42
+ }
43
+ function embedCursorMessageMeta(content, meta) {
44
+ const clean = stripCursorMessageMeta(content);
45
+ const hasTools = !!meta.toolCalls?.length;
46
+ const hasDuration = meta.thinkingDurationMs !== undefined;
47
+ const hasThinking = !!meta.thinking?.trim();
48
+ const hasTimeline = !!meta.timeline?.length;
49
+ const hasSuggestions = !!meta.suggestions?.length;
50
+ if (!hasTools && !hasDuration && !hasThinking && !hasTimeline && !hasSuggestions)
51
+ return clean;
52
+ const payload = {};
53
+ if (hasTools) {
54
+ payload.toolCalls = meta.toolCalls.map((t) => ({ ...t, done: true }));
55
+ }
56
+ if (hasDuration) {
57
+ payload.thinkingDurationMs = meta.thinkingDurationMs;
58
+ }
59
+ if (hasThinking) {
60
+ payload.thinking = meta.thinking.trim();
61
+ }
62
+ if (hasSuggestions) {
63
+ payload.suggestions = meta.suggestions;
64
+ }
65
+ if (hasTimeline) {
66
+ payload.timeline = meta.timeline;
67
+ }
68
+ return `${clean}\n<cursor_meta>${JSON.stringify(payload)}</cursor_meta>`;
69
+ }
70
+ //# sourceMappingURL=cursorMessageMeta.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cursorMessageMeta.js","sourceRoot":"","sources":["../../../../nodes/CursorAgent/lib/cursorMessageMeta.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,383 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.CURSOR_STREAM_MARKER = void 0;
4
+ exports.encodeCursorStreamPayload = encodeCursorStreamPayload;
5
+ exports.tryParseCursorStreamPayload = tryParseCursorStreamPayload;
6
+ exports.isAskQuestionUnavailableText = isAskQuestionUnavailableText;
7
+ exports.shouldSuppressAssistantText = shouldSuppressAssistantText;
8
+ exports.stripNextTags = stripNextTags;
9
+ exports.extractNextSuggestions = extractNextSuggestions;
10
+ exports.finalizeTimelineNextTags = finalizeTimelineNextTags;
11
+ exports.sanitizeThinkingChunk = sanitizeThinkingChunk;
12
+ exports.isMeaningfulThinkingContent = isMeaningfulThinkingContent;
13
+ exports.stripPostToolThinkingBlocks = stripPostToolThinkingBlocks;
14
+ exports.isAskQuestionToolName = isAskQuestionToolName;
15
+ exports.parseAskQuestionArgs = parseAskQuestionArgs;
16
+ exports.parseUpdateTodosArgs = parseUpdateTodosArgs;
17
+ exports.isUpdateTodosToolName = isUpdateTodosToolName;
18
+ exports.shouldShowToolInUi = shouldShowToolInUi;
19
+ exports.resolveMcpToolName = resolveMcpToolName;
20
+ exports.resolveToolLabel = resolveToolLabel;
21
+ exports.extractToolIdentity = extractToolIdentity;
22
+ exports.stripCursorToolCallLines = stripCursorToolCallLines;
23
+ /** n8n item.content JSON envelope for Cursor-native stream events (not plain text). */
24
+ exports.CURSOR_STREAM_MARKER = '__cursor__';
25
+ function encodeCursorStreamPayload(payload) {
26
+ return JSON.stringify({ [exports.CURSOR_STREAM_MARKER]: payload });
27
+ }
28
+ function tryParseCursorStreamPayload(content) {
29
+ const trimmed = content.trim();
30
+ if (!trimmed.startsWith('{'))
31
+ return null;
32
+ try {
33
+ const obj = JSON.parse(trimmed);
34
+ const payload = obj[exports.CURSOR_STREAM_MARKER];
35
+ if (!payload || typeof payload !== 'object' || Array.isArray(payload))
36
+ return null;
37
+ const kind = payload.kind;
38
+ if (typeof kind !== 'string')
39
+ return null;
40
+ return payload;
41
+ }
42
+ catch {
43
+ return null;
44
+ }
45
+ }
46
+ /** SDK headless 回退文案:已由前端 AskQuestion 面板接管,不再展示给用户 */
47
+ const ASKQUESTION_UNAVAILABLE_PATTERNS = [
48
+ /^The AskQuestion tool is unavailable\.?$/i,
49
+ /^AskQuestion tool is unavailable\.?$/i,
50
+ ];
51
+ function isAskQuestionUnavailableText(text) {
52
+ const t = text.trim();
53
+ if (!t)
54
+ return false;
55
+ return ASKQUESTION_UNAVAILABLE_PATTERNS.some((re) => re.test(t));
56
+ }
57
+ function shouldSuppressAssistantText(text) {
58
+ const t = text.trim();
59
+ if (!t)
60
+ return true;
61
+ return isAskQuestionUnavailableText(t);
62
+ }
63
+ const NEXT_TAG_BLOCK_RE = /<next>([\s\S]*?)<\/next>/gi;
64
+ const NEXT_TAG_RE = /<\s*\/?\s*next\s*>/gi;
65
+ /** 移除 `<next>` 标签(中间段落不应携带建议项) */
66
+ function stripNextTags(text) {
67
+ if (!text)
68
+ return '';
69
+ let result = text.replace(NEXT_TAG_BLOCK_RE, '');
70
+ const openIdx = result.lastIndexOf('<next>');
71
+ if (openIdx >= 0 && !result.slice(openIdx).includes('</next>')) {
72
+ result = result.slice(0, openIdx);
73
+ }
74
+ return result.replace(NEXT_TAG_RE, '').trim();
75
+ }
76
+ /** 从正文提取 `<next>` 建议项 */
77
+ function extractNextSuggestions(text) {
78
+ if (!text)
79
+ return [];
80
+ const suggestions = [];
81
+ const re = /<next>([\s\S]*?)<\/next>/gi;
82
+ let match;
83
+ while ((match = re.exec(text)) !== null) {
84
+ const item = match[1].trim();
85
+ if (item)
86
+ suggestions.push(item);
87
+ }
88
+ return suggestions;
89
+ }
90
+ /** 提取建议并从 timeline 所有 markdown 块移除 `<next>` */
91
+ function finalizeTimelineNextTags(blocks) {
92
+ let lastMd = -1;
93
+ for (let i = blocks.length - 1; i >= 0; i--) {
94
+ if (blocks[i].type === 'markdown') {
95
+ lastMd = i;
96
+ break;
97
+ }
98
+ }
99
+ const suggestions = lastMd >= 0 && blocks[lastMd].content
100
+ ? extractNextSuggestions(blocks[lastMd].content)
101
+ : [];
102
+ for (const block of blocks) {
103
+ if (block.type === 'markdown' && block.content) {
104
+ block.content = stripNextTags(block.content);
105
+ }
106
+ }
107
+ return suggestions;
108
+ }
109
+ function sanitizeThinkingChunk(text) {
110
+ if (!text)
111
+ return '';
112
+ return text
113
+ .replace(NEXT_TAG_BLOCK_RE, '')
114
+ .replace(NEXT_TAG_RE, '')
115
+ .replace(/<\/?to_summarize>/gi, '')
116
+ .replace(/Part\s+\d+\s*\([^)]*\):[^\n]*/gi, '')
117
+ .replace(/\n{3,}/g, '\n\n')
118
+ .trim();
119
+ }
120
+ function isMeaningfulThinkingContent(content) {
121
+ const cleaned = sanitizeThinkingChunk(content);
122
+ if (!cleaned)
123
+ return false;
124
+ if (cleaned.length < 8)
125
+ return false;
126
+ if (!/[\u4e00-\u9fa5a-zA-Z]/.test(cleaned))
127
+ return false;
128
+ if (/[\u4e00-\u9fa5]/.test(cleaned))
129
+ return true;
130
+ if (/^I will\b/i.test(cleaned))
131
+ return false;
132
+ if (/^I need to\b/i.test(cleaned))
133
+ return false;
134
+ if (/^Let me\b/i.test(cleaned))
135
+ return false;
136
+ if (/foradditional details/i.test(cleaned))
137
+ return false;
138
+ if (/mapinformation|thedefinition of/i.test(cleaned))
139
+ return false;
140
+ return cleaned.length >= 40;
141
+ }
142
+ /** 移除第一个 tools 块之后出现的 thinking */
143
+ function stripPostToolThinkingBlocks(blocks) {
144
+ let seenTools = false;
145
+ for (let i = blocks.length - 1; i >= 0; i--) {
146
+ const block = blocks[i];
147
+ if (block.type === 'tools') {
148
+ seenTools = true;
149
+ continue;
150
+ }
151
+ if (block.type === 'thinking' && seenTools) {
152
+ blocks.splice(i, 1);
153
+ }
154
+ }
155
+ }
156
+ function isAskQuestionToolName(rawName) {
157
+ return rawName === 'AskQuestion' || rawName === 'askQuestion';
158
+ }
159
+ function normalizeQuestionOption(raw) {
160
+ if (!raw || typeof raw !== 'object' || Array.isArray(raw))
161
+ return null;
162
+ const record = raw;
163
+ const id = typeof record.id === 'string' ? record.id : '';
164
+ const label = typeof record.label === 'string' ? record.label : id;
165
+ if (!id)
166
+ return null;
167
+ return { id, label };
168
+ }
169
+ function normalizeQuestionItem(raw) {
170
+ if (!raw || typeof raw !== 'object' || Array.isArray(raw))
171
+ return null;
172
+ const record = raw;
173
+ const id = typeof record.id === 'string' ? record.id : '';
174
+ const prompt = (typeof record.prompt === 'string' && record.prompt) ||
175
+ (typeof record.question === 'string' && record.question) ||
176
+ id;
177
+ if (!id || !prompt)
178
+ return null;
179
+ const optionsRaw = record.options;
180
+ if (!Array.isArray(optionsRaw))
181
+ return null;
182
+ const options = optionsRaw
183
+ .map(normalizeQuestionOption)
184
+ .filter((item) => item !== null);
185
+ if (options.length === 0)
186
+ return null;
187
+ return {
188
+ id,
189
+ prompt,
190
+ options,
191
+ allowMultiple: record.allow_multiple === true || record.allowMultiple === true,
192
+ };
193
+ }
194
+ /** 防御式解析 Cursor AskQuestion 工具参数(schema 不稳定,见 SDK 文档) */
195
+ function parseAskQuestionArgs(args) {
196
+ if (!args)
197
+ return null;
198
+ let record;
199
+ if (typeof args === 'string') {
200
+ try {
201
+ record = JSON.parse(args);
202
+ }
203
+ catch {
204
+ return null;
205
+ }
206
+ }
207
+ else if (typeof args === 'object' && !Array.isArray(args)) {
208
+ record = args;
209
+ }
210
+ else {
211
+ return null;
212
+ }
213
+ const nested = record.input ?? record.arguments ?? record.params;
214
+ if (nested && typeof nested === 'object' && !Array.isArray(nested)) {
215
+ const nestedParsed = parseAskQuestionArgs(nested);
216
+ if (nestedParsed)
217
+ return nestedParsed;
218
+ }
219
+ const questionsRaw = record.questions;
220
+ if (!Array.isArray(questionsRaw))
221
+ return null;
222
+ const questions = questionsRaw
223
+ .map(normalizeQuestionItem)
224
+ .filter((item) => item !== null);
225
+ if (questions.length === 0)
226
+ return null;
227
+ const title = typeof record.title === 'string' ? record.title : undefined;
228
+ return { title, questions };
229
+ }
230
+ function parseUpdateTodosArgs(args) {
231
+ if (!args)
232
+ return null;
233
+ let record;
234
+ if (typeof args === 'string') {
235
+ try {
236
+ record = JSON.parse(args);
237
+ }
238
+ catch {
239
+ return null;
240
+ }
241
+ }
242
+ else if (typeof args === 'object' && !Array.isArray(args)) {
243
+ record = args;
244
+ }
245
+ else {
246
+ return null;
247
+ }
248
+ const nested = record.input ?? record.arguments ?? record.params;
249
+ if (nested && typeof nested === 'object' && !Array.isArray(nested)) {
250
+ const nestedParsed = parseUpdateTodosArgs(nested);
251
+ if (nestedParsed)
252
+ return nestedParsed;
253
+ }
254
+ const todosRaw = record.todos;
255
+ if (!Array.isArray(todosRaw))
256
+ return null;
257
+ const items = todosRaw
258
+ .map((raw, index) => {
259
+ if (!raw || typeof raw !== 'object' || Array.isArray(raw))
260
+ return null;
261
+ const todo = raw;
262
+ const content = (typeof todo.content === 'string' && todo.content)
263
+ || (typeof todo.title === 'string' && todo.title)
264
+ || '';
265
+ if (!content.trim())
266
+ return null;
267
+ const id = typeof todo.id === 'string' && todo.id.trim()
268
+ ? todo.id.trim()
269
+ : `todo-${index}-${content.slice(0, 24)}`;
270
+ const statusRaw = todo.status;
271
+ const status = statusRaw === 'inProgress'
272
+ || statusRaw === 'completed'
273
+ || statusRaw === 'cancelled'
274
+ || statusRaw === 'pending'
275
+ ? statusRaw
276
+ : 'pending';
277
+ return { id, content: content.trim(), status };
278
+ })
279
+ .filter((item) => item !== null);
280
+ return items.length > 0 ? items : null;
281
+ }
282
+ /** 不在工具链 UI 展示的内部工具 */
283
+ const HIDDEN_TOOL_NAMES = new Set(['ReadLints', 'glob', 'Glob', 'Grep', 'Shell', 'Task']);
284
+ function isUpdateTodosToolName(rawName) {
285
+ if (!rawName)
286
+ return false;
287
+ return rawName === 'updateTodos' || rawName === 'TodoWrite' || rawName === 'todoWrite';
288
+ }
289
+ function shouldShowToolInUi(rawName) {
290
+ if (!rawName)
291
+ return false;
292
+ if (isAskQuestionToolName(rawName))
293
+ return false;
294
+ if (isUpdateTodosToolName(rawName))
295
+ return false;
296
+ return !HIDDEN_TOOL_NAMES.has(rawName);
297
+ }
298
+ function resolveMcpToolName(args) {
299
+ if (!args || typeof args !== 'object' || Array.isArray(args))
300
+ return 'mcp';
301
+ const record = args;
302
+ for (const key of ['toolName', 'name', 'tool', 'method']) {
303
+ const value = record[key];
304
+ if (typeof value === 'string' && value.trim())
305
+ return value.trim();
306
+ }
307
+ const nested = record.arguments ?? record.input ?? record.params;
308
+ if (nested && typeof nested === 'object' && !Array.isArray(nested)) {
309
+ const inner = nested;
310
+ for (const key of ['toolName', 'name', 'tool', 'method']) {
311
+ const value = inner[key];
312
+ if (typeof value === 'string' && value.trim())
313
+ return value.trim();
314
+ }
315
+ }
316
+ return 'mcp';
317
+ }
318
+ /** 流式/落库:忠实保留 MCP 与 Cursor 原始工具名,不做本地化 */
319
+ function resolveToolLabel(rawName) {
320
+ return rawName?.trim() || 'tool';
321
+ }
322
+ function extractToolIdentity(toolCall) {
323
+ if (!toolCall || typeof toolCall !== 'object' || Array.isArray(toolCall)) {
324
+ return { name: 'tool' };
325
+ }
326
+ const record = toolCall;
327
+ const typeName = typeof record.type === 'string' ? record.type : '';
328
+ const explicitName = typeof record.name === 'string' ? record.name : '';
329
+ const name = explicitName || typeName || 'tool';
330
+ if (name === 'mcp' || name === 'MCP' || typeName === 'mcp') {
331
+ const args = record.args ?? record.input ?? record.parameters;
332
+ return { name: resolveMcpToolName(args), args };
333
+ }
334
+ const args = record.args ?? record.input;
335
+ return { name, args };
336
+ }
337
+ function stripCursorToolCallLines(text) {
338
+ if (!text)
339
+ return '';
340
+ let result = text;
341
+ let match;
342
+ const re = /Calling\s+(\S+)\s+with\s+input:\s*\{/g;
343
+ while ((match = re.exec(result)) !== null) {
344
+ const start = match.index;
345
+ const braceIndex = start + match[0].length - 1;
346
+ let depth = 0;
347
+ let inString = false;
348
+ let escape = false;
349
+ let end = -1;
350
+ for (let i = braceIndex; i < result.length; i++) {
351
+ const c = result[i];
352
+ if (escape) {
353
+ escape = false;
354
+ continue;
355
+ }
356
+ if (c === '\\' && inString) {
357
+ escape = true;
358
+ continue;
359
+ }
360
+ if (c === '"') {
361
+ inString = !inString;
362
+ continue;
363
+ }
364
+ if (inString)
365
+ continue;
366
+ if (c === '{')
367
+ depth++;
368
+ else if (c === '}') {
369
+ depth--;
370
+ if (depth === 0) {
371
+ end = i + 1;
372
+ break;
373
+ }
374
+ }
375
+ }
376
+ if (end < 0)
377
+ break;
378
+ result = result.slice(0, start) + result.slice(end);
379
+ re.lastIndex = start;
380
+ }
381
+ return result;
382
+ }
383
+ //# sourceMappingURL=cursorStreamProtocol.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cursorStreamProtocol.js","sourceRoot":"","sources":["../../../../nodes/CursorAgent/lib/cursorStreamProtocol.ts"],"names":[],"mappings":"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"}