@jam-nodes/playground 0.1.1 → 0.1.2
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/commands/run.d.ts.map +1 -1
- package/dist/commands/run.js +59 -80
- package/dist/commands/run.js.map +1 -1
- package/package.json +1 -1
- package/src/commands/run.ts +63 -85
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"run.d.ts","sourceRoot":"","sources":["../../src/commands/run.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"run.d.ts","sourceRoot":"","sources":["../../src/commands/run.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AA6CpC;;GAEG;AACH,eAAO,MAAM,UAAU,SA4LnB,CAAC"}
|
package/dist/commands/run.js
CHANGED
|
@@ -1,7 +1,10 @@
|
|
|
1
1
|
import { Command } from 'commander';
|
|
2
2
|
import chalk from 'chalk';
|
|
3
3
|
import ora from 'ora';
|
|
4
|
+
import dotenv from 'dotenv';
|
|
4
5
|
import { createRegistry } from '@jam-nodes/core';
|
|
6
|
+
// Load environment variables from .env file
|
|
7
|
+
dotenv.config();
|
|
5
8
|
import { builtInNodes } from '@jam-nodes/nodes';
|
|
6
9
|
import { getCredentials, saveCredentials, getCredentialSource, } from '../credentials/index.js';
|
|
7
10
|
import { promptForNodeInput, promptForCredentials, promptSaveCredentials, selectNode, } from '../ui/index.js';
|
|
@@ -13,19 +16,19 @@ for (const node of builtInNodes) {
|
|
|
13
16
|
registry.register(node);
|
|
14
17
|
}
|
|
15
18
|
/**
|
|
16
|
-
*
|
|
19
|
+
* Credential requirements for each node type
|
|
17
20
|
*/
|
|
18
|
-
const
|
|
19
|
-
search_contacts: ['apollo'],
|
|
20
|
-
reddit_monitor: [
|
|
21
|
-
twitter_monitor: ['twitter'],
|
|
22
|
-
linkedin_monitor: ['forumScout'],
|
|
23
|
-
sora_video: ['openai'],
|
|
24
|
-
seo_keyword_research: ['dataForSeo'],
|
|
25
|
-
seo_audit: ['dataForSeo'],
|
|
26
|
-
social_keyword_generator: ['anthropic'],
|
|
27
|
-
draft_emails: ['anthropic'],
|
|
28
|
-
social_ai_analyze: ['anthropic'],
|
|
21
|
+
const NODE_CREDENTIAL_REQUIREMENTS = {
|
|
22
|
+
search_contacts: [{ service: 'apollo', fields: [{ name: 'apiKey', envVar: 'APOLLO_API_KEY' }] }],
|
|
23
|
+
reddit_monitor: [], // No credentials required - uses public API
|
|
24
|
+
twitter_monitor: [{ service: 'twitter', fields: [{ name: 'twitterApiIoKey', envVar: 'TWITTERAPI_IO_KEY' }] }],
|
|
25
|
+
linkedin_monitor: [{ service: 'forumScout', fields: [{ name: 'apiKey', envVar: 'FORUMSCOUT_API_KEY' }] }],
|
|
26
|
+
sora_video: [{ service: 'openai', fields: [{ name: 'apiKey', envVar: 'OPENAI_API_KEY' }] }],
|
|
27
|
+
seo_keyword_research: [{ service: 'dataForSeo', fields: [{ name: 'apiToken', envVar: 'DATAFORSEO_API_TOKEN' }] }],
|
|
28
|
+
seo_audit: [{ service: 'dataForSeo', fields: [{ name: 'apiToken', envVar: 'DATAFORSEO_API_TOKEN' }] }],
|
|
29
|
+
social_keyword_generator: [{ service: 'anthropic', fields: [{ name: 'apiKey', envVar: 'ANTHROPIC_API_KEY' }] }],
|
|
30
|
+
draft_emails: [{ service: 'anthropic', fields: [{ name: 'apiKey', envVar: 'ANTHROPIC_API_KEY' }] }],
|
|
31
|
+
social_ai_analyze: [{ service: 'anthropic', fields: [{ name: 'apiKey', envVar: 'ANTHROPIC_API_KEY' }] }],
|
|
29
32
|
};
|
|
30
33
|
/**
|
|
31
34
|
* Run command - executes a node with input
|
|
@@ -61,33 +64,57 @@ export const runCommand = new Command('run')
|
|
|
61
64
|
console.log();
|
|
62
65
|
console.log(chalk.yellow('⚡ Mock mode enabled - returning sample data without API calls'));
|
|
63
66
|
}
|
|
64
|
-
// Check for required
|
|
65
|
-
const
|
|
66
|
-
const
|
|
67
|
-
if (
|
|
67
|
+
// Check for required credentials
|
|
68
|
+
const credentialRequirements = NODE_CREDENTIAL_REQUIREMENTS[nodeType] || [];
|
|
69
|
+
const nodeCredentials = {};
|
|
70
|
+
if (credentialRequirements.length > 0 && !options.mock) {
|
|
68
71
|
console.log();
|
|
69
|
-
|
|
70
|
-
|
|
72
|
+
const serviceNames = credentialRequirements.map(r => r.service).join(', ');
|
|
73
|
+
console.log(chalk.dim(`This node requires: ${serviceNames}`));
|
|
74
|
+
for (const requirement of credentialRequirements) {
|
|
75
|
+
const { service, fields } = requirement;
|
|
71
76
|
const source = await getCredentialSource(service);
|
|
72
77
|
if (source) {
|
|
73
78
|
console.log(chalk.green(`✓ ${service} credentials found (${source})`));
|
|
74
79
|
const creds = await getCredentials(service);
|
|
75
80
|
if (creds) {
|
|
76
|
-
credentials
|
|
81
|
+
// Map stored credentials to NodeCredentials format
|
|
82
|
+
nodeCredentials[service] = creds;
|
|
77
83
|
}
|
|
78
84
|
}
|
|
79
85
|
else {
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
const
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
86
|
+
// Check environment variables first
|
|
87
|
+
let foundInEnv = true;
|
|
88
|
+
const envCreds = {};
|
|
89
|
+
for (const field of fields) {
|
|
90
|
+
const envValue = process.env[field.envVar];
|
|
91
|
+
if (envValue) {
|
|
92
|
+
envCreds[field.name] = envValue;
|
|
93
|
+
console.log(chalk.green(`✓ ${service}.${field.name} found in env (${field.envVar})`));
|
|
94
|
+
}
|
|
95
|
+
else {
|
|
96
|
+
foundInEnv = false;
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
if (foundInEnv) {
|
|
100
|
+
nodeCredentials[service] = envCreds;
|
|
101
|
+
}
|
|
102
|
+
else {
|
|
103
|
+
console.log(chalk.yellow(`⚠ ${service} credentials not found`));
|
|
104
|
+
// Prompt for credentials
|
|
105
|
+
const promptFields = fields.map(f => ({
|
|
106
|
+
name: f.name,
|
|
107
|
+
message: `${service} ${f.name} (or set ${f.envVar}):`,
|
|
108
|
+
type: 'password',
|
|
109
|
+
}));
|
|
110
|
+
const creds = await promptForCredentials(service, promptFields);
|
|
111
|
+
nodeCredentials[service] = creds;
|
|
112
|
+
// Ask if they want to save
|
|
113
|
+
const shouldSave = await promptSaveCredentials();
|
|
114
|
+
if (shouldSave) {
|
|
115
|
+
saveCredentials(service, creds);
|
|
116
|
+
console.log(chalk.green(`✓ ${service} credentials saved`));
|
|
117
|
+
}
|
|
91
118
|
}
|
|
92
119
|
}
|
|
93
120
|
}
|
|
@@ -127,7 +154,7 @@ export const runCommand = new Command('run')
|
|
|
127
154
|
};
|
|
128
155
|
}
|
|
129
156
|
else {
|
|
130
|
-
// Create execution context
|
|
157
|
+
// Create execution context with credentials (not services)
|
|
131
158
|
const context = {
|
|
132
159
|
userId: 'playground',
|
|
133
160
|
workflowExecutionId: `playground_${Date.now()}`,
|
|
@@ -146,7 +173,7 @@ export const runCommand = new Command('run')
|
|
|
146
173
|
}
|
|
147
174
|
return current;
|
|
148
175
|
},
|
|
149
|
-
|
|
176
|
+
credentials: nodeCredentials,
|
|
150
177
|
};
|
|
151
178
|
// Validate input
|
|
152
179
|
const validatedInput = definition.inputSchema.parse(input);
|
|
@@ -194,52 +221,4 @@ function formatJson(data) {
|
|
|
194
221
|
.replace(/: (true|false)/g, ': ' + chalk.magenta('$1'))
|
|
195
222
|
.replace(/: (null)/g, ': ' + chalk.dim('$1'));
|
|
196
223
|
}
|
|
197
|
-
/**
|
|
198
|
-
* Create mock service implementations that use credentials
|
|
199
|
-
*/
|
|
200
|
-
function createMockServices(credentials) {
|
|
201
|
-
// These are placeholder services that would need real implementations
|
|
202
|
-
// For playground purposes, they demonstrate the service injection pattern
|
|
203
|
-
return {
|
|
204
|
-
apollo: credentials['apollo']
|
|
205
|
-
? {
|
|
206
|
-
searchContacts: async () => {
|
|
207
|
-
console.log(chalk.dim('Apollo API call would happen here...'));
|
|
208
|
-
return [];
|
|
209
|
-
},
|
|
210
|
-
enrichContact: async () => {
|
|
211
|
-
return null;
|
|
212
|
-
},
|
|
213
|
-
}
|
|
214
|
-
: undefined,
|
|
215
|
-
forumScout: credentials['forumScout']
|
|
216
|
-
? {
|
|
217
|
-
searchReddit: async () => [],
|
|
218
|
-
searchLinkedIn: async () => [],
|
|
219
|
-
}
|
|
220
|
-
: undefined,
|
|
221
|
-
twitter: credentials['twitter']
|
|
222
|
-
? {
|
|
223
|
-
search: async () => [],
|
|
224
|
-
}
|
|
225
|
-
: undefined,
|
|
226
|
-
openai: credentials['openai']
|
|
227
|
-
? {
|
|
228
|
-
generateVideo: async () => ({ url: 'mock_url' }),
|
|
229
|
-
}
|
|
230
|
-
: undefined,
|
|
231
|
-
anthropic: credentials['anthropic']
|
|
232
|
-
? {
|
|
233
|
-
complete: async () => 'mock response',
|
|
234
|
-
generateKeywords: async () => ['keyword1', 'keyword2'],
|
|
235
|
-
}
|
|
236
|
-
: undefined,
|
|
237
|
-
dataForSeo: credentials['dataForSeo']
|
|
238
|
-
? {
|
|
239
|
-
getKeywords: async () => [],
|
|
240
|
-
runAudit: async () => ({ issues: [] }),
|
|
241
|
-
}
|
|
242
|
-
: undefined,
|
|
243
|
-
};
|
|
244
|
-
}
|
|
245
224
|
//# sourceMappingURL=run.js.map
|
package/dist/commands/run.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"run.js","sourceRoot":"","sources":["../../src/commands/run.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,GAAG,MAAM,KAAK,CAAC;AACtB,OAAO,EAAE,cAAc,
|
|
1
|
+
{"version":3,"file":"run.js","sourceRoot":"","sources":["../../src/commands/run.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,GAAG,MAAM,KAAK,CAAC;AACtB,OAAO,MAAM,MAAM,QAAQ,CAAC;AAC5B,OAAO,EAAE,cAAc,EAAmD,MAAM,iBAAiB,CAAC;AAElG,4CAA4C;AAC5C,MAAM,CAAC,MAAM,EAAE,CAAC;AAChB,OAAO,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAChD,OAAO,EACL,cAAc,EACd,eAAe,EACf,mBAAmB,GACpB,MAAM,yBAAyB,CAAC;AACjC,OAAO,EACL,kBAAkB,EAClB,oBAAoB,EACpB,qBAAqB,EACrB,UAAU,GACX,MAAM,gBAAgB,CAAC;AACxB,OAAO,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AAEvD,mCAAmC;AACnC,MAAM,QAAQ,GAAG,cAAc,EAAE,CAAC;AAClC,KAAK,MAAM,IAAI,IAAI,YAAY,EAAE,CAAC;IAChC,8DAA8D;IAC9D,QAAQ,CAAC,QAAQ,CAAC,IAAW,CAAC,CAAC;AACjC,CAAC;AAED;;GAEG;AACH,MAAM,4BAA4B,GAAsF;IACtH,eAAe,EAAE,CAAC,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,gBAAgB,EAAE,CAAC,EAAE,CAAC;IAChG,cAAc,EAAE,EAAE,EAAE,4CAA4C;IAChE,eAAe,EAAE,CAAC,EAAE,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,CAAC,EAAE,IAAI,EAAE,iBAAiB,EAAE,MAAM,EAAE,mBAAmB,EAAE,CAAC,EAAE,CAAC;IAC7G,gBAAgB,EAAE,CAAC,EAAE,OAAO,EAAE,YAAY,EAAE,MAAM,EAAE,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,oBAAoB,EAAE,CAAC,EAAE,CAAC;IACzG,UAAU,EAAE,CAAC,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,gBAAgB,EAAE,CAAC,EAAE,CAAC;IAC3F,oBAAoB,EAAE,CAAC,EAAE,OAAO,EAAE,YAAY,EAAE,MAAM,EAAE,CAAC,EAAE,IAAI,EAAE,UAAU,EAAE,MAAM,EAAE,sBAAsB,EAAE,CAAC,EAAE,CAAC;IACjH,SAAS,EAAE,CAAC,EAAE,OAAO,EAAE,YAAY,EAAE,MAAM,EAAE,CAAC,EAAE,IAAI,EAAE,UAAU,EAAE,MAAM,EAAE,sBAAsB,EAAE,CAAC,EAAE,CAAC;IACtG,wBAAwB,EAAE,CAAC,EAAE,OAAO,EAAE,WAAW,EAAE,MAAM,EAAE,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,mBAAmB,EAAE,CAAC,EAAE,CAAC;IAC/G,YAAY,EAAE,CAAC,EAAE,OAAO,EAAE,WAAW,EAAE,MAAM,EAAE,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,mBAAmB,EAAE,CAAC,EAAE,CAAC;IACnG,iBAAiB,EAAE,CAAC,EAAE,OAAO,EAAE,WAAW,EAAE,MAAM,EAAE,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,mBAAmB,EAAE,CAAC,EAAE,CAAC;CACzG,CAAC;AAEF;;GAEG;AACH,MAAM,CAAC,MAAM,UAAU,GAAG,IAAI,OAAO,CAAC,KAAK,CAAC;KACzC,WAAW,CAAC,8BAA8B,CAAC;KAC3C,QAAQ,CAAC,aAAa,EAAE,qDAAqD,CAAC;KAC9E,MAAM,CAAC,oBAAoB,EAAE,sBAAsB,CAAC;KACpD,MAAM,CAAC,YAAY,EAAE,0DAA0D,CAAC;KAChF,MAAM,CAAC,cAAc,EAAE,0BAA0B,CAAC;KAClD,MAAM,CAAC,KAAK,EAAE,QAA4B,EAAE,OAAO,EAAE,EAAE;IACtD,IAAI,CAAC;QACH,4CAA4C;QAC5C,IAAI,CAAC,QAAQ,EAAE,CAAC;YACd,MAAM,KAAK,GAAG,QAAQ,CAAC,cAAc,EAAE,CAAC;YACxC,QAAQ,GAAG,MAAM,UAAU,CAAC,KAAK,CAAC,CAAC;QACrC,CAAC;QAED,sBAAsB;QACtB,MAAM,UAAU,GAAG,QAAQ,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC;QACpD,IAAI,CAAC,UAAU,EAAE,CAAC;YAChB,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,sBAAsB,QAAQ,EAAE,CAAC,CAAC,CAAC;YAC3D,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,uCAAuC,CAAC,CAAC,CAAC;YAChE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;QAED,oBAAoB;QACpB,OAAO,CAAC,GAAG,EAAE,CAAC;QACd,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,iEAAiE,CAAC,CAAC,CAAC;QAChG,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;QACpG,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,KAAK,CAAC,GAAG,CAAC,UAAU,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;QACvH,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,iEAAiE,CAAC,CAAC,CAAC;QAEhG,mBAAmB;QACnB,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC;YACjB,OAAO,CAAC,GAAG,EAAE,CAAC;YACd,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,+DAA+D,CAAC,CAAC,CAAC;QAC7F,CAAC;QAED,iCAAiC;QACjC,MAAM,sBAAsB,GAAG,4BAA4B,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC;QAC5E,MAAM,eAAe,GAAoB,EAAE,CAAC;QAE5C,IAAI,sBAAsB,CAAC,MAAM,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC;YACvD,OAAO,CAAC,GAAG,EAAE,CAAC;YACd,MAAM,YAAY,GAAG,sBAAsB,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAC3E,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,uBAAuB,YAAY,EAAE,CAAC,CAAC,CAAC;YAE9D,KAAK,MAAM,WAAW,IAAI,sBAAsB,EAAE,CAAC;gBACjD,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,GAAG,WAAW,CAAC;gBACxC,MAAM,MAAM,GAAG,MAAM,mBAAmB,CAAC,OAAO,CAAC,CAAC;gBAElD,IAAI,MAAM,EAAE,CAAC;oBACX,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,OAAO,uBAAuB,MAAM,GAAG,CAAC,CAAC,CAAC;oBACvE,MAAM,KAAK,GAAG,MAAM,cAAc,CAAC,OAAO,CAAC,CAAC;oBAC5C,IAAI,KAAK,EAAE,CAAC;wBACV,mDAAmD;wBAClD,eAA0D,CAAC,OAAO,CAAC,GAAG,KAAK,CAAC;oBAC/E,CAAC;gBACH,CAAC;qBAAM,CAAC;oBACN,oCAAoC;oBACpC,IAAI,UAAU,GAAG,IAAI,CAAC;oBACtB,MAAM,QAAQ,GAA2B,EAAE,CAAC;oBAE5C,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;wBAC3B,MAAM,QAAQ,GAAG,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;wBAC3C,IAAI,QAAQ,EAAE,CAAC;4BACb,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,QAAQ,CAAC;4BAChC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,OAAO,IAAI,KAAK,CAAC,IAAI,kBAAkB,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;wBACxF,CAAC;6BAAM,CAAC;4BACN,UAAU,GAAG,KAAK,CAAC;wBACrB,CAAC;oBACH,CAAC;oBAED,IAAI,UAAU,EAAE,CAAC;wBACd,eAA0D,CAAC,OAAO,CAAC,GAAG,QAAQ,CAAC;oBAClF,CAAC;yBAAM,CAAC;wBACN,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,OAAO,wBAAwB,CAAC,CAAC,CAAC;wBAEhE,yBAAyB;wBACzB,MAAM,YAAY,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;4BACpC,IAAI,EAAE,CAAC,CAAC,IAAI;4BACZ,OAAO,EAAE,GAAG,OAAO,IAAI,CAAC,CAAC,IAAI,YAAY,CAAC,CAAC,MAAM,IAAI;4BACrD,IAAI,EAAE,UAAmB;yBAC1B,CAAC,CAAC,CAAC;wBACJ,MAAM,KAAK,GAAG,MAAM,oBAAoB,CAAC,OAAO,EAAE,YAAY,CAAC,CAAC;wBAE/D,eAA0D,CAAC,OAAO,CAAC,GAAG,KAAK,CAAC;wBAE7E,2BAA2B;wBAC3B,MAAM,UAAU,GAAG,MAAM,qBAAqB,EAAE,CAAC;wBACjD,IAAI,UAAU,EAAE,CAAC;4BACf,eAAe,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;4BAChC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,OAAO,oBAAoB,CAAC,CAAC,CAAC;wBAC7D,CAAC;oBACH,CAAC;gBACH,CAAC;YACH,CAAC;QACH,CAAC;QAED,YAAY;QACZ,IAAI,KAA8B,CAAC;QAEnC,IAAI,OAAO,CAAC,KAAK,EAAE,CAAC;YAClB,IAAI,CAAC;gBACH,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;YACpC,CAAC;YAAC,MAAM,CAAC;gBACP,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,oBAAoB,CAAC,CAAC,CAAC;gBAC/C,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAClB,CAAC;QACH,CAAC;aAAM,CAAC;YACN,oBAAoB;YACpB,KAAK,GAAG,MAAM,kBAAkB,CAAC,UAAU,CAAC,WAAW,CAAC,CAAC;QAC3D,CAAC;QAED,wBAAwB;QACxB,OAAO,CAAC,GAAG,EAAE,CAAC;QACd,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC;QACjC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;QAEvD,eAAe;QACf,MAAM,OAAO,GAAG,GAAG,CAAC;YAClB,IAAI,EAAE,aAAa,UAAU,CAAC,IAAI,KAAK;YACvC,KAAK,EAAE,MAAM;SACd,CAAC,CAAC,KAAK,EAAE,CAAC;QAEX,IAAI,CAAC;YACH,IAAI,MAAM,CAAC;YAEX,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC;gBACjB,qCAAqC;gBACrC,MAAM,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,iBAAiB;gBAC3E,MAAM,GAAG;oBACP,OAAO,EAAE,IAAI;oBACb,MAAM,EAAE,kBAAkB,CAAC,QAAQ,EAAE,UAAU,CAAC,YAAY,CAAC;iBAC9D,CAAC;YACJ,CAAC;iBAAM,CAAC;gBACN,2DAA2D;gBAC3D,MAAM,OAAO,GAAyB;oBACpC,MAAM,EAAE,YAAY;oBACpB,mBAAmB,EAAE,cAAc,IAAI,CAAC,GAAG,EAAE,EAAE;oBAC/C,SAAS,EAAE,EAAE;oBACb,iBAAiB,EAAE,CAAC,IAAY,EAAE,EAAE;wBAClC,4CAA4C;wBAC5C,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;wBAC9B,IAAI,OAAO,GAAY,OAAO,CAAC,SAAS,CAAC;wBACzC,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;4BACzB,IAAI,OAAO,IAAI,OAAO,OAAO,KAAK,QAAQ,EAAE,CAAC;gCAC3C,OAAO,GAAI,OAAmC,CAAC,IAAI,CAAC,CAAC;4BACvD,CAAC;iCAAM,CAAC;gCACN,OAAO,SAAS,CAAC;4BACnB,CAAC;wBACH,CAAC;wBACD,OAAO,OAAO,CAAC;oBACjB,CAAC;oBACD,WAAW,EAAE,eAAe;iBAC7B,CAAC;gBAEF,iBAAiB;gBACjB,MAAM,cAAc,GAAG,UAAU,CAAC,WAAW,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;gBAE3D,UAAU;gBACV,MAAM,GAAG,MAAM,UAAU,CAAC,QAAQ,CAAC,cAAc,EAAE,OAAO,CAAC,CAAC;YAC9D,CAAC;YAED,OAAO,CAAC,IAAI,EAAE,CAAC;YAEf,iBAAiB;YACjB,OAAO,CAAC,GAAG,EAAE,CAAC;YACd,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;gBACnB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC;gBAC5C,OAAO,CAAC,GAAG,EAAE,CAAC;gBACd,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC;gBAClC,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC;YACzC,CAAC;iBAAM,CAAC;gBACN,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC;gBACxC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC,KAAK,IAAI,eAAe,CAAC,CAAC,CAAC;YAC1D,CAAC;QACH,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,CAAC,IAAI,EAAE,CAAC;YACf,OAAO,CAAC,GAAG,EAAE,CAAC;YACd,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,oBAAoB,CAAC,CAAC,CAAC;YAClD,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC;YAEjF,IAAI,KAAK,YAAY,KAAK,IAAI,KAAK,CAAC,KAAK,EAAE,CAAC;gBAC1C,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC;YACtC,CAAC;QACH,CAAC;IACH,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;QACnF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC,CAAC,CAAC;AAEL;;GAEG;AACH,SAAS,UAAU,CAAC,IAAa;IAC/B,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;IAC3C,OAAO,IAAI;SACR,OAAO,CAAC,aAAa,EAAE,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;SAC3C,OAAO,CAAC,cAAc,EAAE,IAAI,GAAG,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;SACnD,OAAO,CAAC,UAAU,EAAE,IAAI,GAAG,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;SAC9C,OAAO,CAAC,iBAAiB,EAAE,IAAI,GAAG,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;SACtD,OAAO,CAAC,WAAW,EAAE,IAAI,GAAG,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC;AAClD,CAAC"}
|
package/package.json
CHANGED
package/src/commands/run.ts
CHANGED
|
@@ -1,7 +1,11 @@
|
|
|
1
1
|
import { Command } from 'commander';
|
|
2
2
|
import chalk from 'chalk';
|
|
3
3
|
import ora from 'ora';
|
|
4
|
-
import
|
|
4
|
+
import dotenv from 'dotenv';
|
|
5
|
+
import { createRegistry, type NodeExecutionContext, type NodeCredentials } from '@jam-nodes/core';
|
|
6
|
+
|
|
7
|
+
// Load environment variables from .env file
|
|
8
|
+
dotenv.config();
|
|
5
9
|
import { builtInNodes } from '@jam-nodes/nodes';
|
|
6
10
|
import {
|
|
7
11
|
getCredentials,
|
|
@@ -24,19 +28,19 @@ for (const node of builtInNodes) {
|
|
|
24
28
|
}
|
|
25
29
|
|
|
26
30
|
/**
|
|
27
|
-
*
|
|
31
|
+
* Credential requirements for each node type
|
|
28
32
|
*/
|
|
29
|
-
const
|
|
30
|
-
search_contacts: ['apollo'],
|
|
31
|
-
reddit_monitor: [
|
|
32
|
-
twitter_monitor: ['twitter'],
|
|
33
|
-
linkedin_monitor: ['forumScout'],
|
|
34
|
-
sora_video: ['openai'],
|
|
35
|
-
seo_keyword_research: ['dataForSeo'],
|
|
36
|
-
seo_audit: ['dataForSeo'],
|
|
37
|
-
social_keyword_generator: ['anthropic'],
|
|
38
|
-
draft_emails: ['anthropic'],
|
|
39
|
-
social_ai_analyze: ['anthropic'],
|
|
33
|
+
const NODE_CREDENTIAL_REQUIREMENTS: Record<string, { service: string; fields: { name: string; envVar: string }[] }[]> = {
|
|
34
|
+
search_contacts: [{ service: 'apollo', fields: [{ name: 'apiKey', envVar: 'APOLLO_API_KEY' }] }],
|
|
35
|
+
reddit_monitor: [], // No credentials required - uses public API
|
|
36
|
+
twitter_monitor: [{ service: 'twitter', fields: [{ name: 'twitterApiIoKey', envVar: 'TWITTERAPI_IO_KEY' }] }],
|
|
37
|
+
linkedin_monitor: [{ service: 'forumScout', fields: [{ name: 'apiKey', envVar: 'FORUMSCOUT_API_KEY' }] }],
|
|
38
|
+
sora_video: [{ service: 'openai', fields: [{ name: 'apiKey', envVar: 'OPENAI_API_KEY' }] }],
|
|
39
|
+
seo_keyword_research: [{ service: 'dataForSeo', fields: [{ name: 'apiToken', envVar: 'DATAFORSEO_API_TOKEN' }] }],
|
|
40
|
+
seo_audit: [{ service: 'dataForSeo', fields: [{ name: 'apiToken', envVar: 'DATAFORSEO_API_TOKEN' }] }],
|
|
41
|
+
social_keyword_generator: [{ service: 'anthropic', fields: [{ name: 'apiKey', envVar: 'ANTHROPIC_API_KEY' }] }],
|
|
42
|
+
draft_emails: [{ service: 'anthropic', fields: [{ name: 'apiKey', envVar: 'ANTHROPIC_API_KEY' }] }],
|
|
43
|
+
social_ai_analyze: [{ service: 'anthropic', fields: [{ name: 'apiKey', envVar: 'ANTHROPIC_API_KEY' }] }],
|
|
40
44
|
};
|
|
41
45
|
|
|
42
46
|
/**
|
|
@@ -77,38 +81,62 @@ export const runCommand = new Command('run')
|
|
|
77
81
|
console.log(chalk.yellow('⚡ Mock mode enabled - returning sample data without API calls'));
|
|
78
82
|
}
|
|
79
83
|
|
|
80
|
-
// Check for required
|
|
81
|
-
const
|
|
82
|
-
const
|
|
84
|
+
// Check for required credentials
|
|
85
|
+
const credentialRequirements = NODE_CREDENTIAL_REQUIREMENTS[nodeType] || [];
|
|
86
|
+
const nodeCredentials: NodeCredentials = {};
|
|
83
87
|
|
|
84
|
-
if (
|
|
88
|
+
if (credentialRequirements.length > 0 && !options.mock) {
|
|
85
89
|
console.log();
|
|
86
|
-
|
|
90
|
+
const serviceNames = credentialRequirements.map(r => r.service).join(', ');
|
|
91
|
+
console.log(chalk.dim(`This node requires: ${serviceNames}`));
|
|
87
92
|
|
|
88
|
-
for (const
|
|
93
|
+
for (const requirement of credentialRequirements) {
|
|
94
|
+
const { service, fields } = requirement;
|
|
89
95
|
const source = await getCredentialSource(service);
|
|
90
96
|
|
|
91
97
|
if (source) {
|
|
92
98
|
console.log(chalk.green(`✓ ${service} credentials found (${source})`));
|
|
93
99
|
const creds = await getCredentials(service);
|
|
94
100
|
if (creds) {
|
|
95
|
-
credentials
|
|
101
|
+
// Map stored credentials to NodeCredentials format
|
|
102
|
+
(nodeCredentials as Record<string, Record<string, string>>)[service] = creds;
|
|
96
103
|
}
|
|
97
104
|
} else {
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
105
|
+
// Check environment variables first
|
|
106
|
+
let foundInEnv = true;
|
|
107
|
+
const envCreds: Record<string, string> = {};
|
|
108
|
+
|
|
109
|
+
for (const field of fields) {
|
|
110
|
+
const envValue = process.env[field.envVar];
|
|
111
|
+
if (envValue) {
|
|
112
|
+
envCreds[field.name] = envValue;
|
|
113
|
+
console.log(chalk.green(`✓ ${service}.${field.name} found in env (${field.envVar})`));
|
|
114
|
+
} else {
|
|
115
|
+
foundInEnv = false;
|
|
116
|
+
}
|
|
117
|
+
}
|
|
106
118
|
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
119
|
+
if (foundInEnv) {
|
|
120
|
+
(nodeCredentials as Record<string, Record<string, string>>)[service] = envCreds;
|
|
121
|
+
} else {
|
|
122
|
+
console.log(chalk.yellow(`⚠ ${service} credentials not found`));
|
|
123
|
+
|
|
124
|
+
// Prompt for credentials
|
|
125
|
+
const promptFields = fields.map(f => ({
|
|
126
|
+
name: f.name,
|
|
127
|
+
message: `${service} ${f.name} (or set ${f.envVar}):`,
|
|
128
|
+
type: 'password' as const,
|
|
129
|
+
}));
|
|
130
|
+
const creds = await promptForCredentials(service, promptFields);
|
|
131
|
+
|
|
132
|
+
(nodeCredentials as Record<string, Record<string, string>>)[service] = creds;
|
|
133
|
+
|
|
134
|
+
// Ask if they want to save
|
|
135
|
+
const shouldSave = await promptSaveCredentials();
|
|
136
|
+
if (shouldSave) {
|
|
137
|
+
saveCredentials(service, creds);
|
|
138
|
+
console.log(chalk.green(`✓ ${service} credentials saved`));
|
|
139
|
+
}
|
|
112
140
|
}
|
|
113
141
|
}
|
|
114
142
|
}
|
|
@@ -151,7 +179,7 @@ export const runCommand = new Command('run')
|
|
|
151
179
|
output: generateMockOutput(nodeType, definition.outputSchema),
|
|
152
180
|
};
|
|
153
181
|
} else {
|
|
154
|
-
// Create execution context
|
|
182
|
+
// Create execution context with credentials (not services)
|
|
155
183
|
const context: NodeExecutionContext = {
|
|
156
184
|
userId: 'playground',
|
|
157
185
|
workflowExecutionId: `playground_${Date.now()}`,
|
|
@@ -169,7 +197,7 @@ export const runCommand = new Command('run')
|
|
|
169
197
|
}
|
|
170
198
|
return current;
|
|
171
199
|
},
|
|
172
|
-
|
|
200
|
+
credentials: nodeCredentials,
|
|
173
201
|
};
|
|
174
202
|
|
|
175
203
|
// Validate input
|
|
@@ -221,53 +249,3 @@ function formatJson(data: unknown): string {
|
|
|
221
249
|
.replace(/: (null)/g, ': ' + chalk.dim('$1'));
|
|
222
250
|
}
|
|
223
251
|
|
|
224
|
-
/**
|
|
225
|
-
* Create mock service implementations that use credentials
|
|
226
|
-
*/
|
|
227
|
-
function createMockServices(
|
|
228
|
-
credentials: Record<string, Record<string, string>>
|
|
229
|
-
): Record<string, unknown> {
|
|
230
|
-
// These are placeholder services that would need real implementations
|
|
231
|
-
// For playground purposes, they demonstrate the service injection pattern
|
|
232
|
-
return {
|
|
233
|
-
apollo: credentials['apollo']
|
|
234
|
-
? {
|
|
235
|
-
searchContacts: async () => {
|
|
236
|
-
console.log(chalk.dim('Apollo API call would happen here...'));
|
|
237
|
-
return [];
|
|
238
|
-
},
|
|
239
|
-
enrichContact: async () => {
|
|
240
|
-
return null;
|
|
241
|
-
},
|
|
242
|
-
}
|
|
243
|
-
: undefined,
|
|
244
|
-
forumScout: credentials['forumScout']
|
|
245
|
-
? {
|
|
246
|
-
searchReddit: async () => [],
|
|
247
|
-
searchLinkedIn: async () => [],
|
|
248
|
-
}
|
|
249
|
-
: undefined,
|
|
250
|
-
twitter: credentials['twitter']
|
|
251
|
-
? {
|
|
252
|
-
search: async () => [],
|
|
253
|
-
}
|
|
254
|
-
: undefined,
|
|
255
|
-
openai: credentials['openai']
|
|
256
|
-
? {
|
|
257
|
-
generateVideo: async () => ({ url: 'mock_url' }),
|
|
258
|
-
}
|
|
259
|
-
: undefined,
|
|
260
|
-
anthropic: credentials['anthropic']
|
|
261
|
-
? {
|
|
262
|
-
complete: async () => 'mock response',
|
|
263
|
-
generateKeywords: async () => ['keyword1', 'keyword2'],
|
|
264
|
-
}
|
|
265
|
-
: undefined,
|
|
266
|
-
dataForSeo: credentials['dataForSeo']
|
|
267
|
-
? {
|
|
268
|
-
getKeywords: async () => [],
|
|
269
|
-
runAudit: async () => ({ issues: [] }),
|
|
270
|
-
}
|
|
271
|
-
: undefined,
|
|
272
|
-
};
|
|
273
|
-
}
|