@jam-nodes/playground 0.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/dist/commands/credentials.d.ts +6 -0
- package/dist/commands/credentials.d.ts.map +1 -0
- package/dist/commands/credentials.js +205 -0
- package/dist/commands/credentials.js.map +1 -0
- package/dist/commands/index.d.ts +5 -0
- package/dist/commands/index.d.ts.map +1 -0
- package/dist/commands/index.js +5 -0
- package/dist/commands/index.js.map +1 -0
- package/dist/commands/init.d.ts +6 -0
- package/dist/commands/init.d.ts.map +1 -0
- package/dist/commands/init.js +76 -0
- package/dist/commands/init.js.map +1 -0
- package/dist/commands/list.d.ts +6 -0
- package/dist/commands/list.d.ts.map +1 -0
- package/dist/commands/list.js +111 -0
- package/dist/commands/list.js.map +1 -0
- package/dist/commands/run.d.ts +6 -0
- package/dist/commands/run.d.ts.map +1 -0
- package/dist/commands/run.js +245 -0
- package/dist/commands/run.js.map +1 -0
- package/dist/credentials/env-provider.d.ts +54 -0
- package/dist/credentials/env-provider.d.ts.map +1 -0
- package/dist/credentials/env-provider.js +177 -0
- package/dist/credentials/env-provider.js.map +1 -0
- package/dist/credentials/index.d.ts +2 -0
- package/dist/credentials/index.d.ts.map +1 -0
- package/dist/credentials/index.js +2 -0
- package/dist/credentials/index.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +24 -0
- package/dist/index.js.map +1 -0
- package/dist/ui/index.d.ts +2 -0
- package/dist/ui/index.d.ts.map +1 -0
- package/dist/ui/index.js +2 -0
- package/dist/ui/index.js.map +1 -0
- package/dist/ui/prompts.d.ts +49 -0
- package/dist/ui/prompts.d.ts.map +1 -0
- package/dist/ui/prompts.js +189 -0
- package/dist/ui/prompts.js.map +1 -0
- package/dist/utils/index.d.ts +2 -0
- package/dist/utils/index.d.ts.map +1 -0
- package/dist/utils/index.js +2 -0
- package/dist/utils/index.js.map +1 -0
- package/dist/utils/mock-generator.d.ts +11 -0
- package/dist/utils/mock-generator.d.ts.map +1 -0
- package/dist/utils/mock-generator.js +199 -0
- package/dist/utils/mock-generator.js.map +1 -0
- package/package.json +53 -0
- package/src/commands/credentials.ts +242 -0
- package/src/commands/index.ts +4 -0
- package/src/commands/init.ts +80 -0
- package/src/commands/list.ts +124 -0
- package/src/commands/run.ts +273 -0
- package/src/credentials/env-provider.ts +208 -0
- package/src/credentials/index.ts +10 -0
- package/src/index.ts +32 -0
- package/src/ui/index.ts +9 -0
- package/src/ui/prompts.ts +259 -0
- package/src/utils/index.ts +1 -0
- package/src/utils/mock-generator.ts +227 -0
- package/tsconfig.json +15 -0
|
@@ -0,0 +1,245 @@
|
|
|
1
|
+
import { Command } from 'commander';
|
|
2
|
+
import chalk from 'chalk';
|
|
3
|
+
import ora from 'ora';
|
|
4
|
+
import { createRegistry } from '@jam-nodes/core';
|
|
5
|
+
import { builtInNodes } from '@jam-nodes/nodes';
|
|
6
|
+
import { getCredentials, saveCredentials, getCredentialSource, } from '../credentials/index.js';
|
|
7
|
+
import { promptForNodeInput, promptForCredentials, promptSaveCredentials, selectNode, } from '../ui/index.js';
|
|
8
|
+
import { generateMockOutput } from '../utils/index.js';
|
|
9
|
+
// Create and populate the registry
|
|
10
|
+
const registry = createRegistry();
|
|
11
|
+
for (const node of builtInNodes) {
|
|
12
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
13
|
+
registry.register(node);
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* Service names required by each node type
|
|
17
|
+
*/
|
|
18
|
+
const NODE_SERVICE_REQUIREMENTS = {
|
|
19
|
+
search_contacts: ['apollo'],
|
|
20
|
+
reddit_monitor: ['forumScout'],
|
|
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'],
|
|
29
|
+
};
|
|
30
|
+
/**
|
|
31
|
+
* Run command - executes a node with input
|
|
32
|
+
*/
|
|
33
|
+
export const runCommand = new Command('run')
|
|
34
|
+
.description('Run a jam-node interactively')
|
|
35
|
+
.argument('[node-type]', 'Node type to run (interactive selection if omitted)')
|
|
36
|
+
.option('-i, --input <json>', 'Input as JSON string')
|
|
37
|
+
.option('-m, --mock', 'Use mock mode (returns sample data without calling APIs)')
|
|
38
|
+
.option('--no-confirm', 'Skip confirmation prompt')
|
|
39
|
+
.action(async (nodeType, options) => {
|
|
40
|
+
try {
|
|
41
|
+
// If no node type specified, show selection
|
|
42
|
+
if (!nodeType) {
|
|
43
|
+
const nodes = registry.getAllMetadata();
|
|
44
|
+
nodeType = await selectNode(nodes);
|
|
45
|
+
}
|
|
46
|
+
// Get node definition
|
|
47
|
+
const definition = registry.getDefinition(nodeType);
|
|
48
|
+
if (!definition) {
|
|
49
|
+
console.error(chalk.red(`Unknown node type: ${nodeType}`));
|
|
50
|
+
console.log(chalk.dim('Use "jam-playground list" to see available nodes'));
|
|
51
|
+
process.exit(1);
|
|
52
|
+
}
|
|
53
|
+
// Display node info
|
|
54
|
+
console.log();
|
|
55
|
+
console.log(chalk.bold.cyan('┌─────────────────────────────────────────────────────────────┐'));
|
|
56
|
+
console.log(chalk.bold.cyan('│ ') + chalk.bold(definition.name).padEnd(57) + chalk.bold.cyan('│'));
|
|
57
|
+
console.log(chalk.bold.cyan('│ ') + chalk.dim(definition.description.slice(0, 55)).padEnd(57) + chalk.bold.cyan('│'));
|
|
58
|
+
console.log(chalk.bold.cyan('└─────────────────────────────────────────────────────────────┘'));
|
|
59
|
+
// Mock mode notice
|
|
60
|
+
if (options.mock) {
|
|
61
|
+
console.log();
|
|
62
|
+
console.log(chalk.yellow('⚡ Mock mode enabled - returning sample data without API calls'));
|
|
63
|
+
}
|
|
64
|
+
// Check for required services/credentials
|
|
65
|
+
const requiredServices = NODE_SERVICE_REQUIREMENTS[nodeType] || [];
|
|
66
|
+
const credentials = {};
|
|
67
|
+
if (requiredServices.length > 0 && !options.mock) {
|
|
68
|
+
console.log();
|
|
69
|
+
console.log(chalk.dim(`This node requires: ${requiredServices.join(', ')}`));
|
|
70
|
+
for (const service of requiredServices) {
|
|
71
|
+
const source = await getCredentialSource(service);
|
|
72
|
+
if (source) {
|
|
73
|
+
console.log(chalk.green(`✓ ${service} credentials found (${source})`));
|
|
74
|
+
const creds = await getCredentials(service);
|
|
75
|
+
if (creds) {
|
|
76
|
+
credentials[service] = creds;
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
else {
|
|
80
|
+
console.log(chalk.yellow(`⚠ ${service} credentials not found`));
|
|
81
|
+
// Prompt for credentials
|
|
82
|
+
const creds = await promptForCredentials(service, [
|
|
83
|
+
{ name: 'apiKey', message: `${service} API Key:`, type: 'password' },
|
|
84
|
+
]);
|
|
85
|
+
credentials[service] = creds;
|
|
86
|
+
// Ask if they want to save
|
|
87
|
+
const shouldSave = await promptSaveCredentials();
|
|
88
|
+
if (shouldSave) {
|
|
89
|
+
saveCredentials(service, creds);
|
|
90
|
+
console.log(chalk.green(`✓ ${service} credentials saved`));
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
// Get input
|
|
96
|
+
let input;
|
|
97
|
+
if (options.input) {
|
|
98
|
+
try {
|
|
99
|
+
input = JSON.parse(options.input);
|
|
100
|
+
}
|
|
101
|
+
catch {
|
|
102
|
+
console.error(chalk.red('Invalid JSON input'));
|
|
103
|
+
process.exit(1);
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
else {
|
|
107
|
+
// Interactive input
|
|
108
|
+
input = await promptForNodeInput(definition.inputSchema);
|
|
109
|
+
}
|
|
110
|
+
// Display input summary
|
|
111
|
+
console.log();
|
|
112
|
+
console.log(chalk.dim('Input:'));
|
|
113
|
+
console.log(chalk.dim(JSON.stringify(input, null, 2)));
|
|
114
|
+
// Execute node
|
|
115
|
+
const spinner = ora({
|
|
116
|
+
text: `Executing ${definition.name}...`,
|
|
117
|
+
color: 'cyan',
|
|
118
|
+
}).start();
|
|
119
|
+
try {
|
|
120
|
+
let result;
|
|
121
|
+
if (options.mock) {
|
|
122
|
+
// Mock mode - generate sample output
|
|
123
|
+
await new Promise((resolve) => setTimeout(resolve, 500)); // Simulate delay
|
|
124
|
+
result = {
|
|
125
|
+
success: true,
|
|
126
|
+
output: generateMockOutput(nodeType, definition.outputSchema),
|
|
127
|
+
};
|
|
128
|
+
}
|
|
129
|
+
else {
|
|
130
|
+
// Create execution context
|
|
131
|
+
const context = {
|
|
132
|
+
userId: 'playground',
|
|
133
|
+
workflowExecutionId: `playground_${Date.now()}`,
|
|
134
|
+
variables: {},
|
|
135
|
+
resolveNestedPath: (path) => {
|
|
136
|
+
// Simple implementation - look in variables
|
|
137
|
+
const parts = path.split('.');
|
|
138
|
+
let current = context.variables;
|
|
139
|
+
for (const part of parts) {
|
|
140
|
+
if (current && typeof current === 'object') {
|
|
141
|
+
current = current[part];
|
|
142
|
+
}
|
|
143
|
+
else {
|
|
144
|
+
return undefined;
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
return current;
|
|
148
|
+
},
|
|
149
|
+
services: createMockServices(credentials),
|
|
150
|
+
};
|
|
151
|
+
// Validate input
|
|
152
|
+
const validatedInput = definition.inputSchema.parse(input);
|
|
153
|
+
// Execute
|
|
154
|
+
result = await definition.executor(validatedInput, context);
|
|
155
|
+
}
|
|
156
|
+
spinner.stop();
|
|
157
|
+
// Display result
|
|
158
|
+
console.log();
|
|
159
|
+
if (result.success) {
|
|
160
|
+
console.log(chalk.green.bold('✓ Success!'));
|
|
161
|
+
console.log();
|
|
162
|
+
console.log(chalk.dim('Output:'));
|
|
163
|
+
console.log(formatJson(result.output));
|
|
164
|
+
}
|
|
165
|
+
else {
|
|
166
|
+
console.log(chalk.red.bold('✗ Failed'));
|
|
167
|
+
console.log(chalk.red(result.error || 'Unknown error'));
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
catch (error) {
|
|
171
|
+
spinner.stop();
|
|
172
|
+
console.log();
|
|
173
|
+
console.log(chalk.red.bold('✗ Execution failed'));
|
|
174
|
+
console.log(chalk.red(error instanceof Error ? error.message : 'Unknown error'));
|
|
175
|
+
if (error instanceof Error && error.stack) {
|
|
176
|
+
console.log(chalk.dim(error.stack));
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
catch (error) {
|
|
181
|
+
console.error(chalk.red('Error:'), error instanceof Error ? error.message : error);
|
|
182
|
+
process.exit(1);
|
|
183
|
+
}
|
|
184
|
+
});
|
|
185
|
+
/**
|
|
186
|
+
* Format JSON with syntax highlighting
|
|
187
|
+
*/
|
|
188
|
+
function formatJson(data) {
|
|
189
|
+
const json = JSON.stringify(data, null, 2);
|
|
190
|
+
return json
|
|
191
|
+
.replace(/"([^"]+)":/g, chalk.cyan('"$1":'))
|
|
192
|
+
.replace(/: "([^"]+)"/g, ': ' + chalk.green('"$1"'))
|
|
193
|
+
.replace(/: (\d+)/g, ': ' + chalk.yellow('$1'))
|
|
194
|
+
.replace(/: (true|false)/g, ': ' + chalk.magenta('$1'))
|
|
195
|
+
.replace(/: (null)/g, ': ' + chalk.dim('$1'));
|
|
196
|
+
}
|
|
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
|
+
//# sourceMappingURL=run.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"run.js","sourceRoot":"","sources":["../../src/commands/run.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Get credentials for a service.
|
|
3
|
+
* Checks in order:
|
|
4
|
+
* 1. Environment variables
|
|
5
|
+
* 2. Saved credentials in config store
|
|
6
|
+
* 3. Returns null (caller should prompt user)
|
|
7
|
+
*
|
|
8
|
+
* @param name - Service name (e.g., 'hunter', 'apollo')
|
|
9
|
+
* @returns Credentials object or null if not found
|
|
10
|
+
*/
|
|
11
|
+
export declare function getCredentials(name: string): Promise<Record<string, string> | null>;
|
|
12
|
+
/**
|
|
13
|
+
* Save credentials for a service.
|
|
14
|
+
*
|
|
15
|
+
* @param name - Service name
|
|
16
|
+
* @param credentials - Credential data to save
|
|
17
|
+
*/
|
|
18
|
+
export declare function saveCredentials(name: string, credentials: Record<string, string>): void;
|
|
19
|
+
/**
|
|
20
|
+
* Delete credentials for a service.
|
|
21
|
+
*
|
|
22
|
+
* @param name - Service name
|
|
23
|
+
* @returns True if credentials were deleted
|
|
24
|
+
*/
|
|
25
|
+
export declare function deleteCredentials(name: string): boolean;
|
|
26
|
+
/**
|
|
27
|
+
* List all saved credential names.
|
|
28
|
+
*
|
|
29
|
+
* @returns Array of service names with saved credentials
|
|
30
|
+
*/
|
|
31
|
+
export declare function listSavedCredentials(): string[];
|
|
32
|
+
/**
|
|
33
|
+
* Check if credentials exist for a service.
|
|
34
|
+
*
|
|
35
|
+
* @param name - Service name
|
|
36
|
+
* @returns True if credentials are available (env or saved)
|
|
37
|
+
*/
|
|
38
|
+
export declare function hasCredentials(name: string): Promise<boolean>;
|
|
39
|
+
/**
|
|
40
|
+
* Get credential source for display.
|
|
41
|
+
*
|
|
42
|
+
* @param name - Service name
|
|
43
|
+
* @returns Source description or null
|
|
44
|
+
*/
|
|
45
|
+
export declare function getCredentialSource(name: string): Promise<'env' | 'saved' | null>;
|
|
46
|
+
/**
|
|
47
|
+
* Clear all saved credentials.
|
|
48
|
+
*/
|
|
49
|
+
export declare function clearAllCredentials(): void;
|
|
50
|
+
/**
|
|
51
|
+
* Get the path to the credential store.
|
|
52
|
+
*/
|
|
53
|
+
export declare function getStorePath(): string;
|
|
54
|
+
//# sourceMappingURL=env-provider.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"env-provider.d.ts","sourceRoot":"","sources":["../../src/credentials/env-provider.ts"],"names":[],"mappings":"AA+FA;;;;;;;;;GASG;AACH,wBAAsB,cAAc,CAClC,IAAI,EAAE,MAAM,GACX,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,IAAI,CAAC,CAexC;AAED;;;;;GAKG;AACH,wBAAgB,eAAe,CAC7B,IAAI,EAAE,MAAM,EACZ,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAClC,IAAI,CAEN;AAED;;;;;GAKG;AACH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAOvD;AAED;;;;GAIG;AACH,wBAAgB,oBAAoB,IAAI,MAAM,EAAE,CAG/C;AAED;;;;;GAKG;AACH,wBAAsB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAGnE;AAED;;;;;GAKG;AACH,wBAAsB,mBAAmB,CACvC,IAAI,EAAE,MAAM,GACX,OAAO,CAAC,KAAK,GAAG,OAAO,GAAG,IAAI,CAAC,CAYjC;AAED;;GAEG;AACH,wBAAgB,mBAAmB,IAAI,IAAI,CAE1C;AAED;;GAEG;AACH,wBAAgB,YAAY,IAAI,MAAM,CAErC"}
|
|
@@ -0,0 +1,177 @@
|
|
|
1
|
+
import Conf from 'conf';
|
|
2
|
+
import { config } from 'dotenv';
|
|
3
|
+
import * as path from 'path';
|
|
4
|
+
import * as fs from 'fs';
|
|
5
|
+
/**
|
|
6
|
+
* Encrypted credential store using conf
|
|
7
|
+
* Stores credentials in ~/.config/jam-nodes-playground/
|
|
8
|
+
*/
|
|
9
|
+
const store = new Conf({
|
|
10
|
+
projectName: 'jam-nodes-playground',
|
|
11
|
+
defaults: {
|
|
12
|
+
credentials: {},
|
|
13
|
+
},
|
|
14
|
+
});
|
|
15
|
+
/**
|
|
16
|
+
* Load environment variables from .env files
|
|
17
|
+
* Searches in current directory and parent directories
|
|
18
|
+
*/
|
|
19
|
+
function loadEnvFiles() {
|
|
20
|
+
// Load .env from current working directory
|
|
21
|
+
config();
|
|
22
|
+
// Also try .env.local
|
|
23
|
+
const localEnvPath = path.join(process.cwd(), '.env.local');
|
|
24
|
+
if (fs.existsSync(localEnvPath)) {
|
|
25
|
+
config({ path: localEnvPath });
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
// Load env files on import
|
|
29
|
+
loadEnvFiles();
|
|
30
|
+
/**
|
|
31
|
+
* Known credential name to environment variable mappings
|
|
32
|
+
*/
|
|
33
|
+
const ENV_VAR_MAPPINGS = {
|
|
34
|
+
hunter: ['JAM_HUNTER_API_KEY', 'HUNTER_API_KEY'],
|
|
35
|
+
apollo: ['JAM_APOLLO_API_KEY', 'APOLLO_API_KEY'],
|
|
36
|
+
sendgrid: ['JAM_SENDGRID_API_KEY', 'SENDGRID_API_KEY'],
|
|
37
|
+
openai: ['JAM_OPENAI_API_KEY', 'OPENAI_API_KEY'],
|
|
38
|
+
anthropic: ['JAM_ANTHROPIC_API_KEY', 'ANTHROPIC_API_KEY'],
|
|
39
|
+
twitter: ['JAM_TWITTER_BEARER_TOKEN', 'TWITTER_BEARER_TOKEN'],
|
|
40
|
+
reddit: ['JAM_REDDIT_CLIENT_ID', 'REDDIT_CLIENT_ID'],
|
|
41
|
+
linkedin: ['JAM_LINKEDIN_ACCESS_TOKEN', 'LINKEDIN_ACCESS_TOKEN'],
|
|
42
|
+
dataforseo: ['JAM_DATAFORSEO_LOGIN', 'DATAFORSEO_LOGIN'],
|
|
43
|
+
hubspot: ['JAM_HUBSPOT_API_KEY', 'HUBSPOT_API_KEY'],
|
|
44
|
+
clearbit: ['JAM_CLEARBIT_API_KEY', 'CLEARBIT_API_KEY'],
|
|
45
|
+
dropcontact: ['JAM_DROPCONTACT_API_KEY', 'DROPCONTACT_API_KEY'],
|
|
46
|
+
};
|
|
47
|
+
/**
|
|
48
|
+
* Check environment variables for credentials
|
|
49
|
+
*/
|
|
50
|
+
function getFromEnv(name) {
|
|
51
|
+
const envVars = ENV_VAR_MAPPINGS[name.toLowerCase()];
|
|
52
|
+
if (envVars) {
|
|
53
|
+
for (const varName of envVars) {
|
|
54
|
+
const value = process.env[varName];
|
|
55
|
+
if (value) {
|
|
56
|
+
return { apiKey: value };
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
// Try generic pattern: JAM_{NAME}_API_KEY
|
|
61
|
+
const genericKey = `JAM_${name.toUpperCase()}_API_KEY`;
|
|
62
|
+
if (process.env[genericKey]) {
|
|
63
|
+
return { apiKey: process.env[genericKey] };
|
|
64
|
+
}
|
|
65
|
+
// Special handling for services with multiple env vars
|
|
66
|
+
if (name.toLowerCase() === 'dataforseo') {
|
|
67
|
+
const login = process.env['JAM_DATAFORSEO_LOGIN'] || process.env['DATAFORSEO_LOGIN'];
|
|
68
|
+
const password = process.env['JAM_DATAFORSEO_PASSWORD'] || process.env['DATAFORSEO_PASSWORD'];
|
|
69
|
+
if (login && password) {
|
|
70
|
+
return { login, password };
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
if (name.toLowerCase() === 'reddit') {
|
|
74
|
+
const clientId = process.env['JAM_REDDIT_CLIENT_ID'] || process.env['REDDIT_CLIENT_ID'];
|
|
75
|
+
const clientSecret = process.env['JAM_REDDIT_CLIENT_SECRET'] || process.env['REDDIT_CLIENT_SECRET'];
|
|
76
|
+
if (clientId && clientSecret) {
|
|
77
|
+
return { clientId, clientSecret };
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
return null;
|
|
81
|
+
}
|
|
82
|
+
/**
|
|
83
|
+
* Get credentials for a service.
|
|
84
|
+
* Checks in order:
|
|
85
|
+
* 1. Environment variables
|
|
86
|
+
* 2. Saved credentials in config store
|
|
87
|
+
* 3. Returns null (caller should prompt user)
|
|
88
|
+
*
|
|
89
|
+
* @param name - Service name (e.g., 'hunter', 'apollo')
|
|
90
|
+
* @returns Credentials object or null if not found
|
|
91
|
+
*/
|
|
92
|
+
export async function getCredentials(name) {
|
|
93
|
+
// 1. Check environment variables
|
|
94
|
+
const envCreds = getFromEnv(name);
|
|
95
|
+
if (envCreds) {
|
|
96
|
+
return envCreds;
|
|
97
|
+
}
|
|
98
|
+
// 2. Check saved credentials
|
|
99
|
+
const saved = store.get(`credentials.${name.toLowerCase()}`);
|
|
100
|
+
if (saved && Object.keys(saved).length > 0) {
|
|
101
|
+
return saved;
|
|
102
|
+
}
|
|
103
|
+
// 3. Return null (caller should prompt)
|
|
104
|
+
return null;
|
|
105
|
+
}
|
|
106
|
+
/**
|
|
107
|
+
* Save credentials for a service.
|
|
108
|
+
*
|
|
109
|
+
* @param name - Service name
|
|
110
|
+
* @param credentials - Credential data to save
|
|
111
|
+
*/
|
|
112
|
+
export function saveCredentials(name, credentials) {
|
|
113
|
+
store.set(`credentials.${name.toLowerCase()}`, credentials);
|
|
114
|
+
}
|
|
115
|
+
/**
|
|
116
|
+
* Delete credentials for a service.
|
|
117
|
+
*
|
|
118
|
+
* @param name - Service name
|
|
119
|
+
* @returns True if credentials were deleted
|
|
120
|
+
*/
|
|
121
|
+
export function deleteCredentials(name) {
|
|
122
|
+
const key = `credentials.${name.toLowerCase()}`;
|
|
123
|
+
if (store.has(key)) {
|
|
124
|
+
store.delete(key);
|
|
125
|
+
return true;
|
|
126
|
+
}
|
|
127
|
+
return false;
|
|
128
|
+
}
|
|
129
|
+
/**
|
|
130
|
+
* List all saved credential names.
|
|
131
|
+
*
|
|
132
|
+
* @returns Array of service names with saved credentials
|
|
133
|
+
*/
|
|
134
|
+
export function listSavedCredentials() {
|
|
135
|
+
const credentials = store.get('credentials');
|
|
136
|
+
return Object.keys(credentials);
|
|
137
|
+
}
|
|
138
|
+
/**
|
|
139
|
+
* Check if credentials exist for a service.
|
|
140
|
+
*
|
|
141
|
+
* @param name - Service name
|
|
142
|
+
* @returns True if credentials are available (env or saved)
|
|
143
|
+
*/
|
|
144
|
+
export async function hasCredentials(name) {
|
|
145
|
+
const creds = await getCredentials(name);
|
|
146
|
+
return creds !== null;
|
|
147
|
+
}
|
|
148
|
+
/**
|
|
149
|
+
* Get credential source for display.
|
|
150
|
+
*
|
|
151
|
+
* @param name - Service name
|
|
152
|
+
* @returns Source description or null
|
|
153
|
+
*/
|
|
154
|
+
export async function getCredentialSource(name) {
|
|
155
|
+
const envCreds = getFromEnv(name);
|
|
156
|
+
if (envCreds) {
|
|
157
|
+
return 'env';
|
|
158
|
+
}
|
|
159
|
+
const saved = store.get(`credentials.${name.toLowerCase()}`);
|
|
160
|
+
if (saved && Object.keys(saved).length > 0) {
|
|
161
|
+
return 'saved';
|
|
162
|
+
}
|
|
163
|
+
return null;
|
|
164
|
+
}
|
|
165
|
+
/**
|
|
166
|
+
* Clear all saved credentials.
|
|
167
|
+
*/
|
|
168
|
+
export function clearAllCredentials() {
|
|
169
|
+
store.set('credentials', {});
|
|
170
|
+
}
|
|
171
|
+
/**
|
|
172
|
+
* Get the path to the credential store.
|
|
173
|
+
*/
|
|
174
|
+
export function getStorePath() {
|
|
175
|
+
return store.path;
|
|
176
|
+
}
|
|
177
|
+
//# sourceMappingURL=env-provider.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"env-provider.js","sourceRoot":"","sources":["../../src/credentials/env-provider.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/credentials/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,cAAc,EACd,eAAe,EACf,iBAAiB,EACjB,oBAAoB,EACpB,cAAc,EACd,mBAAmB,EACnB,mBAAmB,EACnB,YAAY,GACb,MAAM,mBAAmB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/credentials/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,cAAc,EACd,eAAe,EACf,iBAAiB,EACjB,oBAAoB,EACpB,cAAc,EACd,mBAAmB,EACnB,mBAAmB,EACnB,YAAY,GACb,MAAM,mBAAmB,CAAC"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":""}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import { Command } from 'commander';
|
|
3
|
+
import chalk from 'chalk';
|
|
4
|
+
import { listCommand, runCommand, initCommand, credentialsCommand, } from './commands/index.js';
|
|
5
|
+
const program = new Command()
|
|
6
|
+
.name('jam-playground')
|
|
7
|
+
.description('Test jam-nodes interactively')
|
|
8
|
+
.version('0.1.0');
|
|
9
|
+
// Add commands
|
|
10
|
+
program.addCommand(listCommand);
|
|
11
|
+
program.addCommand(runCommand);
|
|
12
|
+
program.addCommand(initCommand);
|
|
13
|
+
program.addCommand(credentialsCommand);
|
|
14
|
+
// Default action (no command) - show help
|
|
15
|
+
program.action(() => {
|
|
16
|
+
console.log();
|
|
17
|
+
console.log(chalk.bold.cyan(' jam-nodes Playground'));
|
|
18
|
+
console.log(chalk.dim(' Test workflow nodes interactively'));
|
|
19
|
+
console.log();
|
|
20
|
+
program.outputHelp();
|
|
21
|
+
});
|
|
22
|
+
// Parse arguments
|
|
23
|
+
program.parse();
|
|
24
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EACL,WAAW,EACX,UAAU,EACV,WAAW,EACX,kBAAkB,GACnB,MAAM,qBAAqB,CAAC;AAE7B,MAAM,OAAO,GAAG,IAAI,OAAO,EAAE;KAC1B,IAAI,CAAC,gBAAgB,CAAC;KACtB,WAAW,CAAC,8BAA8B,CAAC;KAC3C,OAAO,CAAC,OAAO,CAAC,CAAC;AAEpB,eAAe;AACf,OAAO,CAAC,UAAU,CAAC,WAAW,CAAC,CAAC;AAChC,OAAO,CAAC,UAAU,CAAC,UAAU,CAAC,CAAC;AAC/B,OAAO,CAAC,UAAU,CAAC,WAAW,CAAC,CAAC;AAChC,OAAO,CAAC,UAAU,CAAC,kBAAkB,CAAC,CAAC;AAEvC,0CAA0C;AAC1C,OAAO,CAAC,MAAM,CAAC,GAAG,EAAE;IAClB,OAAO,CAAC,GAAG,EAAE,CAAC;IACd,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,wBAAwB,CAAC,CAAC,CAAC;IACvD,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,qCAAqC,CAAC,CAAC,CAAC;IAC9D,OAAO,CAAC,GAAG,EAAE,CAAC;IACd,OAAO,CAAC,UAAU,EAAE,CAAC;AACvB,CAAC,CAAC,CAAC;AAEH,kBAAkB;AAClB,OAAO,CAAC,KAAK,EAAE,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/ui/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,oBAAoB,EACpB,sBAAsB,EACtB,qBAAqB,EACrB,kBAAkB,EAClB,UAAU,EACV,UAAU,EACV,yBAAyB,GAC1B,MAAM,cAAc,CAAC"}
|
package/dist/ui/index.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/ui/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,oBAAoB,EACpB,sBAAsB,EACtB,qBAAqB,EACrB,kBAAkB,EAClB,UAAU,EACV,UAAU,EACV,yBAAyB,GAC1B,MAAM,cAAc,CAAC"}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
import type { z } from 'zod';
|
|
2
|
+
/**
|
|
3
|
+
* Prompt user for credential input
|
|
4
|
+
*/
|
|
5
|
+
export declare function promptForCredentials(serviceName: string, fields: Array<{
|
|
6
|
+
name: string;
|
|
7
|
+
message: string;
|
|
8
|
+
type?: 'input' | 'password';
|
|
9
|
+
}>): Promise<Record<string, string>>;
|
|
10
|
+
/**
|
|
11
|
+
* Prompt user for how to provide credentials
|
|
12
|
+
*/
|
|
13
|
+
export declare function promptCredentialSource(serviceName: string): Promise<'existing' | 'enter' | 'save'>;
|
|
14
|
+
/**
|
|
15
|
+
* Prompt user to save credentials
|
|
16
|
+
*/
|
|
17
|
+
export declare function promptSaveCredentials(): Promise<boolean>;
|
|
18
|
+
/**
|
|
19
|
+
* Generate prompts from a Zod schema
|
|
20
|
+
*/
|
|
21
|
+
export declare function generatePromptsFromSchema(schema: z.ZodSchema, prefix?: string): Array<{
|
|
22
|
+
name: string;
|
|
23
|
+
message: string;
|
|
24
|
+
type: 'input' | 'number' | 'confirm' | 'list' | 'editor';
|
|
25
|
+
default?: unknown;
|
|
26
|
+
choices?: Array<{
|
|
27
|
+
name: string;
|
|
28
|
+
value: unknown;
|
|
29
|
+
}>;
|
|
30
|
+
required: boolean;
|
|
31
|
+
validate?: (input: unknown) => boolean | string;
|
|
32
|
+
}>;
|
|
33
|
+
/**
|
|
34
|
+
* Prompt user for node input based on schema
|
|
35
|
+
*/
|
|
36
|
+
export declare function promptForNodeInput(schema: z.ZodSchema, existingInput?: Record<string, unknown>): Promise<Record<string, unknown>>;
|
|
37
|
+
/**
|
|
38
|
+
* Confirm before running a node
|
|
39
|
+
*/
|
|
40
|
+
export declare function confirmRun(nodeType: string): Promise<boolean>;
|
|
41
|
+
/**
|
|
42
|
+
* Select a node from a list
|
|
43
|
+
*/
|
|
44
|
+
export declare function selectNode(nodes: Array<{
|
|
45
|
+
type: string;
|
|
46
|
+
name: string;
|
|
47
|
+
description: string;
|
|
48
|
+
}>): Promise<string>;
|
|
49
|
+
//# sourceMappingURL=prompts.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"prompts.d.ts","sourceRoot":"","sources":["../../src/ui/prompts.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAU7B;;GAEG;AACH,wBAAsB,oBAAoB,CACxC,WAAW,EAAE,MAAM,EACnB,MAAM,EAAE,KAAK,CAAC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,OAAO,GAAG,UAAU,CAAA;CAAE,CAAC,GAC5E,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAejC;AAED;;GAEG;AACH,wBAAsB,sBAAsB,CAC1C,WAAW,EAAE,MAAM,GAClB,OAAO,CAAC,UAAU,GAAG,OAAO,GAAG,MAAM,CAAC,CAcxC;AAED;;GAEG;AACH,wBAAsB,qBAAqB,IAAI,OAAO,CAAC,OAAO,CAAC,CAU9D;AAED;;GAEG;AACH,wBAAgB,yBAAyB,CACvC,MAAM,EAAE,CAAC,CAAC,SAAS,EACnB,MAAM,SAAK,GACV,KAAK,CAAC;IACP,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,OAAO,GAAG,QAAQ,GAAG,SAAS,GAAG,MAAM,GAAG,QAAQ,CAAC;IACzD,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,OAAO,CAAC,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,OAAO,CAAA;KAAE,CAAC,CAAC;IAClD,QAAQ,EAAE,OAAO,CAAC;IAClB,QAAQ,CAAC,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,OAAO,GAAG,MAAM,CAAC;CACjD,CAAC,CAqED;AAED;;GAEG;AACH,wBAAsB,kBAAkB,CACtC,MAAM,EAAE,CAAC,CAAC,SAAS,EACnB,aAAa,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GACtC,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CA6DlC;AAED;;GAEG;AACH,wBAAsB,UAAU,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAUnE;AAED;;GAEG;AACH,wBAAsB,UAAU,CAC9B,KAAK,EAAE,KAAK,CAAC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,WAAW,EAAE,MAAM,CAAA;CAAE,CAAC,GAChE,OAAO,CAAC,MAAM,CAAC,CAajB"}
|