@hypercli.com/cli 0.0.0-stage → 0.9.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 +25 -2
- package/dist/commands/acp.d.ts +5 -0
- package/dist/commands/acp.js +51 -0
- package/dist/commands/acp.js.map +1 -0
- package/dist/commands/agent-login.d.ts +97 -0
- package/dist/commands/agent-login.js +547 -0
- package/dist/commands/agent-login.js.map +1 -0
- package/dist/commands/agents.d.ts +48 -0
- package/dist/commands/agents.js +2026 -0
- package/dist/commands/agents.js.map +1 -0
- package/dist/commands/configure.d.ts +11 -0
- package/dist/commands/configure.js +59 -0
- package/dist/commands/configure.js.map +1 -0
- package/dist/commands/files.d.ts +15 -0
- package/dist/commands/files.js +176 -0
- package/dist/commands/files.js.map +1 -0
- package/dist/commands/flow.d.ts +20 -0
- package/dist/commands/flow.js +360 -0
- package/dist/commands/flow.js.map +1 -0
- package/dist/commands/integrations.d.ts +32 -0
- package/dist/commands/integrations.js +460 -0
- package/dist/commands/integrations.js.map +1 -0
- package/dist/commands/jobs.d.ts +5 -0
- package/dist/commands/jobs.js +496 -0
- package/dist/commands/jobs.js.map +1 -0
- package/dist/commands/me.d.ts +23 -0
- package/dist/commands/me.js +258 -0
- package/dist/commands/me.js.map +1 -0
- package/dist/commands/memory.d.ts +5 -0
- package/dist/commands/memory.js +110 -0
- package/dist/commands/memory.js.map +1 -0
- package/dist/commands/routines.d.ts +27 -0
- package/dist/commands/routines.js +493 -0
- package/dist/commands/routines.js.map +1 -0
- package/dist/commands/skills.d.ts +36 -0
- package/dist/commands/skills.js +369 -0
- package/dist/commands/skills.js.map +1 -0
- package/dist/commands/voice.d.ts +15 -0
- package/dist/commands/voice.js +378 -0
- package/dist/commands/voice.js.map +1 -0
- package/dist/commands/websearch-core.d.ts +10 -0
- package/dist/commands/websearch-core.js +56 -0
- package/dist/commands/websearch-core.js.map +1 -0
- package/dist/commands/websearch.d.ts +13 -0
- package/dist/commands/websearch.js +20 -0
- package/dist/commands/websearch.js.map +1 -0
- package/dist/core/argv.d.ts +51 -0
- package/dist/core/argv.js +81 -0
- package/dist/core/argv.js.map +1 -0
- package/dist/core/captured-logs.d.ts +9 -0
- package/dist/core/captured-logs.js +52 -0
- package/dist/core/captured-logs.js.map +1 -0
- package/dist/core/client.d.ts +18 -0
- package/dist/core/client.js +31 -0
- package/dist/core/client.js.map +1 -0
- package/dist/core/config-file.d.ts +13 -0
- package/dist/core/config-file.js +79 -0
- package/dist/core/config-file.js.map +1 -0
- package/dist/core/errors.d.ts +22 -0
- package/dist/core/errors.js +37 -0
- package/dist/core/errors.js.map +1 -0
- package/dist/core/help.d.ts +13 -0
- package/dist/core/help.js +55 -0
- package/dist/core/help.js.map +1 -0
- package/dist/core/integrations-mcp.d.ts +2 -0
- package/dist/core/integrations-mcp.js +115 -0
- package/dist/core/integrations-mcp.js.map +1 -0
- package/dist/core/output.d.ts +29 -0
- package/dist/core/output.js +34 -0
- package/dist/core/output.js.map +1 -0
- package/dist/core/skills-runtime.d.ts +37 -0
- package/dist/core/skills-runtime.js +101 -0
- package/dist/core/skills-runtime.js.map +1 -0
- package/dist/core/table.d.ts +17 -0
- package/dist/core/table.js +34 -0
- package/dist/core/table.js.map +1 -0
- package/dist/core/types.d.ts +65 -0
- package/dist/core/types.js +40 -0
- package/dist/core/types.js.map +1 -0
- package/dist/index.d.ts +11 -0
- package/dist/index.js +73 -0
- package/dist/index.js.map +1 -0
- package/dist/registry.d.ts +10 -0
- package/dist/registry.js +39 -0
- package/dist/registry.js.map +1 -0
- package/dist/version.d.ts +1 -0
- package/dist/version.js +3 -0
- package/dist/version.js.map +1 -0
- package/package.json +33 -4
- package/skills/hypercli-account.json +17 -0
- package/skills/hypercli-agents.json +23 -0
- package/skills/hypercli-auth.json +11 -0
- package/skills/hypercli-compute.json +20 -0
- package/skills/hypercli-flows.json +11 -0
- package/skills/hypercli-knowledge.json +13 -0
- package/skills/hypercli-voice.json +10 -0
- package/skills/hypercli.json +23 -0
- package/skills/index.json +124 -0
|
@@ -0,0 +1,378 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `hyper voice` — voice capability API.
|
|
3
|
+
*
|
|
4
|
+
* hyper voice clone "hello" --file ref.wav clone a voice from reference audio over /ws/voice
|
|
5
|
+
* hyper voice transcribe audio.wav speech-to-text over /ws/voice/transcribe
|
|
6
|
+
* hyper voice transcribe audio.wav --rest one-shot STT (POST /voice/transcribe)
|
|
7
|
+
*
|
|
8
|
+
* Generation goes through the remote voice API. Audio is written with
|
|
9
|
+
* node:fs/promises; stdout stays machine-usable.
|
|
10
|
+
*/
|
|
11
|
+
import { readFile, stat, writeFile } from 'node:fs/promises';
|
|
12
|
+
import { lookup } from 'node:dns/promises';
|
|
13
|
+
import { isIP } from 'node:net';
|
|
14
|
+
import { basename, resolve } from 'node:path';
|
|
15
|
+
import { parseArgs } from 'node:util';
|
|
16
|
+
import { APIError } from '@hypercli.com/sdk';
|
|
17
|
+
import { parseCommandArgs } from '../core/argv.js';
|
|
18
|
+
import { CliError, UsageError } from '../core/errors.js';
|
|
19
|
+
import { renderGroupHelp } from '../core/help.js';
|
|
20
|
+
export const name = 'voice';
|
|
21
|
+
export const summary = 'Reference voice cloning and transcription via the voice capability API.';
|
|
22
|
+
// Named so error messages cite the right subcommand; `usage` composes these
|
|
23
|
+
// so a positional index can never drift away from the subcommand handler.
|
|
24
|
+
const USAGE_CLONE = 'hyper voice clone <text> (--file audio | --url audio-url) [--out file.mp3] [--rest] [--json]';
|
|
25
|
+
const USAGE_TRANSCRIBE = 'hyper voice transcribe <audio-file> [--language en] [--out transcript.txt] [--rest] [--json]';
|
|
26
|
+
export const usage = [USAGE_CLONE, USAGE_TRANSCRIBE];
|
|
27
|
+
const MAX_REFERENCE_AUDIO_BYTES = 25 * 1024 * 1024;
|
|
28
|
+
const REFERENCE_AUDIO_TIMEOUT_MS = 30_000;
|
|
29
|
+
const CLONE_OPTIONS = {
|
|
30
|
+
file: { type: 'string' },
|
|
31
|
+
url: { type: 'string' },
|
|
32
|
+
out: { type: 'string' },
|
|
33
|
+
rest: { type: 'boolean', default: false },
|
|
34
|
+
};
|
|
35
|
+
const TRANSCRIBE_OPTIONS = {
|
|
36
|
+
language: { type: 'string' },
|
|
37
|
+
out: { type: 'string' },
|
|
38
|
+
rest: { type: 'boolean', default: false },
|
|
39
|
+
};
|
|
40
|
+
function describeError(err) {
|
|
41
|
+
if (err instanceof APIError)
|
|
42
|
+
return `${err.statusCode}: ${err.detail}`;
|
|
43
|
+
return err instanceof Error ? err.message : String(err);
|
|
44
|
+
}
|
|
45
|
+
/** File/stdout generation requests MP3 explicitly; SDK WebSockets default to PCM. */
|
|
46
|
+
async function collectStream(chunks) {
|
|
47
|
+
const parts = [];
|
|
48
|
+
for await (const chunk of chunks) {
|
|
49
|
+
if (chunk.audio && chunk.audio.byteLength > 0)
|
|
50
|
+
parts.push(Buffer.from(chunk.audio));
|
|
51
|
+
}
|
|
52
|
+
return Buffer.concat(parts);
|
|
53
|
+
}
|
|
54
|
+
async function collectTranscript(events) {
|
|
55
|
+
let text = '';
|
|
56
|
+
for await (const event of events) {
|
|
57
|
+
if (event.type === 'transcript.final')
|
|
58
|
+
return event.text;
|
|
59
|
+
if (event.type === 'transcript.delta')
|
|
60
|
+
text += event.delta || event.text;
|
|
61
|
+
}
|
|
62
|
+
return text;
|
|
63
|
+
}
|
|
64
|
+
function validateReferenceUrl(url) {
|
|
65
|
+
let parsed;
|
|
66
|
+
try {
|
|
67
|
+
parsed = new URL(url);
|
|
68
|
+
}
|
|
69
|
+
catch {
|
|
70
|
+
throw new UsageError('voice clone --url must be a valid HTTPS URL');
|
|
71
|
+
}
|
|
72
|
+
if (parsed.protocol !== 'https:') {
|
|
73
|
+
throw new UsageError('voice clone --url only accepts HTTPS URLs');
|
|
74
|
+
}
|
|
75
|
+
const host = parsed.hostname.toLowerCase();
|
|
76
|
+
if (host === 'localhost' || host.endsWith('.localhost')) {
|
|
77
|
+
throw new UsageError('voice clone --url cannot target localhost');
|
|
78
|
+
}
|
|
79
|
+
if (isBlockedIpLiteral(host)) {
|
|
80
|
+
throw new UsageError('voice clone --url cannot target private, local, or reserved IP addresses');
|
|
81
|
+
}
|
|
82
|
+
return parsed;
|
|
83
|
+
}
|
|
84
|
+
function ipv4ToNumber(host) {
|
|
85
|
+
const parts = host.split('.').map((part) => Number(part));
|
|
86
|
+
if (parts.length !== 4 || parts.some((part) => !Number.isInteger(part) || part < 0 || part > 255))
|
|
87
|
+
return undefined;
|
|
88
|
+
return ((parts[0] << 24) >>> 0) + (parts[1] << 16) + (parts[2] << 8) + parts[3];
|
|
89
|
+
}
|
|
90
|
+
function ipv6ToBigInt(host) {
|
|
91
|
+
const value = host.replace(/^\[|\]$/g, '').toLowerCase();
|
|
92
|
+
if (!isIP(value))
|
|
93
|
+
return undefined;
|
|
94
|
+
if (value.includes('.'))
|
|
95
|
+
return undefined;
|
|
96
|
+
const halves = value.split('::');
|
|
97
|
+
if (halves.length > 2)
|
|
98
|
+
return undefined;
|
|
99
|
+
const left = halves[0] ? halves[0].split(':') : [];
|
|
100
|
+
const right = halves[1] ? halves[1].split(':') : [];
|
|
101
|
+
const fill = 8 - left.length - right.length;
|
|
102
|
+
if (fill < 0 || (halves.length === 1 && fill !== 0))
|
|
103
|
+
return undefined;
|
|
104
|
+
const groups = [...left, ...Array(fill).fill('0'), ...right];
|
|
105
|
+
return groups.reduce((acc, group) => (acc << 16n) + BigInt(parseInt(group || '0', 16)), 0n);
|
|
106
|
+
}
|
|
107
|
+
function inRange(value, base, bits) {
|
|
108
|
+
const mask = bits === 0 ? 0 : (0xffffffff << (32 - bits)) >>> 0;
|
|
109
|
+
return (value & mask) === (base & mask);
|
|
110
|
+
}
|
|
111
|
+
function inRange6(value, base, bits) {
|
|
112
|
+
const mask = ((1n << BigInt(bits)) - 1n) << BigInt(128 - bits);
|
|
113
|
+
return (value & mask) === (base & mask);
|
|
114
|
+
}
|
|
115
|
+
function isBlockedIpLiteral(host) {
|
|
116
|
+
const unbracketed = host.replace(/^\[|\]$/g, '');
|
|
117
|
+
const family = isIP(unbracketed);
|
|
118
|
+
if (family === 4) {
|
|
119
|
+
const value = ipv4ToNumber(unbracketed);
|
|
120
|
+
if (value === undefined)
|
|
121
|
+
return true;
|
|
122
|
+
return [
|
|
123
|
+
['0.0.0.0', 8],
|
|
124
|
+
['10.0.0.0', 8],
|
|
125
|
+
['100.64.0.0', 10],
|
|
126
|
+
['127.0.0.0', 8],
|
|
127
|
+
['169.254.0.0', 16],
|
|
128
|
+
['172.16.0.0', 12],
|
|
129
|
+
['192.0.0.0', 24],
|
|
130
|
+
['192.0.2.0', 24],
|
|
131
|
+
['192.168.0.0', 16],
|
|
132
|
+
['198.18.0.0', 15],
|
|
133
|
+
['198.51.100.0', 24],
|
|
134
|
+
['203.0.113.0', 24],
|
|
135
|
+
['224.0.0.0', 4],
|
|
136
|
+
['240.0.0.0', 4],
|
|
137
|
+
].some(([base, bits]) => inRange(value, ipv4ToNumber(base), bits));
|
|
138
|
+
}
|
|
139
|
+
if (family === 6) {
|
|
140
|
+
const value = ipv6ToBigInt(unbracketed);
|
|
141
|
+
if (value === undefined)
|
|
142
|
+
return true;
|
|
143
|
+
return value === 0n || value === 1n || [
|
|
144
|
+
['fc00::', 7],
|
|
145
|
+
['fe80::', 10],
|
|
146
|
+
['ff00::', 8],
|
|
147
|
+
['2001:db8::', 32],
|
|
148
|
+
].some(([base, bits]) => inRange6(value, ipv6ToBigInt(base), bits));
|
|
149
|
+
}
|
|
150
|
+
return false;
|
|
151
|
+
}
|
|
152
|
+
async function assertSafeResolvedHost(host) {
|
|
153
|
+
const unbracketed = host.replace(/^\[|\]$/g, '');
|
|
154
|
+
if (isIP(unbracketed))
|
|
155
|
+
return;
|
|
156
|
+
let addresses;
|
|
157
|
+
try {
|
|
158
|
+
addresses = await lookup(host, { all: true, verbatim: true });
|
|
159
|
+
}
|
|
160
|
+
catch {
|
|
161
|
+
return;
|
|
162
|
+
}
|
|
163
|
+
if (addresses.some((address) => isBlockedIpLiteral(address.address))) {
|
|
164
|
+
throw new UsageError('voice clone --url cannot resolve to private, local, or reserved IP addresses');
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
async function readUrlBytes(url) {
|
|
168
|
+
const parsed = validateReferenceUrl(url);
|
|
169
|
+
const controller = new AbortController();
|
|
170
|
+
const timeout = setTimeout(() => controller.abort(), REFERENCE_AUDIO_TIMEOUT_MS);
|
|
171
|
+
let response;
|
|
172
|
+
let current = parsed;
|
|
173
|
+
try {
|
|
174
|
+
for (let redirects = 0; redirects <= 5; redirects += 1) {
|
|
175
|
+
await assertSafeResolvedHost(current.hostname);
|
|
176
|
+
response = await fetch(current.href, { signal: controller.signal, redirect: 'manual' });
|
|
177
|
+
if (![301, 302, 303, 307, 308].includes(response.status))
|
|
178
|
+
break;
|
|
179
|
+
const location = response.headers.get('location');
|
|
180
|
+
if (!location)
|
|
181
|
+
break;
|
|
182
|
+
current = validateReferenceUrl(new URL(location, current).href);
|
|
183
|
+
}
|
|
184
|
+
if (!response)
|
|
185
|
+
throw new CliError('failed to fetch reference audio');
|
|
186
|
+
if (!response.ok) {
|
|
187
|
+
throw new CliError(`failed to fetch reference audio: ${response.status} ${response.statusText}`);
|
|
188
|
+
}
|
|
189
|
+
const contentLength = response.headers.get('content-length');
|
|
190
|
+
const contentLengthBytes = contentLength ? Number(contentLength) : undefined;
|
|
191
|
+
if (contentLengthBytes !== undefined && (!Number.isFinite(contentLengthBytes) || contentLengthBytes > MAX_REFERENCE_AUDIO_BYTES)) {
|
|
192
|
+
throw new CliError(`reference audio exceeds ${MAX_REFERENCE_AUDIO_BYTES} bytes`);
|
|
193
|
+
}
|
|
194
|
+
const reader = response.body?.getReader();
|
|
195
|
+
if (!reader)
|
|
196
|
+
return Buffer.from(await response.arrayBuffer());
|
|
197
|
+
const chunks = [];
|
|
198
|
+
let total = 0;
|
|
199
|
+
while (true) {
|
|
200
|
+
const { done, value } = await reader.read();
|
|
201
|
+
if (done)
|
|
202
|
+
break;
|
|
203
|
+
total += value.byteLength;
|
|
204
|
+
if (total > MAX_REFERENCE_AUDIO_BYTES) {
|
|
205
|
+
throw new CliError(`reference audio exceeds ${MAX_REFERENCE_AUDIO_BYTES} bytes`);
|
|
206
|
+
}
|
|
207
|
+
chunks.push(Buffer.from(value));
|
|
208
|
+
}
|
|
209
|
+
return Buffer.concat(chunks, total);
|
|
210
|
+
}
|
|
211
|
+
catch (err) {
|
|
212
|
+
if (err instanceof CliError || err instanceof UsageError)
|
|
213
|
+
throw err;
|
|
214
|
+
throw new CliError(`failed to fetch reference audio: ${describeError(err)}`);
|
|
215
|
+
}
|
|
216
|
+
finally {
|
|
217
|
+
clearTimeout(timeout);
|
|
218
|
+
}
|
|
219
|
+
}
|
|
220
|
+
async function readReferenceFile(file) {
|
|
221
|
+
const info = await stat(file);
|
|
222
|
+
if (info.size > MAX_REFERENCE_AUDIO_BYTES) {
|
|
223
|
+
throw new CliError(`reference audio exceeds ${MAX_REFERENCE_AUDIO_BYTES} bytes`);
|
|
224
|
+
}
|
|
225
|
+
const bytes = await readFile(file);
|
|
226
|
+
if (bytes.byteLength > MAX_REFERENCE_AUDIO_BYTES) {
|
|
227
|
+
throw new CliError(`reference audio exceeds ${MAX_REFERENCE_AUDIO_BYTES} bytes`);
|
|
228
|
+
}
|
|
229
|
+
return bytes;
|
|
230
|
+
}
|
|
231
|
+
async function clone(ctx, args) {
|
|
232
|
+
const parsed = parseCommandArgs(args, CLONE_OPTIONS);
|
|
233
|
+
if (parsed.help) {
|
|
234
|
+
process.stdout.write(`${renderGroupHelp({ name, summary, usage, run })}\n`);
|
|
235
|
+
return;
|
|
236
|
+
}
|
|
237
|
+
const [text, ...rest] = parsed.positionals;
|
|
238
|
+
if (!text || rest.length > 0) {
|
|
239
|
+
throw new UsageError(`usage: ${USAGE_CLONE}`);
|
|
240
|
+
}
|
|
241
|
+
const fileArg = typeof parsed.values.file === 'string' ? parsed.values.file : undefined;
|
|
242
|
+
const urlArg = typeof parsed.values.url === 'string' ? parsed.values.url : undefined;
|
|
243
|
+
if ((fileArg ? 1 : 0) + (urlArg ? 1 : 0) !== 1) {
|
|
244
|
+
throw new UsageError('voice clone requires exactly one of --file or --url');
|
|
245
|
+
}
|
|
246
|
+
const outArg = typeof parsed.values.out === 'string' ? parsed.values.out : undefined;
|
|
247
|
+
if (!outArg && ctx.format === 'json') {
|
|
248
|
+
throw new UsageError('voice clone --json requires --out');
|
|
249
|
+
}
|
|
250
|
+
const source = fileArg ? resolve(fileArg) : urlArg;
|
|
251
|
+
const refAudio = fileArg ? await readReferenceFile(source) : await readUrlBytes(source);
|
|
252
|
+
const client = await ctx.client();
|
|
253
|
+
const stream = parsed.values.rest !== true;
|
|
254
|
+
let bytes;
|
|
255
|
+
try {
|
|
256
|
+
bytes = stream
|
|
257
|
+
? await collectStream(client.voice.cloneStream({ text, refAudio, responseFormat: 'mp3' }))
|
|
258
|
+
: await client.voice.clone({ text, refAudio });
|
|
259
|
+
}
|
|
260
|
+
catch (err) {
|
|
261
|
+
throw new CliError(`clone failed: ${describeError(err)}`);
|
|
262
|
+
}
|
|
263
|
+
if (!outArg) {
|
|
264
|
+
process.stdout.write(Buffer.from(bytes));
|
|
265
|
+
return;
|
|
266
|
+
}
|
|
267
|
+
const outFile = resolve(outArg);
|
|
268
|
+
await writeFile(outFile, bytes);
|
|
269
|
+
ctx.output.info(`saved ${outFile} (${bytes.byteLength} bytes)`);
|
|
270
|
+
const record = { out: outFile, source, bytes: bytes.byteLength };
|
|
271
|
+
ctx.output.result(ctx.format === 'json' ? { ...record, text, stream, format: 'mp3' } : record, {
|
|
272
|
+
columns: ['OUT', 'SOURCE', 'BYTES'],
|
|
273
|
+
rows: [[outFile, source, String(bytes.byteLength)]],
|
|
274
|
+
});
|
|
275
|
+
}
|
|
276
|
+
async function transcribe(ctx, args) {
|
|
277
|
+
const parsed = parseCommandArgs(args, TRANSCRIBE_OPTIONS);
|
|
278
|
+
if (parsed.help) {
|
|
279
|
+
process.stdout.write(`${renderGroupHelp({ name, summary, usage, run })}\n`);
|
|
280
|
+
return;
|
|
281
|
+
}
|
|
282
|
+
const [audioFile, ...rest] = parsed.positionals;
|
|
283
|
+
if (!audioFile || rest.length > 0) {
|
|
284
|
+
throw new UsageError(`usage: ${USAGE_TRANSCRIBE}`);
|
|
285
|
+
}
|
|
286
|
+
const language = typeof parsed.values.language === 'string' ? parsed.values.language : undefined;
|
|
287
|
+
const useRest = parsed.values.rest === true;
|
|
288
|
+
const stream = !useRest;
|
|
289
|
+
const outArg = typeof parsed.values.out === 'string' ? parsed.values.out : undefined;
|
|
290
|
+
const file = resolve(audioFile);
|
|
291
|
+
const outFile = outArg ? resolve(outArg) : undefined;
|
|
292
|
+
const audio = await readFile(file);
|
|
293
|
+
const client = await ctx.client();
|
|
294
|
+
let text;
|
|
295
|
+
try {
|
|
296
|
+
if (stream) {
|
|
297
|
+
text = await collectTranscript(client.voice.transcribeStream({
|
|
298
|
+
audio,
|
|
299
|
+
language,
|
|
300
|
+
}));
|
|
301
|
+
}
|
|
302
|
+
else {
|
|
303
|
+
const result = await client.voice.transcribe({
|
|
304
|
+
audio,
|
|
305
|
+
filename: basename(file),
|
|
306
|
+
language,
|
|
307
|
+
});
|
|
308
|
+
text = result.text;
|
|
309
|
+
}
|
|
310
|
+
}
|
|
311
|
+
catch (err) {
|
|
312
|
+
throw new CliError(`transcribe failed: ${describeError(err)}`);
|
|
313
|
+
}
|
|
314
|
+
if (outFile) {
|
|
315
|
+
await writeFile(outFile, text, 'utf8');
|
|
316
|
+
ctx.output.info(`saved ${outFile} (${text.length} chars)`);
|
|
317
|
+
}
|
|
318
|
+
const record = { text, file, out: outFile, language, stream };
|
|
319
|
+
if (outFile) {
|
|
320
|
+
ctx.output.result(record, {
|
|
321
|
+
columns: ['FILE', 'OUT', 'CHARS'],
|
|
322
|
+
rows: [[file, outFile, String(text.length)]],
|
|
323
|
+
});
|
|
324
|
+
}
|
|
325
|
+
else {
|
|
326
|
+
ctx.output.result(record, text);
|
|
327
|
+
}
|
|
328
|
+
}
|
|
329
|
+
export async function run(ctx, args) {
|
|
330
|
+
// Non-strict pre-scan with the union of subcommand flags: --help routes to
|
|
331
|
+
// group help regardless of position, strict errors stay in the subcommand.
|
|
332
|
+
const pre = parseUniversalGroup(args);
|
|
333
|
+
if (pre.help || pre.positionals.length === 0) {
|
|
334
|
+
process.stdout.write(`${renderGroupHelp({ name, summary, usage, run })}\n`);
|
|
335
|
+
return;
|
|
336
|
+
}
|
|
337
|
+
const [sub] = pre.positionals;
|
|
338
|
+
// Hand the subcommand its own argv (original args minus the sub token)
|
|
339
|
+
// so flags survive strict re-parsing inside the subcommand. Splice at the
|
|
340
|
+
// index of the first positional TOKEN — never indexOf the word, which can
|
|
341
|
+
// hit an earlier flag value.
|
|
342
|
+
const subArgs = [...args];
|
|
343
|
+
subArgs.splice(pre.subIndex, 1);
|
|
344
|
+
switch (sub) {
|
|
345
|
+
case 'clone':
|
|
346
|
+
return clone(ctx, subArgs);
|
|
347
|
+
case 'transcribe':
|
|
348
|
+
return transcribe(ctx, subArgs);
|
|
349
|
+
default:
|
|
350
|
+
throw new UsageError(`unknown voice command '${sub}'\nusage: ${usage.join('\n ')}`);
|
|
351
|
+
}
|
|
352
|
+
}
|
|
353
|
+
/** Loose scan over the union of all subcommand flags (never throws). */
|
|
354
|
+
function parseUniversalGroup(args) {
|
|
355
|
+
const parsed = parseArgs({
|
|
356
|
+
args,
|
|
357
|
+
options: {
|
|
358
|
+
json: { type: 'boolean' },
|
|
359
|
+
output: { type: 'string', short: 'o' },
|
|
360
|
+
help: { type: 'boolean', short: 'h' },
|
|
361
|
+
out: { type: 'string' },
|
|
362
|
+
file: { type: 'string' },
|
|
363
|
+
url: { type: 'string' },
|
|
364
|
+
language: { type: 'string' },
|
|
365
|
+
rest: { type: 'boolean' },
|
|
366
|
+
},
|
|
367
|
+
strict: false,
|
|
368
|
+
allowPositionals: true,
|
|
369
|
+
tokens: true,
|
|
370
|
+
});
|
|
371
|
+
const subToken = (parsed.tokens ?? []).find((token) => token.kind === 'positional');
|
|
372
|
+
return {
|
|
373
|
+
help: parsed.values.help === true,
|
|
374
|
+
positionals: parsed.positionals,
|
|
375
|
+
subIndex: subToken?.index ?? -1,
|
|
376
|
+
};
|
|
377
|
+
}
|
|
378
|
+
//# sourceMappingURL=voice.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"voice.js","sourceRoot":"","sources":["../../src/commands/voice.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Core for `hyper websearch`: Brave web search through the agents API proxy
|
|
3
|
+
* (Deployments.webSearch, py-cli parity).
|
|
4
|
+
*
|
|
5
|
+
* The group module parses argv, makes the call, and renders output here; the
|
|
6
|
+
* only caller-provided piece is which help listing --help prints, passed in
|
|
7
|
+
* as onHelp.
|
|
8
|
+
*/
|
|
9
|
+
import type { CommandContext } from '../core/types.js';
|
|
10
|
+
export declare function runWebSearch(ctx: CommandContext, args: string[], onHelp: () => void): Promise<void>;
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Core for `hyper websearch`: Brave web search through the agents API proxy
|
|
3
|
+
* (Deployments.webSearch, py-cli parity).
|
|
4
|
+
*
|
|
5
|
+
* The group module parses argv, makes the call, and renders output here; the
|
|
6
|
+
* only caller-provided piece is which help listing --help prints, passed in
|
|
7
|
+
* as onHelp.
|
|
8
|
+
*/
|
|
9
|
+
import { APIError } from '@hypercli.com/sdk';
|
|
10
|
+
import { parseCommandArgs } from '../core/argv.js';
|
|
11
|
+
import { CliError, UsageError } from '../core/errors.js';
|
|
12
|
+
function str(parsed, key) {
|
|
13
|
+
const value = parsed.values[key];
|
|
14
|
+
return typeof value === 'string' ? value : undefined;
|
|
15
|
+
}
|
|
16
|
+
function describeFailure(err) {
|
|
17
|
+
if (err instanceof APIError)
|
|
18
|
+
return `HTTP ${err.statusCode}: ${err.detail}`;
|
|
19
|
+
if (err instanceof Error)
|
|
20
|
+
return err.message;
|
|
21
|
+
return String(err);
|
|
22
|
+
}
|
|
23
|
+
export async function runWebSearch(ctx, args, onHelp) {
|
|
24
|
+
const parsed = parseCommandArgs(args, { count: { type: 'string', short: 'n' } });
|
|
25
|
+
if (parsed.help) {
|
|
26
|
+
onHelp();
|
|
27
|
+
return;
|
|
28
|
+
}
|
|
29
|
+
if (parsed.positionals.length === 0)
|
|
30
|
+
throw new UsageError('missing query');
|
|
31
|
+
const query = parsed.positionals.join(' ');
|
|
32
|
+
const countRaw = str(parsed, 'count');
|
|
33
|
+
let count = 5;
|
|
34
|
+
if (countRaw !== undefined) {
|
|
35
|
+
count = Number(countRaw);
|
|
36
|
+
if (!Number.isInteger(count) || count < 1 || count > 20) {
|
|
37
|
+
throw new UsageError(`--count must be an integer between 1 and 20 (got '${countRaw}')`);
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
const { deployments } = await ctx.client();
|
|
41
|
+
let payload;
|
|
42
|
+
try {
|
|
43
|
+
payload = await deployments.webSearch(query, { count });
|
|
44
|
+
}
|
|
45
|
+
catch (err) {
|
|
46
|
+
if (err instanceof CliError)
|
|
47
|
+
throw err;
|
|
48
|
+
throw new CliError(`web search failed: ${describeFailure(err)}`);
|
|
49
|
+
}
|
|
50
|
+
const results = Array.isArray(payload.web?.results) ? payload.web.results : [];
|
|
51
|
+
const rows = results
|
|
52
|
+
.filter((item) => item !== null && typeof item === 'object')
|
|
53
|
+
.map((item) => [String(item.title ?? ''), String(item.url ?? '')]);
|
|
54
|
+
ctx.output.result(payload, rows.length === 0 ? 'No results.' : { columns: ['TITLE', 'URL'], rows });
|
|
55
|
+
}
|
|
56
|
+
//# sourceMappingURL=websearch-core.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"websearch-core.js","sourceRoot":"","sources":["../../src/commands/websearch-core.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `hyper websearch` — top-level Brave web search through the agents API proxy.
|
|
3
|
+
*
|
|
4
|
+
* hyper websearch <query...> [-n|--count N] [--json]
|
|
5
|
+
*
|
|
6
|
+
* The only web search surface; the implementation lives in
|
|
7
|
+
* src/commands/websearch-core.ts.
|
|
8
|
+
*/
|
|
9
|
+
import type { CommandContext } from '../core/types.js';
|
|
10
|
+
export declare const name = "websearch";
|
|
11
|
+
export declare const summary = "Web search through the agents API proxy.";
|
|
12
|
+
export declare const usage: string[];
|
|
13
|
+
export declare function run(ctx: CommandContext, args: string[]): Promise<void>;
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `hyper websearch` — top-level Brave web search through the agents API proxy.
|
|
3
|
+
*
|
|
4
|
+
* hyper websearch <query...> [-n|--count N] [--json]
|
|
5
|
+
*
|
|
6
|
+
* The only web search surface; the implementation lives in
|
|
7
|
+
* src/commands/websearch-core.ts.
|
|
8
|
+
*/
|
|
9
|
+
import { renderGroupHelp } from '../core/help.js';
|
|
10
|
+
import { runWebSearch } from './websearch-core.js';
|
|
11
|
+
export const name = 'websearch';
|
|
12
|
+
export const summary = 'Web search through the agents API proxy.';
|
|
13
|
+
export const usage = ['hyper websearch <query...> [-n|--count N] [--json]'];
|
|
14
|
+
function printHelp() {
|
|
15
|
+
process.stdout.write(`${renderGroupHelp({ name, summary, usage, run })}\n`);
|
|
16
|
+
}
|
|
17
|
+
export async function run(ctx, args) {
|
|
18
|
+
return runWebSearch(ctx, args, printHelp);
|
|
19
|
+
}
|
|
20
|
+
//# sourceMappingURL=websearch.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"websearch.js","sourceRoot":"","sources":["../../src/commands/websearch.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAElD,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAEnD,MAAM,CAAC,MAAM,IAAI,GAAG,WAAW,CAAC;AAChC,MAAM,CAAC,MAAM,OAAO,GAAG,0CAA0C,CAAC;AAClE,MAAM,CAAC,MAAM,KAAK,GAAG,CAAC,oDAAoD,CAAC,CAAC;AAE5E,SAAS,SAAS;IAChB,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,eAAe,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,CAAC;AAC9E,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,GAAG,CAAC,GAAmB,EAAE,IAAc;IAC3D,OAAO,YAAY,CAAC,GAAG,EAAE,IAAI,EAAE,SAAS,CAAC,CAAC;AAC5C,CAAC"}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* argv parsing on node:util parseArgs. No commander/yargs/typer.
|
|
3
|
+
*
|
|
4
|
+
* Universal flags understood everywhere:
|
|
5
|
+
* --json machine output (single JSON.stringify on stdout)
|
|
6
|
+
* --output, -o FMT 'table' (default) or 'json'
|
|
7
|
+
* --help, -h print help
|
|
8
|
+
*
|
|
9
|
+
* parseUniversal() — non-strict top-level scan used by the entrypoint to
|
|
10
|
+
* find the group name and global flags without rejecting
|
|
11
|
+
* group-specific options.
|
|
12
|
+
* parseCommandArgs()— strict parse inside a command group; merges the
|
|
13
|
+
* universal options with group-specific ones and maps
|
|
14
|
+
* parse failures to UsageError (exit 2).
|
|
15
|
+
*/
|
|
16
|
+
import { type ParseArgsConfig } from 'node:util';
|
|
17
|
+
import type { OutputFormat } from './output.js';
|
|
18
|
+
type Options = NonNullable<ParseArgsConfig['options']>;
|
|
19
|
+
export declare const UNIVERSAL_OPTIONS: Options;
|
|
20
|
+
/**
|
|
21
|
+
* Parsed argv shape shared by parseUniversal() and parseCommandArgs(). The
|
|
22
|
+
* parsing behavior differs (non-strict vs strict) but the result shape is
|
|
23
|
+
* identical.
|
|
24
|
+
*/
|
|
25
|
+
export interface ParsedArgs {
|
|
26
|
+
values: Record<string, unknown>;
|
|
27
|
+
positionals: string[];
|
|
28
|
+
format: OutputFormat;
|
|
29
|
+
help: boolean;
|
|
30
|
+
}
|
|
31
|
+
/** Back-compat alias — same shape as ParsedArgs. */
|
|
32
|
+
export type ParsedCommand = ParsedArgs;
|
|
33
|
+
/** ParsedArgs plus the argv index of the first positional token — group
|
|
34
|
+
dispatchers splice at this index rather than textually searching for the
|
|
35
|
+
group/subcommand word, which can collide with an earlier flag value. */
|
|
36
|
+
export interface ParsedUniversal extends ParsedArgs {
|
|
37
|
+
/** argv index of the first positional token, or -1 when there are none. */
|
|
38
|
+
firstPositionalIndex: number;
|
|
39
|
+
}
|
|
40
|
+
/** Resolve the output format from --json / --output. */
|
|
41
|
+
export declare function resolveFormat(values: Record<string, unknown>): OutputFormat;
|
|
42
|
+
/** Non-strict scan of full argv, except for retired public environment flags. */
|
|
43
|
+
export declare function parseUniversal(argv: string[]): ParsedUniversal;
|
|
44
|
+
/**
|
|
45
|
+
* Strict parse for inside a command group. Universal options are always
|
|
46
|
+
* allowed; pass only group-specific options. Bad flags -> UsageError.
|
|
47
|
+
*/
|
|
48
|
+
export declare function parseCommandArgs(args: string[], options?: Options, config?: {
|
|
49
|
+
allowPositionals?: boolean;
|
|
50
|
+
}): ParsedCommand;
|
|
51
|
+
export {};
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* argv parsing on node:util parseArgs. No commander/yargs/typer.
|
|
3
|
+
*
|
|
4
|
+
* Universal flags understood everywhere:
|
|
5
|
+
* --json machine output (single JSON.stringify on stdout)
|
|
6
|
+
* --output, -o FMT 'table' (default) or 'json'
|
|
7
|
+
* --help, -h print help
|
|
8
|
+
*
|
|
9
|
+
* parseUniversal() — non-strict top-level scan used by the entrypoint to
|
|
10
|
+
* find the group name and global flags without rejecting
|
|
11
|
+
* group-specific options.
|
|
12
|
+
* parseCommandArgs()— strict parse inside a command group; merges the
|
|
13
|
+
* universal options with group-specific ones and maps
|
|
14
|
+
* parse failures to UsageError (exit 2).
|
|
15
|
+
*/
|
|
16
|
+
import { parseArgs } from 'node:util';
|
|
17
|
+
import { UsageError } from './errors.js';
|
|
18
|
+
export const UNIVERSAL_OPTIONS = {
|
|
19
|
+
json: { type: 'boolean', default: false },
|
|
20
|
+
output: { type: 'string', short: 'o' },
|
|
21
|
+
help: { type: 'boolean', short: 'h', default: false },
|
|
22
|
+
};
|
|
23
|
+
/** Resolve the output format from --json / --output. */
|
|
24
|
+
export function resolveFormat(values) {
|
|
25
|
+
const output = typeof values.output === 'string' ? values.output : undefined;
|
|
26
|
+
if (values.json === true || output === 'json')
|
|
27
|
+
return 'json';
|
|
28
|
+
if (output !== undefined && output !== 'table') {
|
|
29
|
+
throw new UsageError(`unknown output format '${output}' (expected 'table' or 'json')`);
|
|
30
|
+
}
|
|
31
|
+
return 'table';
|
|
32
|
+
}
|
|
33
|
+
/** Non-strict scan of full argv, except for retired public environment flags. */
|
|
34
|
+
export function parseUniversal(argv) {
|
|
35
|
+
const { values, positionals, tokens } = parseArgs({
|
|
36
|
+
args: argv,
|
|
37
|
+
options: UNIVERSAL_OPTIONS,
|
|
38
|
+
strict: false,
|
|
39
|
+
allowPositionals: true,
|
|
40
|
+
tokens: true,
|
|
41
|
+
});
|
|
42
|
+
for (const token of tokens ?? []) {
|
|
43
|
+
if (token.kind === 'option' && (token.name === 'dev' || token.name === 'prod')) {
|
|
44
|
+
throw new UsageError(`--${token.name} is not supported; set HYPER_API_BASE and/or HYPER_AGENTS_API_BASE instead`);
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
const firstPositional = (tokens ?? []).find((token) => token.kind === 'positional');
|
|
48
|
+
return {
|
|
49
|
+
values: values,
|
|
50
|
+
positionals,
|
|
51
|
+
format: resolveFormat(values),
|
|
52
|
+
help: values.help === true,
|
|
53
|
+
firstPositionalIndex: firstPositional?.index ?? -1,
|
|
54
|
+
};
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* Strict parse for inside a command group. Universal options are always
|
|
58
|
+
* allowed; pass only group-specific options. Bad flags -> UsageError.
|
|
59
|
+
*/
|
|
60
|
+
export function parseCommandArgs(args, options = {}, config = {}) {
|
|
61
|
+
let parsed;
|
|
62
|
+
try {
|
|
63
|
+
parsed = parseArgs({
|
|
64
|
+
args,
|
|
65
|
+
options: { ...UNIVERSAL_OPTIONS, ...options },
|
|
66
|
+
allowPositionals: config.allowPositionals ?? true,
|
|
67
|
+
strict: true,
|
|
68
|
+
});
|
|
69
|
+
}
|
|
70
|
+
catch (err) {
|
|
71
|
+
throw new UsageError(err instanceof Error ? err.message : String(err));
|
|
72
|
+
}
|
|
73
|
+
const values = parsed.values;
|
|
74
|
+
return {
|
|
75
|
+
values,
|
|
76
|
+
positionals: parsed.positionals,
|
|
77
|
+
format: resolveFormat(values),
|
|
78
|
+
help: values.help === true,
|
|
79
|
+
};
|
|
80
|
+
}
|
|
81
|
+
//# sourceMappingURL=argv.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"argv.js","sourceRoot":"","sources":["../../src/core/argv.ts"],"names":[],"mappings":"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"}
|