@hypercli.com/cli 0.0.0-stage → 0.9.2

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.
Files changed (98) hide show
  1. package/README.md +25 -2
  2. package/dist/commands/acp.d.ts +5 -0
  3. package/dist/commands/acp.js +51 -0
  4. package/dist/commands/acp.js.map +1 -0
  5. package/dist/commands/agent-login.d.ts +97 -0
  6. package/dist/commands/agent-login.js +547 -0
  7. package/dist/commands/agent-login.js.map +1 -0
  8. package/dist/commands/agents.d.ts +48 -0
  9. package/dist/commands/agents.js +2026 -0
  10. package/dist/commands/agents.js.map +1 -0
  11. package/dist/commands/configure.d.ts +11 -0
  12. package/dist/commands/configure.js +59 -0
  13. package/dist/commands/configure.js.map +1 -0
  14. package/dist/commands/files.d.ts +15 -0
  15. package/dist/commands/files.js +176 -0
  16. package/dist/commands/files.js.map +1 -0
  17. package/dist/commands/flow.d.ts +20 -0
  18. package/dist/commands/flow.js +360 -0
  19. package/dist/commands/flow.js.map +1 -0
  20. package/dist/commands/integrations.d.ts +32 -0
  21. package/dist/commands/integrations.js +460 -0
  22. package/dist/commands/integrations.js.map +1 -0
  23. package/dist/commands/jobs.d.ts +5 -0
  24. package/dist/commands/jobs.js +496 -0
  25. package/dist/commands/jobs.js.map +1 -0
  26. package/dist/commands/me.d.ts +23 -0
  27. package/dist/commands/me.js +258 -0
  28. package/dist/commands/me.js.map +1 -0
  29. package/dist/commands/memory.d.ts +5 -0
  30. package/dist/commands/memory.js +110 -0
  31. package/dist/commands/memory.js.map +1 -0
  32. package/dist/commands/routines.d.ts +27 -0
  33. package/dist/commands/routines.js +493 -0
  34. package/dist/commands/routines.js.map +1 -0
  35. package/dist/commands/skills.d.ts +36 -0
  36. package/dist/commands/skills.js +369 -0
  37. package/dist/commands/skills.js.map +1 -0
  38. package/dist/commands/voice.d.ts +15 -0
  39. package/dist/commands/voice.js +378 -0
  40. package/dist/commands/voice.js.map +1 -0
  41. package/dist/commands/websearch-core.d.ts +10 -0
  42. package/dist/commands/websearch-core.js +56 -0
  43. package/dist/commands/websearch-core.js.map +1 -0
  44. package/dist/commands/websearch.d.ts +13 -0
  45. package/dist/commands/websearch.js +20 -0
  46. package/dist/commands/websearch.js.map +1 -0
  47. package/dist/core/argv.d.ts +51 -0
  48. package/dist/core/argv.js +81 -0
  49. package/dist/core/argv.js.map +1 -0
  50. package/dist/core/captured-logs.d.ts +9 -0
  51. package/dist/core/captured-logs.js +52 -0
  52. package/dist/core/captured-logs.js.map +1 -0
  53. package/dist/core/client.d.ts +18 -0
  54. package/dist/core/client.js +31 -0
  55. package/dist/core/client.js.map +1 -0
  56. package/dist/core/config-file.d.ts +13 -0
  57. package/dist/core/config-file.js +79 -0
  58. package/dist/core/config-file.js.map +1 -0
  59. package/dist/core/errors.d.ts +22 -0
  60. package/dist/core/errors.js +37 -0
  61. package/dist/core/errors.js.map +1 -0
  62. package/dist/core/help.d.ts +13 -0
  63. package/dist/core/help.js +55 -0
  64. package/dist/core/help.js.map +1 -0
  65. package/dist/core/integrations-mcp.d.ts +2 -0
  66. package/dist/core/integrations-mcp.js +115 -0
  67. package/dist/core/integrations-mcp.js.map +1 -0
  68. package/dist/core/output.d.ts +29 -0
  69. package/dist/core/output.js +34 -0
  70. package/dist/core/output.js.map +1 -0
  71. package/dist/core/skills-runtime.d.ts +37 -0
  72. package/dist/core/skills-runtime.js +101 -0
  73. package/dist/core/skills-runtime.js.map +1 -0
  74. package/dist/core/table.d.ts +17 -0
  75. package/dist/core/table.js +34 -0
  76. package/dist/core/table.js.map +1 -0
  77. package/dist/core/types.d.ts +65 -0
  78. package/dist/core/types.js +40 -0
  79. package/dist/core/types.js.map +1 -0
  80. package/dist/index.d.ts +11 -0
  81. package/dist/index.js +73 -0
  82. package/dist/index.js.map +1 -0
  83. package/dist/registry.d.ts +10 -0
  84. package/dist/registry.js +39 -0
  85. package/dist/registry.js.map +1 -0
  86. package/dist/version.d.ts +1 -0
  87. package/dist/version.js +3 -0
  88. package/dist/version.js.map +1 -0
  89. package/package.json +33 -4
  90. package/skills/hypercli-account.json +17 -0
  91. package/skills/hypercli-agents.json +23 -0
  92. package/skills/hypercli-auth.json +11 -0
  93. package/skills/hypercli-compute.json +20 -0
  94. package/skills/hypercli-flows.json +11 -0
  95. package/skills/hypercli-knowledge.json +13 -0
  96. package/skills/hypercli-voice.json +10 -0
  97. package/skills/hypercli.json +23 -0
  98. package/skills/index.json +124 -0
@@ -0,0 +1,547 @@
1
+ /**
2
+ * `hyper agents login` — first-class login flows for hosted agent pods,
3
+ * driven entirely through the existing exec/cp machinery; no TTY needed.
4
+ *
5
+ * Flow registry (LOGIN_FLOWS) is keyed by runtime so new runtimes (opencode,
6
+ * openclaw_acp, ...) slot in by adding an entry — each flow is an async fn over
7
+ * the shared exec/poll primitives.
8
+ *
9
+ * Choreographies (verified live in pods):
10
+ * codex device-auth — detached `codex login --device-auth` writes a URL +
11
+ * one-time code to /tmp/devauth.log; user completes it in a browser; the
12
+ * log then reports success. Codes expire in 15 min.
13
+ * claude-code paste-back — `claude auth login` reads stdin from a fifo held
14
+ * open by a detached sleep; the OAuth URL lands in /tmp/clin.log; the
15
+ * user pastes back the `code#state` string, which is piped into the fifo.
16
+ * OAuth codes are single-use and bound to that login process's state, so
17
+ * the URL is always re-extracted fresh from the log.
18
+ * claude-code host-creds — copies local ~/.claude/.credentials.json into the
19
+ * pod. Only ever via the explicit --from-host-creds flag.
20
+ *
21
+ * Detached-process discipline: exec calls are kept short; pod-side setsid
22
+ * processes survive client-side exec timeouts ('operation timed out'), so
23
+ * every launch tolerates the timeout and the poll loop discovers state.
24
+ */
25
+ import { existsSync } from 'node:fs';
26
+ import { homedir } from 'node:os';
27
+ import { join } from 'node:path';
28
+ import { createInterface } from 'node:readline/promises';
29
+ import { APIError, } from '@hypercli.com/sdk';
30
+ import { parseCommandArgs } from '../core/argv.js';
31
+ import { CliError, UsageError } from '../core/errors.js';
32
+ import { resolveAgentRef } from './agents.js';
33
+ const CODEX_LOG = '/tmp/devauth.log';
34
+ const CLAUDE_LOG = '/tmp/clin.log';
35
+ const CLAUDE_FIFO = '/tmp/clinf';
36
+ /** Short exec timeouts: ws round trips only; detached pod processes survive. */
37
+ const EXEC_TIMEOUT_SEC = 25;
38
+ // ---------------------------------------------------------------------------
39
+ // log text helpers (unit-tested against realistic sample lines)
40
+ // ---------------------------------------------------------------------------
41
+ /** CSI/OSC/charset ANSI escapes and lone ESC sequences. */
42
+ const ANSI_SEQUENCE = /\x1b\][^\x07\x1b]*(?:\x07|\x1b\\)|\x1b\[[0-?]*[ -/]*[@-~]|\x1b[()][0-2A-B]|\x1b[@-Z\\-_]/g;
43
+ /** Strip ANSI escapes from pod log output before any regex extraction. */
44
+ export function stripAnsi(input) {
45
+ return input.replace(ANSI_SEQUENCE, '');
46
+ }
47
+ const CODEX_URL_RE = /https:\/\/auth\.openai\.com\/codex\/device[^\s"')\]]*/;
48
+ const CODEX_CODE_RE = /\b([A-Z0-9]{4,6}-[A-Z0-9]{4,6})\b/;
49
+ const CLAUDE_URL_RE = /https:\/\/claude\.com\/cai\/oauth\/authorize[^\s"'|\\)\]]*/i;
50
+ /** Pull the device-auth URL + one-time code out of codex's log. */
51
+ export function extractCodexDeviceAuth(log) {
52
+ const clean = stripAnsi(log);
53
+ return {
54
+ url: CODEX_URL_RE.exec(clean)?.[0],
55
+ code: CODEX_CODE_RE.exec(clean)?.[1],
56
+ };
57
+ }
58
+ export function codexDeviceAuthOutcome(log) {
59
+ const clean = stripAnsi(log);
60
+ if (/successfully logged in/i.test(clean))
61
+ return 'success';
62
+ if (/\b(failed|expired|denied)\b/i.test(clean))
63
+ return 'failed';
64
+ return undefined;
65
+ }
66
+ /** Pull the OAuth authorize URL out of `claude auth login` output. */
67
+ export function extractClaudeOAuthUrl(log) {
68
+ return CLAUDE_URL_RE.exec(stripAnsi(log))?.[0];
69
+ }
70
+ export function claudePasteOutcome(log) {
71
+ const clean = stripAnsi(log);
72
+ if (/login successful/i.test(clean))
73
+ return 'success';
74
+ if (/login (failed|error)|authentication failed/i.test(clean))
75
+ return 'failed';
76
+ return undefined;
77
+ }
78
+ /** `claude auth status` prints JSON; tolerate it embedded in noisier output. */
79
+ export function claudeStatusLoggedIn(text) {
80
+ const clean = stripAnsi(text).trim();
81
+ try {
82
+ const parsed = JSON.parse(clean);
83
+ if (parsed.loggedIn === true)
84
+ return true;
85
+ }
86
+ catch {
87
+ // Not single-document JSON; fall through to the regex.
88
+ }
89
+ return /"loggedIn"\s*:\s*true/.test(clean);
90
+ }
91
+ /** POSIX single-quote an argv fragment (the pasted code rides through sh). */
92
+ export function shQuote(value) {
93
+ return `'${value.replace(/'/g, `'\\''`)}'`;
94
+ }
95
+ const MAX_CONSECUTIVE_READ_ERRORS = 5;
96
+ function describeError(err) {
97
+ if (err instanceof APIError)
98
+ return `HTTP ${err.statusCode}: ${err.detail}`;
99
+ if (err instanceof Error)
100
+ return err.message;
101
+ return String(err);
102
+ }
103
+ export async function pollLog(opts) {
104
+ const now = opts.now ?? (() => Date.now());
105
+ const sleep = opts.sleep ?? ((ms) => new Promise((resolve) => setTimeout(resolve, ms)));
106
+ const random = opts.random ?? Math.random;
107
+ const minMs = opts.minIntervalMs ?? 3_000;
108
+ const maxMs = Math.max(minMs, opts.maxIntervalMs ?? 5_000);
109
+ let consecutiveErrors = 0;
110
+ for (;;) {
111
+ if (now() >= opts.deadlineAtMs) {
112
+ throw new CliError(`login: timed out waiting for ${opts.waitingFor}`);
113
+ }
114
+ let text = null;
115
+ try {
116
+ text = await opts.read();
117
+ consecutiveErrors = 0;
118
+ }
119
+ catch (err) {
120
+ consecutiveErrors += 1;
121
+ if (consecutiveErrors >= MAX_CONSECUTIVE_READ_ERRORS) {
122
+ throw new CliError(`login: log poll failed repeatedly: ${describeError(err)}`);
123
+ }
124
+ }
125
+ if (text !== null) {
126
+ const abort = opts.fail?.(text);
127
+ if (abort !== undefined) {
128
+ throw new CliError(`login: aborted waiting for ${opts.waitingFor}: ${abort}`);
129
+ }
130
+ const hit = opts.extract(text);
131
+ if (hit !== undefined)
132
+ return hit;
133
+ }
134
+ const remaining = opts.deadlineAtMs - now();
135
+ if (remaining <= 0) {
136
+ throw new CliError(`login: timed out waiting for ${opts.waitingFor}`);
137
+ }
138
+ await sleep(Math.min(minMs + random() * (maxMs - minMs), remaining));
139
+ }
140
+ }
141
+ async function execPod(d, id, argv) {
142
+ return d.exec(id, argv, { timeout: EXEC_TIMEOUT_SEC });
143
+ }
144
+ function isExecTimeout(err) {
145
+ return err instanceof Error && /timed?\s*out/i.test(err.message);
146
+ }
147
+ /** exec that must succeed: throws CliError on transport failure or nonzero exit. */
148
+ async function execChecked(fx, argv, what) {
149
+ let res;
150
+ try {
151
+ res = await execPod(fx.d, fx.agentId, argv);
152
+ }
153
+ catch (err) {
154
+ throw new CliError(`login: could not ${what}: ${describeError(err)}`);
155
+ }
156
+ if (res.exitCode !== 0) {
157
+ const stderr = stripAnsi(res.stderr).trim().slice(0, 200);
158
+ throw new CliError(`login: could not ${what}: exit ${res.exitCode}${stderr ? `: ${stderr}` : ''}`);
159
+ }
160
+ return res;
161
+ }
162
+ /**
163
+ * Fire-and-forget launch of a detached pod command. A client-side exec
164
+ * timeout is NOT a failure: the setsid process keeps running and the poll
165
+ * loop picks up its log output.
166
+ */
167
+ async function launchDetached(fx, argv, what) {
168
+ try {
169
+ const res = await execPod(fx.d, fx.agentId, argv);
170
+ if (res.exitCode !== 0) {
171
+ fx.io.info(`login: ${what} launcher exited ${res.exitCode}; polling for evidence anyway`);
172
+ }
173
+ }
174
+ catch (err) {
175
+ if (isExecTimeout(err)) {
176
+ fx.io.info(`login: ${what} launch exec timed out client-side; the detached process survives — polling`);
177
+ return;
178
+ }
179
+ throw new CliError(`login: could not launch ${what}: ${describeError(err)}`);
180
+ }
181
+ }
182
+ /** `cat <path>` reader for pollLog: missing/short-timeout reads -> null (keep polling). */
183
+ function logReader(d, id, path) {
184
+ return async () => {
185
+ try {
186
+ const res = await execPod(d, id, ['cat', path]);
187
+ return res.exitCode === 0 ? stripAnsi(res.stdout) : null;
188
+ }
189
+ catch (err) {
190
+ if (isExecTimeout(err))
191
+ return null;
192
+ throw err;
193
+ }
194
+ };
195
+ }
196
+ const LAUNCH_FAILURE_RE = /command not found|no such file or directory|permission denied/i;
197
+ function launchFailureFromLog(text) {
198
+ return LAUNCH_FAILURE_RE.test(text)
199
+ ? 'the login process failed to start (is the runtime CLI installed in the pod?)'
200
+ : undefined;
201
+ }
202
+ // ---------------------------------------------------------------------------
203
+ // flow: codex device-auth
204
+ // ---------------------------------------------------------------------------
205
+ async function runCodexDeviceAuth(fx) {
206
+ await launchDetached(fx, ['sh', '-c', `rm -f ${CODEX_LOG}; setsid nohup codex login --device-auth > ${CODEX_LOG} 2>&1 & echo $!`], 'codex login --device-auth');
207
+ fx.io.info('waiting for the codex device-auth code...');
208
+ const pair = await pollLog({
209
+ read: logReader(fx.d, fx.agentId, CODEX_LOG),
210
+ extract: (text) => {
211
+ const { url, code } = extractCodexDeviceAuth(text);
212
+ return url && code ? { url, code } : undefined;
213
+ },
214
+ fail: launchFailureFromLog,
215
+ deadlineAtMs: fx.deadlineAtMs,
216
+ waitingFor: 'the codex device-auth URL and code',
217
+ });
218
+ fx.io.announce(pair.url, pair.code);
219
+ fx.io.info('waiting for the login to complete (codes expire after 15 minutes)...');
220
+ const outcome = await pollLog({
221
+ read: logReader(fx.d, fx.agentId, CODEX_LOG),
222
+ extract: codexDeviceAuthOutcome,
223
+ deadlineAtMs: fx.deadlineAtMs,
224
+ waitingFor: 'codex to confirm the login',
225
+ });
226
+ if (outcome !== 'success') {
227
+ throw new CliError('login: codex device-auth failed or the code expired; run again for a fresh code');
228
+ }
229
+ fx.io.info('verifying with codex login status...');
230
+ const status = await execChecked(fx, ['codex', 'login', 'status'], 'verify the codex login');
231
+ if (!/logged in/i.test(stripAnsi(status.stdout))) {
232
+ throw new CliError(`login: 'codex login status' does not report a login: ${stripAnsi(status.stdout).trim().slice(0, 200)}`);
233
+ }
234
+ return {
235
+ loggedIn: true,
236
+ flow: 'device-auth',
237
+ runtime: 'codex',
238
+ agentId: fx.agentId,
239
+ detail: stripAnsi(status.stdout).trim().slice(0, 200),
240
+ };
241
+ }
242
+ // ---------------------------------------------------------------------------
243
+ // flow: claude-code paste-back
244
+ // ---------------------------------------------------------------------------
245
+ async function runClaudePasteBack(fx) {
246
+ const { d, agentId, io } = fx;
247
+ await launchDetached(fx, ['sh', '-c', `mkfifo ${CLAUDE_FIFO}; (setsid nohup claude auth login < ${CLAUDE_FIFO} > ${CLAUDE_LOG} 2>&1 &); (setsid nohup sleep 600 > ${CLAUDE_FIFO} &)`], 'claude auth login');
248
+ try {
249
+ io.info('waiting for the Claude OAuth URL...');
250
+ const url = await pollLog({
251
+ read: logReader(d, agentId, CLAUDE_LOG),
252
+ extract: extractClaudeOAuthUrl,
253
+ fail: launchFailureFromLog,
254
+ deadlineAtMs: fx.deadlineAtMs,
255
+ waitingFor: 'the Claude OAuth URL',
256
+ });
257
+ io.announce(url);
258
+ const code = await io.readInput('Paste the code#state string from the callback page: ');
259
+ await execChecked(fx, ['sh', '-c', `printf '%s\\n' ${shQuote(code)} > ${CLAUDE_FIFO}`], 'pass the code to claude');
260
+ io.info('code delivered; waiting for the login to complete...');
261
+ const outcome = await pollLog({
262
+ read: logReader(d, agentId, CLAUDE_LOG),
263
+ extract: claudePasteOutcome,
264
+ deadlineAtMs: fx.deadlineAtMs,
265
+ waitingFor: 'claude to confirm the login',
266
+ });
267
+ if (outcome !== 'success') {
268
+ throw new CliError('login: claude reported the login failed (OAuth codes are single-use — run again for a fresh URL)');
269
+ }
270
+ io.info('verifying with claude auth status...');
271
+ const status = await execChecked(fx, ['claude', 'auth', 'status'], 'verify the claude login');
272
+ if (!claudeStatusLoggedIn(status.stdout)) {
273
+ throw new CliError(`login: 'claude auth status' does not report loggedIn:true: ${stripAnsi(status.stdout).trim().slice(0, 200)}`);
274
+ }
275
+ return {
276
+ loggedIn: true,
277
+ flow: 'paste-back',
278
+ runtime: 'claude-code',
279
+ agentId,
280
+ detail: 'claude auth status: loggedIn:true',
281
+ };
282
+ }
283
+ finally {
284
+ try {
285
+ await execPod(d, agentId, [
286
+ 'sh', '-c',
287
+ `pkill -f "claude auth login" >/dev/null 2>&1; pkill -f "^sleep 600\$" >/dev/null 2>&1; rm -f ${CLAUDE_FIFO} ${CLAUDE_LOG}`,
288
+ ]);
289
+ }
290
+ catch (err) {
291
+ io.info(`login: cleanup warning: ${describeError(err)}`);
292
+ }
293
+ }
294
+ }
295
+ // ---------------------------------------------------------------------------
296
+ // flow: claude-code host-creds seed
297
+ // ---------------------------------------------------------------------------
298
+ const POD_CLAUDE_CREDS = '/home/node/.claude/.credentials.json';
299
+ async function runClaudeHostCreds(fx) {
300
+ const local = join(homedir(), '.claude', '.credentials.json');
301
+ if (!existsSync(local)) {
302
+ throw new CliError(`login: no local Claude credentials at ${local}; run 'claude auth login' locally first (or use --flow paste-back)`);
303
+ }
304
+ fx.io.info(`seeding ${local} into the pod`);
305
+ try {
306
+ // cp dst is sync-root-relative; an absolute-path fix is landing separately,
307
+ // so land the file at the sync root and move it into place.
308
+ await fx.d.cpTo(fx.agentId, local, '.credentials.json');
309
+ }
310
+ catch (err) {
311
+ throw new CliError(`login: could not copy credentials into the pod: ${describeError(err)}`);
312
+ }
313
+ await execChecked(fx, [
314
+ 'sh', '-c',
315
+ `mkdir -p /home/node/.claude && mv /home/node/.credentials.json ${POD_CLAUDE_CREDS} && chmod 600 ${POD_CLAUDE_CREDS}`,
316
+ ], 'install the credentials file');
317
+ fx.io.info('verifying with claude auth status...');
318
+ const status = await execChecked(fx, ['claude', 'auth', 'status'], 'verify the claude login');
319
+ if (!claudeStatusLoggedIn(status.stdout)) {
320
+ throw new CliError(`login: credentials seeded but 'claude auth status' does not report loggedIn:true`);
321
+ }
322
+ return {
323
+ loggedIn: true,
324
+ flow: 'host-creds',
325
+ runtime: 'claude-code',
326
+ agentId: fx.agentId,
327
+ detail: 'claude auth status: loggedIn:true',
328
+ };
329
+ }
330
+ // ---------------------------------------------------------------------------
331
+ // flow: env advisories (no exec)
332
+ // ---------------------------------------------------------------------------
333
+ const CLAUDE_ENV_ADVISORY = 'claude-code pods read CLAUDE_CODE_OAUTH_TOKEN (or ANTHROPIC_AUTH_TOKEN) from the pod environment at launch; set it at create time: hyper agents create <name> --runtime claude-code --env CLAUDE_CODE_OAUTH_TOKEN=<token>';
334
+ const CODEX_ENV_ADVISORY = 'codex pods read OPENAI_API_KEY from the pod environment at launch; set it at create time: hyper agents create <name> --runtime codex --env OPENAI_API_KEY=<key> (or use --flow device-auth)';
335
+ function envAdvisoryFlow(runtime, advisory) {
336
+ return {
337
+ name: 'env',
338
+ runtime,
339
+ requiresWalletUserInput: { type: 'none' },
340
+ summary: 'print the at-launch env-injection advisory (no exec)',
341
+ run: async (fx) => {
342
+ fx.io.info(advisory);
343
+ return { loggedIn: false, flow: 'env', runtime, agentId: fx.agentId, detail: advisory };
344
+ },
345
+ };
346
+ }
347
+ // ---------------------------------------------------------------------------
348
+ // registry
349
+ // ---------------------------------------------------------------------------
350
+ export const LOGIN_FLOWS = new Map([
351
+ ['codex', [
352
+ {
353
+ name: 'device-auth',
354
+ runtime: 'codex',
355
+ requiresWalletUserInput: { type: 'none' },
356
+ summary: 'codex login --device-auth in the pod; user completes the URL+code in a browser',
357
+ run: runCodexDeviceAuth,
358
+ },
359
+ envAdvisoryFlow('codex', CODEX_ENV_ADVISORY),
360
+ ]],
361
+ ['claude-code', [
362
+ {
363
+ name: 'paste-back',
364
+ runtime: 'claude-code',
365
+ requiresWalletUserInput: { type: 'code-paste' },
366
+ summary: 'claude auth login over a fifo; user pastes back the code#state from the callback page',
367
+ run: runClaudePasteBack,
368
+ },
369
+ {
370
+ name: 'host-creds',
371
+ runtime: 'claude-code',
372
+ requiresWalletUserInput: { type: 'none' },
373
+ summary: 'seed local ~/.claude/.credentials.json into the pod (requires --from-host-creds)',
374
+ run: runClaudeHostCreds,
375
+ },
376
+ envAdvisoryFlow('claude-code', CLAUDE_ENV_ADVISORY),
377
+ ]],
378
+ ]);
379
+ const DEFAULT_FLOW = new Map([
380
+ ['codex', 'device-auth'],
381
+ ['claude-code', 'paste-back'],
382
+ ]);
383
+ /** Native-path hints for runtimes with no flow (point users at the real path). */
384
+ const NATIVE_LOGIN_HINTS = {
385
+ opencode: 'opencode authenticates in-pod: hyper agents exec <id> -- opencode auth login -p openai -m "ChatGPT Pro/Plus (headless)"',
386
+ goose: 'goose reads provider credentials from the pod environment at launch: hyper agents create <name> --runtime goose --env ...',
387
+ 'kimi-code': 'kimi-code reads provider credentials from the pod environment at launch: hyper agents create <name> --runtime kimi-code --env ...',
388
+ 'buzz-agent': 'buzz-agent is configured at launch via env; there is no interactive pod login',
389
+ pi: 'Pi uses native provider configuration: open hyper agents shell <id>, then run pi to configure API keys or login',
390
+ openclaw_acp: 'openclaw authenticates in-pod over ACP; there is no pod login flow',
391
+ hermes_acp: 'hermes authenticates in-pod over ACP; there is no pod login flow',
392
+ };
393
+ // ---------------------------------------------------------------------------
394
+ // command
395
+ // ---------------------------------------------------------------------------
396
+ const LOGIN_USAGE = [
397
+ 'hyper agents login <id> [--flow F] [--provider X] [--session SECS] [--key-stdin] [--from-host-creds] [--json]',
398
+ '',
399
+ 'flows by runtime:',
400
+ ' codex device-auth (default), env',
401
+ ' claude-code paste-back (default), host-creds (requires --from-host-creds), env',
402
+ '',
403
+ '--session SECS overall deadline for the interactive window (default 900)',
404
+ '--json machine output: {"url":..., "code"?} then a final {"loggedIn": true, ...};',
405
+ ' paste-back reads the code#state back as one line on stdin',
406
+ ].join('\n');
407
+ function positiveSeconds(parsed, key, fallback) {
408
+ const raw = parsed.values[key];
409
+ if (raw === undefined)
410
+ return fallback;
411
+ const value = Number(raw);
412
+ if (!Number.isFinite(value) || value <= 0) {
413
+ throw new UsageError(`--${key} must be a positive number of seconds (got '${String(raw)}')`);
414
+ }
415
+ return Math.round(value);
416
+ }
417
+ function makeIO(ctx, hooks) {
418
+ const machine = ctx.format === 'json' || process.stdout.isTTY !== true;
419
+ return {
420
+ machine,
421
+ info: (message) => ctx.output.info(message),
422
+ announce(url, code) {
423
+ if (machine) {
424
+ process.stdout.write(`${JSON.stringify({ url, ...(code ? { code } : {}) })}\n`);
425
+ return;
426
+ }
427
+ ctx.output.result({ url, ...(code ? { code } : {}) }, [`Open this URL to authenticate:`, ` ${url}`, ...(code ? ['', `Enter code: ${code}`] : [])].join('\n'));
428
+ },
429
+ async readInput(prompt) {
430
+ if (hooks.readInput) {
431
+ const injected = (await hooks.readInput(prompt)).trim();
432
+ if (!injected)
433
+ throw new CliError('login: empty code received');
434
+ return injected;
435
+ }
436
+ if (machine)
437
+ this.info('reading the code#state as one line on stdin...');
438
+ const rl = createInterface({ input: process.stdin, output: process.stderr });
439
+ try {
440
+ const answer = (await rl.question(machine ? '' : prompt)).trim();
441
+ if (!answer)
442
+ throw new CliError('login: no code received on stdin');
443
+ return answer;
444
+ }
445
+ finally {
446
+ rl.close();
447
+ }
448
+ },
449
+ finish(outcome, provider) {
450
+ ctx.output.result({
451
+ loggedIn: outcome.loggedIn,
452
+ flow: outcome.flow,
453
+ runtime: outcome.runtime,
454
+ agent_id: outcome.agentId,
455
+ ...(provider !== undefined ? { provider } : {}),
456
+ ...(outcome.detail !== undefined ? { detail: outcome.detail } : {}),
457
+ }, outcome.loggedIn
458
+ ? `logged in (runtime ${outcome.runtime}, flow ${outcome.flow})${outcome.detail ? `\n${outcome.detail}` : ''}`
459
+ : outcome.detail ?? 'login flow finished without a login');
460
+ },
461
+ };
462
+ }
463
+ /** Exported for `hyper agents login` wiring in agents.ts. */
464
+ export async function cmdAgentsLogin(ctx, args, hooks = {}) {
465
+ const parsed = parseCommandArgs(args, {
466
+ flow: { type: 'string' },
467
+ provider: { type: 'string' },
468
+ session: { type: 'string' },
469
+ 'key-stdin': { type: 'boolean', default: false },
470
+ 'from-host-creds': { type: 'boolean', default: false },
471
+ });
472
+ if (parsed.help) {
473
+ process.stdout.write(`${LOGIN_USAGE}\n`);
474
+ return;
475
+ }
476
+ if (parsed.positionals.length !== 1) {
477
+ throw new UsageError('usage: hyper agents login <id> [--flow F] [--provider X] [--session SECS] [--key-stdin] [--from-host-creds] [--json]');
478
+ }
479
+ const ref = parsed.positionals[0];
480
+ let flowName = typeof parsed.values.flow === 'string' ? parsed.values.flow : undefined;
481
+ const provider = typeof parsed.values.provider === 'string' ? parsed.values.provider : undefined;
482
+ const keyStdin = parsed.values['key-stdin'] === true;
483
+ const fromHostCreds = parsed.values['from-host-creds'] === true;
484
+ const sessionSec = positiveSeconds(parsed, 'session', 900);
485
+ const io = makeIO(ctx, hooks);
486
+ const client = await ctx.client();
487
+ const d = client.deployments;
488
+ const id = await resolveAgentRef(d, ref);
489
+ let agent;
490
+ try {
491
+ agent = await d.get(id);
492
+ }
493
+ catch (err) {
494
+ throw new CliError(`login: get agent failed: ${describeError(err)}`);
495
+ }
496
+ const runtime = (agent.runtime ?? '').toLowerCase();
497
+ if (!runtime)
498
+ throw new CliError('login: the agent record carries no runtime');
499
+ if (fromHostCreds) {
500
+ if (runtime !== 'claude-code') {
501
+ throw new UsageError('--from-host-creds is only valid for claude-code agents');
502
+ }
503
+ if (flowName !== undefined && flowName !== 'host-creds') {
504
+ throw new UsageError('--from-host-creds only pairs with --flow host-creds');
505
+ }
506
+ flowName = 'host-creds';
507
+ }
508
+ if (flowName === 'host-creds' && !fromHostCreds) {
509
+ throw new UsageError('the host-creds flow copies your local Claude credentials into the pod; pass --from-host-creds to allow this explicitly');
510
+ }
511
+ // --key-stdin never runs exec stdin today (exec-stdin support lands
512
+ // separately): refuse clearly, except on claude-code where the answer is
513
+ // the at-launch env advisory.
514
+ if (keyStdin) {
515
+ if (runtime === 'claude-code') {
516
+ const flow = envAdvisoryFlow('claude-code', CLAUDE_ENV_ADVISORY);
517
+ io.finish(await flow.run({ d, agentId: id, deadlineAtMs: 0, io, provider }), provider);
518
+ return;
519
+ }
520
+ throw new CliError('login: --key-stdin is not yet supported: agents exec has no stdin channel yet '
521
+ + '(pod-side exec-stdin support is landing separately). '
522
+ + `Use ${runtime === 'codex' ? '--flow device-auth' : 'the available login flows'} or \`hyper agents login ${ref} --help\`.`);
523
+ }
524
+ const flows = LOGIN_FLOWS.get(runtime);
525
+ if (!flows || flows.length === 0) {
526
+ const hint = NATIVE_LOGIN_HINTS[runtime];
527
+ throw new CliError(`login: runtime '${runtime}' has no login flow.${hint ? `\n${hint}` : ''}`);
528
+ }
529
+ const chosenName = flowName ?? DEFAULT_FLOW.get(runtime) ?? flows[0].name;
530
+ const flow = flows.find((entry) => entry.name === chosenName);
531
+ if (!flow) {
532
+ throw new UsageError(`unknown --flow '${chosenName}' for runtime '${runtime}' (available: ${flows.map((entry) => entry.name).join(', ')})`);
533
+ }
534
+ if (flowName === undefined && runtime === 'claude-code') {
535
+ io.info('hint: to seed your local Claude credentials instead, run with --flow host-creds --from-host-creds');
536
+ }
537
+ const now = hooks.now ?? (() => Date.now());
538
+ const fx = {
539
+ d,
540
+ agentId: id,
541
+ deadlineAtMs: now() + sessionSec * 1000,
542
+ io,
543
+ ...(provider !== undefined ? { provider } : {}),
544
+ };
545
+ io.finish(await flow.run(fx), provider);
546
+ }
547
+ //# sourceMappingURL=agent-login.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agent-login.js","sourceRoot":"","sources":["../../src/commands/agent-login.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,48 @@
1
+ /**
2
+ * `hyper agents` — manage hosted agents (deployments).
3
+ *
4
+ * Golden-pattern duties carried by this group:
5
+ * - <id> arguments accept an unambiguous id prefix (list + prefix match,
6
+ * ambiguous -> UsageError listing candidates). Later groups copy this.
7
+ * - Records render as label/value blocks and curated JSON bags; gateway
8
+ * tokens, jwt tokens, and secret-shaped values are redacted to last-4.
9
+ *
10
+ * Substitutions against the original spec (records.ts / Commands.adopt do not
11
+ * exist in the frozen core, so this module ships local equivalents):
12
+ * - adopt(ctx) resolves the lazy SDK client (ctx.client()) once per call.
13
+ * - routines ride client.routines (RoutinesAPI), not d.routines.
14
+ * - activate calls client.agent.redeemGrantCode (agent.ts), not a
15
+ * deployments method.
16
+ * - token calls d.createScopedKey(id, name); the SDK has no typed scopes
17
+ * field, so repeated --scope values are joined into the key name.
18
+ */
19
+ import { type Deployments } from '@hypercli.com/sdk';
20
+ import type { CommandContext } from '../core/types.js';
21
+ export declare const name = "agents";
22
+ export declare const summary = "Manage hosted agents (deployments, shells, logs, files, routines).";
23
+ export declare const usage: string[];
24
+ /** Map a stored or user-supplied legacy runtime spelling to its canonical name. */
25
+ export declare function canonicalRuntimeName(runtime: string): string;
26
+ /**
27
+ * Resolve a user-typed <id> reference to a full agent id.
28
+ *
29
+ * hyper agents status a1b2 — prefix of exactly one id/name/handle/hostname
30
+ * ambiguous — UsageError (exit 2) listing candidates
31
+ * no match — CliError (exit 1)
32
+ *
33
+ * Exported for `hyper routines` (routines.ts) so --agent resolves identically.
34
+ */
35
+ export declare function resolveAgentRef(d: Deployments, ref: string): Promise<string>;
36
+ /**
37
+ * Piped stdin collector for cmdExec. A TTY keeps exec strictly one-shot:
38
+ * stdin stays untouched and the pod command sees no stdin attachment at all.
39
+ * A pipe is drained to EOF and forwarded; an unbounded pipe is a caller error,
40
+ * exactly like `kubectl exec -i` on a never-closing stream.
41
+ */
42
+ declare function readPipedExecStdin(): Promise<Uint8Array | undefined>;
43
+ /** Test seam: tests replace `collect` instead of piping process.stdin. */
44
+ export declare const execStdin: {
45
+ collect: typeof readPipedExecStdin;
46
+ };
47
+ export declare function run(ctx: CommandContext, args: string[]): Promise<number | void>;
48
+ export {};