@fold-run/cli 0.1.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.
Files changed (71) hide show
  1. package/README.md +157 -0
  2. package/dist/commands/create-tool.d.ts +8 -0
  3. package/dist/commands/create-tool.js +76 -0
  4. package/dist/commands/create-tool.js.map +1 -0
  5. package/dist/commands/delete.d.ts +3 -0
  6. package/dist/commands/delete.js +17 -0
  7. package/dist/commands/delete.js.map +1 -0
  8. package/dist/commands/deploy.d.ts +5 -0
  9. package/dist/commands/deploy.js +77 -0
  10. package/dist/commands/deploy.js.map +1 -0
  11. package/dist/commands/dev.d.ts +6 -0
  12. package/dist/commands/dev.js +178 -0
  13. package/dist/commands/dev.js.map +1 -0
  14. package/dist/commands/env-vars.d.ts +12 -0
  15. package/dist/commands/env-vars.js +40 -0
  16. package/dist/commands/env-vars.js.map +1 -0
  17. package/dist/commands/functions.d.ts +3 -0
  18. package/dist/commands/functions.js +26 -0
  19. package/dist/commands/functions.js.map +1 -0
  20. package/dist/commands/init.d.ts +3 -0
  21. package/dist/commands/init.js +94 -0
  22. package/dist/commands/init.js.map +1 -0
  23. package/dist/commands/login.d.ts +3 -0
  24. package/dist/commands/login.js +125 -0
  25. package/dist/commands/login.js.map +1 -0
  26. package/dist/commands/logs.d.ts +7 -0
  27. package/dist/commands/logs.js +81 -0
  28. package/dist/commands/logs.js.map +1 -0
  29. package/dist/commands/open.d.ts +3 -0
  30. package/dist/commands/open.js +24 -0
  31. package/dist/commands/open.js.map +1 -0
  32. package/dist/commands/rollback.d.ts +1 -0
  33. package/dist/commands/rollback.js +13 -0
  34. package/dist/commands/rollback.js.map +1 -0
  35. package/dist/commands/schedules.d.ts +11 -0
  36. package/dist/commands/schedules.js +49 -0
  37. package/dist/commands/schedules.js.map +1 -0
  38. package/dist/commands/secrets.d.ts +7 -0
  39. package/dist/commands/secrets.js +47 -0
  40. package/dist/commands/secrets.js.map +1 -0
  41. package/dist/commands/status.d.ts +3 -0
  42. package/dist/commands/status.js +62 -0
  43. package/dist/commands/status.js.map +1 -0
  44. package/dist/commands/tail.d.ts +4 -0
  45. package/dist/commands/tail.js +108 -0
  46. package/dist/commands/tail.js.map +1 -0
  47. package/dist/commands/templates.d.ts +8 -0
  48. package/dist/commands/templates.js +69 -0
  49. package/dist/commands/templates.js.map +1 -0
  50. package/dist/commands/webhooks.d.ts +8 -0
  51. package/dist/commands/webhooks.js +38 -0
  52. package/dist/commands/webhooks.js.map +1 -0
  53. package/dist/index.d.ts +2 -0
  54. package/dist/index.js +259 -0
  55. package/dist/index.js.map +1 -0
  56. package/dist/lib/api.d.ts +12 -0
  57. package/dist/lib/api.js +31 -0
  58. package/dist/lib/api.js.map +1 -0
  59. package/dist/lib/bundler.d.ts +10 -0
  60. package/dist/lib/bundler.js +124 -0
  61. package/dist/lib/bundler.js.map +1 -0
  62. package/dist/lib/config.d.ts +9 -0
  63. package/dist/lib/config.js +56 -0
  64. package/dist/lib/config.js.map +1 -0
  65. package/dist/lib/output.d.ts +6 -0
  66. package/dist/lib/output.js +19 -0
  67. package/dist/lib/output.js.map +1 -0
  68. package/dist/lib/prompt.d.ts +5 -0
  69. package/dist/lib/prompt.js +40 -0
  70. package/dist/lib/prompt.js.map +1 -0
  71. package/package.json +50 -0
@@ -0,0 +1,108 @@
1
+ import { requireConfig } from '../lib/config.js';
2
+ import { isJsonMode } from '../lib/output.js';
3
+ function printActivation(a) {
4
+ if (isJsonMode()) {
5
+ console.log(JSON.stringify(a));
6
+ return;
7
+ }
8
+ const status = a.status === 'success' ? '\x1b[32mOK\x1b[0m' : '\x1b[31mERR\x1b[0m';
9
+ const duration = a.duration_ms != null ? `${a.duration_ms}ms` : '-';
10
+ const httpStatus = a.response_status ?? '-';
11
+ const time = a.triggered_at.slice(0, 23);
12
+ let method = '';
13
+ let path = '';
14
+ if (a.request_headers) {
15
+ try {
16
+ const headers = JSON.parse(a.request_headers);
17
+ method = headers[':method'] ?? headers.method ?? '';
18
+ path = headers[':path'] ?? headers.path ?? '';
19
+ }
20
+ catch {
21
+ // ignore
22
+ }
23
+ }
24
+ const req = method ? ` \x1b[36m${method} ${path}\x1b[0m` : '';
25
+ console.log(`${time} ${status} ${httpStatus} ${duration} ${a.function_id}${req}`);
26
+ if (a.error_message) {
27
+ console.log(` \x1b[31m${a.error_message}\x1b[0m`);
28
+ }
29
+ if (a.logs) {
30
+ try {
31
+ const entries = JSON.parse(a.logs);
32
+ for (const entry of entries) {
33
+ console.log(` \x1b[90m${entry}\x1b[0m`);
34
+ }
35
+ }
36
+ catch {
37
+ // ignore
38
+ }
39
+ }
40
+ }
41
+ async function connectSSE(url, token) {
42
+ const res = await fetch(url, {
43
+ headers: {
44
+ Authorization: `Bearer ${token}`,
45
+ Accept: 'text/event-stream',
46
+ },
47
+ });
48
+ if (!res.ok) {
49
+ throw new Error(`[${res.status}] ${res.statusText}`);
50
+ }
51
+ if (!res.body) {
52
+ throw new Error('No response body');
53
+ }
54
+ const reader = res.body.getReader();
55
+ const decoder = new TextDecoder();
56
+ let buffer = '';
57
+ while (true) {
58
+ const { done, value } = await reader.read();
59
+ if (done)
60
+ break;
61
+ buffer += decoder.decode(value, { stream: true });
62
+ const lines = buffer.split('\n');
63
+ buffer = lines.pop() ?? '';
64
+ for (const line of lines) {
65
+ if (line.startsWith(': '))
66
+ continue; // comment (connected, ping)
67
+ if (line.startsWith('event: timeout'))
68
+ return; // server timeout, reconnect
69
+ if (line.startsWith('data: ')) {
70
+ try {
71
+ const activation = JSON.parse(line.slice(6));
72
+ printActivation(activation);
73
+ }
74
+ catch {
75
+ // skip malformed events
76
+ }
77
+ }
78
+ }
79
+ }
80
+ }
81
+ export async function tailCommand(opts) {
82
+ const config = requireConfig();
83
+ const tenantId = opts.tenant ?? config.tenantId;
84
+ const params = new URLSearchParams();
85
+ if (opts.functionId)
86
+ params.set('function_id', opts.functionId);
87
+ else if (tenantId)
88
+ params.set('tenant_id', tenantId);
89
+ const streamUrl = `${config.apiUrl}/activations/stream?${params}`;
90
+ console.log('Streaming activations in real-time... (Ctrl+C to stop)\n');
91
+ // Reconnect loop — server disconnects after ~28s
92
+ while (true) {
93
+ try {
94
+ await connectSSE(streamUrl, config.token);
95
+ }
96
+ catch (err) {
97
+ const msg = err.message;
98
+ if (msg.includes('fetch failed') || msg.includes('ECONNREFUSED')) {
99
+ console.error('Connection lost. Retrying in 3s...');
100
+ await new Promise((r) => setTimeout(r, 3000));
101
+ }
102
+ else {
103
+ throw err;
104
+ }
105
+ }
106
+ }
107
+ }
108
+ //# sourceMappingURL=tail.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tail.js","sourceRoot":"","sources":["../../src/commands/tail.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ export declare function templatesListCommand(opts: {
2
+ category?: string;
3
+ }): Promise<void>;
4
+ export declare function templatesGetCommand(nameOrId: string): Promise<void>;
5
+ export declare function templatesDeployCommand(nameOrId: string, opts: {
6
+ name?: string;
7
+ tenant?: string;
8
+ }): Promise<void>;
@@ -0,0 +1,69 @@
1
+ import { apiFetch } from '../lib/api.js';
2
+ import { loadConfig } from '../lib/config.js';
3
+ export async function templatesListCommand(opts) {
4
+ const config = loadConfig();
5
+ if (!config) {
6
+ console.log('Not logged in. Run `fold login` first.');
7
+ return;
8
+ }
9
+ try {
10
+ const params = opts.category ? `?category=${opts.category}` : '';
11
+ const data = (await apiFetch(config, `/templates${params}`));
12
+ if (!data.templates?.length) {
13
+ console.log('No templates found.');
14
+ return;
15
+ }
16
+ console.log(`Templates:\n`);
17
+ for (const t of data.templates) {
18
+ console.log(` ${t.name} [${t.category}]`);
19
+ console.log(` ${t.description}`);
20
+ console.log(` ID: ${t.id}\n`);
21
+ }
22
+ }
23
+ catch (err) {
24
+ console.error(String(err));
25
+ }
26
+ }
27
+ export async function templatesGetCommand(nameOrId) {
28
+ const config = loadConfig();
29
+ if (!config) {
30
+ console.log('Not logged in. Run `fold login` first.');
31
+ return;
32
+ }
33
+ try {
34
+ const data = (await apiFetch(config, `/templates/${nameOrId}`));
35
+ console.log(`Name: ${data.name}`);
36
+ console.log(`Category: ${data.category}`);
37
+ console.log(`Description: ${data.description}`);
38
+ console.log(`\n--- Code ---\n${data.code}\n--- End ---`);
39
+ }
40
+ catch (err) {
41
+ console.error(String(err));
42
+ }
43
+ }
44
+ export async function templatesDeployCommand(nameOrId, opts) {
45
+ const config = loadConfig();
46
+ if (!config) {
47
+ console.log('Not logged in. Run `fold login` first.');
48
+ return;
49
+ }
50
+ const tenantId = opts.tenant ?? config.tenantId;
51
+ if (!tenantId) {
52
+ console.log('Tenant ID required. Use --tenant or set in config.');
53
+ return;
54
+ }
55
+ try {
56
+ const tpl = (await apiFetch(config, `/templates/${nameOrId}`));
57
+ const functionName = opts.name ?? tpl.name;
58
+ const data = (await apiFetch(config, '/deploy', {
59
+ body: { tenant_id: tenantId, name: functionName, code: tpl.code },
60
+ }));
61
+ console.log(`Deployed template "${tpl.name}" as "${functionName}"`);
62
+ console.log(`URL: ${data.url}`);
63
+ console.log(`Version: ${data.version}`);
64
+ }
65
+ catch (err) {
66
+ console.error(String(err));
67
+ }
68
+ }
69
+ //# sourceMappingURL=templates.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"templates.js","sourceRoot":"","sources":["../../src/commands/templates.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ export declare function webhooksListCommand(opts: {
2
+ tenant?: string;
3
+ }): Promise<void>;
4
+ export declare function webhooksCreateCommand(functionId: string, path: string, opts: {
5
+ tenant?: string;
6
+ secret?: string;
7
+ }): Promise<void>;
8
+ export declare function webhooksDeleteCommand(id: string): Promise<void>;
@@ -0,0 +1,38 @@
1
+ import { apiFetch } from '../lib/api.js';
2
+ import { requireConfig } from '../lib/config.js';
3
+ export async function webhooksListCommand(opts) {
4
+ const config = requireConfig();
5
+ const qs = opts.tenant ? `?tenant_id=${opts.tenant}` : '';
6
+ const data = (await apiFetch(config, `/webhook-configs${qs}`));
7
+ if (data.webhook_configs.length === 0) {
8
+ console.log('No webhook endpoints configured.');
9
+ return;
10
+ }
11
+ console.log(`\n Webhook Endpoints\n`);
12
+ for (const w of data.webhook_configs) {
13
+ console.log(` ${w.function_name}`);
14
+ console.log(` URL: ${w.webhook_url}`);
15
+ console.log(` Path: /_hooks/${w.path}`);
16
+ console.log(` Secret: ${w.secret ? 'configured' : 'none'}`);
17
+ console.log(` ID: ${w.id}`);
18
+ console.log();
19
+ }
20
+ }
21
+ export async function webhooksCreateCommand(functionId, path, opts) {
22
+ const config = requireConfig();
23
+ const qs = opts.tenant ? `?tenant_id=${opts.tenant}` : '';
24
+ const body = { function_id: functionId, path };
25
+ if (opts.secret)
26
+ body.secret = opts.secret;
27
+ const data = (await apiFetch(config, `/webhook-configs${qs}`, { body }));
28
+ console.log(`\n Webhook created!`);
29
+ console.log(` Function: ${data.function_name}`);
30
+ console.log(` URL: ${data.webhook_url}`);
31
+ console.log(` ID: ${data.id}\n`);
32
+ }
33
+ export async function webhooksDeleteCommand(id) {
34
+ const config = requireConfig();
35
+ await apiFetch(config, `/webhook-configs/${id}`, { method: 'DELETE' });
36
+ console.log('Webhook config deleted.');
37
+ }
38
+ //# sourceMappingURL=webhooks.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"webhooks.js","sourceRoot":"","sources":["../../src/commands/webhooks.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AACzC,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAajD,MAAM,CAAC,KAAK,UAAU,mBAAmB,CAAC,IAAyB;IACjE,MAAM,MAAM,GAAG,aAAa,EAAE,CAAC;IAC/B,MAAM,EAAE,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,cAAc,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;IAC1D,MAAM,IAAI,GAAG,CAAC,MAAM,QAAQ,CAAC,MAAM,EAAE,mBAAmB,EAAE,EAAE,CAAC,CAAyC,CAAC;IAEvG,IAAI,IAAI,CAAC,eAAe,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACtC,OAAO,CAAC,GAAG,CAAC,kCAAkC,CAAC,CAAC;QAChD,OAAO;IACT,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,yBAAyB,CAAC,CAAC;IACvC,KAAK,MAAM,CAAC,IAAI,IAAI,CAAC,eAAe,EAAE,CAAC;QACrC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,aAAa,EAAE,CAAC,CAAC;QACpC,OAAO,CAAC,GAAG,CAAC,eAAe,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC;QAC5C,OAAO,CAAC,GAAG,CAAC,uBAAuB,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;QAC7C,OAAO,CAAC,GAAG,CAAC,eAAe,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC;QAC/D,OAAO,CAAC,GAAG,CAAC,eAAe,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;QACnC,OAAO,CAAC,GAAG,EAAE,CAAC;IAChB,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,qBAAqB,CACzC,UAAkB,EAClB,IAAY,EACZ,IAA0C;IAE1C,MAAM,MAAM,GAAG,aAAa,EAAE,CAAC;IAC/B,MAAM,EAAE,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,cAAc,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;IAE1D,MAAM,IAAI,GAA2B,EAAE,WAAW,EAAE,UAAU,EAAE,IAAI,EAAE,CAAC;IACvE,IAAI,IAAI,CAAC,MAAM;QAAE,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC;IAE3C,MAAM,IAAI,GAAG,CAAC,MAAM,QAAQ,CAAC,MAAM,EAAE,mBAAmB,EAAE,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC,CAAkB,CAAC;IAE1F,OAAO,CAAC,GAAG,CAAC,sBAAsB,CAAC,CAAC;IACpC,OAAO,CAAC,GAAG,CAAC,iBAAiB,IAAI,CAAC,aAAa,EAAE,CAAC,CAAC;IACnD,OAAO,CAAC,GAAG,CAAC,iBAAiB,IAAI,CAAC,WAAW,EAAE,CAAC,CAAC;IACjD,OAAO,CAAC,GAAG,CAAC,iBAAiB,IAAI,CAAC,EAAE,IAAI,CAAC,CAAC;AAC5C,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,qBAAqB,CAAC,EAAU;IACpD,MAAM,MAAM,GAAG,aAAa,EAAE,CAAC;IAC/B,MAAM,QAAQ,CAAC,MAAM,EAAE,oBAAoB,EAAE,EAAE,EAAE,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC,CAAC;IACvE,OAAO,CAAC,GAAG,CAAC,yBAAyB,CAAC,CAAC;AACzC,CAAC"}
@@ -0,0 +1,2 @@
1
+ #!/usr/bin/env node
2
+ export {};
package/dist/index.js ADDED
@@ -0,0 +1,259 @@
1
+ #!/usr/bin/env node
2
+ import { createRequire } from 'node:module';
3
+ import { Command } from 'commander';
4
+ import { createToolCommand, toolsListCommand } from './commands/create-tool.js';
5
+ import { deleteCommand } from './commands/delete.js';
6
+ import { deployCommand } from './commands/deploy.js';
7
+ import { devCommand } from './commands/dev.js';
8
+ import { envDeleteCommand, envListCommand, envSetCommand } from './commands/env-vars.js';
9
+ import { functionsCommand } from './commands/functions.js';
10
+ import { initCommand } from './commands/init.js';
11
+ import { loginCommand } from './commands/login.js';
12
+ import { logsCommand } from './commands/logs.js';
13
+ import { openCommand } from './commands/open.js';
14
+ import { rollbackCommand } from './commands/rollback.js';
15
+ import { schedulesCreateCommand, schedulesDeleteCommand, schedulesListCommand, schedulesToggleCommand, } from './commands/schedules.js';
16
+ import { secretsDeleteCommand, secretsListCommand, secretsSetCommand } from './commands/secrets.js';
17
+ import { statusCommand } from './commands/status.js';
18
+ import { tailCommand } from './commands/tail.js';
19
+ import { templatesDeployCommand, templatesGetCommand, templatesListCommand } from './commands/templates.js';
20
+ import { webhooksCreateCommand, webhooksDeleteCommand, webhooksListCommand } from './commands/webhooks.js';
21
+ import { deleteConfig, loadConfig } from './lib/config.js';
22
+ import { setJsonMode } from './lib/output.js';
23
+ const require = createRequire(import.meta.url);
24
+ const { version } = require('../package.json');
25
+ const program = new Command();
26
+ program
27
+ .name('fold')
28
+ .description('CLI for fold.run - AI-native deploy platform')
29
+ .version(version)
30
+ .option('--json', 'Output results as JSON')
31
+ .hook('preAction', (_thisCommand, actionCommand) => {
32
+ const opts = actionCommand.optsWithGlobals?.() ?? actionCommand.opts();
33
+ if (opts.json)
34
+ setJsonMode(true);
35
+ })
36
+ .configureHelp({
37
+ sortSubcommands: false,
38
+ subcommandTerm: (cmd) => cmd.name() + (cmd.usage() ? ` ${cmd.usage()}` : ''),
39
+ })
40
+ .addHelpText('beforeAll', `
41
+ \x1b[36m /\\
42
+ / \\
43
+ / /\\ \\
44
+ / / \\ \\
45
+ \\ \\ / /
46
+ \\ \\/ /
47
+ \\ /
48
+ \\/\x1b[0m \x1b[1mfold.run\x1b[0m v${version}
49
+ `)
50
+ .addHelpText('after', `
51
+ Examples:
52
+ $ fold init my-function Scaffold a new project
53
+ $ fold deploy Deploy using fold.json
54
+ $ fold deploy function.ts Deploy a specific file
55
+ $ fold dev Start local dev server (auto-reloads)
56
+ $ fold open my-function Open function URL in browser
57
+ $ fold tail -f fn-1 Stream activations in real-time
58
+ $ fold logs -F Poll activation logs
59
+ $ fold functions --json List functions as JSON
60
+ $ fold secrets set API_KEY Set a secret (masked input)`);
61
+ // ── Getting started ──────────────────────────────────────────────
62
+ program
63
+ .command('init [name]')
64
+ .description('Scaffold a new fold project')
65
+ .action((name) => initCommand({ name }));
66
+ program
67
+ .command('login')
68
+ .description('Authenticate with the fold.run API')
69
+ .option('-m, --method <method>', 'Login method: browser, email, or token')
70
+ .action(loginCommand);
71
+ program
72
+ .command('logout')
73
+ .description('Remove saved credentials')
74
+ .action(() => {
75
+ if (deleteConfig()) {
76
+ console.log('Logged out.');
77
+ }
78
+ else {
79
+ console.log('No credentials found.');
80
+ }
81
+ });
82
+ program
83
+ .command('whoami')
84
+ .description('Show current login info')
85
+ .action(() => {
86
+ const config = loadConfig();
87
+ if (!config) {
88
+ console.log('Not logged in. Run `fold login` first.');
89
+ return;
90
+ }
91
+ console.log(`API: ${config.apiUrl}`);
92
+ if (config.tenantId)
93
+ console.log(`Tenant: ${config.tenantId}`);
94
+ try {
95
+ const payload = JSON.parse(Buffer.from(config.token.split('.')[1], 'base64url').toString());
96
+ if (payload.role)
97
+ console.log(`Role: ${payload.role}`);
98
+ if (payload.tenant_id)
99
+ console.log(`JWT tenant: ${payload.tenant_id}`);
100
+ }
101
+ catch {
102
+ console.log('Token: (not a JWT)');
103
+ }
104
+ });
105
+ program
106
+ .command('status')
107
+ .description('Show current config and deployed functions')
108
+ .option('-t, --tenant <id>', 'Tenant ID')
109
+ .action(statusCommand);
110
+ // ── Deploy & manage ──────────────────────────────────────────────
111
+ program
112
+ .command('deploy [file]')
113
+ .description('Deploy a function (reads fold.json if no file given)')
114
+ .option('-n, --name <name>', 'Function name (defaults to filename)')
115
+ .option('-t, --tenant <id>', 'Tenant ID')
116
+ .option('--no-bundle', 'Skip esbuild bundling for .ts files')
117
+ .action(deployCommand);
118
+ program
119
+ .command('dev [file]')
120
+ .description('Start a local dev server with auto-reload')
121
+ .option('-p, --port <port>', 'Port to listen on', '8787')
122
+ .option('--no-bundle', 'Skip esbuild bundling for .ts files')
123
+ .option('--no-watch', 'Disable file watching and auto-reload')
124
+ .option('-e, --env <KEY=VALUE>', 'Set an env var (can be repeated; also auto-loads .env)', (v, a) => [...a, v], [])
125
+ .action(devCommand);
126
+ program
127
+ .command('functions')
128
+ .description('List deployed functions')
129
+ .option('-t, --tenant <id>', 'Tenant ID')
130
+ .action(functionsCommand);
131
+ program
132
+ .command('delete <function-id>')
133
+ .description('Delete a deployed function')
134
+ .option('-t, --tenant <id>', 'Tenant ID')
135
+ .action(deleteCommand);
136
+ program
137
+ .command('rollback <function-id> <version>')
138
+ .description('Rollback a function to a previous version')
139
+ .action(rollbackCommand);
140
+ program
141
+ .command('open <function>')
142
+ .description('Open a function URL in the browser')
143
+ .option('-t, --tenant <id>', 'Tenant ID')
144
+ .action(openCommand);
145
+ program
146
+ .command('tail')
147
+ .description('Stream activations in real-time via SSE')
148
+ .option('-f, --function-id <id>', 'Filter by function ID')
149
+ .option('-t, --tenant <id>', 'Filter by tenant ID')
150
+ .action(tailCommand);
151
+ program
152
+ .command('logs')
153
+ .description('View activation logs')
154
+ .option('-f, --function-id <id>', 'Filter by function ID')
155
+ .option('-t, --tenant <id>', 'Filter by tenant ID')
156
+ .option('-F, --follow', 'Watch for new activations')
157
+ .option('-l, --limit <n>', 'Max results')
158
+ .option('-v, --verbose', 'Show request details and console logs')
159
+ .action(logsCommand);
160
+ // ── Configuration ────────────────────────────────────────────────
161
+ const secrets = program.command('secrets').description('Manage tenant secrets');
162
+ secrets
163
+ .command('set <name>')
164
+ .description('Create or update a secret (masked input)')
165
+ .option('-t, --tenant <id>', 'Tenant ID')
166
+ .action(secretsSetCommand);
167
+ secrets
168
+ .command('list')
169
+ .description('List secrets (names only)')
170
+ .option('-t, --tenant <id>', 'Tenant ID')
171
+ .action(secretsListCommand);
172
+ secrets.command('delete <id>').description('Delete a secret by ID').action(secretsDeleteCommand);
173
+ const env = program.command('env').description('Manage function environment variables');
174
+ env
175
+ .command('set <name>')
176
+ .description('Set an environment variable')
177
+ .requiredOption('-f, --function-id <id>', 'Function ID')
178
+ .option('-v, --value <value>', 'Value inline (prompted with masked input if omitted)')
179
+ .action(envSetCommand);
180
+ env
181
+ .command('list')
182
+ .description('List environment variables')
183
+ .requiredOption('-f, --function-id <id>', 'Function ID')
184
+ .action(envListCommand);
185
+ env
186
+ .command('delete <name>')
187
+ .description('Delete an environment variable')
188
+ .requiredOption('-f, --function-id <id>', 'Function ID')
189
+ .action(envDeleteCommand);
190
+ // ── Integrations ─────────────────────────────────────────────────
191
+ const webhooks = program.command('webhooks').description('Manage webhook ingress endpoints');
192
+ webhooks
193
+ .command('list')
194
+ .description('List webhook endpoints')
195
+ .option('-t, --tenant <id>', 'Tenant ID')
196
+ .action(webhooksListCommand);
197
+ webhooks
198
+ .command('create <function-id> <path>')
199
+ .description('Create a webhook endpoint (e.g. "github-push")')
200
+ .option('-t, --tenant <id>', 'Tenant ID')
201
+ .option('-s, --secret <secret>', 'Webhook secret for X-Webhook-Secret verification')
202
+ .action(webhooksCreateCommand);
203
+ webhooks.command('delete <id>').description('Delete a webhook endpoint').action(webhooksDeleteCommand);
204
+ const schedules = program.command('schedules').description('Manage scheduled triggers');
205
+ schedules
206
+ .command('list')
207
+ .description('List scheduled triggers')
208
+ .option('-t, --tenant <id>', 'Tenant ID')
209
+ .action(schedulesListCommand);
210
+ schedules
211
+ .command('create <function-id> <cron>')
212
+ .description('Create a scheduled trigger (e.g. "*/5 * * * *")')
213
+ .option('-t, --tenant <id>', 'Tenant ID')
214
+ .action(schedulesCreateCommand);
215
+ schedules
216
+ .command('toggle <function-id>')
217
+ .description('Enable or disable a schedule')
218
+ .option('--enable', 'Enable the schedule')
219
+ .option('--disable', 'Disable the schedule')
220
+ .action(schedulesToggleCommand);
221
+ schedules.command('delete <function-id>').description('Delete a scheduled trigger').action(schedulesDeleteCommand);
222
+ // ── AI & templates ───────────────────────────────────────────────
223
+ program
224
+ .command('create-tool <name> <description>')
225
+ .description('Generate and deploy an MCP tool from a natural language description')
226
+ .option('-t, --tenant <id>', 'Tenant ID')
227
+ .option('--schema <file>', 'Path to JSON Schema file for input parameters')
228
+ .option('-y, --yes', 'Skip confirmation and deploy immediately')
229
+ .action(createToolCommand);
230
+ const tools = program.command('tools').description('Manage deployed MCP tools');
231
+ tools
232
+ .command('list')
233
+ .description('List deployed MCP tools')
234
+ .option('-t, --tenant <id>', 'Tenant ID')
235
+ .action(toolsListCommand);
236
+ const templates = program.command('templates').description('Browse and deploy from template marketplace');
237
+ templates
238
+ .command('list')
239
+ .description('List available templates')
240
+ .option('-c, --category <category>', 'Filter by category')
241
+ .action(templatesListCommand);
242
+ templates.command('get <name-or-id>').description('View template details and code').action(templatesGetCommand);
243
+ templates
244
+ .command('deploy <name-or-id>')
245
+ .description('Deploy a function from a template')
246
+ .option('-n, --name <name>', 'Function name (defaults to template name)')
247
+ .option('-t, --tenant <id>', 'Tenant ID')
248
+ .action(templatesDeployCommand);
249
+ program.parseAsync().catch((err) => {
250
+ const msg = err.message || String(err);
251
+ if (msg.includes('fetch failed') || msg.includes('ECONNREFUSED')) {
252
+ console.error(`Connection error: could not reach the API. Check your network or API URL.`);
253
+ }
254
+ else {
255
+ console.error(`Error: ${msg}`);
256
+ }
257
+ process.exit(1);
258
+ });
259
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ import type { FoldConfig } from './config.js';
2
+ export interface ApiError {
3
+ error: string;
4
+ code: string;
5
+ details?: unknown;
6
+ hint?: string;
7
+ }
8
+ export declare function apiFetch(config: FoldConfig, path: string, opts?: {
9
+ method?: string;
10
+ body?: unknown;
11
+ timeout?: number;
12
+ }): Promise<unknown>;
@@ -0,0 +1,31 @@
1
+ export async function apiFetch(config, path, opts) {
2
+ const url = `${config.apiUrl}${path}`;
3
+ const headers = {
4
+ Authorization: `Bearer ${config.token}`,
5
+ };
6
+ if (opts?.body) {
7
+ headers['Content-Type'] = 'application/json';
8
+ }
9
+ const res = await fetch(url, {
10
+ method: opts?.method ?? (opts?.body ? 'POST' : 'GET'),
11
+ headers,
12
+ body: opts?.body ? JSON.stringify(opts.body) : undefined,
13
+ signal: AbortSignal.timeout(opts?.timeout ?? 30_000),
14
+ });
15
+ // Handle non-JSON responses (e.g. 502 HTML error pages)
16
+ const contentType = res.headers.get('content-type') ?? '';
17
+ if (!contentType.includes('application/json')) {
18
+ if (!res.ok) {
19
+ throw new Error(`[${res.status}] ${res.statusText}`);
20
+ }
21
+ return await res.text();
22
+ }
23
+ const json = (await res.json());
24
+ if (!res.ok) {
25
+ const err = json;
26
+ const msg = err.hint ? `${err.error} (${err.hint})` : err.error;
27
+ throw new Error(`[${err.code ?? res.status}] ${msg}`);
28
+ }
29
+ return json;
30
+ }
31
+ //# sourceMappingURL=api.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"api.js","sourceRoot":"","sources":["../../src/lib/api.ts"],"names":[],"mappings":"AASA,MAAM,CAAC,KAAK,UAAU,QAAQ,CAC5B,MAAkB,EAClB,IAAY,EACZ,IAA4D;IAE5D,MAAM,GAAG,GAAG,GAAG,MAAM,CAAC,MAAM,GAAG,IAAI,EAAE,CAAC;IACtC,MAAM,OAAO,GAA2B;QACtC,aAAa,EAAE,UAAU,MAAM,CAAC,KAAK,EAAE;KACxC,CAAC;IACF,IAAI,IAAI,EAAE,IAAI,EAAE,CAAC;QACf,OAAO,CAAC,cAAc,CAAC,GAAG,kBAAkB,CAAC;IAC/C,CAAC;IAED,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,GAAG,EAAE;QAC3B,MAAM,EAAE,IAAI,EAAE,MAAM,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC;QACrD,OAAO;QACP,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,SAAS;QACxD,MAAM,EAAE,WAAW,CAAC,OAAO,CAAC,IAAI,EAAE,OAAO,IAAI,MAAM,CAAC;KACrD,CAAC,CAAC;IAEH,wDAAwD;IACxD,MAAM,WAAW,GAAG,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC,IAAI,EAAE,CAAC;IAC1D,IAAI,CAAC,WAAW,CAAC,QAAQ,CAAC,kBAAkB,CAAC,EAAE,CAAC;QAC9C,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC;YACZ,MAAM,IAAI,KAAK,CAAC,IAAI,GAAG,CAAC,MAAM,KAAK,GAAG,CAAC,UAAU,EAAE,CAAC,CAAC;QACvD,CAAC;QACD,OAAO,MAAM,GAAG,CAAC,IAAI,EAAE,CAAC;IAC1B,CAAC;IAED,MAAM,IAAI,GAAG,CAAC,MAAM,GAAG,CAAC,IAAI,EAAE,CAAY,CAAC;IAE3C,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC;QACZ,MAAM,GAAG,GAAG,IAAgB,CAAC;QAC7B,MAAM,GAAG,GAAG,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,KAAK,KAAK,GAAG,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC;QAChE,MAAM,IAAI,KAAK,CAAC,IAAI,GAAG,CAAC,IAAI,IAAI,GAAG,CAAC,MAAM,KAAK,GAAG,EAAE,CAAC,CAAC;IACxD,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC"}
@@ -0,0 +1,10 @@
1
+ /**
2
+ * Bundle a TypeScript/JavaScript file into a single deployable script.
3
+ * Uses esbuild for fast compilation, tree-shaking, and minification.
4
+ *
5
+ * @param entryPoint - Path to the entry file
6
+ * @param opts.dev - When true, injects the @fold-run/runtime dev shim instead of treating it as external
7
+ */
8
+ export declare function bundleFile(entryPoint: string, opts?: {
9
+ dev?: boolean;
10
+ }): Promise<string>;