@relaycast/engine 2.4.0 → 2.5.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,4 +1,4 @@
1
- const DEFAULT_POSTHOG_HOST = 'https://us.i.posthog.com';
1
+ const DEFAULT_POSTHOG_HOST = 'https://i.agentrelay.com';
2
2
  const DEFAULT_APP_VERSION = '0.1.0';
3
3
  const DEFAULT_SDK_VERSION = 'unknown';
4
4
  const SERVICE_NAME = 'relaycast-server';
@@ -1,10 +1,12 @@
1
- import { type TelemetryOrigin } from '@relaycast/types';
1
+ import { type TelemetryOrigin } from "@relaycast/types";
2
2
  export type OriginInfo = Partial<TelemetryOrigin>;
3
3
  /**
4
4
  * HTTP header used by harnesses (Claude Code, Cursor, etc.) to identify
5
5
  * themselves to the relaycast server. See relay#881.
6
6
  */
7
7
  export declare const HARNESS_HEADER = "X-Relaycast-Harness";
8
+ export declare const AGENT_RELAY_DISTINCT_ID_HEADER = "X-Agent-Relay-Distinct-Id";
9
+ export declare const AGENT_RELAY_DISTINCT_ID_QUERY = "agent_relay_distinct_id";
8
10
  /** Fallback value when the harness is missing or invalid. */
9
11
  export declare const UNKNOWN_HARNESS = "unknown";
10
12
  /**
@@ -21,6 +23,7 @@ export declare const UNKNOWN_HARNESS = "unknown";
21
23
  * in the analytics layer. Drops empty or malformed values to `'unknown'`.
22
24
  */
23
25
  export declare function extractHarness(request: Request): string;
26
+ export declare function extractAgentRelayDistinctId(request: Request): string | undefined;
24
27
  export declare function deriveClientName(headers: Headers): string | undefined;
25
28
  export declare function extractOriginInfo(request: Request, fallbackClientName?: string): OriginInfo;
26
29
  export declare function requiredOriginInfo(request: Request, fallbackClientName?: string): TelemetryOrigin;
@@ -1 +1 @@
1
- {"version":3,"file":"origin.d.ts","sourceRoot":"","sources":["../../src/lib/origin.ts"],"names":[],"mappings":"AAAA,OAAO,EAA4B,KAAK,eAAe,EAAE,MAAM,kBAAkB,CAAC;AAElF,MAAM,MAAM,UAAU,GAAG,OAAO,CAAC,eAAe,CAAC,CAAC;AAElD;;;GAGG;AACH,eAAO,MAAM,cAAc,wBAAwB,CAAC;AAEpD,6DAA6D;AAC7D,eAAO,MAAM,eAAe,YAAY,CAAC;AAazC;;;;;;;;;;;;GAYG;AACH,wBAAgB,cAAc,CAAC,OAAO,EAAE,OAAO,GAAG,MAAM,CAUvD;AASD,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,OAAO,GAAG,MAAM,GAAG,SAAS,CAQrE;AAED,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,OAAO,EAAE,kBAAkB,CAAC,EAAE,MAAM,GAAG,UAAU,CAgC3F;AAED,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,OAAO,EAAE,kBAAkB,CAAC,EAAE,MAAM,GAAG,eAAe,CAEjG"}
1
+ {"version":3,"file":"origin.d.ts","sourceRoot":"","sources":["../../src/lib/origin.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,KAAK,eAAe,EACrB,MAAM,kBAAkB,CAAC;AAE1B,MAAM,MAAM,UAAU,GAAG,OAAO,CAAC,eAAe,CAAC,CAAC;AAElD;;;GAGG;AACH,eAAO,MAAM,cAAc,wBAAwB,CAAC;AACpD,eAAO,MAAM,8BAA8B,8BAA8B,CAAC;AAC1E,eAAO,MAAM,6BAA6B,4BAA4B,CAAC;AAEvE,6DAA6D;AAC7D,eAAO,MAAM,eAAe,YAAY,CAAC;AAczC;;;;;;;;;;;;GAYG;AACH,wBAAgB,cAAc,CAAC,OAAO,EAAE,OAAO,GAAG,MAAM,CAWvD;AAED,wBAAgB,2BAA2B,CACzC,OAAO,EAAE,OAAO,GACf,MAAM,GAAG,SAAS,CAWpB;AAYD,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,OAAO,GAAG,MAAM,GAAG,SAAS,CASrE;AAED,wBAAgB,iBAAiB,CAC/B,OAAO,EAAE,OAAO,EAChB,kBAAkB,CAAC,EAAE,MAAM,GAC1B,UAAU,CAkCZ;AAED,wBAAgB,kBAAkB,CAChC,OAAO,EAAE,OAAO,EAChB,kBAAkB,CAAC,EAAE,MAAM,GAC1B,eAAe,CAIjB"}
@@ -1,11 +1,13 @@
1
- import { normalizeTelemetryOrigin } from '@relaycast/types';
1
+ import { normalizeTelemetryOrigin, } from "@relaycast/types";
2
2
  /**
3
3
  * HTTP header used by harnesses (Claude Code, Cursor, etc.) to identify
4
4
  * themselves to the relaycast server. See relay#881.
5
5
  */
6
- export const HARNESS_HEADER = 'X-Relaycast-Harness';
6
+ export const HARNESS_HEADER = "X-Relaycast-Harness";
7
+ export const AGENT_RELAY_DISTINCT_ID_HEADER = "X-Agent-Relay-Distinct-Id";
8
+ export const AGENT_RELAY_DISTINCT_ID_QUERY = "agent_relay_distinct_id";
7
9
  /** Fallback value when the harness is missing or invalid. */
8
- export const UNKNOWN_HARNESS = 'unknown';
10
+ export const UNKNOWN_HARNESS = "unknown";
9
11
  /** Upper bound on the harness value — generous enough for a UA-style token. */
10
12
  const HARNESS_MAX_LENGTH = 120;
11
13
  /**
@@ -15,6 +17,7 @@ const HARNESS_MAX_LENGTH = 120;
15
17
  * upstream caller from smuggling a header injection past the relaycast WAF.
16
18
  */
17
19
  const HARNESS_ALLOWED = /^[a-z0-9 ._\-/():=;,+]+$/i;
20
+ const AGENT_RELAY_DISTINCT_ID_ALLOWED = /^[a-z0-9._:-]+$/i;
18
21
  /**
19
22
  * Read and sanitize the harness identifier from a request.
20
23
  *
@@ -29,8 +32,8 @@ const HARNESS_ALLOWED = /^[a-z0-9 ._\-/():=;,+]+$/i;
29
32
  * in the analytics layer. Drops empty or malformed values to `'unknown'`.
30
33
  */
31
34
  export function extractHarness(request) {
32
- const raw = request.headers.get(HARNESS_HEADER)
33
- ?? new URL(request.url).searchParams.get('harness');
35
+ const raw = request.headers.get(HARNESS_HEADER) ??
36
+ new URL(request.url).searchParams.get("harness");
34
37
  if (!raw)
35
38
  return UNKNOWN_HARNESS;
36
39
  const trimmed = raw.trim();
@@ -40,6 +43,18 @@ export function extractHarness(request) {
40
43
  return UNKNOWN_HARNESS;
41
44
  return trimmed.slice(0, HARNESS_MAX_LENGTH).toLowerCase();
42
45
  }
46
+ export function extractAgentRelayDistinctId(request) {
47
+ const raw = request.headers.get(AGENT_RELAY_DISTINCT_ID_HEADER) ??
48
+ new URL(request.url).searchParams.get(AGENT_RELAY_DISTINCT_ID_QUERY);
49
+ if (!raw)
50
+ return undefined;
51
+ const trimmed = raw.trim();
52
+ if (!trimmed)
53
+ return undefined;
54
+ if (!AGENT_RELAY_DISTINCT_ID_ALLOWED.test(trimmed))
55
+ return undefined;
56
+ return trimmed.slice(0, 128);
57
+ }
43
58
  function sanitizeOriginPart(value, maxLen) {
44
59
  if (!value)
45
60
  return undefined;
@@ -49,10 +64,10 @@ function sanitizeOriginPart(value, maxLen) {
49
64
  return normalized.slice(0, maxLen);
50
65
  }
51
66
  export function deriveClientName(headers) {
52
- const explicit = headers.get('x-client-name') ?? headers.get('x-relaycast-client');
67
+ const explicit = headers.get("x-client-name") ?? headers.get("x-relaycast-client");
53
68
  if (explicit)
54
69
  return explicit.trim().slice(0, 80);
55
- const ua = headers.get('user-agent');
70
+ const ua = headers.get("user-agent");
56
71
  if (!ua)
57
72
  return undefined;
58
73
  const family = ua.split(/[\/\s;]/)[0];
@@ -61,18 +76,20 @@ export function deriveClientName(headers) {
61
76
  export function extractOriginInfo(request, fallbackClientName) {
62
77
  const headers = request.headers;
63
78
  const url = new URL(request.url);
64
- const querySurface = url.searchParams.get('origin_surface');
65
- const queryClient = url.searchParams.get('origin_client');
66
- const queryVersion = url.searchParams.get('origin_version');
67
- const originSurface = sanitizeOriginPart(headers.get('x-relaycast-origin-surface') ?? headers.get('x-origin-surface') ?? querySurface, 32);
68
- const originClient = sanitizeOriginPart(headers.get('x-relaycast-origin-client')
69
- ?? headers.get('x-origin-client')
70
- ?? queryClient
71
- ?? fallbackClientName, 80);
72
- const originVersion = sanitizeOriginPart(headers.get('x-relaycast-origin-version')
73
- ?? headers.get('x-origin-version')
74
- ?? queryVersion
75
- ?? headers.get('x-sdk-version'), 48);
79
+ const querySurface = url.searchParams.get("origin_surface");
80
+ const queryClient = url.searchParams.get("origin_client");
81
+ const queryVersion = url.searchParams.get("origin_version");
82
+ const originSurface = sanitizeOriginPart(headers.get("x-relaycast-origin-surface") ??
83
+ headers.get("x-origin-surface") ??
84
+ querySurface, 32);
85
+ const originClient = sanitizeOriginPart(headers.get("x-relaycast-origin-client") ??
86
+ headers.get("x-origin-client") ??
87
+ queryClient ??
88
+ fallbackClientName, 80);
89
+ const originVersion = sanitizeOriginPart(headers.get("x-relaycast-origin-version") ??
90
+ headers.get("x-origin-version") ??
91
+ queryVersion ??
92
+ headers.get("x-sdk-version"), 48);
76
93
  return {
77
94
  ...(originSurface ? { origin_surface: originSurface } : {}),
78
95
  ...(originClient ? { origin_client: originClient } : {}),
@@ -1 +1 @@
1
- {"version":3,"file":"origin.js","sourceRoot":"","sources":["../../src/lib/origin.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"origin.js","sourceRoot":"","sources":["../../src/lib/origin.ts"],"names":[],"mappings":"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"}
@@ -1,5 +1,5 @@
1
- import type { Context } from 'hono';
2
- import type { AppEnv } from '../env.js';
1
+ import type { Context } from "hono";
2
+ import type { AppEnv } from "../env.js";
3
3
  type ServerEvent = `relaycast_server_${string}`;
4
4
  export declare function normalizeRoutePathForTelemetry(value: string): string;
5
5
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"serverTelemetry.d.ts","sourceRoot":"","sources":["../../src/lib/serverTelemetry.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,MAAM,CAAC;AACpC,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,WAAW,CAAC;AAGxC,KAAK,WAAW,GAAG,oBAAoB,MAAM,EAAE,CAAC;AAEhD,wBAAgB,8BAA8B,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAWpE;AAED;;;;GAIG;AACH,wBAAgB,eAAe,CAC7B,CAAC,EAAE,OAAO,CAAC,MAAM,CAAC,EAClB,WAAW,EAAE,MAAM,EACnB,KAAK,EAAE,WAAW,EAClB,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAClC,IAAI,CAyBN"}
1
+ {"version":3,"file":"serverTelemetry.d.ts","sourceRoot":"","sources":["../../src/lib/serverTelemetry.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,MAAM,CAAC;AACpC,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,WAAW,CAAC;AAQxC,KAAK,WAAW,GAAG,oBAAoB,MAAM,EAAE,CAAC;AAEhD,wBAAgB,8BAA8B,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAoBpE;AAED;;;;GAIG;AACH,wBAAgB,eAAe,CAC7B,CAAC,EAAE,OAAO,CAAC,MAAM,CAAC,EAClB,WAAW,EAAE,MAAM,EACnB,KAAK,EAAE,WAAW,EAClB,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAClC,IAAI,CA8BN"}
@@ -1,18 +1,21 @@
1
- import { extractHarness, requiredOriginInfo, UNKNOWN_HARNESS } from './origin.js';
1
+ import { extractAgentRelayDistinctId, extractHarness, requiredOriginInfo, UNKNOWN_HARNESS, } from "./origin.js";
2
2
  export function normalizeRoutePathForTelemetry(value) {
3
3
  const withoutQuery = value.split(/[?#]/)[0] ?? value;
4
- const compact = withoutQuery.replace(/\/+/g, '/').trim();
5
- const withLeadingSlash = compact.startsWith('/') ? compact : `/${compact}`;
6
- const segments = withLeadingSlash.split('/').filter(Boolean).map((segment) => {
4
+ const compact = withoutQuery.replace(/\/+/g, "/").trim();
5
+ const withLeadingSlash = compact.startsWith("/") ? compact : `/${compact}`;
6
+ const segments = withLeadingSlash
7
+ .split("/")
8
+ .filter(Boolean)
9
+ .map((segment) => {
7
10
  if (/^\d{6,}$/.test(segment))
8
- return ':id';
11
+ return ":id";
9
12
  if (/^[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i.test(segment))
10
- return ':id';
13
+ return ":id";
11
14
  if (/^(dm|dmch|cmd|sub|wh)_[a-zA-Z0-9_-]{8,}$/.test(segment))
12
- return ':id';
15
+ return ":id";
13
16
  return segment;
14
17
  });
15
- return `/${segments.join('/')}`;
18
+ return `/${segments.join("/")}`;
16
19
  }
17
20
  /**
18
21
  * Emit a server-side product-telemetry event through the injected
@@ -21,20 +24,22 @@ export function normalizeRoutePathForTelemetry(value) {
21
24
  */
22
25
  export function emitServerEvent(c, workspaceId, event, properties) {
23
26
  const normalizedProperties = { ...properties };
24
- if (typeof normalizedProperties.route_path === 'string') {
27
+ if (typeof normalizedProperties.route_path === "string") {
25
28
  normalizedProperties.route_path = normalizeRoutePathForTelemetry(normalizedProperties.route_path);
26
29
  }
27
30
  // Prefer the value stashed by the logger middleware. Fall back to reading the
28
31
  // header directly so emitters that bypass middleware still get a sane value.
29
- const harness = c.get('harness')
30
- ?? extractHarness(c.req.raw)
31
- ?? UNKNOWN_HARNESS;
32
+ const harness = c.get("harness") ?? extractHarness(c.req.raw) ?? UNKNOWN_HARNESS;
32
33
  const origin = requiredOriginInfo(c.req.raw);
33
- c.get('engine').telemetry.capture({
34
+ const clientDistinctId = extractAgentRelayDistinctId(c.req.raw);
35
+ c.get("engine").telemetry.capture({
34
36
  name: event,
35
- distinctId: workspaceId,
37
+ distinctId: clientDistinctId ?? workspaceId,
36
38
  properties: {
39
+ app: "relaycast-server",
40
+ surface: "cloud",
37
41
  workspace_id: workspaceId,
42
+ ...(clientDistinctId ? { client_distinct_id: clientDistinctId } : {}),
38
43
  harness,
39
44
  origin_surface: origin.origin_surface,
40
45
  origin_client: origin.origin_client,
@@ -1 +1 @@
1
- {"version":3,"file":"serverTelemetry.js","sourceRoot":"","sources":["../../src/lib/serverTelemetry.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,cAAc,EAAE,kBAAkB,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAIlF,MAAM,UAAU,8BAA8B,CAAC,KAAa;IAC1D,MAAM,YAAY,GAAG,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC;IACrD,MAAM,OAAO,GAAG,YAAY,CAAC,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC;IACzD,MAAM,gBAAgB,GAAG,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,OAAO,EAAE,CAAC;IAC3E,MAAM,QAAQ,GAAG,gBAAgB,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE;QAC3E,IAAI,UAAU,CAAC,IAAI,CAAC,OAAO,CAAC;YAAE,OAAO,KAAK,CAAC;QAC3C,IAAI,4EAA4E,CAAC,IAAI,CAAC,OAAO,CAAC;YAAE,OAAO,KAAK,CAAC;QAC7G,IAAI,0CAA0C,CAAC,IAAI,CAAC,OAAO,CAAC;YAAE,OAAO,KAAK,CAAC;QAC3E,OAAO,OAAO,CAAC;IACjB,CAAC,CAAC,CAAC;IACH,OAAO,IAAI,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;AAClC,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,eAAe,CAC7B,CAAkB,EAClB,WAAmB,EACnB,KAAkB,EAClB,UAAmC;IAEnC,MAAM,oBAAoB,GAAG,EAAE,GAAG,UAAU,EAAE,CAAC;IAC/C,IAAI,OAAO,oBAAoB,CAAC,UAAU,KAAK,QAAQ,EAAE,CAAC;QACxD,oBAAoB,CAAC,UAAU,GAAG,8BAA8B,CAAC,oBAAoB,CAAC,UAAU,CAAC,CAAC;IACpG,CAAC;IAED,8EAA8E;IAC9E,6EAA6E;IAC7E,MAAM,OAAO,GAAG,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC;WAC3B,cAAc,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC;WACzB,eAAe,CAAC;IAErB,MAAM,MAAM,GAAG,kBAAkB,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IAC7C,CAAC,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,SAAS,CAAC,OAAO,CAAC;QAChC,IAAI,EAAE,KAAK;QACX,UAAU,EAAE,WAAW;QACvB,UAAU,EAAE;YACV,YAAY,EAAE,WAAW;YACzB,OAAO;YACP,cAAc,EAAE,MAAM,CAAC,cAAc;YACrC,aAAa,EAAE,MAAM,CAAC,aAAa;YACnC,cAAc,EAAE,MAAM,CAAC,cAAc;YACrC,GAAG,oBAAoB;SACxB;KACF,CAAC,CAAC;AACL,CAAC"}
1
+ {"version":3,"file":"serverTelemetry.js","sourceRoot":"","sources":["../../src/lib/serverTelemetry.ts"],"names":[],"mappings":"AAEA,OAAO,EACL,2BAA2B,EAC3B,cAAc,EACd,kBAAkB,EAClB,eAAe,GAChB,MAAM,aAAa,CAAC;AAIrB,MAAM,UAAU,8BAA8B,CAAC,KAAa;IAC1D,MAAM,YAAY,GAAG,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC;IACrD,MAAM,OAAO,GAAG,YAAY,CAAC,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC;IACzD,MAAM,gBAAgB,GAAG,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,OAAO,EAAE,CAAC;IAC3E,MAAM,QAAQ,GAAG,gBAAgB;SAC9B,KAAK,CAAC,GAAG,CAAC;SACV,MAAM,CAAC,OAAO,CAAC;SACf,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE;QACf,IAAI,UAAU,CAAC,IAAI,CAAC,OAAO,CAAC;YAAE,OAAO,KAAK,CAAC;QAC3C,IACE,4EAA4E,CAAC,IAAI,CAC/E,OAAO,CACR;YAED,OAAO,KAAK,CAAC;QACf,IAAI,0CAA0C,CAAC,IAAI,CAAC,OAAO,CAAC;YAC1D,OAAO,KAAK,CAAC;QACf,OAAO,OAAO,CAAC;IACjB,CAAC,CAAC,CAAC;IACL,OAAO,IAAI,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;AAClC,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,eAAe,CAC7B,CAAkB,EAClB,WAAmB,EACnB,KAAkB,EAClB,UAAmC;IAEnC,MAAM,oBAAoB,GAAG,EAAE,GAAG,UAAU,EAAE,CAAC;IAC/C,IAAI,OAAO,oBAAoB,CAAC,UAAU,KAAK,QAAQ,EAAE,CAAC;QACxD,oBAAoB,CAAC,UAAU,GAAG,8BAA8B,CAC9D,oBAAoB,CAAC,UAAU,CAChC,CAAC;IACJ,CAAC;IAED,8EAA8E;IAC9E,6EAA6E;IAC7E,MAAM,OAAO,GACX,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,IAAI,cAAc,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,eAAe,CAAC;IAEnE,MAAM,MAAM,GAAG,kBAAkB,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IAC7C,MAAM,gBAAgB,GAAG,2BAA2B,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IAChE,CAAC,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,SAAS,CAAC,OAAO,CAAC;QAChC,IAAI,EAAE,KAAK;QACX,UAAU,EAAE,gBAAgB,IAAI,WAAW;QAC3C,UAAU,EAAE;YACV,GAAG,EAAE,kBAAkB;YACvB,OAAO,EAAE,OAAO;YAChB,YAAY,EAAE,WAAW;YACzB,GAAG,CAAC,gBAAgB,CAAC,CAAC,CAAC,EAAE,kBAAkB,EAAE,gBAAgB,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YACrE,OAAO;YACP,cAAc,EAAE,MAAM,CAAC,cAAc;YACrC,aAAa,EAAE,MAAM,CAAC,aAAa;YACnC,cAAc,EAAE,MAAM,CAAC,cAAc;YACrC,GAAG,oBAAoB;SACxB;KACF,CAAC,CAAC;AACL,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@relaycast/engine",
3
- "version": "2.4.0",
3
+ "version": "2.5.1",
4
4
  "type": "module",
5
5
  "description": "Portable, platform-agnostic engine for Relaycast — channels, threads, DMs, presence, real-time events. Runs on Node + SQLite (self-host) or behind a Cloudflare Durable Object adapter (hosted).",
6
6
  "bin": {
@@ -43,8 +43,8 @@
43
43
  },
44
44
  "dependencies": {
45
45
  "@hono/node-server": "^1.13.7",
46
- "@relaycast/a2a": "2.4.0",
47
- "@relaycast/types": "2.4.0",
46
+ "@relaycast/a2a": "2.5.1",
47
+ "@relaycast/types": "2.5.1",
48
48
  "better-sqlite3": "^11.10.0",
49
49
  "drizzle-orm": "^0.45.1",
50
50
  "hono": "^4.11.9",