agent-relay 9.2.1 → 9.2.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +26 -15
- package/dist/cli/bootstrap.d.ts.map +1 -1
- package/dist/cli/bootstrap.js +16 -2
- package/dist/cli/bootstrap.js.map +1 -1
- package/dist/cli/commands/cloud.d.ts +9 -0
- package/dist/cli/commands/cloud.d.ts.map +1 -1
- package/dist/cli/commands/cloud.js +71 -1
- package/dist/cli/commands/cloud.js.map +1 -1
- package/dist/cli/commands/core.d.ts +18 -1
- package/dist/cli/commands/core.d.ts.map +1 -1
- package/dist/cli/commands/core.js +15 -9
- package/dist/cli/commands/core.js.map +1 -1
- package/dist/cli/commands/fleet.d.ts +0 -12
- package/dist/cli/commands/fleet.d.ts.map +1 -1
- package/dist/cli/commands/fleet.js +17 -261
- package/dist/cli/commands/fleet.js.map +1 -1
- package/dist/cli/commands/integration.d.ts +10 -0
- package/dist/cli/commands/integration.d.ts.map +1 -1
- package/dist/cli/commands/integration.js +89 -0
- package/dist/cli/commands/integration.js.map +1 -1
- package/dist/cli/commands/local-workflow.d.ts.map +1 -1
- package/dist/cli/commands/local-workflow.js +15 -2
- package/dist/cli/commands/local-workflow.js.map +1 -1
- package/dist/cli/commands/node.d.ts +19 -0
- package/dist/cli/commands/node.d.ts.map +1 -0
- package/dist/cli/commands/node.js +86 -0
- package/dist/cli/commands/node.js.map +1 -0
- package/dist/cli/commands/reflex.d.ts +0 -2
- package/dist/cli/commands/reflex.d.ts.map +1 -1
- package/dist/cli/commands/reflex.js +25 -36
- package/dist/cli/commands/reflex.js.map +1 -1
- package/dist/cli/lib/broker-lifecycle.d.ts +10 -0
- package/dist/cli/lib/broker-lifecycle.d.ts.map +1 -1
- package/dist/cli/lib/broker-lifecycle.js +65 -10
- package/dist/cli/lib/broker-lifecycle.js.map +1 -1
- package/dist/cli/lib/fleet-sidecar.d.ts +16 -42
- package/dist/cli/lib/fleet-sidecar.d.ts.map +1 -1
- package/dist/cli/lib/fleet-sidecar.js +18 -380
- package/dist/cli/lib/fleet-sidecar.js.map +1 -1
- package/dist/cli/lib/node-definition-loader.d.ts +17 -0
- package/dist/cli/lib/node-definition-loader.d.ts.map +1 -0
- package/dist/cli/lib/node-definition-loader.js +124 -0
- package/dist/cli/lib/node-definition-loader.js.map +1 -0
- package/dist/cli/lib/reflex-capture.d.ts +41 -0
- package/dist/cli/lib/reflex-capture.d.ts.map +1 -0
- package/dist/cli/lib/reflex-capture.js +128 -0
- package/dist/cli/lib/reflex-capture.js.map +1 -0
- package/dist/index.cjs +73 -267
- package/package.json +11 -8
|
@@ -1,20 +1,17 @@
|
|
|
1
|
-
import path from 'node:path';
|
|
2
|
-
import { pathToFileURL } from 'node:url';
|
|
3
1
|
import { HarnessDriverClient } from '@agent-relay/harness-driver';
|
|
4
|
-
import {
|
|
2
|
+
import { readFleetSidecarStatus } from '@agent-relay/fleet';
|
|
5
3
|
import { withDefaults } from './core.js';
|
|
6
|
-
import { readBrokerConnection
|
|
7
|
-
import {
|
|
4
|
+
import { readBrokerConnection } from '../lib/broker-lifecycle.js';
|
|
5
|
+
import { fleetStatusPath } from '../lib/fleet-sidecar.js';
|
|
8
6
|
import { addSdkOptions, printJson, runSdk, sdkOptionsFromOpts, withSdkDefaults, } from '../lib/sdk-command.js';
|
|
9
|
-
const
|
|
7
|
+
const SERVE_REPLACEMENT_MESSAGE = "'fleet serve' has been replaced. Run 'relay node up' (with an optional --config <file>); " +
|
|
8
|
+
"for Cloud-managed nodes run 'relay cloud enroll --token <token>' first.";
|
|
10
9
|
function withFleetDefaults(overrides = {}) {
|
|
11
10
|
const core = overrides.core ?? withDefaults();
|
|
12
11
|
const sdk = overrides.sdk ?? withSdkDefaults();
|
|
13
12
|
return {
|
|
14
13
|
core,
|
|
15
14
|
sdk,
|
|
16
|
-
loadNodeDefinition,
|
|
17
|
-
enrollFleetNode,
|
|
18
15
|
log: (...args) => console.log(...args),
|
|
19
16
|
warn: (...args) => console.warn(...args),
|
|
20
17
|
error: (...args) => console.error(...args),
|
|
@@ -24,25 +21,18 @@ function withFleetDefaults(overrides = {}) {
|
|
|
24
21
|
}
|
|
25
22
|
export function registerFleetCommands(program, overrides = {}) {
|
|
26
23
|
const deps = withFleetDefaults(overrides);
|
|
27
|
-
const group = program.command('fleet').description('
|
|
24
|
+
const group = program.command('fleet').description('Inspect and manage Agent Relay fleet nodes');
|
|
25
|
+
// `fleet serve` has moved to `relay node up`. Keep a hidden stub so existing
|
|
26
|
+
// invocations fail loudly with migration guidance instead of an "unknown
|
|
27
|
+
// command" error. `allowUnknownOption` lets it swallow the old serve flags.
|
|
28
28
|
group
|
|
29
|
-
.command('serve')
|
|
30
|
-
.
|
|
31
|
-
.
|
|
32
|
-
.
|
|
33
|
-
.
|
|
34
|
-
.
|
|
35
|
-
.
|
|
36
|
-
.option('--enrollment-token <token>', 'One-time Cloud enrollment token (ocl_node_enr_...) to register this node')
|
|
37
|
-
.option('--enrollment-url <url>', 'Cloud enrollment endpoint that redeems the token (e.g. https://agentrelay.com/api/v1/fleet/register)')
|
|
38
|
-
.action(async (file, options) => {
|
|
39
|
-
try {
|
|
40
|
-
await runFleetServe(file, options, deps);
|
|
41
|
-
}
|
|
42
|
-
catch (error) {
|
|
43
|
-
deps.error(error instanceof Error ? error.message : String(error));
|
|
44
|
-
deps.exit(1);
|
|
45
|
-
}
|
|
29
|
+
.command('serve', { hidden: true })
|
|
30
|
+
.argument('[file]')
|
|
31
|
+
.allowUnknownOption(true)
|
|
32
|
+
.allowExcessArguments(true)
|
|
33
|
+
.action(() => {
|
|
34
|
+
deps.error(SERVE_REPLACEMENT_MESSAGE);
|
|
35
|
+
deps.exit(1);
|
|
46
36
|
});
|
|
47
37
|
addSdkOptions(group
|
|
48
38
|
.command('nodes')
|
|
@@ -85,7 +75,7 @@ export function registerFleetCommands(program, overrides = {}) {
|
|
|
85
75
|
});
|
|
86
76
|
group
|
|
87
77
|
.command('status')
|
|
88
|
-
.description('Show local fleet broker and
|
|
78
|
+
.description('Show local fleet broker and node status')
|
|
89
79
|
.action(async () => {
|
|
90
80
|
try {
|
|
91
81
|
await runFleetStatus(deps);
|
|
@@ -96,197 +86,6 @@ export function registerFleetCommands(program, overrides = {}) {
|
|
|
96
86
|
}
|
|
97
87
|
});
|
|
98
88
|
}
|
|
99
|
-
export async function loadNodeDefinition(file) {
|
|
100
|
-
const absolutePath = path.resolve(file);
|
|
101
|
-
const loaded = await importNodeDefinition(absolutePath);
|
|
102
|
-
const definition = unwrapNodeDefinitionExport(loaded);
|
|
103
|
-
if (!isFleetNodeDefinitionLike(definition)) {
|
|
104
|
-
throw new Error(`Fleet node file ${absolutePath} must default-export defineNode(...)`);
|
|
105
|
-
}
|
|
106
|
-
return definition;
|
|
107
|
-
}
|
|
108
|
-
function unwrapNodeDefinitionExport(loaded) {
|
|
109
|
-
let candidate = loaded;
|
|
110
|
-
for (let depth = 0; depth < 3; depth += 1) {
|
|
111
|
-
if (isFleetNodeDefinitionLike(candidate)) {
|
|
112
|
-
return candidate;
|
|
113
|
-
}
|
|
114
|
-
if (!candidate || typeof candidate !== 'object' || !('default' in candidate)) {
|
|
115
|
-
return candidate;
|
|
116
|
-
}
|
|
117
|
-
candidate = candidate.default;
|
|
118
|
-
}
|
|
119
|
-
return candidate;
|
|
120
|
-
}
|
|
121
|
-
function isFleetNodeDefinitionLike(value) {
|
|
122
|
-
return Boolean(value &&
|
|
123
|
-
typeof value === 'object' &&
|
|
124
|
-
value.__agentRelayFleetNode === true);
|
|
125
|
-
}
|
|
126
|
-
async function importNodeDefinition(absolutePath) {
|
|
127
|
-
if (!JITI_NODE_DEFINITION_EXTENSIONS.has(path.extname(absolutePath).toLowerCase())) {
|
|
128
|
-
try {
|
|
129
|
-
return (await import(pathToFileURL(absolutePath).href));
|
|
130
|
-
}
|
|
131
|
-
catch (error) {
|
|
132
|
-
if (!shouldFallbackToJiti(error)) {
|
|
133
|
-
throw error;
|
|
134
|
-
}
|
|
135
|
-
try {
|
|
136
|
-
return await importNodeDefinitionWithJiti(absolutePath);
|
|
137
|
-
}
|
|
138
|
-
catch {
|
|
139
|
-
throw error;
|
|
140
|
-
}
|
|
141
|
-
}
|
|
142
|
-
}
|
|
143
|
-
return importNodeDefinitionWithJiti(absolutePath);
|
|
144
|
-
}
|
|
145
|
-
function shouldFallbackToJiti(error) {
|
|
146
|
-
if (isBunRuntime()) {
|
|
147
|
-
return false;
|
|
148
|
-
}
|
|
149
|
-
return error instanceof SyntaxError && getErrorCode(error) !== 'ERR_MODULE_NOT_FOUND';
|
|
150
|
-
}
|
|
151
|
-
function isBunRuntime() {
|
|
152
|
-
return typeof process.versions.bun === 'string';
|
|
153
|
-
}
|
|
154
|
-
function getErrorCode(error) {
|
|
155
|
-
return error && typeof error === 'object' && 'code' in error
|
|
156
|
-
? String(error.code)
|
|
157
|
-
: undefined;
|
|
158
|
-
}
|
|
159
|
-
async function importNodeDefinitionWithJiti(absolutePath) {
|
|
160
|
-
const { createJiti } = await import('jiti');
|
|
161
|
-
const jiti = createJiti(pathToFileURL(process.cwd()).href, {
|
|
162
|
-
interopDefault: true,
|
|
163
|
-
});
|
|
164
|
-
return jiti.import(absolutePath, { default: true });
|
|
165
|
-
}
|
|
166
|
-
/**
|
|
167
|
-
* In enrollment mode the one-time token is exchanged for durable node
|
|
168
|
-
* credentials BEFORE the broker boots. The returned credentials populate the env
|
|
169
|
-
* the broker reads to bind itself to the Cloud workspace's fleet roster
|
|
170
|
-
* (RELAY_NODE_TOKEN over the fleet WS, RELAY_BASE_URL as the Relaycast origin).
|
|
171
|
-
* Returns the enrollment record, or undefined when not in enrollment mode.
|
|
172
|
-
*/
|
|
173
|
-
async function maybeEnrollFleetNode(options, nameOption, maxAgentsOverride, deps) {
|
|
174
|
-
const enrollmentToken = typeof options.enrollmentToken === 'string' ? options.enrollmentToken.trim() : '';
|
|
175
|
-
const enrollmentUrl = typeof options.enrollmentUrl === 'string' ? options.enrollmentUrl.trim() : '';
|
|
176
|
-
if (enrollmentUrl && !enrollmentToken) {
|
|
177
|
-
throw new Error('--enrollment-url requires --enrollment-token.');
|
|
178
|
-
}
|
|
179
|
-
if (!enrollmentToken) {
|
|
180
|
-
return undefined;
|
|
181
|
-
}
|
|
182
|
-
const enrollment = await deps.enrollFleetNode({
|
|
183
|
-
enrollmentToken,
|
|
184
|
-
enrollmentUrl,
|
|
185
|
-
...(nameOption ? { name: nameOption } : {}),
|
|
186
|
-
...(maxAgentsOverride !== undefined ? { maxAgents: maxAgentsOverride } : {}),
|
|
187
|
-
});
|
|
188
|
-
deps.core.env.RELAY_NODE_TOKEN = enrollment.nodeToken;
|
|
189
|
-
deps.core.env.RELAY_BASE_URL = enrollment.relaycastUrl;
|
|
190
|
-
deps.log(`Enrolled fleet node "${enrollment.nodeName}"${enrollment.nodeId ? ` (${enrollment.nodeId})` : ''} in workspace ${enrollment.relayWorkspaceId}.`);
|
|
191
|
-
return enrollment;
|
|
192
|
-
}
|
|
193
|
-
/**
|
|
194
|
-
* Wires the explicit `--workspace`/`--base-url` overrides into the broker env so
|
|
195
|
-
* `startBrokerWithPortFallback` binds the node to the right workspace and origin.
|
|
196
|
-
* Returns the resolved values for downstream sidecar wiring.
|
|
197
|
-
*
|
|
198
|
-
* Precedence for the Relaycast origin: enrollment is the source of truth (it
|
|
199
|
-
* already wrote RELAY_BASE_URL during the exchange) and an explicit `--base-url`
|
|
200
|
-
* is the only thing that overrides it; the override must reach the broker via
|
|
201
|
-
* RELAY_BASE_URL, not just `serveFleetSidecar`.
|
|
202
|
-
*/
|
|
203
|
-
function applyServeEnvOverrides(options, deps) {
|
|
204
|
-
const workspaceKey = typeof options.workspace === 'string' ? options.workspace.trim() : '';
|
|
205
|
-
if (workspaceKey) {
|
|
206
|
-
deps.core.env.RELAY_WORKSPACE_KEY = workspaceKey;
|
|
207
|
-
deps.core.env.RELAY_API_KEY = workspaceKey;
|
|
208
|
-
}
|
|
209
|
-
const baseUrlOverride = typeof options.baseUrl === 'string' ? options.baseUrl.trim() : '';
|
|
210
|
-
if (baseUrlOverride) {
|
|
211
|
-
deps.core.env.RELAY_BASE_URL = baseUrlOverride;
|
|
212
|
-
}
|
|
213
|
-
return { workspaceKey, baseUrlOverride };
|
|
214
|
-
}
|
|
215
|
-
function createImplicitServeNodeDefinition(input) {
|
|
216
|
-
return createImplicitLocalFleetNode({
|
|
217
|
-
paths: input.paths,
|
|
218
|
-
teamsConfig: input.deps.core.loadTeamsConfig(input.paths.projectRoot),
|
|
219
|
-
// Name precedence (kept identical to nameOverride in runFleetServe so the
|
|
220
|
-
// implicit node definition and the sidecar registration always agree):
|
|
221
|
-
// --name > enrollment record's nodeName > createImplicitLocalFleetNode's
|
|
222
|
-
// projectRoot-basename default.
|
|
223
|
-
name: input.nameOption ?? input.enrollment?.nodeName,
|
|
224
|
-
...(input.maxAgentsOverride !== undefined ? { maxAgents: input.maxAgentsOverride } : {}),
|
|
225
|
-
});
|
|
226
|
-
}
|
|
227
|
-
async function runFleetServe(file, options, deps) {
|
|
228
|
-
const maxAgentsOverride = parsePositiveIntegerOption(options.maxAgents, '--max-agents');
|
|
229
|
-
const nameOption = typeof options.name === 'string' ? options.name : undefined;
|
|
230
|
-
const paths = deps.core.getProjectPaths();
|
|
231
|
-
deps.core.fs.mkdirSync(paths.dataDir, { recursive: true });
|
|
232
|
-
// The `<file>` node-def is OPTIONAL in enrollment mode — identity/name/
|
|
233
|
-
// capabilities come from the enrollment record; a `<file>`, when present,
|
|
234
|
-
// overrides/augments it.
|
|
235
|
-
//
|
|
236
|
-
// Load + validate the `<file>` BEFORE redeeming the one-time enrollment token:
|
|
237
|
-
// the token is single-use, so a missing/invalid file must fail fast rather than
|
|
238
|
-
// burn the token on a run that can't succeed (the durable creds returned by the
|
|
239
|
-
// exchange would never be persisted, forcing the operator to mint a fresh token
|
|
240
|
-
// just to fix a local file error).
|
|
241
|
-
const fileDefinition = file ? await deps.loadNodeDefinition(file) : undefined;
|
|
242
|
-
const enrollment = await maybeEnrollFleetNode(options, nameOption, maxAgentsOverride, deps);
|
|
243
|
-
if (!enrollment && !file) {
|
|
244
|
-
throw new Error('A node definition <file> is required unless --enrollment-token is provided.');
|
|
245
|
-
}
|
|
246
|
-
const nodeDefinition = fileDefinition ??
|
|
247
|
-
createImplicitServeNodeDefinition({
|
|
248
|
-
paths,
|
|
249
|
-
enrollment,
|
|
250
|
-
nameOption,
|
|
251
|
-
maxAgentsOverride,
|
|
252
|
-
deps,
|
|
253
|
-
});
|
|
254
|
-
const { workspaceKey, baseUrlOverride } = applyServeEnvOverrides(options, deps);
|
|
255
|
-
// An enrolled node prefers the name from the enrollment record; a --name flag
|
|
256
|
-
// (already forwarded to the exchange) still wins through nameOption.
|
|
257
|
-
const nameOverride = nameOption ?? enrollment?.nodeName ?? undefined;
|
|
258
|
-
const baseUrl = baseUrlOverride || enrollment?.relaycastUrl || undefined;
|
|
259
|
-
const basePort = resolveBrokerBasePort(deps.core);
|
|
260
|
-
const started = await startBrokerWithPortFallback(paths, basePort, deps.core);
|
|
261
|
-
const connection = connectionFromFile(paths.dataDir);
|
|
262
|
-
const controller = new AbortController();
|
|
263
|
-
const stop = () => controller.abort();
|
|
264
|
-
deps.core.onSignal('SIGINT', stop);
|
|
265
|
-
deps.core.onSignal('SIGTERM', stop);
|
|
266
|
-
await serveFleetSidecar({
|
|
267
|
-
definition: nodeDefinition,
|
|
268
|
-
connection,
|
|
269
|
-
workspaceKey: workspaceKey || started.relay.workspaceKey,
|
|
270
|
-
baseUrl,
|
|
271
|
-
nameOverride,
|
|
272
|
-
maxAgentsOverride,
|
|
273
|
-
supervision: buildNodeSupervision({
|
|
274
|
-
// Strip the one-time --enrollment-token/--enrollment-url flags from the
|
|
275
|
-
// supervised argv. The broker restarts supervised sidecars by re-executing
|
|
276
|
-
// this argv; replaying a consumed enrollment token would fail the exchange
|
|
277
|
-
// and the node would never come back. The durable credentials minted by the
|
|
278
|
-
// first exchange live in the supervision env (RELAY_NODE_TOKEN /
|
|
279
|
-
// RELAY_BASE_URL), so restarts take the durable path with no flags to redeem.
|
|
280
|
-
argv: stripEnrollmentFlags(deps.core.argv),
|
|
281
|
-
cwd: process.cwd(),
|
|
282
|
-
env: deps.core.env,
|
|
283
|
-
}),
|
|
284
|
-
statusPath: fleetStatusPath(paths),
|
|
285
|
-
signal: controller.signal,
|
|
286
|
-
log: (message) => deps.log(message),
|
|
287
|
-
warn: (message) => deps.warn(message),
|
|
288
|
-
});
|
|
289
|
-
}
|
|
290
89
|
async function runFleetStatus(deps) {
|
|
291
90
|
const paths = deps.core.getProjectPaths();
|
|
292
91
|
const conn = readBrokerConnection(paths.dataDir);
|
|
@@ -325,49 +124,6 @@ async function runFleetStatus(deps) {
|
|
|
325
124
|
sidecar: sidecar ? { ...sidecar, alive: isPidAlive(sidecar.pid) } : null,
|
|
326
125
|
}, null, 2));
|
|
327
126
|
}
|
|
328
|
-
function connectionFromFile(dataDir) {
|
|
329
|
-
const conn = readBrokerConnection(dataDir);
|
|
330
|
-
if (!conn) {
|
|
331
|
-
throw new Error(`Broker connection file was not written in ${dataDir}`);
|
|
332
|
-
}
|
|
333
|
-
return { url: conn.url, apiKey: conn.api_key };
|
|
334
|
-
}
|
|
335
|
-
/**
|
|
336
|
-
* Removes the one-time enrollment flags (and their values) from a captured argv
|
|
337
|
-
* so the broker's supervised-restart replay never re-redeems a consumed token.
|
|
338
|
-
* Handles both `--flag value` and `--flag=value` forms. The durable credentials
|
|
339
|
-
* minted by the first exchange are carried in the supervision env instead.
|
|
340
|
-
*/
|
|
341
|
-
export function stripEnrollmentFlags(argv) {
|
|
342
|
-
const oneTimeFlags = new Set(['--enrollment-token', '--enrollment-url']);
|
|
343
|
-
const result = [];
|
|
344
|
-
for (let i = 0; i < argv.length; i += 1) {
|
|
345
|
-
const arg = argv[i];
|
|
346
|
-
const eqIndex = arg.indexOf('=');
|
|
347
|
-
const flagName = eqIndex === -1 ? arg : arg.slice(0, eqIndex);
|
|
348
|
-
if (oneTimeFlags.has(flagName)) {
|
|
349
|
-
// `--flag=value` carries its value inline; `--flag value` consumes the next
|
|
350
|
-
// token. Skip the following token only when this flag had no inline `=value`
|
|
351
|
-
// and a value token actually follows.
|
|
352
|
-
if (eqIndex === -1 && i + 1 < argv.length) {
|
|
353
|
-
i += 1;
|
|
354
|
-
}
|
|
355
|
-
continue;
|
|
356
|
-
}
|
|
357
|
-
result.push(arg);
|
|
358
|
-
}
|
|
359
|
-
return result;
|
|
360
|
-
}
|
|
361
|
-
function parsePositiveIntegerOption(value, label) {
|
|
362
|
-
if (value === undefined) {
|
|
363
|
-
return undefined;
|
|
364
|
-
}
|
|
365
|
-
const parsed = Number.parseInt(String(value), 10);
|
|
366
|
-
if (!Number.isInteger(parsed) || parsed <= 0) {
|
|
367
|
-
throw new Error(`${label} must be a positive integer`);
|
|
368
|
-
}
|
|
369
|
-
return parsed;
|
|
370
|
-
}
|
|
371
127
|
function isPidAlive(pid) {
|
|
372
128
|
try {
|
|
373
129
|
process.kill(pid, 0);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fleet.js","sourceRoot":"","sources":["../../../src/cli/commands/fleet.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"fleet.js","sourceRoot":"","sources":["../../../src/cli/commands/fleet.ts"],"names":[],"mappings":"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"}
|
|
@@ -25,6 +25,10 @@ export interface RelayfileWritebackBinding {
|
|
|
25
25
|
/** Per-channel HMAC secret the subscription signs deliveries with. */
|
|
26
26
|
secret: string;
|
|
27
27
|
}
|
|
28
|
+
export interface RelayfileWebhookSubscription {
|
|
29
|
+
subscriptionId: string;
|
|
30
|
+
secret?: string;
|
|
31
|
+
}
|
|
28
32
|
export interface RelayfileBridge {
|
|
29
33
|
isConnected(provider: string): Promise<boolean>;
|
|
30
34
|
connect(provider: string): Promise<void>;
|
|
@@ -61,6 +65,12 @@ export interface RelayfileBridge {
|
|
|
61
65
|
* subscription and the ingress agree on it without any static shared secret.
|
|
62
66
|
*/
|
|
63
67
|
resolveWritebackBinding(channel: string): Promise<RelayfileWritebackBinding | undefined>;
|
|
68
|
+
createWebhookSubscription(input: {
|
|
69
|
+
url: string;
|
|
70
|
+
pathGlobs: string[];
|
|
71
|
+
secret: string;
|
|
72
|
+
}): Promise<RelayfileWebhookSubscription>;
|
|
73
|
+
deleteWebhookSubscription(subscriptionId: string): Promise<void>;
|
|
64
74
|
}
|
|
65
75
|
export type IntegrationCommandDependencies = SdkCommandDeps & {
|
|
66
76
|
resolveLocalRelayOptions: () => Promise<LocalRelayOptions | undefined>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"integration.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/integration.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAKzC,OAAO,EAML,KAAK,cAAc,EACpB,MAAM,uBAAuB,CAAC;AAG/B,OAAO,EACL,qBAAqB,EAGrB,sBAAsB,EACtB,KAAK,sBAAsB,EAC5B,MAAM,mBAAmB,CAAC;
|
|
1
|
+
{"version":3,"file":"integration.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/integration.ts"],"names":[],"mappings":"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"}
|
|
@@ -3,6 +3,7 @@ import { getProjectPaths } from '@agent-relay/config';
|
|
|
3
3
|
import { addSdkOptions, printJson, runSdk, sdkOptionsFromOpts, withSdkDefaults, } from '../lib/sdk-command.js';
|
|
4
4
|
import { connectProjectBrokerClient } from '../lib/project-broker-client.js';
|
|
5
5
|
import { MIN_RELAYFILE_VERSION, RelayfileControlPlaneClient, RelayfileControlPlaneError, assertRelayfileVersion, } from '@relayfile/client';
|
|
6
|
+
import { resolveBaseUrl, resolveWorkspaceKey } from '../lib/sdk-client.js';
|
|
6
7
|
// Re-export the version gate so existing tests importing it from this module
|
|
7
8
|
// (and any callers) keep working after it moved to the published client package.
|
|
8
9
|
export { MIN_RELAYFILE_VERSION, assertRelayfileVersion };
|
|
@@ -137,6 +138,12 @@ export function defaultRelayfileBridge(options) {
|
|
|
137
138
|
return undefined;
|
|
138
139
|
}
|
|
139
140
|
},
|
|
141
|
+
async createWebhookSubscription(input) {
|
|
142
|
+
return client.createWebhookSubscription(input);
|
|
143
|
+
},
|
|
144
|
+
async deleteWebhookSubscription(subscriptionId) {
|
|
145
|
+
await client.deleteWebhookSubscription(subscriptionId);
|
|
146
|
+
},
|
|
140
147
|
};
|
|
141
148
|
}
|
|
142
149
|
async function promptLine(question) {
|
|
@@ -185,6 +192,9 @@ function withIntegrationDefaults(overrides = {}) {
|
|
|
185
192
|
function explicitWorkspaceKey(opts) {
|
|
186
193
|
return typeof opts.workspaceKey === 'string' && opts.workspaceKey.trim() !== '';
|
|
187
194
|
}
|
|
195
|
+
function isRecord(value) {
|
|
196
|
+
return Boolean(value) && typeof value === 'object' && !Array.isArray(value);
|
|
197
|
+
}
|
|
188
198
|
function shouldRetryWithLocalWorkspaceKey(error) {
|
|
189
199
|
const message = error instanceof Error ? error.message : String(error);
|
|
190
200
|
return (/invalid (api|workspace) key/i.test(message) ||
|
|
@@ -244,6 +254,68 @@ async function resolveWriteback(deps, commandOpts, channel) {
|
|
|
244
254
|
}
|
|
245
255
|
return { url: binding.url, secret: binding.secret };
|
|
246
256
|
}
|
|
257
|
+
async function createRelayfileInboundTarget(commandOpts, local, input) {
|
|
258
|
+
const options = sdkOptionsFromOpts(commandOpts);
|
|
259
|
+
const authOptions = local && !explicitWorkspaceKey(commandOpts) ? localRetryOptions(options, local) : options;
|
|
260
|
+
const workspaceKey = resolveWorkspaceKey(authOptions);
|
|
261
|
+
const baseUrl = resolveInboundTargetBaseUrl(options);
|
|
262
|
+
const response = await fetch(new URL('/v1/integrations/relayfile/inbound-target', baseUrl), {
|
|
263
|
+
method: 'POST',
|
|
264
|
+
headers: {
|
|
265
|
+
Authorization: `Bearer ${workspaceKey}`,
|
|
266
|
+
'Content-Type': 'application/json',
|
|
267
|
+
},
|
|
268
|
+
body: JSON.stringify({
|
|
269
|
+
channel: input.channel,
|
|
270
|
+
provider: input.provider,
|
|
271
|
+
pathGlob: input.pathGlob,
|
|
272
|
+
}),
|
|
273
|
+
});
|
|
274
|
+
let body;
|
|
275
|
+
try {
|
|
276
|
+
body = await response.json();
|
|
277
|
+
}
|
|
278
|
+
catch {
|
|
279
|
+
body = undefined;
|
|
280
|
+
}
|
|
281
|
+
if (!response.ok) {
|
|
282
|
+
const message = isRecord(body) && typeof body.message === 'string'
|
|
283
|
+
? body.message
|
|
284
|
+
: `relaycast returned ${response.status}`;
|
|
285
|
+
throw new Error(`Could not create relayfile inbound target: ${message}`);
|
|
286
|
+
}
|
|
287
|
+
return parseRelayfileInboundTargetResponse(body);
|
|
288
|
+
}
|
|
289
|
+
function parseRelayfileInboundTargetResponse(body) {
|
|
290
|
+
const data = isRecord(body) && isRecord(body.data) ? body.data : body;
|
|
291
|
+
if (!isRecord(data) || typeof data.url !== 'string' || typeof data.secret !== 'string') {
|
|
292
|
+
throw new Error('relaycast returned an invalid relayfile inbound target response');
|
|
293
|
+
}
|
|
294
|
+
const url = data.url.trim();
|
|
295
|
+
const secret = data.secret.trim();
|
|
296
|
+
if (!url || !secret) {
|
|
297
|
+
throw new Error('relaycast returned an invalid relayfile inbound target response');
|
|
298
|
+
}
|
|
299
|
+
let parsedUrl;
|
|
300
|
+
try {
|
|
301
|
+
parsedUrl = new URL(url);
|
|
302
|
+
}
|
|
303
|
+
catch {
|
|
304
|
+
throw new Error('relaycast returned an invalid relayfile inbound target URL');
|
|
305
|
+
}
|
|
306
|
+
if (parsedUrl.protocol !== 'https:') {
|
|
307
|
+
throw new Error('relaycast returned a non-https relayfile inbound target URL');
|
|
308
|
+
}
|
|
309
|
+
return { url: parsedUrl.toString(), secret };
|
|
310
|
+
}
|
|
311
|
+
function resolveInboundTargetBaseUrl(options) {
|
|
312
|
+
const baseUrl = resolveBaseUrl(options) ?? 'https://cast.agentrelay.com';
|
|
313
|
+
const parsed = new URL(baseUrl);
|
|
314
|
+
if (parsed.protocol !== 'https:') {
|
|
315
|
+
throw new Error('Inbound relayfile target provisioning requires an https Relaycast base URL.');
|
|
316
|
+
}
|
|
317
|
+
return parsed.toString();
|
|
318
|
+
}
|
|
247
319
|
function targetChannel(target) {
|
|
248
320
|
const trimmed = target.trim();
|
|
249
321
|
// Strip the leading sigil so the channel id is canonical (`general`, not
|
|
@@ -436,6 +508,11 @@ async function runSubscribe(deps, providerArg, opts) {
|
|
|
436
508
|
const channel = targetChannel(to);
|
|
437
509
|
const events = commaList(opts.events);
|
|
438
510
|
const writeback = await resolveWriteback(deps, opts, channel);
|
|
511
|
+
const inboundTarget = await createRelayfileInboundTarget(opts, local, {
|
|
512
|
+
channel,
|
|
513
|
+
provider,
|
|
514
|
+
pathGlob,
|
|
515
|
+
});
|
|
439
516
|
const prefix = webhookNamePrefix(provider, pathGlob);
|
|
440
517
|
const name = inboundWebhookName(prefix);
|
|
441
518
|
// Capture the binding we're about to replace *before* touching anything, so we
|
|
@@ -445,8 +522,14 @@ async function runSubscribe(deps, providerArg, opts) {
|
|
|
445
522
|
const priorBinding = await findExistingBinding(deps, provider, pathGlob);
|
|
446
523
|
let webhook;
|
|
447
524
|
let subscription;
|
|
525
|
+
let relayfileWebhook;
|
|
448
526
|
try {
|
|
449
527
|
webhook = await relay.webhooks.createInbound({ channel, name });
|
|
528
|
+
relayfileWebhook = await deps.relayfile.createWebhookSubscription({
|
|
529
|
+
url: inboundTarget.url,
|
|
530
|
+
pathGlobs: [pathGlob],
|
|
531
|
+
secret: inboundTarget.secret,
|
|
532
|
+
});
|
|
450
533
|
subscription = await relay.integrations.subscriptions.create({
|
|
451
534
|
event: events.length === 1 ? events[0] : 'message.created',
|
|
452
535
|
events: events.length ? events : ['message.created', 'thread.reply'],
|
|
@@ -476,6 +559,11 @@ async function runSubscribe(deps, providerArg, opts) {
|
|
|
476
559
|
.delete(webhook.webhookId)
|
|
477
560
|
.catch((cleanupErr) => warnCleanup(deps, 'webhook', webhook.webhookId, cleanupErr));
|
|
478
561
|
}
|
|
562
|
+
if (relayfileWebhook) {
|
|
563
|
+
await deps.relayfile
|
|
564
|
+
.deleteWebhookSubscription(relayfileWebhook.subscriptionId)
|
|
565
|
+
.catch((cleanupErr) => warnCleanup(deps, 'relayfile webhook subscription', relayfileWebhook.subscriptionId, cleanupErr));
|
|
566
|
+
}
|
|
479
567
|
throw err;
|
|
480
568
|
}
|
|
481
569
|
// New binding is live (relayfile.bind upserts on (provider, pathGlob)). Now
|
|
@@ -489,6 +577,7 @@ async function runSubscribe(deps, providerArg, opts) {
|
|
|
489
577
|
// Show the native resource the user typed, plus the resolved glob when they differ.
|
|
490
578
|
const boundLabel = pathGlob === resource ? resource : `${resource} (${pathGlob})`;
|
|
491
579
|
deps.log(`✓ ${provider} ${boundLabel} bound -> ${to}`);
|
|
580
|
+
deps.log(`✓ Server-side inbound webhook subscription: ${relayfileWebhook.subscriptionId}`);
|
|
492
581
|
deps.log('✓ Listening. Replies will post back in-thread.');
|
|
493
582
|
}
|
|
494
583
|
async function runUnsubscribe(deps, provider, opts) {
|