agent-relay 12.2.2 → 12.2.4

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 (38) hide show
  1. package/dist/cli/bootstrap.d.ts.map +1 -1
  2. package/dist/cli/bootstrap.js +12 -5
  3. package/dist/cli/bootstrap.js.map +1 -1
  4. package/dist/cli/commands/cloud-v1-deprecations.d.ts +44 -0
  5. package/dist/cli/commands/cloud-v1-deprecations.d.ts.map +1 -0
  6. package/dist/cli/commands/cloud-v1-deprecations.js +108 -0
  7. package/dist/cli/commands/cloud-v1-deprecations.js.map +1 -0
  8. package/dist/cli/commands/cloud.d.ts.map +1 -1
  9. package/dist/cli/commands/cloud.js +3 -0
  10. package/dist/cli/commands/cloud.js.map +1 -1
  11. package/dist/cli/commands/local-agent.d.ts.map +1 -1
  12. package/dist/cli/commands/local-agent.js +61 -5
  13. package/dist/cli/commands/local-agent.js.map +1 -1
  14. package/dist/cli/commands/local-workflow.d.ts.map +1 -1
  15. package/dist/cli/commands/local-workflow.js +3 -0
  16. package/dist/cli/commands/local-workflow.js.map +1 -1
  17. package/dist/cli/commands/product-surfaces.d.ts +67 -0
  18. package/dist/cli/commands/product-surfaces.d.ts.map +1 -0
  19. package/dist/cli/commands/product-surfaces.js +165 -0
  20. package/dist/cli/commands/product-surfaces.js.map +1 -0
  21. package/dist/cli/commands/session.d.ts +17 -0
  22. package/dist/cli/commands/session.d.ts.map +1 -1
  23. package/dist/cli/commands/session.js +65 -1
  24. package/dist/cli/commands/session.js.map +1 -1
  25. package/dist/cli/lib/deprecate-command.d.ts +74 -0
  26. package/dist/cli/lib/deprecate-command.d.ts.map +1 -0
  27. package/dist/cli/lib/deprecate-command.js +107 -0
  28. package/dist/cli/lib/deprecate-command.js.map +1 -0
  29. package/dist/cli/lib/relay-cli-surface.d.ts +93 -0
  30. package/dist/cli/lib/relay-cli-surface.d.ts.map +1 -0
  31. package/dist/cli/lib/relay-cli-surface.js +237 -0
  32. package/dist/cli/lib/relay-cli-surface.js.map +1 -0
  33. package/dist/index.cjs +60 -7
  34. package/package.json +13 -9
  35. package/dist/cli/commands/reflex.d.ts +0 -18
  36. package/dist/cli/commands/reflex.d.ts.map +0 -1
  37. package/dist/cli/commands/reflex.js +0 -181
  38. package/dist/cli/commands/reflex.js.map +0 -1
package/dist/index.cjs CHANGED
@@ -303,7 +303,7 @@ __export(index_exports, {
303
303
  module.exports = __toCommonJS(index_exports);
304
304
 
305
305
  // ../../node_modules/@relaycast/sdk/dist/version.js
306
- var SDK_VERSION = "8.10.1";
306
+ var SDK_VERSION = "8.11.1";
307
307
 
308
308
  // ../../node_modules/zod/v4/classic/external.js
309
309
  var external_exports = {};
@@ -21288,6 +21288,8 @@ var FleetCapabilitySchema = external_exports.object({
21288
21288
  global: external_exports.boolean().optional(),
21289
21289
  /** `action` capability opts into the offline queue when its provider is down. */
21290
21290
  queue: external_exports.boolean().optional(),
21291
+ /** Task handlers must accept an execution fence before starting work. */
21292
+ execution_mode: external_exports.enum(["short", "task"]).optional(),
21291
21293
  metadata: external_exports.record(external_exports.string(), FleetWireJsonValueSchema).optional()
21292
21294
  }).strict();
21293
21295
  var FleetProviderIdentitySchema = external_exports.object({
@@ -21424,20 +21426,58 @@ var FleetDeliveryAckMessageSchema = external_exports.object({
21424
21426
  agent: external_exports.string(),
21425
21427
  up_to_seq: external_exports.number().int().nonnegative()
21426
21428
  }).strict();
21429
+ var FleetTaskContextSchema = external_exports.object({
21430
+ run_id: external_exports.string().min(1).max(512).refine((value) => value.trim() === value),
21431
+ step_id: external_exports.string().min(1).max(512).refine((value) => value.trim() === value),
21432
+ dispatch_id: external_exports.string().min(1).max(512).refine((value) => value.trim() === value),
21433
+ timeout_ms: external_exports.number().int().min(1).max(864e5)
21434
+ }).strict();
21435
+ var FleetTaskExecutionSchema = external_exports.object({
21436
+ execution_id: external_exports.string().min(1),
21437
+ run_id: external_exports.string(),
21438
+ step_id: external_exports.string(),
21439
+ dispatch_id: external_exports.string(),
21440
+ deadline: external_exports.string().datetime()
21441
+ }).strict();
21442
+ var FleetActionAcceptMessageSchema = external_exports.object({
21443
+ ...FleetRequestEnvelopeFields,
21444
+ id: external_exports.string().min(1),
21445
+ type: external_exports.literal("action.accept"),
21446
+ invocation_id: external_exports.string().min(1),
21447
+ execution_id: external_exports.string().min(1),
21448
+ worker_generation: external_exports.string().min(1).max(512)
21449
+ }).strict();
21450
+ var taskResultFields = {
21451
+ final: external_exports.boolean().optional(),
21452
+ execution_id: external_exports.string().min(1).optional(),
21453
+ worker_generation: external_exports.string().min(1).max(512).optional(),
21454
+ accounting: external_exports.record(external_exports.string(), external_exports.number().finite().nonnegative()).optional()
21455
+ };
21456
+ function requireTaskResultFence(message, context) {
21457
+ if (message.final === void 0 && message.execution_id === void 0 && message.worker_generation === void 0 && message.accounting === void 0)
21458
+ return;
21459
+ for (const field of ["id", "final", "execution_id", "worker_generation"]) {
21460
+ if (message[field] === void 0 || message[field] === "") {
21461
+ context.addIssue({ code: "custom", path: [field], message: "Task results require a correlated execution fence and explicit final flag" });
21462
+ }
21463
+ }
21464
+ }
21427
21465
  var FleetActionResultOutputMessageSchema = external_exports.object({
21428
21466
  ...FleetRequestEnvelopeFields,
21467
+ ...taskResultFields,
21429
21468
  type: external_exports.literal("action.result"),
21430
21469
  invocation_id: external_exports.string(),
21431
21470
  output: FleetWireJsonValueSchema,
21432
21471
  error: external_exports.never().optional()
21433
- }).strict().superRefine(forbidOwnProperty("error"));
21472
+ }).strict().superRefine(forbidOwnProperty("error")).superRefine(requireTaskResultFence);
21434
21473
  var FleetActionResultErrorMessageSchema = external_exports.object({
21435
21474
  ...FleetRequestEnvelopeFields,
21475
+ ...taskResultFields,
21436
21476
  type: external_exports.literal("action.result"),
21437
21477
  invocation_id: external_exports.string(),
21438
21478
  error: external_exports.string(),
21439
21479
  output: external_exports.never().optional()
21440
- }).strict().superRefine(forbidOwnProperty("output"));
21480
+ }).strict().superRefine(forbidOwnProperty("output")).superRefine(requireTaskResultFence);
21441
21481
  var FleetActionResultMessageSchema = external_exports.union([
21442
21482
  FleetActionResultOutputMessageSchema,
21443
21483
  FleetActionResultErrorMessageSchema
@@ -21497,7 +21537,8 @@ var FleetActionInvokeMessageSchema = external_exports.object({
21497
21537
  action: external_exports.string(),
21498
21538
  agent_id: external_exports.string().optional(),
21499
21539
  agent_name: external_exports.string().optional(),
21500
- input: FleetWireJsonValueSchema
21540
+ input: FleetWireJsonValueSchema,
21541
+ task_execution: FleetTaskExecutionSchema.optional()
21501
21542
  }).strict();
21502
21543
  var FleetContextUpdateMessageSchema = external_exports.object({
21503
21544
  ...FleetWireEnvelopeFields,
@@ -21527,6 +21568,7 @@ var FleetPingMessageSchema = external_exports.object({
21527
21568
  type: external_exports.literal("ping")
21528
21569
  }).strict();
21529
21570
  var FleetBrokerToRelaycastNonActionResultMessageSchema = external_exports.discriminatedUnion("type", [
21571
+ FleetActionAcceptMessageSchema,
21530
21572
  FleetNodeRegisterMessageSchema,
21531
21573
  FleetNodeHeartbeatMessageSchema,
21532
21574
  FleetNodeDeregisterMessageSchema,
@@ -22326,6 +22368,7 @@ function idempotencyHeaders(opts) {
22326
22368
  }
22327
22369
  };
22328
22370
  }
22371
+ var DIRECT_NODE_TOKEN_MAX_USES = 3;
22329
22372
  function normalizeSubscriptionChannel(channel) {
22330
22373
  const trimmed = channel.trim();
22331
22374
  if (trimmed === "@self")
@@ -22349,6 +22392,7 @@ var AgentClient = class {
22349
22392
  pendingHeartbeat = null;
22350
22393
  wsOptions;
22351
22394
  directNodeToken = null;
22395
+ directNodeTokenUses = 0;
22352
22396
  manualSubscriptions = /* @__PURE__ */ new Set();
22353
22397
  managedSubscriptions = /* @__PURE__ */ new Map();
22354
22398
  activeWsChannels = /* @__PURE__ */ new Set();
@@ -22408,8 +22452,13 @@ var AgentClient = class {
22408
22452
  }
22409
22453
  }
22410
22454
  async fetchDirectNodeToken() {
22455
+ if (this.directNodeToken && this.directNodeTokenUses < DIRECT_NODE_TOKEN_MAX_USES) {
22456
+ this.directNodeTokenUses += 1;
22457
+ return this.directNodeToken.token;
22458
+ }
22411
22459
  const token = await this.client.post("/v1/agent/node-token", {});
22412
22460
  this.directNodeToken = token;
22461
+ this.directNodeTokenUses = 1;
22413
22462
  return token.token;
22414
22463
  }
22415
22464
  directNodeRegistration() {
@@ -22441,6 +22490,7 @@ var AgentClient = class {
22441
22490
  autoAckDeliveries: true
22442
22491
  }, this.client.internalOrigin));
22443
22492
  this.ws.on("open", () => {
22493
+ this.directNodeTokenUses = 0;
22444
22494
  void this.presence.markOnline().catch(() => {
22445
22495
  });
22446
22496
  this.startAutoHeartbeat();
@@ -25754,16 +25804,19 @@ function toRelayCapability(raw) {
25754
25804
  function toRelayNode(raw) {
25755
25805
  const node2 = raw ?? {};
25756
25806
  const rawStatus = readStr(node2, "status");
25807
+ const status = rawStatus === "online" || rawStatus === "offline" ? rawStatus : "unknown";
25808
+ const live = readBoolean(node2, "live");
25809
+ const activeAgents = live !== true || status === "offline" ? void 0 : readNumber(node2, "activeAgents", "active_agents");
25757
25810
  return {
25758
25811
  id: readStr(node2, "id", "node_id"),
25759
25812
  nodeId: readStr(node2, "nodeId", "node_id"),
25760
25813
  name: readStr(node2, "name") ?? "",
25761
- status: rawStatus === "online" || rawStatus === "offline" ? rawStatus : "unknown",
25762
- live: readBoolean(node2, "live"),
25814
+ status,
25815
+ live,
25763
25816
  capabilities: Array.isArray(node2.capabilities) ? node2.capabilities.map(toRelayNodeCapability) : [],
25764
25817
  repoKeys: readRepoKeys(node2),
25765
25818
  maxAgents: readNumber(node2, "maxAgents", "max_agents"),
25766
- activeAgents: readNumber(node2, "activeAgents", "active_agents"),
25819
+ activeAgents,
25767
25820
  handlersLive: readBoolean(node2, "handlersLive", "handlers_live"),
25768
25821
  load: readNumber(node2, "load"),
25769
25822
  lastHeartbeatAt: readStr(node2, "lastHeartbeatAt", "last_heartbeat_at"),
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "agent-relay",
3
- "version": "12.2.2",
3
+ "version": "12.2.4",
4
4
  "description": "Real-time agent-to-agent communication system",
5
5
  "type": "module",
6
6
  "main": "dist/index.cjs",
@@ -43,18 +43,22 @@
43
43
  "pack:validate": "npm pack --dry-run"
44
44
  },
45
45
  "dependencies": {
46
- "@agent-relay/cloud": "12.2.2",
47
- "@agent-relay/config": "12.2.2",
48
- "@agent-relay/fleet": "12.2.2",
49
- "@agent-relay/harness-driver": "12.2.2",
50
- "@agent-relay/harnesses": "12.2.2",
51
- "@agent-relay/sdk": "12.2.2",
52
- "@agent-relay/session": "12.2.2",
53
- "@agent-relay/utils": "12.2.2",
46
+ "@agent-relay/cli-surface": "12.2.4",
47
+ "@agent-relay/cloud": "12.2.4",
48
+ "@agent-relay/config": "12.2.4",
49
+ "@agent-relay/fleet": "12.2.4",
50
+ "@agent-relay/harness-driver": "12.2.4",
51
+ "@agent-relay/harnesses": "12.2.4",
52
+ "@agent-relay/sdk": "12.2.4",
53
+ "@agent-relay/session": "12.2.4",
54
+ "@agent-relay/utils": "12.2.4",
54
55
  "@modelcontextprotocol/sdk": "^1.23.0",
55
56
  "@relayfile/client": "^0.10.27",
57
+ "@relayfile/sdk": "^0.10.63",
56
58
  "@relayflows/cli": "1.0.1",
59
+ "@relayflows/sdk": "^2.0.16",
57
60
  "@xterm/headless": "^6.0.0",
61
+ "ai-hist": "^0.18.0",
58
62
  "commander": "^12.1.0",
59
63
  "dotenv": "^17.2.3",
60
64
  "jiti": "^2.6.1",
@@ -1,18 +0,0 @@
1
- import { Command } from 'commander';
2
- export type LoginCloudResult = {
3
- ok: true;
4
- } | {
5
- ok: false;
6
- error: string;
7
- };
8
- export interface ReflexDependencies {
9
- homedir: () => string;
10
- readRelayAuth: () => Promise<{
11
- accessToken: string;
12
- } | null>;
13
- loginToCloud: (relayAccessToken: string) => Promise<LoginCloudResult>;
14
- prompt: (question: string) => Promise<boolean>;
15
- log: (...args: unknown[]) => void;
16
- }
17
- export declare function registerReflexCommands(program: Command, overrides?: Partial<ReflexDependencies>): void;
18
- //# sourceMappingURL=reflex.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"reflex.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/reflex.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEpC,MAAM,MAAM,gBAAgB,GAAG;IAAE,EAAE,EAAE,IAAI,CAAA;CAAE,GAAG;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC;AAE3E,MAAM,WAAW,kBAAkB;IACjC,OAAO,EAAE,MAAM,MAAM,CAAC;IACtB,aAAa,EAAE,MAAM,OAAO,CAAC;QAAE,WAAW,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI,CAAC,CAAC;IAC7D,YAAY,EAAE,CAAC,gBAAgB,EAAE,MAAM,KAAK,OAAO,CAAC,gBAAgB,CAAC,CAAC;IACtE,MAAM,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;IAC/C,GAAG,EAAE,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,KAAK,IAAI,CAAC;CACnC;AAyHD,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,OAAO,EAAE,SAAS,GAAE,OAAO,CAAC,kBAAkB,CAAM,GAAG,IAAI,CA+E1G"}
@@ -1,181 +0,0 @@
1
- import { chmod, mkdir, writeFile } from 'node:fs/promises';
2
- import os from 'node:os';
3
- import path from 'node:path';
4
- import readline from 'node:readline';
5
- import { readReflexState, writeReflexState } from '@agent-relay/config';
6
- const ALLOWED_RELAYHISTORY_HOSTS = new Set(['history.agentrelay.com']);
7
- function validateRelayhistoryBaseUrl(raw) {
8
- let parsed;
9
- try {
10
- parsed = new URL(raw);
11
- }
12
- catch {
13
- return { ok: false, error: `AI_HIST_BASE_URL is not a valid URL: ${raw}` };
14
- }
15
- const isLocalDev = parsed.hostname === 'localhost' || parsed.hostname === '127.0.0.1' || parsed.hostname === '::1';
16
- if (!isLocalDev && !ALLOWED_RELAYHISTORY_HOSTS.has(parsed.hostname)) {
17
- return {
18
- ok: false,
19
- error: `AI_HIST_BASE_URL hostname "${parsed.hostname}" is not an allowed relayhistory host`,
20
- };
21
- }
22
- return { ok: true, url: parsed };
23
- }
24
- function promptYesNo(question) {
25
- if (!process.stdin.isTTY) {
26
- return Promise.resolve(false);
27
- }
28
- const rl = readline.createInterface({
29
- input: process.stdin,
30
- output: process.stdout,
31
- });
32
- return new Promise((resolve) => {
33
- rl.question(question, (answer) => {
34
- rl.close();
35
- const normalized = answer.trim().toLowerCase();
36
- resolve(normalized === 'y' || normalized === 'yes');
37
- });
38
- });
39
- }
40
- async function defaultReadRelayAuth() {
41
- const { readStoredAuth } = await import('@agent-relay/cloud');
42
- return readStoredAuth();
43
- }
44
- async function defaultLoginToCloud(relayAccessToken) {
45
- const rawBase = process.env.AI_HIST_BASE_URL ?? 'https://history.agentrelay.com';
46
- const validated = validateRelayhistoryBaseUrl(rawBase);
47
- if (!validated.ok) {
48
- return { ok: false, error: validated.error };
49
- }
50
- const url = `${rawBase.replace(/\/$/, '')}/v1/cli/login`;
51
- let resp;
52
- try {
53
- resp = await fetch(url, {
54
- method: 'POST',
55
- headers: { 'Content-Type': 'application/json' },
56
- body: JSON.stringify({ agentRelayToken: relayAccessToken }),
57
- signal: AbortSignal.timeout(15_000),
58
- });
59
- }
60
- catch (err) {
61
- return { ok: false, error: `Network error: ${err instanceof Error ? err.message : String(err)}` };
62
- }
63
- if (!resp.ok) {
64
- const text = await resp.text().catch(() => '');
65
- return { ok: false, error: `Login failed (HTTP ${resp.status}): ${text.slice(0, 200)}` };
66
- }
67
- let payload;
68
- try {
69
- const raw = await resp.json();
70
- if (!raw || typeof raw !== 'object' || Array.isArray(raw)) {
71
- return { ok: false, error: 'Login response has unexpected shape' };
72
- }
73
- payload = raw;
74
- }
75
- catch {
76
- return { ok: false, error: 'Login response was not valid JSON' };
77
- }
78
- if (typeof payload.accessToken !== 'string') {
79
- return { ok: false, error: 'Login response missing accessToken' };
80
- }
81
- // Persist the rth_at_ session where the `ai-hist` Rust binary reads it, so the
82
- // in-process cloud push (which drives `ai-hist push`) authenticates on later
83
- // runs. The binary reads $RELAYHISTORY_HOME/auth.json (default
84
- // ~/.agentworkforce/relayhistory/auth.json) in snake_case.
85
- try {
86
- const authDir = process.env.RELAYHISTORY_HOME ?? path.join(os.homedir(), '.agentworkforce', 'relayhistory');
87
- const authPath = path.join(authDir, 'auth.json');
88
- const auth = {
89
- base_url: rawBase.replace(/\/$/, ''),
90
- access_token: payload.accessToken,
91
- ...(typeof payload.refreshToken === 'string' ? { refresh_token: payload.refreshToken } : {}),
92
- };
93
- await mkdir(authDir, { recursive: true });
94
- await writeFile(authPath, JSON.stringify(auth, null, 2));
95
- // Explicitly tighten perms — writeFile mode only applies to newly created files.
96
- await chmod(authPath, 0o600);
97
- }
98
- catch {
99
- // Non-fatal: local state is written; cloud sync may prompt again next run.
100
- }
101
- return { ok: true };
102
- }
103
- function withDefaults(overrides = {}) {
104
- return {
105
- homedir: os.homedir,
106
- readRelayAuth: defaultReadRelayAuth,
107
- loginToCloud: defaultLoginToCloud,
108
- prompt: promptYesNo,
109
- log: (...args) => console.log(...args),
110
- ...overrides,
111
- };
112
- }
113
- export function registerReflexCommands(program, overrides = {}) {
114
- const deps = withDefaults(overrides);
115
- const reflex = program.command('reflex').description('Manage Reflex history sync');
116
- reflex
117
- .command('on')
118
- .description('Enable Reflex history sync')
119
- .action(async () => {
120
- deps.log('Reflex will capture your agent sessions and sync to history.agentrelay.com');
121
- const accepted = await deps.prompt('Enable Reflex? (y/N) ');
122
- if (!accepted) {
123
- deps.log('Reflex was not enabled.');
124
- return;
125
- }
126
- writeReflexState({
127
- enabled: true,
128
- enabledAt: new Date().toISOString(),
129
- }, deps.homedir());
130
- const relayAuth = await deps.readRelayAuth();
131
- let cloudSyncActive = false;
132
- if (!relayAuth) {
133
- deps.log('Not logged in to Agent Relay. Run `agent-relay login` first to sync Reflex history to the cloud.');
134
- }
135
- else {
136
- const result = await deps.loginToCloud(relayAuth.accessToken);
137
- if (result.ok) {
138
- cloudSyncActive = true;
139
- }
140
- else {
141
- deps.log(`Reflex is enabled locally, but cloud login did not complete: ${result.error}`);
142
- }
143
- }
144
- deps.log('Reflex is on.');
145
- // Only promise automatic cloud sync when cloud auth actually succeeded —
146
- // otherwise the message would contradict the login warning above.
147
- if (cloudSyncActive) {
148
- deps.log('History syncs to relayhistory-cloud automatically while `agent-relay up` is running.');
149
- }
150
- deps.log('State file: ~/.agentworkforce/reflex.json');
151
- });
152
- reflex
153
- .command('off')
154
- .description('Disable Reflex history sync')
155
- .action(() => {
156
- writeReflexState({ enabled: false }, deps.homedir());
157
- deps.log('Reflex is off.');
158
- });
159
- reflex
160
- .command('status')
161
- .description('Show Reflex status')
162
- .action(() => {
163
- const state = readReflexState(deps.homedir());
164
- if (!state) {
165
- deps.log('Reflex is off (never enabled).');
166
- return;
167
- }
168
- if (state.enabled) {
169
- deps.log('Reflex is on.');
170
- if (state.enabledAt) {
171
- deps.log(`Enabled at: ${state.enabledAt}`);
172
- }
173
- return;
174
- }
175
- deps.log('Reflex is off.');
176
- if (state.enabledAt) {
177
- deps.log(`Enabled at: ${state.enabledAt}`);
178
- }
179
- });
180
- }
181
- //# sourceMappingURL=reflex.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"reflex.js","sourceRoot":"","sources":["../../../src/cli/commands/reflex.ts"],"names":[],"mappings":"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"}