agent-relay 9.1.3 → 9.1.5

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/dist/index.cjs CHANGED
@@ -283,7 +283,7 @@ __export(index_exports, {
283
283
  module.exports = __toCommonJS(index_exports);
284
284
 
285
285
  // ../sdk/node_modules/@relaycast/sdk/dist/version.js
286
- var SDK_VERSION = "4.2.0";
286
+ var SDK_VERSION = "5.0.6";
287
287
 
288
288
  // ../sdk/node_modules/zod/v4/classic/external.js
289
289
  var external_exports = {};
@@ -14836,6 +14836,7 @@ var SetSystemPromptRequestSchema = external_exports.object({
14836
14836
  var ActivityItemSchema = external_exports.object({
14837
14837
  type: external_exports.enum(["message", "dm"]),
14838
14838
  id: external_exports.string(),
14839
+ channel_id: external_exports.string().optional(),
14839
14840
  channel_name: external_exports.string().optional(),
14840
14841
  conversation_id: external_exports.string().optional(),
14841
14842
  agent_name: external_exports.string(),
@@ -14849,6 +14850,7 @@ var WorkspaceDmConversationSchema = external_exports.object({
14849
14850
  participants: external_exports.array(external_exports.string()),
14850
14851
  last_message: external_exports.object({
14851
14852
  text: external_exports.string(),
14853
+ agent_id: external_exports.string(),
14852
14854
  agent_name: external_exports.string(),
14853
14855
  created_at: external_exports.string()
14854
14856
  }).nullable(),
@@ -14858,6 +14860,57 @@ var TokenRotateResponseSchema = external_exports.object({
14858
14860
  name: external_exports.string(),
14859
14861
  token: external_exports.string()
14860
14862
  });
14863
+ var OBSERVER_SCOPES = [
14864
+ "stream:read",
14865
+ "messages:read",
14866
+ "threads:read",
14867
+ "dms:read",
14868
+ "channels:read",
14869
+ "search:read",
14870
+ "agents:read",
14871
+ "nodes:read",
14872
+ "deliveries:read",
14873
+ "activity:read",
14874
+ "files:read",
14875
+ "reactions:read"
14876
+ ];
14877
+ var ObserverTokenFiltersSchema = external_exports.object({
14878
+ channel_ids: external_exports.array(external_exports.string()).optional(),
14879
+ channel_names: external_exports.array(external_exports.string()).optional(),
14880
+ include_dms: external_exports.boolean().optional(),
14881
+ dm_conversation_ids: external_exports.array(external_exports.string()).optional(),
14882
+ agent_ids: external_exports.array(external_exports.string()).optional(),
14883
+ event_types: external_exports.array(external_exports.string()).optional(),
14884
+ created_after: external_exports.string().optional()
14885
+ });
14886
+ var CreateObserverTokenRequestSchema = external_exports.object({
14887
+ name: external_exports.string(),
14888
+ description: external_exports.string().nullable().optional(),
14889
+ scopes: external_exports.array(external_exports.enum(OBSERVER_SCOPES)).min(1),
14890
+ filters: ObserverTokenFiltersSchema.optional(),
14891
+ expires_at: external_exports.string().nullable().optional()
14892
+ });
14893
+ var UpdateObserverTokenRequestSchema = external_exports.object({
14894
+ name: external_exports.string().optional(),
14895
+ description: external_exports.string().nullable().optional(),
14896
+ scopes: external_exports.array(external_exports.enum(OBSERVER_SCOPES)).min(1).optional(),
14897
+ filters: ObserverTokenFiltersSchema.optional(),
14898
+ expires_at: external_exports.string().nullable().optional()
14899
+ });
14900
+ var ObserverTokenSchema = external_exports.object({
14901
+ id: external_exports.string(),
14902
+ name: external_exports.string(),
14903
+ description: external_exports.string().nullable(),
14904
+ scopes: external_exports.array(external_exports.enum(OBSERVER_SCOPES)),
14905
+ filters: ObserverTokenFiltersSchema,
14906
+ status: external_exports.enum(["active", "revoked"]),
14907
+ expires_at: external_exports.string().nullable(),
14908
+ created_at: external_exports.string(),
14909
+ updated_at: external_exports.string().nullable(),
14910
+ revoked_at: external_exports.string().nullable(),
14911
+ last_used_at: external_exports.string().nullable(),
14912
+ token: external_exports.string().optional()
14913
+ });
14861
14914
 
14862
14915
  // ../sdk/node_modules/@relaycast/types/dist/agent.js
14863
14916
  var AgentTypeSchema = external_exports.enum(["agent", "human", "system"]);
@@ -14923,28 +14976,21 @@ var SpawnAgentRequestSchema = external_exports.object({
14923
14976
  model: external_exports.string().nullable().optional(),
14924
14977
  metadata: external_exports.record(external_exports.string(), external_exports.unknown()).optional()
14925
14978
  });
14926
- var SpawnAgentResponseSchema = external_exports.object({
14927
- id: external_exports.string(),
14928
- name: external_exports.string(),
14929
- token: external_exports.string(),
14930
- cli: CliTypeSchema,
14931
- task: external_exports.string(),
14932
- channel: external_exports.string().nullable(),
14933
- status: AgentStatusSchema,
14934
- created_at: external_exports.string(),
14935
- already_existed: external_exports.boolean()
14979
+ var LifecycleActionInvocationResponseSchema = external_exports.object({
14980
+ invocation_id: external_exports.string(),
14981
+ action_name: external_exports.string(),
14982
+ handler_agent_id: external_exports.string().nullable(),
14983
+ handler_node_id: external_exports.string().nullable(),
14984
+ dispatched_node_id: external_exports.string().nullable().optional(),
14985
+ input: external_exports.record(external_exports.string(), external_exports.unknown()),
14986
+ status: external_exports.string(),
14987
+ created_at: external_exports.string()
14936
14988
  });
14937
14989
  var ReleaseAgentRequestSchema = external_exports.object({
14938
14990
  name: external_exports.string(),
14939
14991
  reason: external_exports.string().nullable().optional(),
14940
14992
  delete_agent: external_exports.boolean().optional()
14941
14993
  });
14942
- var ReleaseAgentResponseSchema = external_exports.object({
14943
- name: external_exports.string(),
14944
- released: external_exports.boolean(),
14945
- deleted: external_exports.boolean(),
14946
- reason: external_exports.string().nullable()
14947
- });
14948
14994
 
14949
14995
  // ../sdk/node_modules/@relaycast/types/dist/channel.js
14950
14996
  var ChannelMemberInfoSchema = external_exports.object({
@@ -15211,6 +15257,13 @@ var DeliverySchema = external_exports.object({
15211
15257
  seq: external_exports.number(),
15212
15258
  location_type: external_exports.string(),
15213
15259
  location_node_id: external_exports.string().nullable(),
15260
+ route_node_id: external_exports.string().nullable(),
15261
+ route_node_kind: external_exports.string().nullable(),
15262
+ route_node_role: external_exports.string().nullable(),
15263
+ delivery_adapter: external_exports.string().nullable(),
15264
+ dispatch_attempts: external_exports.number(),
15265
+ next_attempt_at: external_exports.string().nullable(),
15266
+ last_dispatch_error: external_exports.string().nullable(),
15214
15267
  mode: external_exports.string(),
15215
15268
  reason: external_exports.string().nullable(),
15216
15269
  priority: external_exports.string(),
@@ -15409,23 +15462,6 @@ var AgentStatusChangedEventSchema = external_exports.object({
15409
15462
  agent: external_exports.object({ name: external_exports.string() }),
15410
15463
  status: external_exports.enum(["active", "idle", "blocked", "waiting", "offline"])
15411
15464
  });
15412
- var AgentSpawnRequestedEventSchema = external_exports.object({
15413
- type: external_exports.literal("agent.spawn_requested"),
15414
- agent: external_exports.object({
15415
- name: external_exports.string(),
15416
- cli: external_exports.string(),
15417
- task: external_exports.string(),
15418
- channel: external_exports.string().nullable(),
15419
- model: external_exports.string().nullable().optional(),
15420
- already_existed: external_exports.boolean()
15421
- })
15422
- });
15423
- var AgentReleaseRequestedEventSchema = external_exports.object({
15424
- type: external_exports.literal("agent.release_requested"),
15425
- agent: external_exports.object({ name: external_exports.string() }),
15426
- reason: external_exports.string().nullable(),
15427
- deleted: external_exports.boolean()
15428
- });
15429
15465
  var ChannelCreatedEventSchema = external_exports.object({
15430
15466
  type: external_exports.literal("channel.created"),
15431
15467
  channel: external_exports.object({ name: external_exports.string(), topic: external_exports.string().nullable() })
@@ -15489,21 +15525,14 @@ var WebhookReceivedEventSchema = external_exports.object({
15489
15525
  author: external_exports.string().nullable().optional()
15490
15526
  })
15491
15527
  });
15492
- var CommandInvokedEventSchema = external_exports.object({
15493
- type: external_exports.literal("command.invoked"),
15494
- command: external_exports.string(),
15495
- channel: external_exports.string(),
15496
- invoked_by: external_exports.string(),
15497
- handler_agent_id: external_exports.string(),
15498
- args: external_exports.string().nullable(),
15499
- parameters: external_exports.record(external_exports.string(), external_exports.unknown()).nullable()
15500
- });
15501
15528
  var ActionInvokedEventSchema = external_exports.object({
15502
15529
  type: external_exports.literal("action.invoked"),
15503
15530
  invocation_id: external_exports.string(),
15504
15531
  action_name: external_exports.string(),
15505
15532
  caller_name: external_exports.string(),
15506
- handler_agent_id: external_exports.string()
15533
+ handler_agent_id: external_exports.string(),
15534
+ handler_agent_name: external_exports.string().optional(),
15535
+ input: external_exports.unknown().optional()
15507
15536
  });
15508
15537
  var ActionCompletedEventSchema = external_exports.object({
15509
15538
  type: external_exports.literal("action.completed"),
@@ -15548,7 +15577,7 @@ var DeliveryDeferredEventSchema = external_exports.object({
15548
15577
  });
15549
15578
  var DeliveryFailedEventSchema = external_exports.object({
15550
15579
  type: external_exports.literal("delivery.failed"),
15551
- delivery_id: external_exports.string(),
15580
+ delivery_id: external_exports.string().nullable(),
15552
15581
  message_id: external_exports.string(),
15553
15582
  error: external_exports.string().nullable().optional(),
15554
15583
  retryable: external_exports.boolean().nullable().optional()
@@ -15588,8 +15617,6 @@ var ServerEventSchema = external_exports.discriminatedUnion("type", [
15588
15617
  AgentStatusWaitingEventSchema,
15589
15618
  AgentStatusOfflineEventSchema,
15590
15619
  AgentStatusChangedEventSchema,
15591
- AgentSpawnRequestedEventSchema,
15592
- AgentReleaseRequestedEventSchema,
15593
15620
  ChannelCreatedEventSchema,
15594
15621
  ChannelUpdatedEventSchema,
15595
15622
  ChannelArchivedEventSchema,
@@ -15600,7 +15627,6 @@ var ServerEventSchema = external_exports.discriminatedUnion("type", [
15600
15627
  MessageReadEventSchema,
15601
15628
  FileUploadedEventSchema,
15602
15629
  WebhookReceivedEventSchema,
15603
- CommandInvokedEventSchema,
15604
15630
  ActionInvokedEventSchema,
15605
15631
  ActionCompletedEventSchema,
15606
15632
  ActionFailedEventSchema,
@@ -15632,8 +15658,6 @@ var WsClientEventSchema = external_exports.discriminatedUnion("type", [
15632
15658
  AgentStatusWaitingEventSchema,
15633
15659
  AgentStatusOfflineEventSchema,
15634
15660
  AgentStatusChangedEventSchema,
15635
- AgentSpawnRequestedEventSchema,
15636
- AgentReleaseRequestedEventSchema,
15637
15661
  ChannelCreatedEventSchema,
15638
15662
  ChannelUpdatedEventSchema,
15639
15663
  ChannelArchivedEventSchema,
@@ -15644,7 +15668,6 @@ var WsClientEventSchema = external_exports.discriminatedUnion("type", [
15644
15668
  MessageReadEventSchema,
15645
15669
  FileUploadedEventSchema,
15646
15670
  WebhookReceivedEventSchema,
15647
- CommandInvokedEventSchema,
15648
15671
  ActionInvokedEventSchema,
15649
15672
  ActionCompletedEventSchema,
15650
15673
  ActionFailedEventSchema,
@@ -15760,7 +15783,6 @@ var SubscribableEventTypeSchema = external_exports.enum([
15760
15783
  "message.read",
15761
15784
  "file.uploaded",
15762
15785
  "webhook.received",
15763
- "command.invoked",
15764
15786
  "delivery.accepted",
15765
15787
  "delivery.delivered",
15766
15788
  "delivery.deferred",
@@ -15803,53 +15825,6 @@ var CreateSubscriptionResponseSchema = external_exports.object({
15803
15825
  created_at: external_exports.string()
15804
15826
  });
15805
15827
 
15806
- // ../sdk/node_modules/@relaycast/types/dist/command.js
15807
- var CommandParameterSchema = external_exports.object({
15808
- name: external_exports.string(),
15809
- description: external_exports.string().optional(),
15810
- type: external_exports.enum(["string", "number", "boolean"]),
15811
- required: external_exports.boolean().optional()
15812
- });
15813
- var AgentCommandSchema = external_exports.object({
15814
- id: external_exports.string(),
15815
- command: external_exports.string(),
15816
- description: external_exports.string(),
15817
- handler_agent: external_exports.string(),
15818
- parameters: external_exports.array(CommandParameterSchema),
15819
- created_at: external_exports.string(),
15820
- is_active: external_exports.boolean()
15821
- });
15822
- var CreateCommandRequestSchema = external_exports.object({
15823
- command: external_exports.string(),
15824
- description: external_exports.string(),
15825
- handler_agent: external_exports.string(),
15826
- parameters: external_exports.array(CommandParameterSchema).optional()
15827
- });
15828
- var CreateCommandResponseSchema = external_exports.object({
15829
- id: external_exports.string(),
15830
- command: external_exports.string(),
15831
- description: external_exports.string(),
15832
- handler_agent: external_exports.string(),
15833
- parameters: external_exports.array(CommandParameterSchema),
15834
- created_at: external_exports.string()
15835
- });
15836
- var InvokeCommandRequestSchema = external_exports.object({
15837
- channel: external_exports.string(),
15838
- args: external_exports.string().optional(),
15839
- parameters: external_exports.record(external_exports.string(), external_exports.unknown()).optional()
15840
- });
15841
- var CommandInvocationSchema = external_exports.object({
15842
- id: external_exports.string(),
15843
- command: external_exports.string(),
15844
- channel: external_exports.string(),
15845
- invoked_by: external_exports.string(),
15846
- handler_agent_id: external_exports.string(),
15847
- args: external_exports.string().nullable(),
15848
- parameters: external_exports.record(external_exports.string(), external_exports.unknown()).nullable(),
15849
- message_id: external_exports.string(),
15850
- created_at: external_exports.string()
15851
- });
15852
-
15853
15828
  // ../sdk/node_modules/@relaycast/types/dist/telemetry.js
15854
15829
  var TELEMETRY_MAX_PROPERTIES = 64;
15855
15830
  var TELEMETRY_VALUE_MAX_LENGTH = 512;
@@ -15883,8 +15858,6 @@ var SERVER_TELEMETRY_EVENTS = [
15883
15858
  "relaycast_server_agent_registered",
15884
15859
  "relaycast_server_agent_updated",
15885
15860
  "relaycast_server_agent_deleted",
15886
- "relaycast_server_agent_spawn_requested",
15887
- "relaycast_server_agent_release_requested",
15888
15861
  "relaycast_server_agent_token_rotated",
15889
15862
  "relaycast_server_channel_created",
15890
15863
  "relaycast_server_channel_updated",
@@ -16097,6 +16070,8 @@ var FleetErrorMessageSchema = external_exports.object({
16097
16070
  var FleetDeliverMessageSchema = external_exports.object({
16098
16071
  ...FleetWireEnvelopeFields,
16099
16072
  type: external_exports.literal("deliver"),
16073
+ delivery_id: external_exports.string(),
16074
+ agent_id: external_exports.string(),
16100
16075
  agent: external_exports.string(),
16101
16076
  msg_id: external_exports.string(),
16102
16077
  seq: external_exports.number().int().nonnegative(),
@@ -16108,8 +16083,19 @@ var FleetActionInvokeMessageSchema = external_exports.object({
16108
16083
  type: external_exports.literal("action.invoke"),
16109
16084
  invocation_id: external_exports.string(),
16110
16085
  action: external_exports.string(),
16086
+ agent_id: external_exports.string().optional(),
16087
+ agent_name: external_exports.string().optional(),
16111
16088
  input: FleetWireJsonValueSchema
16112
16089
  }).strict();
16090
+ var FleetContextUpdateMessageSchema = external_exports.object({
16091
+ ...FleetWireEnvelopeFields,
16092
+ type: external_exports.literal("context.update"),
16093
+ topic: external_exports.enum(["presence", "channel", "thread", "agent"]),
16094
+ event: external_exports.string(),
16095
+ channel_id: external_exports.string().nullable().optional(),
16096
+ agent_ids: external_exports.array(external_exports.string()).optional(),
16097
+ data: FleetWireJsonValueSchema
16098
+ }).strict();
16113
16099
  var FleetPingMessageSchema = external_exports.object({
16114
16100
  ...FleetWireEnvelopeFields,
16115
16101
  type: external_exports.literal("ping")
@@ -16130,6 +16116,7 @@ var FleetBrokerToRelaycastMessageSchema = external_exports.union([
16130
16116
  var FleetRelaycastToBrokerMessageSchema = external_exports.discriminatedUnion("type", [
16131
16117
  FleetDeliverMessageSchema,
16132
16118
  FleetActionInvokeMessageSchema,
16119
+ FleetContextUpdateMessageSchema,
16133
16120
  FleetPingMessageSchema,
16134
16121
  FleetReplyMessageSchema,
16135
16122
  FleetErrorMessageSchema
@@ -16211,12 +16198,64 @@ function decamelizeKey(key) {
16211
16198
  return toSnakeKey(key);
16212
16199
  }
16213
16200
 
16201
+ // ../sdk/node_modules/@relaycast/sdk/dist/event-id.js
16202
+ function hashStringParts(parts) {
16203
+ const input = JSON.stringify(parts);
16204
+ let h1 = 3735928559;
16205
+ let h2 = 1103547991;
16206
+ let h3 = 3235826430;
16207
+ let h4 = 2654435769;
16208
+ for (let i = 0; i < input.length; i += 1) {
16209
+ const code = input.charCodeAt(i);
16210
+ h1 = Math.imul(h1 ^ code, 2654435761);
16211
+ h2 = Math.imul(h2 ^ code, 1597334677);
16212
+ h3 = Math.imul(h3 ^ code, 2246822507);
16213
+ h4 = Math.imul(h4 ^ code, 3266489909);
16214
+ }
16215
+ h1 = Math.imul(h1 ^ h1 >>> 16, 2246822507) ^ Math.imul(h2 ^ h2 >>> 13, 3266489909);
16216
+ h2 = Math.imul(h2 ^ h2 >>> 16, 2246822507) ^ Math.imul(h3 ^ h3 >>> 13, 3266489909);
16217
+ h3 = Math.imul(h3 ^ h3 >>> 16, 2246822507) ^ Math.imul(h4 ^ h4 >>> 13, 3266489909);
16218
+ h4 = Math.imul(h4 ^ h4 >>> 16, 2246822507) ^ Math.imul(h1 ^ h1 >>> 13, 3266489909);
16219
+ return [h1 >>> 0, h2 >>> 0, h3 >>> 0, h4 >>> 0];
16220
+ }
16221
+ function formatUuidFromWords(words) {
16222
+ const bytes = new Uint8Array(16);
16223
+ for (let i = 0; i < words.length; i += 1) {
16224
+ const word = words[i];
16225
+ const offset = i * 4;
16226
+ bytes[offset] = word >>> 24 & 255;
16227
+ bytes[offset + 1] = word >>> 16 & 255;
16228
+ bytes[offset + 2] = word >>> 8 & 255;
16229
+ bytes[offset + 3] = word & 255;
16230
+ }
16231
+ bytes[6] = bytes[6] & 15 | 80;
16232
+ bytes[8] = bytes[8] & 63 | 128;
16233
+ const hex3 = [...bytes].map((byte) => byte.toString(16).padStart(2, "0")).join("");
16234
+ return [
16235
+ hex3.slice(0, 8),
16236
+ hex3.slice(8, 12),
16237
+ hex3.slice(12, 16),
16238
+ hex3.slice(16, 20),
16239
+ hex3.slice(20, 32)
16240
+ ].join("-");
16241
+ }
16242
+ function stableRelaycastEventId(...parts) {
16243
+ const normalized = parts.map((part) => part?.trim()).filter((part) => typeof part === "string" && part.length > 0);
16244
+ if (normalized.length === 0) {
16245
+ return formatUuidFromWords(hashStringParts(["relaycast", "empty-event"]));
16246
+ }
16247
+ return formatUuidFromWords(hashStringParts(["relaycast", ...normalized]));
16248
+ }
16249
+
16214
16250
  // ../sdk/node_modules/@relaycast/sdk/dist/ws.js
16215
16251
  var SEEN_EVENT_IDS_MAX = 2048;
16216
16252
  var INTERNAL_WS_ORIGIN = /* @__PURE__ */ Symbol("relaycast.internal.ws-origin");
16217
16253
  function readInternalWsOrigin(options) {
16218
16254
  return options[INTERNAL_WS_ORIGIN];
16219
16255
  }
16256
+ function isRecord(value) {
16257
+ return value !== null && typeof value === "object" && !Array.isArray(value);
16258
+ }
16220
16259
  function withInternalWsOrigin(options, origin) {
16221
16260
  const copy = { ...options };
16222
16261
  Object.defineProperty(copy, INTERNAL_WS_ORIGIN, {
@@ -16230,7 +16269,13 @@ function withInternalWsOrigin(options, origin) {
16230
16269
  var WsClient = class {
16231
16270
  token;
16232
16271
  baseUrl;
16272
+ path;
16273
+ nodeRegistration;
16274
+ autoAckDeliveries;
16275
+ nodeMode;
16276
+ lastNodeRegistration = null;
16233
16277
  ws = null;
16278
+ connecting = false;
16234
16279
  handlers = /* @__PURE__ */ new Map();
16235
16280
  isOpen = false;
16236
16281
  reconnectAttempt = 0;
@@ -16259,6 +16304,10 @@ var WsClient = class {
16259
16304
  constructor(options) {
16260
16305
  const origin = readInternalWsOrigin(options) ?? SDK_ORIGIN;
16261
16306
  this.token = options.token;
16307
+ this.path = options.path ?? "/v1/ws";
16308
+ this.nodeRegistration = options.nodeRegistration;
16309
+ this.autoAckDeliveries = options.autoAckDeliveries ?? false;
16310
+ this.nodeMode = this.path === "/v1/node/ws" || !!options.nodeRegistration;
16262
16311
  this.debug = options.debug ?? false;
16263
16312
  this.maxReconnectAttempts = Number.isFinite(options.maxReconnectAttempts) ? Math.max(0, Math.floor(options.maxReconnectAttempts)) : Number.POSITIVE_INFINITY;
16264
16313
  this.reconnectJitter = options.reconnectJitter ?? true;
@@ -16273,12 +16322,30 @@ var WsClient = class {
16273
16322
  this.agentRelayDistinctId = sanitizeAgentRelayDistinctId(origin.agentRelayDistinctId ?? options.agentRelayDistinctId);
16274
16323
  }
16275
16324
  connect() {
16276
- if (this.ws)
16325
+ if (this.ws || this.connecting)
16277
16326
  return;
16278
16327
  this.closed = false;
16279
16328
  this.permanentlyDisconnected = false;
16280
- const wsUrl = new URL("/v1/ws", `${this.baseUrl}/`);
16281
- wsUrl.searchParams.set("token", this.token);
16329
+ this.connecting = true;
16330
+ void this.openSocket().catch((err) => {
16331
+ this.connecting = false;
16332
+ if (this.closed)
16333
+ return;
16334
+ if (this.debug) {
16335
+ console.warn("[relaycast] Failed to open WebSocket:", err);
16336
+ }
16337
+ this.emit("error", { type: "error" });
16338
+ this.scheduleReconnect();
16339
+ });
16340
+ }
16341
+ async openSocket() {
16342
+ const token = typeof this.token === "function" ? await this.token() : this.token;
16343
+ if (this.closed) {
16344
+ this.connecting = false;
16345
+ return;
16346
+ }
16347
+ const wsUrl = new URL(this.path, `${this.baseUrl}/`);
16348
+ wsUrl.searchParams.set("token", token);
16282
16349
  wsUrl.searchParams.set(decamelizeKey("originClient"), this.originClient);
16283
16350
  wsUrl.searchParams.set(decamelizeKey("originVersion"), this.originVersion);
16284
16351
  if (this.originActor) {
@@ -16289,6 +16356,7 @@ var WsClient = class {
16289
16356
  }
16290
16357
  const ws = new WebSocket(wsUrl.toString());
16291
16358
  this.ws = ws;
16359
+ this.connecting = false;
16292
16360
  this.connectTimer = setTimeout(() => {
16293
16361
  if (this.ws !== ws || this.isOpen || this.closed)
16294
16362
  return;
@@ -16303,20 +16371,27 @@ var WsClient = class {
16303
16371
  ws.onopen = () => {
16304
16372
  if (this.ws !== ws)
16305
16373
  return;
16306
- this.clearConnectTimer();
16307
- this.isOpen = true;
16308
- this.reconnectAttempt = 0;
16309
- this.permanentlyDisconnected = false;
16310
- this.startPing();
16311
- const openEvent = { type: "open" };
16312
- this.emit("open", openEvent);
16313
- this.sendResync();
16374
+ void this.handleOpen(ws).catch((err) => {
16375
+ if (this.ws !== ws || this.closed)
16376
+ return;
16377
+ if (this.debug) {
16378
+ console.warn("[relaycast] WebSocket open handler failed:", err);
16379
+ }
16380
+ this.emit("error", { type: "error" });
16381
+ try {
16382
+ ws.close();
16383
+ } catch {
16384
+ }
16385
+ });
16314
16386
  };
16315
16387
  ws.onmessage = (event) => {
16316
16388
  if (this.ws !== ws)
16317
16389
  return;
16318
16390
  try {
16319
16391
  const parsed = JSON.parse(String(event.data));
16392
+ if (this.nodeMode && this.handleNodeMessage(parsed)) {
16393
+ return;
16394
+ }
16320
16395
  if (parsed !== null && typeof parsed === "object") {
16321
16396
  if (typeof parsed.agent_seq === "number" && Number.isFinite(parsed.agent_seq)) {
16322
16397
  this.lastSeenSeq = parsed.agent_seq;
@@ -16377,9 +16452,29 @@ var WsClient = class {
16377
16452
  }
16378
16453
  };
16379
16454
  }
16455
+ async handleOpen(ws) {
16456
+ if (this.ws !== ws)
16457
+ return;
16458
+ this.clearConnectTimer();
16459
+ this.isOpen = true;
16460
+ this.reconnectAttempt = 0;
16461
+ this.permanentlyDisconnected = false;
16462
+ if (this.nodeRegistration) {
16463
+ const registration = await this.nodeRegistration();
16464
+ if (this.ws !== ws || this.closed)
16465
+ return;
16466
+ this.lastNodeRegistration = registration;
16467
+ this.sendJson(registration);
16468
+ }
16469
+ this.startPing();
16470
+ const openEvent = { type: "open" };
16471
+ this.emit("open", openEvent);
16472
+ this.sendResync();
16473
+ }
16380
16474
  disconnect() {
16381
16475
  this.closed = true;
16382
16476
  this.isOpen = false;
16477
+ this.connecting = false;
16383
16478
  this.permanentlyDisconnected = false;
16384
16479
  this.clearConnectTimer();
16385
16480
  this.stopPing();
@@ -16399,6 +16494,7 @@ var WsClient = class {
16399
16494
  reconnect() {
16400
16495
  this.closed = false;
16401
16496
  this.isOpen = false;
16497
+ this.connecting = false;
16402
16498
  this.permanentlyDisconnected = false;
16403
16499
  this.reconnectAttempt = 0;
16404
16500
  this.clearConnectTimer();
@@ -16421,9 +16517,13 @@ var WsClient = class {
16421
16517
  this.connect();
16422
16518
  }
16423
16519
  subscribe(channels) {
16520
+ if (this.nodeMode)
16521
+ return;
16424
16522
  this.sendJson({ type: "subscribe", channels });
16425
16523
  }
16426
16524
  unsubscribe(channels) {
16525
+ if (this.nodeMode)
16526
+ return;
16427
16527
  this.sendJson({ type: "unsubscribe", channels });
16428
16528
  }
16429
16529
  on(event, handler) {
@@ -16452,6 +16552,135 @@ var WsClient = class {
16452
16552
  this.handlers.get(event)?.forEach((h) => h(data));
16453
16553
  this.handlers.get("*")?.forEach((h) => h(data));
16454
16554
  }
16555
+ handleNodeMessage(parsed) {
16556
+ if (!isRecord(parsed) || typeof parsed.type !== "string")
16557
+ return false;
16558
+ if (parsed.type === "deliver") {
16559
+ const payload = isRecord(parsed.payload) ? parsed.payload : null;
16560
+ if (payload && typeof payload.type === "string") {
16561
+ const data = isRecord(payload.data) ? payload.data : {};
16562
+ this.emitServerLikeEvent(payload.type, data);
16563
+ }
16564
+ if (this.autoAckDeliveries && typeof parsed.agent === "string" && typeof parsed.seq === "number" && Number.isFinite(parsed.seq)) {
16565
+ this.sendJson({
16566
+ v: 1,
16567
+ type: "delivery.ack",
16568
+ agent: parsed.agent,
16569
+ up_to_seq: parsed.seq
16570
+ });
16571
+ }
16572
+ return true;
16573
+ }
16574
+ if (parsed.type === "context.update") {
16575
+ const eventType = typeof parsed.event === "string" ? parsed.event : null;
16576
+ if (eventType) {
16577
+ this.emitServerLikeEvent(eventType, isRecord(parsed.data) ? parsed.data : {});
16578
+ }
16579
+ return true;
16580
+ }
16581
+ if (parsed.type === "action.invoke") {
16582
+ this.emitServerLikeEvent("action.invoked", {
16583
+ invocation_id: typeof parsed.invocation_id === "string" ? parsed.invocation_id : "",
16584
+ action_name: typeof parsed.action === "string" ? parsed.action : "",
16585
+ caller_name: "node",
16586
+ handler_agent_id: typeof parsed.agent_id === "string" ? parsed.agent_id : "",
16587
+ handler_agent_name: typeof parsed.agent_name === "string" ? parsed.agent_name : void 0,
16588
+ input: isRecord(parsed.input) ? parsed.input : {}
16589
+ });
16590
+ return true;
16591
+ }
16592
+ return parsed.type === "reply" || parsed.type === "error" || parsed.type === "pong" || parsed.type === "resync_ack";
16593
+ }
16594
+ emitServerLikeEvent(eventType, data) {
16595
+ const transformed = this.transformServerLikeEvent(eventType, data);
16596
+ if (typeof transformed.id === "string" && transformed.id.length > 0 && typeof transformed.type === "string") {
16597
+ const dedupeKey = `${transformed.type}:${transformed.id}`;
16598
+ if (this.seenEventIds.has(dedupeKey))
16599
+ return;
16600
+ this.rememberEventId(dedupeKey);
16601
+ }
16602
+ const result = ServerEventSchema.safeParse(transformed);
16603
+ if (result.success) {
16604
+ this.emit(result.data.type, camelizeKeys(result.data));
16605
+ return;
16606
+ }
16607
+ if (typeof transformed.type === "string") {
16608
+ this.emit(transformed.type, camelizeKeys(transformed));
16609
+ } else if (this.debug) {
16610
+ console.warn('[relaycast] Dropped node event: missing or invalid "type" field', transformed);
16611
+ }
16612
+ }
16613
+ transformServerLikeEvent(eventType, data) {
16614
+ switch (eventType) {
16615
+ case "message.created":
16616
+ return {
16617
+ id: stableRelaycastEventId(String(data.id ?? "")),
16618
+ type: "message.created",
16619
+ channel: data.channel_name,
16620
+ message: {
16621
+ id: data.id,
16622
+ agent_id: data.agent_id,
16623
+ agent_name: data.from_name,
16624
+ text: data.text,
16625
+ attachments: Array.isArray(data.attachments) ? data.attachments : [],
16626
+ ...typeof data.injection_mode === "string" ? { injection_mode: data.injection_mode } : {}
16627
+ }
16628
+ };
16629
+ case "thread.reply":
16630
+ return {
16631
+ id: stableRelaycastEventId(String(data.id ?? "")),
16632
+ type: "thread.reply",
16633
+ channel: data.channel_name,
16634
+ parent_id: data.thread_id,
16635
+ message: {
16636
+ id: data.id,
16637
+ agent_id: data.agent_id,
16638
+ agent_name: data.from_name,
16639
+ text: data.text
16640
+ }
16641
+ };
16642
+ case "message.updated":
16643
+ return {
16644
+ type: "message.updated",
16645
+ channel: data.channel_name,
16646
+ message: {
16647
+ id: data.id,
16648
+ agent_id: data.agent_id,
16649
+ agent_name: data.from_name,
16650
+ text: data.text
16651
+ }
16652
+ };
16653
+ case "message.reacted":
16654
+ return {
16655
+ type: "message.reacted",
16656
+ message_id: data.message_id,
16657
+ emoji: data.emoji,
16658
+ agent_name: data.agent_name,
16659
+ action: data.action ?? "added"
16660
+ };
16661
+ case "dm.received":
16662
+ case "group_dm.received": {
16663
+ const message = isRecord(data.message) ? data.message : {};
16664
+ const attachments = Array.isArray(message.attachments) ? message.attachments : Array.isArray(data.attachments) ? data.attachments : [];
16665
+ const messageId = String(message.id ?? data.id ?? "");
16666
+ return {
16667
+ id: stableRelaycastEventId(messageId),
16668
+ type: eventType,
16669
+ conversation_id: data.conversation_id,
16670
+ message: {
16671
+ id: message.id ?? data.id,
16672
+ agent_id: message.agent_id ?? data.from_agent_id ?? data.agent_id,
16673
+ agent_name: message.agent_name ?? data.from_name,
16674
+ text: message.text ?? data.text,
16675
+ ...message.injection_mode ?? data.injection_mode ? { injection_mode: message.injection_mode ?? data.injection_mode } : {},
16676
+ ...attachments.length ? { attachments } : {}
16677
+ }
16678
+ };
16679
+ }
16680
+ default:
16681
+ return { type: eventType, ...data };
16682
+ }
16683
+ }
16455
16684
  sendJson(data) {
16456
16685
  if (this.ws && this.ws.readyState === WebSocket.OPEN) {
16457
16686
  this.ws.send(JSON.stringify(data));
@@ -16464,6 +16693,8 @@ var WsClient = class {
16464
16693
  * No-op until at least one seq-stamped event has been received.
16465
16694
  */
16466
16695
  sendResync() {
16696
+ if (this.nodeMode)
16697
+ return;
16467
16698
  if (this.lastSeenSeq === null)
16468
16699
  return;
16469
16700
  this.sendJson({
@@ -16483,6 +16714,18 @@ var WsClient = class {
16483
16714
  startPing() {
16484
16715
  this.stopPing();
16485
16716
  this.pingTimer = setInterval(() => {
16717
+ if (this.nodeMode) {
16718
+ const nodeId = typeof this.lastNodeRegistration?.node_id === "string" ? this.lastNodeRegistration.node_id : void 0;
16719
+ this.sendJson({
16720
+ v: 1,
16721
+ type: "node.heartbeat",
16722
+ ...nodeId ? { node_id: nodeId } : {},
16723
+ load: 0,
16724
+ active_agents: 1,
16725
+ handlers_live: false
16726
+ });
16727
+ return;
16728
+ }
16486
16729
  this.sendJson({ type: "ping" });
16487
16730
  }, 3e4);
16488
16731
  }
@@ -16537,55 +16780,6 @@ var WsClient = class {
16537
16780
  }
16538
16781
  };
16539
16782
 
16540
- // ../sdk/node_modules/@relaycast/sdk/dist/event-id.js
16541
- function hashStringParts(parts) {
16542
- const input = JSON.stringify(parts);
16543
- let h1 = 3735928559;
16544
- let h2 = 1103547991;
16545
- let h3 = 3235826430;
16546
- let h4 = 2654435769;
16547
- for (let i = 0; i < input.length; i += 1) {
16548
- const code = input.charCodeAt(i);
16549
- h1 = Math.imul(h1 ^ code, 2654435761);
16550
- h2 = Math.imul(h2 ^ code, 1597334677);
16551
- h3 = Math.imul(h3 ^ code, 2246822507);
16552
- h4 = Math.imul(h4 ^ code, 3266489909);
16553
- }
16554
- h1 = Math.imul(h1 ^ h1 >>> 16, 2246822507) ^ Math.imul(h2 ^ h2 >>> 13, 3266489909);
16555
- h2 = Math.imul(h2 ^ h2 >>> 16, 2246822507) ^ Math.imul(h3 ^ h3 >>> 13, 3266489909);
16556
- h3 = Math.imul(h3 ^ h3 >>> 16, 2246822507) ^ Math.imul(h4 ^ h4 >>> 13, 3266489909);
16557
- h4 = Math.imul(h4 ^ h4 >>> 16, 2246822507) ^ Math.imul(h1 ^ h1 >>> 13, 3266489909);
16558
- return [h1 >>> 0, h2 >>> 0, h3 >>> 0, h4 >>> 0];
16559
- }
16560
- function formatUuidFromWords(words) {
16561
- const bytes = new Uint8Array(16);
16562
- for (let i = 0; i < words.length; i += 1) {
16563
- const word = words[i];
16564
- const offset = i * 4;
16565
- bytes[offset] = word >>> 24 & 255;
16566
- bytes[offset + 1] = word >>> 16 & 255;
16567
- bytes[offset + 2] = word >>> 8 & 255;
16568
- bytes[offset + 3] = word & 255;
16569
- }
16570
- bytes[6] = bytes[6] & 15 | 80;
16571
- bytes[8] = bytes[8] & 63 | 128;
16572
- const hex3 = [...bytes].map((byte) => byte.toString(16).padStart(2, "0")).join("");
16573
- return [
16574
- hex3.slice(0, 8),
16575
- hex3.slice(8, 12),
16576
- hex3.slice(12, 16),
16577
- hex3.slice(16, 20),
16578
- hex3.slice(20, 32)
16579
- ].join("-");
16580
- }
16581
- function stableRelaycastEventId(...parts) {
16582
- const normalized = parts.map((part) => part?.trim()).filter((part) => typeof part === "string" && part.length > 0);
16583
- if (normalized.length === 0) {
16584
- return formatUuidFromWords(hashStringParts(["relaycast", "empty-event"]));
16585
- }
16586
- return formatUuidFromWords(hashStringParts(["relaycast", ...normalized]));
16587
- }
16588
-
16589
16783
  // ../sdk/node_modules/@relaycast/sdk/dist/agent.js
16590
16784
  function stripHash(channel) {
16591
16785
  return channel.startsWith("#") ? channel.slice(1) : channel;
@@ -16636,6 +16830,7 @@ var AgentClient = class {
16636
16830
  autoHeartbeatTimer = null;
16637
16831
  pendingHeartbeat = null;
16638
16832
  wsOptions;
16833
+ directNodeToken = null;
16639
16834
  manualSubscriptions = /* @__PURE__ */ new Set();
16640
16835
  managedSubscriptions = /* @__PURE__ */ new Map();
16641
16836
  activeWsChannels = /* @__PURE__ */ new Set();
@@ -16679,14 +16874,38 @@ var AgentClient = class {
16679
16874
  this.autoHeartbeatTimer = null;
16680
16875
  }
16681
16876
  }
16877
+ async fetchDirectNodeToken() {
16878
+ const token = await this.client.post("/v1/agent/node-token", {});
16879
+ this.directNodeToken = token;
16880
+ return token.token;
16881
+ }
16882
+ directNodeRegistration() {
16883
+ if (!this.directNodeToken) {
16884
+ throw new Error("Direct node token has not been initialized");
16885
+ }
16886
+ return {
16887
+ v: 1,
16888
+ id: `sdk-direct-${Date.now()}`,
16889
+ type: "node.register",
16890
+ node_id: this.directNodeToken.nodeId,
16891
+ name: this.directNodeToken.nodeName,
16892
+ capabilities: [],
16893
+ max_agents: 1,
16894
+ tags: ["implicit", "direct", "sdk"],
16895
+ version: `sdk-typescript/${SDK_VERSION}`
16896
+ };
16897
+ }
16682
16898
  // === WebSocket ===
16683
16899
  connect() {
16684
16900
  if (this.ws)
16685
16901
  return;
16686
16902
  this.ws = new WsClient(withInternalWsOrigin({
16687
- token: this.client.apiKey,
16903
+ ...this.wsOptions,
16904
+ token: () => this.fetchDirectNodeToken(),
16688
16905
  baseUrl: this.client.baseUrl,
16689
- ...this.wsOptions
16906
+ path: "/v1/node/ws",
16907
+ nodeRegistration: () => this.directNodeRegistration(),
16908
+ autoAckDeliveries: true
16690
16909
  }, {
16691
16910
  client: this.client.originClient,
16692
16911
  version: this.client.originVersion,
@@ -17732,17 +17951,15 @@ var RelayCast = class _RelayCast {
17732
17951
  info: () => this.client.get("/v1/workspace"),
17733
17952
  reconnect: (data, options) => this.reconnect(data, options),
17734
17953
  update: (data) => this.client.patch("/v1/workspace", data),
17735
- delete: () => this.client.delete("/v1/workspace"),
17736
- stream: {
17737
- get: () => this.client.get("/v1/workspace/stream"),
17738
- set: (enabled) => this.client.put("/v1/workspace/stream", { enabled }),
17739
- inherit: () => this.client.put("/v1/workspace/stream", { mode: "inherit" })
17740
- },
17741
- fleetNodes: {
17742
- get: () => this.client.get("/v1/workspace/fleet-nodes"),
17743
- set: (enabled) => this.client.put("/v1/workspace/fleet-nodes", { enabled }),
17744
- inherit: () => this.client.put("/v1/workspace/fleet-nodes", { mode: "inherit" })
17745
- }
17954
+ delete: () => this.client.delete("/v1/workspace")
17955
+ };
17956
+ observerTokens = {
17957
+ create: (data) => this.client.post("/v1/observer-tokens", data),
17958
+ list: () => this.client.get("/v1/observer-tokens"),
17959
+ get: (id) => this.client.get(`/v1/observer-tokens/${encodeURIComponent(id)}`),
17960
+ update: (id, data) => this.client.patch(`/v1/observer-tokens/${encodeURIComponent(id)}`, data),
17961
+ rotate: (id) => this.client.post(`/v1/observer-tokens/${encodeURIComponent(id)}/rotate`, {}),
17962
+ revoke: (id) => this.client.delete(`/v1/observer-tokens/${encodeURIComponent(id)}`)
17746
17963
  };
17747
17964
  systemPrompt = {
17748
17965
  get: () => this.client.get("/v1/workspace/system-prompt"),
@@ -17845,6 +18062,7 @@ var RelayCast = class _RelayCast {
17845
18062
  delete: (name) => this.client.delete(`/v1/actions/${encodeURIComponent(name)}`)
17846
18063
  };
17847
18064
  nodes = {
18065
+ create: (data) => this.client.post("/v1/nodes", data),
17848
18066
  list: (query) => {
17849
18067
  const params = {};
17850
18068
  if (query?.capability)
@@ -17853,7 +18071,10 @@ var RelayCast = class _RelayCast {
17853
18071
  params.name = query.name;
17854
18072
  return this.client.get("/v1/nodes", params);
17855
18073
  },
17856
- get: (name) => this.client.get(`/v1/nodes/${encodeURIComponent(name)}`)
18074
+ get: (name) => this.client.get(`/v1/nodes/${encodeURIComponent(name)}`),
18075
+ listAgents: (name) => this.client.get(`/v1/nodes/${encodeURIComponent(name)}/agents`),
18076
+ bindAgent: (name, data) => this.client.post(`/v1/nodes/${encodeURIComponent(name)}/agents`, data),
18077
+ unbindAgent: (name, agentName) => this.client.delete(`/v1/nodes/${encodeURIComponent(name)}/agents/${encodeURIComponent(agentName)}`)
17857
18078
  };
17858
18079
  triggers = {
17859
18080
  create: (data) => this.client.post("/v1/triggers", data),
@@ -18536,7 +18757,7 @@ function relaycastWorkspaceTelemetryOptions(explicit = {}, env = defaultEnv()) {
18536
18757
  }
18537
18758
 
18538
18759
  // ../sdk/dist/messaging/normalize.js
18539
- function isRecord(value) {
18760
+ function isRecord2(value) {
18540
18761
  return value !== null && typeof value === "object" && !Array.isArray(value);
18541
18762
  }
18542
18763
  function readValue(record2, ...keys) {
@@ -18574,7 +18795,7 @@ function readArray(record2, ...keys) {
18574
18795
  }
18575
18796
  function readRecord(record2, ...keys) {
18576
18797
  const value = readValue(record2, ...keys);
18577
- return isRecord(value) ? { ...value } : void 0;
18798
+ return isRecord2(value) ? { ...value } : void 0;
18578
18799
  }
18579
18800
  function normalizeOptionalChannelName(value) {
18580
18801
  if (!value)
@@ -18602,13 +18823,13 @@ function normalizeMode(value) {
18602
18823
  return value === "wait" || value === "steer" ? value : void 0;
18603
18824
  }
18604
18825
  function normalizeBlocks(value) {
18605
- return Array.isArray(value) ? value.filter(isRecord).map((block) => ({ ...block })) : [];
18826
+ return Array.isArray(value) ? value.filter(isRecord2).map((block) => ({ ...block })) : [];
18606
18827
  }
18607
18828
  function normalizeStringArray(value) {
18608
18829
  return Array.isArray(value) ? value.filter((item) => typeof item === "string") : [];
18609
18830
  }
18610
18831
  function normalizeAgentChannel(input) {
18611
- const record2 = isRecord(input) ? input : {};
18832
+ const record2 = isRecord2(input) ? input : {};
18612
18833
  const name = normalizeOptionalChannelName(readString(record2, "name", "channelName", "channel_name")) ?? "";
18613
18834
  return {
18614
18835
  id: readString(record2, "id", "channelId", "channel_id") ?? name,
@@ -18618,7 +18839,7 @@ function normalizeAgentChannel(input) {
18618
18839
  };
18619
18840
  }
18620
18841
  function normalizeAgent(input) {
18621
- const record2 = isRecord(input) ? input : {};
18842
+ const record2 = isRecord2(input) ? input : {};
18622
18843
  const id = readString(record2, "id", "agentId", "agent_id") ?? readString(record2, "name", "agentName", "agent_name") ?? "";
18623
18844
  const name = readString(record2, "name", "agentName", "agent_name") ?? id;
18624
18845
  const lastSeenAt = readString(record2, "lastSeenAt", "last_seen", "lastSeen");
@@ -18637,7 +18858,7 @@ function normalizeAgent(input) {
18637
18858
  };
18638
18859
  }
18639
18860
  function normalizeAgentRegistration(input) {
18640
- const record2 = isRecord(input) ? input : {};
18861
+ const record2 = isRecord2(input) ? input : {};
18641
18862
  const id = readString(record2, "id", "agentId", "agent_id") ?? readString(record2, "name") ?? "";
18642
18863
  const name = readString(record2, "name", "agentName", "agent_name") ?? id;
18643
18864
  const createdAt = readString(record2, "createdAt", "created_at");
@@ -18650,7 +18871,7 @@ function normalizeAgentRegistration(input) {
18650
18871
  };
18651
18872
  }
18652
18873
  function normalizeAgentPresence(input) {
18653
- const record2 = isRecord(input) ? input : {};
18874
+ const record2 = isRecord2(input) ? input : {};
18654
18875
  const agentId = readString(record2, "agentId", "agent_id", "id") ?? "";
18655
18876
  const agentName = readString(record2, "agentName", "agent_name", "name") ?? agentId;
18656
18877
  return {
@@ -18660,7 +18881,7 @@ function normalizeAgentPresence(input) {
18660
18881
  };
18661
18882
  }
18662
18883
  function normalizeChannelMember(input) {
18663
- const record2 = isRecord(input) ? input : {};
18884
+ const record2 = isRecord2(input) ? input : {};
18664
18885
  const agentId = readString(record2, "agentId", "agent_id", "id") ?? "";
18665
18886
  const agentName = readString(record2, "agentName", "agent_name", "name") ?? agentId;
18666
18887
  return {
@@ -18672,7 +18893,7 @@ function normalizeChannelMember(input) {
18672
18893
  };
18673
18894
  }
18674
18895
  function normalizeChannel(input) {
18675
- const record2 = isRecord(input) ? input : {};
18896
+ const record2 = isRecord2(input) ? input : {};
18676
18897
  const name = normalizeOptionalChannelName(readString(record2, "name", "channelName", "channel_name")) ?? "";
18677
18898
  const topic = readNullableString(record2, "topic");
18678
18899
  const createdBy = readString(record2, "createdBy", "created_by");
@@ -18691,7 +18912,7 @@ function normalizeChannel(input) {
18691
18912
  };
18692
18913
  }
18693
18914
  function normalizeAttachment(input) {
18694
- const record2 = isRecord(input) ? input : {};
18915
+ const record2 = isRecord2(input) ? input : {};
18695
18916
  const type = readString(record2, "type");
18696
18917
  if (type === "text") {
18697
18918
  return {
@@ -18759,7 +18980,7 @@ function normalizeAttachment(input) {
18759
18980
  };
18760
18981
  }
18761
18982
  function normalizeReaction(input) {
18762
- const record2 = isRecord(input) ? input : {};
18983
+ const record2 = isRecord2(input) ? input : {};
18763
18984
  return {
18764
18985
  emoji: readString(record2, "emoji") ?? "",
18765
18986
  count: readNumber(record2, "count") ?? 0,
@@ -18767,8 +18988,8 @@ function normalizeReaction(input) {
18767
18988
  };
18768
18989
  }
18769
18990
  function normalizeMessage(input, context = {}) {
18770
- const record2 = isRecord(input) ? input : {};
18771
- const fromRecord = isRecord(readValue(record2, "from", "sender", "agent")) ? readValue(record2, "from", "sender", "agent") : void 0;
18991
+ const record2 = isRecord2(input) ? input : {};
18992
+ const fromRecord = isRecord2(readValue(record2, "from", "sender", "agent")) ? readValue(record2, "from", "sender", "agent") : void 0;
18772
18993
  const channelName = context.channelName ?? normalizeOptionalChannelName(readString(record2, "channelName", "channel_name", "channel"));
18773
18994
  const channelId = context.channelId ?? readString(record2, "channelId", "channel_id");
18774
18995
  const conversationId = context.conversationId ?? readString(record2, "conversationId", "conversation_id");
@@ -18818,7 +19039,7 @@ function normalizeMessage(input, context = {}) {
18818
19039
  };
18819
19040
  }
18820
19041
  function normalizeThread(input) {
18821
- const record2 = isRecord(input) ? input : {};
19042
+ const record2 = isRecord2(input) ? input : {};
18822
19043
  const parent = normalizeMessage(readValue(record2, "parent"), { kind: "channel" });
18823
19044
  const replies = readArray(record2, "replies").map((reply) => normalizeMessage(reply, {
18824
19045
  kind: "thread_reply",
@@ -18830,7 +19051,7 @@ function normalizeThread(input) {
18830
19051
  return { parent, replies };
18831
19052
  }
18832
19053
  function normalizeInboxLastMessage(input) {
18833
- const record2 = isRecord(input) ? input : void 0;
19054
+ const record2 = isRecord2(input) ? input : void 0;
18834
19055
  if (!record2)
18835
19056
  return void 0;
18836
19057
  const createdAt = readString(record2, "createdAt", "created_at");
@@ -18841,7 +19062,7 @@ function normalizeInboxLastMessage(input) {
18841
19062
  };
18842
19063
  }
18843
19064
  function normalizeInboxDirect(input) {
18844
- const record2 = isRecord(input) ? input : {};
19065
+ const record2 = isRecord2(input) ? input : {};
18845
19066
  const lastMessage = normalizeInboxLastMessage(readValue(record2, "lastMessage", "last_message"));
18846
19067
  return {
18847
19068
  conversationId: readString(record2, "conversationId", "conversation_id") ?? "",
@@ -18851,7 +19072,7 @@ function normalizeInboxDirect(input) {
18851
19072
  };
18852
19073
  }
18853
19074
  function normalizeInboxReaction(input) {
18854
- const record2 = isRecord(input) ? input : {};
19075
+ const record2 = isRecord2(input) ? input : {};
18855
19076
  const createdAt = readString(record2, "createdAt", "created_at");
18856
19077
  return {
18857
19078
  messageId: readString(record2, "messageId", "message_id") ?? "",
@@ -18862,17 +19083,17 @@ function normalizeInboxReaction(input) {
18862
19083
  };
18863
19084
  }
18864
19085
  function normalizeInbox(input) {
18865
- const record2 = isRecord(input) ? input : {};
19086
+ const record2 = isRecord2(input) ? input : {};
18866
19087
  return {
18867
19088
  unreadChannels: readArray(record2, "unreadChannels", "unread_channels").map((item) => {
18868
- const itemRecord = isRecord(item) ? item : {};
19089
+ const itemRecord = isRecord2(item) ? item : {};
18869
19090
  return {
18870
19091
  channelName: normalizeOptionalChannelName(readString(itemRecord, "channelName", "channel_name", "channel")) ?? "",
18871
19092
  unreadCount: readNumber(itemRecord, "unreadCount", "unread_count") ?? 0
18872
19093
  };
18873
19094
  }),
18874
19095
  mentions: readArray(record2, "mentions").map((item) => {
18875
- const itemRecord = isRecord(item) ? item : {};
19096
+ const itemRecord = isRecord2(item) ? item : {};
18876
19097
  return normalizeMessage(itemRecord, {
18877
19098
  kind: "channel",
18878
19099
  channelName: normalizeOptionalChannelName(readString(itemRecord, "channelName", "channel_name", "channel"))
@@ -18883,7 +19104,7 @@ function normalizeInbox(input) {
18883
19104
  };
18884
19105
  }
18885
19106
  function normalizeReadReceipt(input) {
18886
- const record2 = isRecord(input) ? input : {};
19107
+ const record2 = isRecord2(input) ? input : {};
18887
19108
  const readAt = readString(record2, "readAt", "read_at");
18888
19109
  return {
18889
19110
  messageId: readString(record2, "messageId", "message_id") ?? "",
@@ -18893,7 +19114,7 @@ function normalizeReadReceipt(input) {
18893
19114
  };
18894
19115
  }
18895
19116
  function normalizeChannelReadStatus(input) {
18896
- const record2 = isRecord(input) ? input : {};
19117
+ const record2 = isRecord2(input) ? input : {};
18897
19118
  const lastReadId = readNullableString(record2, "lastReadId", "last_read_id");
18898
19119
  const lastReadAt = readNullableString(record2, "lastReadAt", "last_read_at");
18899
19120
  return {
@@ -18934,7 +19155,7 @@ function normalizeDeliveryMetadata(record2) {
18934
19155
  return Object.keys(metadata).length > 0 ? metadata : void 0;
18935
19156
  }
18936
19157
  function normalizeInboxItem(input, context = {}) {
18937
- const record2 = isRecord(input) ? input : {};
19158
+ const record2 = isRecord2(input) ? input : {};
18938
19159
  const messageId = readString(record2, "messageId", "message_id");
18939
19160
  const channelId = readString(record2, "channelId", "channel_id");
18940
19161
  const agentId = readString(record2, "agentId", "agent_id");
@@ -18959,7 +19180,7 @@ function normalizeInboxItem(input, context = {}) {
18959
19180
  };
18960
19181
  }
18961
19182
  function normalizeDeliveryTransition(action, input) {
18962
- const record2 = isRecord(input) ? input : {};
19183
+ const record2 = isRecord2(input) ? input : {};
18963
19184
  const availableAt = readNullableString(record2, "availableAt", "available_at");
18964
19185
  return {
18965
19186
  supported: true,
@@ -18971,7 +19192,7 @@ function normalizeDeliveryTransition(action, input) {
18971
19192
  };
18972
19193
  }
18973
19194
  function normalizeSearchResult(input) {
18974
- const record2 = isRecord(input) ? input : {};
19195
+ const record2 = isRecord2(input) ? input : {};
18975
19196
  const createdAt = readString(record2, "createdAt", "created_at");
18976
19197
  return {
18977
19198
  id: readString(record2, "id", "messageId", "message_id") ?? "",
@@ -18983,7 +19204,7 @@ function normalizeSearchResult(input) {
18983
19204
  };
18984
19205
  }
18985
19206
  function normalizeGroupDirectConversation(input) {
18986
- const record2 = isRecord(input) ? input : {};
19207
+ const record2 = isRecord2(input) ? input : {};
18987
19208
  const name = readNullableString(record2, "name");
18988
19209
  const createdAt = readString(record2, "createdAt", "created_at");
18989
19210
  return {
@@ -18991,14 +19212,14 @@ function normalizeGroupDirectConversation(input) {
18991
19212
  ...readString(record2, "channelId", "channel_id") ? { channelId: readString(record2, "channelId", "channel_id") } : {},
18992
19213
  ...name ? { name } : {},
18993
19214
  participants: readArray(record2, "participants").map((participant) => {
18994
- const participantRecord = isRecord(participant) ? participant : void 0;
19215
+ const participantRecord = isRecord2(participant) ? participant : void 0;
18995
19216
  return typeof participant === "string" ? participant : readString(participantRecord, "agentName", "agent_name", "agentId", "agent_id");
18996
19217
  }).filter((participant) => typeof participant === "string"),
18997
19218
  ...createdAt ? { createdAt } : {}
18998
19219
  };
18999
19220
  }
19000
19221
  function normalizeMessagingEvent(input) {
19001
- const record2 = isRecord(input) ? input : {};
19222
+ const record2 = isRecord2(input) ? input : {};
19002
19223
  const sourceType = readString(record2, "type");
19003
19224
  switch (sourceType) {
19004
19225
  case "message.created": {
@@ -19052,18 +19273,18 @@ function normalizeMessagingEvent(input) {
19052
19273
  return {
19053
19274
  type: "agentOnline",
19054
19275
  agent: {
19055
- name: readString(isRecord(readValue(record2, "agent")) ? readValue(record2, "agent") : void 0, "name") ?? ""
19276
+ name: readString(isRecord2(readValue(record2, "agent")) ? readValue(record2, "agent") : void 0, "name") ?? ""
19056
19277
  }
19057
19278
  };
19058
19279
  case "agent.offline":
19059
19280
  return {
19060
19281
  type: "agentOffline",
19061
19282
  agent: {
19062
- name: readString(isRecord(readValue(record2, "agent")) ? readValue(record2, "agent") : void 0, "name") ?? ""
19283
+ name: readString(isRecord2(readValue(record2, "agent")) ? readValue(record2, "agent") : void 0, "name") ?? ""
19063
19284
  }
19064
19285
  };
19065
19286
  case "agent.spawn_requested": {
19066
- const agent = isRecord(readValue(record2, "agent")) ? readValue(record2, "agent") : {};
19287
+ const agent = isRecord2(readValue(record2, "agent")) ? readValue(record2, "agent") : {};
19067
19288
  return {
19068
19289
  type: "agentSpawnRequested",
19069
19290
  agent: {
@@ -19077,7 +19298,7 @@ function normalizeMessagingEvent(input) {
19077
19298
  };
19078
19299
  }
19079
19300
  case "agent.release_requested": {
19080
- const agent = isRecord(readValue(record2, "agent")) ? readValue(record2, "agent") : {};
19301
+ const agent = isRecord2(readValue(record2, "agent")) ? readValue(record2, "agent") : {};
19081
19302
  const reason = readNullableString(record2, "reason");
19082
19303
  return {
19083
19304
  type: "agentReleaseRequested",
@@ -19088,7 +19309,7 @@ function normalizeMessagingEvent(input) {
19088
19309
  }
19089
19310
  case "channel.created":
19090
19311
  case "channel.updated": {
19091
- const channel = isRecord(readValue(record2, "channel")) ? readValue(record2, "channel") : {};
19312
+ const channel = isRecord2(readValue(record2, "channel")) ? readValue(record2, "channel") : {};
19092
19313
  const topic = readNullableString(channel, "topic");
19093
19314
  return {
19094
19315
  type: sourceType === "channel.created" ? "channelCreated" : "channelUpdated",
@@ -19099,7 +19320,7 @@ function normalizeMessagingEvent(input) {
19099
19320
  };
19100
19321
  }
19101
19322
  case "channel.archived": {
19102
- const channel = isRecord(readValue(record2, "channel")) ? readValue(record2, "channel") : {};
19323
+ const channel = isRecord2(readValue(record2, "channel")) ? readValue(record2, "channel") : {};
19103
19324
  return {
19104
19325
  type: "channelArchived",
19105
19326
  channel: { name: normalizeOptionalChannelName(readString(channel, "name")) ?? "" }