@alexkroman1/aai 0.4.0 → 0.6.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.
- package/README.md +0 -6
- package/dist/aai.js +3 -0
- package/dist/cli.js +244 -245
- package/dist/sdk/_internal_types.d.ts +73 -0
- package/dist/sdk/_internal_types.d.ts.map +1 -0
- package/dist/sdk/_internal_types.js +24 -0
- package/dist/sdk/_internal_types.js.map +1 -0
- package/dist/sdk/_mock_ws.d.ts +105 -0
- package/dist/sdk/_mock_ws.d.ts.map +1 -0
- package/dist/sdk/_mock_ws.js +154 -0
- package/dist/sdk/_mock_ws.js.map +1 -0
- package/dist/sdk/_timeout.d.ts +14 -0
- package/dist/sdk/_timeout.d.ts.map +1 -0
- package/{sdk/_timeout.ts → dist/sdk/_timeout.js} +9 -9
- package/dist/sdk/_timeout.js.map +1 -0
- package/dist/sdk/builtin_tools.d.ts +33 -0
- package/dist/sdk/builtin_tools.d.ts.map +1 -0
- package/dist/sdk/builtin_tools.js +263 -0
- package/dist/sdk/builtin_tools.js.map +1 -0
- package/dist/sdk/capnweb.d.ts +69 -0
- package/dist/sdk/capnweb.d.ts.map +1 -0
- package/dist/sdk/capnweb.js +291 -0
- package/dist/sdk/capnweb.js.map +1 -0
- package/dist/sdk/define_agent.d.ts +36 -0
- package/dist/sdk/define_agent.d.ts.map +1 -0
- package/dist/sdk/define_agent.js +63 -0
- package/dist/sdk/define_agent.js.map +1 -0
- package/dist/sdk/direct_executor.d.ts +42 -0
- package/dist/sdk/direct_executor.d.ts.map +1 -0
- package/dist/sdk/direct_executor.js +143 -0
- package/dist/sdk/direct_executor.js.map +1 -0
- package/dist/sdk/kv.d.ts +123 -0
- package/dist/sdk/kv.d.ts.map +1 -0
- package/dist/sdk/kv.js +91 -0
- package/dist/sdk/kv.js.map +1 -0
- package/{sdk/mod.ts → dist/sdk/mod.d.ts} +2 -11
- package/dist/sdk/mod.d.ts.map +1 -0
- package/dist/sdk/mod.js +26 -0
- package/dist/sdk/mod.js.map +1 -0
- package/dist/sdk/protocol.d.ts +218 -0
- package/dist/sdk/protocol.d.ts.map +1 -0
- package/dist/sdk/protocol.js +140 -0
- package/dist/sdk/protocol.js.map +1 -0
- package/dist/sdk/runtime.d.ts +35 -0
- package/dist/sdk/runtime.d.ts.map +1 -0
- package/dist/sdk/runtime.js +46 -0
- package/dist/sdk/runtime.js.map +1 -0
- package/dist/sdk/s2s.d.ts +60 -0
- package/dist/sdk/s2s.d.ts.map +1 -0
- package/dist/sdk/s2s.js +171 -0
- package/dist/sdk/s2s.js.map +1 -0
- package/dist/sdk/server.d.ts +51 -0
- package/dist/sdk/server.d.ts.map +1 -0
- package/dist/sdk/server.js +145 -0
- package/dist/sdk/server.js.map +1 -0
- package/dist/sdk/session.d.ts +66 -0
- package/dist/sdk/session.d.ts.map +1 -0
- package/dist/sdk/session.js +324 -0
- package/dist/sdk/session.js.map +1 -0
- package/dist/sdk/system_prompt.d.ts +6 -0
- package/dist/sdk/system_prompt.d.ts.map +1 -0
- package/dist/sdk/system_prompt.js +35 -0
- package/dist/sdk/system_prompt.js.map +1 -0
- package/dist/sdk/types.d.ts +326 -0
- package/dist/sdk/types.d.ts.map +1 -0
- package/dist/sdk/types.js +38 -0
- package/dist/sdk/types.js.map +1 -0
- package/dist/sdk/vector.d.ts +90 -0
- package/dist/sdk/vector.d.ts.map +1 -0
- package/dist/sdk/vector.js +61 -0
- package/dist/sdk/vector.js.map +1 -0
- package/dist/sdk/winterc_server.d.ts +53 -0
- package/dist/sdk/winterc_server.d.ts.map +1 -0
- package/dist/sdk/winterc_server.js +82 -0
- package/dist/sdk/winterc_server.js.map +1 -0
- package/dist/sdk/worker_entry.d.ts +48 -0
- package/dist/sdk/worker_entry.d.ts.map +1 -0
- package/dist/sdk/worker_entry.js +67 -0
- package/dist/sdk/worker_entry.js.map +1 -0
- package/dist/sdk/worker_shim.d.ts +20 -0
- package/dist/sdk/worker_shim.d.ts.map +1 -0
- package/dist/sdk/worker_shim.js +132 -0
- package/dist/sdk/worker_shim.js.map +1 -0
- package/dist/sdk/ws_handler.d.ts +50 -0
- package/dist/sdk/ws_handler.d.ts.map +1 -0
- package/dist/sdk/ws_handler.js +156 -0
- package/dist/sdk/ws_handler.js.map +1 -0
- package/dist/ui/_components/app.d.ts +3 -0
- package/dist/ui/_components/app.d.ts.map +1 -0
- package/dist/ui/_components/app.js +14 -0
- package/dist/ui/_components/app.js.map +1 -0
- package/dist/ui/_components/chat_view.d.ts +3 -0
- package/dist/ui/_components/chat_view.d.ts.map +1 -0
- package/dist/ui/_components/chat_view.js +14 -0
- package/dist/ui/_components/chat_view.js.map +1 -0
- package/dist/ui/_components/controls.d.ts +2 -0
- package/dist/ui/_components/controls.d.ts.map +1 -0
- package/dist/ui/_components/controls.js +11 -0
- package/dist/ui/_components/controls.js.map +1 -0
- package/dist/ui/_components/error_banner.d.ts +7 -0
- package/dist/ui/_components/error_banner.d.ts.map +1 -0
- package/dist/ui/_components/error_banner.js +7 -0
- package/dist/ui/_components/error_banner.js.map +1 -0
- package/dist/ui/_components/message_bubble.d.ts +6 -0
- package/dist/ui/_components/message_bubble.d.ts.map +1 -0
- package/dist/ui/_components/message_bubble.js +9 -0
- package/dist/ui/_components/message_bubble.js.map +1 -0
- package/dist/ui/_components/message_list.d.ts +2 -0
- package/dist/ui/_components/message_list.d.ts.map +1 -0
- package/dist/ui/_components/message_list.js +48 -0
- package/dist/ui/_components/message_list.js.map +1 -0
- package/dist/ui/_components/state_indicator.d.ts +7 -0
- package/dist/ui/_components/state_indicator.d.ts.map +1 -0
- package/dist/ui/_components/state_indicator.js +5 -0
- package/dist/ui/_components/state_indicator.js.map +1 -0
- package/dist/ui/_components/thinking_indicator.d.ts +3 -0
- package/dist/ui/_components/thinking_indicator.d.ts.map +1 -0
- package/dist/ui/_components/thinking_indicator.js +8 -0
- package/dist/ui/_components/thinking_indicator.js.map +1 -0
- package/dist/ui/_components/tool_call_block.d.ts +6 -0
- package/dist/ui/_components/tool_call_block.d.ts.map +1 -0
- package/dist/ui/_components/tool_call_block.js +58 -0
- package/dist/ui/_components/tool_call_block.js.map +1 -0
- package/dist/ui/_components/tool_icons.d.ts +18 -0
- package/dist/ui/_components/tool_icons.d.ts.map +1 -0
- package/dist/ui/_components/tool_icons.js +26 -0
- package/dist/ui/_components/tool_icons.js.map +1 -0
- package/dist/ui/_components/transcript.d.ts +6 -0
- package/dist/ui/_components/transcript.d.ts.map +1 -0
- package/dist/ui/_components/transcript.js +8 -0
- package/dist/ui/_components/transcript.js.map +1 -0
- package/dist/ui/_dom_shim.d.ts +7 -0
- package/dist/ui/_dom_shim.d.ts.map +1 -0
- package/dist/ui/_dom_shim.js +21 -0
- package/dist/ui/_dom_shim.js.map +1 -0
- package/dist/ui/_test_utils.js +272 -0
- package/dist/ui/_test_utils.js.map +1 -0
- package/dist/ui/audio.d.ts +46 -0
- package/dist/ui/audio.d.ts.map +1 -0
- package/dist/ui/audio.js +130 -0
- package/dist/ui/audio.js.map +1 -0
- package/dist/ui/components.d.ts +36 -0
- package/dist/ui/components.d.ts.map +1 -0
- package/dist/ui/components.js +32 -0
- package/dist/ui/components.js.map +1 -0
- package/{ui/components_mod.ts → dist/ui/components_mod.d.ts} +3 -18
- package/dist/ui/components_mod.d.ts.map +1 -0
- package/dist/ui/components_mod.js +20 -0
- package/dist/ui/components_mod.js.map +1 -0
- package/dist/ui/mod.d.ts +21 -0
- package/dist/ui/mod.d.ts.map +1 -0
- package/{ui/mod.ts → dist/ui/mod.js} +3 -29
- package/dist/ui/mod.js.map +1 -0
- package/dist/ui/mount.d.ts +56 -0
- package/dist/ui/mount.d.ts.map +1 -0
- package/dist/ui/mount.js +60 -0
- package/dist/ui/mount.js.map +1 -0
- package/dist/ui/mount_context.d.ts +10 -0
- package/dist/ui/mount_context.d.ts.map +1 -0
- package/dist/ui/mount_context.js +10 -0
- package/dist/ui/mount_context.js.map +1 -0
- package/dist/ui/session.d.ts +91 -0
- package/dist/ui/session.d.ts.map +1 -0
- package/dist/ui/session.js +366 -0
- package/dist/ui/session.js.map +1 -0
- package/{ui/session_mod.ts → dist/ui/session_mod.d.ts} +2 -10
- package/dist/ui/session_mod.d.ts.map +1 -0
- package/dist/ui/session_mod.js +18 -0
- package/dist/ui/session_mod.js.map +1 -0
- package/dist/ui/signals.d.ts +61 -0
- package/dist/ui/signals.d.ts.map +1 -0
- package/dist/ui/signals.js +74 -0
- package/dist/ui/signals.js.map +1 -0
- package/dist/ui/types.d.ts +36 -0
- package/dist/ui/types.d.ts.map +1 -0
- package/dist/ui/types.js +4 -0
- package/dist/ui/types.js.map +1 -0
- package/package.json +103 -28
- package/sdk/_internal_types.ts +0 -89
- package/sdk/_mock_ws.ts +0 -172
- package/sdk/builtin_tools.ts +0 -309
- package/sdk/capnweb.ts +0 -341
- package/sdk/define_agent.ts +0 -70
- package/sdk/direct_executor.ts +0 -195
- package/sdk/kv.ts +0 -183
- package/sdk/protocol.ts +0 -313
- package/sdk/runtime.ts +0 -65
- package/sdk/s2s.ts +0 -271
- package/sdk/server.ts +0 -198
- package/sdk/session.ts +0 -438
- package/sdk/system_prompt.ts +0 -47
- package/sdk/types.ts +0 -406
- package/sdk/vector.ts +0 -133
- package/sdk/winterc_server.ts +0 -141
- package/sdk/worker_entry.ts +0 -99
- package/sdk/worker_shim.ts +0 -170
- package/sdk/ws_handler.ts +0 -190
- package/templates/_shared/.env.example +0 -5
- package/templates/_shared/package.json +0 -17
- package/templates/code-interpreter/agent.ts +0 -27
- package/templates/code-interpreter/client.tsx +0 -2
- package/templates/dispatch-center/agent.ts +0 -1536
- package/templates/dispatch-center/client.tsx +0 -504
- package/templates/embedded-assets/agent.ts +0 -49
- package/templates/embedded-assets/client.tsx +0 -2
- package/templates/embedded-assets/knowledge.json +0 -20
- package/templates/health-assistant/agent.ts +0 -160
- package/templates/health-assistant/client.tsx +0 -2
- package/templates/infocom-adventure/agent.ts +0 -164
- package/templates/infocom-adventure/client.tsx +0 -299
- package/templates/math-buddy/agent.ts +0 -21
- package/templates/math-buddy/client.tsx +0 -2
- package/templates/memory-agent/agent.ts +0 -74
- package/templates/memory-agent/client.tsx +0 -2
- package/templates/night-owl/agent.ts +0 -98
- package/templates/night-owl/client.tsx +0 -28
- package/templates/personal-finance/agent.ts +0 -26
- package/templates/personal-finance/client.tsx +0 -2
- package/templates/simple/agent.ts +0 -6
- package/templates/simple/client.tsx +0 -2
- package/templates/smart-research/agent.ts +0 -164
- package/templates/smart-research/client.tsx +0 -2
- package/templates/support/README.md +0 -62
- package/templates/support/agent.ts +0 -19
- package/templates/support/client.tsx +0 -2
- package/templates/travel-concierge/agent.ts +0 -29
- package/templates/travel-concierge/client.tsx +0 -2
- package/templates/web-researcher/agent.ts +0 -17
- package/templates/web-researcher/client.tsx +0 -2
- package/ui/_components/app.tsx +0 -37
- package/ui/_components/chat_view.tsx +0 -36
- package/ui/_components/controls.tsx +0 -32
- package/ui/_components/error_banner.tsx +0 -18
- package/ui/_components/message_bubble.tsx +0 -21
- package/ui/_components/message_list.tsx +0 -61
- package/ui/_components/state_indicator.tsx +0 -17
- package/ui/_components/thinking_indicator.tsx +0 -19
- package/ui/_components/tool_call_block.tsx +0 -110
- package/ui/_components/tool_icons.tsx +0 -101
- package/ui/_components/transcript.tsx +0 -20
- package/ui/audio.ts +0 -170
- package/ui/components.ts +0 -49
- package/ui/mount.tsx +0 -112
- package/ui/mount_context.ts +0 -19
- package/ui/session.ts +0 -456
- package/ui/signals.ts +0 -111
- package/ui/types.ts +0 -50
- package/ui/worklets/capture-processor.js +0 -62
- package/ui/worklets/playback-processor.js +0 -110
|
@@ -0,0 +1,263 @@
|
|
|
1
|
+
// Copyright 2025 the AAI authors. MIT license.
|
|
2
|
+
/**
|
|
3
|
+
* Built-in tool definitions for the AAI agent SDK.
|
|
4
|
+
*
|
|
5
|
+
* These tools run inside the sandboxed worker alongside custom tools.
|
|
6
|
+
* Network requests go through the host's fetch proxy (with SSRF protection).
|
|
7
|
+
*
|
|
8
|
+
* @module
|
|
9
|
+
*/
|
|
10
|
+
import { z } from "zod";
|
|
11
|
+
const EMPTY_PARAMS = z.object({});
|
|
12
|
+
// ─── HTML to text ──────────────────────────────────────────────────────────
|
|
13
|
+
function htmlToText(html) {
|
|
14
|
+
return html
|
|
15
|
+
.replace(/<script[^>]*>[\s\S]*?<\/script>/gi, "")
|
|
16
|
+
.replace(/<style[^>]*>[\s\S]*?<\/style>/gi, "")
|
|
17
|
+
.replace(/<(br|hr)\s*\/?>/gi, "\n")
|
|
18
|
+
.replace(/<\/(p|div|li|h[1-6]|tr|blockquote)>/gi, "\n")
|
|
19
|
+
.replace(/<[^>]+>/g, " ")
|
|
20
|
+
.replace(/ /g, " ")
|
|
21
|
+
.replace(/&/g, "&")
|
|
22
|
+
.replace(/</g, "<")
|
|
23
|
+
.replace(/>/g, ">")
|
|
24
|
+
.replace(/"/g, '"')
|
|
25
|
+
.replace(/�?39;/g, "'")
|
|
26
|
+
.replace(/[ \t]+/g, " ")
|
|
27
|
+
.replace(/\n /g, "\n")
|
|
28
|
+
.replace(/\n{3,}/g, "\n\n")
|
|
29
|
+
.trim();
|
|
30
|
+
}
|
|
31
|
+
// ─── web_search ────────────────────────────────────────────────────────────
|
|
32
|
+
const webSearchParams = z.object({
|
|
33
|
+
query: z.string().describe("The search query"),
|
|
34
|
+
max_results: z.number().describe("Maximum number of results to return (default 5)").optional(),
|
|
35
|
+
});
|
|
36
|
+
const BRAVE_SEARCH_URL = "https://api.search.brave.com/res/v1/web/search";
|
|
37
|
+
const BraveSearchResponseSchema = z.object({
|
|
38
|
+
web: z
|
|
39
|
+
.object({
|
|
40
|
+
results: z.array(z.object({
|
|
41
|
+
title: z.string(),
|
|
42
|
+
url: z.string(),
|
|
43
|
+
description: z.string(),
|
|
44
|
+
})),
|
|
45
|
+
})
|
|
46
|
+
.optional(),
|
|
47
|
+
});
|
|
48
|
+
function createWebSearch() {
|
|
49
|
+
return {
|
|
50
|
+
description: "Search the web for current information, facts, news, or answers to questions. Returns a list of results with title, URL, and description. Use this when the user asks about something you don't know, need up-to-date information, or want to verify facts.",
|
|
51
|
+
parameters: webSearchParams,
|
|
52
|
+
async execute(args, ctx) {
|
|
53
|
+
const { query, max_results: maxResults = 5 } = args;
|
|
54
|
+
const apiKey = ctx.env.BRAVE_API_KEY ?? "";
|
|
55
|
+
if (!apiKey) {
|
|
56
|
+
return { error: "BRAVE_API_KEY is not set — web search unavailable" };
|
|
57
|
+
}
|
|
58
|
+
const url = `${BRAVE_SEARCH_URL}?${new URLSearchParams({
|
|
59
|
+
q: query,
|
|
60
|
+
count: String(maxResults),
|
|
61
|
+
text_decorations: "false",
|
|
62
|
+
})}`;
|
|
63
|
+
const resp = await fetch(url, {
|
|
64
|
+
headers: { "X-Subscription-Token": apiKey },
|
|
65
|
+
signal: ctx.abortSignal ?? AbortSignal.timeout(15_000),
|
|
66
|
+
});
|
|
67
|
+
if (!resp.ok)
|
|
68
|
+
return [];
|
|
69
|
+
const raw = await resp.json();
|
|
70
|
+
const data = BraveSearchResponseSchema.safeParse(raw);
|
|
71
|
+
if (!data.success)
|
|
72
|
+
return [];
|
|
73
|
+
return (data.data.web?.results ?? []).slice(0, maxResults).map((r) => ({
|
|
74
|
+
title: r.title,
|
|
75
|
+
url: r.url,
|
|
76
|
+
description: r.description,
|
|
77
|
+
}));
|
|
78
|
+
},
|
|
79
|
+
};
|
|
80
|
+
}
|
|
81
|
+
// ─── visit_webpage ─────────────────────────────────────────────────────────
|
|
82
|
+
const MAX_PAGE_CHARS = 10_000;
|
|
83
|
+
const MAX_HTML_BYTES = 200_000;
|
|
84
|
+
const visitWebpageParams = z.object({
|
|
85
|
+
url: z.string().describe("The full URL to fetch (e.g., 'https://example.com/page')"),
|
|
86
|
+
});
|
|
87
|
+
function createVisitWebpage() {
|
|
88
|
+
return {
|
|
89
|
+
description: "Fetch a webpage and return its content as clean text. Use this to read the full content of a URL found via web_search, or any link the user shares. Good for reading articles, documentation, blog posts, or product pages.",
|
|
90
|
+
parameters: visitWebpageParams,
|
|
91
|
+
async execute(args, ctx) {
|
|
92
|
+
const { url } = args;
|
|
93
|
+
const resp = await fetch(url, {
|
|
94
|
+
headers: {
|
|
95
|
+
"User-Agent": "Mozilla/5.0 (compatible; VoiceAgent/1.0; +https://github.com/AssemblyAI/aai)",
|
|
96
|
+
Accept: "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8",
|
|
97
|
+
},
|
|
98
|
+
redirect: "follow",
|
|
99
|
+
signal: ctx.abortSignal ?? AbortSignal.timeout(15_000),
|
|
100
|
+
});
|
|
101
|
+
if (!resp.ok) {
|
|
102
|
+
return { error: `Failed to fetch: ${resp.status} ${resp.statusText}`, url };
|
|
103
|
+
}
|
|
104
|
+
const htmlContent = await resp.text();
|
|
105
|
+
const trimmedHtml = htmlContent.length > MAX_HTML_BYTES ? htmlContent.slice(0, MAX_HTML_BYTES) : htmlContent;
|
|
106
|
+
const text = htmlToText(trimmedHtml);
|
|
107
|
+
const truncated = text.length > MAX_PAGE_CHARS;
|
|
108
|
+
const content = truncated ? text.slice(0, MAX_PAGE_CHARS) : text;
|
|
109
|
+
return {
|
|
110
|
+
url,
|
|
111
|
+
content,
|
|
112
|
+
...(truncated ? { truncated: true, totalChars: text.length } : {}),
|
|
113
|
+
};
|
|
114
|
+
},
|
|
115
|
+
};
|
|
116
|
+
}
|
|
117
|
+
// ─── fetch_json ────────────────────────────────────────────────────────────
|
|
118
|
+
const fetchJsonParams = z.object({
|
|
119
|
+
url: z.string().describe("The URL to fetch JSON from"),
|
|
120
|
+
headers: z
|
|
121
|
+
.record(z.string(), z.string())
|
|
122
|
+
.describe("Optional HTTP headers to include in the request")
|
|
123
|
+
.optional(),
|
|
124
|
+
});
|
|
125
|
+
function createFetchJson() {
|
|
126
|
+
return {
|
|
127
|
+
description: "Call a REST API endpoint via HTTP GET and return the JSON response. Use this to fetch structured data from APIs — for example, weather data, stock prices, exchange rates, or any public JSON API. Supports custom headers for authenticated APIs.",
|
|
128
|
+
parameters: fetchJsonParams,
|
|
129
|
+
async execute(args, ctx) {
|
|
130
|
+
const { url, headers } = args;
|
|
131
|
+
const resp = await fetch(url, {
|
|
132
|
+
...(headers && { headers }),
|
|
133
|
+
signal: ctx.abortSignal ?? AbortSignal.timeout(15_000),
|
|
134
|
+
});
|
|
135
|
+
if (!resp.ok) {
|
|
136
|
+
return { error: `HTTP ${resp.status} ${resp.statusText}`, url };
|
|
137
|
+
}
|
|
138
|
+
try {
|
|
139
|
+
return await resp.json();
|
|
140
|
+
}
|
|
141
|
+
catch {
|
|
142
|
+
return { error: "Response was not valid JSON", url };
|
|
143
|
+
}
|
|
144
|
+
},
|
|
145
|
+
};
|
|
146
|
+
}
|
|
147
|
+
// ─── run_code ──────────────────────────────────────────────────────────────
|
|
148
|
+
const runCodeParams = z.object({
|
|
149
|
+
code: z.string().describe("JavaScript code to execute. Use console.log() for output."),
|
|
150
|
+
});
|
|
151
|
+
function createRunCode() {
|
|
152
|
+
return {
|
|
153
|
+
description: "Execute JavaScript code in a secure sandbox and return the output. Use this for calculations, data transformations, string manipulation, or any task that benefits from running code. Output is captured from console.log(). No network or filesystem access.",
|
|
154
|
+
parameters: runCodeParams,
|
|
155
|
+
async execute(args) {
|
|
156
|
+
const { code } = args;
|
|
157
|
+
const output = [];
|
|
158
|
+
function capture(...captureArgs) {
|
|
159
|
+
output.push(captureArgs.map(String).join(" "));
|
|
160
|
+
}
|
|
161
|
+
const fakeConsole = {
|
|
162
|
+
log: capture,
|
|
163
|
+
info: capture,
|
|
164
|
+
warn: capture,
|
|
165
|
+
error: capture,
|
|
166
|
+
debug: capture,
|
|
167
|
+
};
|
|
168
|
+
const AsyncFunction = Object.getPrototypeOf(async () => { }).constructor;
|
|
169
|
+
try {
|
|
170
|
+
const fn = new AsyncFunction("console", code);
|
|
171
|
+
await fn(fakeConsole);
|
|
172
|
+
const result = output.join("\n").trim();
|
|
173
|
+
return result || "Code ran successfully (no output)";
|
|
174
|
+
}
|
|
175
|
+
catch (err) {
|
|
176
|
+
return { error: err instanceof Error ? err.message : String(err) };
|
|
177
|
+
}
|
|
178
|
+
},
|
|
179
|
+
};
|
|
180
|
+
}
|
|
181
|
+
// ─── vector_search ─────────────────────────────────────────────────────────
|
|
182
|
+
const vectorSearchParams = z.object({
|
|
183
|
+
query: z
|
|
184
|
+
.string()
|
|
185
|
+
.describe("Short keyword query to search the knowledge base. Use specific topic " +
|
|
186
|
+
"terms, not full sentences. Do NOT include the company or product name " +
|
|
187
|
+
"since all documents are from the same source. For example, if the user " +
|
|
188
|
+
'asks "how much does Acme cost", search for "pricing plans rates".'),
|
|
189
|
+
topK: z.number().describe("Maximum results to return (default: 5)").optional(),
|
|
190
|
+
});
|
|
191
|
+
function createVectorSearch(vectorSearchFn) {
|
|
192
|
+
return {
|
|
193
|
+
description: "Search the agent's knowledge base for relevant information. Use this when the user asks a question that might be answered by previously ingested documents or data. Returns the most relevant matches ranked by similarity.",
|
|
194
|
+
parameters: vectorSearchParams,
|
|
195
|
+
async execute(args) {
|
|
196
|
+
const { query, topK = 5 } = args;
|
|
197
|
+
return vectorSearchFn(query, topK);
|
|
198
|
+
},
|
|
199
|
+
};
|
|
200
|
+
}
|
|
201
|
+
/**
|
|
202
|
+
* Create built-in tool definitions for the given tool names.
|
|
203
|
+
*
|
|
204
|
+
* @param names - Built-in tool names from the agent config.
|
|
205
|
+
* @param opts - Options including RPC callbacks for host-proxied tools.
|
|
206
|
+
* @returns A record of tool name → ToolDef.
|
|
207
|
+
*/
|
|
208
|
+
export function getBuiltinToolDefs(names, opts) {
|
|
209
|
+
const defs = {};
|
|
210
|
+
for (const name of names) {
|
|
211
|
+
switch (name) {
|
|
212
|
+
case "web_search":
|
|
213
|
+
defs[name] = createWebSearch();
|
|
214
|
+
break;
|
|
215
|
+
case "visit_webpage":
|
|
216
|
+
defs[name] = createVisitWebpage();
|
|
217
|
+
break;
|
|
218
|
+
case "fetch_json":
|
|
219
|
+
defs[name] = createFetchJson();
|
|
220
|
+
break;
|
|
221
|
+
case "run_code":
|
|
222
|
+
defs[name] = createRunCode();
|
|
223
|
+
break;
|
|
224
|
+
case "vector_search":
|
|
225
|
+
if (opts?.vectorSearch) {
|
|
226
|
+
defs[name] = createVectorSearch(opts.vectorSearch);
|
|
227
|
+
}
|
|
228
|
+
break;
|
|
229
|
+
}
|
|
230
|
+
}
|
|
231
|
+
return defs;
|
|
232
|
+
}
|
|
233
|
+
/** All available tool creators, keyed by builtin tool name. */
|
|
234
|
+
const TOOL_CREATORS = {
|
|
235
|
+
web_search: createWebSearch,
|
|
236
|
+
visit_webpage: createVisitWebpage,
|
|
237
|
+
fetch_json: createFetchJson,
|
|
238
|
+
run_code: createRunCode,
|
|
239
|
+
// vector_search uses a stub for schema generation
|
|
240
|
+
vector_search: () => createVectorSearch(async () => ""),
|
|
241
|
+
};
|
|
242
|
+
/**
|
|
243
|
+
* Returns JSON tool schemas for the specified builtin tools.
|
|
244
|
+
*
|
|
245
|
+
* Used by both the worker (to report schemas) and the server (to
|
|
246
|
+
* assemble tool lists for the LLM).
|
|
247
|
+
*/
|
|
248
|
+
export function getBuiltinToolSchemas(names) {
|
|
249
|
+
return names.flatMap((name) => {
|
|
250
|
+
const creator = TOOL_CREATORS[name];
|
|
251
|
+
if (!creator)
|
|
252
|
+
return [];
|
|
253
|
+
const def = creator();
|
|
254
|
+
return [
|
|
255
|
+
{
|
|
256
|
+
name,
|
|
257
|
+
description: def.description,
|
|
258
|
+
parameters: z.toJSONSchema(def.parameters ?? EMPTY_PARAMS),
|
|
259
|
+
},
|
|
260
|
+
];
|
|
261
|
+
});
|
|
262
|
+
}
|
|
263
|
+
//# sourceMappingURL=builtin_tools.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"builtin_tools.js","sourceRoot":"","sources":["../../sdk/builtin_tools.ts"],"names":[],"mappings":"AAAA,+CAA+C;AAC/C;;;;;;;GAOG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAIxB,MAAM,YAAY,GAAG,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;AAElC,8EAA8E;AAE9E,SAAS,UAAU,CAAC,IAAY;IAC9B,OAAO,IAAI;SACR,OAAO,CAAC,mCAAmC,EAAE,EAAE,CAAC;SAChD,OAAO,CAAC,iCAAiC,EAAE,EAAE,CAAC;SAC9C,OAAO,CAAC,mBAAmB,EAAE,IAAI,CAAC;SAClC,OAAO,CAAC,uCAAuC,EAAE,IAAI,CAAC;SACtD,OAAO,CAAC,UAAU,EAAE,GAAG,CAAC;SACxB,OAAO,CAAC,SAAS,EAAE,GAAG,CAAC;SACvB,OAAO,CAAC,QAAQ,EAAE,GAAG,CAAC;SACtB,OAAO,CAAC,OAAO,EAAE,GAAG,CAAC;SACrB,OAAO,CAAC,OAAO,EAAE,GAAG,CAAC;SACrB,OAAO,CAAC,SAAS,EAAE,GAAG,CAAC;SACvB,OAAO,CAAC,UAAU,EAAE,GAAG,CAAC;SACxB,OAAO,CAAC,SAAS,EAAE,GAAG,CAAC;SACvB,OAAO,CAAC,MAAM,EAAE,IAAI,CAAC;SACrB,OAAO,CAAC,SAAS,EAAE,MAAM,CAAC;SAC1B,IAAI,EAAE,CAAC;AACZ,CAAC;AAED,8EAA8E;AAE9E,MAAM,eAAe,GAAG,CAAC,CAAC,MAAM,CAAC;IAC/B,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,kBAAkB,CAAC;IAC9C,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,iDAAiD,CAAC,CAAC,QAAQ,EAAE;CAC/F,CAAC,CAAC;AAEH,MAAM,gBAAgB,GAAG,gDAAgD,CAAC;AAE1E,MAAM,yBAAyB,GAAG,CAAC,CAAC,MAAM,CAAC;IACzC,GAAG,EAAE,CAAC;SACH,MAAM,CAAC;QACN,OAAO,EAAE,CAAC,CAAC,KAAK,CACd,CAAC,CAAC,MAAM,CAAC;YACP,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE;YACjB,GAAG,EAAE,CAAC,CAAC,MAAM,EAAE;YACf,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE;SACxB,CAAC,CACH;KACF,CAAC;SACD,QAAQ,EAAE;CACd,CAAC,CAAC;AAEH,SAAS,eAAe;IACtB,OAAO;QACL,WAAW,EACT,6PAA6P;QAC/P,UAAU,EAAE,eAAe;QAC3B,KAAK,CAAC,OAAO,CAAC,IAAI,EAAE,GAAG;YACrB,MAAM,EAAE,KAAK,EAAE,WAAW,EAAE,UAAU,GAAG,CAAC,EAAE,GAAG,IAAI,CAAC;YACpD,MAAM,MAAM,GAAG,GAAG,CAAC,GAAG,CAAC,aAAa,IAAI,EAAE,CAAC;YAC3C,IAAI,CAAC,MAAM,EAAE,CAAC;gBACZ,OAAO,EAAE,KAAK,EAAE,mDAAmD,EAAE,CAAC;YACxE,CAAC;YACD,MAAM,GAAG,GAAG,GAAG,gBAAgB,IAAI,IAAI,eAAe,CAAC;gBACrD,CAAC,EAAE,KAAK;gBACR,KAAK,EAAE,MAAM,CAAC,UAAU,CAAC;gBACzB,gBAAgB,EAAE,OAAO;aAC1B,CAAC,EAAE,CAAC;YACL,MAAM,IAAI,GAAG,MAAM,KAAK,CAAC,GAAG,EAAE;gBAC5B,OAAO,EAAE,EAAE,sBAAsB,EAAE,MAAM,EAAE;gBAC3C,MAAM,EAAE,GAAG,CAAC,WAAW,IAAI,WAAW,CAAC,OAAO,CAAC,MAAM,CAAC;aACvD,CAAC,CAAC;YACH,IAAI,CAAC,IAAI,CAAC,EAAE;gBAAE,OAAO,EAAE,CAAC;YACxB,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,IAAI,EAAE,CAAC;YAC9B,MAAM,IAAI,GAAG,yBAAyB,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC;YACtD,IAAI,CAAC,IAAI,CAAC,OAAO;gBAAE,OAAO,EAAE,CAAC;YAC7B,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,OAAO,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,UAAU,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;gBACrE,KAAK,EAAE,CAAC,CAAC,KAAK;gBACd,GAAG,EAAE,CAAC,CAAC,GAAG;gBACV,WAAW,EAAE,CAAC,CAAC,WAAW;aAC3B,CAAC,CAAC,CAAC;QACN,CAAC;KACF,CAAC;AACJ,CAAC;AAED,8EAA8E;AAE9E,MAAM,cAAc,GAAG,MAAM,CAAC;AAC9B,MAAM,cAAc,GAAG,OAAO,CAAC;AAE/B,MAAM,kBAAkB,GAAG,CAAC,CAAC,MAAM,CAAC;IAClC,GAAG,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,0DAA0D,CAAC;CACrF,CAAC,CAAC;AAEH,SAAS,kBAAkB;IACzB,OAAO;QACL,WAAW,EACT,6NAA6N;QAC/N,UAAU,EAAE,kBAAkB;QAC9B,KAAK,CAAC,OAAO,CAAC,IAAI,EAAE,GAAG;YACrB,MAAM,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC;YACrB,MAAM,IAAI,GAAG,MAAM,KAAK,CAAC,GAAG,EAAE;gBAC5B,OAAO,EAAE;oBACP,YAAY,EACV,8EAA8E;oBAChF,MAAM,EAAE,iEAAiE;iBAC1E;gBACD,QAAQ,EAAE,QAAQ;gBAClB,MAAM,EAAE,GAAG,CAAC,WAAW,IAAI,WAAW,CAAC,OAAO,CAAC,MAAM,CAAC;aACvD,CAAC,CAAC;YACH,IAAI,CAAC,IAAI,CAAC,EAAE,EAAE,CAAC;gBACb,OAAO,EAAE,KAAK,EAAE,oBAAoB,IAAI,CAAC,MAAM,IAAI,IAAI,CAAC,UAAU,EAAE,EAAE,GAAG,EAAE,CAAC;YAC9E,CAAC;YACD,MAAM,WAAW,GAAG,MAAM,IAAI,CAAC,IAAI,EAAE,CAAC;YACtC,MAAM,WAAW,GACf,WAAW,CAAC,MAAM,GAAG,cAAc,CAAC,CAAC,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC,EAAE,cAAc,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC;YAC3F,MAAM,IAAI,GAAG,UAAU,CAAC,WAAW,CAAC,CAAC;YACrC,MAAM,SAAS,GAAG,IAAI,CAAC,MAAM,GAAG,cAAc,CAAC;YAC/C,MAAM,OAAO,GAAG,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,cAAc,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;YACjE,OAAO;gBACL,GAAG;gBACH,OAAO;gBACP,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,IAAI,EAAE,UAAU,EAAE,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;aACnE,CAAC;QACJ,CAAC;KACF,CAAC;AACJ,CAAC;AAED,8EAA8E;AAE9E,MAAM,eAAe,GAAG,CAAC,CAAC,MAAM,CAAC;IAC/B,GAAG,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,4BAA4B,CAAC;IACtD,OAAO,EAAE,CAAC;SACP,MAAM,CAAC,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC;SAC9B,QAAQ,CAAC,iDAAiD,CAAC;SAC3D,QAAQ,EAAE;CACd,CAAC,CAAC;AAEH,SAAS,eAAe;IACtB,OAAO;QACL,WAAW,EACT,oPAAoP;QACtP,UAAU,EAAE,eAAe;QAC3B,KAAK,CAAC,OAAO,CAAC,IAAI,EAAE,GAAG;YACrB,MAAM,EAAE,GAAG,EAAE,OAAO,EAAE,GAAG,IAAI,CAAC;YAC9B,MAAM,IAAI,GAAG,MAAM,KAAK,CAAC,GAAG,EAAE;gBAC5B,GAAG,CAAC,OAAO,IAAI,EAAE,OAAO,EAAE,CAAC;gBAC3B,MAAM,EAAE,GAAG,CAAC,WAAW,IAAI,WAAW,CAAC,OAAO,CAAC,MAAM,CAAC;aACvD,CAAC,CAAC;YACH,IAAI,CAAC,IAAI,CAAC,EAAE,EAAE,CAAC;gBACb,OAAO,EAAE,KAAK,EAAE,QAAQ,IAAI,CAAC,MAAM,IAAI,IAAI,CAAC,UAAU,EAAE,EAAE,GAAG,EAAE,CAAC;YAClE,CAAC;YACD,IAAI,CAAC;gBACH,OAAO,MAAM,IAAI,CAAC,IAAI,EAAE,CAAC;YAC3B,CAAC;YAAC,MAAM,CAAC;gBACP,OAAO,EAAE,KAAK,EAAE,6BAA6B,EAAE,GAAG,EAAE,CAAC;YACvD,CAAC;QACH,CAAC;KACF,CAAC;AACJ,CAAC;AAED,8EAA8E;AAE9E,MAAM,aAAa,GAAG,CAAC,CAAC,MAAM,CAAC;IAC7B,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,2DAA2D,CAAC;CACvF,CAAC,CAAC;AAEH,SAAS,aAAa;IACpB,OAAO;QACL,WAAW,EACT,+PAA+P;QACjQ,UAAU,EAAE,aAAa;QACzB,KAAK,CAAC,OAAO,CAAC,IAAI;YAChB,MAAM,EAAE,IAAI,EAAE,GAAG,IAAI,CAAC;YACtB,MAAM,MAAM,GAAa,EAAE,CAAC;YAC5B,SAAS,OAAO,CAAC,GAAG,WAAsB;gBACxC,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;YACjD,CAAC;YACD,MAAM,WAAW,GAAG;gBAClB,GAAG,EAAE,OAAO;gBACZ,IAAI,EAAE,OAAO;gBACb,IAAI,EAAE,OAAO;gBACb,KAAK,EAAE,OAAO;gBACd,KAAK,EAAE,OAAO;aACf,CAAC;YACF,MAAM,aAAa,GAAG,MAAM,CAAC,cAAc,CAAC,KAAK,IAAI,EAAE,GAAE,CAAC,CAAC,CAAC,WAAW,CAAC;YACxE,IAAI,CAAC;gBACH,MAAM,EAAE,GAAG,IAAI,aAAa,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC;gBAC9C,MAAM,EAAE,CAAC,WAAW,CAAC,CAAC;gBACtB,MAAM,MAAM,GAAG,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,CAAC;gBACxC,OAAO,MAAM,IAAI,mCAAmC,CAAC;YACvD,CAAC;YAAC,OAAO,GAAY,EAAE,CAAC;gBACtB,OAAO,EAAE,KAAK,EAAE,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC;YACrE,CAAC;QACH,CAAC;KACF,CAAC;AACJ,CAAC;AAED,8EAA8E;AAE9E,MAAM,kBAAkB,GAAG,CAAC,CAAC,MAAM,CAAC;IAClC,KAAK,EAAE,CAAC;SACL,MAAM,EAAE;SACR,QAAQ,CACP,uEAAuE;QACrE,wEAAwE;QACxE,yEAAyE;QACzE,mEAAmE,CACtE;IACH,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,wCAAwC,CAAC,CAAC,QAAQ,EAAE;CAC/E,CAAC,CAAC;AAKH,SAAS,kBAAkB,CAAC,cAA8B;IACxD,OAAO;QACL,WAAW,EACT,6NAA6N;QAC/N,UAAU,EAAE,kBAAkB;QAC9B,KAAK,CAAC,OAAO,CAAC,IAAI;YAChB,MAAM,EAAE,KAAK,EAAE,IAAI,GAAG,CAAC,EAAE,GAAG,IAAI,CAAC;YACjC,OAAO,cAAc,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;QACrC,CAAC;KACF,CAAC;AACJ,CAAC;AAUD;;;;;;GAMG;AACH,MAAM,UAAU,kBAAkB,CAChC,KAAwB,EACxB,IAAyB;IAEzB,MAAM,IAAI,GAA4B,EAAE,CAAC;IACzC,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,QAAQ,IAAI,EAAE,CAAC;YACb,KAAK,YAAY;gBACf,IAAI,CAAC,IAAI,CAAC,GAAG,eAAe,EAAE,CAAC;gBAC/B,MAAM;YACR,KAAK,eAAe;gBAClB,IAAI,CAAC,IAAI,CAAC,GAAG,kBAAkB,EAAE,CAAC;gBAClC,MAAM;YACR,KAAK,YAAY;gBACf,IAAI,CAAC,IAAI,CAAC,GAAG,eAAe,EAAE,CAAC;gBAC/B,MAAM;YACR,KAAK,UAAU;gBACb,IAAI,CAAC,IAAI,CAAC,GAAG,aAAa,EAAE,CAAC;gBAC7B,MAAM;YACR,KAAK,eAAe;gBAClB,IAAI,IAAI,EAAE,YAAY,EAAE,CAAC;oBACvB,IAAI,CAAC,IAAI,CAAC,GAAG,kBAAkB,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;gBACrD,CAAC;gBACD,MAAM;QACV,CAAC;IACH,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,+DAA+D;AAC/D,MAAM,aAAa,GAAkC;IACnD,UAAU,EAAE,eAAe;IAC3B,aAAa,EAAE,kBAAkB;IACjC,UAAU,EAAE,eAAe;IAC3B,QAAQ,EAAE,aAAa;IACvB,kDAAkD;IAClD,aAAa,EAAE,GAAG,EAAE,CAAC,kBAAkB,CAAC,KAAK,IAAI,EAAE,CAAC,EAAE,CAAC;CACxD,CAAC;AAEF;;;;;GAKG;AACH,MAAM,UAAU,qBAAqB,CAAC,KAAwB;IAC5D,OAAO,KAAK,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,EAAE;QAC5B,MAAM,OAAO,GAAG,aAAa,CAAC,IAAI,CAAC,CAAC;QACpC,IAAI,CAAC,OAAO;YAAE,OAAO,EAAE,CAAC;QACxB,MAAM,GAAG,GAAG,OAAO,EAAE,CAAC;QACtB,OAAO;YACL;gBACE,IAAI;gBACJ,WAAW,EAAE,GAAG,CAAC,WAAW;gBAC5B,UAAU,EAAE,CAAC,CAAC,YAAY,CAAC,GAAG,CAAC,UAAU,IAAI,YAAY,CAA6B;aACvF;SACF,CAAC;IACJ,CAAC,CAAC,CAAC;AACL,CAAC"}
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* MessagePort RPC + WebSocket bridge for capnweb sandbox communication.
|
|
3
|
+
*
|
|
4
|
+
* Provides bidirectional RPC over MessagePort/Worker and WebSocket
|
|
5
|
+
* bridging for both standard WebSocket (client connections) and
|
|
6
|
+
* S2sWebSocket (.on()-style API for S2S connections).
|
|
7
|
+
*
|
|
8
|
+
* @module
|
|
9
|
+
*/
|
|
10
|
+
import type { S2sWebSocket } from "./s2s.ts";
|
|
11
|
+
/** Minimal port interface for CapnwebEndpoint. Works with Worker, MessagePort, or worker self. */
|
|
12
|
+
export type CapnwebPort = {
|
|
13
|
+
postMessage(msg: unknown, transfer?: Transferable[]): void;
|
|
14
|
+
onmessage: ((ev: MessageEvent) => any) | null;
|
|
15
|
+
};
|
|
16
|
+
/** RPC handler function. Receives call arguments and any transferred ports. */
|
|
17
|
+
export type RpcHandler = (args: unknown[], ports: readonly MessagePort[]) => unknown | Promise<unknown>;
|
|
18
|
+
/**
|
|
19
|
+
* Bidirectional RPC endpoint over MessagePort or Worker.
|
|
20
|
+
*
|
|
21
|
+
* Both sides can send calls and handle incoming calls on the same channel.
|
|
22
|
+
*
|
|
23
|
+
* Wire protocol:
|
|
24
|
+
* - Call: `{$: 0, id: number, m: string, a: unknown[]}`
|
|
25
|
+
* - Result: `{$: 1, id: number, v?: unknown, e?: string}`
|
|
26
|
+
* - Notify (fire-and-forget): id = -1, no response sent
|
|
27
|
+
*/
|
|
28
|
+
export declare class CapnwebEndpoint {
|
|
29
|
+
private nextId;
|
|
30
|
+
private pending;
|
|
31
|
+
private handlers;
|
|
32
|
+
private port;
|
|
33
|
+
constructor(port: CapnwebPort);
|
|
34
|
+
/** Register an RPC handler for incoming calls with the given method name. */
|
|
35
|
+
handle(method: string, handler: RpcHandler): void;
|
|
36
|
+
/** Call a remote method and wait for the result. */
|
|
37
|
+
call(method: string, args: unknown[], transfer?: Transferable[]): Promise<unknown>;
|
|
38
|
+
/** Fire-and-forget: call a remote method without waiting for a response. */
|
|
39
|
+
notify(method: string, args: unknown[], transfer?: Transferable[]): void;
|
|
40
|
+
private send;
|
|
41
|
+
private onMessage;
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* Wraps a MessagePort as a standard WebSocket (extends EventTarget).
|
|
45
|
+
* Used in the worker for client connections bridged from the host.
|
|
46
|
+
*/
|
|
47
|
+
export declare class BridgedWebSocket extends EventTarget {
|
|
48
|
+
readyState: number;
|
|
49
|
+
private port;
|
|
50
|
+
constructor(port: MessagePort);
|
|
51
|
+
send(data: string | ArrayBuffer | Uint8Array): void;
|
|
52
|
+
close(code?: number, reason?: string): void;
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* Wraps a MessagePort as an {@linkcode S2sWebSocket} (.on() event API).
|
|
56
|
+
* Used in the worker for S2S connections bridged from the host.
|
|
57
|
+
*/
|
|
58
|
+
export declare function createBridgedS2sWebSocket(port: MessagePort): S2sWebSocket;
|
|
59
|
+
/**
|
|
60
|
+
* Bridges a standard WebSocket (e.g. from `Deno.upgradeWebSocket`) to a
|
|
61
|
+
* MessagePort. Used on the host side for client connections.
|
|
62
|
+
*/
|
|
63
|
+
export declare function bridgeWebSocketToPort(ws: WebSocket, port: MessagePort): void;
|
|
64
|
+
/**
|
|
65
|
+
* Bridges a ws-style {@linkcode S2sWebSocket} to a MessagePort.
|
|
66
|
+
* Used on the host side for S2S connections to AssemblyAI.
|
|
67
|
+
*/
|
|
68
|
+
export declare function bridgeS2sWebSocketToPort(ws: S2sWebSocket, port: MessagePort): void;
|
|
69
|
+
//# sourceMappingURL=capnweb.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"capnweb.d.ts","sourceRoot":"","sources":["../../sdk/capnweb.ts"],"names":[],"mappings":"AACA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC;AAI7C,kGAAkG;AAClG,MAAM,MAAM,WAAW,GAAG;IACxB,WAAW,CAAC,GAAG,EAAE,OAAO,EAAE,QAAQ,CAAC,EAAE,YAAY,EAAE,GAAG,IAAI,CAAC;IAC3D,SAAS,EAAE,CAAC,CAAC,EAAE,EAAE,YAAY,KAAK,GAAG,CAAC,GAAG,IAAI,CAAC;CAC/C,CAAC;AAEF,+EAA+E;AAC/E,MAAM,MAAM,UAAU,GAAG,CACvB,IAAI,EAAE,OAAO,EAAE,EACf,KAAK,EAAE,SAAS,WAAW,EAAE,KAC1B,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;AAEhC;;;;;;;;;GASG;AACH,qBAAa,eAAe;IAC1B,OAAO,CAAC,MAAM,CAAK;IACnB,OAAO,CAAC,OAAO,CAGX;IACJ,OAAO,CAAC,QAAQ,CAAiC;IACjD,OAAO,CAAC,IAAI,CAAc;gBAEd,IAAI,EAAE,WAAW;IAK7B,6EAA6E;IAC7E,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,UAAU,GAAG,IAAI;IAIjD,oDAAoD;IACpD,IAAI,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,EAAE,QAAQ,CAAC,EAAE,YAAY,EAAE,GAAG,OAAO,CAAC,OAAO,CAAC;IAQlF,4EAA4E;IAC5E,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,EAAE,QAAQ,CAAC,EAAE,YAAY,EAAE,GAAG,IAAI;IAIxE,OAAO,CAAC,IAAI;IAQZ,OAAO,CAAC,SAAS;CAwClB;AAqBD;;;GAGG;AACH,qBAAa,gBAAiB,SAAQ,WAAW;IAC/C,UAAU,SAAK;IACf,OAAO,CAAC,IAAI,CAAc;gBAEd,IAAI,EAAE,WAAW;IAgC7B,IAAI,CAAC,IAAI,EAAE,MAAM,GAAG,WAAW,GAAG,UAAU,GAAG,IAAI;IAanD,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI;CAK5C;AAID;;;GAGG;AACH,wBAAgB,yBAAyB,CAAC,IAAI,EAAE,WAAW,GAAG,YAAY,CA8CzE;AAID;;;GAGG;AACH,wBAAgB,qBAAqB,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,WAAW,GAAG,IAAI,CAyC5E;AAED;;;GAGG;AACH,wBAAgB,wBAAwB,CAAC,EAAE,EAAE,YAAY,EAAE,IAAI,EAAE,WAAW,GAAG,IAAI,CAkClF"}
|
|
@@ -0,0 +1,291 @@
|
|
|
1
|
+
// Copyright 2025 the AAI authors. MIT license.
|
|
2
|
+
/**
|
|
3
|
+
* MessagePort RPC + WebSocket bridge for capnweb sandbox communication.
|
|
4
|
+
*
|
|
5
|
+
* Provides bidirectional RPC over MessagePort/Worker and WebSocket
|
|
6
|
+
* bridging for both standard WebSocket (client connections) and
|
|
7
|
+
* S2sWebSocket (.on()-style API for S2S connections).
|
|
8
|
+
*
|
|
9
|
+
* @module
|
|
10
|
+
*/
|
|
11
|
+
/**
|
|
12
|
+
* Bidirectional RPC endpoint over MessagePort or Worker.
|
|
13
|
+
*
|
|
14
|
+
* Both sides can send calls and handle incoming calls on the same channel.
|
|
15
|
+
*
|
|
16
|
+
* Wire protocol:
|
|
17
|
+
* - Call: `{$: 0, id: number, m: string, a: unknown[]}`
|
|
18
|
+
* - Result: `{$: 1, id: number, v?: unknown, e?: string}`
|
|
19
|
+
* - Notify (fire-and-forget): id = -1, no response sent
|
|
20
|
+
*/
|
|
21
|
+
export class CapnwebEndpoint {
|
|
22
|
+
nextId = 1;
|
|
23
|
+
pending = new Map();
|
|
24
|
+
handlers = new Map();
|
|
25
|
+
port;
|
|
26
|
+
constructor(port) {
|
|
27
|
+
this.port = port;
|
|
28
|
+
port.onmessage = (ev) => this.onMessage(ev);
|
|
29
|
+
}
|
|
30
|
+
/** Register an RPC handler for incoming calls with the given method name. */
|
|
31
|
+
handle(method, handler) {
|
|
32
|
+
this.handlers.set(method, handler);
|
|
33
|
+
}
|
|
34
|
+
/** Call a remote method and wait for the result. */
|
|
35
|
+
call(method, args, transfer) {
|
|
36
|
+
const id = this.nextId++;
|
|
37
|
+
return new Promise((resolve, reject) => {
|
|
38
|
+
this.pending.set(id, { resolve, reject });
|
|
39
|
+
this.send({ $: 0, id, m: method, a: args }, transfer);
|
|
40
|
+
});
|
|
41
|
+
}
|
|
42
|
+
/** Fire-and-forget: call a remote method without waiting for a response. */
|
|
43
|
+
notify(method, args, transfer) {
|
|
44
|
+
this.send({ $: 0, id: -1, m: method, a: args }, transfer);
|
|
45
|
+
}
|
|
46
|
+
send(msg, transfer) {
|
|
47
|
+
if (transfer && transfer.length > 0) {
|
|
48
|
+
this.port.postMessage(msg, transfer);
|
|
49
|
+
}
|
|
50
|
+
else {
|
|
51
|
+
this.port.postMessage(msg);
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
onMessage(ev) {
|
|
55
|
+
const msg = ev.data;
|
|
56
|
+
if (!msg || typeof msg !== "object" || !("$" in msg))
|
|
57
|
+
return;
|
|
58
|
+
if (msg.$ === 0) {
|
|
59
|
+
// Incoming call
|
|
60
|
+
const { id, m, a } = msg;
|
|
61
|
+
const handler = this.handlers.get(m);
|
|
62
|
+
if (!handler) {
|
|
63
|
+
if (id >= 0)
|
|
64
|
+
this.send({ $: 1, id, e: `No handler for ${m}` });
|
|
65
|
+
return;
|
|
66
|
+
}
|
|
67
|
+
const ports = [...ev.ports];
|
|
68
|
+
Promise.resolve()
|
|
69
|
+
.then(() => handler(a, ports))
|
|
70
|
+
.then((v) => {
|
|
71
|
+
if (id >= 0)
|
|
72
|
+
this.send({ $: 1, id, v });
|
|
73
|
+
})
|
|
74
|
+
.catch((err) => {
|
|
75
|
+
if (id >= 0) {
|
|
76
|
+
this.send({
|
|
77
|
+
$: 1,
|
|
78
|
+
id,
|
|
79
|
+
e: err instanceof Error ? err.message : String(err),
|
|
80
|
+
});
|
|
81
|
+
}
|
|
82
|
+
});
|
|
83
|
+
}
|
|
84
|
+
else if (msg.$ === 1) {
|
|
85
|
+
// Incoming result
|
|
86
|
+
const { id, v, e } = msg;
|
|
87
|
+
const pending = this.pending.get(id);
|
|
88
|
+
if (!pending)
|
|
89
|
+
return;
|
|
90
|
+
this.pending.delete(id);
|
|
91
|
+
if (e !== undefined) {
|
|
92
|
+
pending.reject(new Error(e));
|
|
93
|
+
}
|
|
94
|
+
else {
|
|
95
|
+
pending.resolve(v);
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
// ─── BridgedWebSocket (standard EventTarget-based) ───────────────────────────
|
|
101
|
+
/**
|
|
102
|
+
* Wraps a MessagePort as a standard WebSocket (extends EventTarget).
|
|
103
|
+
* Used in the worker for client connections bridged from the host.
|
|
104
|
+
*/
|
|
105
|
+
export class BridgedWebSocket extends EventTarget {
|
|
106
|
+
readyState = 0;
|
|
107
|
+
port;
|
|
108
|
+
constructor(port) {
|
|
109
|
+
super();
|
|
110
|
+
this.port = port;
|
|
111
|
+
port.onmessage = (ev) => {
|
|
112
|
+
const msg = ev.data;
|
|
113
|
+
switch (msg.k) {
|
|
114
|
+
case 0:
|
|
115
|
+
this.dispatchEvent(new MessageEvent("message", { data: msg.d }));
|
|
116
|
+
break;
|
|
117
|
+
case 1:
|
|
118
|
+
this.dispatchEvent(new MessageEvent("message", { data: msg.d }));
|
|
119
|
+
break;
|
|
120
|
+
case 2:
|
|
121
|
+
this.readyState = 3;
|
|
122
|
+
this.dispatchEvent(new CloseEvent("close", {
|
|
123
|
+
...(msg.code !== undefined ? { code: msg.code } : {}),
|
|
124
|
+
...(msg.reason !== undefined ? { reason: msg.reason } : {}),
|
|
125
|
+
}));
|
|
126
|
+
break;
|
|
127
|
+
case 3:
|
|
128
|
+
this.readyState = 1;
|
|
129
|
+
this.dispatchEvent(new Event("open"));
|
|
130
|
+
break;
|
|
131
|
+
case 4:
|
|
132
|
+
this.dispatchEvent(new ErrorEvent("error", { message: msg.m }));
|
|
133
|
+
break;
|
|
134
|
+
}
|
|
135
|
+
};
|
|
136
|
+
}
|
|
137
|
+
send(data) {
|
|
138
|
+
if (this.readyState !== 1)
|
|
139
|
+
return;
|
|
140
|
+
if (typeof data === "string") {
|
|
141
|
+
this.port.postMessage({ k: 0, d: data });
|
|
142
|
+
}
|
|
143
|
+
else {
|
|
144
|
+
const ab = data instanceof ArrayBuffer
|
|
145
|
+
? data
|
|
146
|
+
: data.buffer.slice(data.byteOffset, data.byteOffset + data.byteLength);
|
|
147
|
+
this.port.postMessage({ k: 1, d: ab }, [ab]);
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
close(code, reason) {
|
|
151
|
+
if (this.readyState >= 2)
|
|
152
|
+
return;
|
|
153
|
+
this.readyState = 2;
|
|
154
|
+
this.port.postMessage({ k: 2, code, reason });
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
// ─── BridgedS2sWebSocket (.on()-style API) ───────────────────────────────────
|
|
158
|
+
/**
|
|
159
|
+
* Wraps a MessagePort as an {@linkcode S2sWebSocket} (.on() event API).
|
|
160
|
+
* Used in the worker for S2S connections bridged from the host.
|
|
161
|
+
*/
|
|
162
|
+
export function createBridgedS2sWebSocket(port) {
|
|
163
|
+
let readyState = 0;
|
|
164
|
+
const handlers = new Map();
|
|
165
|
+
function emit(event, ...args) {
|
|
166
|
+
for (const h of handlers.get(event) ?? [])
|
|
167
|
+
h(...args);
|
|
168
|
+
}
|
|
169
|
+
port.onmessage = (ev) => {
|
|
170
|
+
const msg = ev.data;
|
|
171
|
+
switch (msg.k) {
|
|
172
|
+
case 0:
|
|
173
|
+
emit("message", msg.d);
|
|
174
|
+
break;
|
|
175
|
+
case 2:
|
|
176
|
+
readyState = 3;
|
|
177
|
+
emit("close", msg.code, msg.reason);
|
|
178
|
+
break;
|
|
179
|
+
case 3:
|
|
180
|
+
readyState = 1;
|
|
181
|
+
emit("open");
|
|
182
|
+
break;
|
|
183
|
+
case 4:
|
|
184
|
+
emit("error", new Error(msg.m));
|
|
185
|
+
break;
|
|
186
|
+
}
|
|
187
|
+
};
|
|
188
|
+
return {
|
|
189
|
+
get readyState() {
|
|
190
|
+
return readyState;
|
|
191
|
+
},
|
|
192
|
+
send(data) {
|
|
193
|
+
if (readyState !== 1)
|
|
194
|
+
return;
|
|
195
|
+
port.postMessage({ k: 0, d: data });
|
|
196
|
+
},
|
|
197
|
+
close() {
|
|
198
|
+
if (readyState >= 2)
|
|
199
|
+
return;
|
|
200
|
+
readyState = 2;
|
|
201
|
+
port.postMessage({ k: 2 });
|
|
202
|
+
},
|
|
203
|
+
on(event, handler) {
|
|
204
|
+
if (!handlers.has(event))
|
|
205
|
+
handlers.set(event, []);
|
|
206
|
+
handlers.get(event).push(handler);
|
|
207
|
+
},
|
|
208
|
+
};
|
|
209
|
+
}
|
|
210
|
+
// ─── Host-side bridges ───────────────────────────────────────────────────────
|
|
211
|
+
/**
|
|
212
|
+
* Bridges a standard WebSocket (e.g. from `Deno.upgradeWebSocket`) to a
|
|
213
|
+
* MessagePort. Used on the host side for client connections.
|
|
214
|
+
*/
|
|
215
|
+
export function bridgeWebSocketToPort(ws, port) {
|
|
216
|
+
ws.binaryType = "arraybuffer";
|
|
217
|
+
ws.addEventListener("open", () => {
|
|
218
|
+
port.postMessage({ k: 3 });
|
|
219
|
+
});
|
|
220
|
+
ws.addEventListener("message", (ev) => {
|
|
221
|
+
const { data } = ev;
|
|
222
|
+
if (typeof data === "string") {
|
|
223
|
+
port.postMessage({ k: 0, d: data });
|
|
224
|
+
}
|
|
225
|
+
else if (data instanceof ArrayBuffer) {
|
|
226
|
+
port.postMessage({ k: 1, d: data }, [data]);
|
|
227
|
+
}
|
|
228
|
+
});
|
|
229
|
+
ws.addEventListener("close", (ev) => {
|
|
230
|
+
const e = ev;
|
|
231
|
+
port.postMessage({ k: 2, code: e.code, reason: e.reason });
|
|
232
|
+
});
|
|
233
|
+
ws.addEventListener("error", (ev) => {
|
|
234
|
+
const msg = ev instanceof ErrorEvent ? ev.message : "WebSocket error";
|
|
235
|
+
port.postMessage({ k: 4, m: msg });
|
|
236
|
+
});
|
|
237
|
+
// Messages from worker → real WebSocket
|
|
238
|
+
port.onmessage = (ev) => {
|
|
239
|
+
const msg = ev.data;
|
|
240
|
+
switch (msg.k) {
|
|
241
|
+
case 0:
|
|
242
|
+
if (ws.readyState === 1)
|
|
243
|
+
ws.send(msg.d);
|
|
244
|
+
break;
|
|
245
|
+
case 1:
|
|
246
|
+
if (ws.readyState === 1)
|
|
247
|
+
ws.send(msg.d);
|
|
248
|
+
break;
|
|
249
|
+
case 2:
|
|
250
|
+
ws.close(msg.code, msg.reason);
|
|
251
|
+
break;
|
|
252
|
+
}
|
|
253
|
+
};
|
|
254
|
+
}
|
|
255
|
+
/**
|
|
256
|
+
* Bridges a ws-style {@linkcode S2sWebSocket} to a MessagePort.
|
|
257
|
+
* Used on the host side for S2S connections to AssemblyAI.
|
|
258
|
+
*/
|
|
259
|
+
export function bridgeS2sWebSocketToPort(ws, port) {
|
|
260
|
+
ws.on("open", () => {
|
|
261
|
+
port.postMessage({ k: 3 });
|
|
262
|
+
});
|
|
263
|
+
ws.on("message", (data) => {
|
|
264
|
+
port.postMessage({ k: 0, d: String(data) });
|
|
265
|
+
});
|
|
266
|
+
ws.on("close", (code, reason) => {
|
|
267
|
+
port.postMessage({
|
|
268
|
+
k: 2,
|
|
269
|
+
code: typeof code === "number" ? code : undefined,
|
|
270
|
+
reason: String(reason ?? ""),
|
|
271
|
+
});
|
|
272
|
+
});
|
|
273
|
+
ws.on("error", (err) => {
|
|
274
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
275
|
+
port.postMessage({ k: 4, m: msg });
|
|
276
|
+
});
|
|
277
|
+
// Messages from worker → real S2S WebSocket
|
|
278
|
+
port.onmessage = (ev) => {
|
|
279
|
+
const msg = ev.data;
|
|
280
|
+
switch (msg.k) {
|
|
281
|
+
case 0:
|
|
282
|
+
if (ws.readyState === 1)
|
|
283
|
+
ws.send(msg.d);
|
|
284
|
+
break;
|
|
285
|
+
case 2:
|
|
286
|
+
ws.close();
|
|
287
|
+
break;
|
|
288
|
+
}
|
|
289
|
+
};
|
|
290
|
+
}
|
|
291
|
+
//# sourceMappingURL=capnweb.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"capnweb.js","sourceRoot":"","sources":["../../sdk/capnweb.ts"],"names":[],"mappings":"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"}
|