@marktoflow/cli 2.0.0-alpha.7 → 2.0.1

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/serve.js ADDED
@@ -0,0 +1,453 @@
1
+ import { Command } from 'commander';
2
+ import { parseFile, WorkflowEngine, StateStore, SDKRegistry, createSDKStepExecutor, WebhookReceiver, parseWebhookBody, verifySlackSignature, verifyGitHubSignature, } from '@marktoflow/core';
3
+ import { SlackSocketTrigger } from '@marktoflow/integrations';
4
+ import { readdirSync, existsSync } from 'node:fs';
5
+ import { join, resolve } from 'node:path';
6
+ import chalk from 'chalk';
7
+ import { registerIntegrations } from '@marktoflow/integrations';
8
+ /**
9
+ * Extract input value from webhook payload using a path expression
10
+ */
11
+ function extractFromPayload(payload, path) {
12
+ if (!path.startsWith('payload.')) {
13
+ return path; // Return literal value
14
+ }
15
+ const parts = path.slice(8).split('.'); // Remove 'payload.' prefix
16
+ let current = payload;
17
+ for (const part of parts) {
18
+ if (current === null || current === undefined) {
19
+ return undefined;
20
+ }
21
+ current = current[part];
22
+ }
23
+ return current;
24
+ }
25
+ /**
26
+ * Build workflow inputs from webhook payload based on input mapping
27
+ */
28
+ function buildInputs(payload, mapping, defaults) {
29
+ const inputs = { ...defaults };
30
+ if (mapping) {
31
+ for (const [inputName, payloadPath] of Object.entries(mapping)) {
32
+ const value = extractFromPayload(payload, payloadPath);
33
+ if (value !== undefined) {
34
+ inputs[inputName] = value;
35
+ }
36
+ }
37
+ }
38
+ return inputs;
39
+ }
40
+ export const serveCommand = new Command('serve')
41
+ .description('Start webhook server to receive events and trigger workflows')
42
+ .option('-p, --port <port>', 'Server port (for HTTP mode)', '3000')
43
+ .option('-H, --host <host>', 'Server host (for HTTP mode)', '0.0.0.0')
44
+ .option('-d, --dir <path>', 'Workflow directory', '.')
45
+ .option('-w, --workflow <path>', 'Single workflow file to serve')
46
+ .option('--agent <agent>', 'Default agent for workflows', 'claude-code')
47
+ .option('--socket', 'Use Slack Socket Mode (no public URL needed)')
48
+ .option('--app-token <token>', 'Slack App Token for Socket Mode (or SLACK_APP_TOKEN env)')
49
+ .option('--bot-token <token>', 'Slack Bot Token for Socket Mode (or SLACK_BOT_TOKEN env)')
50
+ .action(async (options) => {
51
+ const port = parseInt(options.port, 10);
52
+ const host = options.host;
53
+ const workflowDir = options.dir;
54
+ const singleWorkflow = options.workflow;
55
+ const defaultAgent = options.agent;
56
+ const useSocketMode = options.socket;
57
+ // Get tokens from options or environment
58
+ const appToken = options.appToken || process.env.SLACK_APP_TOKEN;
59
+ const botToken = options.botToken || process.env.SLACK_BOT_TOKEN;
60
+ if (useSocketMode) {
61
+ await startSocketMode({
62
+ workflowDir,
63
+ singleWorkflow,
64
+ defaultAgent,
65
+ appToken,
66
+ botToken,
67
+ });
68
+ }
69
+ else {
70
+ await startHttpMode({
71
+ port,
72
+ host,
73
+ workflowDir,
74
+ singleWorkflow,
75
+ defaultAgent,
76
+ });
77
+ }
78
+ });
79
+ /**
80
+ * Start Slack Socket Mode server
81
+ */
82
+ async function startSocketMode(options) {
83
+ const { workflowDir, singleWorkflow, defaultAgent, appToken, botToken } = options;
84
+ console.log(chalk.blue('Starting marktoflow in Slack Socket Mode...'));
85
+ if (!appToken) {
86
+ console.error(chalk.red('Error: Slack App Token required for Socket Mode'));
87
+ console.log(chalk.gray('Set SLACK_APP_TOKEN environment variable or use --app-token'));
88
+ console.log(chalk.gray('\nTo get an App Token:'));
89
+ console.log(chalk.gray(' 1. Go to your Slack app settings'));
90
+ console.log(chalk.gray(' 2. Navigate to "Basic Information" > "App-Level Tokens"'));
91
+ console.log(chalk.gray(' 3. Generate a token with "connections:write" scope'));
92
+ process.exit(1);
93
+ }
94
+ if (!botToken) {
95
+ console.error(chalk.red('Error: Slack Bot Token required for Socket Mode'));
96
+ console.log(chalk.gray('Set SLACK_BOT_TOKEN environment variable or use --bot-token'));
97
+ process.exit(1);
98
+ }
99
+ const stateStore = new StateStore();
100
+ const engine = new WorkflowEngine({ defaultAgent }, {}, stateStore);
101
+ const registry = new SDKRegistry();
102
+ registerIntegrations(registry);
103
+ // Load workflows
104
+ const workflowFiles = findWorkflowFiles(workflowDir, singleWorkflow);
105
+ const slackWorkflows = [];
106
+ for (const filePath of workflowFiles) {
107
+ try {
108
+ const { workflow } = await parseFile(filePath);
109
+ if (!workflow.triggers)
110
+ continue;
111
+ for (const trigger of workflow.triggers) {
112
+ if (trigger.type !== 'webhook')
113
+ continue;
114
+ const provider = trigger.config?.['provider'];
115
+ if (provider !== 'slack')
116
+ continue;
117
+ const events = trigger.config?.['events'] || ['message', 'app_mention'];
118
+ slackWorkflows.push({
119
+ path: filePath,
120
+ workflow,
121
+ events,
122
+ });
123
+ console.log(chalk.cyan(` ${workflow.metadata.name || workflow.metadata.id}`) +
124
+ chalk.gray(` (events: ${events.join(', ')})`));
125
+ }
126
+ }
127
+ catch (e) {
128
+ console.warn(chalk.yellow(`Failed to load ${filePath}: ${e}`));
129
+ }
130
+ }
131
+ if (slackWorkflows.length === 0) {
132
+ console.log(chalk.yellow('\nNo Slack workflows found.'));
133
+ console.log(chalk.gray('Add a Slack webhook trigger to your workflow:'));
134
+ console.log(chalk.gray(`
135
+ triggers:
136
+ - type: webhook
137
+ path: /slack/my-workflow
138
+ config:
139
+ provider: slack
140
+ `));
141
+ process.exit(1);
142
+ }
143
+ console.log(chalk.green(`\nLoaded ${slackWorkflows.length} Slack workflow(s)`));
144
+ // Create trigger handlers
145
+ const triggers = [];
146
+ for (const wf of slackWorkflows) {
147
+ for (const eventType of wf.events) {
148
+ if (eventType !== 'message' && eventType !== 'app_mention')
149
+ continue;
150
+ triggers.push({
151
+ id: `${wf.workflow.metadata.id}-${eventType}`,
152
+ event: eventType,
153
+ handler: async (payload) => {
154
+ const message = payload.message;
155
+ const event = payload.payload;
156
+ // Skip bot messages
157
+ if (message?.bot_id || message?.subtype === 'bot_message') {
158
+ return;
159
+ }
160
+ const sourceEvent = message || event;
161
+ if (!sourceEvent)
162
+ return;
163
+ console.log(chalk.green(`[${eventType}] Received event, triggering ${wf.workflow.metadata.id}...`));
164
+ const inputs = {
165
+ channel: sourceEvent.channel,
166
+ question: sourceEvent.text,
167
+ instructions: sourceEvent.text,
168
+ thread_ts: sourceEvent.thread_ts || sourceEvent.ts,
169
+ user: sourceEvent.user,
170
+ text: sourceEvent.text,
171
+ };
172
+ try {
173
+ const { workflow } = await parseFile(wf.path);
174
+ registry.registerTools(workflow.tools);
175
+ console.log(chalk.blue(`[${wf.workflow.metadata.id}] Executing with inputs:`), inputs);
176
+ await engine.execute(workflow, inputs, registry, createSDKStepExecutor());
177
+ console.log(chalk.green(`[${wf.workflow.metadata.id}] Workflow completed successfully`));
178
+ }
179
+ catch (error) {
180
+ console.error(chalk.red(`[${wf.workflow.metadata.id}] Workflow failed:`), error);
181
+ }
182
+ },
183
+ });
184
+ }
185
+ }
186
+ // Start Socket Mode
187
+ const socketTrigger = new SlackSocketTrigger({
188
+ appToken,
189
+ botToken,
190
+ triggers,
191
+ });
192
+ await socketTrigger.start();
193
+ console.log(chalk.green('\nāœ“ Slack Socket Mode connected!'));
194
+ console.log(chalk.gray('\nListening for events:'));
195
+ for (const trigger of triggers) {
196
+ console.log(chalk.cyan(` ${trigger.event}`) + chalk.gray(` → ${trigger.id}`));
197
+ }
198
+ console.log(chalk.gray('\nNo public URL needed. Press Ctrl+C to stop.\n'));
199
+ // Handle graceful shutdown
200
+ process.on('SIGINT', async () => {
201
+ console.log(chalk.yellow('\nShutting down...'));
202
+ await socketTrigger.stop();
203
+ process.exit(0);
204
+ });
205
+ process.on('SIGTERM', async () => {
206
+ await socketTrigger.stop();
207
+ process.exit(0);
208
+ });
209
+ // Keep process alive
210
+ await new Promise(() => { });
211
+ }
212
+ /**
213
+ * Start HTTP webhook server
214
+ */
215
+ async function startHttpMode(options) {
216
+ const { port, host, workflowDir, singleWorkflow, defaultAgent } = options;
217
+ console.log(chalk.blue('Starting marktoflow webhook server...'));
218
+ const stateStore = new StateStore();
219
+ const engine = new WorkflowEngine({ defaultAgent }, {}, stateStore);
220
+ const registry = new SDKRegistry();
221
+ registerIntegrations(registry);
222
+ const webhookWorkflows = new Map();
223
+ const receiver = new WebhookReceiver({ host, port });
224
+ // Load workflows
225
+ const workflowFiles = findWorkflowFiles(workflowDir, singleWorkflow);
226
+ // Parse workflows and register webhook endpoints
227
+ for (const filePath of workflowFiles) {
228
+ try {
229
+ const { workflow } = await parseFile(filePath);
230
+ if (!workflow.triggers)
231
+ continue;
232
+ for (const trigger of workflow.triggers) {
233
+ if (trigger.type !== 'webhook')
234
+ continue;
235
+ const webhookPath = trigger.config?.['path'];
236
+ if (!webhookPath)
237
+ continue;
238
+ const provider = trigger.config?.['provider'];
239
+ const secret = trigger.config?.['secret'];
240
+ const inputMapping = trigger.config?.['inputMapping'];
241
+ webhookWorkflows.set(webhookPath, {
242
+ path: filePath,
243
+ workflow,
244
+ webhookPath,
245
+ provider,
246
+ secret,
247
+ inputMapping,
248
+ });
249
+ console.log(chalk.cyan(` ${webhookPath}`) +
250
+ chalk.gray(` → ${workflow.metadata.name || workflow.metadata.id}`));
251
+ }
252
+ }
253
+ catch (e) {
254
+ console.warn(chalk.yellow(`Failed to load ${filePath}: ${e}`));
255
+ }
256
+ }
257
+ if (webhookWorkflows.size === 0) {
258
+ console.log(chalk.yellow('\nNo webhook-enabled workflows found.'));
259
+ console.log(chalk.gray('Add a webhook trigger to your workflow:'));
260
+ console.log(chalk.gray(`
261
+ triggers:
262
+ - type: webhook
263
+ path: /my-webhook
264
+ config:
265
+ provider: slack # or github, telegram
266
+ `));
267
+ process.exit(1);
268
+ }
269
+ console.log(chalk.green(`\nRegistered ${webhookWorkflows.size} webhook endpoint(s)`));
270
+ // Register all webhook endpoints
271
+ for (const [webhookPath, wf] of webhookWorkflows) {
272
+ receiver.registerEndpoint({
273
+ path: webhookPath,
274
+ secret: wf.secret,
275
+ workflowId: wf.workflow.metadata.id,
276
+ methods: ['POST', 'GET'],
277
+ enabled: true,
278
+ }, async (event) => {
279
+ const payload = parseWebhookBody(event);
280
+ // Handle Slack URL verification
281
+ if (wf.provider === 'slack' && payload && typeof payload === 'object') {
282
+ const p = payload;
283
+ if (p.type === 'url_verification' && p.challenge) {
284
+ console.log(chalk.gray(`[${webhookPath}] Slack URL verification`));
285
+ return {
286
+ status: 200,
287
+ body: p.challenge,
288
+ headers: { 'Content-Type': 'text/plain' },
289
+ };
290
+ }
291
+ }
292
+ // Handle Microsoft Graph validation
293
+ if (event.method === 'GET' && event.query['validationToken']) {
294
+ console.log(chalk.gray(`[${webhookPath}] Graph validation`));
295
+ return {
296
+ status: 200,
297
+ body: event.query['validationToken'],
298
+ headers: { 'Content-Type': 'text/plain' },
299
+ };
300
+ }
301
+ // Verify signatures if secret is configured
302
+ if (wf.secret) {
303
+ if (wf.provider === 'slack') {
304
+ const signature = event.headers['x-slack-signature'] || '';
305
+ const timestamp = event.headers['x-slack-request-timestamp'] || '';
306
+ if (!verifySlackSignature(event.body, signature, timestamp, wf.secret)) {
307
+ console.log(chalk.red(`[${webhookPath}] Invalid Slack signature`));
308
+ return { status: 401, body: 'Invalid signature' };
309
+ }
310
+ }
311
+ else if (wf.provider === 'github') {
312
+ const signature = event.headers['x-hub-signature-256'] || '';
313
+ if (!verifyGitHubSignature(event.body, signature, wf.secret)) {
314
+ console.log(chalk.red(`[${webhookPath}] Invalid GitHub signature`));
315
+ return { status: 401, body: 'Invalid signature' };
316
+ }
317
+ }
318
+ }
319
+ // Skip Slack bot messages to prevent loops
320
+ if (wf.provider === 'slack' && payload && typeof payload === 'object') {
321
+ const p = payload;
322
+ const evt = p.event;
323
+ if (evt?.bot_id || evt?.subtype === 'bot_message') {
324
+ return { status: 200, body: 'ok' };
325
+ }
326
+ }
327
+ console.log(chalk.green(`[${webhookPath}] Received webhook, triggering workflow...`));
328
+ // Build inputs from payload
329
+ const defaultInputs = getDefaultInputsFromPayload(payload, wf.provider);
330
+ const inputs = buildInputs(payload, wf.inputMapping, defaultInputs);
331
+ // Execute workflow asynchronously (don't block the webhook response)
332
+ setImmediate(async () => {
333
+ try {
334
+ // Re-parse to get fresh workflow instance
335
+ const { workflow } = await parseFile(wf.path);
336
+ registry.registerTools(workflow.tools);
337
+ console.log(chalk.blue(`[${webhookPath}] Executing workflow with inputs:`), inputs);
338
+ await engine.execute(workflow, inputs, registry, createSDKStepExecutor());
339
+ console.log(chalk.green(`[${webhookPath}] Workflow completed successfully`));
340
+ }
341
+ catch (error) {
342
+ console.error(chalk.red(`[${webhookPath}] Workflow failed:`), error);
343
+ }
344
+ });
345
+ // Respond immediately to webhook
346
+ return { status: 200, body: 'ok' };
347
+ });
348
+ }
349
+ // Start the server
350
+ await receiver.start();
351
+ console.log(chalk.green(`\nāœ“ Webhook server running on http://${host}:${port}`));
352
+ console.log(chalk.gray('\nEndpoints:'));
353
+ for (const [path] of webhookWorkflows) {
354
+ console.log(chalk.cyan(` http://${host}:${port}${path}`));
355
+ }
356
+ console.log(chalk.gray('\nPress Ctrl+C to stop.\n'));
357
+ // Handle graceful shutdown
358
+ process.on('SIGINT', async () => {
359
+ console.log(chalk.yellow('\nShutting down...'));
360
+ await receiver.stop();
361
+ process.exit(0);
362
+ });
363
+ process.on('SIGTERM', async () => {
364
+ await receiver.stop();
365
+ process.exit(0);
366
+ });
367
+ // Keep process alive
368
+ await new Promise(() => { });
369
+ }
370
+ /**
371
+ * Find workflow files to load
372
+ */
373
+ function findWorkflowFiles(workflowDir, singleWorkflow) {
374
+ const workflowFilesSet = new Set();
375
+ if (singleWorkflow) {
376
+ workflowFilesSet.add(resolve(singleWorkflow));
377
+ }
378
+ else {
379
+ // Scan for workflow files - use only specific directories to avoid duplicates
380
+ const resolvedDir = resolve(workflowDir);
381
+ const scanDirs = [
382
+ join(resolvedDir, 'examples'),
383
+ join(resolvedDir, '.marktoflow', 'workflows'),
384
+ ];
385
+ // Only scan root dir if it's not going to overlap with examples/
386
+ if (!existsSync(join(resolvedDir, 'examples'))) {
387
+ scanDirs.unshift(resolvedDir);
388
+ }
389
+ for (const dir of scanDirs) {
390
+ if (existsSync(dir)) {
391
+ try {
392
+ const files = readdirSync(dir, { recursive: true });
393
+ for (const file of files) {
394
+ const filePath = typeof file === 'string' ? file : file.toString();
395
+ if (filePath.endsWith('.md') && filePath.includes('workflow')) {
396
+ // Use resolved absolute path to deduplicate
397
+ workflowFilesSet.add(resolve(join(dir, filePath)));
398
+ }
399
+ }
400
+ }
401
+ catch {
402
+ // Ignore errors scanning directories
403
+ }
404
+ }
405
+ }
406
+ }
407
+ return Array.from(workflowFilesSet);
408
+ }
409
+ /**
410
+ * Extract default inputs based on provider-specific payload structure
411
+ */
412
+ function getDefaultInputsFromPayload(payload, provider) {
413
+ if (!payload || typeof payload !== 'object') {
414
+ return {};
415
+ }
416
+ const p = payload;
417
+ if (provider === 'slack') {
418
+ const event = p.event;
419
+ if (event) {
420
+ return {
421
+ channel: event.channel,
422
+ question: event.text,
423
+ instructions: event.text,
424
+ thread_ts: event.thread_ts || event.ts,
425
+ user: event.user,
426
+ team: p.team_id,
427
+ };
428
+ }
429
+ }
430
+ if (provider === 'telegram') {
431
+ const message = p.message;
432
+ if (message) {
433
+ const chat = message.chat;
434
+ return {
435
+ chat_id: chat?.id,
436
+ question: message.text,
437
+ instructions: message.text,
438
+ message_id: message.message_id,
439
+ from: message.from,
440
+ };
441
+ }
442
+ }
443
+ if (provider === 'github') {
444
+ return {
445
+ action: p.action,
446
+ repository: p.repository?.full_name,
447
+ sender: p.sender?.login,
448
+ };
449
+ }
450
+ // Generic: pass the whole payload
451
+ return { payload: p };
452
+ }
453
+ //# sourceMappingURL=serve.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"serve.js","sourceRoot":"","sources":["../src/serve.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,43 @@
1
+ /**
2
+ * AI Agent override utilities for CLI commands
3
+ */
4
+ import type { Workflow } from '@marktoflow/core';
5
+ /** List of known AI agent SDK names */
6
+ export declare const AI_AGENT_SDKS: readonly ["claude", "claude-code", "claude-agent", "github-copilot", "copilot", "opencode", "ollama", "codex"];
7
+ export type AIAgentSDK = (typeof AI_AGENT_SDKS)[number];
8
+ /**
9
+ * Check if an SDK name is an AI agent
10
+ */
11
+ export declare function isAIAgentSDK(sdk: string): sdk is AIAgentSDK;
12
+ export interface AgentOverrideOptions {
13
+ /** Whether to show verbose output */
14
+ verbose?: boolean;
15
+ /** Whether to show debug output */
16
+ debug?: boolean;
17
+ }
18
+ export interface AgentOverrideResult {
19
+ /** Number of tools replaced */
20
+ replacedCount: number;
21
+ /** Whether a new agent tool was added */
22
+ addedNewTool: boolean;
23
+ }
24
+ /**
25
+ * Override AI agent tools in a workflow
26
+ *
27
+ * Replaces existing AI agent tools with the specified agent, or adds a new
28
+ * 'agent' tool if no AI tools exist.
29
+ */
30
+ export declare function overrideAgentInWorkflow(workflow: Workflow, sdkName: string, authConfig: Record<string, string>, options?: AgentOverrideOptions): AgentOverrideResult;
31
+ /**
32
+ * Debug log agent override configuration
33
+ */
34
+ export declare function debugLogAgentOverride(agentName: string, sdkName: string, replacedCount: number, authConfig: Record<string, string>): void;
35
+ export interface ModelOverrideResult {
36
+ /** Number of tools with model override applied */
37
+ overrideCount: number;
38
+ }
39
+ /**
40
+ * Override the model for all AI agent tools in a workflow
41
+ */
42
+ export declare function overrideModelInWorkflow(workflow: Workflow, model: string, _options?: AgentOverrideOptions): ModelOverrideResult;
43
+ //# sourceMappingURL=agent-override.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agent-override.d.ts","sourceRoot":"","sources":["../../src/utils/agent-override.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAEjD,uCAAuC;AACvC,eAAO,MAAM,aAAa,gHAShB,CAAC;AAEX,MAAM,MAAM,UAAU,GAAG,CAAC,OAAO,aAAa,CAAC,CAAC,MAAM,CAAC,CAAC;AAExD;;GAEG;AACH,wBAAgB,YAAY,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,IAAI,UAAU,CAE3D;AAED,MAAM,WAAW,oBAAoB;IACnC,qCAAqC;IACrC,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,mCAAmC;IACnC,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB;AAED,MAAM,WAAW,mBAAmB;IAClC,+BAA+B;IAC/B,aAAa,EAAE,MAAM,CAAC;IACtB,yCAAyC;IACzC,YAAY,EAAE,OAAO,CAAC;CACvB;AAED;;;;;GAKG;AACH,wBAAgB,uBAAuB,CACrC,QAAQ,EAAE,QAAQ,EAClB,OAAO,EAAE,MAAM,EACf,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,EAClC,OAAO,CAAC,EAAE,oBAAoB,GAC7B,mBAAmB,CAqCrB;AAED;;GAEG;AACH,wBAAgB,qBAAqB,CACnC,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,MAAM,EACf,aAAa,EAAE,MAAM,EACrB,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GACjC,IAAI,CAKN;AAED,MAAM,WAAW,mBAAmB;IAClC,kDAAkD;IAClD,aAAa,EAAE,MAAM,CAAC;CACvB;AAED;;GAEG;AACH,wBAAgB,uBAAuB,CACrC,QAAQ,EAAE,QAAQ,EAClB,KAAK,EAAE,MAAM,EACb,QAAQ,CAAC,EAAE,oBAAoB,GAC9B,mBAAmB,CAkBrB"}
@@ -0,0 +1,90 @@
1
+ /**
2
+ * AI Agent override utilities for CLI commands
3
+ */
4
+ import chalk from 'chalk';
5
+ /** List of known AI agent SDK names */
6
+ export const AI_AGENT_SDKS = [
7
+ 'claude',
8
+ 'claude-code',
9
+ 'claude-agent',
10
+ 'github-copilot',
11
+ 'copilot',
12
+ 'opencode',
13
+ 'ollama',
14
+ 'codex',
15
+ ];
16
+ /**
17
+ * Check if an SDK name is an AI agent
18
+ */
19
+ export function isAIAgentSDK(sdk) {
20
+ return AI_AGENT_SDKS.includes(sdk);
21
+ }
22
+ /**
23
+ * Override AI agent tools in a workflow
24
+ *
25
+ * Replaces existing AI agent tools with the specified agent, or adds a new
26
+ * 'agent' tool if no AI tools exist.
27
+ */
28
+ export function overrideAgentInWorkflow(workflow, sdkName, authConfig, options) {
29
+ const result = {
30
+ replacedCount: 0,
31
+ addedNewTool: false,
32
+ };
33
+ const toolKeys = Object.keys(workflow.tools);
34
+ for (const toolKey of toolKeys) {
35
+ const toolConfig = workflow.tools[toolKey];
36
+ if (toolConfig?.sdk && isAIAgentSDK(toolConfig.sdk)) {
37
+ // Replace SDK but keep the tool name
38
+ workflow.tools[toolKey] = {
39
+ sdk: sdkName,
40
+ auth: authConfig,
41
+ };
42
+ result.replacedCount++;
43
+ if (options?.verbose || options?.debug) {
44
+ console.log(chalk.cyan(` Replaced tool '${toolKey}' with ${sdkName}`));
45
+ }
46
+ }
47
+ }
48
+ // If no AI tools were found, add one with a common name
49
+ if (result.replacedCount === 0) {
50
+ workflow.tools['agent'] = {
51
+ sdk: sdkName,
52
+ auth: authConfig,
53
+ };
54
+ result.addedNewTool = true;
55
+ if (options?.verbose || options?.debug) {
56
+ console.log(chalk.cyan(` Added AI agent 'agent' (${sdkName})`));
57
+ }
58
+ }
59
+ return result;
60
+ }
61
+ /**
62
+ * Debug log agent override configuration
63
+ */
64
+ export function debugLogAgentOverride(agentName, sdkName, replacedCount, authConfig) {
65
+ console.log(chalk.gray('\nšŸ› Debug: AI Agent Override'));
66
+ console.log(chalk.gray(` Provider: ${agentName} -> ${sdkName}`));
67
+ console.log(chalk.gray(` Replaced ${replacedCount} existing AI tool(s)`));
68
+ console.log(chalk.gray(` Auth Config: ${JSON.stringify(authConfig, null, 2).split('\n').join('\n ')}`));
69
+ }
70
+ /**
71
+ * Override the model for all AI agent tools in a workflow
72
+ */
73
+ export function overrideModelInWorkflow(workflow, model, _options) {
74
+ const result = {
75
+ overrideCount: 0,
76
+ };
77
+ const toolKeys = Object.keys(workflow.tools);
78
+ for (const toolKey of toolKeys) {
79
+ const toolConfig = workflow.tools[toolKey];
80
+ if (toolConfig?.sdk && isAIAgentSDK(toolConfig.sdk)) {
81
+ if (!toolConfig.options) {
82
+ toolConfig.options = {};
83
+ }
84
+ toolConfig.options.model = model;
85
+ result.overrideCount++;
86
+ }
87
+ }
88
+ return result;
89
+ }
90
+ //# sourceMappingURL=agent-override.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agent-override.js","sourceRoot":"","sources":["../../src/utils/agent-override.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ /**
2
+ * CLI utility exports
3
+ */
4
+ export { parseInputPairs, debugLogInputs, validateAndApplyDefaults, printMissingInputsError, type ParseInputsOptions, type ValidateInputsResult, } from './input-parser.js';
5
+ export { AI_AGENT_SDKS, isAIAgentSDK, overrideAgentInWorkflow, debugLogAgentOverride, overrideModelInWorkflow, type AIAgentSDK, type AgentOverrideOptions, type AgentOverrideResult, type ModelOverrideResult, } from './agent-override.js';
6
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/utils/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EACL,eAAe,EACf,cAAc,EACd,wBAAwB,EACxB,uBAAuB,EACvB,KAAK,kBAAkB,EACvB,KAAK,oBAAoB,GAC1B,MAAM,mBAAmB,CAAC;AAE3B,OAAO,EACL,aAAa,EACb,YAAY,EACZ,uBAAuB,EACvB,qBAAqB,EACrB,uBAAuB,EACvB,KAAK,UAAU,EACf,KAAK,oBAAoB,EACzB,KAAK,mBAAmB,EACxB,KAAK,mBAAmB,GACzB,MAAM,qBAAqB,CAAC"}
@@ -0,0 +1,6 @@
1
+ /**
2
+ * CLI utility exports
3
+ */
4
+ export { parseInputPairs, debugLogInputs, validateAndApplyDefaults, printMissingInputsError, } from './input-parser.js';
5
+ export { AI_AGENT_SDKS, isAIAgentSDK, overrideAgentInWorkflow, debugLogAgentOverride, overrideModelInWorkflow, } from './agent-override.js';
6
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/utils/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EACL,eAAe,EACf,cAAc,EACd,wBAAwB,EACxB,uBAAuB,GAGxB,MAAM,mBAAmB,CAAC;AAE3B,OAAO,EACL,aAAa,EACb,YAAY,EACZ,uBAAuB,EACvB,qBAAqB,EACrB,uBAAuB,GAKxB,MAAM,qBAAqB,CAAC"}