agent-relay 11.8.0 → 11.8.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 (50) hide show
  1. package/README.md +18 -3
  2. package/dist/cli/agent-relay-mcp.d.ts.map +1 -1
  3. package/dist/cli/agent-relay-mcp.js +61 -1
  4. package/dist/cli/agent-relay-mcp.js.map +1 -1
  5. package/dist/cli/bootstrap.d.ts.map +1 -1
  6. package/dist/cli/bootstrap.js +2 -0
  7. package/dist/cli/bootstrap.js.map +1 -1
  8. package/dist/cli/commands/fleet-agent.d.ts +14 -5
  9. package/dist/cli/commands/fleet-agent.d.ts.map +1 -1
  10. package/dist/cli/commands/fleet-agent.js +0 -0
  11. package/dist/cli/commands/fleet-agent.js.map +1 -1
  12. package/dist/cli/commands/fleet.d.ts +3 -0
  13. package/dist/cli/commands/fleet.d.ts.map +1 -1
  14. package/dist/cli/commands/fleet.js +230 -63
  15. package/dist/cli/commands/fleet.js.map +1 -1
  16. package/dist/cli/commands/observer.d.ts +28 -0
  17. package/dist/cli/commands/observer.d.ts.map +1 -0
  18. package/dist/cli/commands/observer.js +182 -0
  19. package/dist/cli/commands/observer.js.map +1 -0
  20. package/dist/cli/commands/session.d.ts +7 -1
  21. package/dist/cli/commands/session.d.ts.map +1 -1
  22. package/dist/cli/commands/session.js +29 -12
  23. package/dist/cli/commands/session.js.map +1 -1
  24. package/dist/cli/lib/attach-input-recovery.d.ts +30 -6
  25. package/dist/cli/lib/attach-input-recovery.d.ts.map +1 -1
  26. package/dist/cli/lib/attach-input-recovery.js +49 -1
  27. package/dist/cli/lib/attach-input-recovery.js.map +1 -1
  28. package/dist/cli/lib/attach.d.ts.map +1 -1
  29. package/dist/cli/lib/attach.js +10 -0
  30. package/dist/cli/lib/attach.js.map +1 -1
  31. package/dist/cli/lib/fleet-hint.d.ts.map +1 -1
  32. package/dist/cli/lib/fleet-hint.js +41 -13
  33. package/dist/cli/lib/fleet-hint.js.map +1 -1
  34. package/dist/cli/lib/fleet-live-agents.d.ts +42 -0
  35. package/dist/cli/lib/fleet-live-agents.d.ts.map +1 -0
  36. package/dist/cli/lib/fleet-live-agents.js +63 -0
  37. package/dist/cli/lib/fleet-live-agents.js.map +1 -0
  38. package/dist/cli/lib/message-delivery-receipts.d.ts +24 -0
  39. package/dist/cli/lib/message-delivery-receipts.d.ts.map +1 -1
  40. package/dist/cli/lib/message-delivery-receipts.js +39 -0
  41. package/dist/cli/lib/message-delivery-receipts.js.map +1 -1
  42. package/dist/cli/lib/observer-url.d.ts +32 -0
  43. package/dist/cli/lib/observer-url.d.ts.map +1 -0
  44. package/dist/cli/lib/observer-url.js +61 -0
  45. package/dist/cli/lib/observer-url.js.map +1 -0
  46. package/dist/cli/mcp/messaging-tools.d.ts.map +1 -1
  47. package/dist/cli/mcp/messaging-tools.js +21 -7
  48. package/dist/cli/mcp/messaging-tools.js.map +1 -1
  49. package/dist/index.cjs +238 -62
  50. package/package.json +9 -9
package/dist/index.cjs CHANGED
@@ -182,6 +182,8 @@ __export(index_exports, {
182
182
  MessageReadPredicate: () => MessageReadPredicate,
183
183
  OBSERVABILITY_UNAVAILABLE: () => OBSERVABILITY_UNAVAILABLE,
184
184
  RELAYCAST_SDK_VERSION: () => RELAYCAST_SDK_VERSION,
185
+ RELAY_ATTEST_SESSION_ID_ENV: () => RELAY_ATTEST_SESSION_ID_ENV,
186
+ RELAY_OBSERVER_SCOPES: () => RELAY_OBSERVER_SCOPES,
185
187
  RELAY_SERVICE_FAILURE_MESSAGE: () => RELAY_SERVICE_FAILURE_MESSAGE,
186
188
  RelayCapabilityError: () => RelayCapabilityError,
187
189
  RelayError: () => RelayError,
@@ -214,6 +216,7 @@ __export(index_exports, {
214
216
  createLogger: () => createLogger,
215
217
  createNotifyHandler: () => createNotifyHandler,
216
218
  createObserverEventSource: () => createObserverEventSource,
219
+ createObserverToken: () => createObserverToken,
217
220
  createRealtimeClient: () => createRealtimeClient,
218
221
  createRequestEnvelope: () => createRequestEnvelope,
219
222
  createRequestHandler: () => createRequestHandler,
@@ -222,6 +225,7 @@ __export(index_exports, {
222
225
  createWorkspace: () => createWorkspace,
223
226
  createWorkspaceClient: () => createWorkspaceClient,
224
227
  createWorkspaceFacade: () => createWorkspaceFacade,
228
+ currentReplaySessionRef: () => currentReplaySessionRef,
225
229
  defineHarness: () => defineHarness,
226
230
  findGitRoot: () => findGitRoot,
227
231
  formatAgentHandle: () => formatAgentHandle,
@@ -246,6 +250,7 @@ __export(index_exports, {
246
250
  isPlaceholderTargetFast: () => isPlaceholderTargetFast,
247
251
  isSpawnOrReleaseCommandFast: () => isSpawnOrReleaseCommandFast,
248
252
  isValidAgentName: () => isValidAgentName,
253
+ listObserverTokens: () => listObserverTokens,
249
254
  logAndTraceError: () => logAndTraceError,
250
255
  logRelayHandlerError: () => logRelayHandlerError,
251
256
  mapModelToCli: () => mapModelToCli,
@@ -276,10 +281,13 @@ __export(index_exports, {
276
281
  printUpdateNotification: () => printUpdateNotification,
277
282
  reduceAgentActivity: () => reduceAgentActivity,
278
283
  registerFacadeAction: () => registerFacadeAction,
284
+ replayMessageMetadata: () => replayMessageMetadata,
279
285
  resetPatternMetrics: () => resetPatternMetrics,
280
286
  resolveAgentName: () => resolveAgentName,
281
287
  resolveAgentToken: () => resolveAgentToken,
282
288
  resolveCommand: () => resolveCommand,
289
+ resolveReplaySessionRef: () => resolveReplaySessionRef,
290
+ revokeObserverToken: () => revokeObserverToken,
283
291
  routerLog: () => routerLog,
284
292
  safeRelayErrorMessage: () => safeRelayErrorMessage,
285
293
  stripAnsiFast: () => stripAnsiFast,
@@ -295,7 +303,7 @@ __export(index_exports, {
295
303
  module.exports = __toCommonJS(index_exports);
296
304
 
297
305
  // ../../node_modules/@relaycast/sdk/dist/version.js
298
- var SDK_VERSION = "8.1.0";
306
+ var SDK_VERSION = "8.2.0";
299
307
 
300
308
  // ../../node_modules/zod/v4/classic/external.js
301
309
  var external_exports = {};
@@ -14883,6 +14891,7 @@ var ReactionGroupSchema = external_exports.object({
14883
14891
  });
14884
14892
 
14885
14893
  // ../../node_modules/@relaycast/types/dist/agent.js
14894
+ var AGENT_RECOVERY_PROOF_HASH_PATTERN = /^[a-f0-9]{64}$/;
14886
14895
  var AgentTypeSchema = external_exports.enum(["agent", "human", "system"]);
14887
14896
  var AgentStatusSchema = external_exports.enum(["online", "offline", "away"]);
14888
14897
  var AgentSchema = external_exports.object({
@@ -14914,7 +14923,9 @@ var CreateAgentRequestSchema = external_exports.object({
14914
14923
  persona: external_exports.string().optional(),
14915
14924
  metadata: external_exports.record(external_exports.string(), external_exports.unknown()).optional(),
14916
14925
  skills: external_exports.array(AgentSkillInputSchema).optional(),
14917
- capabilities: external_exports.record(external_exports.string(), external_exports.unknown()).optional()
14926
+ capabilities: external_exports.record(external_exports.string(), external_exports.unknown()).optional(),
14927
+ recovery_proof_hash: external_exports.string().regex(AGENT_RECOVERY_PROOF_HASH_PATTERN).optional(),
14928
+ work_unit_id: external_exports.string().min(1).optional()
14918
14929
  });
14919
14930
  var CreateAgentResponseSchema = external_exports.object({
14920
14931
  id: external_exports.string(),
@@ -15131,6 +15142,33 @@ var SessionMessagesResultSchema = external_exports.object({
15131
15142
  });
15132
15143
 
15133
15144
  // ../../node_modules/@relaycast/types/dist/workspace.js
15145
+ var WORKSPACE_CREATION_SOURCES = [
15146
+ "api",
15147
+ "sdk",
15148
+ "cli",
15149
+ "mcp",
15150
+ "ci",
15151
+ "relayflow",
15152
+ "dashboard",
15153
+ "other"
15154
+ ];
15155
+ var WorkspaceCreationSourceSchema = external_exports.enum(WORKSPACE_CREATION_SOURCES);
15156
+ var WORKSPACE_USAGE_CLASSIFICATIONS = ["internal", "external", "unknown"];
15157
+ var WorkspaceUsageClassificationSchema = external_exports.enum(WORKSPACE_USAGE_CLASSIFICATIONS);
15158
+ var provenanceIdentifier = external_exports.string().min(1).max(256).regex(/^[A-Za-z0-9._:/@-]+$/, "must contain only letters, numbers, dot, underscore, colon, slash, @, or dash");
15159
+ var WorkspaceProvenanceInputSchema = external_exports.object({
15160
+ source: WorkspaceCreationSourceSchema,
15161
+ origin_id: provenanceIdentifier.optional(),
15162
+ classification: WorkspaceUsageClassificationSchema.optional()
15163
+ });
15164
+ var WorkspaceProvenanceSchema = WorkspaceProvenanceInputSchema.extend({
15165
+ source_basis: external_exports.enum(["declared", "origin_client", "default"]),
15166
+ origin_actor: external_exports.string().optional(),
15167
+ actor_user_id: external_exports.string().optional(),
15168
+ actor_machine_id: external_exports.string().optional(),
15169
+ actor_org_id: external_exports.string().optional(),
15170
+ actor_org_slug: external_exports.string().optional()
15171
+ });
15134
15172
  var WorkspaceSchema = external_exports.object({
15135
15173
  id: external_exports.string(),
15136
15174
  name: external_exports.string(),
@@ -15141,11 +15179,17 @@ var WorkspaceSchema = external_exports.object({
15141
15179
  effective_retention: external_exports.object({
15142
15180
  messages: EffectiveMessageRetentionSchema
15143
15181
  }).optional(),
15144
- expires_at: external_exports.string().nullable().optional()
15182
+ expires_at: external_exports.string().nullable().optional(),
15183
+ provenance: WorkspaceProvenanceSchema.nullable().default(null),
15184
+ usage_classification: WorkspaceUsageClassificationSchema.default("unknown"),
15185
+ classification_source: external_exports.enum(["creator", "operator", "unclassified"]).default("unclassified"),
15186
+ classification_reason: external_exports.string().nullable().default(null),
15187
+ classified_at: external_exports.string().nullable().default(null)
15145
15188
  });
15146
15189
  var CreateWorkspaceRequestSchema = external_exports.object({
15147
15190
  name: external_exports.string(),
15148
- expires_in_seconds: external_exports.number().int().min(60).max(30 * 24 * 60 * 60).optional()
15191
+ expires_in_seconds: external_exports.number().int().min(60).max(30 * 24 * 60 * 60).optional(),
15192
+ provenance: WorkspaceProvenanceInputSchema.optional()
15149
15193
  });
15150
15194
  var CreateWorkspaceResponseSchema = external_exports.object({
15151
15195
  workspace_id: external_exports.string(),
@@ -15972,6 +16016,8 @@ var SERVER_TELEMETRY_EVENTS = [
15972
16016
  "relaycast_server_legacy_identity_claimed",
15973
16017
  "relaycast_server_agent_deleted",
15974
16018
  "relaycast_server_agent_token_rotated",
16019
+ "relaycast_server_agent_identity_taken_over",
16020
+ "relaycast_server_agent_token_revoked",
15975
16021
  "relaycast_server_channel_created",
15976
16022
  "relaycast_server_channel_updated",
15977
16023
  "relaycast_server_channel_topic_updated",
@@ -16196,6 +16242,15 @@ var FleetAgentRegisterMessageSchema = external_exports.object({
16196
16242
  session_ref: external_exports.string().optional(),
16197
16243
  resumable: external_exports.boolean().optional()
16198
16244
  }).strict();
16245
+ var FleetAgentRecoverMessageSchema = external_exports.object({
16246
+ ...FleetRequestEnvelopeFields,
16247
+ type: external_exports.literal("agent.recover"),
16248
+ name: external_exports.string(),
16249
+ expected_agent_id: external_exports.string(),
16250
+ invocation_id: external_exports.string().optional(),
16251
+ session_ref: external_exports.string().optional(),
16252
+ resumable: external_exports.boolean().optional()
16253
+ }).strict();
16199
16254
  var FleetAgentDeregisterMessageSchema = external_exports.object({
16200
16255
  ...FleetRequestEnvelopeFields,
16201
16256
  type: external_exports.literal("agent.deregister"),
@@ -16300,6 +16355,7 @@ var FleetBrokerToRelaycastNonActionResultMessageSchema = external_exports.discri
16300
16355
  FleetNodeDeregisterMessageSchema,
16301
16356
  FleetNodeSpawnMessageSchema,
16302
16357
  FleetAgentRegisterMessageSchema,
16358
+ FleetAgentRecoverMessageSchema,
16303
16359
  FleetAgentDeregisterMessageSchema,
16304
16360
  FleetDeliveryAckMessageSchema,
16305
16361
  FleetInventorySyncMessageSchema
@@ -17227,6 +17283,14 @@ var AgentClient = class {
17227
17283
  async heartbeat() {
17228
17284
  await this.presence.heartbeat();
17229
17285
  }
17286
+ /** Authenticated self-rollover for this agent identity. */
17287
+ async rotateToken(name) {
17288
+ return this.client.post(`/v1/agents/${encodeURIComponent(name)}/rotate-token`, {});
17289
+ }
17290
+ /** Enroll or rotate this agent's server-owned recovery verifier. */
17291
+ async enrollRecoveryCredential(data) {
17292
+ return this.client.post("/v1/agent/recovery-credential", data);
17293
+ }
17230
17294
  /**
17231
17295
  * Tear down this client's WebSocket and mark the agent offline.
17232
17296
  *
@@ -17958,12 +18022,17 @@ function emitCompatibilityTelemetry(event, metadata = {}) {
17958
18022
  const detail = { event, metadata };
17959
18023
  target.dispatchEvent(new CustomEventCtor(COMPAT_EVENT_NAME, { detail }));
17960
18024
  }
17961
- function appendLegacySuffix(baseName) {
17962
- const suffix = Math.random().toString(16).slice(2, 6).padEnd(4, "0");
17963
- return `${baseName}-${suffix}`;
17964
- }
17965
- function isNameConflictError(err) {
17966
- return err instanceof RelayError && err.code === "name_conflict";
18025
+
18026
+ // ../../node_modules/@relaycast/sdk/dist/workspace-provenance.js
18027
+ function toWorkspaceProvenanceInput(provenance) {
18028
+ if (!provenance) {
18029
+ return { source: "sdk" };
18030
+ }
18031
+ const { originId, ...wireProvenance } = provenance;
18032
+ return {
18033
+ ...wireProvenance,
18034
+ ...originId !== void 0 ? { origin_id: originId } : {}
18035
+ };
17967
18036
  }
17968
18037
 
17969
18038
  // ../../node_modules/@relaycast/sdk/dist/relay.js
@@ -18065,7 +18134,8 @@ var RelayCast = class _RelayCast {
18065
18134
  },
18066
18135
  body: JSON.stringify({
18067
18136
  name,
18068
- ...resolved.expiresInSeconds !== void 0 ? { expires_in_seconds: resolved.expiresInSeconds } : {}
18137
+ ...resolved.expiresInSeconds !== void 0 ? { expires_in_seconds: resolved.expiresInSeconds } : {},
18138
+ provenance: toWorkspaceProvenanceInput(resolved.provenance)
18069
18139
  })
18070
18140
  });
18071
18141
  let parsed;
@@ -18146,53 +18216,18 @@ var RelayCast = class _RelayCast {
18146
18216
  workspaceId: await this.resolveWorkspaceId()
18147
18217
  };
18148
18218
  }
18149
- async registerWithLegacySuffix(data) {
18150
- const maxAttempts = 5;
18151
- let candidateName = data.name;
18152
- for (let attempt = 0; attempt <= maxAttempts; attempt += 1) {
18153
- try {
18154
- return await this.agents.register({ ...data, name: candidateName });
18155
- } catch (err) {
18156
- if (!isNameConflictError(err) || attempt === maxAttempts) {
18157
- throw err;
18158
- }
18159
- candidateName = appendLegacySuffix(data.name);
18160
- }
18161
- }
18162
- throw new RelayError("transport_error", "Failed to register agent identity after suffix retries");
18163
- }
18164
18219
  registerTypedIdentity(type, data) {
18165
18220
  return this.agents.register({ ...data, type });
18166
18221
  }
18167
18222
  async registerAgent(data) {
18168
- const { strict, ...request } = data;
18169
- if (strict) {
18170
- return this.agents.register(request);
18171
- }
18172
- emitCompatibilityTelemetry("agents.registerAgent.legacy_suffix", {
18173
- requested_name: data.name
18174
- });
18175
- return this.registerWithLegacySuffix(request);
18223
+ const { strict: _strict, ...request } = data;
18224
+ return this.agents.register(request);
18176
18225
  }
18177
18226
  async registerOrRotate(data) {
18178
- try {
18179
- return await this.registerAgent({ ...data, strict: true });
18180
- } catch (err) {
18181
- if (isNameConflictError(err)) {
18182
- const agent = await this.agents.get(data.name);
18183
- const { token } = await this.agents.rotateToken(agent.name);
18184
- this.rememberIdentity(agent.id, agent.name);
18185
- const createdAt = agent.createdAt ?? agent.lastSeen;
18186
- return {
18187
- id: agent.id,
18188
- name: agent.name,
18189
- token,
18190
- status: agent.status,
18191
- createdAt
18192
- };
18193
- }
18194
- throw err;
18195
- }
18227
+ emitCompatibilityTelemetry("agents.registerOrRotate.deprecated", {
18228
+ replacement: "agents.register or agents.recover"
18229
+ });
18230
+ return this.registerAgent(data);
18196
18231
  }
18197
18232
  async resolveIdentity() {
18198
18233
  return this.resolveIdentityInternal();
@@ -18378,15 +18413,23 @@ var RelayCast = class _RelayCast {
18378
18413
  },
18379
18414
  get: (name) => this.client.get(`/v1/agents/${encodeURIComponent(name)}`),
18380
18415
  me: (apiToken) => (apiToken ? this.client.withApiKey(apiToken) : this.client).get("/v1/agent"),
18381
- rotateToken: (name) => this.client.post(`/v1/agents/${encodeURIComponent(name)}/rotate-token`, {}),
18416
+ rotateToken: (name, agentToken) => this.client.withApiKey(agentToken).post(`/v1/agents/${encodeURIComponent(name)}/rotate-token`, {}),
18417
+ recover: async ({ name, ...data }) => {
18418
+ const result = await this.client.post(`/v1/agents/${encodeURIComponent(name)}/recover`, data);
18419
+ this.rememberIdentity(result.agentId, result.name);
18420
+ return result;
18421
+ },
18422
+ takeOver: ({ name, ...data }) => this.client.post(`/v1/agents/${encodeURIComponent(name)}/takeover`, data),
18423
+ revokeToken: ({ name, ...data }) => this.client.post(`/v1/agents/${encodeURIComponent(name)}/revoke-token`, data),
18424
+ enrollRecoveryCredential: (data, agentToken) => this.client.withApiKey(agentToken).post("/v1/agent/recovery-credential", data),
18382
18425
  update: (name, data) => this.client.patch(`/v1/agents/${encodeURIComponent(name)}`, data),
18383
18426
  delete: (name) => this.client.delete(`/v1/agents/${encodeURIComponent(name)}`),
18384
18427
  presence: () => this.client.get("/v1/agents/presence"),
18385
18428
  registerOrGet: async (data) => {
18386
18429
  emitCompatibilityTelemetry("agents.registerOrGet.deprecated", {
18387
- replacement: "agents.registerOrRotate"
18430
+ replacement: "agents.register or agents.recover"
18388
18431
  });
18389
- return this.registerOrRotate(data);
18432
+ return this.agents.register(data);
18390
18433
  },
18391
18434
  registerAgent: (data) => this.registerAgent(data),
18392
18435
  registerOrRotate: (data) => this.registerOrRotate(data),
@@ -19133,6 +19176,28 @@ function relaycastWorkspaceTelemetryOptions(explicit = {}, env = defaultEnv()) {
19133
19176
  return identity;
19134
19177
  }
19135
19178
 
19179
+ // ../sdk/dist/messaging/session-ref.js
19180
+ var RELAY_ATTEST_SESSION_ID_ENV = "RELAY_ATTEST_SESSION_ID";
19181
+ var MAX_SESSION_REF_LENGTH = 255;
19182
+ function resolveReplaySessionRef(value) {
19183
+ const sessionRef = value?.trim();
19184
+ if (!sessionRef || Array.from(sessionRef).length > MAX_SESSION_REF_LENGTH)
19185
+ return void 0;
19186
+ return sessionRef;
19187
+ }
19188
+ function currentReplaySessionRef() {
19189
+ return resolveReplaySessionRef(typeof process === "undefined" ? void 0 : process.env[RELAY_ATTEST_SESSION_ID_ENV]);
19190
+ }
19191
+ function replayMessageMetadata(metadata, ...rest) {
19192
+ if (metadata && Object.hasOwn(metadata, "session_ref"))
19193
+ return metadata;
19194
+ const sessionRef = rest.length === 0 ? currentReplaySessionRef() : rest[0];
19195
+ const normalized = resolveReplaySessionRef(sessionRef);
19196
+ if (!normalized)
19197
+ return metadata;
19198
+ return { ...metadata ?? {}, session_ref: normalized };
19199
+ }
19200
+
19136
19201
  // ../sdk/dist/messaging/normalize.js
19137
19202
  function isRecord2(value) {
19138
19203
  return value !== null && typeof value === "object" && !Array.isArray(value);
@@ -20631,6 +20696,7 @@ var RelaycastMessagingClient = class {
20631
20696
  placementTtlMs;
20632
20697
  maxQueuedPlacements;
20633
20698
  placementLog;
20699
+ sessionRef;
20634
20700
  queuedPlacements = 0;
20635
20701
  eventHandlers = /* @__PURE__ */ new Map();
20636
20702
  eventUnsubscribe;
@@ -20641,6 +20707,7 @@ var RelaycastMessagingClient = class {
20641
20707
  this.placementTtlMs = options.placementTtlMs ?? 60 * 60 * 1e3;
20642
20708
  this.maxQueuedPlacements = options.maxQueuedPlacements ?? 100;
20643
20709
  this.placementLog = options.placementLog;
20710
+ this.sessionRef = options.sessionRef === void 0 ? currentReplaySessionRef() : resolveReplaySessionRef(options.sessionRef);
20644
20711
  const durable = this.deliverySurface() !== void 0;
20645
20712
  this.capabilities = {
20646
20713
  serverDeliveryState: durable,
@@ -20723,6 +20790,7 @@ var RelaycastMessagingClient = class {
20723
20790
  const message = await this.requireAgentClient("messages.send").send(input.channel, input.text, definedOptions({
20724
20791
  attachments: serializeAttachmentInputs(input.attachments),
20725
20792
  blocks: input.blocks,
20793
+ data: replayMessageMetadata(input.metadata, this.sessionRef),
20726
20794
  mode: input.mode,
20727
20795
  idempotencyKey: input.idempotencyKey
20728
20796
  }));
@@ -20735,7 +20803,11 @@ var RelaycastMessagingClient = class {
20735
20803
  },
20736
20804
  get: async (id) => normalizeMessage(await this.relaycast.messages.get(id)),
20737
20805
  reply: async (input) => {
20738
- const message = await this.requireAgentClient("messages.reply").reply(input.messageId, input.text, definedOptions({ blocks: input.blocks, idempotencyKey: input.idempotencyKey }));
20806
+ const message = await this.requireAgentClient("messages.reply").reply(input.messageId, input.text, definedOptions({
20807
+ blocks: input.blocks,
20808
+ data: replayMessageMetadata(input.metadata, this.sessionRef),
20809
+ idempotencyKey: input.idempotencyKey
20810
+ }));
20739
20811
  return normalizeMessage(message, {
20740
20812
  kind: "thread_reply",
20741
20813
  parentId: input.messageId,
@@ -20745,6 +20817,7 @@ var RelaycastMessagingClient = class {
20745
20817
  direct: async (input) => {
20746
20818
  const response = await this.requireAgentClient("messages.direct").dm(input.to, input.text, definedOptions({
20747
20819
  attachments: serializeAttachmentInputs(input.attachments),
20820
+ data: replayMessageMetadata(input.metadata, this.sessionRef),
20748
20821
  mode: input.mode,
20749
20822
  idempotencyKey: input.idempotencyKey
20750
20823
  }));
@@ -20758,6 +20831,7 @@ var RelaycastMessagingClient = class {
20758
20831
  }
20759
20832
  const response = await agent.dms.sendMessage(conversationId, input.text, definedOptions({
20760
20833
  attachments: serializeAttachmentInputs(input.attachments),
20834
+ data: replayMessageMetadata(input.metadata, this.sessionRef),
20761
20835
  mode: input.mode,
20762
20836
  idempotencyKey: input.idempotencyKey
20763
20837
  }));
@@ -21453,6 +21527,45 @@ var RelaycastMessagingClient = class {
21453
21527
 
21454
21528
  // ../sdk/dist/messaging/thin-client.js
21455
21529
  var RELAYCAST_SDK_VERSION = SDK_VERSION;
21530
+ var RELAY_OBSERVER_SCOPES = [
21531
+ "stream:read",
21532
+ "messages:read",
21533
+ "threads:read",
21534
+ "dms:read",
21535
+ "channels:read",
21536
+ "search:read",
21537
+ "agents:read",
21538
+ "nodes:read",
21539
+ "deliveries:read",
21540
+ "activity:read",
21541
+ "files:read",
21542
+ "reactions:read"
21543
+ ];
21544
+ function observerTokenClient(workspaceKey, options) {
21545
+ return new RelayCast(clientConfig(workspaceKey, options));
21546
+ }
21547
+ async function createObserverToken(options) {
21548
+ const client = observerTokenClient(options.workspaceKey, options);
21549
+ return client.observerTokens.create({
21550
+ name: options.name,
21551
+ ...options.description === void 0 ? {} : { description: options.description },
21552
+ scopes: [...options.scopes ?? RELAY_OBSERVER_SCOPES],
21553
+ // `include_dms` defaults to false server-side, but send it explicitly so the
21554
+ // token's stored filters record the decision rather than an absence.
21555
+ filters: {
21556
+ includeDms: options.filters?.includeDms === true,
21557
+ ...options.filters?.channelNames?.length ? { channelNames: options.filters.channelNames } : {},
21558
+ ...options.filters?.agentIds?.length ? { agentIds: options.filters.agentIds } : {}
21559
+ },
21560
+ ...options.expiresAt === void 0 ? {} : { expiresAt: options.expiresAt }
21561
+ });
21562
+ }
21563
+ async function listObserverTokens(options) {
21564
+ return observerTokenClient(options.workspaceKey, options).observerTokens.list();
21565
+ }
21566
+ async function revokeObserverToken(options) {
21567
+ await observerTokenClient(options.workspaceKey, options).observerTokens.revoke(options.id);
21568
+ }
21456
21569
  function pickTelemetryOverrides(options) {
21457
21570
  return {
21458
21571
  ...options.originActor === void 0 ? {} : { originActor: options.originActor },
@@ -21475,9 +21588,59 @@ function createWorkspaceClient(options) {
21475
21588
  }
21476
21589
  function createAgentClient(options) {
21477
21590
  const relay = new RelayCast(clientConfig(options.agentToken, options));
21478
- return relay.as(options.agentToken, {
21591
+ const raw = relay.as(options.agentToken, {
21479
21592
  autoHeartbeatMs: options.autoHeartbeatMs ?? false
21480
21593
  });
21594
+ const sessionRef = options.sessionRef === void 0 ? currentReplaySessionRef() : resolveReplaySessionRef(options.sessionRef);
21595
+ if (!sessionRef)
21596
+ return raw;
21597
+ return stampAgentClientWithReplaySession(raw, sessionRef);
21598
+ }
21599
+ function stampAgentClientWithReplaySession(client, sessionRef) {
21600
+ const stampData = (data) => replayMessageMetadata(data, sessionRef);
21601
+ const withStampedData = (options, invoke) => {
21602
+ const merged = { ...options ?? {} };
21603
+ const stamped = stampData(options?.data);
21604
+ if (stamped === void 0)
21605
+ delete merged.data;
21606
+ else
21607
+ merged.data = stamped;
21608
+ return invoke(merged);
21609
+ };
21610
+ let wrappedDms;
21611
+ const dmsProxy = () => {
21612
+ const target = client.dms;
21613
+ if (!target)
21614
+ return target;
21615
+ wrappedDms ??= new Proxy(target, {
21616
+ get(dms, prop) {
21617
+ if (prop === "sendMessage") {
21618
+ return (conversationId, text, options) => withStampedData(options, (opts) => dms.sendMessage(conversationId, text, opts));
21619
+ }
21620
+ const value = Reflect.get(dms, prop, dms);
21621
+ return typeof value === "function" ? value.bind(dms) : value;
21622
+ }
21623
+ });
21624
+ return wrappedDms;
21625
+ };
21626
+ return new Proxy(client, {
21627
+ get(target, prop) {
21628
+ switch (prop) {
21629
+ case "send":
21630
+ return (channel, text, options) => withStampedData(options, (opts) => target.send(channel, text, opts));
21631
+ case "reply":
21632
+ return (messageId, text, options) => withStampedData(options, (opts) => target.reply(messageId, text, opts));
21633
+ case "dm":
21634
+ return (to, text, options) => withStampedData(options, (opts) => target.dm(to, text, opts));
21635
+ case "dms":
21636
+ return dmsProxy();
21637
+ default: {
21638
+ const value = Reflect.get(target, prop, target);
21639
+ return typeof value === "function" ? value.bind(target) : value;
21640
+ }
21641
+ }
21642
+ }
21643
+ });
21481
21644
  }
21482
21645
  function createRealtimeClient(options) {
21483
21646
  return new WsClient({
@@ -21986,7 +22149,8 @@ function createEnrichedMessages(base, resolveFrom) {
21986
22149
  text,
21987
22150
  attachments: sendInput.attachments,
21988
22151
  mode: sendInput.mode,
21989
- idempotencyKey: sendInput.idempotencyKey
22152
+ idempotencyKey: sendInput.idempotencyKey,
22153
+ metadata: sendInput.metadata
21990
22154
  });
21991
22155
  }
21992
22156
  if (isChannelTarget(sendInput.to)) {
@@ -21996,7 +22160,8 @@ function createEnrichedMessages(base, resolveFrom) {
21996
22160
  blocks: sendInput.blocks,
21997
22161
  attachments: sendInput.attachments,
21998
22162
  mode: sendInput.mode,
21999
- idempotencyKey: sendInput.idempotencyKey
22163
+ idempotencyKey: sendInput.idempotencyKey,
22164
+ metadata: sendInput.metadata
22000
22165
  });
22001
22166
  }
22002
22167
  return messages.direct({
@@ -22004,7 +22169,8 @@ function createEnrichedMessages(base, resolveFrom) {
22004
22169
  text,
22005
22170
  attachments: sendInput.attachments,
22006
22171
  mode: sendInput.mode,
22007
- idempotencyKey: sendInput.idempotencyKey
22172
+ idempotencyKey: sendInput.idempotencyKey,
22173
+ metadata: sendInput.metadata
22008
22174
  });
22009
22175
  };
22010
22176
  enriched.reply = async (input) => {
@@ -22013,7 +22179,8 @@ function createEnrichedMessages(base, resolveFrom) {
22013
22179
  messageId: resolveMessageId(input.messageId ?? input.thread),
22014
22180
  text: input.text,
22015
22181
  blocks: input.blocks,
22016
- idempotencyKey: input.idempotencyKey
22182
+ idempotencyKey: input.idempotencyKey,
22183
+ metadata: input.metadata
22017
22184
  });
22018
22185
  };
22019
22186
  enriched.react = (async (arg1, arg2) => {
@@ -22031,7 +22198,8 @@ function createEnrichedMessages(base, resolveFrom) {
22031
22198
  text: input.text ?? input.msg ?? "",
22032
22199
  attachments: input.attachments,
22033
22200
  mode: input.mode,
22034
- idempotencyKey: input.idempotencyKey
22201
+ idempotencyKey: input.idempotencyKey,
22202
+ metadata: input.metadata
22035
22203
  });
22036
22204
  };
22037
22205
  return enriched;
@@ -24140,6 +24308,8 @@ function generateRequestId(prefix = "") {
24140
24308
  MessageReadPredicate,
24141
24309
  OBSERVABILITY_UNAVAILABLE,
24142
24310
  RELAYCAST_SDK_VERSION,
24311
+ RELAY_ATTEST_SESSION_ID_ENV,
24312
+ RELAY_OBSERVER_SCOPES,
24143
24313
  RELAY_SERVICE_FAILURE_MESSAGE,
24144
24314
  RelayCapabilityError,
24145
24315
  RelayError,
@@ -24172,6 +24342,7 @@ function generateRequestId(prefix = "") {
24172
24342
  createLogger,
24173
24343
  createNotifyHandler,
24174
24344
  createObserverEventSource,
24345
+ createObserverToken,
24175
24346
  createRealtimeClient,
24176
24347
  createRequestEnvelope,
24177
24348
  createRequestHandler,
@@ -24180,6 +24351,7 @@ function generateRequestId(prefix = "") {
24180
24351
  createWorkspace,
24181
24352
  createWorkspaceClient,
24182
24353
  createWorkspaceFacade,
24354
+ currentReplaySessionRef,
24183
24355
  defineHarness,
24184
24356
  findGitRoot,
24185
24357
  formatAgentHandle,
@@ -24204,6 +24376,7 @@ function generateRequestId(prefix = "") {
24204
24376
  isPlaceholderTargetFast,
24205
24377
  isSpawnOrReleaseCommandFast,
24206
24378
  isValidAgentName,
24379
+ listObserverTokens,
24207
24380
  logAndTraceError,
24208
24381
  logRelayHandlerError,
24209
24382
  mapModelToCli,
@@ -24234,10 +24407,13 @@ function generateRequestId(prefix = "") {
24234
24407
  printUpdateNotification,
24235
24408
  reduceAgentActivity,
24236
24409
  registerFacadeAction,
24410
+ replayMessageMetadata,
24237
24411
  resetPatternMetrics,
24238
24412
  resolveAgentName,
24239
24413
  resolveAgentToken,
24240
24414
  resolveCommand,
24415
+ resolveReplaySessionRef,
24416
+ revokeObserverToken,
24241
24417
  routerLog,
24242
24418
  safeRelayErrorMessage,
24243
24419
  stripAnsiFast,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "agent-relay",
3
- "version": "11.8.0",
3
+ "version": "11.8.2",
4
4
  "description": "Real-time agent-to-agent communication system",
5
5
  "type": "module",
6
6
  "main": "dist/index.cjs",
@@ -43,14 +43,14 @@
43
43
  "pack:validate": "npm pack --dry-run"
44
44
  },
45
45
  "dependencies": {
46
- "@agent-relay/cloud": "11.8.0",
47
- "@agent-relay/config": "11.8.0",
48
- "@agent-relay/fleet": "11.8.0",
49
- "@agent-relay/harness-driver": "11.8.0",
50
- "@agent-relay/harnesses": "11.8.0",
51
- "@agent-relay/sdk": "11.8.0",
52
- "@agent-relay/session": "11.8.0",
53
- "@agent-relay/utils": "11.8.0",
46
+ "@agent-relay/cloud": "11.8.2",
47
+ "@agent-relay/config": "11.8.2",
48
+ "@agent-relay/fleet": "11.8.2",
49
+ "@agent-relay/harness-driver": "11.8.2",
50
+ "@agent-relay/harnesses": "11.8.2",
51
+ "@agent-relay/sdk": "11.8.2",
52
+ "@agent-relay/session": "11.8.2",
53
+ "@agent-relay/utils": "11.8.2",
54
54
  "@modelcontextprotocol/sdk": "^1.23.0",
55
55
  "@relayfile/client": "^0.10.27",
56
56
  "@relayflows/cli": "1.0.1",