kernl 0.9.0 → 0.10.0

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
1
 
2
- > kernl@0.9.0 build /home/runner/work/kernl/kernl/packages/kernl
2
+ > kernl@0.10.0 build /home/runner/work/kernl/kernl/packages/kernl
3
3
  > tsc && tsc-alias --resolve-full-paths
4
4
 
package/CHANGELOG.md CHANGED
@@ -1,5 +1,38 @@
1
1
  # @kernl/core
2
2
 
3
+ ## 0.10.0
4
+
5
+ ### Minor Changes
6
+
7
+ - f593374: Add realtime voice agents with multi-provider support.
8
+ - `RealtimeAgent` and `RealtimeSession` for voice-enabled AI agents
9
+ - OpenAI GPT-4o realtime with WebSocket streaming
10
+ - xAI Grok realtime with OpenAI-compatible protocol
11
+ - React hooks: `useRealtime`, `useBrowserAudio`, `LiveWaveform`
12
+ - Ephemeral credential pattern for secure browser connections
13
+ - Tool execution with client-side context support
14
+
15
+ ### Patch Changes
16
+
17
+ - Updated dependencies [f593374]
18
+ - @kernl-sdk/protocol@0.4.0
19
+ - @kernl-sdk/retrieval@0.1.6
20
+
21
+ ## 0.9.1
22
+
23
+ ### Patch Changes
24
+
25
+ - 25e46e7: Move zod to peerDependencies to prevent version conflicts
26
+
27
+ Consumers should add `zod` as a direct dependency in their project. This ensures
28
+ a single zod instance is used across all packages, avoiding type incompatibilities
29
+ that could cause TypeScript to hang during type checking.
30
+
31
+ - Updated dependencies [25e46e7]
32
+ - @kernl-sdk/shared@0.3.1
33
+ - @kernl-sdk/protocol@0.3.1
34
+ - @kernl-sdk/retrieval@0.1.5
35
+
3
36
  ## 0.9.0
4
37
 
5
38
  ### Minor Changes
package/dist/index.d.ts CHANGED
@@ -2,9 +2,10 @@ export { Kernl } from "./kernl/index.js";
2
2
  export type { KernlOptions, StorageOptions, AgentRegistry, ModelRegistry, } from "./kernl/index.js";
3
3
  export { Agent } from "./agent.js";
4
4
  export { Context } from "./context.js";
5
+ export { RealtimeAgent, RealtimeSession, WebSocketTransport } from "./realtime/index.js";
6
+ export type { RealtimeAgentConfig, RealtimeAgentVoiceConfig, RealtimeSessionOptions, WebSocketTransportOptions, } from "./realtime/index.js";
5
7
  export { tool, Toolkit, FunctionToolkit, MCPToolkit } from "./tool/index.js";
6
8
  export { MCPServerSSE } from "./mcp/sse.js";
7
- export { MCPServerStdio } from "./mcp/stdio.js";
8
9
  export { MCPServerStreamableHttp } from "./mcp/http.js";
9
10
  export type { MThread as Thread, MThreadEvent as ThreadEvent, MThreadEventBase as ThreadEventBase, } from "./api/models/index.js";
10
11
  export type { RThreadsListParams as ThreadsListParams, RThreadGetOptions as ThreadGetOptions, RThreadHistoryParams as ThreadHistoryParams, RThreadCreateParams as ThreadCreateParams, RThreadUpdateParams as ThreadUpdateParams, } from "./api/resources/threads/index.js";
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,SAAS,CAAC;AAChC,YAAY,EACV,YAAY,EACZ,cAAc,EACd,aAAa,EACb,aAAa,GACd,MAAM,SAAS,CAAC;AACjB,OAAO,EAAE,KAAK,EAAE,MAAM,SAAS,CAAC;AAChC,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAIpC,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,eAAe,EAAE,UAAU,EAAE,MAAM,QAAQ,CAAC;AACpE,OAAO,EAAE,YAAY,EAAE,MAAM,WAAW,CAAC;AACzC,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAC7C,OAAO,EAAE,uBAAuB,EAAE,MAAM,YAAY,CAAC;AAIrD,YAAY,EACV,OAAO,IAAI,MAAM,EACjB,YAAY,IAAI,WAAW,EAC3B,gBAAgB,IAAI,eAAe,GACpC,MAAM,cAAc,CAAC;AAEtB,YAAY,EACV,kBAAkB,IAAI,iBAAiB,EACvC,iBAAiB,IAAI,gBAAgB,EACrC,oBAAoB,IAAI,mBAAmB,EAC3C,mBAAmB,IAAI,kBAAkB,EACzC,mBAAmB,IAAI,kBAAkB,GAC1C,MAAM,yBAAyB,CAAC;AAEjC,OAAO,EACL,aAAa,EACb,KAAK,WAAW,EAChB,KAAK,iBAAiB,GACvB,MAAM,gBAAgB,CAAC;AAIxB,YAAY,EACV,WAAW,EACX,SAAS,EACT,YAAY,EACZ,YAAY,EACZ,oBAAoB,EACpB,aAAa,EACb,iBAAiB,EACjB,SAAS,EACT,YAAY,EACZ,WAAW,GACZ,MAAM,WAAW,CAAC;AAGnB,OAAO,EAAE,MAAM,EAAE,iBAAiB,EAAE,MAAM,UAAU,CAAC;AACrD,YAAY,EACV,WAAW,EACX,WAAW,EACX,SAAS,EACT,YAAY,EACZ,mBAAmB,EACnB,YAAY,EACZ,UAAU,EACV,kBAAkB,EAClB,YAAY,EACZ,iBAAiB,EACjB,iBAAiB,EACjB,qBAAqB,EACrB,uBAAuB,EACvB,eAAe,EACf,iBAAiB,EACjB,gBAAgB,EAChB,kBAAkB,EAClB,mBAAmB,EACnB,oBAAoB,EACpB,YAAY,EACZ,aAAa,EACb,UAAU,EACV,eAAe,GAChB,MAAM,UAAU,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,SAAS,CAAC;AAChC,YAAY,EACV,YAAY,EACZ,cAAc,EACd,aAAa,EACb,aAAa,GACd,MAAM,SAAS,CAAC;AACjB,OAAO,EAAE,KAAK,EAAE,MAAM,SAAS,CAAC;AAChC,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAIpC,OAAO,EAAE,aAAa,EAAE,eAAe,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAChF,YAAY,EACV,mBAAmB,EACnB,wBAAwB,EACxB,sBAAsB,EACtB,yBAAyB,GAC1B,MAAM,YAAY,CAAC;AAIpB,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,eAAe,EAAE,UAAU,EAAE,MAAM,QAAQ,CAAC;AACpE,OAAO,EAAE,YAAY,EAAE,MAAM,WAAW,CAAC;AACzC,OAAO,EAAE,uBAAuB,EAAE,MAAM,YAAY,CAAC;AAIrD,YAAY,EACV,OAAO,IAAI,MAAM,EACjB,YAAY,IAAI,WAAW,EAC3B,gBAAgB,IAAI,eAAe,GACpC,MAAM,cAAc,CAAC;AAEtB,YAAY,EACV,kBAAkB,IAAI,iBAAiB,EACvC,iBAAiB,IAAI,gBAAgB,EACrC,oBAAoB,IAAI,mBAAmB,EAC3C,mBAAmB,IAAI,kBAAkB,EACzC,mBAAmB,IAAI,kBAAkB,GAC1C,MAAM,yBAAyB,CAAC;AAEjC,OAAO,EACL,aAAa,EACb,KAAK,WAAW,EAChB,KAAK,iBAAiB,GACvB,MAAM,gBAAgB,CAAC;AAIxB,YAAY,EACV,WAAW,EACX,SAAS,EACT,YAAY,EACZ,YAAY,EACZ,oBAAoB,EACpB,aAAa,EACb,iBAAiB,EACjB,SAAS,EACT,YAAY,EACZ,WAAW,GACZ,MAAM,WAAW,CAAC;AAGnB,OAAO,EAAE,MAAM,EAAE,iBAAiB,EAAE,MAAM,UAAU,CAAC;AACrD,YAAY,EACV,WAAW,EACX,WAAW,EACX,SAAS,EACT,YAAY,EACZ,mBAAmB,EACnB,YAAY,EACZ,UAAU,EACV,kBAAkB,EAClB,YAAY,EACZ,iBAAiB,EACjB,iBAAiB,EACjB,qBAAqB,EACrB,uBAAuB,EACvB,eAAe,EACf,iBAAiB,EACjB,gBAAgB,EAChB,kBAAkB,EAClB,mBAAmB,EACnB,oBAAoB,EACpB,YAAY,EACZ,aAAa,EACb,UAAU,EACV,eAAe,GAChB,MAAM,UAAU,CAAC"}
package/dist/index.js CHANGED
@@ -1,10 +1,11 @@
1
1
  export { Kernl } from "./kernl/index.js";
2
2
  export { Agent } from "./agent.js";
3
3
  export { Context } from "./context.js";
4
+ // --- realtime ---
5
+ export { RealtimeAgent, RealtimeSession, WebSocketTransport } from "./realtime/index.js";
4
6
  // --- tools --
5
7
  export { tool, Toolkit, FunctionToolkit, MCPToolkit } from "./tool/index.js";
6
8
  export { MCPServerSSE } from "./mcp/sse.js";
7
- export { MCPServerStdio } from "./mcp/stdio.js";
8
9
  export { MCPServerStreamableHttp } from "./mcp/http.js";
9
10
  export { THREAD_STATES, } from "./thread/types.js";
10
11
  // --- memory ---
@@ -1 +1 @@
1
- {"version":3,"file":"env.d.ts","sourceRoot":"","sources":["../../src/lib/env.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB;;;;;GAKG;AACH,QAAA,MAAM,SAAS;;;;;;;;;;;;;;;;;iBAab,CAAC;AAEH;;;;;;GAMG;AACH,eAAO,MAAM,GAAG;;;;CAA+B,CAAC;AAEhD;;GAEG;AACH,MAAM,MAAM,GAAG,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,SAAS,CAAC,CAAC"}
1
+ {"version":3,"file":"env.d.ts","sourceRoot":"","sources":["../../src/lib/env.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB;;;;;GAKG;AACH,QAAA,MAAM,SAAS;;;;;;;;;;;;;;;;;iBAab,CAAC;AAEH;;;;;;GAMG;AACH,eAAO,MAAM,GAAG;;;;CAEf,CAAC;AAEF;;GAEG;AACH,MAAM,MAAM,GAAG,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,SAAS,CAAC,CAAC"}
package/dist/lib/env.js CHANGED
@@ -26,4 +26,4 @@ const envSchema = z.object({
26
26
  * import { env } from '@/env';
27
27
  * console.log(env.LOG_LEVEL);
28
28
  */
29
- export const env = envSchema.parse(process.env);
29
+ export const env = envSchema.parse(typeof process !== "undefined" ? process.env : {});
@@ -1,24 +1,10 @@
1
- import { EventEmitter } from "node:events";
1
+ import { Emitter } from "@kernl-sdk/shared";
2
2
  import { Agent } from "./agent.js";
3
3
  import { Context, UnknownContext } from "./context.js";
4
4
  import { Tool } from "./tool/index.js";
5
5
  import type { ToolCall } from "@kernl-sdk/protocol";
6
6
  import { AgentOutputType } from "./agent/types.js";
7
7
  import { TextOutput } from "./thread/types.js";
8
- export type EventEmitterEvents = Record<string, any[]>;
9
- /**
10
- * Generic typed event emitter that wraps Node's EventEmitter with type safety
11
- */
12
- declare class TypedEventEmitter<EventTypes extends EventEmitterEvents = Record<string, any[]>> extends EventEmitter {
13
- on<K extends keyof EventTypes>(event: K, listener: (...args: EventTypes[K]) => void): this;
14
- on(event: string | symbol, listener: (...args: any[]) => void): this;
15
- off<K extends keyof EventTypes>(event: K, listener: (...args: EventTypes[K]) => void): this;
16
- off(event: string | symbol, listener: (...args: any[]) => void): this;
17
- emit<K extends keyof EventTypes>(event: K, ...args: EventTypes[K]): boolean;
18
- emit(event: string | symbol, ...args: any[]): boolean;
19
- once<K extends keyof EventTypes>(event: K, listener: (...args: EventTypes[K]) => void): this;
20
- once(event: string | symbol, listener: (...args: any[]) => void): this;
21
- }
22
8
  export type AgentHookEvents<TContext = UnknownContext, TOutput extends AgentOutputType = TextOutput> = {
23
9
  /**
24
10
  * @param context - The context of the run
@@ -60,7 +46,7 @@ export type AgentHookEvents<TContext = UnknownContext, TOutput extends AgentOutp
60
46
  * Event emitter that every Agent instance inherits from and that emits events for the lifecycle
61
47
  * of the agent.
62
48
  */
63
- export declare class AgentHooks<TContext = UnknownContext, TOutput extends AgentOutputType = TextOutput> extends TypedEventEmitter<AgentHookEvents<TContext, TOutput>> {
49
+ export declare class AgentHooks<TContext = UnknownContext, TOutput extends AgentOutputType = TextOutput> extends Emitter<AgentHookEvents<TContext, TOutput>> {
64
50
  }
65
51
  /**
66
52
  * Events emitted by the kernl during execution.
@@ -127,7 +113,6 @@ export type KernlHookEvents<TContext = UnknownContext, TOutput extends AgentOutp
127
113
  /**
128
114
  * Event emitter that the kernl uses to emit events for the lifecycle of every agent run.
129
115
  */
130
- export declare class KernlHooks<TContext = UnknownContext, TOutput extends AgentOutputType = TextOutput> extends TypedEventEmitter<KernlHookEvents<TContext, TOutput>> {
116
+ export declare class KernlHooks<TContext = UnknownContext, TOutput extends AgentOutputType = TextOutput> extends Emitter<KernlHookEvents<TContext, TOutput>> {
131
117
  }
132
- export {};
133
118
  //# sourceMappingURL=lifecycle.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"lifecycle.d.ts","sourceRoot":"","sources":["../src/lifecycle.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"lifecycle.d.ts","sourceRoot":"","sources":["../src/lifecycle.ts"],"names":[],"mappings":"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"}
package/dist/lifecycle.js CHANGED
@@ -1,29 +1,12 @@
1
- import { EventEmitter } from "node:events";
2
- /**
3
- * Generic typed event emitter that wraps Node's EventEmitter with type safety
4
- */
5
- class TypedEventEmitter extends EventEmitter {
6
- on(event, listener) {
7
- return super.on(event, listener);
8
- }
9
- off(event, listener) {
10
- return super.off(event, listener);
11
- }
12
- emit(event, ...args) {
13
- return super.emit(event, ...args);
14
- }
15
- once(event, listener) {
16
- return super.once(event, listener);
17
- }
18
- }
1
+ import { Emitter } from "@kernl-sdk/shared";
19
2
  /**
20
3
  * Event emitter that every Agent instance inherits from and that emits events for the lifecycle
21
4
  * of the agent.
22
5
  */
23
- export class AgentHooks extends TypedEventEmitter {
6
+ export class AgentHooks extends Emitter {
24
7
  }
25
8
  /**
26
9
  * Event emitter that the kernl uses to emit events for the lifecycle of every agent run.
27
10
  */
28
- export class KernlHooks extends TypedEventEmitter {
11
+ export class KernlHooks extends Emitter {
29
12
  }
@@ -68,7 +68,7 @@ export class Memory {
68
68
  return this._search.query({
69
69
  query: [{ text: q.query, tvec: tvec ?? undefined }],
70
70
  filter: q.filter ? MEMORY_FILTER.encode(q.filter) : undefined,
71
- topK: q.limit ?? 20,
71
+ limit: q.limit ?? 20,
72
72
  });
73
73
  }
74
74
  /**
@@ -1,5 +1,5 @@
1
1
  export * from "./types.js";
2
- export * from "./channel.js";
3
2
  export * from "./agent.js";
4
3
  export * from "./session.js";
4
+ export * from "./transport.js";
5
5
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/realtime/index.ts"],"names":[],"mappings":"AAAA,cAAc,SAAS,CAAC;AACxB,cAAc,WAAW,CAAC;AAC1B,cAAc,SAAS,CAAC;AACxB,cAAc,WAAW,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/realtime/index.ts"],"names":[],"mappings":"AAAA,cAAc,SAAS,CAAC;AACxB,cAAc,SAAS,CAAC;AACxB,cAAc,WAAW,CAAC;AAC1B,cAAc,aAAa,CAAC"}
@@ -1,4 +1,4 @@
1
1
  export * from "./types.js";
2
- export * from "./channel.js";
3
2
  export * from "./agent.js";
4
3
  export * from "./session.js";
4
+ export * from "./transport.js";
@@ -1,16 +1,25 @@
1
- import { EventEmitter } from "node:events";
2
- import { RealtimeModel } from "@kernl-sdk/protocol";
1
+ import { Emitter } from "@kernl-sdk/shared";
2
+ import { RealtimeModel, RealtimeServerEvent, RealtimeChannel, TransportStatus } from "@kernl-sdk/protocol";
3
3
  import { Context, UnknownContext } from "../context.js";
4
4
  import { RealtimeAgent } from "./agent.js";
5
- import type { RealtimeChannel } from "./channel.js";
6
5
  import type { RealtimeSessionOptions } from "./types.js";
6
+ /**
7
+ * Events emitted by a realtime session.
8
+ */
9
+ export type RealtimeSessionEvents = {
10
+ audio: [event: RealtimeServerEvent];
11
+ transcript: [event: RealtimeServerEvent];
12
+ text: [event: RealtimeServerEvent];
13
+ error: [error: Error];
14
+ status: [status: TransportStatus];
15
+ };
7
16
  /**
8
17
  * A realtime session manages the connection to a realtime model.
9
18
  *
10
19
  * Handles the bidirectional communication between an agent and a model,
11
20
  * including audio I/O (via channels), tool execution, and event routing.
12
21
  */
13
- export declare class RealtimeSession<TContext = UnknownContext> extends EventEmitter {
22
+ export declare class RealtimeSession<TContext = UnknownContext> extends Emitter<RealtimeSessionEvents> {
14
23
  /**
15
24
  * Session ID. Null until connected.
16
25
  */
@@ -48,24 +57,6 @@ export declare class RealtimeSession<TContext = UnknownContext> extends EventEmi
48
57
  * Initialize event listeners and send session configuration.
49
58
  */
50
59
  private init;
51
- /**
52
- * Build session configuration from agent.
53
- */
54
- private buildSessionConfig;
55
- /**
56
- * Handle incoming events from the connection.
57
- *
58
- * Maps protocol events to simplified user-facing events:
59
- * - 'audio' - audio output from assistant
60
- * - 'transcript' - speech transcriptions (user or assistant)
61
- * - 'text' - text output from assistant
62
- * - 'error' - errors
63
- */
64
- private onEvent;
65
- /**
66
- * Execute tool calls from the model.
67
- */
68
- private performActions;
69
60
  /**
70
61
  * Send audio to the model.
71
62
  */
@@ -94,5 +85,23 @@ export declare class RealtimeSession<TContext = UnknownContext> extends EventEmi
94
85
  * Close the session and release resources.
95
86
  */
96
87
  close(): void;
88
+ /**
89
+ * Build session configuration from agent.
90
+ */
91
+ private buildSessionConfig;
92
+ /**
93
+ * Handle incoming events from the connection.
94
+ *
95
+ * Maps protocol events to simplified user-facing events:
96
+ * - 'audio' - audio output from assistant
97
+ * - 'transcript' - speech transcriptions (user or assistant)
98
+ * - 'text' - text output from assistant
99
+ * - 'error' - errors
100
+ */
101
+ private onEvent;
102
+ /**
103
+ * Execute tool calls from the model.
104
+ */
105
+ private performActions;
97
106
  }
98
107
  //# sourceMappingURL=session.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"session.d.ts","sourceRoot":"","sources":["../../src/realtime/session.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAE3C,OAAO,EACL,aAAa,EAMd,MAAM,qBAAqB,CAAC;AAE7B,OAAO,EAAE,OAAO,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;AAGpD,OAAO,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AACxC,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,WAAW,CAAC;AACjD,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,SAAS,CAAC;AAEtD;;;;;GAKG;AACH,qBAAa,eAAe,CAAC,QAAQ,GAAG,cAAc,CAAE,SAAQ,YAAY;IAC1E;;OAEG;IACH,EAAE,EAAE,MAAM,GAAG,IAAI,CAAQ;IAEzB;;OAEG;IACH,QAAQ,CAAC,KAAK,EAAE,aAAa,CAAC,QAAQ,CAAC,CAAC;IAExC;;OAEG;IACH,QAAQ,CAAC,KAAK,EAAE,aAAa,CAAC;IAE9B;;OAEG;IACH,QAAQ,CAAC,OAAO,EAAE,eAAe,GAAG,IAAI,CAAC;IAEzC;;OAEG;IACH,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC,QAAQ,CAAC,CAAC;IAEpC;;OAEG;IACH,OAAO,CAAC,UAAU,CAAmC;IAErD;;OAEG;IACH,OAAO,CAAC,OAAO,CAAmC;gBAGhD,KAAK,EAAE,aAAa,CAAC,QAAQ,CAAC,EAC9B,OAAO,GAAE,sBAAsB,CAAC,QAAQ,CAAM;IAiBhD;;OAEG;IACG,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IAkB9B;;OAEG;YACW,IAAI;IAalB;;OAEG;YACW,kBAAkB;IAUhC;;;;;;;;OAQG;IACH,OAAO,CAAC,OAAO;IAuCf;;OAEG;YACW,cAAc;IAyB5B;;OAEG;IACH,SAAS,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI;IAI9B;;OAEG;IACH,MAAM,IAAI,IAAI;IAId;;OAEG;IACH,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IAO/B;;OAEG;IACH,SAAS,IAAI,IAAI;IAKjB;;OAEG;IACH,IAAI,IAAI,IAAI;IAIZ;;OAEG;IACH,MAAM,IAAI,IAAI;IAId;;OAEG;IACH,KAAK,IAAI,IAAI;CAId"}
1
+ {"version":3,"file":"session.d.ts","sourceRoot":"","sources":["../../src/realtime/session.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,mBAAmB,CAAC;AAC5C,OAAO,EACL,aAAa,EAEb,mBAAmB,EAEnB,eAAe,EAEf,eAAe,EAEhB,MAAM,qBAAqB,CAAC;AAE7B,OAAO,EAAE,OAAO,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;AAGpD,OAAO,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AACxC,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,SAAS,CAAC;AAEtD;;GAEG;AACH,MAAM,MAAM,qBAAqB,GAAG;IAClC,KAAK,EAAE,CAAC,KAAK,EAAE,mBAAmB,CAAC,CAAC;IACpC,UAAU,EAAE,CAAC,KAAK,EAAE,mBAAmB,CAAC,CAAC;IACzC,IAAI,EAAE,CAAC,KAAK,EAAE,mBAAmB,CAAC,CAAC;IACnC,KAAK,EAAE,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;IACtB,MAAM,EAAE,CAAC,MAAM,EAAE,eAAe,CAAC,CAAC;CACnC,CAAC;AAEF;;;;;GAKG;AACH,qBAAa,eAAe,CAC1B,QAAQ,GAAG,cAAc,CACzB,SAAQ,OAAO,CAAC,qBAAqB,CAAC;IACtC;;OAEG;IACH,EAAE,EAAE,MAAM,GAAG,IAAI,CAAQ;IAEzB;;OAEG;IACH,QAAQ,CAAC,KAAK,EAAE,aAAa,CAAC,QAAQ,CAAC,CAAC;IAExC;;OAEG;IACH,QAAQ,CAAC,KAAK,EAAE,aAAa,CAAC;IAE9B;;OAEG;IACH,QAAQ,CAAC,OAAO,EAAE,eAAe,GAAG,IAAI,CAAC;IAEzC;;OAEG;IACH,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC,QAAQ,CAAC,CAAC;IAEpC;;OAEG;IACH,OAAO,CAAC,UAAU,CAAmC;IAErD;;OAEG;IACH,OAAO,CAAC,OAAO,CAAmC;gBAGhD,KAAK,EAAE,aAAa,CAAC,QAAQ,CAAC,EAC9B,OAAO,GAAE,sBAAsB,CAAC,QAAQ,CAAM;IAiBhD;;OAEG;IACG,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IAwB9B;;OAEG;YACW,IAAI;IAalB;;OAEG;IACH,SAAS,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI;IAI9B;;OAEG;IACH,MAAM,IAAI,IAAI;IAId;;OAEG;IACH,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IAO/B;;OAEG;IACH,SAAS,IAAI,IAAI;IAKjB;;OAEG;IACH,IAAI,IAAI,IAAI;IAIZ;;OAEG;IACH,MAAM,IAAI,IAAI;IAId;;OAEG;IACH,KAAK,IAAI,IAAI;IAKb;;OAEG;YACW,kBAAkB;IAehC;;;;;;;;OAQG;IACH,OAAO,CAAC,OAAO;IAuCf;;OAEG;YACW,cAAc;CAwB7B"}
@@ -1,4 +1,4 @@
1
- import { EventEmitter } from "node:events";
1
+ import { Emitter } from "@kernl-sdk/shared";
2
2
  import { message, } from "@kernl-sdk/protocol";
3
3
  import { Context } from "../context.js";
4
4
  import { MisconfiguredError } from "../lib/error.js";
@@ -8,7 +8,7 @@ import { MisconfiguredError } from "../lib/error.js";
8
8
  * Handles the bidirectional communication between an agent and a model,
9
9
  * including audio I/O (via channels), tool execution, and event routing.
10
10
  */
11
- export class RealtimeSession extends EventEmitter {
11
+ export class RealtimeSession extends Emitter {
12
12
  /**
13
13
  * Session ID. Null until connected.
14
14
  */
@@ -56,6 +56,7 @@ export class RealtimeSession extends EventEmitter {
56
56
  const options = {
57
57
  ...this.options.connectOptions,
58
58
  sessionConfig,
59
+ credential: this.options.credential ?? this.options.connectOptions?.credential,
59
60
  };
60
61
  this.connection = this.options.transport
61
62
  ? await this.options.transport.connect(this.model, options)
@@ -63,6 +64,9 @@ export class RealtimeSession extends EventEmitter {
63
64
  this.connection.on("event", this.onEvent.bind(this));
64
65
  this.connection.on("error", (e) => this.emit("error", e));
65
66
  this.connection.on("status", (s) => this.emit("status", s));
67
+ this.connection.on("interrupted", () => this.channel?.interrupt());
68
+ // Emit current status (may have been set before listeners attached)
69
+ this.emit("status", this.connection.status);
66
70
  this.init();
67
71
  }
68
72
  /**
@@ -79,6 +83,53 @@ export class RealtimeSession extends EventEmitter {
79
83
  config: await this.buildSessionConfig(),
80
84
  });
81
85
  }
86
+ /**
87
+ * Send audio to the model.
88
+ */
89
+ sendAudio(audio) {
90
+ this.connection?.send({ kind: "audio.input.append", audio });
91
+ }
92
+ /**
93
+ * Commit the audio buffer (signal end of speech).
94
+ */
95
+ commit() {
96
+ this.connection?.send({ kind: "audio.input.commit" });
97
+ }
98
+ /**
99
+ * Send a text message to the model.
100
+ */
101
+ sendMessage(text) {
102
+ this.connection?.send({
103
+ kind: "item.create",
104
+ item: message({ role: "user", text }),
105
+ });
106
+ }
107
+ /**
108
+ * Interrupt the current response.
109
+ */
110
+ interrupt() {
111
+ this.connection?.send({ kind: "response.cancel" });
112
+ this.channel?.interrupt();
113
+ }
114
+ /**
115
+ * Mute audio input.
116
+ */
117
+ mute() {
118
+ this.connection?.mute();
119
+ }
120
+ /**
121
+ * Unmute audio input.
122
+ */
123
+ unmute() {
124
+ this.connection?.unmute();
125
+ }
126
+ /**
127
+ * Close the session and release resources.
128
+ */
129
+ close() {
130
+ this.channel?.close();
131
+ this.connection?.close();
132
+ }
82
133
  /**
83
134
  * Build session configuration from agent.
84
135
  */
@@ -88,6 +139,11 @@ export class RealtimeSession extends EventEmitter {
88
139
  instructions: await this.agent.instructions(this.context),
89
140
  tools: tools.map((t) => t.serialize()),
90
141
  voice: this.agent.voice,
142
+ turnDetection: { mode: "server_vad" },
143
+ audio: {
144
+ inputFormat: { mimeType: "audio/pcm", sampleRate: 24000 },
145
+ outputFormat: { mimeType: "audio/pcm", sampleRate: 24000 },
146
+ },
91
147
  };
92
148
  }
93
149
  /**
@@ -101,7 +157,7 @@ export class RealtimeSession extends EventEmitter {
101
157
  */
102
158
  onEvent(event) {
103
159
  switch (event.kind) {
104
- // Audio output → 'audio'
160
+ // audio output → 'audio'
105
161
  case "audio.output.delta":
106
162
  this.channel?.sendAudio(event.audio);
107
163
  this.emit("audio", event);
@@ -109,24 +165,24 @@ export class RealtimeSession extends EventEmitter {
109
165
  case "audio.output.done":
110
166
  this.emit("audio", event);
111
167
  break;
112
- // Speech transcriptions → 'transcript'
168
+ // speech transcriptions → 'transcript'
113
169
  case "transcript.input":
114
170
  case "transcript.output":
115
171
  this.emit("transcript", event);
116
172
  break;
117
- // Text output → 'text'
173
+ // text output → 'text'
118
174
  case "text.output":
119
175
  this.emit("text", event);
120
176
  break;
121
- // Errors → 'error'
177
+ // ERrors → 'error'
122
178
  case "session.error":
123
179
  this.emit("error", event.error);
124
180
  break;
125
- // Tool calls - handled internally
181
+ // tool calls - handled internally
126
182
  case "tool.call":
127
183
  this.performActions(event);
128
184
  break;
129
- // Session lifecycle - internal state
185
+ // session lifecycle - internal state
130
186
  case "session.created":
131
187
  this.id = event.session.id;
132
188
  break;
@@ -153,51 +209,4 @@ export class RealtimeSession extends EventEmitter {
153
209
  error: result.error ?? undefined,
154
210
  });
155
211
  }
156
- /**
157
- * Send audio to the model.
158
- */
159
- sendAudio(audio) {
160
- this.connection?.send({ kind: "audio.input.append", audio });
161
- }
162
- /**
163
- * Commit the audio buffer (signal end of speech).
164
- */
165
- commit() {
166
- this.connection?.send({ kind: "audio.input.commit" });
167
- }
168
- /**
169
- * Send a text message to the model.
170
- */
171
- sendMessage(text) {
172
- this.connection?.send({
173
- kind: "item.create",
174
- item: message({ role: "user", text }),
175
- });
176
- }
177
- /**
178
- * Interrupt the current response.
179
- */
180
- interrupt() {
181
- this.connection?.send({ kind: "response.cancel" });
182
- this.channel?.interrupt();
183
- }
184
- /**
185
- * Mute audio input.
186
- */
187
- mute() {
188
- this.connection?.mute();
189
- }
190
- /**
191
- * Unmute audio input.
192
- */
193
- unmute() {
194
- this.connection?.unmute();
195
- }
196
- /**
197
- * Close the session and release resources.
198
- */
199
- close() {
200
- this.channel?.close();
201
- this.connection?.close();
202
- }
203
212
  }
@@ -0,0 +1,45 @@
1
+ import type { RealtimeModel, RealtimeConnection, RealtimeTransport, RealtimeConnectOptions, WebSocketConstructor } from "@kernl-sdk/protocol";
2
+ /**
3
+ * Options for creating a WebSocket transport.
4
+ */
5
+ export interface WebSocketTransportOptions {
6
+ /**
7
+ * WebSocket constructor to use.
8
+ *
9
+ * Required in Node.js <22 (provide the 'ws' package).
10
+ * Optional in browsers and Node.js 22+ (uses globalThis.WebSocket).
11
+ *
12
+ * @example
13
+ * ```ts
14
+ * import WebSocket from 'ws';
15
+ * new WebSocketTransport({ websocket: WebSocket });
16
+ * ```
17
+ */
18
+ websocket?: WebSocketConstructor;
19
+ }
20
+ /**
21
+ * WebSocket transport for realtime connections.
22
+ *
23
+ * Use this transport when you need to provide a custom WebSocket implementation,
24
+ * such as the 'ws' package in Node.js <22.
25
+ *
26
+ * @example
27
+ * ```ts
28
+ * // Node.js <22
29
+ * import WebSocket from 'ws';
30
+ * const session = new RealtimeSession(agent, {
31
+ * transport: new WebSocketTransport({ websocket: WebSocket }),
32
+ * ...
33
+ * });
34
+ *
35
+ * // Browser or Node.js 22+ - no transport needed
36
+ * const session = new RealtimeSession(agent, { ... });
37
+ * ```
38
+ */
39
+ export declare class WebSocketTransport implements RealtimeTransport {
40
+ readonly handlesAudio = false;
41
+ private WS;
42
+ constructor(options?: WebSocketTransportOptions);
43
+ connect(model: RealtimeModel, options?: RealtimeConnectOptions): Promise<RealtimeConnection>;
44
+ }
45
+ //# sourceMappingURL=transport.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"transport.d.ts","sourceRoot":"","sources":["../../src/realtime/transport.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,aAAa,EACb,kBAAkB,EAClB,iBAAiB,EACjB,sBAAsB,EACtB,oBAAoB,EACrB,MAAM,qBAAqB,CAAC;AAE7B;;GAEG;AACH,MAAM,WAAW,yBAAyB;IACxC;;;;;;;;;;;OAWG;IACH,SAAS,CAAC,EAAE,oBAAoB,CAAC;CAClC;AAED;;;;;;;;;;;;;;;;;;GAkBG;AACH,qBAAa,kBAAmB,YAAW,iBAAiB;IAC1D,QAAQ,CAAC,YAAY,SAAS;IAC9B,OAAO,CAAC,EAAE,CAAmC;gBAEjC,OAAO,CAAC,EAAE,yBAAyB;IAIzC,OAAO,CACX,KAAK,EAAE,aAAa,EACpB,OAAO,CAAC,EAAE,sBAAsB,GAC/B,OAAO,CAAC,kBAAkB,CAAC;CAM/B"}
@@ -0,0 +1,32 @@
1
+ /**
2
+ * WebSocket transport for realtime connections.
3
+ *
4
+ * Use this transport when you need to provide a custom WebSocket implementation,
5
+ * such as the 'ws' package in Node.js <22.
6
+ *
7
+ * @example
8
+ * ```ts
9
+ * // Node.js <22
10
+ * import WebSocket from 'ws';
11
+ * const session = new RealtimeSession(agent, {
12
+ * transport: new WebSocketTransport({ websocket: WebSocket }),
13
+ * ...
14
+ * });
15
+ *
16
+ * // Browser or Node.js 22+ - no transport needed
17
+ * const session = new RealtimeSession(agent, { ... });
18
+ * ```
19
+ */
20
+ export class WebSocketTransport {
21
+ handlesAudio = false;
22
+ WS;
23
+ constructor(options) {
24
+ this.WS = options?.websocket;
25
+ }
26
+ async connect(model, options) {
27
+ return model.connect({
28
+ ...options,
29
+ websocket: this.WS ?? options?.websocket,
30
+ });
31
+ }
32
+ }
@@ -1,7 +1,6 @@
1
- import { RealtimeModel, RealtimeTransport, RealtimeConnectOptions } from "@kernl-sdk/protocol";
1
+ import { RealtimeModel, RealtimeTransport, RealtimeConnectOptions, RealtimeChannel, ClientCredential } from "@kernl-sdk/protocol";
2
2
  import { Context, UnknownContext } from "../context.js";
3
3
  import type { BaseAgentConfig } from "../agent/base.js";
4
- import type { RealtimeChannel } from "./channel.js";
5
4
  /**
6
5
  * Configuration for a realtime agent.
7
6
  */
@@ -50,6 +49,13 @@ export interface RealtimeSessionOptions<TContext = UnknownContext> {
50
49
  * Context for this session.
51
50
  */
52
51
  context?: Context<TContext>;
52
+ /**
53
+ * Ephemeral credential for client-side connections.
54
+ *
55
+ * Obtained from model.authenticate() on the server.
56
+ * Shorthand for connectOptions.credential.
57
+ */
58
+ credential?: ClientCredential;
53
59
  /**
54
60
  * Options passed to model.connect() or transport.connect().
55
61
  */
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/realtime/types.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,aAAa,EACb,iBAAiB,EACjB,sBAAsB,EACvB,MAAM,qBAAqB,CAAC;AAE7B,OAAO,EAAE,OAAO,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;AACpD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAEpD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,WAAW,CAAC;AAEjD;;GAEG;AACH,MAAM,WAAW,mBAAmB,CAAC,QAAQ,GAAG,cAAc,CAC5D,SAAQ,eAAe,CAAC,QAAQ,CAAC;IACjC;;OAEG;IACH,KAAK,EAAE,aAAa,CAAC;IAErB;;OAEG;IACH,KAAK,CAAC,EAAE,wBAAwB,CAAC;CAClC;AAED;;GAEG;AACH,MAAM,WAAW,wBAAwB;IACvC;;OAEG;IACH,OAAO,EAAE,MAAM,CAAC;IAEhB;;OAEG;IACH,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED;;GAEG;AACH,MAAM,WAAW,sBAAsB,CAAC,QAAQ,GAAG,cAAc;IAC/D;;OAEG;IACH,KAAK,CAAC,EAAE,aAAa,CAAC;IAEtB;;;OAGG;IACH,OAAO,CAAC,EAAE,eAAe,CAAC;IAE1B;;;OAGG;IACH,SAAS,CAAC,EAAE,iBAAiB,CAAC;IAE9B;;OAEG;IACH,OAAO,CAAC,EAAE,OAAO,CAAC,QAAQ,CAAC,CAAC;IAE5B;;OAEG;IACH,cAAc,CAAC,EAAE,sBAAsB,CAAC;CACzC"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/realtime/types.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,aAAa,EACb,iBAAiB,EACjB,sBAAsB,EACtB,eAAe,EACf,gBAAgB,EACjB,MAAM,qBAAqB,CAAC;AAE7B,OAAO,EAAE,OAAO,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;AACpD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAEpD;;GAEG;AACH,MAAM,WAAW,mBAAmB,CAAC,QAAQ,GAAG,cAAc,CAC5D,SAAQ,eAAe,CAAC,QAAQ,CAAC;IACjC;;OAEG;IACH,KAAK,EAAE,aAAa,CAAC;IAErB;;OAEG;IACH,KAAK,CAAC,EAAE,wBAAwB,CAAC;CAClC;AAED;;GAEG;AACH,MAAM,WAAW,wBAAwB;IACvC;;OAEG;IACH,OAAO,EAAE,MAAM,CAAC;IAEhB;;OAEG;IACH,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED;;GAEG;AACH,MAAM,WAAW,sBAAsB,CAAC,QAAQ,GAAG,cAAc;IAC/D;;OAEG;IACH,KAAK,CAAC,EAAE,aAAa,CAAC;IAEtB;;;OAGG;IACH,OAAO,CAAC,EAAE,eAAe,CAAC;IAE1B;;;OAGG;IACH,SAAS,CAAC,EAAE,iBAAiB,CAAC;IAE9B;;OAEG;IACH,OAAO,CAAC,EAAE,OAAO,CAAC,QAAQ,CAAC,CAAC;IAE5B;;;;;OAKG;IACH,UAAU,CAAC,EAAE,gBAAgB,CAAC;IAE9B;;OAEG;IACH,cAAc,CAAC,EAAE,sBAAsB,CAAC;CACzC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "kernl",
3
- "version": "0.9.0",
3
+ "version": "0.10.0",
4
4
  "description": "A modern AI agent framework",
5
5
  "keywords": [
6
6
  "kernl",
@@ -34,10 +34,12 @@
34
34
  "dependencies": {
35
35
  "@modelcontextprotocol/sdk": "^1.20.2",
36
36
  "yaml": "^2.8.2",
37
- "zod": "^4.1.12",
38
- "@kernl-sdk/protocol": "0.3.0",
39
- "@kernl-sdk/retrieval": "0.1.4",
40
- "@kernl-sdk/shared": "^0.3.0"
37
+ "@kernl-sdk/protocol": "0.4.0",
38
+ "@kernl-sdk/retrieval": "0.1.6",
39
+ "@kernl-sdk/shared": "^0.3.1"
40
+ },
41
+ "peerDependencies": {
42
+ "zod": "^4.1.8"
41
43
  },
42
44
  "devDependencies": {
43
45
  "@ai-sdk/openai": "3.0.0-beta.57",
@@ -45,7 +47,8 @@
45
47
  "tsc-alias": "^1.8.10",
46
48
  "typescript": "5.9.2",
47
49
  "vitest": "^4.0.8",
48
- "@kernl-sdk/ai": "0.3.1"
50
+ "zod": "^4.1.8",
51
+ "@kernl-sdk/ai": "0.3.3"
49
52
  },
50
53
  "scripts": {
51
54
  "clean": "rm -rf dist",
package/src/index.ts CHANGED
@@ -8,11 +8,20 @@ export type {
8
8
  export { Agent } from "./agent";
9
9
  export { Context } from "./context";
10
10
 
11
+ // --- realtime ---
12
+
13
+ export { RealtimeAgent, RealtimeSession, WebSocketTransport } from "./realtime";
14
+ export type {
15
+ RealtimeAgentConfig,
16
+ RealtimeAgentVoiceConfig,
17
+ RealtimeSessionOptions,
18
+ WebSocketTransportOptions,
19
+ } from "./realtime";
20
+
11
21
  // --- tools --
12
22
 
13
23
  export { tool, Toolkit, FunctionToolkit, MCPToolkit } from "./tool";
14
24
  export { MCPServerSSE } from "./mcp/sse";
15
- export { MCPServerStdio } from "./mcp/stdio";
16
25
  export { MCPServerStreamableHttp } from "./mcp/http";
17
26
 
18
27
  // --- threads ---
package/src/lib/env.ts CHANGED
@@ -28,7 +28,9 @@ const envSchema = z.object({
28
28
  * import { env } from '@/env';
29
29
  * console.log(env.LOG_LEVEL);
30
30
  */
31
- export const env = envSchema.parse(process.env);
31
+ export const env = envSchema.parse(
32
+ typeof process !== "undefined" ? process.env : {},
33
+ );
32
34
 
33
35
  /**
34
36
  * Type of the validated environment variables
package/src/lifecycle.ts CHANGED
@@ -1,4 +1,4 @@
1
- import { EventEmitter } from "node:events";
1
+ import { Emitter } from "@kernl-sdk/shared";
2
2
 
3
3
  import { Agent } from "./agent";
4
4
  import { Context, UnknownContext } from "./context";
@@ -8,56 +8,6 @@ import type { ToolCall } from "@kernl-sdk/protocol";
8
8
  import { AgentOutputType } from "@/agent/types";
9
9
  import { TextOutput } from "@/thread/types";
10
10
 
11
- export type EventEmitterEvents = Record<string, any[]>;
12
-
13
- /**
14
- * Generic typed event emitter that wraps Node's EventEmitter with type safety
15
- */
16
- class TypedEventEmitter<
17
- EventTypes extends EventEmitterEvents = Record<string, any[]>,
18
- > extends EventEmitter {
19
- // Overload for typed events
20
- on<K extends keyof EventTypes>(
21
- event: K,
22
- listener: (...args: EventTypes[K]) => void,
23
- ): this;
24
- // Fallback for compatibility with parent
25
- on(event: string | symbol, listener: (...args: any[]) => void): this;
26
- on(event: any, listener: any): this {
27
- return super.on(event, listener);
28
- }
29
-
30
- // Overload for typed events
31
- off<K extends keyof EventTypes>(
32
- event: K,
33
- listener: (...args: EventTypes[K]) => void,
34
- ): this;
35
- // Fallback for compatibility with parent
36
- off(event: string | symbol, listener: (...args: any[]) => void): this;
37
- off(event: any, listener: any): this {
38
- return super.off(event, listener);
39
- }
40
-
41
- // Overload for typed events
42
- emit<K extends keyof EventTypes>(event: K, ...args: EventTypes[K]): boolean;
43
- // Fallback for compatibility with parent
44
- emit(event: string | symbol, ...args: any[]): boolean;
45
- emit(event: any, ...args: any[]): boolean {
46
- return super.emit(event, ...args);
47
- }
48
-
49
- // Overload for typed events
50
- once<K extends keyof EventTypes>(
51
- event: K,
52
- listener: (...args: EventTypes[K]) => void,
53
- ): this;
54
- // Fallback for compatibility with parent
55
- once(event: string | symbol, listener: (...args: any[]) => void): this;
56
- once(event: any, listener: any): this {
57
- return super.once(event, listener);
58
- }
59
- }
60
-
61
11
  export type AgentHookEvents<
62
12
  TContext = UnknownContext,
63
13
  TOutput extends AgentOutputType = TextOutput,
@@ -108,7 +58,7 @@ export type AgentHookEvents<
108
58
  export class AgentHooks<
109
59
  TContext = UnknownContext,
110
60
  TOutput extends AgentOutputType = TextOutput,
111
- > extends TypedEventEmitter<AgentHookEvents<TContext, TOutput>> {}
61
+ > extends Emitter<AgentHookEvents<TContext, TOutput>> {}
112
62
 
113
63
  /**
114
64
  * Events emitted by the kernl during execution.
@@ -178,4 +128,4 @@ export type KernlHookEvents<
178
128
  export class KernlHooks<
179
129
  TContext = UnknownContext,
180
130
  TOutput extends AgentOutputType = TextOutput,
181
- > extends TypedEventEmitter<KernlHookEvents<TContext, TOutput>> {}
131
+ > extends Emitter<KernlHookEvents<TContext, TOutput>> {}
@@ -97,7 +97,7 @@ export class Memory {
97
97
  return this._search.query({
98
98
  query: [{ text: q.query, tvec: tvec ?? undefined }],
99
99
  filter: q.filter ? MEMORY_FILTER.encode(q.filter) : undefined,
100
- topK: q.limit ?? 20,
100
+ limit: q.limit ?? 20,
101
101
  });
102
102
  }
103
103
 
@@ -1,4 +1,4 @@
1
1
  export * from "./types";
2
- export * from "./channel";
3
2
  export * from "./agent";
4
3
  export * from "./session";
4
+ export * from "./transport";
@@ -1,11 +1,12 @@
1
- import { EventEmitter } from "node:events";
2
-
1
+ import { Emitter } from "@kernl-sdk/shared";
3
2
  import {
4
3
  RealtimeModel,
5
4
  RealtimeConnection,
6
5
  RealtimeServerEvent,
7
6
  RealtimeSessionConfig,
7
+ RealtimeChannel,
8
8
  ToolCallEvent,
9
+ TransportStatus,
9
10
  message,
10
11
  } from "@kernl-sdk/protocol";
11
12
 
@@ -13,16 +14,28 @@ import { Context, UnknownContext } from "@/context";
13
14
  import { MisconfiguredError } from "@/lib/error";
14
15
 
15
16
  import { RealtimeAgent } from "./agent";
16
- import type { RealtimeChannel } from "./channel";
17
17
  import type { RealtimeSessionOptions } from "./types";
18
18
 
19
+ /**
20
+ * Events emitted by a realtime session.
21
+ */
22
+ export type RealtimeSessionEvents = {
23
+ audio: [event: RealtimeServerEvent];
24
+ transcript: [event: RealtimeServerEvent];
25
+ text: [event: RealtimeServerEvent];
26
+ error: [error: Error];
27
+ status: [status: TransportStatus];
28
+ };
29
+
19
30
  /**
20
31
  * A realtime session manages the connection to a realtime model.
21
32
  *
22
33
  * Handles the bidirectional communication between an agent and a model,
23
34
  * including audio I/O (via channels), tool execution, and event routing.
24
35
  */
25
- export class RealtimeSession<TContext = UnknownContext> extends EventEmitter {
36
+ export class RealtimeSession<
37
+ TContext = UnknownContext,
38
+ > extends Emitter<RealtimeSessionEvents> {
26
39
  /**
27
40
  * Session ID. Null until connected.
28
41
  */
@@ -85,6 +98,8 @@ export class RealtimeSession<TContext = UnknownContext> extends EventEmitter {
85
98
  const options = {
86
99
  ...this.options.connectOptions,
87
100
  sessionConfig,
101
+ credential:
102
+ this.options.credential ?? this.options.connectOptions?.credential,
88
103
  };
89
104
 
90
105
  this.connection = this.options.transport
@@ -94,6 +109,10 @@ export class RealtimeSession<TContext = UnknownContext> extends EventEmitter {
94
109
  this.connection.on("event", this.onEvent.bind(this));
95
110
  this.connection.on("error", (e) => this.emit("error", e));
96
111
  this.connection.on("status", (s) => this.emit("status", s));
112
+ this.connection.on("interrupted", () => this.channel?.interrupt());
113
+
114
+ // Emit current status (may have been set before listeners attached)
115
+ this.emit("status", this.connection.status);
97
116
 
98
117
  this.init();
99
118
  }
@@ -114,6 +133,60 @@ export class RealtimeSession<TContext = UnknownContext> extends EventEmitter {
114
133
  });
115
134
  }
116
135
 
136
+ /**
137
+ * Send audio to the model.
138
+ */
139
+ sendAudio(audio: string): void {
140
+ this.connection?.send({ kind: "audio.input.append", audio });
141
+ }
142
+
143
+ /**
144
+ * Commit the audio buffer (signal end of speech).
145
+ */
146
+ commit(): void {
147
+ this.connection?.send({ kind: "audio.input.commit" });
148
+ }
149
+
150
+ /**
151
+ * Send a text message to the model.
152
+ */
153
+ sendMessage(text: string): void {
154
+ this.connection?.send({
155
+ kind: "item.create",
156
+ item: message({ role: "user", text }),
157
+ });
158
+ }
159
+
160
+ /**
161
+ * Interrupt the current response.
162
+ */
163
+ interrupt(): void {
164
+ this.connection?.send({ kind: "response.cancel" });
165
+ this.channel?.interrupt();
166
+ }
167
+
168
+ /**
169
+ * Mute audio input.
170
+ */
171
+ mute(): void {
172
+ this.connection?.mute();
173
+ }
174
+
175
+ /**
176
+ * Unmute audio input.
177
+ */
178
+ unmute(): void {
179
+ this.connection?.unmute();
180
+ }
181
+
182
+ /**
183
+ * Close the session and release resources.
184
+ */
185
+ close(): void {
186
+ this.channel?.close();
187
+ this.connection?.close();
188
+ }
189
+
117
190
  /**
118
191
  * Build session configuration from agent.
119
192
  */
@@ -124,6 +197,11 @@ export class RealtimeSession<TContext = UnknownContext> extends EventEmitter {
124
197
  instructions: await this.agent.instructions(this.context),
125
198
  tools: tools.map((t) => t.serialize()),
126
199
  voice: this.agent.voice,
200
+ turnDetection: { mode: "server_vad" },
201
+ audio: {
202
+ inputFormat: { mimeType: "audio/pcm", sampleRate: 24000 },
203
+ outputFormat: { mimeType: "audio/pcm", sampleRate: 24000 },
204
+ },
127
205
  };
128
206
  }
129
207
 
@@ -138,7 +216,7 @@ export class RealtimeSession<TContext = UnknownContext> extends EventEmitter {
138
216
  */
139
217
  private onEvent(event: RealtimeServerEvent): void {
140
218
  switch (event.kind) {
141
- // Audio output → 'audio'
219
+ // audio output → 'audio'
142
220
  case "audio.output.delta":
143
221
  this.channel?.sendAudio(event.audio);
144
222
  this.emit("audio", event);
@@ -147,28 +225,28 @@ export class RealtimeSession<TContext = UnknownContext> extends EventEmitter {
147
225
  this.emit("audio", event);
148
226
  break;
149
227
 
150
- // Speech transcriptions → 'transcript'
228
+ // speech transcriptions → 'transcript'
151
229
  case "transcript.input":
152
230
  case "transcript.output":
153
231
  this.emit("transcript", event);
154
232
  break;
155
233
 
156
- // Text output → 'text'
234
+ // text output → 'text'
157
235
  case "text.output":
158
236
  this.emit("text", event);
159
237
  break;
160
238
 
161
- // Errors → 'error'
239
+ // ERrors → 'error'
162
240
  case "session.error":
163
241
  this.emit("error", event.error);
164
242
  break;
165
243
 
166
- // Tool calls - handled internally
244
+ // tool calls - handled internally
167
245
  case "tool.call":
168
246
  this.performActions(event);
169
247
  break;
170
248
 
171
- // Session lifecycle - internal state
249
+ // session lifecycle - internal state
172
250
  case "session.created":
173
251
  this.id = event.session.id;
174
252
  break;
@@ -202,58 +280,4 @@ export class RealtimeSession<TContext = UnknownContext> extends EventEmitter {
202
280
  error: result.error ?? undefined,
203
281
  });
204
282
  }
205
-
206
- /**
207
- * Send audio to the model.
208
- */
209
- sendAudio(audio: string): void {
210
- this.connection?.send({ kind: "audio.input.append", audio });
211
- }
212
-
213
- /**
214
- * Commit the audio buffer (signal end of speech).
215
- */
216
- commit(): void {
217
- this.connection?.send({ kind: "audio.input.commit" });
218
- }
219
-
220
- /**
221
- * Send a text message to the model.
222
- */
223
- sendMessage(text: string): void {
224
- this.connection?.send({
225
- kind: "item.create",
226
- item: message({ role: "user", text }),
227
- });
228
- }
229
-
230
- /**
231
- * Interrupt the current response.
232
- */
233
- interrupt(): void {
234
- this.connection?.send({ kind: "response.cancel" });
235
- this.channel?.interrupt();
236
- }
237
-
238
- /**
239
- * Mute audio input.
240
- */
241
- mute(): void {
242
- this.connection?.mute();
243
- }
244
-
245
- /**
246
- * Unmute audio input.
247
- */
248
- unmute(): void {
249
- this.connection?.unmute();
250
- }
251
-
252
- /**
253
- * Close the session and release resources.
254
- */
255
- close(): void {
256
- this.channel?.close();
257
- this.connection?.close();
258
- }
259
283
  }
@@ -0,0 +1,64 @@
1
+ import type {
2
+ RealtimeModel,
3
+ RealtimeConnection,
4
+ RealtimeTransport,
5
+ RealtimeConnectOptions,
6
+ WebSocketConstructor,
7
+ } from "@kernl-sdk/protocol";
8
+
9
+ /**
10
+ * Options for creating a WebSocket transport.
11
+ */
12
+ export interface WebSocketTransportOptions {
13
+ /**
14
+ * WebSocket constructor to use.
15
+ *
16
+ * Required in Node.js <22 (provide the 'ws' package).
17
+ * Optional in browsers and Node.js 22+ (uses globalThis.WebSocket).
18
+ *
19
+ * @example
20
+ * ```ts
21
+ * import WebSocket from 'ws';
22
+ * new WebSocketTransport({ websocket: WebSocket });
23
+ * ```
24
+ */
25
+ websocket?: WebSocketConstructor;
26
+ }
27
+
28
+ /**
29
+ * WebSocket transport for realtime connections.
30
+ *
31
+ * Use this transport when you need to provide a custom WebSocket implementation,
32
+ * such as the 'ws' package in Node.js <22.
33
+ *
34
+ * @example
35
+ * ```ts
36
+ * // Node.js <22
37
+ * import WebSocket from 'ws';
38
+ * const session = new RealtimeSession(agent, {
39
+ * transport: new WebSocketTransport({ websocket: WebSocket }),
40
+ * ...
41
+ * });
42
+ *
43
+ * // Browser or Node.js 22+ - no transport needed
44
+ * const session = new RealtimeSession(agent, { ... });
45
+ * ```
46
+ */
47
+ export class WebSocketTransport implements RealtimeTransport {
48
+ readonly handlesAudio = false;
49
+ private WS: WebSocketConstructor | undefined;
50
+
51
+ constructor(options?: WebSocketTransportOptions) {
52
+ this.WS = options?.websocket;
53
+ }
54
+
55
+ async connect(
56
+ model: RealtimeModel,
57
+ options?: RealtimeConnectOptions,
58
+ ): Promise<RealtimeConnection> {
59
+ return model.connect({
60
+ ...options,
61
+ websocket: this.WS ?? options?.websocket,
62
+ });
63
+ }
64
+ }
@@ -2,13 +2,13 @@ import {
2
2
  RealtimeModel,
3
3
  RealtimeTransport,
4
4
  RealtimeConnectOptions,
5
+ RealtimeChannel,
6
+ ClientCredential,
5
7
  } from "@kernl-sdk/protocol";
6
8
 
7
9
  import { Context, UnknownContext } from "@/context";
8
10
  import type { BaseAgentConfig } from "@/agent/base";
9
11
 
10
- import type { RealtimeChannel } from "./channel";
11
-
12
12
  /**
13
13
  * Configuration for a realtime agent.
14
14
  */
@@ -66,6 +66,14 @@ export interface RealtimeSessionOptions<TContext = UnknownContext> {
66
66
  */
67
67
  context?: Context<TContext>;
68
68
 
69
+ /**
70
+ * Ephemeral credential for client-side connections.
71
+ *
72
+ * Obtained from model.authenticate() on the server.
73
+ * Shorthand for connectOptions.credential.
74
+ */
75
+ credential?: ClientCredential;
76
+
69
77
  /**
70
78
  * Options passed to model.connect() or transport.connect().
71
79
  */
@@ -1,30 +0,0 @@
1
- import { EventEmitter } from "node:events";
2
- /**
3
- * Base interface for audio I/O channels.
4
- *
5
- * Channels bridge between audio sources (browser mic, Twilio, Discord)
6
- * and the realtime session. They handle audio capture/playback and emit
7
- * events that the session listens to.
8
- *
9
- * Events emitted:
10
- * - 'audio' (audio: string) - Raw audio chunk (base64)
11
- * - 'commit' () - User finished speaking (VAD or manual)
12
- * - 'interrupt' () - User started speaking mid-response
13
- */
14
- export interface RealtimeChannel extends EventEmitter {
15
- /**
16
- * Send audio to be played/transmitted by the channel.
17
- * Called by session when audio is received from the model.
18
- */
19
- sendAudio(audio: string): void;
20
- /**
21
- * Interrupt current audio playback.
22
- * Called by session when response is cancelled.
23
- */
24
- interrupt(): void;
25
- /**
26
- * Clean up resources and close the channel.
27
- */
28
- close(): void;
29
- }
30
- //# sourceMappingURL=channel.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"channel.d.ts","sourceRoot":"","sources":["../../src/realtime/channel.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAE3C;;;;;;;;;;;GAWG;AACH,MAAM,WAAW,eAAgB,SAAQ,YAAY;IACnD;;;OAGG;IACH,SAAS,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IAE/B;;;OAGG;IACH,SAAS,IAAI,IAAI,CAAC;IAElB;;OAEG;IACH,KAAK,IAAI,IAAI,CAAC;CACf"}
@@ -1 +0,0 @@
1
- export {};
@@ -1,32 +0,0 @@
1
- import { EventEmitter } from "node:events";
2
-
3
- /**
4
- * Base interface for audio I/O channels.
5
- *
6
- * Channels bridge between audio sources (browser mic, Twilio, Discord)
7
- * and the realtime session. They handle audio capture/playback and emit
8
- * events that the session listens to.
9
- *
10
- * Events emitted:
11
- * - 'audio' (audio: string) - Raw audio chunk (base64)
12
- * - 'commit' () - User finished speaking (VAD or manual)
13
- * - 'interrupt' () - User started speaking mid-response
14
- */
15
- export interface RealtimeChannel extends EventEmitter {
16
- /**
17
- * Send audio to be played/transmitted by the channel.
18
- * Called by session when audio is received from the model.
19
- */
20
- sendAudio(audio: string): void;
21
-
22
- /**
23
- * Interrupt current audio playback.
24
- * Called by session when response is cancelled.
25
- */
26
- interrupt(): void;
27
-
28
- /**
29
- * Clean up resources and close the channel.
30
- */
31
- close(): void;
32
- }