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,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":";;AAmNA,0CASC;AAtMD,SAAS,uBAAuB,CAC/B,OAA6D;IAE7D,IAAI,CAAC,OAAO,EAAE,MAAM;QAAE,OAAO,SAAS,CAAC;IACvC,MAAM,MAAM,GAA2B,EAAE,CAAC;IAC1C,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;QAC7B,MAAM,GAAG,GAAG,KAAK,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC;QAC/B,IAAI,CAAC,GAAG;YAAE,SAAS;QACnB,MAAM,CAAC,GAAG,CAAC,GAAG,MAAM,CAAC,KAAK,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC;IACzC,CAAC;IACD,OAAO,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC;AAC5D,CAAC;AAED,SAAS,eAAe,CAAC,GAAuB,EAAE,UAAkB;IACnE,MAAM,OAAO,GAAG,GAAG,EAAE,IAAI,EAAE,CAAC;IAC5B,IAAI,CAAC,OAAO;QAAE,OAAO,SAAS,CAAC;IAC/B,IAAI,MAAe,CAAC;IACpB,IAAI,CAAC;QACJ,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;IAC9B,CAAC;IAAC,MAAM,CAAC;QACR,MAAM,IAAI,KAAK,CAAC,GAAG,UAAU,4BAA4B,CAAC,CAAC;IAC5D,CAAC;IACD,IAAI,CAAC,MAAM,IAAI,OAAO,MAAM,KAAK,QAAQ,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;QACpE,MAAM,IAAI,KAAK,CAAC,GAAG,UAAU,wBAAwB,CAAC,CAAC;IACxD,CAAC;IACD,MAAM,MAAM,GAA2B,EAAE,CAAC;IAC1C,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,MAAiC,CAAC,EAAE,CAAC;QAC9E,IAAI,KAAK,KAAK,SAAS,IAAI,KAAK,KAAK,IAAI;YAAE,SAAS;QACpD,MAAM,CAAC,GAAG,CAAC,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC;IAC7B,CAAC;IACD,OAAO,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC;AAC5D,CAAC;AAED,SAAS,aAAa,CAAC,IAAmC;IACzD,IAAI,IAAI,KAAK,SAAS,IAAI,IAAI,KAAK,IAAI;QAAE,OAAO,SAAS,CAAC;IAC1D,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC;QACzB,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;QACzE,OAAO,UAAU,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,SAAS,CAAC;IACvD,CAAC;IACD,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;IAC5B,IAAI,CAAC,OAAO;QAAE,OAAO,SAAS,CAAC;IAC/B,OAAO,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;AACtE,CAAC;AAED,SAAS,iBAAiB,CAAC,KAAyB,EAAE,KAAa;IAClE,MAAM,IAAI,GAAG,KAAK,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC;IAChC,IAAI,CAAC,IAAI,EAAE,CAAC;QACX,MAAM,IAAI,KAAK,CAAC,uBAAuB,KAAK,GAAG,CAAC,oBAAoB,CAAC,CAAC;IACvE,CAAC;IAED,MAAM,SAAS,GAAG,CAAC,KAAK,CAAC,SAAS,EAAE,IAAI,EAAE,CAAC,WAAW,EAAE,IAAI,MAAM,CAAiB,CAAC;IACpF,IAAI,SAAS,KAAK,MAAM,IAAI,SAAS,KAAK,KAAK,IAAI,SAAS,KAAK,OAAO,EAAE,CAAC;QAC1E,MAAM,IAAI,KAAK,CAAC,eAAe,IAAI,gCAAgC,KAAK,CAAC,SAAS,GAAG,CAAC,CAAC;IACxF,CAAC;IAED,IAAI,SAAS,KAAK,OAAO,EAAE,CAAC;QAC3B,MAAM,OAAO,GAAG,KAAK,CAAC,OAAO,EAAE,IAAI,EAAE,CAAC;QACtC,IAAI,CAAC,OAAO,EAAE,CAAC;YACd,MAAM,IAAI,KAAK,CAAC,eAAe,IAAI,8BAA8B,CAAC,CAAC;QACpE,CAAC;QACD,MAAM,MAAM,GAAoB;YAC/B,IAAI,EAAE,OAAO;YACb,OAAO;SACP,CAAC;QACF,MAAM,IAAI,GAAG,aAAa,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QACvC,IAAI,IAAI;YAAE,MAAM,CAAC,IAAI,GAAG,IAAI,CAAC;QAC7B,MAAM,GAAG,GACR,uBAAuB,CAAC,KAAK,CAAC,OAAO,EAAE,MAAM,CAAC;eAC3C,eAAe,CAAC,KAAK,CAAC,OAAO,EAAE,eAAe,IAAI,YAAY,CAAC,CAAC;QACpE,IAAI,GAAG;YAAE,MAAM,CAAC,GAAG,GAAG,GAAG,CAAC;QAC1B,MAAM,GAAG,GAAG,KAAK,CAAC,GAAG,EAAE,IAAI,EAAE,CAAC;QAC9B,IAAI,GAAG;YAAE,MAAM,CAAC,GAAG,GAAG,GAAG,CAAC;QAC1B,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;IACzB,CAAC;IAED,MAAM,GAAG,GAAG,KAAK,CAAC,GAAG,EAAE,IAAI,EAAE,CAAC;IAC9B,IAAI,CAAC,GAAG,EAAE,CAAC;QACV,MAAM,IAAI,KAAK,CAAC,eAAe,IAAI,MAAM,SAAS,kBAAkB,CAAC,CAAC;IACvE,CAAC;IACD,MAAM,OAAO,GACZ,uBAAuB,CAAC,KAAK,CAAC,OAAO,EAAE,MAAM,CAAC;WAC3C,eAAe,CAAC,KAAK,CAAC,WAAW,EAAE,eAAe,IAAI,gBAAgB,CAAC,CAAC;IAC5E,MAAM,MAAM,GAAoB;QAC/B,IAAI,EAAE,SAAS;QACf,GAAG;KACH,CAAC;IACF,IAAI,OAAO;QAAE,MAAM,CAAC,OAAO,GAAG,OAAO,CAAC;IACtC,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;AACzB,CAAC;AAED,SAAS,gBAAgB,CAAC,SAA0C;IACnE,MAAM,OAAO,GAAG,SAAS,EAAE,MAAM,CAAC;IAClC,IAAI,CAAC,OAAO,EAAE,MAAM;QAAE,OAAO,EAAE,CAAC;IAEhC,MAAM,MAAM,GAAoC,EAAE,CAAC;IACnD,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,OAAO,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE,CAAC;QACrD,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,iBAAiB,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,KAAK,CAAC,CAAC;QAClE,IAAI,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC;YAClB,MAAM,IAAI,KAAK,CAAC,8BAA8B,IAAI,GAAG,CAAC,CAAC;QACxD,CAAC;QACD,MAAM,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC;IACvB,CAAC;IACD,OAAO,MAAM,CAAC;AACf,CAAC;AAED,SAAS,qBAAqB,CAAC,IAAY,EAAE,GAAY;IACxD,IAAI,CAAC,GAAG,IAAI,OAAO,GAAG,KAAK,QAAQ,IAAI,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC;QAC3D,MAAM,IAAI,KAAK,CAAC,eAAe,IAAI,yBAAyB,CAAC,CAAC;IAC/D,CAAC;IACD,MAAM,MAAM,GAAG,GAA8B,CAAC;IAC9C,MAAM,YAAY,GAAG,OAAO,MAAM,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;IAE7F,IAAI,YAAY,KAAK,OAAO,IAAI,CAAC,CAAC,YAAY,IAAI,OAAO,MAAM,CAAC,OAAO,KAAK,QAAQ,CAAC,EAAE,CAAC;QACvF,MAAM,OAAO,GAAG,OAAO,MAAM,CAAC,OAAO,KAAK,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAChF,IAAI,CAAC,OAAO,EAAE,CAAC;YACd,MAAM,IAAI,KAAK,CAAC,eAAe,IAAI,8BAA8B,CAAC,CAAC;QACpE,CAAC;QACD,MAAM,MAAM,GAAoB,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC;QAC3D,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC;YAChC,MAAM,CAAC,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC;QACrD,CAAC;QACD,IAAI,MAAM,CAAC,GAAG,IAAI,OAAO,MAAM,CAAC,GAAG,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC;YAChF,MAAM,CAAC,GAAG,GAAG,MAAM,CAAC,WAAW,CAC9B,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,GAA8B,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CACjG,CAAC;QACH,CAAC;QACD,IAAI,OAAO,MAAM,CAAC,GAAG,KAAK,QAAQ,IAAI,MAAM,CAAC,GAAG,CAAC,IAAI,EAAE,EAAE,CAAC;YACzD,MAAM,CAAC,GAAG,GAAG,MAAM,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC;QAChC,CAAC;QACD,OAAO,MAAM,CAAC;IACf,CAAC;IAED,MAAM,SAAS,GACd,YAAY,KAAK,KAAK,IAAI,YAAY,KAAK,MAAM;QAChD,CAAC,CAAC,YAAY;QACd,CAAC,CAAC,YAAY,KAAK,EAAE,IAAI,OAAO,MAAM,CAAC,GAAG,KAAK,QAAQ;YACtD,CAAC,CAAC,MAAM;YACR,CAAC,CAAC,EAAE,CAAC;IACR,IAAI,SAAS,KAAK,MAAM,IAAI,SAAS,KAAK,KAAK,EAAE,CAAC;QACjD,MAAM,IAAI,KAAK,CAAC,eAAe,IAAI,+CAA+C,CAAC,CAAC;IACrF,CAAC;IAED,MAAM,GAAG,GAAG,OAAO,MAAM,CAAC,GAAG,KAAK,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;IACpE,IAAI,CAAC,GAAG,EAAE,CAAC;QACV,MAAM,IAAI,KAAK,CAAC,eAAe,IAAI,MAAM,SAAS,kBAAkB,CAAC,CAAC;IACvE,CAAC;IACD,MAAM,MAAM,GAAoB,EAAE,IAAI,EAAE,SAAS,EAAE,GAAG,EAAE,CAAC;IACzD,IAAI,MAAM,CAAC,OAAO,IAAI,OAAO,MAAM,CAAC,OAAO,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC;QAC5F,MAAM,CAAC,OAAO,GAAG,MAAM,CAAC,WAAW,CAClC,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,OAAkC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CACrG,CAAC;IACH,CAAC;IACD,IAAI,MAAM,CAAC,IAAI,IAAI,OAAO,MAAM,CAAC,IAAI,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC;QACnF,MAAM,IAAI,GAAG,MAAM,CAAC,IAA+B,CAAC;QACpD,MAAM,QAAQ,GAAG,OAAO,IAAI,CAAC,SAAS,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC;QAC1E,IAAI,QAAQ,EAAE,CAAC;YACd,MAAM,CAAC,IAAI,GAAG;gBACb,SAAS,EAAE,QAAQ;gBACnB,aAAa,EAAE,OAAO,IAAI,CAAC,aAAa,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,SAAS;gBACtF,MAAM,EAAE,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS;aAC1F,CAAC;QACH,CAAC;IACF,CAAC;IACD,OAAO,MAAM,CAAC;AACf,CAAC;AAED,SAAS,gBAAgB,CAAC,cAAsB;IAC/C,MAAM,OAAO,GAAG,cAAc,CAAC,IAAI,EAAE,CAAC;IACtC,IAAI,CAAC,OAAO;QAAE,OAAO,EAAE,CAAC;IAExB,IAAI,MAAe,CAAC;IACpB,IAAI,CAAC;QACJ,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;IAC9B,CAAC;IAAC,MAAM,CAAC;QACR,MAAM,IAAI,KAAK,CAAC,qCAAqC,CAAC,CAAC;IACxD,CAAC;IACD,IAAI,CAAC,MAAM,IAAI,OAAO,MAAM,KAAK,QAAQ,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;QACpE,MAAM,IAAI,KAAK,CAAC,yDAAyD,CAAC,CAAC;IAC5E,CAAC;IAED,MAAM,MAAM,GAAoC,EAAE,CAAC;IACnD,KAAK,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,MAAqB,CAAC,EAAE,CAAC;QACpE,MAAM,WAAW,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;QAChC,IAAI,CAAC,WAAW;YAAE,SAAS;QAC3B,MAAM,CAAC,WAAW,CAAC,GAAG,qBAAqB,CAAC,WAAW,EAAE,MAAM,CAAC,CAAC;IAClE,CAAC;IACD,OAAO,MAAM,CAAC;AACf,CAAC;AAED,SAAgB,eAAe,CAC9B,cAAkC,EAClC,SAA0C;IAE1C,MAAM,YAAY,GAAG,cAAc,EAAE,IAAI,EAAE,CAAC;IAC5C,IAAI,YAAY,EAAE,CAAC;QAClB,OAAO,gBAAgB,CAAC,YAAY,CAAC,CAAC;IACvC,CAAC;IACD,OAAO,gBAAgB,CAAC,SAAS,CAAC,CAAC;AACpC,CAAC"}
@@ -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
+ }