@ai-matrx/desktop-protocol 0.21.82 → 0.21.84
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/CHANGELOG.md +19 -0
- package/dist/chunk-server-CFON4SPE.js +403 -0
- package/dist/chunk-server-CFON4SPE.js.map +1 -0
- package/dist/{chunk-server-3QKXTKK4.js → chunk-server-NFPTVX44.js} +3658 -4300
- package/dist/chunk-server-NFPTVX44.js.map +1 -0
- package/dist/chunk-server-OSCX7DKA.js +15 -0
- package/dist/chunk-server-OSCX7DKA.js.map +1 -0
- package/dist/chunk-server-QLS73E3X.js +311 -0
- package/dist/chunk-server-QLS73E3X.js.map +1 -0
- package/dist/client.cjs +6295 -4943
- package/dist/client.cjs.map +1 -1
- package/dist/client.d.cts +2 -2
- package/dist/client.d.ts +2 -2
- package/dist/client.js +19 -7
- package/dist/client.js.map +1 -1
- package/dist/index.cjs +26 -3
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +21 -7
- package/dist/index.d.ts +21 -7
- package/dist/index.js +66 -60
- package/dist/index.js.map +1 -1
- package/dist/{models-D5O1othS.d.cts → models-DMJ4I-2x.d.cts} +5 -0
- package/dist/{models-D5O1othS.d.ts → models-DMJ4I-2x.d.ts} +5 -0
- package/dist/react.d.cts +1 -0
- package/dist/react.d.ts +1 -0
- package/generated/desktop-protocol.schema.json +3 -2
- package/package.json +2 -2
- package/dist/chunk-server-3QKXTKK4.js.map +0 -1
package/dist/client.d.cts
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import { BackoffOptions } from '@ai-matrx/data/realtime';
|
|
2
2
|
export { RECONNECT_ALARM_ATTEMPTS } from '@ai-matrx/data/realtime';
|
|
3
3
|
import { z } from 'zod';
|
|
4
|
-
import { W as Welcome, D as DesktopProtocolError, C as CloseOutcome, O as OpName, a as OpParams, b as OpResult, c as OPS, S as StreamMeta, E as EndReason, d as EVENTS, e as ClientType, M as ModelsTranscribeResult, T as TranscriptionModelId, f as MlProgress } from './models-
|
|
5
|
-
export { i as isDesktopProtocolError } from './models-
|
|
4
|
+
import { W as Welcome, D as DesktopProtocolError, C as CloseOutcome, O as OpName, a as OpParams, b as OpResult, c as OPS, S as StreamMeta, E as EndReason, d as EVENTS, e as ClientType, M as ModelsTranscribeResult, T as TranscriptionModelId, f as MlProgress } from './models-DMJ4I-2x.cjs';
|
|
5
|
+
export { i as isDesktopProtocolError } from './models-DMJ4I-2x.cjs';
|
|
6
6
|
import { FrameHeader } from './frame.cjs';
|
|
7
7
|
|
|
8
8
|
/** The subset of the WHATWG WebSocket the client uses — browser, React Native, `ws` and Workers all fit. */
|
package/dist/client.d.ts
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import { BackoffOptions } from '@ai-matrx/data/realtime';
|
|
2
2
|
export { RECONNECT_ALARM_ATTEMPTS } from '@ai-matrx/data/realtime';
|
|
3
3
|
import { z } from 'zod';
|
|
4
|
-
import { W as Welcome, D as DesktopProtocolError, C as CloseOutcome, O as OpName, a as OpParams, b as OpResult, c as OPS, S as StreamMeta, E as EndReason, d as EVENTS, e as ClientType, M as ModelsTranscribeResult, T as TranscriptionModelId, f as MlProgress } from './models-
|
|
5
|
-
export { i as isDesktopProtocolError } from './models-
|
|
4
|
+
import { W as Welcome, D as DesktopProtocolError, C as CloseOutcome, O as OpName, a as OpParams, b as OpResult, c as OPS, S as StreamMeta, E as EndReason, d as EVENTS, e as ClientType, M as ModelsTranscribeResult, T as TranscriptionModelId, f as MlProgress } from './models-DMJ4I-2x.js';
|
|
5
|
+
export { i as isDesktopProtocolError } from './models-DMJ4I-2x.js';
|
|
6
6
|
import { FrameHeader } from './frame.js';
|
|
7
7
|
|
|
8
8
|
/** The subset of the WHATWG WebSocket the client uses — browser, React Native, `ws` and Workers all fit. */
|
package/dist/client.js
CHANGED
|
@@ -1,18 +1,18 @@
|
|
|
1
|
+
import {
|
|
2
|
+
closeRule,
|
|
3
|
+
knows
|
|
4
|
+
} from "./chunk-server-CFON4SPE.js";
|
|
1
5
|
import {
|
|
2
6
|
CloseCode,
|
|
3
7
|
CoreToClientMsg,
|
|
4
8
|
DEFAULT_MAX_FRAME_PAYLOAD_BYTES,
|
|
5
9
|
DEFAULT_WINDOW_BYTES,
|
|
6
|
-
EVENTS,
|
|
7
|
-
OPS,
|
|
8
10
|
PING_TEXT,
|
|
9
11
|
PONG_TEXT,
|
|
10
12
|
PROTOCOL_MAJOR,
|
|
11
13
|
PROTOCOL_MINOR,
|
|
12
|
-
Welcome
|
|
13
|
-
|
|
14
|
-
knows
|
|
15
|
-
} from "./chunk-server-3QKXTKK4.js";
|
|
14
|
+
Welcome
|
|
15
|
+
} from "./chunk-server-QLS73E3X.js";
|
|
16
16
|
import {
|
|
17
17
|
DesktopProtocolError,
|
|
18
18
|
FRAME_VERSION,
|
|
@@ -24,6 +24,13 @@ import {
|
|
|
24
24
|
|
|
25
25
|
// src/client/client.ts
|
|
26
26
|
import { RECONNECT_ALARM_ATTEMPTS, createBackoff } from "@ai-matrx/data/realtime";
|
|
27
|
+
var registry = null;
|
|
28
|
+
var registryLoad = null;
|
|
29
|
+
function loadRegistry() {
|
|
30
|
+
if (registry) return Promise.resolve(registry);
|
|
31
|
+
registryLoad ??= import("./chunk-server-OSCX7DKA.js").then((m) => registry = m);
|
|
32
|
+
return registryLoad;
|
|
33
|
+
}
|
|
27
34
|
var WS_OPEN = 1;
|
|
28
35
|
var defaultTimers = {
|
|
29
36
|
setTimeout: (fn, ms) => globalThis.setTimeout(fn, ms),
|
|
@@ -127,6 +134,7 @@ function createDesktopClient(options) {
|
|
|
127
134
|
setState({ status: "connecting", retryInMs: null });
|
|
128
135
|
let ws;
|
|
129
136
|
try {
|
|
137
|
+
if (!registry) await loadRegistry();
|
|
130
138
|
const url = typeof options.url === "function" ? await options.url() : options.url;
|
|
131
139
|
const protocols = options.protocols ? await options.protocols() : [];
|
|
132
140
|
if (generation !== socketGeneration || closedByUser) return;
|
|
@@ -373,7 +381,8 @@ function createDesktopClient(options) {
|
|
|
373
381
|
}
|
|
374
382
|
case "event": {
|
|
375
383
|
const key = `${msg.cap}.${msg.name}`;
|
|
376
|
-
const
|
|
384
|
+
const events = registry?.EVENTS;
|
|
385
|
+
const schema = events?.[key];
|
|
377
386
|
if (!schema) return diagnose({ kind: "malformed_message", detail: `unknown event ${key}` });
|
|
378
387
|
const payload = schema.safeParse(msg.payload);
|
|
379
388
|
if (!payload.success) return diagnose({ kind: "malformed_message", detail: `event ${key}: invalid payload` });
|
|
@@ -584,6 +593,7 @@ function createDesktopClient(options) {
|
|
|
584
593
|
});
|
|
585
594
|
}
|
|
586
595
|
async function request(op, params, opts = {}) {
|
|
596
|
+
const { OPS } = registry ?? await loadRegistry();
|
|
587
597
|
if (OPS[op].kind !== "unary") {
|
|
588
598
|
throw new DesktopProtocolError("INVALID_PARAMS", `${op} is a ${OPS[op].kind} op \u2014 use stream()`);
|
|
589
599
|
}
|
|
@@ -670,6 +680,8 @@ function createDesktopClient(options) {
|
|
|
670
680
|
if (opts.windowBytes === void 0) s.windowBytes = welcome.limits.default_window_bytes;
|
|
671
681
|
streams.set(s.id, s);
|
|
672
682
|
const wire = { ...params };
|
|
683
|
+
const { OPS } = registry ?? await loadRegistry();
|
|
684
|
+
if (s.ended) return;
|
|
673
685
|
if (opts.windowBytes !== void 0 && "window_bytes" in OPS[op].params.shape) wire.window_bytes = opts.windowBytes;
|
|
674
686
|
if (!sendJson({ id: s.id, type: "request", ...capOf(op), params: wire })) {
|
|
675
687
|
streams.delete(s.id);
|
package/dist/client.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/client/client.ts","../src/client/wake.ts","../src/client/transcribe.ts"],"sourcesContent":["/**\n * The reconnecting desktop-protocol client: hello → requests, streams with credit-based\n * backpressure, events, transparent reattach of resource streams (terminals, watches) after a\n * drop, heartbeat, and relay reauth. One instance per device connection. All state lives in the\n * closure — no module-level state (dual ESM/CJS graphs would split it).\n */\nimport { RECONNECT_ALARM_ATTEMPTS, createBackoff } from \"@ai-matrx/data/realtime\";\nimport { DesktopProtocolError } from \"../error\";\nimport { FRAME_VERSION, FrameChannel, decodeFrame, encodeFrame } from \"../frame\";\nimport type { FrameHeader } from \"../frame\";\nimport { closeRule } from \"../close-policy\";\nimport { CloseCode, CoreToClientMsg, PING_TEXT, PONG_TEXT, Welcome } from \"../schema/envelope\";\nimport type { EndReason, StreamMeta } from \"../schema/envelope\";\nimport type { ProtocolErrorBody } from \"../schema/errors\";\nimport { DEFAULT_MAX_FRAME_PAYLOAD_BYTES, DEFAULT_WINDOW_BYTES } from \"../schema/frame\";\nimport { PROTOCOL_MAJOR, PROTOCOL_MINOR } from \"../schema/primitives\";\nimport { EVENTS, OPS } from \"../schema/registry\";\nimport { knows } from \"../versioning\";\nimport type { OpName, OpParams, OpResult } from \"../schema/registry\";\nimport type {\n ClientTimers,\n DesktopClient,\n DesktopClientDiagnostic,\n DesktopClientOptions,\n DesktopClientState,\n DesktopStream,\n EventHandler,\n EventName,\n RequestOptions,\n StreamHandlers,\n StreamOpName,\n StreamOptions,\n WakeOptions,\n WebSocketFactory,\n WebSocketLike,\n} from \"./types\";\n\nconst WS_OPEN = 1;\ntype Pending = {\n kind: \"unary\";\n op: string;\n resolve: (value: unknown) => void;\n reject: (error: DesktopProtocolError) => void;\n cleanup: () => void;\n};\n\ninterface StreamState {\n op: string;\n handlers: StreamHandlers;\n options: StreamOptions;\n id: string;\n sid: number | null;\n resourceId: string | null;\n /** Last inbound DATA seq delivered to the consumer. */\n lastSeq: number;\n /** Expected next inbound seq, or null right after a gap/snapshot (resync on next frame). */\n expectSeq: number | null;\n windowBytes: number;\n /** Consumed bytes not yet credited back. */\n consumedUncredited: number;\n /** Outbound (STDIN) credit granted by the core. */\n sendWindow: number;\n sendSeq: number;\n sendQueue: Uint8Array[];\n /** Serializes consumer callbacks so credits follow consumption order. */\n chain: Promise<void>;\n resultSettled: boolean;\n resolveResult: (value: unknown) => void;\n rejectResult: (error: DesktopProtocolError) => void;\n resolveDone: (reason: EndReason) => void;\n rejectDone: (error: DesktopProtocolError) => void;\n ended: boolean;\n /** True while a reattach request is in flight for it. */\n reattaching: boolean;\n /** The first-frame deadline, until the stream hears anything back. */\n firstFrameTimer: unknown;\n}\n\nconst defaultTimers: ClientTimers = {\n setTimeout: (fn, ms) => globalThis.setTimeout(fn, ms),\n clearTimeout: (handle) => globalThis.clearTimeout(handle as ReturnType<typeof globalThis.setTimeout>),\n now: () => Date.now(),\n};\n\nfunction defaultWebSocket(): WebSocketFactory {\n return (url, protocols) => {\n const Ctor = (globalThis as { WebSocket?: new (url: string, protocols?: string[]) => WebSocketLike }).WebSocket;\n if (!Ctor) {\n throw new DesktopProtocolError(\"PLATFORM_UNSUPPORTED\", \"No global WebSocket — pass options.webSocket\");\n }\n return new Ctor(url, protocols);\n };\n}\n\nfunction capOf(op: string): { cap: string; op: string } {\n const dot = op.indexOf(\".\");\n return { cap: op.slice(0, dot), op: op.slice(dot + 1) };\n}\n\nfunction fromBody(body: ProtocolErrorBody): DesktopProtocolError {\n return body.data === undefined\n ? new DesktopProtocolError(body.code, body.message, { retryable: body.retryable })\n : new DesktopProtocolError(body.code, body.message, { retryable: body.retryable, data: body.data });\n}\n\nfunction toBytes(data: unknown): Uint8Array | null {\n if (data instanceof ArrayBuffer) return new Uint8Array(data);\n if (ArrayBuffer.isView(data)) return new Uint8Array(data.buffer, data.byteOffset, data.byteLength);\n return null;\n}\n\nexport function createDesktopClient(options: DesktopClientOptions): DesktopClient {\n const timers = options.timers ?? defaultTimers;\n const makeSocket = options.webSocket ?? defaultWebSocket();\n const heartbeatMs = options.heartbeatMs ?? 25_000;\n const requestTimeoutMs = options.requestTimeoutMs ?? 70_000;\n const firstFrameMs = options.firstFrameMs ?? requestTimeoutMs;\n const protocolVersion = options.protocolVersion ?? `${PROTOCOL_MAJOR}.${PROTOCOL_MINOR}`;\n const backoff = createBackoff({ ...options.backoff, now: timers.now });\n const diagnose =\n options.onDiagnostic ??\n ((d: DesktopClientDiagnostic) => {\n console.warn(\"[desktop-protocol]\", d.kind, d);\n });\n\n let state: DesktopClientState = {\n status: \"idle\",\n welcome: null,\n attempts: 0,\n retryInMs: null,\n lastError: null,\n lastCloseCode: null,\n outcome: null,\n };\n /** Token refusals (4001/4008) since the last welcome; the second in a row is terminal. */\n let authRefusals = 0;\n const listeners = new Set<() => void>();\n const readyWaiters = new Set<{ resolve: (w: Welcome) => void; reject: (e: DesktopProtocolError) => void }>();\n const pending = new Map<string, Pending>();\n // Requests this client gave up on (aborted or timed out) after telling the core \"cancel\". The\n // core still answers each one exactly once — CANCELLED, or the result if it finished first — so\n // that one answer is expected and consumed here, not reported as unknown_request. Bounded: an\n // answer that never comes cannot grow it past ABANDONED_MAX; a dropped socket clears it.\n const abandoned = new Set<string>();\n const ABANDONED_MAX = 1024;\n function abandon(id: string): void {\n if (!sendJson({ id, type: \"cancel\" })) return;\n abandoned.add(id);\n if (abandoned.size > ABANDONED_MAX) abandoned.delete(abandoned.values().next().value as string);\n }\n const streams = new Map<string, StreamState>(); // by current request id\n const bySid = new Map<number, StreamState>();\n const eventHandlers = new Map<string, Set<EventHandler<EventName>>>();\n let socket: WebSocketLike | null = null;\n let socketGeneration = 0;\n let nextId = 0;\n let helloId: string | null = null;\n let reconnectTimer: unknown = null;\n let heartbeatTimer: unknown = null;\n let probeTimer: unknown = null;\n let lastHeardAt = 0;\n /** Inbound messages on the current socket — the wake probe's \"was anything heard since?\" */\n let heardCount = 0;\n /** Heartbeat answers on the current socket (reported when it closes). */\n let pongs = 0;\n let closedByUser = false;\n\n const newId = (prefix: string) => `${prefix}${(++nextId).toString(36)}`;\n\n function setState(patch: Partial<DesktopClientState>): void {\n state = { ...state, ...patch };\n for (const listener of [...listeners]) {\n try {\n listener();\n } catch (error) {\n diagnose({ kind: \"handler_threw\", where: \"subscribe listener\", error });\n }\n }\n }\n\n function sendJson(message: unknown): boolean {\n if (!socket || socket.readyState !== WS_OPEN) return false;\n socket.send(JSON.stringify(message));\n return true;\n }\n\n // ── connection lifecycle ────────────────────────────────────────────────────\n\n function connect(): void {\n if (state.status === \"connecting\" || state.status === \"handshaking\" || state.status === \"open\") return;\n if (state.status === \"closed\" || state.status === \"idle\") authRefusals = 0; // a deliberate (re)start\n closedByUser = false;\n if (reconnectTimer !== null) {\n timers.clearTimeout(reconnectTimer);\n reconnectTimer = null;\n }\n void openSocket();\n }\n\n async function openSocket(): Promise<void> {\n const generation = ++socketGeneration;\n setState({ status: \"connecting\", retryInMs: null });\n let ws: WebSocketLike;\n try {\n const url = typeof options.url === \"function\" ? await options.url() : options.url;\n const protocols = options.protocols ? await options.protocols() : [];\n if (generation !== socketGeneration || closedByUser) return;\n ws = makeSocket(url, protocols);\n } catch (error) {\n if (generation !== socketGeneration) return;\n const err =\n error instanceof DesktopProtocolError\n ? error\n : new DesktopProtocolError(\"INTERNAL\", \"Could not open the connection\", { retryable: true, cause: error });\n onSocketGone(generation, null, err);\n return;\n }\n socket = ws;\n ws.binaryType = \"arraybuffer\";\n ws.onopen = () => {\n if (generation !== socketGeneration) return;\n lastHeardAt = timers.now();\n pongs = 0;\n helloId = newId(\"h\");\n setState({ status: \"handshaking\" });\n sendJson({ type: \"hello\", id: helloId, protocolVersion, clientType: options.clientType, clientVersion: options.clientVersion });\n scheduleHeartbeat(generation);\n };\n ws.onmessage = (event) => {\n if (generation !== socketGeneration) return;\n lastHeardAt = timers.now();\n heardCount++;\n onMessage(event.data);\n };\n ws.onerror = () => {\n // The close event that always follows carries the code; nothing to do here.\n };\n ws.onclose = (event) => {\n if (generation !== socketGeneration) return;\n const ev = event as { code: number; reason?: string; wasClean?: boolean };\n reportClose(ev.code, ev.reason ?? \"\", ev.wasClean ?? false);\n onSocketGone(generation, event.code, null);\n };\n }\n\n function scheduleHeartbeat(generation: number): void {\n if (heartbeatTimer !== null) timers.clearTimeout(heartbeatTimer);\n heartbeatTimer = timers.setTimeout(() => {\n heartbeatTimer = null;\n if (generation !== socketGeneration || !socket) return;\n const silentMs = timers.now() - lastHeardAt;\n if (silentMs >= heartbeatMs * 2) {\n diagnose({ kind: \"heartbeat_timeout\", silentMs });\n reportClose(null, \"heartbeat timeout\", false);\n const dead = socket;\n onSocketGone(generation, null, new DesktopProtocolError(\"TIMEOUT\", \"Connection went silent\", { retryable: true }));\n try {\n dead.close(CloseCode.NORMAL, \"heartbeat timeout\");\n } catch {\n // already closing\n }\n return;\n }\n if (socket.readyState === WS_OPEN) socket.send(PING_TEXT);\n scheduleHeartbeat(generation);\n }, heartbeatMs);\n }\n\n function reportClose(code: number | null, reason: string, wasClean: boolean): void {\n diagnose({ kind: \"socket_closed\", code, reason: reason.slice(0, 120), wasClean, idleSinceLastRxMs: Math.max(0, timers.now() - lastHeardAt), pongs });\n }\n\n /** The socket is gone (close event, open failure or heartbeat death). */\n function onSocketGone(generation: number, code: number | null, error: DesktopProtocolError | null): void {\n if (generation !== socketGeneration) return;\n socketGeneration++; // ignore anything the dead socket still emits\n if (socket) {\n socket.onopen = socket.onmessage = socket.onclose = socket.onerror = null;\n }\n socket = null;\n helloId = null;\n if (heartbeatTimer !== null) {\n timers.clearTimeout(heartbeatTimer);\n heartbeatTimer = null;\n }\n if (probeTimer !== null) {\n timers.clearTimeout(probeTimer);\n probeTimer = null;\n }\n // The one close table (close-policy.ts) decides: retry, retry with a fresh token, or stop.\n const rule = code === null ? null : closeRule(code);\n if (rule?.action === \"reauth\") authRefusals++;\n const stopped = rule !== null && (rule.action === \"stop\" || (rule.action === \"reauth\" && authRefusals >= 2));\n const terminal = stopped && rule ? rule : undefined;\n const lost =\n error ??\n (terminal\n ? new DesktopProtocolError(terminal.error[0], terminal.error[1])\n : rule && rule.action === \"reauth\"\n ? new DesktopProtocolError(rule.error[0], rule.error[1], { retryable: true })\n : new DesktopProtocolError(\"DEVICE_OFFLINE\", \"Connection lost\", { retryable: true }));\n\n // Unary requests cannot survive a drop: the caller decides whether to retry.\n abandoned.clear();\n for (const [id, p] of pending) {\n pending.delete(id);\n p.cleanup();\n p.reject(lost);\n }\n // Resource streams survive (reattach on reconnect); everything else ends now.\n bySid.clear();\n for (const [id, s] of streams) {\n if (s.resourceId !== null && terminal === undefined && !closedByUser) {\n s.sid = null;\n s.reattaching = false;\n continue;\n }\n streams.delete(id);\n endStream(s, null, lost);\n }\n\n if (closedByUser || terminal) {\n setState({\n status: \"closed\",\n welcome: null,\n lastError: closedByUser ? state.lastError : lost,\n lastCloseCode: code,\n retryInMs: null,\n outcome: closedByUser ? null : (terminal?.outcome ?? null),\n });\n rejectReadyWaiters(lost);\n return;\n }\n const delay = backoff.nextDelayMs();\n if (backoff.isAlarming()) diagnose({ kind: \"reconnect_alarm\", attempts: backoff.attempts() });\n setState({ status: \"reconnecting\", welcome: null, attempts: backoff.attempts(), retryInMs: delay, lastError: lost, lastCloseCode: code });\n reconnectTimer = timers.setTimeout(() => {\n reconnectTimer = null;\n if (!closedByUser) void openSocket();\n }, delay);\n }\n\n function rejectReadyWaiters(error: DesktopProtocolError): void {\n for (const w of [...readyWaiters]) {\n readyWaiters.delete(w);\n w.reject(error);\n }\n }\n\n function close(): void {\n closedByUser = true;\n if (reconnectTimer !== null) {\n timers.clearTimeout(reconnectTimer);\n reconnectTimer = null;\n }\n const cancelled = new DesktopProtocolError(\"CANCELLED\", \"Client closed\");\n const ws = socket;\n if (ws) {\n onSocketGone(socketGeneration, CloseCode.NORMAL, cancelled);\n try {\n ws.close(CloseCode.NORMAL, \"client closed\");\n } catch {\n // already closed\n }\n } else {\n for (const [id, s] of streams) {\n streams.delete(id);\n endStream(s, null, cancelled);\n }\n setState({ status: \"closed\", retryInMs: null });\n rejectReadyWaiters(cancelled);\n }\n }\n\n // ── inbound ────────────────────────────────────────────────────────────────\n\n function onMessage(data: unknown): void {\n if (typeof data === \"string\") {\n if (data === PONG_TEXT) {\n pongs++;\n return;\n }\n let json: unknown;\n try {\n json = JSON.parse(data);\n } catch {\n diagnose({ kind: \"malformed_message\", detail: \"not JSON\" });\n return;\n }\n const parsed = CoreToClientMsg.safeParse(json);\n if (!parsed.success) {\n diagnose({ kind: \"malformed_message\", detail: parsed.error.issues.map((i) => `${i.path.join(\".\")}: ${i.message}`).join(\"; \") });\n return;\n }\n onEnvelope(parsed.data);\n return;\n }\n const bytes = toBytes(data);\n if (bytes === null) {\n diagnose({ kind: \"malformed_message\", detail: \"binary message is not an ArrayBuffer/view (set binaryType)\" });\n return;\n }\n let frame: ReturnType<typeof decodeFrame>;\n try {\n frame = decodeFrame(bytes);\n } catch (error) {\n diagnose({ kind: \"malformed_message\", detail: error instanceof Error ? error.message : String(error) });\n return;\n }\n onFrame(frame.header, frame.payload);\n }\n\n function onEnvelope(msg: CoreToClientMsg): void {\n if (msg.type !== \"event\") {\n const heard = streams.get(msg.id);\n if (heard) clearFirstFrame(heard);\n }\n switch (msg.type) {\n case \"response\": {\n if (msg.id === helloId) return onWelcome(msg.result);\n const s = streams.get(msg.id);\n if (s) return onStreamResult(s, msg.result);\n const p = pending.get(msg.id);\n if (!p) {\n if (abandoned.delete(msg.id)) return; // the one answer to a request we cancelled\n return diagnose({ kind: \"unknown_request\", id: msg.id, type: msg.type });\n }\n pending.delete(msg.id);\n p.cleanup();\n p.resolve(msg.result);\n return;\n }\n case \"error\": {\n const error = fromBody(msg.error);\n if (msg.id === helloId) return onHelloRefused(error);\n const s = streams.get(msg.id);\n if (s) {\n if (s.reattaching && s.resourceId !== null) diagnose({ kind: \"reattach_failed\", resourceId: s.resourceId, error });\n streams.delete(msg.id);\n if (s.sid !== null) bySid.delete(s.sid);\n return endStream(s, null, error);\n }\n const p = pending.get(msg.id);\n if (!p) {\n if (abandoned.delete(msg.id)) return; // the one answer to a request we cancelled\n return diagnose({ kind: \"unknown_request\", id: msg.id, type: msg.type });\n }\n pending.delete(msg.id);\n p.cleanup();\n p.reject(error);\n return;\n }\n case \"stream\": {\n const s = streams.get(msg.id);\n if (!s) return diagnose({ kind: \"unknown_request\", id: msg.id, type: msg.type });\n onStreamMeta(s, msg.meta);\n return;\n }\n case \"end\": {\n const s = streams.get(msg.id);\n if (!s) return diagnose({ kind: \"unknown_request\", id: msg.id, type: msg.type });\n // Deliver everything already queued before announcing the end.\n void s.chain.then(() => {\n streams.delete(s.id);\n if (s.sid !== null) bySid.delete(s.sid);\n endStream(s, msg.reason ?? \"completed\", null);\n });\n return;\n }\n case \"credit\": {\n const s = streams.get(msg.id);\n if (!s) return diagnose({ kind: \"unknown_request\", id: msg.id, type: msg.type });\n s.sendWindow += msg.n;\n flushSend(s);\n return;\n }\n case \"event\": {\n const key = `${msg.cap}.${msg.name}`;\n const schema = (EVENTS as Record<string, (typeof EVENTS)[EventName]>)[key];\n if (!schema) return diagnose({ kind: \"malformed_message\", detail: `unknown event ${key}` });\n const payload = schema.safeParse(msg.payload);\n if (!payload.success) return diagnose({ kind: \"malformed_message\", detail: `event ${key}: invalid payload` });\n if (key === \"relay.auth_expiring\" && options.getToken) {\n options.getToken().then(reauth, (error: unknown) => diagnose({ kind: \"reauth_failed\", error }));\n }\n for (const handler of [...(eventHandlers.get(key) ?? [])]) {\n try {\n handler(payload.data as never, msg.resourceId);\n } catch (error) {\n diagnose({ kind: \"handler_threw\", where: `event ${key}`, error });\n }\n }\n return;\n }\n }\n }\n\n function onWelcome(result: unknown): void {\n const welcome = Welcome.safeParse(result);\n if (!welcome.success) {\n onHelloRefused(new DesktopProtocolError(\"PROTOCOL_ERROR\", \"Malformed welcome\"));\n return;\n }\n helloId = null;\n backoff.markConnected();\n authRefusals = 0;\n setState({ status: \"open\", welcome: welcome.data, attempts: 0, retryInMs: null, lastError: null, outcome: null });\n // 1.38: say what this client is (\"iPhone\"), first on the wire, so \"Started from iPhone\" is the\n // core's own stamp. Never to an older core (a hello field would have made it refuse the hello).\n if (options.clientLabel && knows(welcome.data.protocol_version, \"1.38\")) {\n void request(\"session.identify\", { label: options.clientLabel.slice(0, 60) }).catch((error: unknown) =>\n diagnose({ kind: \"handler_threw\", where: \"session.identify\", error }),\n );\n }\n for (const w of [...readyWaiters]) {\n readyWaiters.delete(w);\n w.resolve(welcome.data);\n }\n // Transparent reattach: every surviving resource stream continues where its consumer stopped.\n for (const s of [...streams.values()]) {\n if (s.sid === null && s.resourceId !== null && !s.ended) reattach(s, welcome.data);\n }\n }\n\n function onHelloRefused(error: DesktopProtocolError): void {\n // An unsupported version will not fix itself on retry: UPGRADE_REQUIRED is a terminal close.\n const ws = socket;\n onSocketGone(socketGeneration, error.code === \"PROTOCOL_VERSION_UNSUPPORTED\" ? CloseCode.UPGRADE_REQUIRED : null, error);\n try {\n ws?.close(CloseCode.NORMAL, \"hello refused\");\n } catch {\n // already closed\n }\n }\n\n // ── streams ────────────────────────────────────────────────────────────────\n\n function onStreamResult(s: StreamState, result: unknown): void {\n if (s.reattaching) {\n // session.attach result = ResourceInfo; the stream continues on the new id.\n s.reattaching = false;\n safeCall(\"onReattached\", () => s.handlers.onReattached?.());\n return;\n }\n const rid = (result as { resource_id?: unknown } | null)?.resource_id;\n if (typeof rid === \"string\") s.resourceId = rid;\n if (!s.resultSettled) {\n s.resultSettled = true;\n s.resolveResult(result);\n }\n }\n\n function onStreamMeta(s: StreamState, meta: StreamMeta): void {\n if (meta.kind === \"open\") {\n if (s.sid !== null) bySid.delete(s.sid);\n s.sid = meta.sid;\n s.windowBytes = meta.window_bytes;\n if (meta.resource_id !== undefined) s.resourceId = meta.resource_id;\n bySid.set(meta.sid, s);\n flushSend(s);\n } else {\n // gap or snapshot: the next DATA frame re-establishes the sequence.\n s.expectSeq = null;\n }\n safeCall(\"onMeta\", () => s.handlers.onMeta?.(meta));\n }\n\n function onFrame(header: FrameHeader, payload: Uint8Array): void {\n const s = bySid.get(header.sid);\n if (!s) {\n diagnose({ kind: \"unknown_stream\", sid: header.sid });\n return;\n }\n clearFirstFrame(s);\n const isData = header.channel === FrameChannel.DATA || header.channel === FrameChannel.STDERR;\n const isSnapshot = header.channel === FrameChannel.SNAPSHOT;\n if (!isData && !isSnapshot) {\n diagnose({ kind: \"malformed_message\", detail: `channel ${header.channel} is not client-bound` });\n return;\n }\n if (isData) {\n if (s.expectSeq !== null && header.seq !== s.expectSeq) {\n diagnose({ kind: \"seq_gap\", id: s.id, expected: s.expectSeq, received: header.seq });\n }\n s.expectSeq = header.seq + 1;\n }\n // Copy: the payload is a view into a buffer the transport may reuse.\n const bytes = payload.slice();\n const handler = isData ? s.handlers.onData : s.handlers.onSnapshot;\n s.chain = s.chain.then(async () => {\n if (s.ended) return;\n try {\n await handler?.(bytes, header);\n } catch (error) {\n diagnose({ kind: \"handler_threw\", where: isData ? \"onData\" : \"onSnapshot\", error });\n }\n if (isData) s.lastSeq = header.seq;\n grantCredit(s, bytes.byteLength);\n });\n }\n\n function grantCredit(s: StreamState, consumed: number): void {\n s.consumedUncredited += consumed;\n // Batch: one credit per quarter window keeps the pipe full without a message per frame.\n if (s.consumedUncredited >= Math.max(1, Math.floor(s.windowBytes / 4))) {\n if (sendJson({ type: \"credit\", id: s.id, n: s.consumedUncredited })) s.consumedUncredited = 0;\n }\n }\n\n function flushSend(s: StreamState): void {\n if (s.sid === null || !socket || socket.readyState !== WS_OPEN) return;\n const maxPayload = state.welcome?.limits.max_frame_payload_bytes ?? DEFAULT_MAX_FRAME_PAYLOAD_BYTES;\n while (s.sendQueue.length > 0 && s.sendWindow > 0) {\n const head = s.sendQueue[0]!;\n const n = Math.min(head.byteLength, s.sendWindow, maxPayload);\n const chunk = head.subarray(0, n);\n if (n === head.byteLength) s.sendQueue.shift();\n else s.sendQueue[0] = head.subarray(n);\n s.sendWindow -= n;\n s.sendSeq += 1;\n socket.send(encodeFrame({ version: FRAME_VERSION, flags: 0, channel: FrameChannel.STDIN, cid: 0, sid: s.sid, seq: s.sendSeq }, chunk));\n }\n }\n\n function clearFirstFrame(s: StreamState): void {\n if (s.firstFrameTimer === null) return;\n timers.clearTimeout(s.firstFrameTimer);\n s.firstFrameTimer = null;\n }\n\n /**\n * A stream request that hears nothing within its deadline ends with a retryable TIMEOUT — never\n * an open-ended wait (a request lost behind a dead device socket cost 15- and 25-minute hangs) —\n * and the socket is probed: a dead one reconnects with the backoff, a live one stays.\n */\n function armFirstFrame(s: StreamState): void {\n clearFirstFrame(s);\n const waitMs = s.options.firstFrameMs ?? firstFrameMs;\n const id = s.id;\n s.firstFrameTimer = timers.setTimeout(() => {\n s.firstFrameTimer = null;\n if (s.ended || s.id !== id) return;\n diagnose({ kind: \"first_frame_timeout\", id, op: s.op, waitedMs: waitMs });\n streams.delete(id);\n if (s.sid !== null) bySid.delete(s.sid);\n abandon(id);\n endStream(s, null, new DesktopProtocolError(\"TIMEOUT\", `${s.op}: no answer within ${waitMs} ms`, { retryable: true }));\n wake();\n }, waitMs);\n }\n\n function endStream(s: StreamState, reason: EndReason | null, error: DesktopProtocolError | null): void {\n if (s.ended) return;\n clearFirstFrame(s);\n s.ended = true;\n s.sendQueue = [];\n if (!s.resultSettled) {\n s.resultSettled = true;\n s.rejectResult(error ?? new DesktopProtocolError(\"INTERNAL\", \"Stream ended before its result\"));\n }\n if (error) s.rejectDone(error);\n else s.resolveDone(reason ?? \"completed\");\n }\n\n function reattach(s: StreamState, welcome: Welcome): void {\n const id = newId(\"a\");\n streams.delete(s.id);\n s.id = id;\n s.reattaching = true;\n s.expectSeq = s.lastSeq > 0 ? s.lastSeq + 1 : null;\n s.consumedUncredited = 0;\n s.sendWindow = welcome.limits.default_window_bytes;\n s.sendSeq = 0;\n streams.set(id, s);\n const params: Record<string, unknown> = { resource_id: s.resourceId, mode: s.options.mode ?? \"control\" };\n if (s.lastSeq > 0) params.since_seq = s.lastSeq;\n if (s.options.windowBytes !== undefined) params.window_bytes = s.options.windowBytes;\n if (sendJson({ id, type: \"request\", cap: \"session\", op: \"attach\", params })) armFirstFrame(s);\n }\n\n function safeCall(where: string, fn: () => void): void {\n try {\n fn();\n } catch (error) {\n diagnose({ kind: \"handler_threw\", where, error });\n }\n }\n\n // ── public API ─────────────────────────────────────────────────────────────\n\n function ready(opts: RequestOptions = {}): Promise<Welcome> {\n if (state.status === \"open\" && state.welcome) return Promise.resolve(state.welcome);\n if (state.status === \"closed\") {\n return Promise.reject(state.lastError ?? new DesktopProtocolError(\"CANCELLED\", \"Client is closed\"));\n }\n if (state.status === \"idle\") connect();\n return new Promise((resolve, reject) => {\n const waiter = {\n resolve: (w: Welcome) => {\n done();\n resolve(w);\n },\n reject: (e: DesktopProtocolError) => {\n done();\n reject(e);\n },\n };\n const timeoutMs = opts.timeoutMs ?? requestTimeoutMs;\n const timer = timers.setTimeout(() => waiter.reject(new DesktopProtocolError(\"DEVICE_OFFLINE\", \"Device not reachable\", { retryable: true })), timeoutMs);\n const onAbort = () => waiter.reject(new DesktopProtocolError(\"CANCELLED\", \"Aborted\"));\n opts.signal?.addEventListener(\"abort\", onAbort, { once: true });\n function done() {\n readyWaiters.delete(waiter);\n timers.clearTimeout(timer);\n opts.signal?.removeEventListener(\"abort\", onAbort);\n }\n readyWaiters.add(waiter);\n });\n }\n\n async function request<N extends OpName>(op: N, params: OpParams<N>, opts: RequestOptions = {}): Promise<OpResult<N>> {\n if (OPS[op].kind !== \"unary\") {\n throw new DesktopProtocolError(\"INVALID_PARAMS\", `${op} is a ${OPS[op].kind} op — use stream()`);\n }\n await ready(opts);\n const id = newId(\"r\");\n if (opts.onRequestId) safeCall(\"onRequestId\", () => opts.onRequestId?.(id));\n return new Promise<OpResult<N>>((resolve, reject) => {\n const timeoutMs = opts.timeoutMs ?? requestTimeoutMs;\n const timer = timers.setTimeout(() => {\n pending.delete(id);\n cleanup();\n abandon(id);\n reject(new DesktopProtocolError(\"TIMEOUT\", `${op} timed out`, { retryable: true }));\n }, timeoutMs);\n const onAbort = () => {\n pending.delete(id);\n cleanup();\n abandon(id);\n reject(new DesktopProtocolError(\"CANCELLED\", \"Aborted\"));\n };\n function cleanup() {\n timers.clearTimeout(timer);\n opts.signal?.removeEventListener(\"abort\", onAbort);\n }\n opts.signal?.addEventListener(\"abort\", onAbort, { once: true });\n pending.set(id, { kind: \"unary\", op, resolve: resolve as (v: unknown) => void, reject, cleanup });\n if (!sendJson({ id, type: \"request\", ...capOf(op), params })) {\n pending.delete(id);\n cleanup();\n reject(new DesktopProtocolError(\"DEVICE_OFFLINE\", \"Connection lost\", { retryable: true }));\n }\n });\n }\n\n function stream<N extends StreamOpName>(\n op: N,\n params: OpParams<N>,\n handlers: StreamHandlers = {},\n opts: StreamOptions = {},\n ): DesktopStream<N> {\n let resolveResult!: (v: unknown) => void;\n let rejectResult!: (e: DesktopProtocolError) => void;\n let resolveDone!: (r: EndReason) => void;\n let rejectDone!: (e: DesktopProtocolError) => void;\n const result = new Promise<OpResult<N>>((res, rej) => {\n resolveResult = res as (v: unknown) => void;\n rejectResult = rej;\n });\n const done = new Promise<EndReason>((res, rej) => {\n resolveDone = res;\n rejectDone = rej;\n });\n // Consumers often await only one of the two; never leave the other as an unhandled rejection.\n result.catch(() => undefined);\n done.catch(() => undefined);\n\n // A caller-started session.attach (a page reload reattaching by the resource id it kept in its\n // URL) is a resource stream from its first byte: it survives drops like the stream that created\n // the resource, and its sequence continues from since_seq rather than from 1.\n const attach = op === \"session.attach\" ? (params as { resource_id: string; since_seq?: number }) : null;\n const s: StreamState = {\n op,\n handlers,\n options: opts,\n id: newId(\"s\"),\n sid: null,\n resourceId: attach ? attach.resource_id : null,\n lastSeq: attach?.since_seq ?? 0,\n expectSeq: attach ? (attach.since_seq === undefined ? null : attach.since_seq + 1) : 1,\n windowBytes: opts.windowBytes ?? DEFAULT_WINDOW_BYTES,\n consumedUncredited: 0,\n sendWindow: DEFAULT_WINDOW_BYTES,\n sendSeq: 0,\n sendQueue: [],\n chain: Promise.resolve(),\n resultSettled: false,\n resolveResult,\n rejectResult,\n resolveDone,\n rejectDone,\n ended: false,\n reattaching: false,\n firstFrameTimer: null,\n };\n\n const start = async () => {\n let welcome: Welcome;\n try {\n welcome = await ready(opts);\n } catch (error) {\n endStream(s, null, error as DesktopProtocolError);\n return;\n }\n if (s.ended) return;\n s.sendWindow = welcome.limits.default_window_bytes;\n if (opts.windowBytes === undefined) s.windowBytes = welcome.limits.default_window_bytes;\n streams.set(s.id, s);\n const wire: Record<string, unknown> = { ...(params as Record<string, unknown>) };\n if (opts.windowBytes !== undefined && \"window_bytes\" in OPS[op].params.shape) wire.window_bytes = opts.windowBytes;\n if (!sendJson({ id: s.id, type: \"request\", ...capOf(op), params: wire })) {\n streams.delete(s.id);\n endStream(s, null, new DesktopProtocolError(\"DEVICE_OFFLINE\", \"Connection lost\", { retryable: true }));\n return;\n }\n armFirstFrame(s);\n };\n void start();\n opts.signal?.addEventListener(\"abort\", () => handle.cancel(), { once: true });\n\n const encoder = new TextEncoder();\n const handle: DesktopStream<N> = {\n get id() {\n return s.id;\n },\n result,\n done,\n get resourceId() {\n return s.resourceId;\n },\n get lastSeq() {\n return s.lastSeq;\n },\n write(data) {\n if (s.ended) throw new DesktopProtocolError(\"RESOURCE_GONE\", \"Stream has ended\");\n const bytes = typeof data === \"string\" ? encoder.encode(data) : data;\n if (bytes.byteLength === 0) return;\n s.sendQueue.push(bytes);\n flushSend(s);\n },\n cancel() {\n if (s.ended) return;\n if (!sendJson({ id: s.id, type: \"cancel\" })) {\n streams.delete(s.id);\n endStream(s, \"cancelled\", null);\n }\n },\n async detach() {\n if (s.ended) return;\n if (s.resourceId === null) throw new DesktopProtocolError(\"INVALID_PARAMS\", \"Only resource streams can be detached\");\n const resourceId = s.resourceId;\n streams.delete(s.id);\n if (s.sid !== null) bySid.delete(s.sid);\n endStream(s, \"detached\", null);\n await request(\"session.detach\", { resource_id: resourceId });\n },\n };\n return handle;\n }\n\n function on<E extends EventName>(name: E, handler: EventHandler<E>): () => void {\n let set = eventHandlers.get(name);\n if (!set) {\n set = new Set();\n eventHandlers.set(name, set);\n }\n set.add(handler as EventHandler<EventName>);\n return () => {\n set.delete(handler as EventHandler<EventName>);\n };\n }\n\n function reauth(token: string): void {\n sendJson({ type: \"relay\", op: \"reauth\", token });\n }\n\n function wake(opts: WakeOptions = {}): void {\n if (closedByUser || state.status === \"closed\") return;\n if (state.status === \"idle\" || state.status === \"reconnecting\") {\n connect(); // dial now; connect() cancels the scheduled backoff timer\n return;\n }\n if (state.status === \"connecting\" || !socket || probeTimer !== null) return;\n const generation = socketGeneration;\n const heardBefore = heardCount;\n try {\n socket.send(PING_TEXT);\n } catch {\n // A socket that cannot even send is dead: fall through to the probe verdict.\n }\n probeTimer = timers.setTimeout(() => {\n probeTimer = null;\n if (generation !== socketGeneration || !socket) return;\n if (heardCount > heardBefore) return; // answered: the socket is alive\n const silentMs = timers.now() - lastHeardAt;\n diagnose({ kind: \"heartbeat_timeout\", silentMs });\n reportClose(null, \"wake probe timeout\", false);\n const dead = socket;\n onSocketGone(generation, null, new DesktopProtocolError(\"TIMEOUT\", \"Connection went silent\", { retryable: true }));\n try {\n dead.close(CloseCode.NORMAL, \"wake probe timeout\");\n } catch {\n // already closing\n }\n if (state.status === \"reconnecting\") connect(); // the person is looking: no backoff wait\n }, opts.probeMs ?? 4000);\n }\n\n return {\n connect,\n close,\n getState: () => state,\n subscribe(listener) {\n listeners.add(listener);\n return () => {\n listeners.delete(listener);\n };\n },\n ready,\n request,\n stream,\n on,\n reauth,\n wake,\n };\n}\n\nexport { RECONNECT_ALARM_ATTEMPTS };\n","/**\n * Wire a client's wake() to the browser events that mean \"the person is back\": the page becomes\n * visible again (iOS Safari suspends a background tab's sockets), a back/forward-cache restore\n * (`pageshow` with persisted), and the network returning (`online`). Framework-free; the React\n * binding is `useDesktopWake` in `./react`.\n */\nimport type { DesktopClient, WakeOptions } from \"./types\";\n\n/** The subset of window/document the binding listens on — injectable for tests and non-DOM hosts. */\nexport interface WakeTargets {\n window: Pick<Window, \"addEventListener\" | \"removeEventListener\">;\n document: Pick<Document, \"addEventListener\" | \"removeEventListener\" | \"visibilityState\">;\n}\n\nexport function bindDesktopWake(client: Pick<DesktopClient, \"wake\">, options: WakeOptions & { targets?: WakeTargets } = {}): () => void {\n const targets: WakeTargets | null =\n options.targets ?? (typeof window !== \"undefined\" && typeof document !== \"undefined\" ? { window, document } : null);\n if (!targets) return () => undefined;\n const wakeOptions: WakeOptions = options.probeMs === undefined ? {} : { probeMs: options.probeMs };\n const onVisibility = () => {\n if (targets.document.visibilityState === \"visible\") client.wake(wakeOptions);\n };\n const onWake = () => client.wake(wakeOptions);\n targets.document.addEventListener(\"visibilitychange\", onVisibility);\n targets.window.addEventListener(\"pageshow\", onWake);\n targets.window.addEventListener(\"online\", onWake);\n targets.window.addEventListener(\"focus\", onWake);\n return () => {\n targets.document.removeEventListener(\"visibilitychange\", onVisibility);\n targets.window.removeEventListener(\"pageshow\", onWake);\n targets.window.removeEventListener(\"online\", onWake);\n targets.window.removeEventListener(\"focus\", onWake);\n };\n}\n","import { DesktopProtocolError } from \"../error\";\nimport type { MlProgress, ModelsTranscribeResult, TranscriptionModelId } from \"../schema/models\";\nimport type { DesktopClient } from \"./types\";\n\n/** fs.write carries at most 4 MiB of bytes (base64 in one message). */\nexport const DESKTOP_TRANSCRIBE_MAX_BYTES = 4 * 1024 * 1024;\n\nexport interface DesktopTranscriberOptions {\n /** Whisper size; omitted = the device's default. */\n model?: TranscriptionModelId;\n /** ISO 639-1; omitted = detect. */\n language?: string;\n /** Per call (first use installs the runtime and a model): default 15 minutes. */\n timeoutMs?: number;\n /** Progress for each call (install steps, then each segment as it is recognized). */\n onProgress?: (progress: MlProgress) => void;\n}\n\n/** What a transcription returns: the shape `@ai-matrx/browser-audio`'s TranscriptionTransport expects. */\nexport interface DesktopTranscript {\n text: string;\n language: string;\n duration: number;\n segments: Array<{ start: number; end: number; text: string }>;\n result: ModelsTranscribeResult;\n}\n\nexport interface DesktopTranscriber {\n /** Transcribe recorded audio on the device: written to its temp folder, transcribed, removed. */\n transcribe(file: Blob, signal?: AbortSignal): Promise<DesktopTranscript>;\n}\n\nconst EXT: Record<string, string> = {\n \"audio/webm\": \"webm\",\n \"audio/ogg\": \"ogg\",\n \"audio/mp4\": \"m4a\",\n \"audio/mpeg\": \"mp3\",\n \"audio/wav\": \"wav\",\n \"audio/x-wav\": \"wav\",\n \"video/webm\": \"webm\",\n \"video/mp4\": \"mp4\",\n};\n\nfunction base64(bytes: Uint8Array): string {\n let binary = \"\";\n for (let i = 0; i < bytes.length; i += 0x8000) binary += String.fromCharCode(...bytes.subarray(i, i + 0x8000));\n return btoa(binary);\n}\n\n/**\n * Speech to text on the person's own computer, from any surface connected to it (the app's\n * screen, the web app or the phone through the relay). Structurally a\n * `@ai-matrx/browser-audio` TranscriptionTransport, so every voice input on the platform can\n * transcribe locally: `new BrowserAudioKernel({ transport: createDesktopTranscriber(client) })`.\n *\n * Audio travels as one `fs.write` into the device's temp folder (at most 4 MiB; longer\n * recordings are chunked by the kernel), then `models.transcribe`, then `fs.delete` — every step\n * an ordinary op, so this works through every transport with no special path.\n */\nexport function createDesktopTranscriber(client: DesktopClient, options: DesktopTranscriberOptions = {}): DesktopTranscriber {\n let temp: Promise<string> | null = null;\n const tempDir = () => (temp ??= client.request(\"sysinfo.get\", {}).then((s) => s.paths.temp.replace(/\\/$/, \"\")));\n\n return {\n async transcribe(file, signal) {\n if (file.size > DESKTOP_TRANSCRIBE_MAX_BYTES) {\n throw new DesktopProtocolError(\"PAYLOAD_TOO_LARGE\", \"Recording is larger than 4 MB\", { retryable: false, data: { limit_bytes: DESKTOP_TRANSCRIBE_MAX_BYTES } });\n }\n const type = file.type.split(\";\")[0]?.trim() ?? \"\";\n const name = `matrx-transcribe-${Date.now().toString(36)}-${Math.random().toString(36).slice(2, 8)}.${EXT[type] ?? \"webm\"}`;\n const path = `${await tempDir()}/${name}`;\n const bytes = new Uint8Array(await file.arrayBuffer());\n await client.request(\"fs.write\", { path, content: base64(bytes), encoding: \"base64\", mode: 0o600 }, signal ? { signal } : {});\n let requestId = \"\";\n const off = options.onProgress\n ? client.on(\"models.progress\", (payload) => {\n if (payload.request_id === requestId) options.onProgress?.(payload.progress);\n })\n : () => undefined;\n try {\n const result = await client.request(\n \"models.transcribe\",\n { path, ...(options.model ? { model: options.model } : {}), ...(options.language ? { language: options.language } : {}) },\n { timeoutMs: options.timeoutMs ?? 15 * 60_000, onRequestId: (id) => (requestId = id), ...(signal ? { signal } : {}) },\n );\n return {\n text: result.text,\n language: result.language,\n duration: result.duration_s,\n segments: result.segments.map((s) => ({ start: s.start_s, end: s.end_s, text: s.text })),\n result,\n };\n } finally {\n off();\n void client.request(\"fs.delete\", { path, to_trash: false }).catch(() => undefined);\n }\n },\n };\n}\n"],"mappings":"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","names":[]}
|
|
1
|
+
{"version":3,"sources":["../src/client/client.ts","../src/client/wake.ts","../src/client/transcribe.ts"],"sourcesContent":["/**\n * The reconnecting desktop-protocol client: hello → requests, streams with credit-based\n * backpressure, events, transparent reattach of resource streams (terminals, watches) after a\n * drop, heartbeat, and relay reauth. One instance per device connection. All state lives in the\n * closure — no module-level state (dual ESM/CJS graphs would split it).\n */\nimport { RECONNECT_ALARM_ATTEMPTS, createBackoff } from \"@ai-matrx/data/realtime\";\nimport { DesktopProtocolError } from \"../error\";\nimport { FRAME_VERSION, FrameChannel, decodeFrame, encodeFrame } from \"../frame\";\nimport type { FrameHeader } from \"../frame\";\nimport { closeRule } from \"../close-policy\";\nimport { CloseCode, CoreToClientMsg, PING_TEXT, PONG_TEXT, Welcome } from \"../schema/envelope\";\nimport type { EndReason, StreamMeta } from \"../schema/envelope\";\nimport type { ProtocolErrorBody } from \"../schema/errors\";\nimport { DEFAULT_MAX_FRAME_PAYLOAD_BYTES, DEFAULT_WINDOW_BYTES } from \"../schema/frame\";\nimport { PROTOCOL_MAJOR, PROTOCOL_MINOR } from \"../schema/primitives\";\n// The op/event registry (every capability's zod schemas, ~300 kB of source) loads on the first\n// connect or request, never at import: a host that only constructs a client in its root (the web\n// app's local-models port) must not compile every schema into each route's first graph.\ntype Registry = typeof import(\"../schema/registry\");\nlet registry: Registry | null = null;\nlet registryLoad: Promise<Registry> | null = null;\nfunction loadRegistry(): Promise<Registry> {\n if (registry) return Promise.resolve(registry);\n registryLoad ??= import(\"../schema/registry\").then((m) => (registry = m));\n return registryLoad;\n}\nimport { knows } from \"../versioning\";\nimport type { OpName, OpParams, OpResult } from \"../schema/registry\";\nimport type {\n ClientTimers,\n DesktopClient,\n DesktopClientDiagnostic,\n DesktopClientOptions,\n DesktopClientState,\n DesktopStream,\n EventHandler,\n EventName,\n RequestOptions,\n StreamHandlers,\n StreamOpName,\n StreamOptions,\n WakeOptions,\n WebSocketFactory,\n WebSocketLike,\n} from \"./types\";\n\nconst WS_OPEN = 1;\ntype Pending = {\n kind: \"unary\";\n op: string;\n resolve: (value: unknown) => void;\n reject: (error: DesktopProtocolError) => void;\n cleanup: () => void;\n};\n\ninterface StreamState {\n op: string;\n handlers: StreamHandlers;\n options: StreamOptions;\n id: string;\n sid: number | null;\n resourceId: string | null;\n /** Last inbound DATA seq delivered to the consumer. */\n lastSeq: number;\n /** Expected next inbound seq, or null right after a gap/snapshot (resync on next frame). */\n expectSeq: number | null;\n windowBytes: number;\n /** Consumed bytes not yet credited back. */\n consumedUncredited: number;\n /** Outbound (STDIN) credit granted by the core. */\n sendWindow: number;\n sendSeq: number;\n sendQueue: Uint8Array[];\n /** Serializes consumer callbacks so credits follow consumption order. */\n chain: Promise<void>;\n resultSettled: boolean;\n resolveResult: (value: unknown) => void;\n rejectResult: (error: DesktopProtocolError) => void;\n resolveDone: (reason: EndReason) => void;\n rejectDone: (error: DesktopProtocolError) => void;\n ended: boolean;\n /** True while a reattach request is in flight for it. */\n reattaching: boolean;\n /** The first-frame deadline, until the stream hears anything back. */\n firstFrameTimer: unknown;\n}\n\nconst defaultTimers: ClientTimers = {\n setTimeout: (fn, ms) => globalThis.setTimeout(fn, ms),\n clearTimeout: (handle) => globalThis.clearTimeout(handle as ReturnType<typeof globalThis.setTimeout>),\n now: () => Date.now(),\n};\n\nfunction defaultWebSocket(): WebSocketFactory {\n return (url, protocols) => {\n const Ctor = (globalThis as { WebSocket?: new (url: string, protocols?: string[]) => WebSocketLike }).WebSocket;\n if (!Ctor) {\n throw new DesktopProtocolError(\"PLATFORM_UNSUPPORTED\", \"No global WebSocket — pass options.webSocket\");\n }\n return new Ctor(url, protocols);\n };\n}\n\nfunction capOf(op: string): { cap: string; op: string } {\n const dot = op.indexOf(\".\");\n return { cap: op.slice(0, dot), op: op.slice(dot + 1) };\n}\n\nfunction fromBody(body: ProtocolErrorBody): DesktopProtocolError {\n return body.data === undefined\n ? new DesktopProtocolError(body.code, body.message, { retryable: body.retryable })\n : new DesktopProtocolError(body.code, body.message, { retryable: body.retryable, data: body.data });\n}\n\nfunction toBytes(data: unknown): Uint8Array | null {\n if (data instanceof ArrayBuffer) return new Uint8Array(data);\n if (ArrayBuffer.isView(data)) return new Uint8Array(data.buffer, data.byteOffset, data.byteLength);\n return null;\n}\n\nexport function createDesktopClient(options: DesktopClientOptions): DesktopClient {\n const timers = options.timers ?? defaultTimers;\n const makeSocket = options.webSocket ?? defaultWebSocket();\n const heartbeatMs = options.heartbeatMs ?? 25_000;\n const requestTimeoutMs = options.requestTimeoutMs ?? 70_000;\n const firstFrameMs = options.firstFrameMs ?? requestTimeoutMs;\n const protocolVersion = options.protocolVersion ?? `${PROTOCOL_MAJOR}.${PROTOCOL_MINOR}`;\n const backoff = createBackoff({ ...options.backoff, now: timers.now });\n const diagnose =\n options.onDiagnostic ??\n ((d: DesktopClientDiagnostic) => {\n console.warn(\"[desktop-protocol]\", d.kind, d);\n });\n\n let state: DesktopClientState = {\n status: \"idle\",\n welcome: null,\n attempts: 0,\n retryInMs: null,\n lastError: null,\n lastCloseCode: null,\n outcome: null,\n };\n /** Token refusals (4001/4008) since the last welcome; the second in a row is terminal. */\n let authRefusals = 0;\n const listeners = new Set<() => void>();\n const readyWaiters = new Set<{ resolve: (w: Welcome) => void; reject: (e: DesktopProtocolError) => void }>();\n const pending = new Map<string, Pending>();\n // Requests this client gave up on (aborted or timed out) after telling the core \"cancel\". The\n // core still answers each one exactly once — CANCELLED, or the result if it finished first — so\n // that one answer is expected and consumed here, not reported as unknown_request. Bounded: an\n // answer that never comes cannot grow it past ABANDONED_MAX; a dropped socket clears it.\n const abandoned = new Set<string>();\n const ABANDONED_MAX = 1024;\n function abandon(id: string): void {\n if (!sendJson({ id, type: \"cancel\" })) return;\n abandoned.add(id);\n if (abandoned.size > ABANDONED_MAX) abandoned.delete(abandoned.values().next().value as string);\n }\n const streams = new Map<string, StreamState>(); // by current request id\n const bySid = new Map<number, StreamState>();\n const eventHandlers = new Map<string, Set<EventHandler<EventName>>>();\n let socket: WebSocketLike | null = null;\n let socketGeneration = 0;\n let nextId = 0;\n let helloId: string | null = null;\n let reconnectTimer: unknown = null;\n let heartbeatTimer: unknown = null;\n let probeTimer: unknown = null;\n let lastHeardAt = 0;\n /** Inbound messages on the current socket — the wake probe's \"was anything heard since?\" */\n let heardCount = 0;\n /** Heartbeat answers on the current socket (reported when it closes). */\n let pongs = 0;\n let closedByUser = false;\n\n const newId = (prefix: string) => `${prefix}${(++nextId).toString(36)}`;\n\n function setState(patch: Partial<DesktopClientState>): void {\n state = { ...state, ...patch };\n for (const listener of [...listeners]) {\n try {\n listener();\n } catch (error) {\n diagnose({ kind: \"handler_threw\", where: \"subscribe listener\", error });\n }\n }\n }\n\n function sendJson(message: unknown): boolean {\n if (!socket || socket.readyState !== WS_OPEN) return false;\n socket.send(JSON.stringify(message));\n return true;\n }\n\n // ── connection lifecycle ────────────────────────────────────────────────────\n\n function connect(): void {\n if (state.status === \"connecting\" || state.status === \"handshaking\" || state.status === \"open\") return;\n if (state.status === \"closed\" || state.status === \"idle\") authRefusals = 0; // a deliberate (re)start\n closedByUser = false;\n if (reconnectTimer !== null) {\n timers.clearTimeout(reconnectTimer);\n reconnectTimer = null;\n }\n void openSocket();\n }\n\n async function openSocket(): Promise<void> {\n const generation = ++socketGeneration;\n setState({ status: \"connecting\", retryInMs: null });\n let ws: WebSocketLike;\n try {\n // Before the socket opens: every envelope after it (events, results) is checked against it.\n if (!registry) await loadRegistry();\n const url = typeof options.url === \"function\" ? await options.url() : options.url;\n const protocols = options.protocols ? await options.protocols() : [];\n if (generation !== socketGeneration || closedByUser) return;\n ws = makeSocket(url, protocols);\n } catch (error) {\n if (generation !== socketGeneration) return;\n const err =\n error instanceof DesktopProtocolError\n ? error\n : new DesktopProtocolError(\"INTERNAL\", \"Could not open the connection\", { retryable: true, cause: error });\n onSocketGone(generation, null, err);\n return;\n }\n socket = ws;\n ws.binaryType = \"arraybuffer\";\n ws.onopen = () => {\n if (generation !== socketGeneration) return;\n lastHeardAt = timers.now();\n pongs = 0;\n helloId = newId(\"h\");\n setState({ status: \"handshaking\" });\n sendJson({ type: \"hello\", id: helloId, protocolVersion, clientType: options.clientType, clientVersion: options.clientVersion });\n scheduleHeartbeat(generation);\n };\n ws.onmessage = (event) => {\n if (generation !== socketGeneration) return;\n lastHeardAt = timers.now();\n heardCount++;\n onMessage(event.data);\n };\n ws.onerror = () => {\n // The close event that always follows carries the code; nothing to do here.\n };\n ws.onclose = (event) => {\n if (generation !== socketGeneration) return;\n const ev = event as { code: number; reason?: string; wasClean?: boolean };\n reportClose(ev.code, ev.reason ?? \"\", ev.wasClean ?? false);\n onSocketGone(generation, event.code, null);\n };\n }\n\n function scheduleHeartbeat(generation: number): void {\n if (heartbeatTimer !== null) timers.clearTimeout(heartbeatTimer);\n heartbeatTimer = timers.setTimeout(() => {\n heartbeatTimer = null;\n if (generation !== socketGeneration || !socket) return;\n const silentMs = timers.now() - lastHeardAt;\n if (silentMs >= heartbeatMs * 2) {\n diagnose({ kind: \"heartbeat_timeout\", silentMs });\n reportClose(null, \"heartbeat timeout\", false);\n const dead = socket;\n onSocketGone(generation, null, new DesktopProtocolError(\"TIMEOUT\", \"Connection went silent\", { retryable: true }));\n try {\n dead.close(CloseCode.NORMAL, \"heartbeat timeout\");\n } catch {\n // already closing\n }\n return;\n }\n if (socket.readyState === WS_OPEN) socket.send(PING_TEXT);\n scheduleHeartbeat(generation);\n }, heartbeatMs);\n }\n\n function reportClose(code: number | null, reason: string, wasClean: boolean): void {\n diagnose({ kind: \"socket_closed\", code, reason: reason.slice(0, 120), wasClean, idleSinceLastRxMs: Math.max(0, timers.now() - lastHeardAt), pongs });\n }\n\n /** The socket is gone (close event, open failure or heartbeat death). */\n function onSocketGone(generation: number, code: number | null, error: DesktopProtocolError | null): void {\n if (generation !== socketGeneration) return;\n socketGeneration++; // ignore anything the dead socket still emits\n if (socket) {\n socket.onopen = socket.onmessage = socket.onclose = socket.onerror = null;\n }\n socket = null;\n helloId = null;\n if (heartbeatTimer !== null) {\n timers.clearTimeout(heartbeatTimer);\n heartbeatTimer = null;\n }\n if (probeTimer !== null) {\n timers.clearTimeout(probeTimer);\n probeTimer = null;\n }\n // The one close table (close-policy.ts) decides: retry, retry with a fresh token, or stop.\n const rule = code === null ? null : closeRule(code);\n if (rule?.action === \"reauth\") authRefusals++;\n const stopped = rule !== null && (rule.action === \"stop\" || (rule.action === \"reauth\" && authRefusals >= 2));\n const terminal = stopped && rule ? rule : undefined;\n const lost =\n error ??\n (terminal\n ? new DesktopProtocolError(terminal.error[0], terminal.error[1])\n : rule && rule.action === \"reauth\"\n ? new DesktopProtocolError(rule.error[0], rule.error[1], { retryable: true })\n : new DesktopProtocolError(\"DEVICE_OFFLINE\", \"Connection lost\", { retryable: true }));\n\n // Unary requests cannot survive a drop: the caller decides whether to retry.\n abandoned.clear();\n for (const [id, p] of pending) {\n pending.delete(id);\n p.cleanup();\n p.reject(lost);\n }\n // Resource streams survive (reattach on reconnect); everything else ends now.\n bySid.clear();\n for (const [id, s] of streams) {\n if (s.resourceId !== null && terminal === undefined && !closedByUser) {\n s.sid = null;\n s.reattaching = false;\n continue;\n }\n streams.delete(id);\n endStream(s, null, lost);\n }\n\n if (closedByUser || terminal) {\n setState({\n status: \"closed\",\n welcome: null,\n lastError: closedByUser ? state.lastError : lost,\n lastCloseCode: code,\n retryInMs: null,\n outcome: closedByUser ? null : (terminal?.outcome ?? null),\n });\n rejectReadyWaiters(lost);\n return;\n }\n const delay = backoff.nextDelayMs();\n if (backoff.isAlarming()) diagnose({ kind: \"reconnect_alarm\", attempts: backoff.attempts() });\n setState({ status: \"reconnecting\", welcome: null, attempts: backoff.attempts(), retryInMs: delay, lastError: lost, lastCloseCode: code });\n reconnectTimer = timers.setTimeout(() => {\n reconnectTimer = null;\n if (!closedByUser) void openSocket();\n }, delay);\n }\n\n function rejectReadyWaiters(error: DesktopProtocolError): void {\n for (const w of [...readyWaiters]) {\n readyWaiters.delete(w);\n w.reject(error);\n }\n }\n\n function close(): void {\n closedByUser = true;\n if (reconnectTimer !== null) {\n timers.clearTimeout(reconnectTimer);\n reconnectTimer = null;\n }\n const cancelled = new DesktopProtocolError(\"CANCELLED\", \"Client closed\");\n const ws = socket;\n if (ws) {\n onSocketGone(socketGeneration, CloseCode.NORMAL, cancelled);\n try {\n ws.close(CloseCode.NORMAL, \"client closed\");\n } catch {\n // already closed\n }\n } else {\n for (const [id, s] of streams) {\n streams.delete(id);\n endStream(s, null, cancelled);\n }\n setState({ status: \"closed\", retryInMs: null });\n rejectReadyWaiters(cancelled);\n }\n }\n\n // ── inbound ────────────────────────────────────────────────────────────────\n\n function onMessage(data: unknown): void {\n if (typeof data === \"string\") {\n if (data === PONG_TEXT) {\n pongs++;\n return;\n }\n let json: unknown;\n try {\n json = JSON.parse(data);\n } catch {\n diagnose({ kind: \"malformed_message\", detail: \"not JSON\" });\n return;\n }\n const parsed = CoreToClientMsg.safeParse(json);\n if (!parsed.success) {\n diagnose({ kind: \"malformed_message\", detail: parsed.error.issues.map((i) => `${i.path.join(\".\")}: ${i.message}`).join(\"; \") });\n return;\n }\n onEnvelope(parsed.data);\n return;\n }\n const bytes = toBytes(data);\n if (bytes === null) {\n diagnose({ kind: \"malformed_message\", detail: \"binary message is not an ArrayBuffer/view (set binaryType)\" });\n return;\n }\n let frame: ReturnType<typeof decodeFrame>;\n try {\n frame = decodeFrame(bytes);\n } catch (error) {\n diagnose({ kind: \"malformed_message\", detail: error instanceof Error ? error.message : String(error) });\n return;\n }\n onFrame(frame.header, frame.payload);\n }\n\n function onEnvelope(msg: CoreToClientMsg): void {\n if (msg.type !== \"event\") {\n const heard = streams.get(msg.id);\n if (heard) clearFirstFrame(heard);\n }\n switch (msg.type) {\n case \"response\": {\n if (msg.id === helloId) return onWelcome(msg.result);\n const s = streams.get(msg.id);\n if (s) return onStreamResult(s, msg.result);\n const p = pending.get(msg.id);\n if (!p) {\n if (abandoned.delete(msg.id)) return; // the one answer to a request we cancelled\n return diagnose({ kind: \"unknown_request\", id: msg.id, type: msg.type });\n }\n pending.delete(msg.id);\n p.cleanup();\n p.resolve(msg.result);\n return;\n }\n case \"error\": {\n const error = fromBody(msg.error);\n if (msg.id === helloId) return onHelloRefused(error);\n const s = streams.get(msg.id);\n if (s) {\n if (s.reattaching && s.resourceId !== null) diagnose({ kind: \"reattach_failed\", resourceId: s.resourceId, error });\n streams.delete(msg.id);\n if (s.sid !== null) bySid.delete(s.sid);\n return endStream(s, null, error);\n }\n const p = pending.get(msg.id);\n if (!p) {\n if (abandoned.delete(msg.id)) return; // the one answer to a request we cancelled\n return diagnose({ kind: \"unknown_request\", id: msg.id, type: msg.type });\n }\n pending.delete(msg.id);\n p.cleanup();\n p.reject(error);\n return;\n }\n case \"stream\": {\n const s = streams.get(msg.id);\n if (!s) return diagnose({ kind: \"unknown_request\", id: msg.id, type: msg.type });\n onStreamMeta(s, msg.meta);\n return;\n }\n case \"end\": {\n const s = streams.get(msg.id);\n if (!s) return diagnose({ kind: \"unknown_request\", id: msg.id, type: msg.type });\n // Deliver everything already queued before announcing the end.\n void s.chain.then(() => {\n streams.delete(s.id);\n if (s.sid !== null) bySid.delete(s.sid);\n endStream(s, msg.reason ?? \"completed\", null);\n });\n return;\n }\n case \"credit\": {\n const s = streams.get(msg.id);\n if (!s) return diagnose({ kind: \"unknown_request\", id: msg.id, type: msg.type });\n s.sendWindow += msg.n;\n flushSend(s);\n return;\n }\n case \"event\": {\n const key = `${msg.cap}.${msg.name}`;\n // Loaded before the socket opened (openSocket), so an event can never beat it here.\n const events = registry?.EVENTS as Record<string, Registry[\"EVENTS\"][EventName]> | undefined;\n const schema = events?.[key];\n if (!schema) return diagnose({ kind: \"malformed_message\", detail: `unknown event ${key}` });\n const payload = schema.safeParse(msg.payload);\n if (!payload.success) return diagnose({ kind: \"malformed_message\", detail: `event ${key}: invalid payload` });\n if (key === \"relay.auth_expiring\" && options.getToken) {\n options.getToken().then(reauth, (error: unknown) => diagnose({ kind: \"reauth_failed\", error }));\n }\n for (const handler of [...(eventHandlers.get(key) ?? [])]) {\n try {\n handler(payload.data as never, msg.resourceId);\n } catch (error) {\n diagnose({ kind: \"handler_threw\", where: `event ${key}`, error });\n }\n }\n return;\n }\n }\n }\n\n function onWelcome(result: unknown): void {\n const welcome = Welcome.safeParse(result);\n if (!welcome.success) {\n onHelloRefused(new DesktopProtocolError(\"PROTOCOL_ERROR\", \"Malformed welcome\"));\n return;\n }\n helloId = null;\n backoff.markConnected();\n authRefusals = 0;\n setState({ status: \"open\", welcome: welcome.data, attempts: 0, retryInMs: null, lastError: null, outcome: null });\n // 1.38: say what this client is (\"iPhone\"), first on the wire, so \"Started from iPhone\" is the\n // core's own stamp. Never to an older core (a hello field would have made it refuse the hello).\n if (options.clientLabel && knows(welcome.data.protocol_version, \"1.38\")) {\n void request(\"session.identify\", { label: options.clientLabel.slice(0, 60) }).catch((error: unknown) =>\n diagnose({ kind: \"handler_threw\", where: \"session.identify\", error }),\n );\n }\n for (const w of [...readyWaiters]) {\n readyWaiters.delete(w);\n w.resolve(welcome.data);\n }\n // Transparent reattach: every surviving resource stream continues where its consumer stopped.\n for (const s of [...streams.values()]) {\n if (s.sid === null && s.resourceId !== null && !s.ended) reattach(s, welcome.data);\n }\n }\n\n function onHelloRefused(error: DesktopProtocolError): void {\n // An unsupported version will not fix itself on retry: UPGRADE_REQUIRED is a terminal close.\n const ws = socket;\n onSocketGone(socketGeneration, error.code === \"PROTOCOL_VERSION_UNSUPPORTED\" ? CloseCode.UPGRADE_REQUIRED : null, error);\n try {\n ws?.close(CloseCode.NORMAL, \"hello refused\");\n } catch {\n // already closed\n }\n }\n\n // ── streams ────────────────────────────────────────────────────────────────\n\n function onStreamResult(s: StreamState, result: unknown): void {\n if (s.reattaching) {\n // session.attach result = ResourceInfo; the stream continues on the new id.\n s.reattaching = false;\n safeCall(\"onReattached\", () => s.handlers.onReattached?.());\n return;\n }\n const rid = (result as { resource_id?: unknown } | null)?.resource_id;\n if (typeof rid === \"string\") s.resourceId = rid;\n if (!s.resultSettled) {\n s.resultSettled = true;\n s.resolveResult(result);\n }\n }\n\n function onStreamMeta(s: StreamState, meta: StreamMeta): void {\n if (meta.kind === \"open\") {\n if (s.sid !== null) bySid.delete(s.sid);\n s.sid = meta.sid;\n s.windowBytes = meta.window_bytes;\n if (meta.resource_id !== undefined) s.resourceId = meta.resource_id;\n bySid.set(meta.sid, s);\n flushSend(s);\n } else {\n // gap or snapshot: the next DATA frame re-establishes the sequence.\n s.expectSeq = null;\n }\n safeCall(\"onMeta\", () => s.handlers.onMeta?.(meta));\n }\n\n function onFrame(header: FrameHeader, payload: Uint8Array): void {\n const s = bySid.get(header.sid);\n if (!s) {\n diagnose({ kind: \"unknown_stream\", sid: header.sid });\n return;\n }\n clearFirstFrame(s);\n const isData = header.channel === FrameChannel.DATA || header.channel === FrameChannel.STDERR;\n const isSnapshot = header.channel === FrameChannel.SNAPSHOT;\n if (!isData && !isSnapshot) {\n diagnose({ kind: \"malformed_message\", detail: `channel ${header.channel} is not client-bound` });\n return;\n }\n if (isData) {\n if (s.expectSeq !== null && header.seq !== s.expectSeq) {\n diagnose({ kind: \"seq_gap\", id: s.id, expected: s.expectSeq, received: header.seq });\n }\n s.expectSeq = header.seq + 1;\n }\n // Copy: the payload is a view into a buffer the transport may reuse.\n const bytes = payload.slice();\n const handler = isData ? s.handlers.onData : s.handlers.onSnapshot;\n s.chain = s.chain.then(async () => {\n if (s.ended) return;\n try {\n await handler?.(bytes, header);\n } catch (error) {\n diagnose({ kind: \"handler_threw\", where: isData ? \"onData\" : \"onSnapshot\", error });\n }\n if (isData) s.lastSeq = header.seq;\n grantCredit(s, bytes.byteLength);\n });\n }\n\n function grantCredit(s: StreamState, consumed: number): void {\n s.consumedUncredited += consumed;\n // Batch: one credit per quarter window keeps the pipe full without a message per frame.\n if (s.consumedUncredited >= Math.max(1, Math.floor(s.windowBytes / 4))) {\n if (sendJson({ type: \"credit\", id: s.id, n: s.consumedUncredited })) s.consumedUncredited = 0;\n }\n }\n\n function flushSend(s: StreamState): void {\n if (s.sid === null || !socket || socket.readyState !== WS_OPEN) return;\n const maxPayload = state.welcome?.limits.max_frame_payload_bytes ?? DEFAULT_MAX_FRAME_PAYLOAD_BYTES;\n while (s.sendQueue.length > 0 && s.sendWindow > 0) {\n const head = s.sendQueue[0]!;\n const n = Math.min(head.byteLength, s.sendWindow, maxPayload);\n const chunk = head.subarray(0, n);\n if (n === head.byteLength) s.sendQueue.shift();\n else s.sendQueue[0] = head.subarray(n);\n s.sendWindow -= n;\n s.sendSeq += 1;\n socket.send(encodeFrame({ version: FRAME_VERSION, flags: 0, channel: FrameChannel.STDIN, cid: 0, sid: s.sid, seq: s.sendSeq }, chunk));\n }\n }\n\n function clearFirstFrame(s: StreamState): void {\n if (s.firstFrameTimer === null) return;\n timers.clearTimeout(s.firstFrameTimer);\n s.firstFrameTimer = null;\n }\n\n /**\n * A stream request that hears nothing within its deadline ends with a retryable TIMEOUT — never\n * an open-ended wait (a request lost behind a dead device socket cost 15- and 25-minute hangs) —\n * and the socket is probed: a dead one reconnects with the backoff, a live one stays.\n */\n function armFirstFrame(s: StreamState): void {\n clearFirstFrame(s);\n const waitMs = s.options.firstFrameMs ?? firstFrameMs;\n const id = s.id;\n s.firstFrameTimer = timers.setTimeout(() => {\n s.firstFrameTimer = null;\n if (s.ended || s.id !== id) return;\n diagnose({ kind: \"first_frame_timeout\", id, op: s.op, waitedMs: waitMs });\n streams.delete(id);\n if (s.sid !== null) bySid.delete(s.sid);\n abandon(id);\n endStream(s, null, new DesktopProtocolError(\"TIMEOUT\", `${s.op}: no answer within ${waitMs} ms`, { retryable: true }));\n wake();\n }, waitMs);\n }\n\n function endStream(s: StreamState, reason: EndReason | null, error: DesktopProtocolError | null): void {\n if (s.ended) return;\n clearFirstFrame(s);\n s.ended = true;\n s.sendQueue = [];\n if (!s.resultSettled) {\n s.resultSettled = true;\n s.rejectResult(error ?? new DesktopProtocolError(\"INTERNAL\", \"Stream ended before its result\"));\n }\n if (error) s.rejectDone(error);\n else s.resolveDone(reason ?? \"completed\");\n }\n\n function reattach(s: StreamState, welcome: Welcome): void {\n const id = newId(\"a\");\n streams.delete(s.id);\n s.id = id;\n s.reattaching = true;\n s.expectSeq = s.lastSeq > 0 ? s.lastSeq + 1 : null;\n s.consumedUncredited = 0;\n s.sendWindow = welcome.limits.default_window_bytes;\n s.sendSeq = 0;\n streams.set(id, s);\n const params: Record<string, unknown> = { resource_id: s.resourceId, mode: s.options.mode ?? \"control\" };\n if (s.lastSeq > 0) params.since_seq = s.lastSeq;\n if (s.options.windowBytes !== undefined) params.window_bytes = s.options.windowBytes;\n if (sendJson({ id, type: \"request\", cap: \"session\", op: \"attach\", params })) armFirstFrame(s);\n }\n\n function safeCall(where: string, fn: () => void): void {\n try {\n fn();\n } catch (error) {\n diagnose({ kind: \"handler_threw\", where, error });\n }\n }\n\n // ── public API ─────────────────────────────────────────────────────────────\n\n function ready(opts: RequestOptions = {}): Promise<Welcome> {\n if (state.status === \"open\" && state.welcome) return Promise.resolve(state.welcome);\n if (state.status === \"closed\") {\n return Promise.reject(state.lastError ?? new DesktopProtocolError(\"CANCELLED\", \"Client is closed\"));\n }\n if (state.status === \"idle\") connect();\n return new Promise((resolve, reject) => {\n const waiter = {\n resolve: (w: Welcome) => {\n done();\n resolve(w);\n },\n reject: (e: DesktopProtocolError) => {\n done();\n reject(e);\n },\n };\n const timeoutMs = opts.timeoutMs ?? requestTimeoutMs;\n const timer = timers.setTimeout(() => waiter.reject(new DesktopProtocolError(\"DEVICE_OFFLINE\", \"Device not reachable\", { retryable: true })), timeoutMs);\n const onAbort = () => waiter.reject(new DesktopProtocolError(\"CANCELLED\", \"Aborted\"));\n opts.signal?.addEventListener(\"abort\", onAbort, { once: true });\n function done() {\n readyWaiters.delete(waiter);\n timers.clearTimeout(timer);\n opts.signal?.removeEventListener(\"abort\", onAbort);\n }\n readyWaiters.add(waiter);\n });\n }\n\n async function request<N extends OpName>(op: N, params: OpParams<N>, opts: RequestOptions = {}): Promise<OpResult<N>> {\n const { OPS } = registry ?? (await loadRegistry());\n if (OPS[op].kind !== \"unary\") {\n throw new DesktopProtocolError(\"INVALID_PARAMS\", `${op} is a ${OPS[op].kind} op — use stream()`);\n }\n await ready(opts);\n const id = newId(\"r\");\n if (opts.onRequestId) safeCall(\"onRequestId\", () => opts.onRequestId?.(id));\n return new Promise<OpResult<N>>((resolve, reject) => {\n const timeoutMs = opts.timeoutMs ?? requestTimeoutMs;\n const timer = timers.setTimeout(() => {\n pending.delete(id);\n cleanup();\n abandon(id);\n reject(new DesktopProtocolError(\"TIMEOUT\", `${op} timed out`, { retryable: true }));\n }, timeoutMs);\n const onAbort = () => {\n pending.delete(id);\n cleanup();\n abandon(id);\n reject(new DesktopProtocolError(\"CANCELLED\", \"Aborted\"));\n };\n function cleanup() {\n timers.clearTimeout(timer);\n opts.signal?.removeEventListener(\"abort\", onAbort);\n }\n opts.signal?.addEventListener(\"abort\", onAbort, { once: true });\n pending.set(id, { kind: \"unary\", op, resolve: resolve as (v: unknown) => void, reject, cleanup });\n if (!sendJson({ id, type: \"request\", ...capOf(op), params })) {\n pending.delete(id);\n cleanup();\n reject(new DesktopProtocolError(\"DEVICE_OFFLINE\", \"Connection lost\", { retryable: true }));\n }\n });\n }\n\n function stream<N extends StreamOpName>(\n op: N,\n params: OpParams<N>,\n handlers: StreamHandlers = {},\n opts: StreamOptions = {},\n ): DesktopStream<N> {\n let resolveResult!: (v: unknown) => void;\n let rejectResult!: (e: DesktopProtocolError) => void;\n let resolveDone!: (r: EndReason) => void;\n let rejectDone!: (e: DesktopProtocolError) => void;\n const result = new Promise<OpResult<N>>((res, rej) => {\n resolveResult = res as (v: unknown) => void;\n rejectResult = rej;\n });\n const done = new Promise<EndReason>((res, rej) => {\n resolveDone = res;\n rejectDone = rej;\n });\n // Consumers often await only one of the two; never leave the other as an unhandled rejection.\n result.catch(() => undefined);\n done.catch(() => undefined);\n\n // A caller-started session.attach (a page reload reattaching by the resource id it kept in its\n // URL) is a resource stream from its first byte: it survives drops like the stream that created\n // the resource, and its sequence continues from since_seq rather than from 1.\n const attach = op === \"session.attach\" ? (params as { resource_id: string; since_seq?: number }) : null;\n const s: StreamState = {\n op,\n handlers,\n options: opts,\n id: newId(\"s\"),\n sid: null,\n resourceId: attach ? attach.resource_id : null,\n lastSeq: attach?.since_seq ?? 0,\n expectSeq: attach ? (attach.since_seq === undefined ? null : attach.since_seq + 1) : 1,\n windowBytes: opts.windowBytes ?? DEFAULT_WINDOW_BYTES,\n consumedUncredited: 0,\n sendWindow: DEFAULT_WINDOW_BYTES,\n sendSeq: 0,\n sendQueue: [],\n chain: Promise.resolve(),\n resultSettled: false,\n resolveResult,\n rejectResult,\n resolveDone,\n rejectDone,\n ended: false,\n reattaching: false,\n firstFrameTimer: null,\n };\n\n const start = async () => {\n let welcome: Welcome;\n try {\n welcome = await ready(opts);\n } catch (error) {\n endStream(s, null, error as DesktopProtocolError);\n return;\n }\n if (s.ended) return;\n s.sendWindow = welcome.limits.default_window_bytes;\n if (opts.windowBytes === undefined) s.windowBytes = welcome.limits.default_window_bytes;\n streams.set(s.id, s);\n const wire: Record<string, unknown> = { ...(params as Record<string, unknown>) };\n const { OPS } = registry ?? (await loadRegistry());\n if (s.ended) return;\n if (opts.windowBytes !== undefined && \"window_bytes\" in OPS[op].params.shape) wire.window_bytes = opts.windowBytes;\n if (!sendJson({ id: s.id, type: \"request\", ...capOf(op), params: wire })) {\n streams.delete(s.id);\n endStream(s, null, new DesktopProtocolError(\"DEVICE_OFFLINE\", \"Connection lost\", { retryable: true }));\n return;\n }\n armFirstFrame(s);\n };\n void start();\n opts.signal?.addEventListener(\"abort\", () => handle.cancel(), { once: true });\n\n const encoder = new TextEncoder();\n const handle: DesktopStream<N> = {\n get id() {\n return s.id;\n },\n result,\n done,\n get resourceId() {\n return s.resourceId;\n },\n get lastSeq() {\n return s.lastSeq;\n },\n write(data) {\n if (s.ended) throw new DesktopProtocolError(\"RESOURCE_GONE\", \"Stream has ended\");\n const bytes = typeof data === \"string\" ? encoder.encode(data) : data;\n if (bytes.byteLength === 0) return;\n s.sendQueue.push(bytes);\n flushSend(s);\n },\n cancel() {\n if (s.ended) return;\n if (!sendJson({ id: s.id, type: \"cancel\" })) {\n streams.delete(s.id);\n endStream(s, \"cancelled\", null);\n }\n },\n async detach() {\n if (s.ended) return;\n if (s.resourceId === null) throw new DesktopProtocolError(\"INVALID_PARAMS\", \"Only resource streams can be detached\");\n const resourceId = s.resourceId;\n streams.delete(s.id);\n if (s.sid !== null) bySid.delete(s.sid);\n endStream(s, \"detached\", null);\n await request(\"session.detach\", { resource_id: resourceId });\n },\n };\n return handle;\n }\n\n function on<E extends EventName>(name: E, handler: EventHandler<E>): () => void {\n let set = eventHandlers.get(name);\n if (!set) {\n set = new Set();\n eventHandlers.set(name, set);\n }\n set.add(handler as EventHandler<EventName>);\n return () => {\n set.delete(handler as EventHandler<EventName>);\n };\n }\n\n function reauth(token: string): void {\n sendJson({ type: \"relay\", op: \"reauth\", token });\n }\n\n function wake(opts: WakeOptions = {}): void {\n if (closedByUser || state.status === \"closed\") return;\n if (state.status === \"idle\" || state.status === \"reconnecting\") {\n connect(); // dial now; connect() cancels the scheduled backoff timer\n return;\n }\n if (state.status === \"connecting\" || !socket || probeTimer !== null) return;\n const generation = socketGeneration;\n const heardBefore = heardCount;\n try {\n socket.send(PING_TEXT);\n } catch {\n // A socket that cannot even send is dead: fall through to the probe verdict.\n }\n probeTimer = timers.setTimeout(() => {\n probeTimer = null;\n if (generation !== socketGeneration || !socket) return;\n if (heardCount > heardBefore) return; // answered: the socket is alive\n const silentMs = timers.now() - lastHeardAt;\n diagnose({ kind: \"heartbeat_timeout\", silentMs });\n reportClose(null, \"wake probe timeout\", false);\n const dead = socket;\n onSocketGone(generation, null, new DesktopProtocolError(\"TIMEOUT\", \"Connection went silent\", { retryable: true }));\n try {\n dead.close(CloseCode.NORMAL, \"wake probe timeout\");\n } catch {\n // already closing\n }\n if (state.status === \"reconnecting\") connect(); // the person is looking: no backoff wait\n }, opts.probeMs ?? 4000);\n }\n\n return {\n connect,\n close,\n getState: () => state,\n subscribe(listener) {\n listeners.add(listener);\n return () => {\n listeners.delete(listener);\n };\n },\n ready,\n request,\n stream,\n on,\n reauth,\n wake,\n };\n}\n\nexport { RECONNECT_ALARM_ATTEMPTS };\n","/**\n * Wire a client's wake() to the browser events that mean \"the person is back\": the page becomes\n * visible again (iOS Safari suspends a background tab's sockets), a back/forward-cache restore\n * (`pageshow` with persisted), and the network returning (`online`). Framework-free; the React\n * binding is `useDesktopWake` in `./react`.\n */\nimport type { DesktopClient, WakeOptions } from \"./types\";\n\n/** The subset of window/document the binding listens on — injectable for tests and non-DOM hosts. */\nexport interface WakeTargets {\n window: Pick<Window, \"addEventListener\" | \"removeEventListener\">;\n document: Pick<Document, \"addEventListener\" | \"removeEventListener\" | \"visibilityState\">;\n}\n\nexport function bindDesktopWake(client: Pick<DesktopClient, \"wake\">, options: WakeOptions & { targets?: WakeTargets } = {}): () => void {\n const targets: WakeTargets | null =\n options.targets ?? (typeof window !== \"undefined\" && typeof document !== \"undefined\" ? { window, document } : null);\n if (!targets) return () => undefined;\n const wakeOptions: WakeOptions = options.probeMs === undefined ? {} : { probeMs: options.probeMs };\n const onVisibility = () => {\n if (targets.document.visibilityState === \"visible\") client.wake(wakeOptions);\n };\n const onWake = () => client.wake(wakeOptions);\n targets.document.addEventListener(\"visibilitychange\", onVisibility);\n targets.window.addEventListener(\"pageshow\", onWake);\n targets.window.addEventListener(\"online\", onWake);\n targets.window.addEventListener(\"focus\", onWake);\n return () => {\n targets.document.removeEventListener(\"visibilitychange\", onVisibility);\n targets.window.removeEventListener(\"pageshow\", onWake);\n targets.window.removeEventListener(\"online\", onWake);\n targets.window.removeEventListener(\"focus\", onWake);\n };\n}\n","import { DesktopProtocolError } from \"../error\";\nimport type { MlProgress, ModelsTranscribeResult, TranscriptionModelId } from \"../schema/models\";\nimport type { DesktopClient } from \"./types\";\n\n/** fs.write carries at most 4 MiB of bytes (base64 in one message). */\nexport const DESKTOP_TRANSCRIBE_MAX_BYTES = 4 * 1024 * 1024;\n\nexport interface DesktopTranscriberOptions {\n /** Whisper size; omitted = the device's default. */\n model?: TranscriptionModelId;\n /** ISO 639-1; omitted = detect. */\n language?: string;\n /** Per call (first use installs the runtime and a model): default 15 minutes. */\n timeoutMs?: number;\n /** Progress for each call (install steps, then each segment as it is recognized). */\n onProgress?: (progress: MlProgress) => void;\n}\n\n/** What a transcription returns: the shape `@ai-matrx/browser-audio`'s TranscriptionTransport expects. */\nexport interface DesktopTranscript {\n text: string;\n language: string;\n duration: number;\n segments: Array<{ start: number; end: number; text: string }>;\n result: ModelsTranscribeResult;\n}\n\nexport interface DesktopTranscriber {\n /** Transcribe recorded audio on the device: written to its temp folder, transcribed, removed. */\n transcribe(file: Blob, signal?: AbortSignal): Promise<DesktopTranscript>;\n}\n\nconst EXT: Record<string, string> = {\n \"audio/webm\": \"webm\",\n \"audio/ogg\": \"ogg\",\n \"audio/mp4\": \"m4a\",\n \"audio/mpeg\": \"mp3\",\n \"audio/wav\": \"wav\",\n \"audio/x-wav\": \"wav\",\n \"video/webm\": \"webm\",\n \"video/mp4\": \"mp4\",\n};\n\nfunction base64(bytes: Uint8Array): string {\n let binary = \"\";\n for (let i = 0; i < bytes.length; i += 0x8000) binary += String.fromCharCode(...bytes.subarray(i, i + 0x8000));\n return btoa(binary);\n}\n\n/**\n * Speech to text on the person's own computer, from any surface connected to it (the app's\n * screen, the web app or the phone through the relay). Structurally a\n * `@ai-matrx/browser-audio` TranscriptionTransport, so every voice input on the platform can\n * transcribe locally: `new BrowserAudioKernel({ transport: createDesktopTranscriber(client) })`.\n *\n * Audio travels as one `fs.write` into the device's temp folder (at most 4 MiB; longer\n * recordings are chunked by the kernel), then `models.transcribe`, then `fs.delete` — every step\n * an ordinary op, so this works through every transport with no special path.\n */\nexport function createDesktopTranscriber(client: DesktopClient, options: DesktopTranscriberOptions = {}): DesktopTranscriber {\n let temp: Promise<string> | null = null;\n const tempDir = () => (temp ??= client.request(\"sysinfo.get\", {}).then((s) => s.paths.temp.replace(/\\/$/, \"\")));\n\n return {\n async transcribe(file, signal) {\n if (file.size > DESKTOP_TRANSCRIBE_MAX_BYTES) {\n throw new DesktopProtocolError(\"PAYLOAD_TOO_LARGE\", \"Recording is larger than 4 MB\", { retryable: false, data: { limit_bytes: DESKTOP_TRANSCRIBE_MAX_BYTES } });\n }\n const type = file.type.split(\";\")[0]?.trim() ?? \"\";\n const name = `matrx-transcribe-${Date.now().toString(36)}-${Math.random().toString(36).slice(2, 8)}.${EXT[type] ?? \"webm\"}`;\n const path = `${await tempDir()}/${name}`;\n const bytes = new Uint8Array(await file.arrayBuffer());\n await client.request(\"fs.write\", { path, content: base64(bytes), encoding: \"base64\", mode: 0o600 }, signal ? { signal } : {});\n let requestId = \"\";\n const off = options.onProgress\n ? client.on(\"models.progress\", (payload) => {\n if (payload.request_id === requestId) options.onProgress?.(payload.progress);\n })\n : () => undefined;\n try {\n const result = await client.request(\n \"models.transcribe\",\n { path, ...(options.model ? { model: options.model } : {}), ...(options.language ? { language: options.language } : {}) },\n { timeoutMs: options.timeoutMs ?? 15 * 60_000, onRequestId: (id) => (requestId = id), ...(signal ? { signal } : {}) },\n );\n return {\n text: result.text,\n language: result.language,\n duration: result.duration_s,\n segments: result.segments.map((s) => ({ start: s.start_s, end: s.end_s, text: s.text })),\n result,\n };\n } finally {\n off();\n void client.request(\"fs.delete\", { path, to_trash: false }).catch(() => undefined);\n }\n },\n };\n}\n"],"mappings":"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","names":[]}
|
package/dist/index.cjs
CHANGED
|
@@ -719,6 +719,7 @@ __export(src_exports, {
|
|
|
719
719
|
ResponseMsg: () => ResponseMsg,
|
|
720
720
|
SERVICES: () => SERVICES,
|
|
721
721
|
SERVICE_MAX_FRAME_BYTES: () => SERVICE_MAX_FRAME_BYTES,
|
|
722
|
+
SETUP_KINDS_SINCE: () => SETUP_KINDS_SINCE,
|
|
722
723
|
SUBPROTOCOL: () => SUBPROTOCOL,
|
|
723
724
|
ScheduleCancelParams: () => ScheduleCancelParams,
|
|
724
725
|
ScheduleCancelResult: () => ScheduleCancelResult,
|
|
@@ -944,7 +945,7 @@ module.exports = __toCommonJS(src_exports);
|
|
|
944
945
|
var import_zod = require("zod");
|
|
945
946
|
var import_uuid = require("@ai-matrx/kit/uuid");
|
|
946
947
|
var PROTOCOL_MAJOR = 1;
|
|
947
|
-
var PROTOCOL_MINOR =
|
|
948
|
+
var PROTOCOL_MINOR = 80;
|
|
948
949
|
var PROTOCOL_VERSION = `${PROTOCOL_MAJOR}.${PROTOCOL_MINOR}`;
|
|
949
950
|
var ProtocolVersion = import_zod.z.string().regex(/^[1-9][0-9]{0,2}\.[0-9]{1,3}$/);
|
|
950
951
|
var RequestId = import_zod.z.string().min(1).max(64).regex(/^[A-Za-z0-9_-]+$/);
|
|
@@ -3179,7 +3180,7 @@ var McpServerRow = import_zod15.z.strictObject({
|
|
|
3179
3180
|
where: import_zod15.z.string().max(400)
|
|
3180
3181
|
});
|
|
3181
3182
|
var SetupFact = import_zod15.z.strictObject({ name: import_zod15.z.string().max(80), value: import_zod15.z.string().max(300) });
|
|
3182
|
-
var SetupItemKind = import_zod15.z.enum(["extension", "plugin", "marketplace", "model"]);
|
|
3183
|
+
var SetupItemKind = import_zod15.z.enum(["extension", "plugin", "marketplace", "model", "skill"]);
|
|
3183
3184
|
var SetupItem = import_zod15.z.strictObject({
|
|
3184
3185
|
kind: SetupItemKind,
|
|
3185
3186
|
name: import_zod15.z.string().max(200),
|
|
@@ -7117,6 +7118,27 @@ var PERMISSIONS_SINCE = {
|
|
|
7117
7118
|
mail: "1.41",
|
|
7118
7119
|
wifi: "1.41"
|
|
7119
7120
|
};
|
|
7121
|
+
var SETUP_KINDS_SINCE = {
|
|
7122
|
+
skill: "1.80"
|
|
7123
|
+
};
|
|
7124
|
+
function setupItemsForPeer(value, version) {
|
|
7125
|
+
if (value === null || typeof value !== "object" || Array.isArray(value)) return value;
|
|
7126
|
+
const body = value;
|
|
7127
|
+
if (!Array.isArray(body.setups)) return value;
|
|
7128
|
+
const since = SETUP_KINDS_SINCE;
|
|
7129
|
+
const setups = body.setups;
|
|
7130
|
+
const next = setups.map((s) => {
|
|
7131
|
+
const items = s?.items;
|
|
7132
|
+
if (!Array.isArray(items)) return s;
|
|
7133
|
+
const kept = items.filter((i) => {
|
|
7134
|
+
const kind = i?.kind;
|
|
7135
|
+
const added = typeof kind === "string" ? since[kind] : void 0;
|
|
7136
|
+
return !added || knows(version, added);
|
|
7137
|
+
});
|
|
7138
|
+
return kept.length === items.length ? s : { ...s, items: kept };
|
|
7139
|
+
});
|
|
7140
|
+
return next.some((s, i) => s !== setups[i]) ? { ...body, setups: next } : value;
|
|
7141
|
+
}
|
|
7120
7142
|
function permissionsForPeer(value, version) {
|
|
7121
7143
|
if (value === null || typeof value !== "object" || Array.isArray(value)) return value;
|
|
7122
7144
|
const body = value;
|
|
@@ -7322,6 +7344,7 @@ function forPeer(op, part, value, version) {
|
|
|
7322
7344
|
const stripped = nested ? stripNested(top, nested, version) : top;
|
|
7323
7345
|
if (op === "coding.providers") return providersForPeer(stripped, version);
|
|
7324
7346
|
if (op === "coding.history" || op === "coding.transcript.read") return transcriptItemsForPeer(stripped, version);
|
|
7347
|
+
if (op === "apps.setup.list") return setupItemsForPeer(stripped, version);
|
|
7325
7348
|
return op === "apps.windows.list" ? windowListRemoteControlForPeer(stripped, version) : stripped;
|
|
7326
7349
|
}
|
|
7327
7350
|
if (value === null || typeof value !== "object") return value;
|
|
@@ -7339,7 +7362,7 @@ function forPeer(op, part, value, version) {
|
|
|
7339
7362
|
var VERSIONED_RESULT_OPS = [.../* @__PURE__ */ new Set([...RESULT_PATH.keys(), ...WINDOW_RESULTS.keys(), ...NESTED_RESULTS.keys()])];
|
|
7340
7363
|
|
|
7341
7364
|
// src/contract.ts
|
|
7342
|
-
var CONTRACT_SHA256 = "
|
|
7365
|
+
var CONTRACT_SHA256 = "c416872bf8877ac2f210f9a4da3c7873a49879bfe07d4c58f4f29dc91e09be27";
|
|
7343
7366
|
|
|
7344
7367
|
// src/close-policy.ts
|
|
7345
7368
|
var CLOSE_RULES = {
|