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.
- package/LICENSE +21 -0
- package/README.md +152 -0
- package/dist/credentials/CursorApi.credentials.js +31 -0
- package/dist/credentials/CursorApi.credentials.js.map +1 -0
- package/dist/credentials/cursor.svg +1 -0
- package/dist/nodes/CursorAgent/CursorAgent.node.js +479 -0
- package/dist/nodes/CursorAgent/CursorAgent.node.js.map +1 -0
- package/dist/nodes/CursorAgent/cursor.svg +1 -0
- package/dist/nodes/CursorAgent/lib/assistantTimeline.js +180 -0
- package/dist/nodes/CursorAgent/lib/assistantTimeline.js.map +1 -0
- package/dist/nodes/CursorAgent/lib/cursorMessageMeta.js +70 -0
- package/dist/nodes/CursorAgent/lib/cursorMessageMeta.js.map +1 -0
- package/dist/nodes/CursorAgent/lib/cursorStreamProtocol.js +383 -0
- package/dist/nodes/CursorAgent/lib/cursorStreamProtocol.js.map +1 -0
- package/dist/nodes/CursorAgent/lib/parseMcpServers.js +190 -0
- package/dist/nodes/CursorAgent/lib/parseMcpServers.js.map +1 -0
- package/dist/nodes/CursorAgent/lib/resolveApiKey.js +14 -0
- package/dist/nodes/CursorAgent/lib/resolveApiKey.js.map +1 -0
- package/dist/nodes/CursorAgent/lib/resolveLocalCwd.js +35 -0
- package/dist/nodes/CursorAgent/lib/resolveLocalCwd.js.map +1 -0
- package/dist/nodes/CursorAgent/lib/sessionStore.js +42 -0
- package/dist/nodes/CursorAgent/lib/sessionStore.js.map +1 -0
- package/dist/nodes/CursorAgent/lib/streamAdapter.js +260 -0
- package/dist/nodes/CursorAgent/lib/streamAdapter.js.map +1 -0
- package/package.json +68 -0
|
@@ -0,0 +1,190 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.parseMcpServers = parseMcpServers;
|
|
4
|
+
function parseKeyValueCollection(entries) {
|
|
5
|
+
if (!entries?.length)
|
|
6
|
+
return undefined;
|
|
7
|
+
const result = {};
|
|
8
|
+
for (const entry of entries) {
|
|
9
|
+
const key = entry.name?.trim();
|
|
10
|
+
if (!key)
|
|
11
|
+
continue;
|
|
12
|
+
result[key] = String(entry.value ?? '');
|
|
13
|
+
}
|
|
14
|
+
return Object.keys(result).length > 0 ? result : undefined;
|
|
15
|
+
}
|
|
16
|
+
function parseJsonRecord(raw, fieldLabel) {
|
|
17
|
+
const trimmed = raw?.trim();
|
|
18
|
+
if (!trimmed)
|
|
19
|
+
return undefined;
|
|
20
|
+
let parsed;
|
|
21
|
+
try {
|
|
22
|
+
parsed = JSON.parse(trimmed);
|
|
23
|
+
}
|
|
24
|
+
catch {
|
|
25
|
+
throw new Error(`${fieldLabel} must be valid JSON object`);
|
|
26
|
+
}
|
|
27
|
+
if (!parsed || typeof parsed !== 'object' || Array.isArray(parsed)) {
|
|
28
|
+
throw new Error(`${fieldLabel} must be a JSON object`);
|
|
29
|
+
}
|
|
30
|
+
const result = {};
|
|
31
|
+
for (const [key, value] of Object.entries(parsed)) {
|
|
32
|
+
if (value === undefined || value === null)
|
|
33
|
+
continue;
|
|
34
|
+
result[key] = String(value);
|
|
35
|
+
}
|
|
36
|
+
return Object.keys(result).length > 0 ? result : undefined;
|
|
37
|
+
}
|
|
38
|
+
function normalizeArgs(args) {
|
|
39
|
+
if (args === undefined || args === null)
|
|
40
|
+
return undefined;
|
|
41
|
+
if (Array.isArray(args)) {
|
|
42
|
+
const normalized = args.map((arg) => String(arg).trim()).filter(Boolean);
|
|
43
|
+
return normalized.length > 0 ? normalized : undefined;
|
|
44
|
+
}
|
|
45
|
+
const trimmed = args.trim();
|
|
46
|
+
if (!trimmed)
|
|
47
|
+
return undefined;
|
|
48
|
+
return trimmed.split(',').map((part) => part.trim()).filter(Boolean);
|
|
49
|
+
}
|
|
50
|
+
function buildServerConfig(entry, index) {
|
|
51
|
+
const name = entry.name?.trim();
|
|
52
|
+
if (!name) {
|
|
53
|
+
throw new Error(`MCP server at index ${index + 1} is missing a name`);
|
|
54
|
+
}
|
|
55
|
+
const transport = (entry.transport?.trim().toLowerCase() || 'http');
|
|
56
|
+
if (transport !== 'http' && transport !== 'sse' && transport !== 'stdio') {
|
|
57
|
+
throw new Error(`MCP server "${name}" has unsupported transport "${entry.transport}"`);
|
|
58
|
+
}
|
|
59
|
+
if (transport === 'stdio') {
|
|
60
|
+
const command = entry.command?.trim();
|
|
61
|
+
if (!command) {
|
|
62
|
+
throw new Error(`MCP server "${name}" (stdio) requires a command`);
|
|
63
|
+
}
|
|
64
|
+
const config = {
|
|
65
|
+
type: 'stdio',
|
|
66
|
+
command,
|
|
67
|
+
};
|
|
68
|
+
const args = normalizeArgs(entry.args);
|
|
69
|
+
if (args)
|
|
70
|
+
config.args = args;
|
|
71
|
+
const env = parseKeyValueCollection(entry.envVars?.envVar)
|
|
72
|
+
?? parseJsonRecord(entry.envJson, `MCP server "${name}" env JSON`);
|
|
73
|
+
if (env)
|
|
74
|
+
config.env = env;
|
|
75
|
+
const cwd = entry.cwd?.trim();
|
|
76
|
+
if (cwd)
|
|
77
|
+
config.cwd = cwd;
|
|
78
|
+
return { name, config };
|
|
79
|
+
}
|
|
80
|
+
const url = entry.url?.trim();
|
|
81
|
+
if (!url) {
|
|
82
|
+
throw new Error(`MCP server "${name}" (${transport}) requires a URL`);
|
|
83
|
+
}
|
|
84
|
+
const headers = parseKeyValueCollection(entry.headers?.header)
|
|
85
|
+
?? parseJsonRecord(entry.headersJson, `MCP server "${name}" headers JSON`);
|
|
86
|
+
const config = {
|
|
87
|
+
type: transport,
|
|
88
|
+
url,
|
|
89
|
+
};
|
|
90
|
+
if (headers)
|
|
91
|
+
config.headers = headers;
|
|
92
|
+
return { name, config };
|
|
93
|
+
}
|
|
94
|
+
function parseFormServers(formValue) {
|
|
95
|
+
const entries = formValue?.server;
|
|
96
|
+
if (!entries?.length)
|
|
97
|
+
return {};
|
|
98
|
+
const result = {};
|
|
99
|
+
for (let index = 0; index < entries.length; index++) {
|
|
100
|
+
const { name, config } = buildServerConfig(entries[index], index);
|
|
101
|
+
if (result[name]) {
|
|
102
|
+
throw new Error(`Duplicate MCP server name "${name}"`);
|
|
103
|
+
}
|
|
104
|
+
result[name] = config;
|
|
105
|
+
}
|
|
106
|
+
return result;
|
|
107
|
+
}
|
|
108
|
+
function assertMcpServerConfig(name, raw) {
|
|
109
|
+
if (!raw || typeof raw !== 'object' || Array.isArray(raw)) {
|
|
110
|
+
throw new Error(`MCP server "${name}" must be a JSON object`);
|
|
111
|
+
}
|
|
112
|
+
const record = raw;
|
|
113
|
+
const explicitType = typeof record.type === 'string' ? record.type.trim().toLowerCase() : '';
|
|
114
|
+
if (explicitType === 'stdio' || (!explicitType && typeof record.command === 'string')) {
|
|
115
|
+
const command = typeof record.command === 'string' ? record.command.trim() : '';
|
|
116
|
+
if (!command) {
|
|
117
|
+
throw new Error(`MCP server "${name}" (stdio) requires "command"`);
|
|
118
|
+
}
|
|
119
|
+
const config = { type: 'stdio', command };
|
|
120
|
+
if (Array.isArray(record.args)) {
|
|
121
|
+
config.args = record.args.map((arg) => String(arg));
|
|
122
|
+
}
|
|
123
|
+
if (record.env && typeof record.env === 'object' && !Array.isArray(record.env)) {
|
|
124
|
+
config.env = Object.fromEntries(Object.entries(record.env).map(([key, value]) => [key, String(value)]));
|
|
125
|
+
}
|
|
126
|
+
if (typeof record.cwd === 'string' && record.cwd.trim()) {
|
|
127
|
+
config.cwd = record.cwd.trim();
|
|
128
|
+
}
|
|
129
|
+
return config;
|
|
130
|
+
}
|
|
131
|
+
const transport = explicitType === 'sse' || explicitType === 'http'
|
|
132
|
+
? explicitType
|
|
133
|
+
: explicitType === '' && typeof record.url === 'string'
|
|
134
|
+
? 'http'
|
|
135
|
+
: '';
|
|
136
|
+
if (transport !== 'http' && transport !== 'sse') {
|
|
137
|
+
throw new Error(`MCP server "${name}" must specify type "http", "sse", or "stdio"`);
|
|
138
|
+
}
|
|
139
|
+
const url = typeof record.url === 'string' ? record.url.trim() : '';
|
|
140
|
+
if (!url) {
|
|
141
|
+
throw new Error(`MCP server "${name}" (${transport}) requires "url"`);
|
|
142
|
+
}
|
|
143
|
+
const config = { type: transport, url };
|
|
144
|
+
if (record.headers && typeof record.headers === 'object' && !Array.isArray(record.headers)) {
|
|
145
|
+
config.headers = Object.fromEntries(Object.entries(record.headers).map(([key, value]) => [key, String(value)]));
|
|
146
|
+
}
|
|
147
|
+
if (record.auth && typeof record.auth === 'object' && !Array.isArray(record.auth)) {
|
|
148
|
+
const auth = record.auth;
|
|
149
|
+
const clientId = typeof auth.CLIENT_ID === 'string' ? auth.CLIENT_ID : '';
|
|
150
|
+
if (clientId) {
|
|
151
|
+
config.auth = {
|
|
152
|
+
CLIENT_ID: clientId,
|
|
153
|
+
CLIENT_SECRET: typeof auth.CLIENT_SECRET === 'string' ? auth.CLIENT_SECRET : undefined,
|
|
154
|
+
scopes: Array.isArray(auth.scopes) ? auth.scopes.map((scope) => String(scope)) : undefined,
|
|
155
|
+
};
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
return config;
|
|
159
|
+
}
|
|
160
|
+
function parseJsonServers(mcpServersJson) {
|
|
161
|
+
const trimmed = mcpServersJson.trim();
|
|
162
|
+
if (!trimmed)
|
|
163
|
+
return {};
|
|
164
|
+
let parsed;
|
|
165
|
+
try {
|
|
166
|
+
parsed = JSON.parse(trimmed);
|
|
167
|
+
}
|
|
168
|
+
catch {
|
|
169
|
+
throw new Error('MCP Servers JSON must be valid JSON');
|
|
170
|
+
}
|
|
171
|
+
if (!parsed || typeof parsed !== 'object' || Array.isArray(parsed)) {
|
|
172
|
+
throw new Error('MCP Servers JSON must be an object keyed by server name');
|
|
173
|
+
}
|
|
174
|
+
const result = {};
|
|
175
|
+
for (const [name, config] of Object.entries(parsed)) {
|
|
176
|
+
const trimmedName = name.trim();
|
|
177
|
+
if (!trimmedName)
|
|
178
|
+
continue;
|
|
179
|
+
result[trimmedName] = assertMcpServerConfig(trimmedName, config);
|
|
180
|
+
}
|
|
181
|
+
return result;
|
|
182
|
+
}
|
|
183
|
+
function parseMcpServers(mcpServersJson, formValue) {
|
|
184
|
+
const jsonOverride = mcpServersJson?.trim();
|
|
185
|
+
if (jsonOverride) {
|
|
186
|
+
return parseJsonServers(jsonOverride);
|
|
187
|
+
}
|
|
188
|
+
return parseFormServers(formValue);
|
|
189
|
+
}
|
|
190
|
+
//# sourceMappingURL=parseMcpServers.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"parseMcpServers.js","sourceRoot":"","sources":["../../../../nodes/CursorAgent/lib/parseMcpServers.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.resolveCursorApiKey = resolveCursorApiKey;
|
|
4
|
+
async function resolveCursorApiKey(ctx) {
|
|
5
|
+
const cursorCredentials = await ctx.getCredentials('cursorApi');
|
|
6
|
+
const fromCredential = String(cursorCredentials.apiKey ?? '').trim();
|
|
7
|
+
if (fromCredential)
|
|
8
|
+
return fromCredential;
|
|
9
|
+
const fromEnv = String(process.env.CURSOR_API_KEY ?? '').trim();
|
|
10
|
+
if (fromEnv)
|
|
11
|
+
return fromEnv;
|
|
12
|
+
throw new Error('Cursor API key is required: create a Cursor API credential in n8n and select it on this node');
|
|
13
|
+
}
|
|
14
|
+
//# sourceMappingURL=resolveApiKey.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"resolveApiKey.js","sourceRoot":"","sources":["../../../../nodes/CursorAgent/lib/resolveApiKey.ts"],"names":[],"mappings":";;AAIA,kDAWC;AAXM,KAAK,UAAU,mBAAmB,CAAC,GAAsB;IAC/D,MAAM,iBAAiB,GAAG,MAAM,GAAG,CAAC,cAAc,CAAC,WAAW,CAAC,CAAC;IAChE,MAAM,cAAc,GAAG,MAAM,CAAC,iBAAiB,CAAC,MAAM,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;IACrE,IAAI,cAAc;QAAE,OAAO,cAAc,CAAC;IAE1C,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,cAAc,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;IAChE,IAAI,OAAO;QAAE,OAAO,OAAO,CAAC;IAE5B,MAAM,IAAI,KAAK,CACd,8FAA8F,CAC9F,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.resolveLocalCwd = resolveLocalCwd;
|
|
4
|
+
/**
|
|
5
|
+
* Merge skills root, multi-value working directories, and legacy single cwd
|
|
6
|
+
* into the shape expected by @cursor/sdk LocalAgentOptions.cwd.
|
|
7
|
+
*/
|
|
8
|
+
function resolveLocalCwd(params) {
|
|
9
|
+
const ordered = [];
|
|
10
|
+
const skillsRoot = params.skillsRoot?.trim();
|
|
11
|
+
if (skillsRoot)
|
|
12
|
+
ordered.push(skillsRoot);
|
|
13
|
+
const rawDirs = params.workingDirectories;
|
|
14
|
+
const dirList = Array.isArray(rawDirs)
|
|
15
|
+
? rawDirs
|
|
16
|
+
: rawDirs
|
|
17
|
+
? [rawDirs]
|
|
18
|
+
: [];
|
|
19
|
+
for (const dir of dirList) {
|
|
20
|
+
const trimmed = String(dir ?? '').trim();
|
|
21
|
+
if (trimmed)
|
|
22
|
+
ordered.push(trimmed);
|
|
23
|
+
}
|
|
24
|
+
const legacy = params.legacyWorkingDirectory?.trim();
|
|
25
|
+
if (legacy)
|
|
26
|
+
ordered.push(legacy);
|
|
27
|
+
const unique = [...new Set(ordered)];
|
|
28
|
+
if (unique.length === 0) {
|
|
29
|
+
throw new Error('At least one working directory is required');
|
|
30
|
+
}
|
|
31
|
+
if (unique.length === 1)
|
|
32
|
+
return unique[0];
|
|
33
|
+
return unique;
|
|
34
|
+
}
|
|
35
|
+
//# sourceMappingURL=resolveLocalCwd.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"resolveLocalCwd.js","sourceRoot":"","sources":["../../../../nodes/CursorAgent/lib/resolveLocalCwd.ts"],"names":[],"mappings":";;AAIA,0CA+BC;AAnCD;;;GAGG;AACH,SAAgB,eAAe,CAAC,MAI/B;IACA,MAAM,OAAO,GAAa,EAAE,CAAC;IAE7B,MAAM,UAAU,GAAG,MAAM,CAAC,UAAU,EAAE,IAAI,EAAE,CAAC;IAC7C,IAAI,UAAU;QAAE,OAAO,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;IAEzC,MAAM,OAAO,GAAG,MAAM,CAAC,kBAAkB,CAAC;IAC1C,MAAM,OAAO,GAAG,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC;QACrC,CAAC,CAAC,OAAO;QACT,CAAC,CAAC,OAAO;YACR,CAAC,CAAC,CAAC,OAAO,CAAC;YACX,CAAC,CAAC,EAAE,CAAC;IAEP,KAAK,MAAM,GAAG,IAAI,OAAO,EAAE,CAAC;QAC3B,MAAM,OAAO,GAAG,MAAM,CAAC,GAAG,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;QACzC,IAAI,OAAO;YAAE,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IACpC,CAAC;IAED,MAAM,MAAM,GAAG,MAAM,CAAC,sBAAsB,EAAE,IAAI,EAAE,CAAC;IACrD,IAAI,MAAM;QAAE,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IAEjC,MAAM,MAAM,GAAG,CAAC,GAAG,IAAI,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC;IACrC,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACzB,MAAM,IAAI,KAAK,CAAC,4CAA4C,CAAC,CAAC;IAC/D,CAAC;IACD,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,MAAM,CAAC,CAAC,CAAC,CAAC;IAC1C,OAAO,MAAM,CAAC;AACf,CAAC"}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.withRedisClient = withRedisClient;
|
|
4
|
+
exports.getStoredAgentId = getStoredAgentId;
|
|
5
|
+
exports.setStoredAgentId = setStoredAgentId;
|
|
6
|
+
const redis_1 = require("redis");
|
|
7
|
+
const SESSION_KEY_PREFIX = 'cursor-agent:session:';
|
|
8
|
+
const DEFAULT_TTL_SECONDS = 60 * 60 * 24 * 7;
|
|
9
|
+
async function withRedisClient(credentials, fn) {
|
|
10
|
+
const client = (0, redis_1.createClient)({
|
|
11
|
+
socket: {
|
|
12
|
+
host: credentials.host,
|
|
13
|
+
port: credentials.port,
|
|
14
|
+
},
|
|
15
|
+
username: credentials.user || undefined,
|
|
16
|
+
password: credentials.password || undefined,
|
|
17
|
+
database: credentials.database ?? 0,
|
|
18
|
+
});
|
|
19
|
+
await client.connect();
|
|
20
|
+
try {
|
|
21
|
+
return await fn(client);
|
|
22
|
+
}
|
|
23
|
+
finally {
|
|
24
|
+
await client.quit();
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
async function getStoredAgentId(credentials, sessionId) {
|
|
28
|
+
if (!sessionId)
|
|
29
|
+
return undefined;
|
|
30
|
+
return withRedisClient(credentials, async (client) => {
|
|
31
|
+
const value = await client.get(`${SESSION_KEY_PREFIX}${sessionId}`);
|
|
32
|
+
return value ?? undefined;
|
|
33
|
+
});
|
|
34
|
+
}
|
|
35
|
+
async function setStoredAgentId(credentials, sessionId, agentId, ttlSeconds = DEFAULT_TTL_SECONDS) {
|
|
36
|
+
if (!sessionId || !agentId)
|
|
37
|
+
return;
|
|
38
|
+
await withRedisClient(credentials, async (client) => {
|
|
39
|
+
await client.set(`${SESSION_KEY_PREFIX}${sessionId}`, agentId, { EX: ttlSeconds });
|
|
40
|
+
});
|
|
41
|
+
}
|
|
42
|
+
//# sourceMappingURL=sessionStore.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sessionStore.js","sourceRoot":"","sources":["../../../../nodes/CursorAgent/lib/sessionStore.ts"],"names":[],"mappings":";;AAeA,0CAmBC;AAED,4CASC;AAED,4CAUC;AAzDD,iCAAqC;AAIrC,MAAM,kBAAkB,GAAG,uBAAuB,CAAC;AACnD,MAAM,mBAAmB,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC;AAUtC,KAAK,UAAU,eAAe,CACpC,WAA6B,EAC7B,EAAuC;IAEvC,MAAM,MAAM,GAAG,IAAA,oBAAY,EAAC;QAC3B,MAAM,EAAE;YACP,IAAI,EAAE,WAAW,CAAC,IAAI;YACtB,IAAI,EAAE,WAAW,CAAC,IAAI;SACtB;QACD,QAAQ,EAAE,WAAW,CAAC,IAAI,IAAI,SAAS;QACvC,QAAQ,EAAE,WAAW,CAAC,QAAQ,IAAI,SAAS;QAC3C,QAAQ,EAAE,WAAW,CAAC,QAAQ,IAAI,CAAC;KACnC,CAAC,CAAC;IACH,MAAM,MAAM,CAAC,OAAO,EAAE,CAAC;IACvB,IAAI,CAAC;QACJ,OAAO,MAAM,EAAE,CAAC,MAAM,CAAC,CAAC;IACzB,CAAC;YAAS,CAAC;QACV,MAAM,MAAM,CAAC,IAAI,EAAE,CAAC;IACrB,CAAC;AACF,CAAC;AAEM,KAAK,UAAU,gBAAgB,CACrC,WAA6B,EAC7B,SAAiB;IAEjB,IAAI,CAAC,SAAS;QAAE,OAAO,SAAS,CAAC;IACjC,OAAO,eAAe,CAAC,WAAW,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE;QACpD,MAAM,KAAK,GAAG,MAAM,MAAM,CAAC,GAAG,CAAC,GAAG,kBAAkB,GAAG,SAAS,EAAE,CAAC,CAAC;QACpE,OAAO,KAAK,IAAI,SAAS,CAAC;IAC3B,CAAC,CAAC,CAAC;AACJ,CAAC;AAEM,KAAK,UAAU,gBAAgB,CACrC,WAA6B,EAC7B,SAAiB,EACjB,OAAe,EACf,UAAU,GAAG,mBAAmB;IAEhC,IAAI,CAAC,SAAS,IAAI,CAAC,OAAO;QAAE,OAAO;IACnC,MAAM,eAAe,CAAC,WAAW,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE;QACnD,MAAM,MAAM,CAAC,GAAG,CAAC,GAAG,kBAAkB,GAAG,SAAS,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE,EAAE,UAAU,EAAE,CAAC,CAAC;IACpF,CAAC,CAAC,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,260 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.CursorStreamAdapter = exports.CursorStreamPassthrough = exports.CursorStreamAssembler = exports.CURSOR_SDK_MARKER = void 0;
|
|
4
|
+
exports.encodeCursorSdkChunk = encodeCursorSdkChunk;
|
|
5
|
+
const assistantTimeline_1 = require("./assistantTimeline");
|
|
6
|
+
const cursorMessageMeta_1 = require("./cursorMessageMeta");
|
|
7
|
+
const cursorStreamProtocol_1 = require("./cursorStreamProtocol");
|
|
8
|
+
/** 透传 Cursor SDK 原始事件(仅调试/兼容) */
|
|
9
|
+
exports.CURSOR_SDK_MARKER = '__cursor_sdk__';
|
|
10
|
+
function encodeCursorSdkChunk(envelope) {
|
|
11
|
+
return JSON.stringify({ [exports.CURSOR_SDK_MARKER]: envelope });
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* 按 timeline 顺序组装紧凑 __cursor__ 流事件;落库为 markdown + cursor_meta(与流式 UI 同序)。
|
|
15
|
+
*/
|
|
16
|
+
class CursorStreamAssembler {
|
|
17
|
+
sink;
|
|
18
|
+
builder = new assistantTimeline_1.AssistantTimelineBuilder();
|
|
19
|
+
emittedAskQuestions = new Set();
|
|
20
|
+
startedTools = new Set();
|
|
21
|
+
thinkingStarted = false;
|
|
22
|
+
thinkingDurationMs;
|
|
23
|
+
fallbackMarkdown = '';
|
|
24
|
+
constructor(sink) {
|
|
25
|
+
this.sink = sink;
|
|
26
|
+
}
|
|
27
|
+
async begin() {
|
|
28
|
+
await this.sink.onBegin();
|
|
29
|
+
}
|
|
30
|
+
async end() {
|
|
31
|
+
await this.sink.onEnd();
|
|
32
|
+
}
|
|
33
|
+
setFinalResult(result) {
|
|
34
|
+
if (result?.trim()) {
|
|
35
|
+
this.fallbackMarkdown = result.trim();
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
getTextOutput() {
|
|
39
|
+
this.builder.finalize();
|
|
40
|
+
const markdown = (0, assistantTimeline_1.mergeMarkdownFromTimeline)(this.builder.blocks);
|
|
41
|
+
return markdown || this.fallbackMarkdown;
|
|
42
|
+
}
|
|
43
|
+
getOutput() {
|
|
44
|
+
this.builder.finalize();
|
|
45
|
+
const timeline = this.builder.blocks;
|
|
46
|
+
let markdown = (0, assistantTimeline_1.mergeMarkdownFromTimeline)(timeline);
|
|
47
|
+
if (!markdown && this.fallbackMarkdown) {
|
|
48
|
+
markdown = this.fallbackMarkdown;
|
|
49
|
+
}
|
|
50
|
+
const thinking = (0, assistantTimeline_1.mergeThinkingFromTimeline)(timeline);
|
|
51
|
+
const hasTimelineThinking = timeline.some((b) => b.type === 'thinking');
|
|
52
|
+
return (0, cursorMessageMeta_1.embedCursorMessageMeta)(markdown, {
|
|
53
|
+
timeline,
|
|
54
|
+
toolCalls: (0, assistantTimeline_1.flattenToolCallsFromTimeline)(timeline),
|
|
55
|
+
thinkingDurationMs: this.thinkingDurationMs,
|
|
56
|
+
thinking: hasTimelineThinking ? undefined : thinking || undefined,
|
|
57
|
+
suggestions: this.builder.suggestions,
|
|
58
|
+
});
|
|
59
|
+
}
|
|
60
|
+
async consumeDelta(update) {
|
|
61
|
+
switch (update.type) {
|
|
62
|
+
case 'token-delta':
|
|
63
|
+
return;
|
|
64
|
+
case 'thinking-delta': {
|
|
65
|
+
const chunk = (0, cursorStreamProtocol_1.sanitizeThinkingChunk)(String(update.text ?? ''));
|
|
66
|
+
if (!chunk)
|
|
67
|
+
return;
|
|
68
|
+
if (!this.thinkingStarted) {
|
|
69
|
+
this.thinkingStarted = true;
|
|
70
|
+
this.builder.onThinkingStart();
|
|
71
|
+
await this.emit({ kind: 'thinking_start' });
|
|
72
|
+
}
|
|
73
|
+
this.builder.onThinkingChunk(chunk);
|
|
74
|
+
await this.emit({ kind: 'thinking_chunk', text: chunk });
|
|
75
|
+
break;
|
|
76
|
+
}
|
|
77
|
+
case 'thinking-completed': {
|
|
78
|
+
this.thinkingDurationMs = update.thinkingDurationMs;
|
|
79
|
+
this.thinkingStarted = false;
|
|
80
|
+
this.builder.onThinkingEnd(update.thinkingDurationMs);
|
|
81
|
+
await this.emit({ kind: 'thinking_end', durationMs: update.thinkingDurationMs });
|
|
82
|
+
break;
|
|
83
|
+
}
|
|
84
|
+
case 'text-delta': {
|
|
85
|
+
const text = String(update.text ?? '');
|
|
86
|
+
if (!text || (0, cursorStreamProtocol_1.shouldSuppressAssistantText)(text))
|
|
87
|
+
return;
|
|
88
|
+
this.builder.onResponseText(text);
|
|
89
|
+
await this.emit({ kind: 'text', text });
|
|
90
|
+
break;
|
|
91
|
+
}
|
|
92
|
+
case 'tool-call-started':
|
|
93
|
+
case 'partial-tool-call':
|
|
94
|
+
await this.handleToolStarted(String(update.callId ?? ''), update.toolCall);
|
|
95
|
+
break;
|
|
96
|
+
case 'tool-call-completed':
|
|
97
|
+
await this.handleToolCompleted(String(update.callId ?? ''), update.toolCall);
|
|
98
|
+
break;
|
|
99
|
+
default:
|
|
100
|
+
break;
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
async consumeMessage(event) {
|
|
104
|
+
const data = event;
|
|
105
|
+
switch (data.type) {
|
|
106
|
+
case 'request': {
|
|
107
|
+
const requestId = typeof data.request_id === 'string' ? data.request_id : '';
|
|
108
|
+
if (requestId) {
|
|
109
|
+
await this.emit({ kind: 'awaiting_input', requestId });
|
|
110
|
+
}
|
|
111
|
+
break;
|
|
112
|
+
}
|
|
113
|
+
case 'task': {
|
|
114
|
+
const phase = typeof data.status === 'string' ? data.status : 'task';
|
|
115
|
+
const message = typeof data.text === 'string' ? data.text : undefined;
|
|
116
|
+
await this.emit({ kind: 'status', phase, message });
|
|
117
|
+
break;
|
|
118
|
+
}
|
|
119
|
+
case 'tool_call': {
|
|
120
|
+
const callId = String(data.call_id ?? '');
|
|
121
|
+
const status = data.status;
|
|
122
|
+
const { name, args } = (0, cursorStreamProtocol_1.extractToolIdentity)({
|
|
123
|
+
name: data.name,
|
|
124
|
+
args: data.args,
|
|
125
|
+
});
|
|
126
|
+
if (status === 'running') {
|
|
127
|
+
await this.handleToolStarted(callId, { name, args });
|
|
128
|
+
}
|
|
129
|
+
else if (status === 'completed' || status === 'error') {
|
|
130
|
+
await this.handleToolCompleted(callId, { name, args });
|
|
131
|
+
}
|
|
132
|
+
break;
|
|
133
|
+
}
|
|
134
|
+
default:
|
|
135
|
+
break;
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
async emit(payload) {
|
|
139
|
+
const json = (0, cursorStreamProtocol_1.encodeCursorStreamPayload)(payload);
|
|
140
|
+
await this.sink.onStructured(json);
|
|
141
|
+
}
|
|
142
|
+
async handleToolStarted(callId, toolCall) {
|
|
143
|
+
if (!callId)
|
|
144
|
+
return;
|
|
145
|
+
const { name, args } = (0, cursorStreamProtocol_1.extractToolIdentity)(toolCall);
|
|
146
|
+
if ((0, cursorStreamProtocol_1.isAskQuestionToolName)(name)) {
|
|
147
|
+
const parsed = (0, cursorStreamProtocol_1.parseAskQuestionArgs)(args);
|
|
148
|
+
if (parsed && !this.emittedAskQuestions.has(callId)) {
|
|
149
|
+
this.emittedAskQuestions.add(callId);
|
|
150
|
+
await this.emit({
|
|
151
|
+
kind: 'ask_question',
|
|
152
|
+
callId,
|
|
153
|
+
title: parsed.title,
|
|
154
|
+
questions: parsed.questions,
|
|
155
|
+
});
|
|
156
|
+
}
|
|
157
|
+
return;
|
|
158
|
+
}
|
|
159
|
+
if ((0, cursorStreamProtocol_1.isUpdateTodosToolName)(name)) {
|
|
160
|
+
const items = (0, cursorStreamProtocol_1.parseUpdateTodosArgs)(args);
|
|
161
|
+
if (items?.length) {
|
|
162
|
+
this.builder.onTodoUpdate(items);
|
|
163
|
+
await this.emit({ kind: 'todo_update', items });
|
|
164
|
+
}
|
|
165
|
+
return;
|
|
166
|
+
}
|
|
167
|
+
if (!(0, cursorStreamProtocol_1.shouldShowToolInUi)(name))
|
|
168
|
+
return;
|
|
169
|
+
if (this.startedTools.has(callId))
|
|
170
|
+
return;
|
|
171
|
+
this.startedTools.add(callId);
|
|
172
|
+
const label = (0, cursorStreamProtocol_1.resolveToolLabel)(name);
|
|
173
|
+
this.builder.onToolStart({
|
|
174
|
+
id: callId,
|
|
175
|
+
label,
|
|
176
|
+
rawName: name,
|
|
177
|
+
done: false,
|
|
178
|
+
});
|
|
179
|
+
await this.emit({
|
|
180
|
+
kind: 'tool_start',
|
|
181
|
+
callId,
|
|
182
|
+
name,
|
|
183
|
+
label,
|
|
184
|
+
});
|
|
185
|
+
}
|
|
186
|
+
async handleToolCompleted(callId, toolCall) {
|
|
187
|
+
if (!callId)
|
|
188
|
+
return;
|
|
189
|
+
const { name } = (0, cursorStreamProtocol_1.extractToolIdentity)(toolCall);
|
|
190
|
+
if ((0, cursorStreamProtocol_1.isAskQuestionToolName)(name) || (0, cursorStreamProtocol_1.isUpdateTodosToolName)(name))
|
|
191
|
+
return;
|
|
192
|
+
if (!(0, cursorStreamProtocol_1.shouldShowToolInUi)(name))
|
|
193
|
+
return;
|
|
194
|
+
if (!this.startedTools.has(callId))
|
|
195
|
+
return;
|
|
196
|
+
this.builder.onToolEnd(callId);
|
|
197
|
+
await this.emit({ kind: 'tool_end', callId, ok: true });
|
|
198
|
+
}
|
|
199
|
+
}
|
|
200
|
+
exports.CursorStreamAssembler = CursorStreamAssembler;
|
|
201
|
+
/** @deprecated 调试透传;生产请用 CursorStreamAssembler */
|
|
202
|
+
class CursorStreamPassthrough {
|
|
203
|
+
sink;
|
|
204
|
+
streamItems = [];
|
|
205
|
+
assistantText = '';
|
|
206
|
+
constructor(sink) {
|
|
207
|
+
this.sink = sink;
|
|
208
|
+
}
|
|
209
|
+
getOutput() {
|
|
210
|
+
if (this.streamItems.length > 0) {
|
|
211
|
+
return this.streamItems.join('\n');
|
|
212
|
+
}
|
|
213
|
+
return this.assistantText;
|
|
214
|
+
}
|
|
215
|
+
getTextOutput() {
|
|
216
|
+
return this.assistantText;
|
|
217
|
+
}
|
|
218
|
+
setFinalResult(result) {
|
|
219
|
+
if (this.streamItems.length === 0 && result?.trim()) {
|
|
220
|
+
this.assistantText = result;
|
|
221
|
+
}
|
|
222
|
+
else if (result?.trim()) {
|
|
223
|
+
this.assistantText = result;
|
|
224
|
+
}
|
|
225
|
+
}
|
|
226
|
+
recordStructured(jsonContent) {
|
|
227
|
+
this.streamItems.push(jsonContent);
|
|
228
|
+
}
|
|
229
|
+
async begin() {
|
|
230
|
+
await this.sink.onBegin();
|
|
231
|
+
}
|
|
232
|
+
async end() {
|
|
233
|
+
await this.sink.onEnd();
|
|
234
|
+
}
|
|
235
|
+
async consumeDelta(update) {
|
|
236
|
+
const jsonContent = encodeCursorSdkChunk({
|
|
237
|
+
channel: 'delta',
|
|
238
|
+
data: update,
|
|
239
|
+
});
|
|
240
|
+
this.recordStructured(jsonContent);
|
|
241
|
+
await this.sink.onStructured(jsonContent);
|
|
242
|
+
if (update.type === 'text-delta' && update.text) {
|
|
243
|
+
this.assistantText += update.text;
|
|
244
|
+
}
|
|
245
|
+
}
|
|
246
|
+
async consumeMessage(event) {
|
|
247
|
+
const jsonContent = encodeCursorSdkChunk({
|
|
248
|
+
channel: 'message',
|
|
249
|
+
data: event,
|
|
250
|
+
});
|
|
251
|
+
this.recordStructured(jsonContent);
|
|
252
|
+
await this.sink.onStructured(jsonContent);
|
|
253
|
+
}
|
|
254
|
+
}
|
|
255
|
+
exports.CursorStreamPassthrough = CursorStreamPassthrough;
|
|
256
|
+
/** @deprecated 使用 CursorStreamAssembler */
|
|
257
|
+
class CursorStreamAdapter extends CursorStreamAssembler {
|
|
258
|
+
}
|
|
259
|
+
exports.CursorStreamAdapter = CursorStreamAdapter;
|
|
260
|
+
//# sourceMappingURL=streamAdapter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"streamAdapter.js","sourceRoot":"","sources":["../../../../nodes/CursorAgent/lib/streamAdapter.ts"],"names":[],"mappings":"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"}
|
package/package.json
ADDED
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "n8n-nodes-cursor-agent",
|
|
3
|
+
"version": "2.1.0",
|
|
4
|
+
"description": "n8n community node — run Cursor Agent via the Cursor SDK (local runtime) with MCP servers and skills.",
|
|
5
|
+
"keywords": [
|
|
6
|
+
"n8n-community-node-package",
|
|
7
|
+
"n8n",
|
|
8
|
+
"cursor",
|
|
9
|
+
"agent",
|
|
10
|
+
"mcp",
|
|
11
|
+
"sdk"
|
|
12
|
+
],
|
|
13
|
+
"license": "MIT",
|
|
14
|
+
"author": {
|
|
15
|
+
"name": "liuhuayao",
|
|
16
|
+
"email": "liuhuayao@126.com"
|
|
17
|
+
},
|
|
18
|
+
"homepage": "https://github.com/liuhauyao/n8n-nodes-cursor-agent#readme",
|
|
19
|
+
"bugs": {
|
|
20
|
+
"url": "https://github.com/liuhauyao/n8n-nodes-cursor-agent/issues"
|
|
21
|
+
},
|
|
22
|
+
"repository": {
|
|
23
|
+
"type": "git",
|
|
24
|
+
"url": "git+https://github.com/liuhauyao/n8n-nodes-cursor-agent.git"
|
|
25
|
+
},
|
|
26
|
+
"main": "dist/nodes/CursorAgent/CursorAgent.node.js",
|
|
27
|
+
"scripts": {
|
|
28
|
+
"build": "tsc && npm run copy-assets",
|
|
29
|
+
"prepack": "npm run build",
|
|
30
|
+
"copy-assets": "copyfiles \"nodes/**/*.svg\" \"credentials/*.svg\" dist/",
|
|
31
|
+
"verify": "npm run build && eslint dist && node scripts/lint-package-json.mjs",
|
|
32
|
+
"lint": "eslint dist && node scripts/lint-package-json.mjs",
|
|
33
|
+
"dev": "tsc --watch",
|
|
34
|
+
"poc": "node scripts/poc-local.mjs"
|
|
35
|
+
},
|
|
36
|
+
"files": [
|
|
37
|
+
"dist",
|
|
38
|
+
"README.md",
|
|
39
|
+
"LICENSE"
|
|
40
|
+
],
|
|
41
|
+
"engines": {
|
|
42
|
+
"node": ">=22.16"
|
|
43
|
+
},
|
|
44
|
+
"n8n": {
|
|
45
|
+
"n8nNodesApiVersion": 1,
|
|
46
|
+
"credentials": [
|
|
47
|
+
"dist/credentials/CursorApi.credentials.js"
|
|
48
|
+
],
|
|
49
|
+
"nodes": [
|
|
50
|
+
"dist/nodes/CursorAgent/CursorAgent.node.js"
|
|
51
|
+
]
|
|
52
|
+
},
|
|
53
|
+
"dependencies": {
|
|
54
|
+
"@cursor/sdk": "1.0.13",
|
|
55
|
+
"redis": "4.7.0"
|
|
56
|
+
},
|
|
57
|
+
"devDependencies": {
|
|
58
|
+
"@n8n/eslint-plugin-community-nodes": "^0.15.0",
|
|
59
|
+
"@types/node": "^22.0.0",
|
|
60
|
+
"copyfiles": "^2.4.1",
|
|
61
|
+
"eslint": "^9.29.0",
|
|
62
|
+
"n8n-workflow": ">=1.82.0",
|
|
63
|
+
"typescript": "~5.7.0"
|
|
64
|
+
},
|
|
65
|
+
"peerDependencies": {
|
|
66
|
+
"n8n-workflow": ">=1.82.0"
|
|
67
|
+
}
|
|
68
|
+
}
|