@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.
- package/package.json +5 -2
- package/skills/realtimex-moderator-sdk/SKILL.md +93 -0
- package/skills/realtimex-moderator-sdk/references/api-reference.md +662 -0
- package/skills/realtimex-moderator-sdk/references/known-issues.md +237 -0
- package/skills/realtimex-moderator-sdk/scripts/lib/sdk-init.js +119 -0
- package/skills/realtimex-moderator-sdk/scripts/rtx.js +492 -0
|
@@ -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
|
+
})();
|