@agentuity/runtime 1.0.1 → 1.0.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.
@@ -5,34 +5,60 @@ import type { Env } from '../app';
5
5
  * Receives the Hono context and can return any response.
6
6
  */
7
7
  export type CronHandler<E extends Env = Env> = (c: Context<E>) => unknown | Promise<unknown>;
8
+ /**
9
+ * Options for the cron middleware.
10
+ */
11
+ export interface CronOptions {
12
+ /**
13
+ * Whether to require signature authentication for cron requests.
14
+ * When true, requests must include valid X-Agentuity-Cron-Signature
15
+ * and X-Agentuity-Cron-Timestamp headers signed with the project's SDK key.
16
+ * Signatures are valid for 5 minutes.
17
+ */
18
+ auth: boolean;
19
+ }
8
20
  /**
9
21
  * Creates a cron middleware for scheduled task endpoints.
10
22
  *
11
23
  * **Important:** Cron endpoints must use POST method. The middleware will throw
12
24
  * an error if called with any other HTTP method.
13
25
  *
14
- * Use with router.post() to create a cron endpoint:
15
- *
16
26
  * @example
17
27
  * ```typescript
18
28
  * import { createRouter, cron } from '@agentuity/runtime';
19
29
  *
20
30
  * const router = createRouter();
21
31
  *
22
- * // Daily cleanup at midnight
23
- * router.post('/daily-cleanup', cron('0 0 * * *', (c) => {
32
+ * // With authentication (recommended)
33
+ * router.post('/daily-cleanup', cron('0 0 * * *', { auth: true }, (c) => {
24
34
  * c.var.logger.info('Running daily cleanup');
25
35
  * return { status: 'cleanup complete' };
26
36
  * }));
27
37
  *
28
- * // Hourly health check
29
- * router.post('/health-check', cron('0 * * * *', (c) => {
38
+ * // Without authentication (not recommended for production)
39
+ * router.post('/health-check', cron('0 * * * *', { auth: false }, (c) => {
30
40
  * c.var.logger.info('Running hourly health check');
31
41
  * return c.text('OK');
32
42
  * }));
33
43
  * ```
34
44
  *
35
45
  * @param schedule - Cron expression (e.g., '0 0 * * *' for daily at midnight)
46
+ * @param options - Configuration options including auth requirement
47
+ * @param handler - Handler function to run on schedule
48
+ * @returns Hono handler for cron endpoint
49
+ */
50
+ export declare function cron<E extends Env = Env>(schedule: string, options: CronOptions, handler: CronHandler<E>): Handler<E>;
51
+ /**
52
+ * Creates a cron middleware for scheduled task endpoints.
53
+ *
54
+ * @deprecated Use the overload with explicit `options` parameter: `cron(schedule, { auth: true }, handler)`
55
+ *
56
+ * **Important:** Cron endpoints must use POST method. The middleware will throw
57
+ * an error if called with any other HTTP method.
58
+ *
59
+ * This deprecated overload defaults to `auth: false` for backwards compatibility.
60
+ *
61
+ * @param schedule - Cron expression (e.g., '0 0 * * *' for daily at midnight)
36
62
  * @param handler - Handler function to run on schedule
37
63
  * @returns Hono handler for cron endpoint
38
64
  */
@@ -1 +1 @@
1
- {"version":3,"file":"cron.d.ts","sourceRoot":"","sources":["../../src/handlers/cron.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,MAAM,CAAC;AAE7C,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,QAAQ,CAAC;AAElC;;;GAGG;AACH,MAAM,MAAM,WAAW,CAAC,CAAC,SAAS,GAAG,GAAG,GAAG,IAAI,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC,CAAC,KAAK,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;AAE7F;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8BG;AACH,wBAAgB,IAAI,CAAC,CAAC,SAAS,GAAG,GAAG,GAAG,EAAE,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,WAAW,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAoB/F;AAED;;GAEG;AACH,MAAM,WAAW,YAAY;IAC5B,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;CACb"}
1
+ {"version":3,"file":"cron.d.ts","sourceRoot":"","sources":["../../src/handlers/cron.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,MAAM,CAAC;AAE7C,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,QAAQ,CAAC;AAElC;;;GAGG;AACH,MAAM,MAAM,WAAW,CAAC,CAAC,SAAS,GAAG,GAAG,GAAG,IAAI,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC,CAAC,KAAK,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;AAE7F;;GAEG;AACH,MAAM,WAAW,WAAW;IAC3B;;;;;OAKG;IACH,IAAI,EAAE,OAAO,CAAC;CACd;AA6DD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6BG;AACH,wBAAgB,IAAI,CAAC,CAAC,SAAS,GAAG,GAAG,GAAG,EACvC,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,WAAW,EACpB,OAAO,EAAE,WAAW,CAAC,CAAC,CAAC,GACrB,OAAO,CAAC,CAAC,CAAC,CAAC;AAEd;;;;;;;;;;;;;GAaG;AACH,wBAAgB,IAAI,CAAC,CAAC,SAAS,GAAG,GAAG,GAAG,EAAE,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,WAAW,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;AAqDjG;;GAEG;AACH,MAAM,WAAW,YAAY;IAC5B,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;CACb"}
@@ -1,41 +1,75 @@
1
1
  import { returnResponse } from '../_util';
2
+ // Maximum age for cron signatures (5 minutes)
3
+ const MAX_SIGNATURE_AGE_SECONDS = 300;
2
4
  /**
3
- * Creates a cron middleware for scheduled task endpoints.
4
- *
5
- * **Important:** Cron endpoints must use POST method. The middleware will throw
6
- * an error if called with any other HTTP method.
7
- *
8
- * Use with router.post() to create a cron endpoint:
9
- *
10
- * @example
11
- * ```typescript
12
- * import { createRouter, cron } from '@agentuity/runtime';
13
- *
14
- * const router = createRouter();
15
- *
16
- * // Daily cleanup at midnight
17
- * router.post('/daily-cleanup', cron('0 0 * * *', (c) => {
18
- * c.var.logger.info('Running daily cleanup');
19
- * return { status: 'cleanup complete' };
20
- * }));
21
- *
22
- * // Hourly health check
23
- * router.post('/health-check', cron('0 * * * *', (c) => {
24
- * c.var.logger.info('Running hourly health check');
25
- * return c.text('OK');
26
- * }));
27
- * ```
28
- *
29
- * @param schedule - Cron expression (e.g., '0 0 * * *' for daily at midnight)
30
- * @param handler - Handler function to run on schedule
31
- * @returns Hono handler for cron endpoint
5
+ * Verifies the cron request signature from Catalyst.
6
+ * Returns true if signature is valid or if running in local dev mode (no SDK key).
32
7
  */
33
- export function cron(schedule, handler) {
8
+ async function verifyCronSignature(c, body) {
9
+ const sdkKey = process.env.AGENTUITY_SDK_KEY;
10
+ // In local dev mode (no SDK key), allow all requests
11
+ if (!sdkKey) {
12
+ return true;
13
+ }
14
+ const signature = c.req.header('X-Agentuity-Cron-Signature');
15
+ const timestampStr = c.req.header('X-Agentuity-Cron-Timestamp');
16
+ // If no signature headers, reject the request
17
+ if (!signature || !timestampStr) {
18
+ return false;
19
+ }
20
+ // Verify timestamp is within acceptable range (prevent replay attacks)
21
+ const timestamp = parseInt(timestampStr, 10);
22
+ const now = Math.floor(Date.now() / 1000);
23
+ if (isNaN(timestamp) || Math.abs(now - timestamp) > MAX_SIGNATURE_AGE_SECONDS) {
24
+ return false;
25
+ }
26
+ // Validate signature format: must be 'v1=' followed by valid hex (64 chars for SHA-256)
27
+ if (!signature.startsWith('v1=')) {
28
+ return false;
29
+ }
30
+ const hexPayload = signature.slice(3);
31
+ if (!/^[0-9a-f]{64}$/i.test(hexPayload)) {
32
+ return false;
33
+ }
34
+ // Decode hex payload into Uint8Array
35
+ const incomingSigBytes = new Uint8Array(32);
36
+ for (let i = 0; i < 32; i++) {
37
+ incomingSigBytes[i] = parseInt(hexPayload.slice(i * 2, i * 2 + 2), 16);
38
+ }
39
+ // Verify the signature using constant-time comparison
40
+ const message = `${timestamp}.${body}`;
41
+ const encoder = new TextEncoder();
42
+ const key = await crypto.subtle.importKey('raw', encoder.encode(sdkKey), { name: 'HMAC', hash: 'SHA-256' }, false, ['verify']);
43
+ return crypto.subtle.verify('HMAC', key, incomingSigBytes, encoder.encode(message));
44
+ }
45
+ export function cron(schedule, optionsOrHandler, maybeHandler) {
46
+ let options;
47
+ let handler;
48
+ if (typeof optionsOrHandler === 'function') {
49
+ // Deprecated: cron(schedule, handler) - defaults to auth: false
50
+ options = { auth: false };
51
+ handler = optionsOrHandler;
52
+ }
53
+ else {
54
+ // New: cron(schedule, options, handler)
55
+ options = optionsOrHandler;
56
+ handler = maybeHandler;
57
+ }
34
58
  return async (c) => {
35
59
  if (c.req.method !== 'POST') {
36
60
  throw new Error(`Cron endpoint must use POST method, but received ${c.req.method}. ` +
37
61
  `Use router.post() instead of router.${c.req.method.toLowerCase()}().`);
38
62
  }
63
+ if (options.auth) {
64
+ // Clone the request to read body for signature verification without consuming it
65
+ const clonedReq = c.req.raw.clone();
66
+ const body = await clonedReq.text();
67
+ // Verify the cron signature
68
+ const isValid = await verifyCronSignature(c, body);
69
+ if (!isValid) {
70
+ return c.json({ error: 'Unauthorized' }, 401);
71
+ }
72
+ }
39
73
  let result = handler(c);
40
74
  if (result instanceof Promise) {
41
75
  result = await result;
@@ -1 +1 @@
1
- {"version":3,"file":"cron.js","sourceRoot":"","sources":["../../src/handlers/cron.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,cAAc,EAAE,MAAM,UAAU,CAAC;AAS1C;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8BG;AACH,MAAM,UAAU,IAAI,CAAsB,QAAgB,EAAE,OAAuB;IAClF,OAAO,KAAK,EAAE,CAAa,EAAE,EAAE;QAC9B,IAAI,CAAC,CAAC,GAAG,CAAC,MAAM,KAAK,MAAM,EAAE,CAAC;YAC7B,MAAM,IAAI,KAAK,CACd,oDAAoD,CAAC,CAAC,GAAG,CAAC,MAAM,IAAI;gBACnE,uCAAuC,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,WAAW,EAAE,KAAK,CACvE,CAAC;QACH,CAAC;QAED,IAAI,MAAM,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;QACxB,IAAI,MAAM,YAAY,OAAO,EAAE,CAAC;YAC/B,MAAM,GAAG,MAAM,MAAM,CAAC;QACvB,CAAC;QAED,IAAI,MAAM,YAAY,QAAQ,EAAE,CAAC;YAChC,OAAO,MAAM,CAAC;QACf,CAAC;QAED,OAAO,cAAc,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC;IAClC,CAAC,CAAC;AACH,CAAC"}
1
+ {"version":3,"file":"cron.js","sourceRoot":"","sources":["../../src/handlers/cron.ts"],"names":[],"mappings":"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"}
@@ -1,5 +1,6 @@
1
1
  export { websocket, type WebSocketConnection, type WebSocketHandler } from './websocket';
2
- export { sse, type SSEMessage, type SSEStream, type SSEHandler, STREAM_DONE_PROMISE_KEY, IS_STREAMING_RESPONSE_KEY, } from './sse';
2
+ export { sse, type SSEMessage, type SSEStream, type SSEHandler, type SSEOptions, STREAM_DONE_PROMISE_KEY, IS_STREAMING_RESPONSE_KEY, } from './sse';
3
3
  export { stream, type StreamHandler } from './stream';
4
4
  export { cron, type CronHandler, type CronMetadata } from './cron';
5
+ export { webrtc, type WebRTCHandler, type WebRTCOptions } from './webrtc';
5
6
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/handlers/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,KAAK,mBAAmB,EAAE,KAAK,gBAAgB,EAAE,MAAM,aAAa,CAAC;AACzF,OAAO,EACN,GAAG,EACH,KAAK,UAAU,EACf,KAAK,SAAS,EACd,KAAK,UAAU,EACf,uBAAuB,EACvB,yBAAyB,GACzB,MAAM,OAAO,CAAC;AACf,OAAO,EAAE,MAAM,EAAE,KAAK,aAAa,EAAE,MAAM,UAAU,CAAC;AACtD,OAAO,EAAE,IAAI,EAAE,KAAK,WAAW,EAAE,KAAK,YAAY,EAAE,MAAM,QAAQ,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/handlers/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,KAAK,mBAAmB,EAAE,KAAK,gBAAgB,EAAE,MAAM,aAAa,CAAC;AACzF,OAAO,EACN,GAAG,EACH,KAAK,UAAU,EACf,KAAK,SAAS,EACd,KAAK,UAAU,EACf,KAAK,UAAU,EACf,uBAAuB,EACvB,yBAAyB,GACzB,MAAM,OAAO,CAAC;AACf,OAAO,EAAE,MAAM,EAAE,KAAK,aAAa,EAAE,MAAM,UAAU,CAAC;AACtD,OAAO,EAAE,IAAI,EAAE,KAAK,WAAW,EAAE,KAAK,YAAY,EAAE,MAAM,QAAQ,CAAC;AACnE,OAAO,EAAE,MAAM,EAAE,KAAK,aAAa,EAAE,KAAK,aAAa,EAAE,MAAM,UAAU,CAAC"}
@@ -2,4 +2,5 @@ export { websocket } from './websocket';
2
2
  export { sse, STREAM_DONE_PROMISE_KEY, IS_STREAMING_RESPONSE_KEY, } from './sse';
3
3
  export { stream } from './stream';
4
4
  export { cron } from './cron';
5
+ export { webrtc } from './webrtc';
5
6
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/handlers/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAmD,MAAM,aAAa,CAAC;AACzF,OAAO,EACN,GAAG,EAIH,uBAAuB,EACvB,yBAAyB,GACzB,MAAM,OAAO,CAAC;AACf,OAAO,EAAE,MAAM,EAAsB,MAAM,UAAU,CAAC;AACtD,OAAO,EAAE,IAAI,EAAuC,MAAM,QAAQ,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/handlers/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAmD,MAAM,aAAa,CAAC;AACzF,OAAO,EACN,GAAG,EAKH,uBAAuB,EACvB,yBAAyB,GACzB,MAAM,OAAO,CAAC;AACf,OAAO,EAAE,MAAM,EAAsB,MAAM,UAAU,CAAC;AACtD,OAAO,EAAE,IAAI,EAAuC,MAAM,QAAQ,CAAC;AACnE,OAAO,EAAE,MAAM,EAA0C,MAAM,UAAU,CAAC"}
@@ -1,4 +1,5 @@
1
1
  import type { Context, Handler } from 'hono';
2
+ import type { Schema } from '@agentuity/schema';
2
3
  import type { Env } from '../app';
3
4
  /**
4
5
  * Context variable key for stream completion promise.
@@ -48,6 +49,42 @@ export interface SSEStream {
48
49
  * Receives the Hono context and SSE stream with a flattened signature.
49
50
  */
50
51
  export type SSEHandler<E extends Env = Env> = (c: Context<E>, stream: SSEStream) => void | Promise<void>;
52
+ /**
53
+ * Options for configuring SSE middleware.
54
+ *
55
+ * @template TOutput - The type of data that will be sent through the SSE stream.
56
+ * This is used for type inference in generated route registries and does not
57
+ * perform runtime validation (SSE data is serialized via JSON.stringify).
58
+ */
59
+ export interface SSEOptions<TOutput = unknown> {
60
+ /**
61
+ * Schema defining the output type for SSE events.
62
+ *
63
+ * This schema is used for:
64
+ * - Type inference in generated `routes.ts` registry
65
+ * - Automatic typing of `useEventStream` hook's `data` property
66
+ *
67
+ * The schema is NOT used for runtime validation - SSE messages are sent
68
+ * as-is through the stream. Use this for TypeScript type safety only.
69
+ *
70
+ * @example
71
+ * ```typescript
72
+ * import { s } from '@agentuity/schema';
73
+ *
74
+ * const StreamEventSchema = s.object({
75
+ * type: s.enum(['token', 'complete', 'error']),
76
+ * content: s.optional(s.string()),
77
+ * });
78
+ *
79
+ * router.get('/stream', sse({ output: StreamEventSchema }, async (c, stream) => {
80
+ * await stream.writeSSE({ data: JSON.stringify({ type: 'token', content: 'Hello' }) });
81
+ * await stream.writeSSE({ data: JSON.stringify({ type: 'complete' }) });
82
+ * stream.close();
83
+ * }));
84
+ * ```
85
+ */
86
+ output: Schema<TOutput, TOutput>;
87
+ }
51
88
  /**
52
89
  * Creates an SSE (Server-Sent Events) middleware for streaming updates to clients.
53
90
  *
@@ -58,7 +95,7 @@ export type SSEHandler<E extends Env = Env> = (c: Context<E>, stream: SSEStream)
58
95
  *
59
96
  * Use with router.get() to create an SSE endpoint:
60
97
  *
61
- * @example
98
+ * @example Basic SSE without typed output
62
99
  * ```typescript
63
100
  * import { createRouter, sse } from '@agentuity/runtime';
64
101
  *
@@ -83,9 +120,44 @@ export type SSEHandler<E extends Env = Env> = (c: Context<E>, stream: SSEStream)
83
120
  * }));
84
121
  * ```
85
122
  *
123
+ * @example SSE with typed output schema
124
+ * ```typescript
125
+ * import { createRouter, sse } from '@agentuity/runtime';
126
+ * import { s } from '@agentuity/schema';
127
+ *
128
+ * // Define your SSE event schema
129
+ * export const outputSchema = s.object({
130
+ * type: s.enum(['token', 'complete', 'error']),
131
+ * content: s.optional(s.string()),
132
+ * });
133
+ *
134
+ * const router = createRouter();
135
+ *
136
+ * // Pass schema as first argument for typed SSE routes
137
+ * router.get('/stream', sse({ output: outputSchema }, async (c, stream) => {
138
+ * await stream.writeSSE({ data: JSON.stringify({ type: 'token', content: 'Hello' }) });
139
+ * await stream.writeSSE({ data: JSON.stringify({ type: 'complete' }) });
140
+ * stream.close();
141
+ * }));
142
+ *
143
+ * // On the frontend, useEventStream will now have typed data:
144
+ * // const { data } = useEventStream('/api/stream');
145
+ * // data.type is 'token' | 'complete' | 'error'
146
+ * ```
147
+ *
86
148
  * @param handler - Handler function receiving context and SSE stream
149
+ * @param options - Optional configuration with output schema for type inference
87
150
  * @returns Hono handler for SSE streaming
88
151
  * @see https://github.com/agentuity/sdk/issues/471
152
+ * @see https://github.com/agentuity/sdk/issues/855
89
153
  */
90
154
  export declare function sse<E extends Env = Env>(handler: SSEHandler<E>): Handler<E>;
155
+ /**
156
+ * Creates an SSE middleware with typed output schema.
157
+ *
158
+ * @param options - Configuration object containing the output schema
159
+ * @param handler - Handler function receiving context and SSE stream
160
+ * @returns Hono handler for SSE streaming
161
+ */
162
+ export declare function sse<E extends Env = Env, TOutput = unknown>(options: SSEOptions<TOutput>, handler: SSEHandler<E>): Handler<E>;
91
163
  //# sourceMappingURL=sse.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"sse.d.ts","sourceRoot":"","sources":["../../src/handlers/sse.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,MAAM,CAAC;AAI7C,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,QAAQ,CAAC;AAElC;;;;GAIG;AACH,eAAO,MAAM,uBAAuB,uBAAuB,CAAC;AAE5D;;;GAGG;AACH,eAAO,MAAM,yBAAyB,yBAAyB,CAAC;AAEhE;;GAEG;AACH,MAAM,WAAW,UAAU;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,KAAK,CAAC,EAAE,MAAM,CAAC;CACf;AAED;;GAEG;AACH,MAAM,WAAW,SAAS;IACzB;;;;OAIG;IACH,KAAK,EAAE,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,UAAU,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IACvE;;OAEG;IACH,QAAQ,EAAE,CAAC,OAAO,EAAE,UAAU,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IACjD;;OAEG;IACH,OAAO,EAAE,CAAC,QAAQ,EAAE,MAAM,IAAI,KAAK,IAAI,CAAC;IACxC;;OAEG;IACH,KAAK,EAAE,MAAM,IAAI,CAAC;CAClB;AAED;;;GAGG;AACH,MAAM,MAAM,UAAU,CAAC,CAAC,SAAS,GAAG,GAAG,GAAG,IAAI,CAC7C,CAAC,EAAE,OAAO,CAAC,CAAC,CAAC,EACb,MAAM,EAAE,SAAS,KACb,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;AA2B1B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAsCG;AACH,wBAAgB,GAAG,CAAC,CAAC,SAAS,GAAG,GAAG,GAAG,EAAE,OAAO,EAAE,UAAU,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CA8I3E"}
1
+ {"version":3,"file":"sse.d.ts","sourceRoot":"","sources":["../../src/handlers/sse.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,MAAM,CAAC;AAI7C,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAEhD,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,QAAQ,CAAC;AAUlC;;;;GAIG;AACH,eAAO,MAAM,uBAAuB,uBAAuB,CAAC;AAE5D;;;GAGG;AACH,eAAO,MAAM,yBAAyB,yBAAyB,CAAC;AAEhE;;GAEG;AACH,MAAM,WAAW,UAAU;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,KAAK,CAAC,EAAE,MAAM,CAAC;CACf;AAED;;GAEG;AACH,MAAM,WAAW,SAAS;IACzB;;;;OAIG;IACH,KAAK,EAAE,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,UAAU,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IACvE;;OAEG;IACH,QAAQ,EAAE,CAAC,OAAO,EAAE,UAAU,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IACjD;;OAEG;IACH,OAAO,EAAE,CAAC,QAAQ,EAAE,MAAM,IAAI,KAAK,IAAI,CAAC;IACxC;;OAEG;IACH,KAAK,EAAE,MAAM,IAAI,CAAC;CAClB;AAED;;;GAGG;AACH,MAAM,MAAM,UAAU,CAAC,CAAC,SAAS,GAAG,GAAG,GAAG,IAAI,CAC7C,CAAC,EAAE,OAAO,CAAC,CAAC,CAAC,EACb,MAAM,EAAE,SAAS,KACb,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;AAE1B;;;;;;GAMG;AACH,MAAM,WAAW,UAAU,CAAC,OAAO,GAAG,OAAO;IAC5C;;;;;;;;;;;;;;;;;;;;;;;;;OAyBG;IACH,MAAM,EAAE,MAAM,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;CACjC;AA2BD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAiEG;AACH,wBAAgB,GAAG,CAAC,CAAC,SAAS,GAAG,GAAG,GAAG,EAAE,OAAO,EAAE,UAAU,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;AAC7E;;;;;;GAMG;AACH,wBAAgB,GAAG,CAAC,CAAC,SAAS,GAAG,GAAG,GAAG,EAAE,OAAO,GAAG,OAAO,EACzD,OAAO,EAAE,UAAU,CAAC,OAAO,CAAC,EAC5B,OAAO,EAAE,UAAU,CAAC,CAAC,CAAC,GACpB,OAAO,CAAC,CAAC,CAAC,CAAC"}
@@ -1,6 +1,11 @@
1
1
  import { stream as honoStream } from 'hono/streaming';
2
2
  import { context as otelContext, ROOT_CONTEXT } from '@opentelemetry/api';
3
+ import { StructuredError } from '@agentuity/core';
3
4
  import { getAgentAsyncLocalStorage } from '../_context';
5
+ /**
6
+ * Error thrown when sse() is called without a handler function.
7
+ */
8
+ const SSEHandlerMissingError = StructuredError('SSEHandlerMissingError', 'An SSE handler function is required. Use sse(handler) or sse({ output: schema }, handler).');
4
9
  /**
5
10
  * Context variable key for stream completion promise.
6
11
  * Used by middleware to defer session/thread saving until stream completes.
@@ -36,46 +41,15 @@ function formatSSEMessage(message) {
36
41
  text += '\n';
37
42
  return text;
38
43
  }
39
- /**
40
- * Creates an SSE (Server-Sent Events) middleware for streaming updates to clients.
41
- *
42
- * This implementation uses Hono's stream() helper instead of streamSSE() to ensure
43
- * compatibility with async operations that consume ReadableStreams internally
44
- * (like AI SDK's generateText/generateObject). The stream() helper uses a fire-and-forget
45
- * pattern that avoids "ReadableStream has already been used" errors.
46
- *
47
- * Use with router.get() to create an SSE endpoint:
48
- *
49
- * @example
50
- * ```typescript
51
- * import { createRouter, sse } from '@agentuity/runtime';
52
- *
53
- * const router = createRouter();
54
- *
55
- * router.get('/events', sse((c, stream) => {
56
- * let count = 0;
57
- * const interval = setInterval(() => {
58
- * stream.writeSSE({
59
- * data: `Event ${++count}`,
60
- * event: 'update'
61
- * });
62
- * if (count >= 10) {
63
- * clearInterval(interval);
64
- * stream.close();
65
- * }
66
- * }, 1000);
67
- *
68
- * stream.onAbort(() => {
69
- * clearInterval(interval);
70
- * });
71
- * }));
72
- * ```
73
- *
74
- * @param handler - Handler function receiving context and SSE stream
75
- * @returns Hono handler for SSE streaming
76
- * @see https://github.com/agentuity/sdk/issues/471
77
- */
78
- export function sse(handler) {
44
+ export function sse(handlerOrOptions, maybeHandler) {
45
+ // Determine if first arg is options or handler
46
+ const handler = typeof handlerOrOptions === 'function' ? handlerOrOptions : maybeHandler;
47
+ // Validate handler is provided - catches sse({ output }) without handler
48
+ if (!handler) {
49
+ throw new SSEHandlerMissingError();
50
+ }
51
+ // Note: options.output is captured for type inference but not used at runtime
52
+ // The CLI extracts this during build to generate typed route registries
79
53
  return (c) => {
80
54
  const asyncLocalStorage = getAgentAsyncLocalStorage();
81
55
  const capturedContext = asyncLocalStorage.getStore();
@@ -1 +1 @@
1
- {"version":3,"file":"sse.js","sourceRoot":"","sources":["../../src/handlers/sse.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"sse.js","sourceRoot":"","sources":["../../src/handlers/sse.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,49 @@
1
+ import type { Context, MiddlewareHandler } from 'hono';
2
+ import type { Env } from '../app';
3
+ import { WebRTCRoomManager, type WebRTCOptions } from '../webrtc-signaling';
4
+ export type { WebRTCOptions };
5
+ /**
6
+ * Handler function for WebRTC signaling connections.
7
+ * Receives the Hono context and WebRTCRoomManager.
8
+ */
9
+ export type WebRTCHandler<E extends Env = Env> = (c: Context<E>, roomManager: WebRTCRoomManager) => void | Promise<void>;
10
+ /**
11
+ * Creates a WebRTC signaling middleware for peer-to-peer communication.
12
+ *
13
+ * This middleware sets up a WebSocket-based signaling server that handles:
14
+ * - Room membership and peer discovery
15
+ * - SDP offer/answer relay
16
+ * - ICE candidate relay
17
+ *
18
+ * Use with router.get() to create a WebRTC signaling endpoint:
19
+ *
20
+ * @example
21
+ * ```typescript
22
+ * import { createRouter, webrtc } from '@agentuity/runtime';
23
+ *
24
+ * const router = createRouter();
25
+ *
26
+ * // Basic signaling endpoint
27
+ * router.get('/call/signal', webrtc());
28
+ *
29
+ * // With options
30
+ * router.get('/call/signal', webrtc({ maxPeers: 4 }));
31
+ *
32
+ * // With callbacks for monitoring
33
+ * router.get('/call/signal', webrtc({
34
+ * maxPeers: 2,
35
+ * callbacks: {
36
+ * onRoomCreated: (roomId) => console.log(`Room ${roomId} created`),
37
+ * onPeerJoin: (peerId, roomId) => console.log(`${peerId} joined ${roomId}`),
38
+ * onPeerLeave: (peerId, roomId, reason) => {
39
+ * console.log(`${peerId} left ${roomId}: ${reason}`);
40
+ * },
41
+ * },
42
+ * }));
43
+ * ```
44
+ *
45
+ * @param options - Configuration options for WebRTC signaling
46
+ * @returns Hono middleware handler for WebSocket upgrade
47
+ */
48
+ export declare function webrtc<E extends Env = Env>(options?: WebRTCOptions): MiddlewareHandler<E>;
49
+ //# sourceMappingURL=webrtc.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"webrtc.d.ts","sourceRoot":"","sources":["../../src/handlers/webrtc.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,iBAAiB,EAAE,MAAM,MAAM,CAAC;AAIvD,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,QAAQ,CAAC;AAClC,OAAO,EAAE,iBAAiB,EAAE,KAAK,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAG5E,YAAY,EAAE,aAAa,EAAE,CAAC;AAE9B;;;GAGG;AACH,MAAM,MAAM,aAAa,CAAC,CAAC,SAAS,GAAG,GAAG,GAAG,IAAI,CAChD,CAAC,EAAE,OAAO,CAAC,CAAC,CAAC,EACb,WAAW,EAAE,iBAAiB,KAC1B,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;AAE1B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAqCG;AACH,wBAAgB,MAAM,CAAC,CAAC,SAAS,GAAG,GAAG,GAAG,EAAE,OAAO,CAAC,EAAE,aAAa,GAAG,iBAAiB,CAAC,CAAC,CAAC,CAmEzF"}
@@ -0,0 +1,109 @@
1
+ import { upgradeWebSocket } from 'hono/bun';
2
+ import { context as otelContext, ROOT_CONTEXT } from '@opentelemetry/api';
3
+ import { getAgentAsyncLocalStorage } from '../_context';
4
+ import { WebRTCRoomManager } from '../webrtc-signaling';
5
+ /**
6
+ * Creates a WebRTC signaling middleware for peer-to-peer communication.
7
+ *
8
+ * This middleware sets up a WebSocket-based signaling server that handles:
9
+ * - Room membership and peer discovery
10
+ * - SDP offer/answer relay
11
+ * - ICE candidate relay
12
+ *
13
+ * Use with router.get() to create a WebRTC signaling endpoint:
14
+ *
15
+ * @example
16
+ * ```typescript
17
+ * import { createRouter, webrtc } from '@agentuity/runtime';
18
+ *
19
+ * const router = createRouter();
20
+ *
21
+ * // Basic signaling endpoint
22
+ * router.get('/call/signal', webrtc());
23
+ *
24
+ * // With options
25
+ * router.get('/call/signal', webrtc({ maxPeers: 4 }));
26
+ *
27
+ * // With callbacks for monitoring
28
+ * router.get('/call/signal', webrtc({
29
+ * maxPeers: 2,
30
+ * callbacks: {
31
+ * onRoomCreated: (roomId) => console.log(`Room ${roomId} created`),
32
+ * onPeerJoin: (peerId, roomId) => console.log(`${peerId} joined ${roomId}`),
33
+ * onPeerLeave: (peerId, roomId, reason) => {
34
+ * console.log(`${peerId} left ${roomId}: ${reason}`);
35
+ * },
36
+ * },
37
+ * }));
38
+ * ```
39
+ *
40
+ * @param options - Configuration options for WebRTC signaling
41
+ * @returns Hono middleware handler for WebSocket upgrade
42
+ */
43
+ export function webrtc(options) {
44
+ const roomManager = new WebRTCRoomManager(options);
45
+ const wsHandler = upgradeWebSocket((_c) => {
46
+ let currentWs;
47
+ // we need a Privder interface here with AsyncLocalStorage and KV
48
+ const asyncLocalStorage = getAgentAsyncLocalStorage();
49
+ const capturedContext = asyncLocalStorage.getStore();
50
+ return {
51
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
52
+ onOpen: (_event, ws) => {
53
+ otelContext.with(ROOT_CONTEXT, () => {
54
+ if (capturedContext) {
55
+ asyncLocalStorage.run(capturedContext, () => {
56
+ currentWs = {
57
+ onOpen: () => { },
58
+ onMessage: () => { },
59
+ onClose: () => { },
60
+ send: (data) => ws.send(data),
61
+ };
62
+ });
63
+ }
64
+ else {
65
+ currentWs = {
66
+ onOpen: () => { },
67
+ onMessage: () => { },
68
+ onClose: () => { },
69
+ send: (data) => ws.send(data),
70
+ };
71
+ }
72
+ });
73
+ },
74
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
75
+ onMessage: (event, _ws) => {
76
+ if (currentWs) {
77
+ otelContext.with(ROOT_CONTEXT, () => {
78
+ if (capturedContext) {
79
+ asyncLocalStorage.run(capturedContext, () => {
80
+ roomManager.handleMessage(currentWs, String(event.data));
81
+ });
82
+ }
83
+ else {
84
+ roomManager.handleMessage(currentWs, String(event.data));
85
+ }
86
+ });
87
+ }
88
+ },
89
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
90
+ onClose: (_event, _ws) => {
91
+ if (currentWs) {
92
+ otelContext.with(ROOT_CONTEXT, () => {
93
+ if (capturedContext) {
94
+ asyncLocalStorage.run(capturedContext, () => {
95
+ roomManager.handleDisconnect(currentWs);
96
+ });
97
+ }
98
+ else {
99
+ roomManager.handleDisconnect(currentWs);
100
+ }
101
+ });
102
+ }
103
+ },
104
+ };
105
+ });
106
+ const middleware = (c, next) => wsHandler(c, next);
107
+ return middleware;
108
+ }
109
+ //# sourceMappingURL=webrtc.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"webrtc.js","sourceRoot":"","sources":["../../src/handlers/webrtc.ts"],"names":[],"mappings":"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"}
package/dist/index.d.ts CHANGED
@@ -10,7 +10,8 @@ export { BEACON_SCRIPT, validateBeaconScript } from '@agentuity/frontend';
10
10
  export { internalExit } from './_process-protection';
11
11
  export { registerDevModeRoutes } from './devmode';
12
12
  export { type HonoEnv, type WebSocketConnection, createRouter } from './router';
13
- export { websocket, type WebSocketHandler, sse, type SSEMessage, type SSEStream, type SSEHandler, stream, type StreamHandler, cron, type CronHandler, type CronMetadata, } from './handlers';
13
+ export { websocket, type WebSocketHandler, sse, type SSEMessage, type SSEStream, type SSEHandler, type SSEOptions, stream, type StreamHandler, cron, type CronHandler, type CronMetadata, webrtc, type WebRTCHandler, } from './handlers';
14
+ export { type SignalMessage, type SDPDescription, type ICECandidate, type WebRTCOptions, type WebRTCSignalingCallbacks, WebRTCRoomManager, } from './webrtc-signaling';
14
15
  export { EvalHandlerResultSchema, type EvalContext, type EvalRunResultMetadata, type EvalHandlerResult, type EvalRunResultSuccess, type EvalRunResultError, type EvalRunResult, type CreateEvalRunRequest, type ExternalEvalMetadata, type EvalMetadata, type EvalFunction, type Eval, } from './eval';
15
16
  export { type ThreadEventName, type SessionEventName, type ThreadState, type MergeOperation, type Thread, type Session, type ThreadIDProvider, type ThreadProvider, type SessionProvider, generateId, DefaultThreadIDProvider, DefaultThread, LazyThreadState, } from './session';
16
17
  export { LocalThreadProvider } from './services/thread/local';
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,EACN,KAAK,YAAY,EACjB,KAAK,cAAc,EACnB,KAAK,kBAAkB,EACvB,KAAK,iBAAiB,EACtB,KAAK,gBAAgB,EACrB,KAAK,cAAc,EACnB,KAAK,KAAK,EACV,KAAK,iBAAiB,EACtB,KAAK,WAAW,EAChB,qBAAqB,EACrB,eAAe,EACf,KAAK,SAAS,EACd,KAAK,aAAa,EAClB,aAAa,EACb,cAAc,EACd,cAAc,EACd,KAAK,yBAAyB,EAC9B,WAAW,EACX,sBAAsB,EACtB,qBAAqB,EACrB,SAAS,EACT,cAAc,EACd,iBAAiB,EACjB,iBAAiB,GACjB,MAAM,SAAS,CAAC;AAGjB,OAAO,EACN,KAAK,SAAS,EACd,KAAK,iBAAiB,EACtB,KAAK,UAAU,EACf,KAAK,SAAS,EACd,KAAK,WAAW,EAChB,KAAK,gBAAgB,EACrB,KAAK,GAAG,EACR,KAAK,SAAS,EACd,KAAK,YAAY,EACjB,SAAS,EACT,MAAM,EACN,WAAW,EACX,YAAY,EACZ,WAAW,EACX,oBAAoB,EACpB,SAAS,GACT,MAAM,OAAO,CAAC;AAGf,OAAO,EAAE,uBAAuB,EAAE,KAAK,wBAAwB,EAAE,MAAM,QAAQ,CAAC;AAChF,OAAO,EAAE,gBAAgB,EAAE,mBAAmB,EAAE,MAAM,WAAW,CAAC;AAGlE,OAAO,EACN,oBAAoB,EACpB,oBAAoB,EACpB,oBAAoB,EACpB,2BAA2B,EAC3B,0BAA0B,EAC1B,gBAAgB,GAChB,MAAM,cAAc,CAAC;AAGtB,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AACzC,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAC7C,OAAO,EAAE,2BAA2B,EAAE,MAAM,uBAAuB,CAAC;AAGpE,OAAO,EAAE,aAAa,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AAG1E,OAAO,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AAGrD,OAAO,EAAE,qBAAqB,EAAE,MAAM,WAAW,CAAC;AAGlD,OAAO,EAAE,KAAK,OAAO,EAAE,KAAK,mBAAmB,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC;AAGhF,OAAO,EACN,SAAS,EACT,KAAK,gBAAgB,EACrB,GAAG,EACH,KAAK,UAAU,EACf,KAAK,SAAS,EACd,KAAK,UAAU,EACf,MAAM,EACN,KAAK,aAAa,EAClB,IAAI,EACJ,KAAK,WAAW,EAChB,KAAK,YAAY,GACjB,MAAM,YAAY,CAAC;AAGpB,OAAO,EACN,uBAAuB,EACvB,KAAK,WAAW,EAChB,KAAK,qBAAqB,EAC1B,KAAK,iBAAiB,EACtB,KAAK,oBAAoB,EACzB,KAAK,kBAAkB,EACvB,KAAK,aAAa,EAClB,KAAK,oBAAoB,EACzB,KAAK,oBAAoB,EACzB,KAAK,YAAY,EACjB,KAAK,YAAY,EACjB,KAAK,IAAI,GACT,MAAM,QAAQ,CAAC;AAGhB,OAAO,EACN,KAAK,eAAe,EACpB,KAAK,gBAAgB,EACrB,KAAK,WAAW,EAChB,KAAK,cAAc,EACnB,KAAK,MAAM,EACX,KAAK,OAAO,EACZ,KAAK,gBAAgB,EACrB,KAAK,cAAc,EACnB,KAAK,eAAe,EACpB,UAAU,EACV,uBAAuB,EACvB,aAAa,EACb,eAAe,GACf,MAAM,WAAW,CAAC;AAGnB,OAAO,EAAE,mBAAmB,EAAE,MAAM,yBAAyB,CAAC;AAG9D,OAAO,EACN,6BAA6B,EAC7B,qBAAqB,EACrB,4BAA4B,EAC5B,6BAA6B,GAC7B,MAAM,aAAa,CAAC;AAGrB,OAAO,EAAE,eAAe,EAAE,MAAM,OAAO,CAAC;AAGxC,OAAO,EAAE,KAAK,cAAc,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAG7D,YAAY,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;AAGvC,OAAO,EACN,SAAS,EACT,eAAe,EACf,YAAY,EACZ,SAAS,EACT,eAAe,EACf,SAAS,EACT,eAAe,EACf,gBAAgB,EAChB,iBAAiB,EACjB,cAAc,EACd,WAAW,EACX,SAAS,EACT,wBAAwB,GACxB,MAAM,WAAW,CAAC;AAGnB,OAAO,EAAE,mBAAmB,EAAE,MAAM,cAAc,CAAC;AAGnD,OAAO,EAAE,cAAc,EAAE,aAAa,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAG5F,OAAO,EACN,kBAAkB,EAClB,sBAAsB,EACtB,KAAK,wBAAwB,EAC7B,KAAK,aAAa,GAClB,MAAM,eAAe,CAAC;AAGvB,OAAO,EACN,wBAAwB,EACxB,yBAAyB,EACzB,wBAAwB,EACxB,6BAA6B,GAC7B,MAAM,oBAAoB,CAAC;AAG5B,OAAO,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAGhD,OAAO,EACN,iBAAiB,EACjB,YAAY,EACZ,eAAe,EACf,SAAS,EACT,YAAY,EACZ,oBAAoB,GACpB,MAAM,WAAW,CAAC;AAGnB,OAAO,EAAE,uBAAuB,EAAE,iBAAiB,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AAG7F,YAAY,EAAE,WAAW,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAEjE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAoCG;AAEH,MAAM,WAAW,QAAQ;CAAG;AAK5B,OAAO,EAAE,mBAAmB,EAAE,KAAK,uBAAuB,EAAE,MAAM,mBAAmB,CAAC;AAGtF,OAAO,EAAE,uBAAuB,EAAE,0BAA0B,EAAE,MAAM,gBAAgB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,EACN,KAAK,YAAY,EACjB,KAAK,cAAc,EACnB,KAAK,kBAAkB,EACvB,KAAK,iBAAiB,EACtB,KAAK,gBAAgB,EACrB,KAAK,cAAc,EACnB,KAAK,KAAK,EACV,KAAK,iBAAiB,EACtB,KAAK,WAAW,EAChB,qBAAqB,EACrB,eAAe,EACf,KAAK,SAAS,EACd,KAAK,aAAa,EAClB,aAAa,EACb,cAAc,EACd,cAAc,EACd,KAAK,yBAAyB,EAC9B,WAAW,EACX,sBAAsB,EACtB,qBAAqB,EACrB,SAAS,EACT,cAAc,EACd,iBAAiB,EACjB,iBAAiB,GACjB,MAAM,SAAS,CAAC;AAGjB,OAAO,EACN,KAAK,SAAS,EACd,KAAK,iBAAiB,EACtB,KAAK,UAAU,EACf,KAAK,SAAS,EACd,KAAK,WAAW,EAChB,KAAK,gBAAgB,EACrB,KAAK,GAAG,EACR,KAAK,SAAS,EACd,KAAK,YAAY,EACjB,SAAS,EACT,MAAM,EACN,WAAW,EACX,YAAY,EACZ,WAAW,EACX,oBAAoB,EACpB,SAAS,GACT,MAAM,OAAO,CAAC;AAGf,OAAO,EAAE,uBAAuB,EAAE,KAAK,wBAAwB,EAAE,MAAM,QAAQ,CAAC;AAChF,OAAO,EAAE,gBAAgB,EAAE,mBAAmB,EAAE,MAAM,WAAW,CAAC;AAGlE,OAAO,EACN,oBAAoB,EACpB,oBAAoB,EACpB,oBAAoB,EACpB,2BAA2B,EAC3B,0BAA0B,EAC1B,gBAAgB,GAChB,MAAM,cAAc,CAAC;AAGtB,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AACzC,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAC7C,OAAO,EAAE,2BAA2B,EAAE,MAAM,uBAAuB,CAAC;AAGpE,OAAO,EAAE,aAAa,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AAG1E,OAAO,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AAGrD,OAAO,EAAE,qBAAqB,EAAE,MAAM,WAAW,CAAC;AAGlD,OAAO,EAAE,KAAK,OAAO,EAAE,KAAK,mBAAmB,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC;AAGhF,OAAO,EACN,SAAS,EACT,KAAK,gBAAgB,EACrB,GAAG,EACH,KAAK,UAAU,EACf,KAAK,SAAS,EACd,KAAK,UAAU,EACf,KAAK,UAAU,EACf,MAAM,EACN,KAAK,aAAa,EAClB,IAAI,EACJ,KAAK,WAAW,EAChB,KAAK,YAAY,EACjB,MAAM,EACN,KAAK,aAAa,GAClB,MAAM,YAAY,CAAC;AAGpB,OAAO,EACN,KAAK,aAAa,EAClB,KAAK,cAAc,EACnB,KAAK,YAAY,EACjB,KAAK,aAAa,EAClB,KAAK,wBAAwB,EAC7B,iBAAiB,GACjB,MAAM,oBAAoB,CAAC;AAG5B,OAAO,EACN,uBAAuB,EACvB,KAAK,WAAW,EAChB,KAAK,qBAAqB,EAC1B,KAAK,iBAAiB,EACtB,KAAK,oBAAoB,EACzB,KAAK,kBAAkB,EACvB,KAAK,aAAa,EAClB,KAAK,oBAAoB,EACzB,KAAK,oBAAoB,EACzB,KAAK,YAAY,EACjB,KAAK,YAAY,EACjB,KAAK,IAAI,GACT,MAAM,QAAQ,CAAC;AAGhB,OAAO,EACN,KAAK,eAAe,EACpB,KAAK,gBAAgB,EACrB,KAAK,WAAW,EAChB,KAAK,cAAc,EACnB,KAAK,MAAM,EACX,KAAK,OAAO,EACZ,KAAK,gBAAgB,EACrB,KAAK,cAAc,EACnB,KAAK,eAAe,EACpB,UAAU,EACV,uBAAuB,EACvB,aAAa,EACb,eAAe,GACf,MAAM,WAAW,CAAC;AAGnB,OAAO,EAAE,mBAAmB,EAAE,MAAM,yBAAyB,CAAC;AAG9D,OAAO,EACN,6BAA6B,EAC7B,qBAAqB,EACrB,4BAA4B,EAC5B,6BAA6B,GAC7B,MAAM,aAAa,CAAC;AAGrB,OAAO,EAAE,eAAe,EAAE,MAAM,OAAO,CAAC;AAGxC,OAAO,EAAE,KAAK,cAAc,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAG7D,YAAY,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;AAGvC,OAAO,EACN,SAAS,EACT,eAAe,EACf,YAAY,EACZ,SAAS,EACT,eAAe,EACf,SAAS,EACT,eAAe,EACf,gBAAgB,EAChB,iBAAiB,EACjB,cAAc,EACd,WAAW,EACX,SAAS,EACT,wBAAwB,GACxB,MAAM,WAAW,CAAC;AAGnB,OAAO,EAAE,mBAAmB,EAAE,MAAM,cAAc,CAAC;AAGnD,OAAO,EAAE,cAAc,EAAE,aAAa,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAG5F,OAAO,EACN,kBAAkB,EAClB,sBAAsB,EACtB,KAAK,wBAAwB,EAC7B,KAAK,aAAa,GAClB,MAAM,eAAe,CAAC;AAGvB,OAAO,EACN,wBAAwB,EACxB,yBAAyB,EACzB,wBAAwB,EACxB,6BAA6B,GAC7B,MAAM,oBAAoB,CAAC;AAG5B,OAAO,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAGhD,OAAO,EACN,iBAAiB,EACjB,YAAY,EACZ,eAAe,EACf,SAAS,EACT,YAAY,EACZ,oBAAoB,GACpB,MAAM,WAAW,CAAC;AAGnB,OAAO,EAAE,uBAAuB,EAAE,iBAAiB,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AAG7F,YAAY,EAAE,WAAW,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAEjE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAoCG;AAEH,MAAM,WAAW,QAAQ;CAAG;AAK5B,OAAO,EAAE,mBAAmB,EAAE,KAAK,uBAAuB,EAAE,MAAM,mBAAmB,CAAC;AAGtF,OAAO,EAAE,uBAAuB,EAAE,0BAA0B,EAAE,MAAM,gBAAgB,CAAC"}
package/dist/index.js CHANGED
@@ -19,8 +19,10 @@ export { internalExit } from './_process-protection';
19
19
  export { registerDevModeRoutes } from './devmode';
20
20
  // router.ts exports
21
21
  export { createRouter } from './router';
22
- // protocol handler exports (websocket, sse, stream, cron)
23
- export { websocket, sse, stream, cron, } from './handlers';
22
+ // protocol handler exports (websocket, sse, stream, cron, webrtc)
23
+ export { websocket, sse, stream, cron, webrtc, } from './handlers';
24
+ // webrtc-signaling.ts exports
25
+ export { WebRTCRoomManager, } from './webrtc-signaling';
24
26
  // eval.ts exports
25
27
  export { EvalHandlerResultSchema, } from './eval';
26
28
  // session.ts exports