@realtimex/sdk 1.4.0 → 1.4.3

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.
@@ -0,0 +1,492 @@
1
+ #!/usr/bin/env node
2
+ 'use strict';
3
+ /**
4
+ * rtx.js — RealTimeX SDK CLI (source-verified)
5
+ * AUTO-GENERATED by scripts/generate-skill.mjs — do not edit by hand.
6
+ *
7
+ * All method signatures derived from the @realtimex/sdk TypeScript source.
8
+ *
9
+ * Usage: node rtx.js <command> [args...] [--flags]
10
+ * Global flags:
11
+ * --api-key=<key> Override API key
12
+ * --env-dir=<path> Directory containing .env (default: cwd)
13
+ * --url=<url> RealTimeX server URL (default: http://localhost:3001)
14
+ */
15
+
16
+ const path = require('path');
17
+ const { initSDK } = require('./lib/sdk-init');
18
+
19
+ // ---------------------------------------------------------------------------
20
+ // Arg parsing
21
+ // ---------------------------------------------------------------------------
22
+ function parseArgs(argv) {
23
+ const flags = {}, positional = [];
24
+ for (const arg of argv) {
25
+ if (arg.startsWith('--')) {
26
+ const [k, ...rest] = arg.slice(2).split('=');
27
+ flags[k] = rest.length ? rest.join('=') : true;
28
+ } else { positional.push(arg); }
29
+ }
30
+ return { flags, positional };
31
+ }
32
+ const { flags, positional } = parseArgs(process.argv.slice(2));
33
+ const [command, ...cmdArgs] = positional;
34
+
35
+ // ---------------------------------------------------------------------------
36
+ // Helpers
37
+ // ---------------------------------------------------------------------------
38
+ function print(obj) { console.log(JSON.stringify(obj, null, 2)); }
39
+ function printTable(rows, cols) {
40
+ if (!rows?.length) { console.log('(no results)'); return; }
41
+ const keys = cols || Object.keys(rows[0]);
42
+ const widths = keys.map(k => Math.max(k.length, ...rows.map(r => String(r[k] ?? '').length)));
43
+ const pad = (s, w) => String(s ?? '').padEnd(w);
44
+ console.log(keys.map((k, i) => pad(k, widths[i])).join(' '));
45
+ console.log(widths.map(w => '-'.repeat(w)).join(' '));
46
+ for (const r of rows) console.log(keys.map((k, i) => pad(r[k], widths[i])).join(' '));
47
+ }
48
+
49
+ let _sdk = null;
50
+ async function getSDK() {
51
+ if (_sdk) return _sdk;
52
+ _sdk = await initSDK({ envDir: flags['env-dir'] || process.cwd(), apiKey: flags['api-key'], url: flags['url'] });
53
+ return _sdk;
54
+ }
55
+
56
+ // ---------------------------------------------------------------------------
57
+ // Commands
58
+ // ---------------------------------------------------------------------------
59
+ const CMD = {};
60
+
61
+ // -- ping -------------------------------------------------------------------
62
+ // Source: index.ts → sdk.ping() → { success, mode, appId, timestamp }
63
+ CMD.ping = async () => { const { sdk } = await getSDK(); print(await sdk.ping()); };
64
+
65
+ // -- info -------------------------------------------------------------------
66
+ CMD.info = async () => {
67
+ const { sdk, apiKey } = await getSDK();
68
+ console.log('API key: ' + apiKey.slice(0, 8) + '...');
69
+ try { console.log('Data dir: ' + await sdk.getAppDataDir()); } catch (_) {}
70
+ print(await sdk.ping());
71
+ };
72
+
73
+ // -- agents -----------------------------------------------------------------
74
+ // Source: modules/api.ts → ApiModule.getAgents() → Agent[]
75
+ // Agent: { slug, name, description?, hub_id? }
76
+ // NOTE: on sdk.api, NOT sdk directly
77
+ CMD.agents = async () => {
78
+ const { sdk } = await getSDK();
79
+ printTable(await sdk.api.getAgents(), ['slug', 'name', 'description']);
80
+ };
81
+
82
+ // -- workspaces -------------------------------------------------------------
83
+ // Source: ApiModule.getWorkspaces() → Workspace[] { id, slug, name, type }
84
+ CMD.workspaces = async () => {
85
+ const { sdk } = await getSDK();
86
+ printTable(await sdk.api.getWorkspaces(), ['id', 'slug', 'name', 'type']);
87
+ };
88
+
89
+ // -- threads ----------------------------------------------------------------
90
+ // Source: ApiModule.getThreads(workspaceSlug) → Thread[] { id, slug, name }
91
+ CMD.threads = async () => {
92
+ const [slug] = cmdArgs;
93
+ if (!slug) { console.error('Usage: rtx.js threads <workspace-slug>'); process.exit(1); }
94
+ const { sdk } = await getSDK();
95
+ printTable(await sdk.api.getThreads(slug), ['id', 'slug', 'name']);
96
+ };
97
+
98
+ // -- task -------------------------------------------------------------------
99
+ // Source: ApiModule.getTask(taskUuid) → Task { uuid, title, status, ..., runs }
100
+ CMD.task = async () => {
101
+ const [uuid] = cmdArgs;
102
+ if (!uuid) { console.error('Usage: rtx.js task <uuid>'); process.exit(1); }
103
+ const { sdk } = await getSDK();
104
+ print(await sdk.api.getTask(uuid));
105
+ };
106
+
107
+ // -- activities -------------------------------------------------------------
108
+ // Source: ActivitiesModule.list(options?) → Activity[] (direct array, NOT { activities: [...] })
109
+ CMD.activities = async () => {
110
+ const { sdk } = await getSDK();
111
+ const opts = {};
112
+ if (flags.status) opts.status = flags.status;
113
+ if (flags.limit) opts.limit = Number(flags.limit);
114
+ if (flags.offset) opts.offset = Number(flags.offset);
115
+ print(await sdk.activities.list(opts));
116
+ };
117
+
118
+ // -- activity-get -----------------------------------------------------------
119
+ // Source: ActivitiesModule.get(id) → Activity | null
120
+ CMD['activity-get'] = async () => {
121
+ const [id] = cmdArgs;
122
+ if (!id) { console.error('Usage: rtx.js activity-get <id>'); process.exit(1); }
123
+ const { sdk } = await getSDK();
124
+ print(await sdk.activities.get(id));
125
+ };
126
+
127
+ // -- activity-create --------------------------------------------------------
128
+ // Source: ActivitiesModule.insert(rawData: Record<string,unknown>) → Activity
129
+ // rawData is your payload; SDK wraps it in { raw_data: rawData } automatically.
130
+ CMD['activity-create'] = async () => {
131
+ const [jsonStr] = cmdArgs;
132
+ if (!jsonStr) { console.error('Usage: rtx.js activity-create <json-payload>'); process.exit(1); }
133
+ const { sdk } = await getSDK();
134
+ print(await sdk.activities.insert(JSON.parse(jsonStr)));
135
+ };
136
+
137
+ // -- activity-update --------------------------------------------------------
138
+ // Source: ActivitiesModule.update(id, updates: Partial<Activity>) → Activity
139
+ CMD['activity-update'] = async () => {
140
+ const [id, jsonStr] = cmdArgs;
141
+ if (!id || !jsonStr) { console.error('Usage: rtx.js activity-update <id> <json-updates>'); process.exit(1); }
142
+ const { sdk } = await getSDK();
143
+ print(await sdk.activities.update(id, JSON.parse(jsonStr)));
144
+ };
145
+
146
+ // -- activity-delete --------------------------------------------------------
147
+ // Source: ActivitiesModule.delete(id) → void
148
+ CMD['activity-delete'] = async () => {
149
+ const [id] = cmdArgs;
150
+ if (!id) { console.error('Usage: rtx.js activity-delete <id>'); process.exit(1); }
151
+ const { sdk } = await getSDK();
152
+ await sdk.activities.delete(id);
153
+ console.log('Deleted.');
154
+ };
155
+
156
+ // -- task-start / task-complete / task-fail ---------------------------------
157
+ // Source: modules/task.ts
158
+ // CORRECT signatures (positional, NOT { task_uuid } object):
159
+ // start(taskUuid, machineIdOrOptions?)
160
+ // complete(taskUuid, result?, machineIdOrOptions?)
161
+ // fail(taskUuid, error: string, machineIdOrOptions?)
162
+ CMD['task-start'] = async () => {
163
+ const [uuid] = cmdArgs;
164
+ if (!uuid) { console.error('Usage: rtx.js task-start <uuid> [--machine=<id>]'); process.exit(1); }
165
+ const { sdk } = await getSDK();
166
+ print(await sdk.task.start(uuid, flags.machine ? { machineId: flags.machine } : undefined));
167
+ };
168
+ CMD['task-complete'] = async () => {
169
+ const [uuid, resultStr] = cmdArgs;
170
+ if (!uuid) { console.error('Usage: rtx.js task-complete <uuid> [<result-json>] [--machine=<id>]'); process.exit(1); }
171
+ const { sdk } = await getSDK();
172
+ print(await sdk.task.complete(uuid, resultStr ? JSON.parse(resultStr) : {}, flags.machine ? { machineId: flags.machine } : undefined));
173
+ };
174
+ CMD['task-fail'] = async () => {
175
+ const [uuid, ...errParts] = cmdArgs;
176
+ const errMsg = errParts.join(' ');
177
+ if (!uuid || !errMsg) { console.error('Usage: rtx.js task-fail <uuid> <error-message>'); process.exit(1); }
178
+ const { sdk } = await getSDK();
179
+ print(await sdk.task.fail(uuid, errMsg, flags.machine ? { machineId: flags.machine } : undefined));
180
+ };
181
+ CMD['task-progress'] = async () => {
182
+ const [uuid, dataStr] = cmdArgs;
183
+ if (!uuid) { console.error('Usage: rtx.js task-progress <uuid> [<progress-json>]'); process.exit(1); }
184
+ const { sdk } = await getSDK();
185
+ print(await sdk.task.progress(uuid, dataStr ? JSON.parse(dataStr) : {}));
186
+ };
187
+ CMD['task-cancel'] = async () => {
188
+ const [uuid, ...reasonParts] = cmdArgs;
189
+ if (!uuid) { console.error('Usage: rtx.js task-cancel <uuid> [<reason>]'); process.exit(1); }
190
+ const { sdk } = await getSDK();
191
+ print(await sdk.task.cancel(uuid, reasonParts.join(' ') || undefined));
192
+ };
193
+
194
+ // -- trigger-agent ----------------------------------------------------------
195
+ // IMPORTANT: sdk.webhook.triggerAgent() sends event "task.trigger" which the
196
+ // server rejects (expects "trigger-agent"). This command bypasses the SDK
197
+ // method and uses a direct fetch call with the correct event string.
198
+ // Source evidence: modules/webhook.ts hardcodes event: 'task.trigger'
199
+ // server/endpoints/sdk/webhook.js enum: ['trigger-agent',...]
200
+ CMD['trigger-agent'] = async () => {
201
+ const [agentName, workspaceSlug, ...promptParts] = cmdArgs;
202
+ const prompt = promptParts.join(' ');
203
+ if (!agentName || !workspaceSlug || !prompt) {
204
+ console.error('Usage: rtx.js trigger-agent <agent-name> <workspace-slug> <prompt> [--thread=<slug>] [--data=<json>]');
205
+ process.exit(1);
206
+ }
207
+ const { apiKey } = await getSDK();
208
+ const resp = await fetch('http://localhost:3001/webhooks/realtimex', {
209
+ method: 'POST',
210
+ headers: { 'Content-Type': 'application/json', Authorization: 'Bearer ' + apiKey },
211
+ body: JSON.stringify({
212
+ event: 'trigger-agent',
213
+ payload: {
214
+ auto_run: true,
215
+ agent_name: agentName,
216
+ workspace_slug: workspaceSlug,
217
+ thread_slug: flags.thread || undefined,
218
+ prompt,
219
+ raw_data: flags.data ? JSON.parse(flags.data) : {},
220
+ },
221
+ }),
222
+ });
223
+ print(await resp.json());
224
+ };
225
+
226
+ // -- webhook-ping -----------------------------------------------------------
227
+ // Source: WebhookModule.ping() → sends event: 'system.ping' (accepted by server)
228
+ CMD['webhook-ping'] = async () => {
229
+ const { sdk } = await getSDK();
230
+ print(await sdk.webhook.ping());
231
+ };
232
+
233
+ // -- llm-providers ----------------------------------------------------------
234
+ // Source: LLMModule.chatProviders() → { success, providers: [{ provider, models }] }
235
+ CMD['llm-providers'] = async () => {
236
+ const { sdk } = await getSDK();
237
+ const { providers } = await sdk.llm.chatProviders();
238
+ for (const p of (providers || [])) {
239
+ console.log('\nProvider: ' + p.provider);
240
+ if (p.models?.length) printTable(p.models, ['id', 'name']);
241
+ }
242
+ };
243
+ CMD['embed-providers'] = async () => {
244
+ const { sdk } = await getSDK();
245
+ const { providers } = await sdk.llm.embedProviders();
246
+ for (const p of (providers || [])) {
247
+ console.log('\nProvider: ' + p.provider);
248
+ if (p.models?.length) printTable(p.models, ['id', 'name']);
249
+ }
250
+ };
251
+
252
+ // -- llm-chat ---------------------------------------------------------------
253
+ // Source: LLMModule.chat() → ChatResponse { success, response?: { content, model, metrics } }
254
+ // Access text via res.response?.content (NOT choices[0].message.content)
255
+ // Stream: yields StreamChunk { textResponse?, close?, error? } (NOT delta.content)
256
+ CMD['llm-chat'] = async () => {
257
+ const message = cmdArgs.join(' ');
258
+ if (!message) { console.error('Usage: rtx.js llm-chat <message> [--stream] [--model=<m>] [--provider=<p>]'); process.exit(1); }
259
+ const { sdk } = await getSDK();
260
+ const opts = {};
261
+ if (flags.model) opts.model = flags.model;
262
+ if (flags.provider) opts.provider = flags.provider;
263
+ if (flags.stream) {
264
+ for await (const chunk of sdk.llm.chatStream([{ role: 'user', content: message }], opts)) {
265
+ if (chunk.textResponse) process.stdout.write(chunk.textResponse);
266
+ if (chunk.close) break;
267
+ }
268
+ process.stdout.write('\n');
269
+ } else {
270
+ const res = await sdk.llm.chat([{ role: 'user', content: message }], opts);
271
+ console.log(res.response?.content ?? res.error ?? JSON.stringify(res));
272
+ }
273
+ };
274
+
275
+ // -- llm-embed --------------------------------------------------------------
276
+ // Source: LLMModule.embed(input: string | string[], options?)
277
+ // Returns: EmbedResponse { success, embeddings: number[][], model, dimensions }
278
+ CMD['llm-embed'] = async () => {
279
+ const text = cmdArgs.join(' ');
280
+ if (!text) { console.error('Usage: rtx.js llm-embed <text> [--model=<m>]'); process.exit(1); }
281
+ const { sdk } = await getSDK();
282
+ const res = await sdk.llm.embed(text, { model: flags.model, provider: flags.provider });
283
+ console.log('success: ' + res.success + ', model: ' + res.model + ', dimensions: ' + res.dimensions);
284
+ if (flags.vectors && res.embeddings?.[0]) print(res.embeddings[0].slice(0, 10));
285
+ };
286
+
287
+ // -- mcp-servers ------------------------------------------------------------
288
+ // Source: MCPModule.getServers(provider?: 'local'|'remote'|'all')
289
+ // CORRECT: plain string arg, NOT { provider: 'all' }
290
+ CMD['mcp-servers'] = async () => {
291
+ const { sdk } = await getSDK();
292
+ printTable(await sdk.mcp.getServers(flags.provider || 'all'), ['name', 'provider', 'status']);
293
+ };
294
+ CMD['mcp-tools'] = async () => {
295
+ const [name] = cmdArgs;
296
+ if (!name) { console.error('Usage: rtx.js mcp-tools <server-name> [--provider=local|remote]'); process.exit(1); }
297
+ const { sdk } = await getSDK();
298
+ printTable(await sdk.mcp.getTools(name, flags.provider), ['name', 'description']);
299
+ };
300
+ CMD['mcp-exec'] = async () => {
301
+ const [server, tool, argsStr] = cmdArgs;
302
+ if (!server || !tool) { console.error('Usage: rtx.js mcp-exec <server> <tool> [<args-json>] [--provider=local|remote]'); process.exit(1); }
303
+ const { sdk } = await getSDK();
304
+ print(await sdk.mcp.executeTool(server, tool, argsStr ? JSON.parse(argsStr) : {}, flags.provider));
305
+ };
306
+
307
+ // -- acp-agents -------------------------------------------------------------
308
+ // Source: AcpAgentModule.listAgents({ includeModels? })
309
+ // Returns: AcpAgentInfo[] { id, label, handles[], installed, authReady, status }
310
+ CMD['acp-agents'] = async () => {
311
+ const { sdk } = await getSDK();
312
+ printTable(await sdk.acpAgent.listAgents({ includeModels: flags.models === 'true' }), ['id', 'label', 'status', 'authReady', 'installed']);
313
+ };
314
+ CMD['acp-sessions'] = async () => {
315
+ const { sdk } = await getSDK();
316
+ print(await sdk.acpAgent.listSessions());
317
+ };
318
+
319
+ // -- acp-chat ---------------------------------------------------------------
320
+ // Source: AcpAgentModule.createSession + streamChat
321
+ // approvalPolicy: 'approve-all' | 'approve-reads' | 'deny-all'
322
+ // StreamEvent types: text_delta | status | tool_call | permission_request | done | error | close
323
+ // text_delta.data.type === 'thinking' → internal reasoning (not final output)
324
+ CMD['acp-chat'] = async () => {
325
+ const [agentId, ...msgParts] = cmdArgs;
326
+ const message = msgParts.join(' ');
327
+ if (!agentId || !message) {
328
+ console.error('Usage: rtx.js acp-chat <agent-id> <message> [--cwd=<path>] [--model=<m>] [--policy=approve-all]');
329
+ process.exit(1);
330
+ }
331
+ const { sdk } = await getSDK();
332
+ const sessionOpts = { agent_id: agentId, cwd: flags.cwd || process.cwd(), approvalPolicy: flags.policy || 'approve-all' };
333
+ if (flags.model) sessionOpts.model = flags.model;
334
+ process.stderr.write('Creating ACP session for "' + agentId + '"...\n');
335
+ const session = await sdk.acpAgent.createSession(sessionOpts);
336
+ try {
337
+ for await (const event of sdk.acpAgent.streamChat(session.session_key, message)) {
338
+ if (event.type === 'text_delta') {
339
+ if (event.data.type === 'thinking') { if (flags.thoughts) process.stderr.write('[thought] ' + event.data.text + '\n'); }
340
+ else process.stdout.write(String(event.data.text ?? ''));
341
+ } else if (event.type === 'tool_call') {
342
+ if (!flags.quiet) process.stderr.write('\n[tool: ' + event.data.tool + ']\n');
343
+ } else if (event.type === 'error') {
344
+ process.stderr.write('\nError: ' + event.data.message + '\n');
345
+ } else if (event.type === 'done' || event.type === 'close') {
346
+ process.stdout.write('\n');
347
+ }
348
+ }
349
+ } finally { await sdk.acpAgent.closeSession(session.session_key).catch(() => {}); }
350
+ };
351
+
352
+ // -- tts-providers / stt-providers ------------------------------------------
353
+ CMD['tts-providers'] = async () => { const { sdk } = await getSDK(); printTable(await sdk.tts.listProviders(), ['id', 'name', 'type', 'configured', 'supportsStreaming']); };
354
+ CMD['stt-providers'] = async () => { const { sdk } = await getSDK(); print(await sdk.stt.listProviders()); };
355
+
356
+ // -- vectors ----------------------------------------------------------------
357
+ // Source: LLMModule.vectors (VectorStore sub-module)
358
+ CMD['vectors-workspaces'] = async () => { const { sdk } = await getSDK(); print(await sdk.llm.vectors.listWorkspaces()); };
359
+ // llm.search() embeds query then calls vectors.query() — high-level helper
360
+ CMD['vectors-query'] = async () => {
361
+ const query = cmdArgs.join(' ');
362
+ if (!query) { console.error('Usage: rtx.js vectors-query <query> [--workspace-id=<id>] [--top=5]'); process.exit(1); }
363
+ const { sdk } = await getSDK();
364
+ print(await sdk.llm.search(query, { topK: flags.top ? Number(flags.top) : 5, workspaceId: flags['workspace-id'] }));
365
+ };
366
+ // vectors.upsert: VectorRecord[] = { id, vector: number[], metadata? }
367
+ CMD['vectors-upsert'] = async () => {
368
+ const [jsonStr] = cmdArgs;
369
+ if (!jsonStr) { console.error('Usage: rtx.js vectors-upsert <json-VectorRecord[]> [--workspace-id=<id>]'); process.exit(1); }
370
+ const { sdk } = await getSDK();
371
+ print(await sdk.llm.vectors.upsert(JSON.parse(jsonStr), { workspaceId: flags['workspace-id'] }));
372
+ };
373
+ // vectors.delete requires { deleteAll: true } — partial delete by ID not supported
374
+ CMD['vectors-delete'] = async () => {
375
+ if (!flags['workspace-id'] && !flags.all) { console.error('Usage: rtx.js vectors-delete --workspace-id=<id> OR --all'); process.exit(1); }
376
+ const { sdk } = await getSDK();
377
+ print(await sdk.llm.vectors.delete({ deleteAll: true, workspaceId: flags['workspace-id'] }));
378
+ };
379
+
380
+ // -- contract ---------------------------------------------------------------
381
+ CMD['contract-info'] = async () => { const { sdk } = await getSDK(); print(await sdk.contract.getLocalAppV1()); };
382
+ CMD['contract-capabilities'] = async () => { const { sdk } = await getSDK(); print(await sdk.contract.listCapabilities()); };
383
+ CMD['contract-search'] = async () => {
384
+ const query = cmdArgs.join(' ');
385
+ if (!query) { console.error('Usage: rtx.js contract-search <query>'); process.exit(1); }
386
+ const { sdk } = await getSDK();
387
+ print(await sdk.contract.searchCapabilities(query));
388
+ };
389
+ CMD['contract-invoke'] = async () => {
390
+ const [capId, ...rest] = cmdArgs;
391
+ if (!capId) { console.error('Usage: rtx.js contract-invoke <capability-id> [<args-json>]'); process.exit(1); }
392
+ const { sdk } = await getSDK();
393
+ print(await sdk.contract.invoke({ capability_id: capId, args: rest[0] ? JSON.parse(rest[0]) : {}, auto_run: true, agent_name: flags.agent, workspace_slug: flags.workspace, prompt: flags.prompt }));
394
+ };
395
+
396
+ // -- database / auth --------------------------------------------------------
397
+ CMD['db-config'] = async () => { const { sdk } = await getSDK(); print(await sdk.database.getConfig()); };
398
+ CMD['auth-token'] = async () => { const { sdk } = await getSDK(); print(await sdk.auth.getAccessToken()); };
399
+
400
+ // -- help -------------------------------------------------------------------
401
+ CMD.help = async () => {
402
+ console.log(`
403
+ RealTimeX SDK CLI (source-verified) — rtx.js
404
+ ============================================
405
+
406
+ Usage: node rtx.js <command> [args...] [--flags]
407
+
408
+ Global flags:
409
+ --api-key=<key> Override API key (skips .env lookup)
410
+ --env-dir=<path> Directory containing .env (default: cwd)
411
+ --url=<url> RealTimeX server URL (default: http://localhost:3001)
412
+
413
+ Connection:
414
+ ping / info
415
+
416
+ sdk.api.*:
417
+ agents / workspaces / threads <slug> / task <uuid>
418
+
419
+ sdk.activities.*:
420
+ activities [--status --limit --offset]
421
+ activity-get <id>
422
+ activity-create <json>
423
+ activity-update <id> <json>
424
+ activity-delete <id>
425
+
426
+ sdk.task.* (positional args — NOT { task_uuid }):
427
+ task-start <uuid> [--machine=<id>]
428
+ task-complete <uuid> [<result-json>] [--machine=<id>]
429
+ task-fail <uuid> <error-message>
430
+ task-progress <uuid> [<progress-json>]
431
+ task-cancel <uuid> [<reason>]
432
+
433
+ Trigger (raw fetch — SDK method sends wrong event type):
434
+ trigger-agent <agent-name> <workspace-slug> <prompt>
435
+ [--thread=<slug>] [--data=<json>]
436
+
437
+ Webhook:
438
+ webhook-ping
439
+
440
+ sdk.llm.*:
441
+ llm-providers / embed-providers
442
+ llm-chat <message> [--stream] [--model] [--provider]
443
+ llm-embed <text> [--model] [--vectors]
444
+
445
+ sdk.llm.vectors.*:
446
+ vectors-workspaces
447
+ vectors-query <text> [--workspace-id] [--top=5]
448
+ vectors-upsert <json-VectorRecord[]> [--workspace-id]
449
+ vectors-delete --workspace-id=<id> | --all
450
+
451
+ sdk.mcp.*:
452
+ mcp-servers [--provider=local|remote|all]
453
+ mcp-tools <server> [--provider]
454
+ mcp-exec <server> <tool> [<args-json>] [--provider]
455
+
456
+ sdk.acpAgent.*:
457
+ acp-agents [--models=true]
458
+ acp-sessions
459
+ acp-chat <agent-id> <message>
460
+ [--cwd] [--model] [--policy=approve-all] [--thoughts] [--quiet]
461
+
462
+ sdk.tts.* / sdk.stt.*:
463
+ tts-providers / stt-providers
464
+
465
+ sdk.contract.*:
466
+ contract-info / contract-capabilities
467
+ contract-search <query>
468
+ contract-invoke <capability-id> [<args-json>] [--agent] [--workspace] [--prompt]
469
+
470
+ sdk.database.* / sdk.auth.*:
471
+ db-config / auth-token
472
+
473
+ help
474
+ `);
475
+ };
476
+
477
+ // ---------------------------------------------------------------------------
478
+ // Entry point
479
+ // ---------------------------------------------------------------------------
480
+ (async () => {
481
+ const handler = CMD[command];
482
+ if (!handler) {
483
+ console.error('Unknown command: ' + (command || '(none)') + '\nRun: node rtx.js help');
484
+ process.exit(1);
485
+ }
486
+ try { await handler(); }
487
+ catch (err) {
488
+ console.error('Error:', err.message || err);
489
+ if (flags.debug) console.error(err);
490
+ process.exit(1);
491
+ }
492
+ })();