@alexkroman1/aai 0.8.2 → 0.8.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cli/tsconfig.tsbuildinfo +1 -0
- package/dist/cli.js +1368 -1904
- package/dist/sdk/_mock_ws.js +2 -2
- package/dist/sdk/_mock_ws.js.map +1 -1
- package/dist/sdk/_render_check.d.ts.map +1 -1
- package/dist/sdk/_render_check.js +30 -0
- package/dist/sdk/_render_check.js.map +1 -1
- package/dist/sdk/_utils.d.ts +4 -0
- package/dist/sdk/_utils.d.ts.map +1 -0
- package/dist/sdk/_utils.js +7 -0
- package/dist/sdk/_utils.js.map +1 -0
- package/dist/sdk/builtin_tools.d.ts +35 -11
- package/dist/sdk/builtin_tools.d.ts.map +1 -1
- package/dist/sdk/builtin_tools.js +118 -76
- package/dist/sdk/builtin_tools.js.map +1 -1
- package/dist/sdk/capnweb.d.ts +76 -47
- package/dist/sdk/capnweb.d.ts.map +1 -1
- package/dist/sdk/capnweb.js +99 -242
- package/dist/sdk/capnweb.js.map +1 -1
- package/dist/sdk/direct_executor.d.ts.map +1 -1
- package/dist/sdk/direct_executor.js +0 -2
- package/dist/sdk/direct_executor.js.map +1 -1
- package/dist/sdk/host.d.ts +59 -0
- package/dist/sdk/host.d.ts.map +1 -0
- package/dist/sdk/host.js +131 -0
- package/dist/sdk/host.js.map +1 -0
- package/dist/sdk/mod.d.ts +2 -4
- package/dist/sdk/mod.d.ts.map +1 -1
- package/dist/sdk/mod.js +2 -3
- package/dist/sdk/mod.js.map +1 -1
- package/dist/sdk/protocol.d.ts +33 -135
- package/dist/sdk/protocol.d.ts.map +1 -1
- package/dist/sdk/protocol.js +49 -51
- package/dist/sdk/protocol.js.map +1 -1
- package/dist/sdk/runtime.d.ts +0 -1
- package/dist/sdk/runtime.d.ts.map +1 -1
- package/dist/sdk/runtime.js +5 -24
- package/dist/sdk/runtime.js.map +1 -1
- package/dist/sdk/s2s.d.ts +14 -3
- package/dist/sdk/s2s.d.ts.map +1 -1
- package/dist/sdk/s2s.js +72 -113
- package/dist/sdk/s2s.js.map +1 -1
- package/dist/sdk/server.d.ts +1 -1
- package/dist/sdk/server.d.ts.map +1 -1
- package/dist/sdk/server.js +51 -92
- package/dist/sdk/server.js.map +1 -1
- package/dist/sdk/session.d.ts +5 -1
- package/dist/sdk/session.d.ts.map +1 -1
- package/dist/sdk/session.js +131 -137
- package/dist/sdk/session.js.map +1 -1
- package/dist/sdk/tsconfig.tsbuildinfo +1 -0
- package/dist/sdk/types.d.ts +30 -3
- package/dist/sdk/types.d.ts.map +1 -1
- package/dist/sdk/types.js +37 -0
- package/dist/sdk/types.js.map +1 -1
- package/dist/sdk/winterc_server.d.ts.map +1 -1
- package/dist/sdk/winterc_server.js +10 -15
- package/dist/sdk/winterc_server.js.map +1 -1
- package/dist/sdk/worker_entry.d.ts +3 -11
- package/dist/sdk/worker_entry.d.ts.map +1 -1
- package/dist/sdk/worker_entry.js +8 -18
- package/dist/sdk/worker_entry.js.map +1 -1
- package/dist/sdk/worker_shim.d.ts +5 -6
- package/dist/sdk/worker_shim.d.ts.map +1 -1
- package/dist/sdk/worker_shim.js +93 -136
- package/dist/sdk/worker_shim.js.map +1 -1
- package/dist/sdk/ws_handler.d.ts +1 -1
- package/dist/sdk/ws_handler.d.ts.map +1 -1
- package/dist/sdk/ws_handler.js +13 -22
- package/dist/sdk/ws_handler.js.map +1 -1
- package/dist/ui/_cn.d.ts +5 -0
- package/dist/ui/_cn.d.ts.map +1 -0
- package/dist/ui/_cn.js +22 -0
- package/dist/ui/_cn.js.map +1 -0
- package/dist/ui/_components/app.d.ts +3 -1
- package/dist/ui/_components/app.d.ts.map +1 -1
- package/dist/ui/_components/app.js +2 -2
- package/dist/ui/_components/app.js.map +1 -1
- package/dist/ui/_components/button.d.ts +11 -0
- package/dist/ui/_components/button.d.ts.map +1 -0
- package/dist/ui/_components/button.js +17 -0
- package/dist/ui/_components/button.js.map +1 -0
- package/dist/ui/_components/chat_view.d.ts +3 -1
- package/dist/ui/_components/chat_view.d.ts.map +1 -1
- package/dist/ui/_components/chat_view.js +4 -2
- package/dist/ui/_components/chat_view.js.map +1 -1
- package/dist/ui/_components/controls.d.ts +3 -1
- package/dist/ui/_components/controls.d.ts.map +1 -1
- package/dist/ui/_components/controls.js +4 -5
- package/dist/ui/_components/controls.js.map +1 -1
- package/dist/ui/_components/error_banner.d.ts +2 -1
- package/dist/ui/_components/error_banner.d.ts.map +1 -1
- package/dist/ui/_components/error_banner.js +3 -2
- package/dist/ui/_components/error_banner.js.map +1 -1
- package/dist/ui/_components/message_bubble.d.ts +2 -1
- package/dist/ui/_components/message_bubble.d.ts.map +1 -1
- package/dist/ui/_components/message_bubble.js +5 -3
- package/dist/ui/_components/message_bubble.js.map +1 -1
- package/dist/ui/_components/message_list.d.ts +3 -1
- package/dist/ui/_components/message_list.d.ts.map +1 -1
- package/dist/ui/_components/message_list.js +7 -15
- package/dist/ui/_components/message_list.js.map +1 -1
- package/dist/ui/_components/sidebar_layout.d.ts +2 -1
- package/dist/ui/_components/sidebar_layout.d.ts.map +1 -1
- package/dist/ui/_components/sidebar_layout.js +5 -7
- package/dist/ui/_components/sidebar_layout.js.map +1 -1
- package/dist/ui/_components/start_screen.d.ts +2 -1
- package/dist/ui/_components/start_screen.d.ts.map +1 -1
- package/dist/ui/_components/start_screen.js +5 -2
- package/dist/ui/_components/start_screen.js.map +1 -1
- package/dist/ui/_components/state_indicator.d.ts +2 -1
- package/dist/ui/_components/state_indicator.d.ts.map +1 -1
- package/dist/ui/_components/state_indicator.js +3 -2
- package/dist/ui/_components/state_indicator.js.map +1 -1
- package/dist/ui/_components/thinking_indicator.d.ts +3 -1
- package/dist/ui/_components/thinking_indicator.d.ts.map +1 -1
- package/dist/ui/_components/thinking_indicator.js +4 -2
- package/dist/ui/_components/thinking_indicator.js.map +1 -1
- package/dist/ui/_components/tool_call_block.d.ts +2 -1
- package/dist/ui/_components/tool_call_block.d.ts.map +1 -1
- package/dist/ui/_components/tool_call_block.js +13 -25
- package/dist/ui/_components/tool_call_block.js.map +1 -1
- package/dist/ui/_components/transcript.d.ts +2 -1
- package/dist/ui/_components/transcript.d.ts.map +1 -1
- package/dist/ui/_components/transcript.js +3 -2
- package/dist/ui/_components/transcript.js.map +1 -1
- package/dist/ui/_jsdom_setup.d.ts +1 -0
- package/dist/ui/_jsdom_setup.d.ts.map +1 -0
- package/dist/ui/_jsdom_setup.js +6 -0
- package/dist/ui/_jsdom_setup.js.map +1 -0
- package/dist/ui/audio.d.ts.map +1 -1
- package/dist/ui/audio.js +4 -4
- package/dist/ui/audio.js.map +1 -1
- package/dist/ui/components.d.ts +13 -55
- package/dist/ui/components.d.ts.map +1 -1
- package/dist/ui/components.js +13 -42
- package/dist/ui/components.js.map +1 -1
- package/dist/ui/components_mod.d.ts +14 -3
- package/dist/ui/components_mod.d.ts.map +1 -1
- package/dist/ui/components_mod.js +14 -3
- package/dist/ui/components_mod.js.map +1 -1
- package/dist/ui/mod.d.ts +1 -8
- package/dist/ui/mod.d.ts.map +1 -1
- package/dist/ui/mod.js +1 -5
- package/dist/ui/mod.js.map +1 -1
- package/dist/ui/mount.d.ts +1 -1
- package/dist/ui/mount.d.ts.map +1 -1
- package/dist/ui/mount.js +1 -0
- package/dist/ui/mount.js.map +1 -1
- package/dist/ui/session.d.ts +0 -2
- package/dist/ui/session.d.ts.map +1 -1
- package/dist/ui/session.js +9 -6
- package/dist/ui/session.js.map +1 -1
- package/dist/ui/signals.d.ts +8 -3
- package/dist/ui/signals.d.ts.map +1 -1
- package/dist/ui/signals.js +22 -11
- package/dist/ui/signals.js.map +1 -1
- package/dist/ui/tsconfig.tsbuildinfo +1 -0
- package/dist/ui/worklets/playback-processor.js +3 -3
- package/package.json +39 -16
- package/templates/_shared/CLAUDE.md +50 -30
- package/templates/_shared/global.d.ts +1 -0
- package/templates/_shared/package.json +2 -1
- package/templates/dispatch-center/agent.ts +85 -397
- package/templates/solo-rpg/agent.ts +1240 -0
- package/templates/solo-rpg/client.tsx +698 -0
|
@@ -8,6 +8,7 @@
|
|
|
8
8
|
*
|
|
9
9
|
* @module
|
|
10
10
|
*/
|
|
11
|
+
import { Hono } from "hono";
|
|
11
12
|
import { createDirectExecutor } from "./direct_executor.js";
|
|
12
13
|
import { createMemoryKv } from "./kv.js";
|
|
13
14
|
import { AUDIO_FORMAT } from "./protocol.js";
|
|
@@ -40,23 +41,17 @@ export function createWintercServer(options) {
|
|
|
40
41
|
sampleRate: s2sConfig.inputSampleRate,
|
|
41
42
|
ttsSampleRate: s2sConfig.outputSampleRate,
|
|
42
43
|
};
|
|
44
|
+
const app = new Hono();
|
|
45
|
+
app.get("/health", (c) => c.json({ status: "ok", name: agent.name }));
|
|
46
|
+
app.get("/", (c) => {
|
|
47
|
+
if (clientHtml) {
|
|
48
|
+
return c.html(clientHtml);
|
|
49
|
+
}
|
|
50
|
+
return c.html(`<!DOCTYPE html><html><body><h1>${agent.name}</h1><p>Agent server running.</p></body></html>`);
|
|
51
|
+
});
|
|
43
52
|
return {
|
|
44
53
|
async fetch(request) {
|
|
45
|
-
|
|
46
|
-
if (url.pathname === "/health") {
|
|
47
|
-
return new Response(JSON.stringify({ status: "ok", name: agent.name }), {
|
|
48
|
-
headers: { "Content-Type": "application/json" },
|
|
49
|
-
});
|
|
50
|
-
}
|
|
51
|
-
if (url.pathname === "/" && clientHtml) {
|
|
52
|
-
return new Response(clientHtml, {
|
|
53
|
-
headers: { "Content-Type": "text/html" },
|
|
54
|
-
});
|
|
55
|
-
}
|
|
56
|
-
if (url.pathname === "/") {
|
|
57
|
-
return new Response(`<!DOCTYPE html><html><body><h1>${agent.name}</h1><p>Agent server running.</p></body></html>`, { headers: { "Content-Type": "text/html" } });
|
|
58
|
-
}
|
|
59
|
-
return new Response("Not Found", { status: 404 });
|
|
54
|
+
return app.fetch(request);
|
|
60
55
|
},
|
|
61
56
|
handleWebSocket(ws, wsOpts) {
|
|
62
57
|
wireSessionSocket(ws, {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"winterc_server.js","sourceRoot":"","sources":["../../sdk/winterc_server.ts"],"names":[],"mappings":"AAAA,+CAA+C;AAC/C;;;;;;;;GAQG;AAEH,OAAO,EAAE,oBAAoB,EAAE,MAAM,sBAAsB,CAAC;AAE5D,OAAO,EAAE,cAAc,EAAE,MAAM,SAAS,CAAC;AACzC,OAAO,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAE7C,OAAO,EAAE,aAAa,EAAE,kBAAkB,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAK9E,OAAO,EAAE,uBAAuB,EAAE,MAAM,aAAa,CAAC;AACtD,OAAO,EAAyB,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AAkC3E;;;;;;GAMG;AACH,MAAM,UAAU,mBAAmB,CAAC,OAA6B;IAC/D,MAAM,EACJ,KAAK,EACL,GAAG,EACH,EAAE,GAAG,cAAc,EAAE,EACrB,MAAM,GAAG,uBAAuB,EAAE,EAClC,YAAY,EACZ,UAAU,EACV,MAAM,GAAG,aAAa,EACtB,OAAO,GAAG,WAAW,EACrB,SAAS,GAAG,kBAAkB,GAC/B,GAAG,OAAO,CAAC;IAEZ,MAAM,QAAQ,GAAG,oBAAoB,CAAC;QACpC,KAAK;QACL,GAAG;QACH,EAAE;QACF,MAAM;QACN,GAAG,CAAC,YAAY,CAAC,CAAC,CAAC,EAAE,YAAY,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACzC,eAAe,EAAE,OAAO,CAAC,eAAe;QACxC,MAAM;QACN,OAAO;QACP,SAAS;KACV,CAAC,CAAC;IAEH,MAAM,QAAQ,GAAG,IAAI,GAAG,EAAmB,CAAC;IAE5C,MAAM,WAAW,GAAG;QAClB,WAAW,EAAE,YAAY;QACzB,UAAU,EAAE,SAAS,CAAC,eAAe;QACrC,aAAa,EAAE,SAAS,CAAC,gBAAgB;KAC1C,CAAC;IAEF,
|
|
1
|
+
{"version":3,"file":"winterc_server.js","sourceRoot":"","sources":["../../sdk/winterc_server.ts"],"names":[],"mappings":"AAAA,+CAA+C;AAC/C;;;;;;;;GAQG;AAEH,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAC5B,OAAO,EAAE,oBAAoB,EAAE,MAAM,sBAAsB,CAAC;AAE5D,OAAO,EAAE,cAAc,EAAE,MAAM,SAAS,CAAC;AACzC,OAAO,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAE7C,OAAO,EAAE,aAAa,EAAE,kBAAkB,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAK9E,OAAO,EAAE,uBAAuB,EAAE,MAAM,aAAa,CAAC;AACtD,OAAO,EAAyB,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AAkC3E;;;;;;GAMG;AACH,MAAM,UAAU,mBAAmB,CAAC,OAA6B;IAC/D,MAAM,EACJ,KAAK,EACL,GAAG,EACH,EAAE,GAAG,cAAc,EAAE,EACrB,MAAM,GAAG,uBAAuB,EAAE,EAClC,YAAY,EACZ,UAAU,EACV,MAAM,GAAG,aAAa,EACtB,OAAO,GAAG,WAAW,EACrB,SAAS,GAAG,kBAAkB,GAC/B,GAAG,OAAO,CAAC;IAEZ,MAAM,QAAQ,GAAG,oBAAoB,CAAC;QACpC,KAAK;QACL,GAAG;QACH,EAAE;QACF,MAAM;QACN,GAAG,CAAC,YAAY,CAAC,CAAC,CAAC,EAAE,YAAY,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACzC,eAAe,EAAE,OAAO,CAAC,eAAe;QACxC,MAAM;QACN,OAAO;QACP,SAAS;KACV,CAAC,CAAC;IAEH,MAAM,QAAQ,GAAG,IAAI,GAAG,EAAmB,CAAC;IAE5C,MAAM,WAAW,GAAG;QAClB,WAAW,EAAE,YAAY;QACzB,UAAU,EAAE,SAAS,CAAC,eAAe;QACrC,aAAa,EAAE,SAAS,CAAC,gBAAgB;KAC1C,CAAC;IAEF,MAAM,GAAG,GAAG,IAAI,IAAI,EAAE,CAAC;IAEvB,GAAG,CAAC,GAAG,CAAC,SAAS,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;IAEtE,GAAG,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,CAAC,EAAE,EAAE;QACjB,IAAI,UAAU,EAAE,CAAC;YACf,OAAO,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QAC5B,CAAC;QACD,OAAO,CAAC,CAAC,IAAI,CACX,kCAAkC,KAAK,CAAC,IAAI,iDAAiD,CAC9F,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,OAAO;QACL,KAAK,CAAC,KAAK,CAAC,OAAgB;YAC1B,OAAO,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QAC5B,CAAC;QAED,eAAe,CAAC,EAAoB,EAAE,MAAmC;YACvE,iBAAiB,CAAC,EAAE,EAAE;gBACpB,QAAQ;gBACR,aAAa,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,EAAE,CAC7B,QAAQ,CAAC,aAAa,CAAC;oBACrB,EAAE,EAAE,GAAG;oBACP,KAAK,EAAE,KAAK,CAAC,IAAI;oBACjB,MAAM;oBACN,YAAY,EAAE,MAAM,EAAE,YAAY,IAAI,KAAK;iBAC5C,CAAC;gBACJ,WAAW;gBACX,MAAM;aACP,CAAC,CAAC;QACL,CAAC;QAED,KAAK,CAAC,KAAK;YACT,KAAK,MAAM,OAAO,IAAI,QAAQ,CAAC,MAAM,EAAE,EAAE,CAAC;gBACxC,MAAM,OAAO,CAAC,IAAI,EAAE,CAAC;YACvB,CAAC;YACD,QAAQ,CAAC,KAAK,EAAE,CAAC;QACnB,CAAC;KACF,CAAC;AACJ,CAAC"}
|
|
@@ -6,13 +6,6 @@
|
|
|
6
6
|
import type { Kv } from "./kv.ts";
|
|
7
7
|
import type { Message, ToolDef } from "./types.ts";
|
|
8
8
|
import type { VectorStore } from "./vector.ts";
|
|
9
|
-
/**
|
|
10
|
-
* Maximum time in milliseconds a tool handler may run before being aborted.
|
|
11
|
-
*
|
|
12
|
-
* If a tool's `execute` function exceeds this duration, it is cancelled via
|
|
13
|
-
* `AbortSignal.timeout` and an error message is returned to the LLM.
|
|
14
|
-
*/
|
|
15
|
-
export declare const TOOL_HANDLER_TIMEOUT = 30000;
|
|
16
9
|
/**
|
|
17
10
|
* Function signature for executing a tool by name.
|
|
18
11
|
*
|
|
@@ -27,19 +20,18 @@ export type ExecuteTool = (name: string, args: Readonly<Record<string, unknown>>
|
|
|
27
20
|
export type ExecuteToolCallOptions = {
|
|
28
21
|
tool: ToolDef;
|
|
29
22
|
env: Readonly<Record<string, string>>;
|
|
30
|
-
sessionId?: string | undefined;
|
|
31
23
|
state?: Record<string, unknown>;
|
|
32
24
|
kv?: Kv | undefined;
|
|
33
25
|
vector?: VectorStore | undefined;
|
|
34
26
|
messages?: readonly Message[] | undefined;
|
|
35
27
|
};
|
|
36
28
|
/**
|
|
37
|
-
* Execute a tool call with argument validation
|
|
29
|
+
* Execute a tool call with argument validation and error handling.
|
|
38
30
|
*
|
|
39
31
|
* Validates the provided arguments against the tool's Zod parameter schema,
|
|
40
32
|
* constructs a {@linkcode ToolContext}, invokes the tool's `execute` function,
|
|
41
|
-
* and serializes the result to a string. Errors
|
|
42
|
-
*
|
|
33
|
+
* and serializes the result to a string. Errors are caught and returned as
|
|
34
|
+
* `"Error: ..."` strings rather than thrown.
|
|
43
35
|
*
|
|
44
36
|
* @param name - The name of the tool being invoked.
|
|
45
37
|
* @param args - Raw arguments from the LLM to validate and pass to the tool.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"worker_entry.d.ts","sourceRoot":"","sources":["../../sdk/worker_entry.ts"],"names":[],"mappings":"AACA;;;;GAIG;
|
|
1
|
+
{"version":3,"file":"worker_entry.d.ts","sourceRoot":"","sources":["../../sdk/worker_entry.ts"],"names":[],"mappings":"AACA;;;;GAIG;AAKH,OAAO,KAAK,EAAE,EAAE,EAAE,MAAM,SAAS,CAAC;AAElC,OAAO,KAAK,EAAE,OAAO,EAAe,OAAO,EAAE,MAAM,YAAY,CAAC;AAChE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAK/C;;;;;;;;GAQG;AACH,MAAM,MAAM,WAAW,GAAG,CACxB,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,EACvC,SAAS,CAAC,EAAE,MAAM,EAClB,QAAQ,CAAC,EAAE,SAAS,OAAO,EAAE,KAC1B,OAAO,CAAC,MAAM,CAAC,CAAC;AAoBrB,+CAA+C;AAC/C,MAAM,MAAM,sBAAsB,GAAG;IACnC,IAAI,EAAE,OAAO,CAAC;IACd,GAAG,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;IACtC,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAChC,EAAE,CAAC,EAAE,EAAE,GAAG,SAAS,CAAC;IACpB,MAAM,CAAC,EAAE,WAAW,GAAG,SAAS,CAAC;IACjC,QAAQ,CAAC,EAAE,SAAS,OAAO,EAAE,GAAG,SAAS,CAAC;CAC3C,CAAC;AAEF;;;;;;;;;;;;GAYG;AACH,wBAAsB,eAAe,CACnC,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,EACvC,OAAO,EAAE,sBAAsB,GAC9B,OAAO,CAAC,MAAM,CAAC,CAsBjB"}
|
package/dist/sdk/worker_entry.js
CHANGED
|
@@ -5,21 +5,15 @@
|
|
|
5
5
|
* @module
|
|
6
6
|
*/
|
|
7
7
|
import { EMPTY_PARAMS } from "./_internal_types.js";
|
|
8
|
+
import { errorMessage } from "./_utils.js";
|
|
9
|
+
import { TOOL_EXECUTION_TIMEOUT_MS } from "./protocol.js";
|
|
8
10
|
/** Yield to the event loop so pending I/O (e.g. WebSocket frames) can be processed. */
|
|
9
11
|
const yieldTick = () => new Promise((r) => setTimeout(r, 0));
|
|
10
|
-
/**
|
|
11
|
-
* Maximum time in milliseconds a tool handler may run before being aborted.
|
|
12
|
-
*
|
|
13
|
-
* If a tool's `execute` function exceeds this duration, it is cancelled via
|
|
14
|
-
* `AbortSignal.timeout` and an error message is returned to the LLM.
|
|
15
|
-
*/
|
|
16
|
-
export const TOOL_HANDLER_TIMEOUT = 30_000;
|
|
17
12
|
function buildToolContext(opts) {
|
|
18
|
-
const { env,
|
|
13
|
+
const { env, state, kv, vector, messages } = opts;
|
|
19
14
|
return {
|
|
20
|
-
sessionId: sessionId ?? "",
|
|
21
15
|
env: { ...env },
|
|
22
|
-
abortSignal: AbortSignal.timeout(
|
|
16
|
+
abortSignal: AbortSignal.timeout(TOOL_EXECUTION_TIMEOUT_MS),
|
|
23
17
|
state: state ?? {},
|
|
24
18
|
get kv() {
|
|
25
19
|
if (!kv)
|
|
@@ -35,12 +29,12 @@ function buildToolContext(opts) {
|
|
|
35
29
|
};
|
|
36
30
|
}
|
|
37
31
|
/**
|
|
38
|
-
* Execute a tool call with argument validation
|
|
32
|
+
* Execute a tool call with argument validation and error handling.
|
|
39
33
|
*
|
|
40
34
|
* Validates the provided arguments against the tool's Zod parameter schema,
|
|
41
35
|
* constructs a {@linkcode ToolContext}, invokes the tool's `execute` function,
|
|
42
|
-
* and serializes the result to a string. Errors
|
|
43
|
-
*
|
|
36
|
+
* and serializes the result to a string. Errors are caught and returned as
|
|
37
|
+
* `"Error: ..."` strings rather than thrown.
|
|
44
38
|
*
|
|
45
39
|
* @param name - The name of the tool being invoked.
|
|
46
40
|
* @param args - Raw arguments from the LLM to validate and pass to the tool.
|
|
@@ -67,12 +61,8 @@ export async function executeToolCall(name, args, options) {
|
|
|
67
61
|
return typeof result === "string" ? result : JSON.stringify(result);
|
|
68
62
|
}
|
|
69
63
|
catch (err) {
|
|
70
|
-
if (err instanceof DOMException && err.name === "TimeoutError") {
|
|
71
|
-
console.warn(`[tool-executor] Tool execution timed out: ${name}`);
|
|
72
|
-
return `Error: Tool "${name}" timed out after ${TOOL_HANDLER_TIMEOUT}ms`;
|
|
73
|
-
}
|
|
74
64
|
console.warn(`[tool-executor] Tool execution failed: ${name}`, err);
|
|
75
|
-
return `Error: ${
|
|
65
|
+
return `Error: ${errorMessage(err)}`;
|
|
76
66
|
}
|
|
77
67
|
}
|
|
78
68
|
//# sourceMappingURL=worker_entry.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"worker_entry.js","sourceRoot":"","sources":["../../sdk/worker_entry.ts"],"names":[],"mappings":"AAAA,+CAA+C;AAC/C;;;;GAIG;AAGH,OAAO,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;
|
|
1
|
+
{"version":3,"file":"worker_entry.js","sourceRoot":"","sources":["../../sdk/worker_entry.ts"],"names":[],"mappings":"AAAA,+CAA+C;AAC/C;;;;GAIG;AAGH,OAAO,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AACpD,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAE3C,OAAO,EAAE,yBAAyB,EAAE,MAAM,eAAe,CAAC;AAI1D,uFAAuF;AACvF,MAAM,SAAS,GAAG,GAAkB,EAAE,CAAC,IAAI,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,UAAU,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;AAkB5E,SAAS,gBAAgB,CAAC,IAA4B;IACpD,MAAM,EAAE,GAAG,EAAE,KAAK,EAAE,EAAE,EAAE,MAAM,EAAE,QAAQ,EAAE,GAAG,IAAI,CAAC;IAClD,OAAO;QACL,GAAG,EAAE,EAAE,GAAG,GAAG,EAAE;QACf,WAAW,EAAE,WAAW,CAAC,OAAO,CAAC,yBAAyB,CAAC;QAC3D,KAAK,EAAE,KAAK,IAAI,EAAE;QAClB,IAAI,EAAE;YACJ,IAAI,CAAC,EAAE;gBAAE,MAAM,IAAI,KAAK,CAAC,kBAAkB,CAAC,CAAC;YAC7C,OAAO,EAAE,CAAC;QACZ,CAAC;QACD,IAAI,MAAM;YACR,IAAI,CAAC,MAAM;gBAAE,MAAM,IAAI,KAAK,CAAC,4BAA4B,CAAC,CAAC;YAC3D,OAAO,MAAM,CAAC;QAChB,CAAC;QACD,QAAQ,EAAE,QAAQ,IAAI,EAAE;KACzB,CAAC;AACJ,CAAC;AAYD;;;;;;;;;;;;GAYG;AACH,MAAM,CAAC,KAAK,UAAU,eAAe,CACnC,IAAY,EACZ,IAAuC,EACvC,OAA+B;IAE/B,MAAM,EAAE,IAAI,EAAE,GAAG,OAAO,CAAC;IACzB,MAAM,MAAM,GAAG,IAAI,CAAC,UAAU,IAAI,YAAY,CAAC;IAC/C,MAAM,MAAM,GAAG,MAAM,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;IACtC,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;QACpB,MAAM,MAAM,GAAG,CAAC,MAAM,CAAC,KAAK,EAAE,MAAM,IAAI,EAAE,CAAC;aACxC,GAAG,CAAC,CAAC,CAAa,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,OAAO,EAAE,CAAC;aACvE,IAAI,CAAC,IAAI,CAAC,CAAC;QACd,OAAO,sCAAsC,IAAI,MAAM,MAAM,EAAE,CAAC;IAClE,CAAC;IAED,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,gBAAgB,CAAC,OAAO,CAAC,CAAC;QACtC,MAAM,SAAS,EAAE,CAAC;QAClB,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC,CAAC;QACrE,MAAM,SAAS,EAAE,CAAC;QAClB,IAAI,MAAM,IAAI,IAAI;YAAE,OAAO,MAAM,CAAC;QAClC,OAAO,OAAO,MAAM,KAAK,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;IACtE,CAAC;IAAC,OAAO,GAAY,EAAE,CAAC;QACtB,OAAO,CAAC,IAAI,CAAC,0CAA0C,IAAI,EAAE,EAAE,GAAG,CAAC,CAAC;QACpE,OAAO,UAAU,YAAY,CAAC,GAAG,CAAC,EAAE,CAAC;IACvC,CAAC;AACH,CAAC"}
|
|
@@ -2,9 +2,9 @@
|
|
|
2
2
|
* Sandboxed worker entry point for platform mode.
|
|
3
3
|
*
|
|
4
4
|
* Called from the bundled `worker.js` inside a Deno Worker with all
|
|
5
|
-
* permissions false.
|
|
6
|
-
*
|
|
7
|
-
*
|
|
5
|
+
* permissions false. Sets up capnweb RPC to proxy capabilities through
|
|
6
|
+
* the host, and delegates to a {@linkcode WintercServer} for session
|
|
7
|
+
* management.
|
|
8
8
|
*
|
|
9
9
|
* @module
|
|
10
10
|
*/
|
|
@@ -12,9 +12,8 @@ import type { AgentDef } from "./types.ts";
|
|
|
12
12
|
/**
|
|
13
13
|
* Initialize a sandboxed worker with the given agent definition.
|
|
14
14
|
*
|
|
15
|
-
* Sets up capnweb RPC,
|
|
16
|
-
* and waits for
|
|
17
|
-
* the WinterTC server.
|
|
15
|
+
* Sets up capnweb RPC, creates capability stubs backed by the host,
|
|
16
|
+
* and waits for initialization before creating the WinterTC server.
|
|
18
17
|
*/
|
|
19
18
|
export declare function initWorker(agent: AgentDef): void;
|
|
20
19
|
//# sourceMappingURL=worker_shim.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"worker_shim.d.ts","sourceRoot":"","sources":["../../sdk/worker_shim.ts"],"names":[],"mappings":"AACA;;;;;;;;;GASG;
|
|
1
|
+
{"version":3,"file":"worker_shim.d.ts","sourceRoot":"","sources":["../../sdk/worker_shim.ts"],"names":[],"mappings":"AACA;;;;;;;;;GASG;AAYH,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAuE3C;;;;;GAKG;AACH,wBAAgB,UAAU,CAAC,KAAK,EAAE,QAAQ,GAAG,IAAI,CAsFhD"}
|
package/dist/sdk/worker_shim.js
CHANGED
|
@@ -3,125 +3,100 @@
|
|
|
3
3
|
* Sandboxed worker entry point for platform mode.
|
|
4
4
|
*
|
|
5
5
|
* Called from the bundled `worker.js` inside a Deno Worker with all
|
|
6
|
-
* permissions false.
|
|
7
|
-
*
|
|
8
|
-
*
|
|
6
|
+
* permissions false. Sets up capnweb RPC to proxy capabilities through
|
|
7
|
+
* the host, and delegates to a {@linkcode WintercServer} for session
|
|
8
|
+
* management.
|
|
9
9
|
*
|
|
10
10
|
* @module
|
|
11
11
|
*/
|
|
12
|
-
import {
|
|
13
|
-
import { BridgedWebSocket, CapnwebEndpoint, createBridgedS2sWebSocket, } from "./capnweb.js";
|
|
12
|
+
import { BridgedWebSocket, createRpcSession, isTransferMessage, RpcTarget, sendTransfer, } from "./capnweb.js";
|
|
14
13
|
import { createWintercServer } from "./winterc_server.js";
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
14
|
+
/**
|
|
15
|
+
* RPC service exposed by the worker to the host.
|
|
16
|
+
* Methods are callable via capnweb RPC stubs.
|
|
17
|
+
*/
|
|
18
|
+
class WorkerService extends RpcTarget {
|
|
19
|
+
#agent;
|
|
20
|
+
#kv;
|
|
21
|
+
#vector;
|
|
22
|
+
#vectorSearch;
|
|
23
|
+
#createWebSocket;
|
|
24
|
+
#wintercServer = null;
|
|
25
|
+
constructor(agent, kv, vector, vectorSearch, createWebSocket) {
|
|
26
|
+
super();
|
|
27
|
+
this.#agent = agent;
|
|
28
|
+
this.#kv = kv;
|
|
29
|
+
this.#vector = vector;
|
|
30
|
+
this.#vectorSearch = vectorSearch;
|
|
31
|
+
this.#createWebSocket = createWebSocket;
|
|
32
|
+
}
|
|
33
|
+
/** Initialize the worker with environment variables. Creates the WinterTC server. */
|
|
34
|
+
init(env) {
|
|
35
|
+
this.#wintercServer = createWintercServer({
|
|
36
|
+
agent: this.#agent,
|
|
37
|
+
env,
|
|
38
|
+
kv: this.#kv,
|
|
39
|
+
vector: this.#vector,
|
|
40
|
+
vectorSearch: this.#vectorSearch,
|
|
41
|
+
createWebSocket: this.#createWebSocket,
|
|
42
|
+
});
|
|
43
|
+
return "ok";
|
|
44
|
+
}
|
|
45
|
+
/** Handle an HTTP request forwarded from the host. */
|
|
46
|
+
async workerFetch(url, method, headers, body) {
|
|
47
|
+
if (!this.#wintercServer)
|
|
48
|
+
throw new Error("Worker not initialized");
|
|
49
|
+
const request = new Request(url, { method, headers, ...(body ? { body } : {}) });
|
|
50
|
+
const response = await this.#wintercServer.fetch(request);
|
|
51
|
+
return {
|
|
52
|
+
status: response.status,
|
|
53
|
+
headers: Object.fromEntries(response.headers),
|
|
54
|
+
body: await response.text(),
|
|
55
|
+
};
|
|
56
|
+
}
|
|
57
|
+
/** Handle a new WebSocket client connection (called via port transfer, not RPC). */
|
|
58
|
+
handleWebSocket(port, skipGreeting) {
|
|
59
|
+
if (!this.#wintercServer)
|
|
60
|
+
throw new Error("Worker not initialized");
|
|
61
|
+
const ws = new BridgedWebSocket(port);
|
|
62
|
+
this.#wintercServer.handleWebSocket(ws, { skipGreeting });
|
|
63
|
+
}
|
|
64
|
+
}
|
|
39
65
|
/**
|
|
40
66
|
* Initialize a sandboxed worker with the given agent definition.
|
|
41
67
|
*
|
|
42
|
-
* Sets up capnweb RPC,
|
|
43
|
-
* and waits for
|
|
44
|
-
* the WinterTC server.
|
|
68
|
+
* Sets up capnweb RPC, creates capability stubs backed by the host,
|
|
69
|
+
* and waits for initialization before creating the WinterTC server.
|
|
45
70
|
*/
|
|
46
71
|
export function initWorker(agent) {
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
globalThis.fetch = async (input, init) => {
|
|
50
|
-
let url;
|
|
51
|
-
let method = "GET";
|
|
52
|
-
let headers = {};
|
|
53
|
-
let body;
|
|
54
|
-
if (typeof input === "string") {
|
|
55
|
-
url = input;
|
|
56
|
-
}
|
|
57
|
-
else if (input instanceof URL) {
|
|
58
|
-
url = input.toString();
|
|
59
|
-
}
|
|
60
|
-
else {
|
|
61
|
-
url = input.url;
|
|
62
|
-
method = input.method;
|
|
63
|
-
headers = Object.fromEntries(input.headers);
|
|
64
|
-
if (input.body) {
|
|
65
|
-
body = await new Response(input.body).text();
|
|
66
|
-
}
|
|
67
|
-
}
|
|
68
|
-
if (init?.method)
|
|
69
|
-
method = init.method;
|
|
70
|
-
if (init?.headers) {
|
|
71
|
-
headers = Object.fromEntries(new Headers(init.headers));
|
|
72
|
-
}
|
|
73
|
-
if (init?.body !== undefined) {
|
|
74
|
-
body = typeof init.body === "string" ? init.body : String(init.body);
|
|
75
|
-
}
|
|
76
|
-
const raw = await endpoint.call("host.fetch", [url, method, headers, body]);
|
|
77
|
-
const result = FetchResultSchema.parse(raw);
|
|
78
|
-
return new Response(result.body, {
|
|
79
|
-
status: result.status,
|
|
80
|
-
headers: result.headers,
|
|
81
|
-
});
|
|
82
|
-
};
|
|
72
|
+
// biome-ignore lint/suspicious/noExplicitAny: capnweb stubs are dynamically typed proxies
|
|
73
|
+
let hostStub;
|
|
83
74
|
// ─── Capnweb-backed KV ─────────────────────────────────────────────────
|
|
84
75
|
const kv = {
|
|
85
76
|
async get(key) {
|
|
86
|
-
const raw = await
|
|
87
|
-
|
|
88
|
-
return null;
|
|
89
|
-
return raw;
|
|
77
|
+
const raw = await hostStub.kvGet(key);
|
|
78
|
+
return raw == null ? null : raw;
|
|
90
79
|
},
|
|
91
80
|
async set(key, value, options) {
|
|
92
|
-
await
|
|
81
|
+
await hostStub.kvSet(key, value, options);
|
|
93
82
|
},
|
|
94
83
|
async delete(key) {
|
|
95
|
-
await
|
|
84
|
+
await hostStub.kvDel(key);
|
|
96
85
|
},
|
|
97
86
|
async list(prefix, options) {
|
|
98
|
-
|
|
99
|
-
"list",
|
|
100
|
-
prefix,
|
|
101
|
-
options?.limit,
|
|
102
|
-
options?.reverse,
|
|
103
|
-
]);
|
|
104
|
-
const entries = z.array(KvEntrySchema).parse(raw);
|
|
105
|
-
return entries;
|
|
87
|
+
return (await hostStub.kvList(prefix, options));
|
|
106
88
|
},
|
|
107
89
|
};
|
|
108
90
|
// ─── Capnweb-backed vector store ───────────────────────────────────────
|
|
109
91
|
const vector = {
|
|
110
92
|
async upsert(id, data, metadata) {
|
|
111
|
-
await
|
|
93
|
+
await hostStub.vecUpsert(id, data, metadata);
|
|
112
94
|
},
|
|
113
95
|
async query(text, options) {
|
|
114
|
-
|
|
115
|
-
"query",
|
|
116
|
-
text,
|
|
117
|
-
options?.topK,
|
|
118
|
-
options?.filter,
|
|
119
|
-
]);
|
|
120
|
-
return z.array(VectorEntrySchema).parse(raw);
|
|
96
|
+
return (await hostStub.vecQuery(text, options));
|
|
121
97
|
},
|
|
122
98
|
async remove(ids) {
|
|
123
|
-
|
|
124
|
-
await endpoint.call("host.vector", ["remove", idArray]);
|
|
99
|
+
await hostStub.vecRemove(Array.isArray(ids) ? ids : [ids]);
|
|
125
100
|
},
|
|
126
101
|
};
|
|
127
102
|
const vectorSearch = async (query, topK) => {
|
|
@@ -133,52 +108,34 @@ export function initWorker(agent) {
|
|
|
133
108
|
// ─── Capnweb-backed S2S WebSocket factory ──────────────────────────────
|
|
134
109
|
const createWebSocket = (url, opts) => {
|
|
135
110
|
const { port1, port2 } = new MessageChannel();
|
|
136
|
-
|
|
137
|
-
return
|
|
111
|
+
sendTransfer(self, { _t: "createWs", url, headers: JSON.stringify(opts.headers) }, [port2]);
|
|
112
|
+
return new BridgedWebSocket(port1);
|
|
138
113
|
};
|
|
139
|
-
// ───
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
const
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
kv,
|
|
148
|
-
vector,
|
|
149
|
-
vectorSearch,
|
|
150
|
-
createWebSocket,
|
|
151
|
-
});
|
|
152
|
-
return "ok";
|
|
153
|
-
});
|
|
154
|
-
// Handle HTTP request forwarding
|
|
155
|
-
endpoint.handle("worker.fetch", async (args) => {
|
|
156
|
-
if (!wintercServer)
|
|
157
|
-
throw new Error("Worker not initialized");
|
|
158
|
-
const [url, method, headers, body] = WorkerFetchArgsSchema.parse(args);
|
|
159
|
-
const request = new Request(url, {
|
|
160
|
-
method,
|
|
161
|
-
headers,
|
|
162
|
-
...(body ? { body } : {}),
|
|
114
|
+
// ─── Monkeypatch fetch to proxy through host ──────────────────────────
|
|
115
|
+
globalThis.fetch = async (input, init) => {
|
|
116
|
+
const request = new Request(input, init);
|
|
117
|
+
const body = request.body ? await request.text() : undefined;
|
|
118
|
+
const result = await hostStub.hostFetch(request.url, request.method, Object.fromEntries(request.headers), body);
|
|
119
|
+
return new Response(result.body, {
|
|
120
|
+
status: result.status,
|
|
121
|
+
headers: result.headers,
|
|
163
122
|
});
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
wintercServer.handleWebSocket(ws, { skipGreeting: skipGreeting ?? false });
|
|
181
|
-
return "ok";
|
|
123
|
+
};
|
|
124
|
+
// ─── Create worker service and RPC session ────────────────────────────
|
|
125
|
+
const workerService = new WorkerService(agent, kv, vector, vectorSearch, createWebSocket);
|
|
126
|
+
hostStub = createRpcSession({
|
|
127
|
+
port: self,
|
|
128
|
+
localMain: workerService,
|
|
129
|
+
onTransfer(data, ports) {
|
|
130
|
+
if (!isTransferMessage(data))
|
|
131
|
+
return;
|
|
132
|
+
if (data._t === "handleWs") {
|
|
133
|
+
const transferPort = ports[0];
|
|
134
|
+
if (!transferPort)
|
|
135
|
+
throw new Error("No port transferred for WebSocket");
|
|
136
|
+
workerService.handleWebSocket(transferPort, data.skipGreeting);
|
|
137
|
+
}
|
|
138
|
+
},
|
|
182
139
|
});
|
|
183
140
|
}
|
|
184
141
|
//# sourceMappingURL=worker_shim.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"worker_shim.js","sourceRoot":"","sources":["../../sdk/worker_shim.ts"],"names":[],"mappings":"AAAA,+CAA+C;AAC/C;;;;;;;;;GASG;AAEH,OAAO,
|
|
1
|
+
{"version":3,"file":"worker_shim.js","sourceRoot":"","sources":["../../sdk/worker_shim.ts"],"names":[],"mappings":"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"}
|
package/dist/sdk/ws_handler.d.ts
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
* WebSocket session lifecycle handler.
|
|
3
3
|
*
|
|
4
4
|
* Cross-runtime: accepts a Logger parameter instead of importing `@std/log`.
|
|
5
|
-
* Audio validation is
|
|
5
|
+
* Audio validation is handled at the host transport layer (see host.ts).
|
|
6
6
|
*
|
|
7
7
|
* @module
|
|
8
8
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ws_handler.d.ts","sourceRoot":"","sources":["../../sdk/ws_handler.ts"],"names":[],"mappings":"AACA;;;;;;;GAOG;
|
|
1
|
+
{"version":3,"file":"ws_handler.d.ts","sourceRoot":"","sources":["../../sdk/ws_handler.ts"],"names":[],"mappings":"AACA;;;;;;;GAOG;AAGH,OAAO,KAAK,EAAiB,UAAU,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAE5E,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AAE3C,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAE5C;;;;;GAKG;AACH,MAAM,MAAM,gBAAgB,GAAG;IAC7B,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,IAAI,CAAC,IAAI,EAAE,MAAM,GAAG,WAAW,GAAG,UAAU,GAAG,IAAI,CAAC;IACpD,gBAAgB,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,kCAAkC,GAAG,IAAI,CAAC;CACpF,CAAC;AAEF,mDAAmD;AACnD,MAAM,MAAM,gBAAgB,GAAG;IAC7B,2EAA2E;IAC3E,QAAQ,EAAE,GAAG,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC/B,2EAA2E;IAC3E,aAAa,EAAE,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,UAAU,KAAK,OAAO,CAAC;IAClE,iEAAiE;IACjE,WAAW,EAAE,WAAW,CAAC;IACzB,2DAA2D;IAC3D,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACpC,4DAA4D;IAC5D,MAAM,CAAC,EAAE,MAAM,IAAI,CAAC;IACpB,6DAA6D;IAC7D,OAAO,CAAC,EAAE,MAAM,IAAI,CAAC;IACrB,4CAA4C;IAC5C,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB,CAAC;AAiGF;;;;;;;;GAQG;AACH,wBAAgB,iBAAiB,CAAC,EAAE,EAAE,gBAAgB,EAAE,IAAI,EAAE,gBAAgB,GAAG,IAAI,CA0DpF"}
|
package/dist/sdk/ws_handler.js
CHANGED
|
@@ -3,18 +3,13 @@
|
|
|
3
3
|
* WebSocket session lifecycle handler.
|
|
4
4
|
*
|
|
5
5
|
* Cross-runtime: accepts a Logger parameter instead of importing `@std/log`.
|
|
6
|
-
* Audio validation is
|
|
6
|
+
* Audio validation is handled at the host transport layer (see host.ts).
|
|
7
7
|
*
|
|
8
8
|
* @module
|
|
9
9
|
*/
|
|
10
|
+
import { errorMessage } from "./_utils.js";
|
|
10
11
|
import { ClientMessageSchema } from "./protocol.js";
|
|
11
12
|
import { consoleLogger } from "./runtime.js";
|
|
12
|
-
/** Max size for a single audio chunk from the browser (1 MB). */
|
|
13
|
-
const MAX_AUDIO_CHUNK_BYTES = 1_048_576;
|
|
14
|
-
/** Validate a PCM16 audio chunk: non-empty, within size bounds, even byte length. */
|
|
15
|
-
function isValidAudioChunk(data) {
|
|
16
|
-
return (data.byteLength > 0 && data.byteLength <= MAX_AUDIO_CHUNK_BYTES && data.byteLength % 2 === 0);
|
|
17
|
-
}
|
|
18
13
|
/**
|
|
19
14
|
* Creates a {@linkcode ClientSink} backed by a plain WebSocket.
|
|
20
15
|
*
|
|
@@ -61,20 +56,10 @@ function toUint8Array(data) {
|
|
|
61
56
|
const buf = data;
|
|
62
57
|
return new Uint8Array(buf.buffer ?? data, buf.byteOffset ?? 0, buf.byteLength);
|
|
63
58
|
}
|
|
64
|
-
function handleBinaryAudio(data, session
|
|
59
|
+
function handleBinaryAudio(data, session) {
|
|
65
60
|
if (!isBinaryData(data))
|
|
66
61
|
return false;
|
|
67
|
-
|
|
68
|
-
if (!isValidAudioChunk(chunk)) {
|
|
69
|
-
log.warn("Invalid audio chunk, dropping", {
|
|
70
|
-
...ctx,
|
|
71
|
-
sid,
|
|
72
|
-
bytes: chunk.byteLength,
|
|
73
|
-
aligned: chunk.byteLength % 2 === 0,
|
|
74
|
-
});
|
|
75
|
-
return true;
|
|
76
|
-
}
|
|
77
|
-
session.onAudio(chunk);
|
|
62
|
+
session.onAudio(toUint8Array(data));
|
|
78
63
|
return true;
|
|
79
64
|
}
|
|
80
65
|
function handleTextMessage(data, session, log, ctx, sid) {
|
|
@@ -132,8 +117,14 @@ export function wireSessionSocket(ws, opts) {
|
|
|
132
117
|
sessions.set(sessionId, session);
|
|
133
118
|
// Send config immediately — zero RTT
|
|
134
119
|
ws.send(JSON.stringify({ type: "config", ...opts.readyConfig }));
|
|
135
|
-
|
|
136
|
-
|
|
120
|
+
session
|
|
121
|
+
.start()
|
|
122
|
+
.then(() => {
|
|
123
|
+
log.info("Session ready", { ...ctx, sid });
|
|
124
|
+
})
|
|
125
|
+
.catch((err) => {
|
|
126
|
+
log.error("Session start failed", { ...ctx, sid, error: errorMessage(err) });
|
|
127
|
+
});
|
|
137
128
|
}
|
|
138
129
|
// readyState 1 = OPEN — socket already open (e.g. from ws handleUpgrade)
|
|
139
130
|
if (ws.readyState === 1) {
|
|
@@ -146,7 +137,7 @@ export function wireSessionSocket(ws, opts) {
|
|
|
146
137
|
if (!session)
|
|
147
138
|
return;
|
|
148
139
|
const { data } = event;
|
|
149
|
-
if (handleBinaryAudio(data, session
|
|
140
|
+
if (handleBinaryAudio(data, session))
|
|
150
141
|
return;
|
|
151
142
|
handleTextMessage(data, session, log, ctx, sid);
|
|
152
143
|
});
|