@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.
- package/README.md +157 -0
- package/dist/commands/create-tool.d.ts +8 -0
- package/dist/commands/create-tool.js +76 -0
- package/dist/commands/create-tool.js.map +1 -0
- package/dist/commands/delete.d.ts +3 -0
- package/dist/commands/delete.js +17 -0
- package/dist/commands/delete.js.map +1 -0
- package/dist/commands/deploy.d.ts +5 -0
- package/dist/commands/deploy.js +77 -0
- package/dist/commands/deploy.js.map +1 -0
- package/dist/commands/dev.d.ts +6 -0
- package/dist/commands/dev.js +178 -0
- package/dist/commands/dev.js.map +1 -0
- package/dist/commands/env-vars.d.ts +12 -0
- package/dist/commands/env-vars.js +40 -0
- package/dist/commands/env-vars.js.map +1 -0
- package/dist/commands/functions.d.ts +3 -0
- package/dist/commands/functions.js +26 -0
- package/dist/commands/functions.js.map +1 -0
- package/dist/commands/init.d.ts +3 -0
- package/dist/commands/init.js +94 -0
- package/dist/commands/init.js.map +1 -0
- package/dist/commands/login.d.ts +3 -0
- package/dist/commands/login.js +125 -0
- package/dist/commands/login.js.map +1 -0
- package/dist/commands/logs.d.ts +7 -0
- package/dist/commands/logs.js +81 -0
- package/dist/commands/logs.js.map +1 -0
- package/dist/commands/open.d.ts +3 -0
- package/dist/commands/open.js +24 -0
- package/dist/commands/open.js.map +1 -0
- package/dist/commands/rollback.d.ts +1 -0
- package/dist/commands/rollback.js +13 -0
- package/dist/commands/rollback.js.map +1 -0
- package/dist/commands/schedules.d.ts +11 -0
- package/dist/commands/schedules.js +49 -0
- package/dist/commands/schedules.js.map +1 -0
- package/dist/commands/secrets.d.ts +7 -0
- package/dist/commands/secrets.js +47 -0
- package/dist/commands/secrets.js.map +1 -0
- package/dist/commands/status.d.ts +3 -0
- package/dist/commands/status.js +62 -0
- package/dist/commands/status.js.map +1 -0
- package/dist/commands/tail.d.ts +4 -0
- package/dist/commands/tail.js +108 -0
- package/dist/commands/tail.js.map +1 -0
- package/dist/commands/templates.d.ts +8 -0
- package/dist/commands/templates.js +69 -0
- package/dist/commands/templates.js.map +1 -0
- package/dist/commands/webhooks.d.ts +8 -0
- package/dist/commands/webhooks.js +38 -0
- package/dist/commands/webhooks.js.map +1 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.js +259 -0
- package/dist/index.js.map +1 -0
- package/dist/lib/api.d.ts +12 -0
- package/dist/lib/api.js +31 -0
- package/dist/lib/api.js.map +1 -0
- package/dist/lib/bundler.d.ts +10 -0
- package/dist/lib/bundler.js +124 -0
- package/dist/lib/bundler.js.map +1 -0
- package/dist/lib/config.d.ts +9 -0
- package/dist/lib/config.js +56 -0
- package/dist/lib/config.js.map +1 -0
- package/dist/lib/output.d.ts +6 -0
- package/dist/lib/output.js +19 -0
- package/dist/lib/output.js.map +1 -0
- package/dist/lib/prompt.d.ts +5 -0
- package/dist/lib/prompt.js +40 -0
- package/dist/lib/prompt.js.map +1 -0
- 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"}
|
package/dist/index.d.ts
ADDED
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>;
|
package/dist/lib/api.js
ADDED
|
@@ -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>;
|