@motherbase/cli 0.2.4 → 0.2.6
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/LICENSE +21 -0
- package/README.md +131 -18
- package/bin/motherbase.js +10 -10
- package/package.json +35 -26
- package/src/api.js +233 -229
- package/src/commands/_util.js +106 -50
- package/src/commands/backups.js +16 -0
- package/src/commands/branches.js +113 -0
- package/src/commands/completion.js +90 -0
- package/src/commands/config.js +47 -47
- package/src/commands/cron.js +65 -65
- package/src/commands/db-catalog.js +326 -0
- package/src/commands/db.js +103 -92
- package/src/commands/domains.js +124 -0
- package/src/commands/functions.js +63 -33
- package/src/commands/gen.js +63 -17
- package/src/commands/import.js +55 -35
- package/src/commands/index.js +85 -64
- package/src/commands/inspect.js +178 -41
- package/src/commands/link.js +35 -35
- package/src/commands/local.js +23 -2
- package/src/commands/login.js +39 -39
- package/src/commands/logout.js +16 -16
- package/src/commands/mcp.js +27 -9
- package/src/commands/migrate.js +207 -0
- package/src/commands/migration.js +108 -33
- package/src/commands/network.js +83 -0
- package/src/commands/orgs.js +40 -0
- package/src/commands/postgres-config.js +113 -0
- package/src/commands/projects.js +130 -125
- package/src/commands/queues.js +133 -0
- package/src/commands/realtime.js +35 -35
- package/src/commands/rls.js +176 -176
- package/src/commands/secrets.js +66 -45
- package/src/commands/signing.js +130 -0
- package/src/commands/snippets.js +44 -0
- package/src/commands/status.js +42 -42
- package/src/commands/storage.js +261 -113
- package/src/commands/test.js +9 -0
- package/src/commands/unlink.js +15 -15
- package/src/commands/users.js +142 -113
- package/src/commands/vault.js +82 -0
- package/src/commands/webhooks.js +62 -62
- package/src/commands/whoami.js +20 -20
- package/src/commands/wrappers.js +150 -0
- package/src/config.js +98 -98
- package/src/context.js +106 -102
- package/src/docs.js +68 -0
- package/src/edge-templates.js +194 -0
- package/src/format.js +92 -0
- package/src/inspect/csv.js +22 -0
- package/src/inspect/queries.js +562 -0
- package/src/main.js +224 -160
- package/src/mcp/platform-tools.js +233 -0
- package/src/mcp/protocol.js +4 -1
- package/src/mcp/storage-tools.js +93 -0
- package/src/mcp/tools.js +318 -6
- package/src/migration/commands.js +375 -0
- package/src/migration/files.js +245 -0
- package/src/prompt.js +91 -91
- package/src/storage/remote.js +62 -0
- package/src/ui.js +111 -111
- package/src/commands/migrations.js +0 -85
package/src/commands/projects.js
CHANGED
|
@@ -1,125 +1,130 @@
|
|
|
1
|
-
'use strict';
|
|
2
|
-
|
|
3
|
-
const api = require('../api');
|
|
4
|
-
const
|
|
5
|
-
const {
|
|
6
|
-
|
|
7
|
-
const
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
}
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
{ key: '
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
const
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
const
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
const
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
'
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
}
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
const api = require('../api');
|
|
4
|
+
const keys = require('./keys');
|
|
5
|
+
const { output, alias, requireArg } = require('./_util');
|
|
6
|
+
const { CliError } = require('../context');
|
|
7
|
+
const { outputFormat } = require('../format');
|
|
8
|
+
|
|
9
|
+
const LIFECYCLE = ['start', 'stop', 'restart', 'update', 'rebuild'];
|
|
10
|
+
|
|
11
|
+
function lifecycleCmd(action) {
|
|
12
|
+
return {
|
|
13
|
+
summary: `${action} a project`,
|
|
14
|
+
usage: `motherbase projects ${action} <id>`,
|
|
15
|
+
async run(ctx, args) {
|
|
16
|
+
const id = requireArg(args[0], 'id');
|
|
17
|
+
const data = await api.consoleRequest(ctx, 'POST', `/projects/${id}/${action}`);
|
|
18
|
+
output(ctx, data, (d, ui) => ui.success(`${action} → ${id}`));
|
|
19
|
+
},
|
|
20
|
+
};
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
const subcommands = {
|
|
24
|
+
list: {
|
|
25
|
+
summary: 'List all projects on the console',
|
|
26
|
+
usage: 'motherbase projects list',
|
|
27
|
+
async run(ctx) {
|
|
28
|
+
const data = await api.consoleRequest(ctx, 'GET', '/projects');
|
|
29
|
+
output(ctx, data, (rows, ui) =>
|
|
30
|
+
ui.table(Array.isArray(rows) ? rows : [], [
|
|
31
|
+
{ key: 'name', label: 'NAME' },
|
|
32
|
+
{ key: 'status', label: 'STATUS' },
|
|
33
|
+
{ key: 'domain', label: 'DOMAIN' },
|
|
34
|
+
]),
|
|
35
|
+
);
|
|
36
|
+
},
|
|
37
|
+
},
|
|
38
|
+
create: {
|
|
39
|
+
summary: 'Create a new project',
|
|
40
|
+
usage: 'motherbase projects create <name> [--domain <domain>]',
|
|
41
|
+
async run(ctx, args, flags) {
|
|
42
|
+
const name = requireArg(args[0], 'name');
|
|
43
|
+
const body = { name };
|
|
44
|
+
if (flags.domain) body.domain = flags.domain;
|
|
45
|
+
const data = await api.consoleRequest(ctx, 'POST', '/projects', { body });
|
|
46
|
+
output(ctx, data, (d, ui) => ui.success(`Created project ${name}`));
|
|
47
|
+
},
|
|
48
|
+
},
|
|
49
|
+
delete: {
|
|
50
|
+
summary: 'Delete a project (requires --confirm <name>)',
|
|
51
|
+
usage: 'motherbase projects delete <id> --confirm <name>',
|
|
52
|
+
async run(ctx, args, flags) {
|
|
53
|
+
const id = requireArg(args[0], 'id');
|
|
54
|
+
const confirm = flags.confirm;
|
|
55
|
+
if (confirm !== id) {
|
|
56
|
+
throw new CliError(`Refusing to delete. Pass --confirm ${id} to proceed.`);
|
|
57
|
+
}
|
|
58
|
+
const data = await api.consoleRequest(ctx, 'DELETE', `/projects/${id}`, { body: { confirm } });
|
|
59
|
+
output(ctx, data, (d, ui) => ui.success(`Deleted project ${id}`));
|
|
60
|
+
},
|
|
61
|
+
},
|
|
62
|
+
logs: {
|
|
63
|
+
summary: 'Show recent logs for a project',
|
|
64
|
+
usage: 'motherbase projects logs <id> [-f]',
|
|
65
|
+
async run(ctx, args, flags) {
|
|
66
|
+
const id = requireArg(args[0], 'id');
|
|
67
|
+
const fetchOnce = () => api.consoleRequest(ctx, 'GET', `/projects/${id}/logs`);
|
|
68
|
+
const data = await fetchOnce();
|
|
69
|
+
output(ctx, data, (d, ui) => {
|
|
70
|
+
if (d && d.stdout) ui.print(d.stdout);
|
|
71
|
+
if (d && d.stderr) ui.printErr(d.stderr);
|
|
72
|
+
});
|
|
73
|
+
if (flags.f && outputFormat(ctx.flags) === 'pretty') {
|
|
74
|
+
// The console logs endpoint returns a snapshot; approximate -f by polling.
|
|
75
|
+
const ui = require('../ui');
|
|
76
|
+
ui.warn('(-f) polling every 3s; Ctrl-C to stop');
|
|
77
|
+
setInterval(async () => {
|
|
78
|
+
try {
|
|
79
|
+
const next = await fetchOnce();
|
|
80
|
+
if (next && next.stdout) process.stdout.write(next.stdout);
|
|
81
|
+
} catch (e) { ui.warn(e.message); }
|
|
82
|
+
}, 3000);
|
|
83
|
+
await new Promise(() => {});
|
|
84
|
+
}
|
|
85
|
+
},
|
|
86
|
+
},
|
|
87
|
+
info: {
|
|
88
|
+
summary: 'Show project details and DNS checks',
|
|
89
|
+
usage: 'motherbase projects info <id>',
|
|
90
|
+
async run(ctx, args) {
|
|
91
|
+
const id = requireArg(args[0], 'id');
|
|
92
|
+
const list = await api.consoleRequest(ctx, 'GET', '/projects');
|
|
93
|
+
const project = (Array.isArray(list) ? list : []).find(p => p.name === id || p.id === id) || { name: id };
|
|
94
|
+
let dns = null;
|
|
95
|
+
try { dns = await api.consoleRequest(ctx, 'GET', `/projects/${id}/dns`); } catch { /* optional */ }
|
|
96
|
+
const data = { ...project, dns: dns && dns.checks };
|
|
97
|
+
output(ctx, data, (d, ui) => ui.keyValue(d));
|
|
98
|
+
},
|
|
99
|
+
},
|
|
100
|
+
limits: {
|
|
101
|
+
summary: 'Get or set per-project resource limits',
|
|
102
|
+
usage: 'motherbase projects limits <id> [--api-cpus n --api-mem mb --db-cpus n --db-mem mb --minio-cpus n --minio-mem mb]',
|
|
103
|
+
async run(ctx, args, flags) {
|
|
104
|
+
const id = requireArg(args[0], 'id');
|
|
105
|
+
const map = {
|
|
106
|
+
'api-cpus': 'apiCpus', 'api-mem': 'apiMemMb',
|
|
107
|
+
'db-cpus': 'dbCpus', 'db-mem': 'dbMemMb',
|
|
108
|
+
'minio-cpus': 'minioCpus', 'minio-mem': 'minioMemMb',
|
|
109
|
+
};
|
|
110
|
+
const body = {};
|
|
111
|
+
for (const [flag, key] of Object.entries(map)) {
|
|
112
|
+
if (flags[flag] !== undefined) body[key] = Number(flags[flag]);
|
|
113
|
+
}
|
|
114
|
+
const method = Object.keys(body).length ? 'PATCH' : 'GET';
|
|
115
|
+
const data = await api.consoleRequest(ctx, method, `/projects/${id}/limits`, method === 'PATCH' ? { body } : {});
|
|
116
|
+
output(ctx, data, (d, ui) => ui.keyValue(d || {}));
|
|
117
|
+
},
|
|
118
|
+
},
|
|
119
|
+
};
|
|
120
|
+
|
|
121
|
+
for (const action of LIFECYCLE) subcommands[action] = lifecycleCmd(action);
|
|
122
|
+
|
|
123
|
+
// Supabase's `projects api-keys`; the keys themselves live under `keys`.
|
|
124
|
+
subcommands['api-keys'] = alias(keys.subcommands.list, 'motherbase projects api-keys [--project-ref <id>]');
|
|
125
|
+
|
|
126
|
+
module.exports = {
|
|
127
|
+
summary: 'Manage projects on the Platform Console',
|
|
128
|
+
usage: 'motherbase projects <list|create|start|stop|restart|update|rebuild|delete|logs|info|limits|api-keys> ...',
|
|
129
|
+
subcommands,
|
|
130
|
+
};
|
|
@@ -0,0 +1,133 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
const api = require('../api');
|
|
4
|
+
const { output, requireArg } = require('./_util');
|
|
5
|
+
const { CliError } = require('../context');
|
|
6
|
+
|
|
7
|
+
const enc = encodeURIComponent;
|
|
8
|
+
|
|
9
|
+
function int(flag, name) {
|
|
10
|
+
if (flag === undefined) return undefined;
|
|
11
|
+
const n = Number(flag);
|
|
12
|
+
if (!Number.isInteger(n) || n < 0) throw new CliError(`--${name} must be a non-negative integer`);
|
|
13
|
+
return n;
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
function parseMessage(raw) {
|
|
17
|
+
try {
|
|
18
|
+
return JSON.parse(requireArg(raw, 'json'));
|
|
19
|
+
} catch (err) {
|
|
20
|
+
if (err instanceof CliError) throw err;
|
|
21
|
+
throw new CliError('the message must be valid JSON, e.g. \'{"task":"resize"}\'');
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
const subcommands = {
|
|
26
|
+
list: {
|
|
27
|
+
summary: 'List queues with their depth',
|
|
28
|
+
usage: 'motherbase queues list',
|
|
29
|
+
async run(ctx) {
|
|
30
|
+
const data = await api.adminRequest(ctx, 'GET', '/queues');
|
|
31
|
+
const queues = (data && data.queues) || [];
|
|
32
|
+
output(ctx, data, (_d, ui) =>
|
|
33
|
+
ui.table(queues, [
|
|
34
|
+
{ key: 'name', label: 'NAME' },
|
|
35
|
+
{ key: 'type', label: 'TYPE' },
|
|
36
|
+
{ key: 'length', label: 'MESSAGES' },
|
|
37
|
+
{ key: 'visibleLength', label: 'VISIBLE' },
|
|
38
|
+
{ key: 'totalMessages', label: 'TOTAL' },
|
|
39
|
+
]),
|
|
40
|
+
);
|
|
41
|
+
},
|
|
42
|
+
},
|
|
43
|
+
enable: {
|
|
44
|
+
summary: 'Install pgmq for this project',
|
|
45
|
+
usage: 'motherbase queues enable',
|
|
46
|
+
async run(ctx) {
|
|
47
|
+
const data = await api.adminRequest(ctx, 'POST', '/queues/enable');
|
|
48
|
+
output(ctx, data, (_d, ui) => ui.success('Queues enabled'));
|
|
49
|
+
},
|
|
50
|
+
},
|
|
51
|
+
expose: {
|
|
52
|
+
summary: 'Expose queues to the client SDK through pgmq_public (or hide them)',
|
|
53
|
+
usage: 'motherbase queues expose <true|false>',
|
|
54
|
+
async run(ctx, args) {
|
|
55
|
+
const value = requireArg(args[0], 'true|false');
|
|
56
|
+
if (value !== 'true' && value !== 'false') throw new CliError('expected true or false');
|
|
57
|
+
const data = await api.adminRequest(ctx, 'PUT', '/queues/expose', { body: { enabled: value === 'true' } });
|
|
58
|
+
output(ctx, data, (_d, ui) => ui.success(`Queues ${value === 'true' ? 'exposed' : 'hidden'}`));
|
|
59
|
+
},
|
|
60
|
+
},
|
|
61
|
+
create: {
|
|
62
|
+
summary: 'Create a queue',
|
|
63
|
+
usage: 'motherbase queues create <name> [--type basic|unlogged|partitioned] [--rls true|false]',
|
|
64
|
+
async run(ctx, args, flags) {
|
|
65
|
+
const name = requireArg(args[0], 'name');
|
|
66
|
+
const body = { name };
|
|
67
|
+
if (flags.type) body.type = flags.type;
|
|
68
|
+
if (flags.rls !== undefined) body.rls = flags.rls === true || flags.rls === 'true';
|
|
69
|
+
const data = await api.adminRequest(ctx, 'POST', '/queues', { body });
|
|
70
|
+
output(ctx, data, (_d, ui) => ui.success(`Created queue ${name}`));
|
|
71
|
+
},
|
|
72
|
+
},
|
|
73
|
+
drop: {
|
|
74
|
+
summary: 'Drop a queue and its messages',
|
|
75
|
+
usage: 'motherbase queues drop <name>',
|
|
76
|
+
async run(ctx, args) {
|
|
77
|
+
const name = requireArg(args[0], 'name');
|
|
78
|
+
const data = await api.adminRequest(ctx, 'DELETE', `/queues/${enc(name)}`);
|
|
79
|
+
output(ctx, data, (_d, ui) => ui.success(`Dropped queue ${name}`));
|
|
80
|
+
},
|
|
81
|
+
},
|
|
82
|
+
send: {
|
|
83
|
+
summary: 'Send a JSON message',
|
|
84
|
+
usage: "motherbase queues send <name> '<json>' [--delay seconds]",
|
|
85
|
+
async run(ctx, args, flags) {
|
|
86
|
+
const name = requireArg(args[0], 'name');
|
|
87
|
+
const body = { message: parseMessage(args[1]) };
|
|
88
|
+
const delay = int(flags.delay, 'delay');
|
|
89
|
+
if (delay !== undefined) body.delay = delay;
|
|
90
|
+
const data = await api.adminRequest(ctx, 'POST', `/queues/${enc(name)}/messages`, { body });
|
|
91
|
+
output(ctx, data, (d, ui) => ui.success(`Sent message ${((d && d.msgIds) || []).join(', ')}`));
|
|
92
|
+
},
|
|
93
|
+
},
|
|
94
|
+
read: {
|
|
95
|
+
summary: 'Read messages, hiding them from other readers for the visibility timeout',
|
|
96
|
+
usage: 'motherbase queues read <name> [--qty 1] [--vt 30]',
|
|
97
|
+
async run(ctx, args, flags) {
|
|
98
|
+
const name = requireArg(args[0], 'name');
|
|
99
|
+
const body = {};
|
|
100
|
+
const qty = int(flags.qty, 'qty');
|
|
101
|
+
const vt = int(flags.vt, 'vt');
|
|
102
|
+
if (qty !== undefined) body.qty = qty;
|
|
103
|
+
if (vt !== undefined) body.vt = vt;
|
|
104
|
+
const data = await api.adminRequest(ctx, 'POST', `/queues/${enc(name)}/read`, { body });
|
|
105
|
+
output(ctx, data, (d, ui) => ui.json((d && d.messages) || []));
|
|
106
|
+
},
|
|
107
|
+
},
|
|
108
|
+
archive: {
|
|
109
|
+
summary: 'Move a message to the archive',
|
|
110
|
+
usage: 'motherbase queues archive <name> <msg-id>',
|
|
111
|
+
async run(ctx, args) {
|
|
112
|
+
const name = requireArg(args[0], 'name');
|
|
113
|
+
const id = requireArg(args[1], 'msg-id');
|
|
114
|
+
const data = await api.adminRequest(ctx, 'POST', `/queues/${enc(name)}/messages/${enc(id)}/archive`);
|
|
115
|
+
output(ctx, data, (_d, ui) => ui.success(`Archived message ${id}`));
|
|
116
|
+
},
|
|
117
|
+
},
|
|
118
|
+
purge: {
|
|
119
|
+
summary: 'Delete every message in a queue',
|
|
120
|
+
usage: 'motherbase queues purge <name>',
|
|
121
|
+
async run(ctx, args) {
|
|
122
|
+
const name = requireArg(args[0], 'name');
|
|
123
|
+
const data = await api.adminRequest(ctx, 'POST', `/queues/${enc(name)}/purge`);
|
|
124
|
+
output(ctx, data, (d, ui) => ui.success(`Purged ${(d && d.purged) ?? 0} messages from ${name}`));
|
|
125
|
+
},
|
|
126
|
+
},
|
|
127
|
+
};
|
|
128
|
+
|
|
129
|
+
module.exports = {
|
|
130
|
+
summary: 'Message queues (pgmq)',
|
|
131
|
+
usage: 'motherbase queues <list|enable|expose|create|drop|send|read|archive|purge> ...',
|
|
132
|
+
subcommands,
|
|
133
|
+
};
|
package/src/commands/realtime.js
CHANGED
|
@@ -1,35 +1,35 @@
|
|
|
1
|
-
'use strict';
|
|
2
|
-
|
|
3
|
-
const api = require('../api');
|
|
4
|
-
const { output } = require('./_util');
|
|
5
|
-
|
|
6
|
-
const subcommands = {
|
|
7
|
-
config: {
|
|
8
|
-
summary: 'Show realtime config, or set enabled models with --models a,b,c',
|
|
9
|
-
usage: 'motherbase realtime config [--models a,b,c]',
|
|
10
|
-
async run(ctx, args, flags) {
|
|
11
|
-
if (flags.models !== undefined) {
|
|
12
|
-
const models = String(flags.models).split(',').map(s => s.trim()).filter(Boolean);
|
|
13
|
-
const data = await api.adminRequest(ctx, 'PATCH', '/realtime/config', { body: { models } });
|
|
14
|
-
output(ctx, data, (d, ui) => ui.success(`Enabled models: ${(d && d.models ? d.models : models).join(', ') || '(none)'}`));
|
|
15
|
-
return;
|
|
16
|
-
}
|
|
17
|
-
const data = await api.adminRequest(ctx, 'GET', '/realtime/config');
|
|
18
|
-
output(ctx, data, (d, ui) => ui.keyValue(d || {}));
|
|
19
|
-
},
|
|
20
|
-
},
|
|
21
|
-
channels: {
|
|
22
|
-
summary: 'List active realtime channels',
|
|
23
|
-
usage: 'motherbase realtime channels',
|
|
24
|
-
async run(ctx) {
|
|
25
|
-
const data = await api.adminRequest(ctx, 'GET', '/realtime/channels');
|
|
26
|
-
output(ctx, data, (d, ui) => ui.json((d && d.channels) || d));
|
|
27
|
-
},
|
|
28
|
-
},
|
|
29
|
-
};
|
|
30
|
-
|
|
31
|
-
module.exports = {
|
|
32
|
-
summary: 'Realtime configuration and channels',
|
|
33
|
-
usage: 'motherbase realtime <config|channels> ...',
|
|
34
|
-
subcommands,
|
|
35
|
-
};
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
const api = require('../api');
|
|
4
|
+
const { output } = require('./_util');
|
|
5
|
+
|
|
6
|
+
const subcommands = {
|
|
7
|
+
config: {
|
|
8
|
+
summary: 'Show realtime config, or set enabled models with --models a,b,c',
|
|
9
|
+
usage: 'motherbase realtime config [--models a,b,c]',
|
|
10
|
+
async run(ctx, args, flags) {
|
|
11
|
+
if (flags.models !== undefined) {
|
|
12
|
+
const models = String(flags.models).split(',').map(s => s.trim()).filter(Boolean);
|
|
13
|
+
const data = await api.adminRequest(ctx, 'PATCH', '/realtime/config', { body: { models } });
|
|
14
|
+
output(ctx, data, (d, ui) => ui.success(`Enabled models: ${(d && d.models ? d.models : models).join(', ') || '(none)'}`));
|
|
15
|
+
return;
|
|
16
|
+
}
|
|
17
|
+
const data = await api.adminRequest(ctx, 'GET', '/realtime/config');
|
|
18
|
+
output(ctx, data, (d, ui) => ui.keyValue(d || {}));
|
|
19
|
+
},
|
|
20
|
+
},
|
|
21
|
+
channels: {
|
|
22
|
+
summary: 'List active realtime channels',
|
|
23
|
+
usage: 'motherbase realtime channels',
|
|
24
|
+
async run(ctx) {
|
|
25
|
+
const data = await api.adminRequest(ctx, 'GET', '/realtime/channels');
|
|
26
|
+
output(ctx, data, (d, ui) => ui.json((d && d.channels) || d));
|
|
27
|
+
},
|
|
28
|
+
},
|
|
29
|
+
};
|
|
30
|
+
|
|
31
|
+
module.exports = {
|
|
32
|
+
summary: 'Realtime configuration and channels',
|
|
33
|
+
usage: 'motherbase realtime <config|channels> ...',
|
|
34
|
+
subcommands,
|
|
35
|
+
};
|