@mono-agent/web 0.12.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.
Files changed (53) hide show
  1. package/LICENSE +674 -0
  2. package/README.md +169 -0
  3. package/dist/contracts.d.ts +151 -0
  4. package/dist/contracts.d.ts.map +1 -0
  5. package/dist/contracts.js +11 -0
  6. package/dist/contracts.js.map +1 -0
  7. package/dist/discovery.d.ts +17 -0
  8. package/dist/discovery.d.ts.map +1 -0
  9. package/dist/discovery.js +137 -0
  10. package/dist/discovery.js.map +1 -0
  11. package/dist/errors.d.ts +9 -0
  12. package/dist/errors.d.ts.map +1 -0
  13. package/dist/errors.js +25 -0
  14. package/dist/errors.js.map +1 -0
  15. package/dist/index.d.ts +14 -0
  16. package/dist/index.d.ts.map +1 -0
  17. package/dist/index.js +10 -0
  18. package/dist/index.js.map +1 -0
  19. package/dist/operator-client.d.ts +42 -0
  20. package/dist/operator-client.d.ts.map +1 -0
  21. package/dist/operator-client.js +257 -0
  22. package/dist/operator-client.js.map +1 -0
  23. package/dist/server.d.ts +22 -0
  24. package/dist/server.d.ts.map +1 -0
  25. package/dist/server.js +566 -0
  26. package/dist/server.js.map +1 -0
  27. package/dist/service.d.ts +89 -0
  28. package/dist/service.d.ts.map +1 -0
  29. package/dist/service.js +644 -0
  30. package/dist/service.js.map +1 -0
  31. package/dist/state-paths.d.ts +25 -0
  32. package/dist/state-paths.d.ts.map +1 -0
  33. package/dist/state-paths.js +226 -0
  34. package/dist/state-paths.js.map +1 -0
  35. package/dist/store.d.ts +112 -0
  36. package/dist/store.d.ts.map +1 -0
  37. package/dist/store.js +953 -0
  38. package/dist/store.js.map +1 -0
  39. package/package.json +48 -0
  40. package/webapp/dist/apple-touch-icon.png +0 -0
  41. package/webapp/dist/assets/assistant-ui-CU4gqU0g.js +70 -0
  42. package/webapp/dist/assets/index-Ck3BY0Ti.js +47 -0
  43. package/webapp/dist/assets/index-CoB6Xwh-.css +1 -0
  44. package/webapp/dist/assets/markdown-qFW9VWmB.js +18 -0
  45. package/webapp/dist/assets/workbox-window.prod.es5-BBnX5xw4.js +2 -0
  46. package/webapp/dist/favicon.ico +0 -0
  47. package/webapp/dist/icon-192.png +0 -0
  48. package/webapp/dist/icon-512.png +0 -0
  49. package/webapp/dist/icon.svg +22 -0
  50. package/webapp/dist/index.html +20 -0
  51. package/webapp/dist/manifest.webmanifest +1 -0
  52. package/webapp/dist/sw.js +1 -0
  53. package/webapp/dist/workbox-9c191d2f.js +1 -0
@@ -0,0 +1,257 @@
1
+ import { parseAgentStreamFrame, } from "@mono-agent/agent-contracts";
2
+ import { errorMessage, WebConsoleError } from "./errors.js";
3
+ import { isTrustedOperatorBaseUrl } from "./discovery.js";
4
+ const OPERATOR_WIRE_SCHEMA = 1;
5
+ const MAX_INFO_BODY_BYTES = 1024 * 1024;
6
+ const MAX_ERROR_BODY_BYTES = 64 * 1024;
7
+ const MAX_NDJSON_FRAME_BYTES = 8 * 1024 * 1024;
8
+ const CANCEL_TIMEOUT_MS = 2_000;
9
+ export class OperatorClient {
10
+ baseUrl;
11
+ apiKey;
12
+ fetchImpl;
13
+ constructor(options) {
14
+ if (!isTrustedOperatorBaseUrl(options.baseUrl)) {
15
+ throw new WebConsoleError("untrusted_operator_url", "Refusing to connect to a non-loopback operator endpoint.", 400);
16
+ }
17
+ this.baseUrl = options.baseUrl.replace(/\/+$/u, "");
18
+ this.apiKey = options.apiKey;
19
+ this.fetchImpl = options.fetchImpl ?? fetch;
20
+ }
21
+ async info(signal) {
22
+ const response = await this.request(`${this.baseUrl}/v1/info`, {
23
+ headers: this.headers(false),
24
+ ...(signal === undefined ? {} : { signal }),
25
+ });
26
+ let raw;
27
+ try {
28
+ raw = JSON.parse(await readBoundedBody(response, MAX_INFO_BODY_BYTES, "operator_info_too_large"));
29
+ }
30
+ catch (error) {
31
+ if (error instanceof WebConsoleError)
32
+ throw error;
33
+ throw new WebConsoleError("invalid_operator_info", "The agent returned invalid operator metadata JSON.", 502);
34
+ }
35
+ const body = record(raw);
36
+ if (body === undefined || typeof body.schema !== "number") {
37
+ throw new WebConsoleError("invalid_operator_info", "The agent returned invalid operator metadata.", 502);
38
+ }
39
+ if (body.schema !== OPERATOR_WIRE_SCHEMA) {
40
+ throw new WebConsoleError("unsupported_operator_schema", `Agent operator schema ${body.schema} is not supported.`, 502);
41
+ }
42
+ const models = stringArray(body.models);
43
+ const modelOptions = parseModelOptions(body.modelOptions);
44
+ const capabilities = record(body.capabilities);
45
+ return {
46
+ schema: body.schema,
47
+ ...(typeof body.label === "string" ? { label: body.label } : {}),
48
+ ...(typeof body.model === "string" ? { model: body.model } : {}),
49
+ ...(typeof body.effort === "string" ? { effort: body.effort } : {}),
50
+ ...(models === undefined ? {} : { models }),
51
+ ...(modelOptions === undefined ? {} : { modelOptions }),
52
+ supportsAttachments: capabilities?.attachments === true,
53
+ };
54
+ }
55
+ async turn(input) {
56
+ const response = await this.request(`${this.baseUrl}/v1/turns`, {
57
+ method: "POST",
58
+ headers: this.headers(true),
59
+ signal: input.signal,
60
+ body: JSON.stringify({
61
+ conversationId: input.conversationId,
62
+ text: input.text,
63
+ client: "web",
64
+ metadata: input.metadata,
65
+ ...(input.attachments.length === 0 ? {} : { attachments: input.attachments }),
66
+ }),
67
+ });
68
+ if (!response.headers.get("content-type")?.toLowerCase().includes("application/x-ndjson")) {
69
+ await response.body?.cancel().catch(() => undefined);
70
+ throw new WebConsoleError("invalid_operator_content_type", "The agent turn endpoint did not return NDJSON.", 502);
71
+ }
72
+ if (response.body === null) {
73
+ throw new WebConsoleError("empty_operator_stream", "The agent returned an empty response stream.", 502);
74
+ }
75
+ try {
76
+ for await (const line of readBoundedNdjsonLines(response.body, MAX_NDJSON_FRAME_BYTES)) {
77
+ if (line.trim().length === 0)
78
+ continue;
79
+ const frame = parseAgentStreamFrame(line);
80
+ if (frame.kind === "finish") {
81
+ return {
82
+ ...(frame.finalText === undefined ? {} : { finalText: frame.finalText }),
83
+ ...(frame.metadata === undefined ? {} : { metadata: frame.metadata }),
84
+ };
85
+ }
86
+ if (frame.kind === "error") {
87
+ const error = new WebConsoleError(frame.code ?? (frame.cancelled === true ? "cancelled" : "agent_error"), frame.message, frame.cancelled === true ? 409 : 502);
88
+ error.cancelled = frame.cancelled === true;
89
+ throw error;
90
+ }
91
+ await input.onFrame(frame);
92
+ }
93
+ }
94
+ finally {
95
+ await response.body.cancel().catch(() => undefined);
96
+ }
97
+ throw new WebConsoleError("incomplete_operator_stream", "The agent stream ended without a terminal frame.", 502);
98
+ }
99
+ async cancel(conversationId) {
100
+ await this.request(`${this.baseUrl}/v1/conversations/${encodeURIComponent(conversationId)}/cancel`, {
101
+ method: "POST",
102
+ headers: this.headers(false),
103
+ signal: AbortSignal.timeout(CANCEL_TIMEOUT_MS),
104
+ }).then(async (response) => {
105
+ await response.body?.cancel().catch(() => undefined);
106
+ });
107
+ }
108
+ headers(json) {
109
+ return {
110
+ ...(json ? { "content-type": "application/json" } : {}),
111
+ ...(this.apiKey === undefined ? {} : { authorization: `Bearer ${this.apiKey}` }),
112
+ };
113
+ }
114
+ async request(url, init) {
115
+ let response;
116
+ try {
117
+ response = await this.fetchImpl(url, { ...init, redirect: "error" });
118
+ }
119
+ catch (error) {
120
+ if (init.signal?.aborted === true)
121
+ throw error;
122
+ throw new WebConsoleError("agent_unreachable", `Agent is unreachable (${errorMessage(error)}).`, 502);
123
+ }
124
+ if (!response.ok && !response.headers.get("content-type")?.includes("application/x-ndjson")) {
125
+ const detail = await readBodyPrefix(response, MAX_ERROR_BODY_BYTES).catch(() => "");
126
+ throw new WebConsoleError(response.status === 401 ? "agent_unauthorized" : "agent_http_error", `Agent responded ${response.status}${detail.length === 0 ? "." : `: ${detail.slice(0, 300)}`}`, 502);
127
+ }
128
+ return response;
129
+ }
130
+ }
131
+ async function readBoundedBody(response, maxBytes, code) {
132
+ if (response.body === null)
133
+ return "";
134
+ const reader = response.body.getReader();
135
+ const chunks = [];
136
+ let total = 0;
137
+ try {
138
+ for (;;) {
139
+ const { done, value } = await reader.read();
140
+ if (done)
141
+ break;
142
+ total += value.byteLength;
143
+ if (total > maxBytes) {
144
+ throw new WebConsoleError(code, "Agent response exceeded its size limit.", 502);
145
+ }
146
+ chunks.push(value);
147
+ }
148
+ }
149
+ finally {
150
+ await reader.cancel().catch(() => undefined);
151
+ }
152
+ return Buffer.concat(chunks.map((chunk) => Buffer.from(chunk)), total).toString("utf8");
153
+ }
154
+ async function readBodyPrefix(response, maxBytes) {
155
+ if (response.body === null)
156
+ return "";
157
+ const reader = response.body.getReader();
158
+ const chunks = [];
159
+ let total = 0;
160
+ let truncated = false;
161
+ try {
162
+ for (;;) {
163
+ const { done, value } = await reader.read();
164
+ if (done)
165
+ break;
166
+ const remaining = maxBytes - total;
167
+ if (value.byteLength > remaining) {
168
+ if (remaining > 0)
169
+ chunks.push(value.subarray(0, remaining));
170
+ total = maxBytes;
171
+ truncated = true;
172
+ break;
173
+ }
174
+ chunks.push(value);
175
+ total += value.byteLength;
176
+ }
177
+ }
178
+ finally {
179
+ await reader.cancel().catch(() => undefined);
180
+ }
181
+ return `${Buffer.concat(chunks.map((chunk) => Buffer.from(chunk)), total).toString("utf8")}${truncated ? "…" : ""}`;
182
+ }
183
+ async function* readBoundedNdjsonLines(body, maxFrameBytes) {
184
+ const reader = body.getReader();
185
+ let segments = [];
186
+ let pendingBytes = 0;
187
+ try {
188
+ for (;;) {
189
+ const { done, value } = await reader.read();
190
+ if (done)
191
+ break;
192
+ let start = 0;
193
+ for (let index = 0; index < value.byteLength; index += 1) {
194
+ if (value[index] !== 0x0a)
195
+ continue;
196
+ const segment = value.subarray(start, index);
197
+ if (pendingBytes + segment.byteLength > maxFrameBytes) {
198
+ throw new WebConsoleError("operator_frame_too_large", "Agent stream frame exceeded its size limit.", 502);
199
+ }
200
+ yield decodeSegments(segments, segment, pendingBytes + segment.byteLength);
201
+ segments = [];
202
+ pendingBytes = 0;
203
+ start = index + 1;
204
+ }
205
+ const remainder = value.subarray(start);
206
+ if (pendingBytes + remainder.byteLength > maxFrameBytes) {
207
+ throw new WebConsoleError("operator_frame_too_large", "Agent stream frame exceeded its size limit.", 502);
208
+ }
209
+ if (remainder.byteLength > 0) {
210
+ segments.push(remainder);
211
+ pendingBytes += remainder.byteLength;
212
+ }
213
+ }
214
+ if (pendingBytes > 0)
215
+ yield decodeSegments(segments, undefined, pendingBytes);
216
+ }
217
+ finally {
218
+ await reader.cancel().catch(() => undefined);
219
+ }
220
+ }
221
+ function decodeSegments(segments, tail, total) {
222
+ const buffers = segments.map((segment) => Buffer.from(segment));
223
+ if (tail !== undefined && tail.byteLength > 0)
224
+ buffers.push(Buffer.from(tail));
225
+ return Buffer.concat(buffers, total).toString("utf8");
226
+ }
227
+ function parseModelOptions(value) {
228
+ const input = record(value);
229
+ if (input === undefined)
230
+ return undefined;
231
+ const result = {};
232
+ for (const [model, raw] of Object.entries(input)) {
233
+ const option = record(raw);
234
+ if (option === undefined)
235
+ continue;
236
+ const effortLevels = stringArray(option.effortLevels);
237
+ result[model] = {
238
+ ...(effortLevels === undefined ? {} : { effortLevels }),
239
+ ...(typeof option.reasoning === "boolean" ? { reasoning: option.reasoning } : {}),
240
+ ...(typeof option.reasoningMode === "string" ? { reasoningMode: option.reasoningMode } : {}),
241
+ ...(typeof option.label === "string" ? { label: option.label } : {}),
242
+ ...(Number.isSafeInteger(option.contextWindow) && Number(option.contextWindow) > 0
243
+ ? { contextWindow: option.contextWindow }
244
+ : {}),
245
+ };
246
+ }
247
+ return Object.keys(result).length === 0 ? undefined : result;
248
+ }
249
+ function stringArray(value) {
250
+ return Array.isArray(value) && value.every((entry) => typeof entry === "string") ? value : undefined;
251
+ }
252
+ function record(value) {
253
+ return typeof value === "object" && value !== null && !Array.isArray(value)
254
+ ? value
255
+ : undefined;
256
+ }
257
+ //# sourceMappingURL=operator-client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"operator-client.js","sourceRoot":"","sources":["../src/operator-client.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,22 @@
1
+ import { type CreateWebServiceOptions } from "./service.js";
2
+ export declare const DEFAULT_WEB_HOST = "0.0.0.0";
3
+ export declare const DEFAULT_WEB_PORT = 5050;
4
+ export interface StartWebServerOptions extends CreateWebServiceOptions {
5
+ readonly host?: string;
6
+ readonly port?: number;
7
+ readonly staticDir?: string;
8
+ /** Exact additional DNS hostnames accepted at the browser boundary (for example this node's Tailscale DNSName). */
9
+ readonly allowedHosts?: readonly string[];
10
+ }
11
+ export interface WebServerHandle {
12
+ readonly url: string;
13
+ readonly host: string;
14
+ readonly port: number;
15
+ readonly boundAddress: string;
16
+ readonly stateDir: string;
17
+ stop(): Promise<void>;
18
+ close(): Promise<void>;
19
+ }
20
+ export declare function startWebServer(options?: StartWebServerOptions): Promise<WebServerHandle>;
21
+ export declare function isAllowedWebHostname(hostname: string, configuredHost: string, machineHostname?: string, additionalHosts?: readonly string[]): boolean;
22
+ //# sourceMappingURL=server.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAuBA,OAAO,EAAc,KAAK,uBAAuB,EAAE,MAAM,cAAc,CAAC;AAExE,eAAO,MAAM,gBAAgB,YAAY,CAAC;AAC1C,eAAO,MAAM,gBAAgB,OAAO,CAAC;AAKrC,MAAM,WAAW,qBAAsB,SAAQ,uBAAuB;IACpE,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAC5B,mHAAmH;IACnH,QAAQ,CAAC,YAAY,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;CAC3C;AAED,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IACtB,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CACxB;AAED,wBAAsB,cAAc,CAAC,OAAO,GAAE,qBAA0B,GAAG,OAAO,CAAC,eAAe,CAAC,CAiOlG;AAwID,wBAAgB,oBAAoB,CAClC,QAAQ,EAAE,MAAM,EAChB,cAAc,EAAE,MAAM,EACtB,eAAe,SAAmB,EAClC,eAAe,GAAE,SAAS,MAAM,EAAO,GACtC,OAAO,CAYT"}