agent-relay 6.0.22 → 6.2.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.
Files changed (117) hide show
  1. package/dist/index.cjs +338 -49
  2. package/dist/src/cli/bootstrap.d.ts.map +1 -1
  3. package/dist/src/cli/bootstrap.js +62 -0
  4. package/dist/src/cli/bootstrap.js.map +1 -1
  5. package/dist/src/cli/commands/agent-management.d.ts +8 -0
  6. package/dist/src/cli/commands/agent-management.d.ts.map +1 -1
  7. package/dist/src/cli/commands/agent-management.js +34 -0
  8. package/dist/src/cli/commands/agent-management.js.map +1 -1
  9. package/dist/src/cli/commands/drive.d.ts +222 -0
  10. package/dist/src/cli/commands/drive.d.ts.map +1 -0
  11. package/dist/src/cli/commands/drive.js +565 -0
  12. package/dist/src/cli/commands/drive.js.map +1 -0
  13. package/dist/src/cli/commands/messaging.d.ts +25 -0
  14. package/dist/src/cli/commands/messaging.d.ts.map +1 -1
  15. package/dist/src/cli/commands/messaging.js +702 -138
  16. package/dist/src/cli/commands/messaging.js.map +1 -1
  17. package/dist/src/cli/commands/new.d.ts +112 -0
  18. package/dist/src/cli/commands/new.d.ts.map +1 -0
  19. package/dist/src/cli/commands/new.js +189 -0
  20. package/dist/src/cli/commands/new.js.map +1 -0
  21. package/dist/src/cli/commands/on/provision.d.ts +1 -1
  22. package/dist/src/cli/commands/on/provision.d.ts.map +1 -1
  23. package/dist/src/cli/commands/on/provision.js +1 -1
  24. package/dist/src/cli/commands/on/provision.js.map +1 -1
  25. package/dist/src/cli/commands/on/start.d.ts +1 -1
  26. package/dist/src/cli/commands/on/start.d.ts.map +1 -1
  27. package/dist/src/cli/commands/on/start.js +2 -2
  28. package/dist/src/cli/commands/on/start.js.map +1 -1
  29. package/dist/src/cli/commands/passthrough.d.ts +142 -0
  30. package/dist/src/cli/commands/passthrough.d.ts.map +1 -0
  31. package/dist/src/cli/commands/passthrough.js +398 -0
  32. package/dist/src/cli/commands/passthrough.js.map +1 -0
  33. package/dist/src/cli/commands/rm.d.ts +52 -0
  34. package/dist/src/cli/commands/rm.d.ts.map +1 -0
  35. package/dist/src/cli/commands/rm.js +96 -0
  36. package/dist/src/cli/commands/rm.js.map +1 -0
  37. package/dist/src/cli/commands/view.d.ts +98 -0
  38. package/dist/src/cli/commands/view.d.ts.map +1 -0
  39. package/dist/src/cli/commands/view.js +238 -0
  40. package/dist/src/cli/commands/view.js.map +1 -0
  41. package/dist/src/cli/lib/agent-management-listing.d.ts +35 -7
  42. package/dist/src/cli/lib/agent-management-listing.d.ts.map +1 -1
  43. package/dist/src/cli/lib/agent-management-listing.js +188 -40
  44. package/dist/src/cli/lib/agent-management-listing.js.map +1 -1
  45. package/dist/src/cli/lib/attach.d.ts +56 -0
  46. package/dist/src/cli/lib/attach.d.ts.map +1 -0
  47. package/dist/src/cli/lib/attach.js +73 -0
  48. package/dist/src/cli/lib/attach.js.map +1 -0
  49. package/dist/src/cli/lib/broker-connection.d.ts +40 -0
  50. package/dist/src/cli/lib/broker-connection.d.ts.map +1 -0
  51. package/dist/src/cli/lib/broker-connection.js +82 -0
  52. package/dist/src/cli/lib/broker-connection.js.map +1 -0
  53. package/dist/src/cli/lib/formatting.d.ts +4 -0
  54. package/dist/src/cli/lib/formatting.d.ts.map +1 -1
  55. package/dist/src/cli/lib/formatting.js +31 -1
  56. package/dist/src/cli/lib/formatting.js.map +1 -1
  57. package/dist/src/cli/lib/sdk-client.d.ts +9 -0
  58. package/dist/src/cli/lib/sdk-client.d.ts.map +1 -0
  59. package/dist/src/cli/lib/sdk-client.js +28 -0
  60. package/dist/src/cli/lib/sdk-client.js.map +1 -0
  61. package/dist/src/cli/lib/spawn-and-attach.d.ts +132 -0
  62. package/dist/src/cli/lib/spawn-and-attach.d.ts.map +1 -0
  63. package/dist/src/cli/lib/spawn-and-attach.js +334 -0
  64. package/dist/src/cli/lib/spawn-and-attach.js.map +1 -0
  65. package/package.json +12 -10
  66. package/dist/packages/cloud/src/api-client.d.ts +0 -33
  67. package/dist/packages/cloud/src/api-client.d.ts.map +0 -1
  68. package/dist/packages/cloud/src/api-client.js +0 -123
  69. package/dist/packages/cloud/src/api-client.js.map +0 -1
  70. package/dist/packages/cloud/src/auth.d.ts +0 -13
  71. package/dist/packages/cloud/src/auth.d.ts.map +0 -1
  72. package/dist/packages/cloud/src/auth.js +0 -299
  73. package/dist/packages/cloud/src/auth.js.map +0 -1
  74. package/dist/packages/cloud/src/connect.d.ts +0 -45
  75. package/dist/packages/cloud/src/connect.d.ts.map +0 -1
  76. package/dist/packages/cloud/src/connect.js +0 -166
  77. package/dist/packages/cloud/src/connect.js.map +0 -1
  78. package/dist/packages/cloud/src/index.d.ts +0 -10
  79. package/dist/packages/cloud/src/index.d.ts.map +0 -1
  80. package/dist/packages/cloud/src/index.js +0 -10
  81. package/dist/packages/cloud/src/index.js.map +0 -1
  82. package/dist/packages/cloud/src/lib/ssh-interactive.d.ts +0 -70
  83. package/dist/packages/cloud/src/lib/ssh-interactive.d.ts.map +0 -1
  84. package/dist/packages/cloud/src/lib/ssh-interactive.js +0 -440
  85. package/dist/packages/cloud/src/lib/ssh-interactive.js.map +0 -1
  86. package/dist/packages/cloud/src/lib/ssh-runtime.d.ts +0 -35
  87. package/dist/packages/cloud/src/lib/ssh-runtime.d.ts.map +0 -1
  88. package/dist/packages/cloud/src/lib/ssh-runtime.js +0 -52
  89. package/dist/packages/cloud/src/lib/ssh-runtime.js.map +0 -1
  90. package/dist/packages/cloud/src/proactive-runtime.d.ts +0 -24
  91. package/dist/packages/cloud/src/proactive-runtime.d.ts.map +0 -1
  92. package/dist/packages/cloud/src/proactive-runtime.js +0 -315
  93. package/dist/packages/cloud/src/proactive-runtime.js.map +0 -1
  94. package/dist/packages/cloud/src/types.d.ts +0 -200
  95. package/dist/packages/cloud/src/types.d.ts.map +0 -1
  96. package/dist/packages/cloud/src/types.js +0 -12
  97. package/dist/packages/cloud/src/types.js.map +0 -1
  98. package/dist/packages/cloud/src/workflows.d.ts +0 -65
  99. package/dist/packages/cloud/src/workflows.d.ts.map +0 -1
  100. package/dist/packages/cloud/src/workflows.js +0 -892
  101. package/dist/packages/cloud/src/workflows.js.map +0 -1
  102. package/dist/packages/cloud/src/workspaces.d.ts +0 -11
  103. package/dist/packages/cloud/src/workspaces.d.ts.map +0 -1
  104. package/dist/packages/cloud/src/workspaces.js +0 -146
  105. package/dist/packages/cloud/src/workspaces.js.map +0 -1
  106. package/dist/packages/sdk/src/provisioner/local-jwks.d.ts +0 -25
  107. package/dist/packages/sdk/src/provisioner/local-jwks.d.ts.map +0 -1
  108. package/dist/packages/sdk/src/provisioner/local-jwks.js +0 -70
  109. package/dist/packages/sdk/src/provisioner/local-jwks.js.map +0 -1
  110. package/dist/packages/sdk/src/provisioner/seeder.d.ts +0 -17
  111. package/dist/packages/sdk/src/provisioner/seeder.d.ts.map +0 -1
  112. package/dist/packages/sdk/src/provisioner/seeder.js +0 -419
  113. package/dist/packages/sdk/src/provisioner/seeder.js.map +0 -1
  114. package/dist/packages/sdk/src/provisioner/token.d.ts +0 -41
  115. package/dist/packages/sdk/src/provisioner/token.d.ts.map +0 -1
  116. package/dist/packages/sdk/src/provisioner/token.js +0 -77
  117. package/dist/packages/sdk/src/provisioner/token.js.map +0 -1
@@ -0,0 +1,98 @@
1
+ /**
2
+ * `agent-relay view <name>` — read-only PTY stream client.
3
+ *
4
+ * Connects to a running broker's `/ws` WebSocket, filters the event stream
5
+ * for `worker_stream` frames matching the requested agent name, and writes
6
+ * each chunk's raw bytes to stdout (preserving ANSI escapes).
7
+ *
8
+ * No keystrokes are forwarded — the broker keeps doing whatever it's doing.
9
+ * Ctrl+C exits the client cleanly; the agent keeps running under the broker.
10
+ */
11
+ import { Command } from 'commander';
12
+ import WebSocket from 'ws';
13
+ import { captureAndRenderSnapshot, type AttachSnapshotConnection, type AttachSnapshotDeps } from '../lib/attach.js';
14
+ type ExitFn = (code: number) => never;
15
+ /** Subset of the broker's `BrokerEvent` we actually care about for `view`. */
16
+ export interface ViewableWorkerStreamEvent {
17
+ kind: 'worker_stream';
18
+ name: string;
19
+ stream: string;
20
+ chunk: string;
21
+ }
22
+ /** Connection metadata discovered from `connection.json` or CLI/env overrides. */
23
+ export interface ViewBrokerConnection {
24
+ url: string;
25
+ apiKey?: string;
26
+ }
27
+ export interface ViewWebSocket {
28
+ on(event: 'open', listener: () => void): unknown;
29
+ on(event: 'message', listener: (data: WebSocket.RawData) => void): unknown;
30
+ on(event: 'close', listener: (code: number, reason: Buffer) => void): unknown;
31
+ on(event: 'error', listener: (err: Error) => void): unknown;
32
+ close(code?: number, reason?: string): void;
33
+ }
34
+ export type ViewWebSocketFactory = (url: string, headers: Record<string, string>) => ViewWebSocket;
35
+ export interface ViewSignalRegistrar {
36
+ (signal: NodeJS.Signals, handler: () => void | Promise<void>): void;
37
+ }
38
+ export interface ViewDependencies {
39
+ /** Reads `<state-dir>/connection.json` and returns parsed JSON, or null. */
40
+ readConnectionFile: (stateDir: string) => unknown;
41
+ /** Project paths helper — used to pick the default state dir. */
42
+ getDefaultStateDir: () => string;
43
+ /** Environment variables (so tests can inject). */
44
+ env: NodeJS.ProcessEnv;
45
+ /** Factory for the WebSocket — overridden in tests with a mock. */
46
+ createWebSocket: ViewWebSocketFactory;
47
+ /** Where the PTY chunks get written. Defaults to `process.stdout.write`. */
48
+ writeChunk: (chunk: string) => void;
49
+ /** Signal registration (so tests can drive SIGINT without killing the test). */
50
+ onSignal: ViewSignalRegistrar;
51
+ log: (...args: unknown[]) => void;
52
+ error: (...args: unknown[]) => void;
53
+ exit: ExitFn;
54
+ /** HTTP client used by the snapshot-on-attach call. Defaults to global `fetch`. */
55
+ fetch: typeof globalThis.fetch;
56
+ /** Override for the snapshot-on-attach helper (tests substitute a stub). */
57
+ captureAndRenderSnapshot: (connection: AttachSnapshotConnection, agentName: string, deps: AttachSnapshotDeps) => ReturnType<typeof captureAndRenderSnapshot>;
58
+ }
59
+ /**
60
+ * Resolve the broker connection to use for `view`, in priority order:
61
+ *
62
+ * 1. `--broker-url` / `--api-key` CLI flags
63
+ * 2. `RELAY_BROKER_URL` / `RELAY_BROKER_API_KEY` environment variables
64
+ * 3. `<state-dir>/connection.json` (default `.agent-relay/connection.json`)
65
+ *
66
+ * Matches the resolution order used by `agent-relay-broker dump-pty` so users
67
+ * don't have to learn two patterns.
68
+ */
69
+ export declare function resolveViewBrokerConnection(options: {
70
+ brokerUrl?: string;
71
+ apiKey?: string;
72
+ stateDir?: string;
73
+ }, deps: ViewDependencies): ViewBrokerConnection | null;
74
+ /** Convert an `http(s)://host:port` base URL to the matching `ws(s)://…/ws`. */
75
+ export declare function toWsUrl(baseUrl: string): string;
76
+ /**
77
+ * Inspect a single WebSocket message and, if it's a `worker_stream` event for
78
+ * the requested agent, return the raw chunk string. Returns `null` for events
79
+ * that don't match (other kinds, other agents, malformed JSON, etc.) so the
80
+ * caller can ignore them.
81
+ *
82
+ * Exported for unit testing the filter in isolation from any WebSocket.
83
+ */
84
+ export declare function extractMatchingChunk(rawMessage: string, agentName: string): string | null;
85
+ /**
86
+ * Open the read-only view stream and run until the WebSocket closes, the
87
+ * caller signals SIGINT/SIGTERM, or an unrecoverable error occurs. Resolves
88
+ * with the exit code the CLI should propagate.
89
+ */
90
+ export declare function runViewSession(agentName: string, options: {
91
+ brokerUrl?: string;
92
+ apiKey?: string;
93
+ stateDir?: string;
94
+ }, deps: ViewDependencies): Promise<number>;
95
+ /** Register `agent-relay view <name>` on the supplied commander program. */
96
+ export declare function registerViewCommands(program: Command, overrides?: Partial<ViewDependencies>): void;
97
+ export {};
98
+ //# sourceMappingURL=view.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"view.d.ts","sourceRoot":"","sources":["../../../../src/cli/commands/view.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,238 @@
1
+ /**
2
+ * `agent-relay view <name>` — read-only PTY stream client.
3
+ *
4
+ * Connects to a running broker's `/ws` WebSocket, filters the event stream
5
+ * for `worker_stream` frames matching the requested agent name, and writes
6
+ * each chunk's raw bytes to stdout (preserving ANSI escapes).
7
+ *
8
+ * No keystrokes are forwarded — the broker keeps doing whatever it's doing.
9
+ * Ctrl+C exits the client cleanly; the agent keeps running under the broker.
10
+ */
11
+ import fs from 'node:fs';
12
+ import path from 'node:path';
13
+ import WebSocket from 'ws';
14
+ import { getProjectPaths } from '@agent-relay/config';
15
+ import { captureAndRenderSnapshot, } from '../lib/attach.js';
16
+ import { defaultExit, runSignalHandler } from '../lib/exit.js';
17
+ function readConnectionFileFromDisk(stateDir) {
18
+ const connPath = path.join(stateDir, 'connection.json');
19
+ try {
20
+ const raw = fs.readFileSync(connPath, 'utf-8');
21
+ return JSON.parse(raw);
22
+ }
23
+ catch {
24
+ return null;
25
+ }
26
+ }
27
+ function defaultStateDir() {
28
+ // Match the Rust broker's discovery convention: `.agent-relay/` under the
29
+ // project root (resolved the same way the rest of the CLI does it).
30
+ const projectRoot = getProjectPaths().projectRoot;
31
+ return path.join(projectRoot, '.agent-relay');
32
+ }
33
+ function withDefaults(overrides = {}) {
34
+ return {
35
+ readConnectionFile: readConnectionFileFromDisk,
36
+ getDefaultStateDir: defaultStateDir,
37
+ env: process.env,
38
+ createWebSocket: (url, headers) => new WebSocket(url, { headers }),
39
+ writeChunk: (chunk) => {
40
+ process.stdout.write(chunk);
41
+ },
42
+ onSignal: (signal, handler) => {
43
+ process.on(signal, () => runSignalHandler(handler));
44
+ },
45
+ log: (...args) => console.error(...args),
46
+ error: (...args) => console.error(...args),
47
+ exit: defaultExit,
48
+ fetch: (input, init) => fetch(input, init),
49
+ captureAndRenderSnapshot,
50
+ ...overrides,
51
+ };
52
+ }
53
+ function isStringObject(value) {
54
+ return typeof value === 'object' && value !== null && !Array.isArray(value);
55
+ }
56
+ function readString(obj, key) {
57
+ if (!isStringObject(obj))
58
+ return undefined;
59
+ const value = obj[key];
60
+ if (typeof value !== 'string')
61
+ return undefined;
62
+ const trimmed = value.trim();
63
+ return trimmed === '' ? undefined : trimmed;
64
+ }
65
+ /**
66
+ * Resolve the broker connection to use for `view`, in priority order:
67
+ *
68
+ * 1. `--broker-url` / `--api-key` CLI flags
69
+ * 2. `RELAY_BROKER_URL` / `RELAY_BROKER_API_KEY` environment variables
70
+ * 3. `<state-dir>/connection.json` (default `.agent-relay/connection.json`)
71
+ *
72
+ * Matches the resolution order used by `agent-relay-broker dump-pty` so users
73
+ * don't have to learn two patterns.
74
+ */
75
+ export function resolveViewBrokerConnection(options, deps) {
76
+ const explicitUrl = options.brokerUrl?.trim();
77
+ const envUrl = deps.env.RELAY_BROKER_URL?.trim();
78
+ const stateDir = options.stateDir ? path.resolve(options.stateDir) : deps.getDefaultStateDir();
79
+ const connectionFile = deps.readConnectionFile(stateDir);
80
+ const fileUrl = readString(connectionFile, 'url');
81
+ const resolveApiKey = () => {
82
+ const explicit = options.apiKey?.trim();
83
+ if (explicit)
84
+ return explicit;
85
+ const fromEnv = deps.env.RELAY_BROKER_API_KEY?.trim();
86
+ if (fromEnv)
87
+ return fromEnv;
88
+ return readString(connectionFile, 'api_key');
89
+ };
90
+ const url = explicitUrl ?? envUrl ?? fileUrl;
91
+ if (!url)
92
+ return null;
93
+ return {
94
+ url: url.replace(/\/+$/, ''),
95
+ apiKey: resolveApiKey(),
96
+ };
97
+ }
98
+ /** Convert an `http(s)://host:port` base URL to the matching `ws(s)://…/ws`. */
99
+ export function toWsUrl(baseUrl) {
100
+ return `${baseUrl.replace(/^http/, 'ws')}/ws`;
101
+ }
102
+ /**
103
+ * Inspect a single WebSocket message and, if it's a `worker_stream` event for
104
+ * the requested agent, return the raw chunk string. Returns `null` for events
105
+ * that don't match (other kinds, other agents, malformed JSON, etc.) so the
106
+ * caller can ignore them.
107
+ *
108
+ * Exported for unit testing the filter in isolation from any WebSocket.
109
+ */
110
+ export function extractMatchingChunk(rawMessage, agentName) {
111
+ let parsed;
112
+ try {
113
+ parsed = JSON.parse(rawMessage);
114
+ }
115
+ catch {
116
+ return null;
117
+ }
118
+ if (!isStringObject(parsed))
119
+ return null;
120
+ if (parsed.kind !== 'worker_stream')
121
+ return null;
122
+ if (parsed.name !== agentName)
123
+ return null;
124
+ const chunk = parsed.chunk;
125
+ if (typeof chunk !== 'string')
126
+ return null;
127
+ return chunk;
128
+ }
129
+ /**
130
+ * Open the read-only view stream and run until the WebSocket closes, the
131
+ * caller signals SIGINT/SIGTERM, or an unrecoverable error occurs. Resolves
132
+ * with the exit code the CLI should propagate.
133
+ */
134
+ export async function runViewSession(agentName, options, deps) {
135
+ // Normalize once so every downstream lookup, WS-event match, and
136
+ // error message uses the same value. A stray space in the raw input
137
+ // otherwise turns into a silent 404 (broker stores names verbatim).
138
+ const name = agentName.trim();
139
+ if (!name) {
140
+ deps.error('Error: agent name is required');
141
+ return 1;
142
+ }
143
+ const connection = resolveViewBrokerConnection(options, deps);
144
+ if (!connection) {
145
+ deps.error('Error: could not locate broker connection. Pass --broker-url, set RELAY_BROKER_URL, ' +
146
+ 'or run from a directory containing .agent-relay/connection.json.');
147
+ return 1;
148
+ }
149
+ // Render the agent's current screen before the live stream begins, so
150
+ // the user sees what's there instead of staring at a blank terminal
151
+ // until the agent happens to produce more output. Hard errors
152
+ // (`not_found` / `no_pty`) abort — there's nothing meaningful to view.
153
+ // Transient errors (`unavailable` / `transport_error`) are surfaced as
154
+ // a warning and we fall through to the live stream; the agent may
155
+ // still produce useful output even if the snapshot couldn't be served.
156
+ const snapshot = await deps.captureAndRenderSnapshot({ url: connection.url, apiKey: connection.apiKey }, name, { fetch: deps.fetch, writeChunk: deps.writeChunk });
157
+ switch (snapshot.status) {
158
+ case 'ok':
159
+ break;
160
+ case 'not_found':
161
+ deps.error(`Error: ${snapshot.message ?? `no agent named '${name}'`}`);
162
+ return 1;
163
+ case 'no_pty':
164
+ deps.error(`Error: ${snapshot.message ?? `agent '${name}' has no PTY to view`}`);
165
+ return 1;
166
+ case 'unavailable':
167
+ case 'transport_error':
168
+ deps.log(`[view] could not capture initial screen (${snapshot.message ?? snapshot.status}); streaming live output only`);
169
+ break;
170
+ }
171
+ const wsUrl = toWsUrl(connection.url);
172
+ const headers = {};
173
+ if (connection.apiKey) {
174
+ headers['X-API-Key'] = connection.apiKey;
175
+ }
176
+ return new Promise((resolve) => {
177
+ let settled = false;
178
+ const finish = (code) => {
179
+ if (settled)
180
+ return;
181
+ settled = true;
182
+ try {
183
+ socket.close(1000, 'view client exiting');
184
+ }
185
+ catch {
186
+ // best effort — already closed
187
+ }
188
+ resolve(code);
189
+ };
190
+ const socket = deps.createWebSocket(wsUrl, headers);
191
+ deps.onSignal('SIGINT', () => finish(0));
192
+ deps.onSignal('SIGTERM', () => finish(0));
193
+ socket.on('open', () => {
194
+ deps.log(`[view] streaming ${name} from ${connection.url} (Ctrl+C to exit)`);
195
+ });
196
+ socket.on('message', (data) => {
197
+ const text = typeof data === 'string' ? data : Buffer.isBuffer(data) ? data.toString('utf-8') : String(data);
198
+ const chunk = extractMatchingChunk(text, name);
199
+ if (chunk !== null) {
200
+ deps.writeChunk(chunk);
201
+ }
202
+ });
203
+ socket.on('error', (err) => {
204
+ deps.error(`[view] WebSocket error: ${err.message}`);
205
+ });
206
+ socket.on('close', (code, reason) => {
207
+ if (settled)
208
+ return;
209
+ const reasonText = reason && reason.length > 0 ? reason.toString('utf-8') : '';
210
+ if (code === 1000 || code === 1005) {
211
+ // Normal closure (server shut down or sent close frame without status)
212
+ finish(0);
213
+ }
214
+ else {
215
+ deps.error(`[view] connection closed (code: ${code}${reasonText ? `, reason: ${reasonText}` : ''})`);
216
+ finish(1);
217
+ }
218
+ });
219
+ });
220
+ }
221
+ /** Register `agent-relay view <name>` on the supplied commander program. */
222
+ export function registerViewCommands(program, overrides = {}) {
223
+ const deps = withDefaults(overrides);
224
+ program
225
+ .command('view')
226
+ .description("Stream a running agent's PTY output to your terminal (read-only)")
227
+ .argument('<name>', 'Agent name to view')
228
+ .option('--broker-url <url>', 'Broker base URL (overrides RELAY_BROKER_URL and connection.json)')
229
+ .option('--api-key <key>', 'Broker API key (overrides RELAY_BROKER_API_KEY and connection.json)')
230
+ .option('--state-dir <dir>', 'Directory containing connection.json (default: .agent-relay/)')
231
+ .action(async (name, options) => {
232
+ const code = await runViewSession(name, options, deps);
233
+ if (code !== 0) {
234
+ deps.exit(code);
235
+ }
236
+ });
237
+ }
238
+ //# sourceMappingURL=view.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"view.js","sourceRoot":"","sources":["../../../../src/cli/commands/view.ts"],"names":[],"mappings":"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"}
@@ -7,18 +7,37 @@ export interface ListingWorkerInfo {
7
7
  team?: string;
8
8
  pid?: number;
9
9
  }
10
+ /** Real per-agent metrics as served by the broker `/api/metrics` endpoint. */
11
+ export interface ListingAgentMetrics {
12
+ name: string;
13
+ pid?: number;
14
+ memory_bytes?: number;
15
+ uptime_secs?: number;
16
+ }
17
+ export interface ListingClient {
18
+ listAgents: () => Promise<ListingWorkerInfo[]>;
19
+ /**
20
+ * Optional: fetch real broker metrics (pid / memory / uptime) so `who`
21
+ * can report machine-readable lifecycle data instead of fabricated
22
+ * "ONLINE / just now" placeholders.
23
+ */
24
+ getMetrics?: (agentName?: string) => Promise<unknown>;
25
+ shutdown: () => Promise<unknown>;
26
+ }
10
27
  export interface AgentManagementListingDependencies {
11
28
  getProjectRoot: () => string;
12
29
  getDataDir: () => string;
13
- createClient: (cwd: string) => {
14
- listAgents: () => Promise<ListingWorkerInfo[]>;
15
- shutdown: () => Promise<unknown>;
16
- } | Promise<{
17
- listAgents: () => Promise<ListingWorkerInfo[]>;
18
- shutdown: () => Promise<unknown>;
19
- }>;
30
+ createClient: (cwd: string) => ListingClient | Promise<ListingClient>;
20
31
  fileExists: (filePath: string) => boolean;
21
32
  readFile: (filePath: string, encoding?: BufferEncoding) => string;
33
+ readFileTail?: (filePath: string, maxBytes: number, encoding?: BufferEncoding) => {
34
+ text: string;
35
+ size: number;
36
+ };
37
+ readFileFrom?: (filePath: string, offset: number, maxBytes: number, encoding?: BufferEncoding) => {
38
+ text: string;
39
+ size: number;
40
+ };
22
41
  fetch: (url: string, init?: RequestInit) => Promise<Response>;
23
42
  nowIso: () => string;
24
43
  log: (...args: unknown[]) => void;
@@ -34,9 +53,18 @@ export declare function runWhoCommand(options: {
34
53
  all?: boolean;
35
54
  json?: boolean;
36
55
  }, deps: AgentManagementListingDependencies): Promise<void>;
56
+ /**
57
+ * Convert a raw PTY/TTY log capture into greppable, line-oriented plain text:
58
+ * strip ANSI/cursor/control escapes, drop lines that were pure escape noise,
59
+ * and collapse consecutive identical lines (spinner/redraw frames like
60
+ * `⠙ Working(18m 07s)` re-printed every tick).
61
+ */
62
+ export declare function toPlainLogLines(raw: string): string[];
37
63
  export declare function runAgentsLogsCommand(name: string, options: {
38
64
  lines?: string;
39
65
  follow?: boolean;
66
+ plain?: boolean;
67
+ json?: boolean;
40
68
  }, deps: AgentManagementListingDependencies): Promise<void>;
41
69
  export {};
42
70
  //# sourceMappingURL=agent-management-listing.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"agent-management-listing.d.ts","sourceRoot":"","sources":["../../../../src/cli/lib/agent-management-listing.ts"],"names":[],"mappings":"AAKA,KAAK,MAAM,GAAG,CAAC,IAAI,EAAE,MAAM,KAAK,KAAK,CAAC;AAEtC,MAAM,WAAW,iBAAiB;IAChC,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,GAAG,CAAC,EAAE,MAAM,CAAC;CACd;AA2BD,MAAM,WAAW,kCAAkC;IACjD,cAAc,EAAE,MAAM,MAAM,CAAC;IAC7B,UAAU,EAAE,MAAM,MAAM,CAAC;IACzB,YAAY,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK;QAC7B,UAAU,EAAE,MAAM,OAAO,CAAC,iBAAiB,EAAE,CAAC,CAAC;QAC/C,QAAQ,EAAE,MAAM,OAAO,CAAC,OAAO,CAAC,CAAC;KAClC,GAAG,OAAO,CAAC;QACV,UAAU,EAAE,MAAM,OAAO,CAAC,iBAAiB,EAAE,CAAC,CAAC;QAC/C,QAAQ,EAAE,MAAM,OAAO,CAAC,OAAO,CAAC,CAAC;KAClC,CAAC,CAAC;IACH,UAAU,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,OAAO,CAAC;IAC1C,QAAQ,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,cAAc,KAAK,MAAM,CAAC;IAClE,KAAK,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,WAAW,KAAK,OAAO,CAAC,QAAQ,CAAC,CAAC;IAC9D,MAAM,EAAE,MAAM,MAAM,CAAC;IACrB,GAAG,EAAE,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,KAAK,IAAI,CAAC;IAClC,KAAK,EAAE,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,KAAK,IAAI,CAAC;IACpC,IAAI,EAAE,MAAM,CAAC;CACd;AA8DD,wBAAsB,gBAAgB,CACpC,OAAO,EAAE;IAAE,GAAG,CAAC,EAAE,OAAO,CAAC;IAAC,MAAM,CAAC,EAAE,OAAO,CAAC;IAAC,IAAI,CAAC,EAAE,OAAO,CAAA;CAAE,EAC5D,IAAI,EAAE,kCAAkC,GACvC,OAAO,CAAC,IAAI,CAAC,CA8Gf;AAED,wBAAsB,aAAa,CACjC,OAAO,EAAE;IAAE,GAAG,CAAC,EAAE,OAAO,CAAC;IAAC,IAAI,CAAC,EAAE,OAAO,CAAA;CAAE,EAC1C,IAAI,EAAE,kCAAkC,GACvC,OAAO,CAAC,IAAI,CAAC,CAoDf;AAED,wBAAsB,oBAAoB,CACxC,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE;IAAE,KAAK,CAAC,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,OAAO,CAAA;CAAE,EAC7C,IAAI,EAAE,kCAAkC,GACvC,OAAO,CAAC,IAAI,CAAC,CA0Ef"}
1
+ {"version":3,"file":"agent-management-listing.d.ts","sourceRoot":"","sources":["../../../../src/cli/lib/agent-management-listing.ts"],"names":[],"mappings":"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"}