@ai-matrx/desktop-protocol 0.21.84 → 0.21.86

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 CHANGED
@@ -1,10 +1,23 @@
1
1
  # Changelog
2
2
 
3
- ## 0.21.84
3
+ ## 0.21.86
4
4
 
5
5
  UNVERIFIED: this release has no Unreleased entry and the source comparison could not be made (the caller supplied no source comparison). Whether source changed is unknown; consumer action is unknown.
6
6
  Check the package's gitHead on npm against this version's gitHead: `git diff <previous gitHead> <this gitHead> -- apps/shared/desktop-protocol/src`.
7
7
 
8
+ ## 0.21.85
9
+
10
+ - **`/client` no longer loads every op schema at import** (build-cost lane, 2026-10-22). `createDesktopClient` read the op/event registry (every capability's zod schemas, ~290 kB of built source) through a static import, so a host that only constructs a client in its root (the web app's local-models port, mounted with its chat host) compiled all of it into every route's first graph. The client now imports the registry on its first connect or request (`loadRegistry`, cached); the socket opens only after it has loaded, so every event and result is still checked against it. The ESM `/client` graph drops from ~345 kB to ~65 kB; the root entry still exports `OPS`/`EVENTS` statically. Note: the `chunk-server-*` files are the unstamped (server-SAFE) shared chunk, not server-only code. Guard: `client.test.ts` ("the op registry is not part of the client's import graph"). Consumer action: none; the first connect waits one extra module load.
11
+
12
+ ## 0.21.84
13
+
14
+ SOURCE CHANGED WITH NO RELEASE NOTE. This release shipped source changes that nobody described in an Unreleased entry,
15
+ so they may include breaking API changes. Consumer action is UNKNOWN: read the diff before upgrading.
16
+ Diff: `git diff 9ef2018cc7 0e7ef77cdc -- apps/shared/desktop-protocol/src`
17
+
18
+ Changed shipped source files (1):
19
+ - `apps/shared/desktop-protocol/src/client/client.ts`
20
+
8
21
  ## 0.21.83
9
22
  ### Protocol 1.80 — skills in the Setup table
10
23
 
@@ -2,14 +2,15 @@ import {
2
2
  CloseCode,
3
3
  PROTOCOL_MAJOR,
4
4
  PROTOCOL_MINOR
5
- } from "./chunk-server-QLS73E3X.js";
5
+ } from "./chunk-server-VYJA3PFP.js";
6
6
 
7
7
  // src/versioning.ts
8
8
  import { compareVersions } from "@ai-matrx/kit/versions";
9
9
  var FIELDS_SINCE = {
10
10
  LlmRunning: { context_length: "1.48", gpu_layers: "1.48", threads: "1.48" },
11
11
  TextModelInfo: { title: "1.69", problem: "1.69" },
12
- MlCatalogSetParams: { unusable: "1.69" },
12
+ MlCatalogSetParams: { unusable: "1.69", speech: "1.81" },
13
+ MlProgress: { audio: "1.81" },
13
14
  ModelsLlmStartParams: { gpu_layers: "1.48", threads: "1.48", load_timeout_s: "1.48" },
14
15
  FsPatchResult: { edits_applied: "1.1", edits_failed: "1.1" },
15
16
  "ProtocolErrorBody.data": { edits_failed: "1.1" },
@@ -400,4 +401,4 @@ export {
400
401
  closeRule,
401
402
  isTerminalClose
402
403
  };
403
- //# sourceMappingURL=chunk-server-CFON4SPE.js.map
404
+ //# sourceMappingURL=chunk-server-4UMW5S3S.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/versioning.ts","../src/close-policy.ts"],"sourcesContent":["/**\n * Version skew is the normal state: a phone, the server and a desktop app in the field run\n * different package versions, and a minor protocol bump must never make any of them fail.\n *\n * THE RULE (enforced by src/versioning.test.ts against generated/baseline-1.0.json):\n * 1. Within a major, a minor may only ADD. A field added after x.0 is OPTIONAL in the schema\n * (an older peer omits it) and is listed in FIELDS_SINCE with the minor that added it.\n * 2. A writer never sends a field newer than the version its peer negotiated (hello/welcome, or\n * the /call version header): older peers' strict schemas refuse unknown keys. `forPeer`\n * does the stripping; the core's Router applies it to every result and error it sends.\n * 3. A reader that needs a newer field checks the peer's version and says so loudly when the\n * peer is older (e.g. aidream's local_proxy marks a patch answer from a 1.0 app).\n */\nimport { compareVersions } from \"@ai-matrx/kit/versions\";\n\nimport type { OpName } from \"./schema/registry\";\nimport type { ErrorReasonName } from \"./types\";\nimport { PROTOCOL_MAJOR, PROTOCOL_MINOR } from \"./schema/primitives\";\n\n/**\n * Fields added after x.0, by schema location: a named schema (`FsPatchResult`), a property path\n * inside one (`ProtocolErrorBody.data`), or a union branch (`RelayCallResponse|0`).\n */\nexport const FIELDS_SINCE = {\n LlmRunning: { context_length: \"1.48\", gpu_layers: \"1.48\", threads: \"1.48\" },\n TextModelInfo: { title: \"1.69\", problem: \"1.69\" },\n MlCatalogSetParams: { unusable: \"1.69\", speech: \"1.81\" },\n MlProgress: { audio: \"1.81\" },\n ModelsLlmStartParams: { gpu_layers: \"1.48\", threads: \"1.48\", load_timeout_s: \"1.48\" },\n FsPatchResult: { edits_applied: \"1.1\", edits_failed: \"1.1\" },\n \"ProtocolErrorBody.data\": { edits_failed: \"1.1\" },\n \"RelayCallResponse|0\": { protocol_version: \"1.1\" },\n \"RelayCallResponse|1\": { protocol_version: \"1.1\" },\n WindowInfo: { app: \"1.7\", pid: \"1.7\" },\n AppWindowInfo: { remote_control: \"1.50\" },\n WindowRemoteControl: { problem: \"1.52\" },\n CodingProviderStatus: { accounts: \"1.53\", accountsProblem: \"1.53\", usage: \"1.57\", continueOn: \"1.57\" },\n CodingProviderAccount: { ready: \"1.57\", lastProblem: \"1.57\", problem: \"1.57\", fix: \"1.57\", usage: \"1.57\", continueOn: \"1.57\" },\n CodingSessionRecord: { accountId: \"1.57\" },\n CodingDiscoveredChat: { accountId: \"1.57\" },\n CodingRecentRow: { accountId: \"1.57\" },\n CodingSearchHit: { accountId: \"1.57\" },\n AppInstance: { missing: \"1.63\" },\n AppsInstancesListParams: { fresh: \"1.51\" },\n AppsInstancesListResult: { as_of_ms: \"1.51\", refreshing: \"1.51\", computer: \"1.71\", elsewhere: \"1.71\", shared_problem: \"1.71\" },\n AppsAccountsListParams: { fresh: \"1.51\" },\n AppsAccountsListResult: { as_of_ms: \"1.51\", refreshing: \"1.51\", shared_problem: \"1.71\" },\n AppsChatsListResult: { updating: \"1.9\", live: \"1.9\", families: \"1.10\" },\n AppsAccountsUsageResult: { problem: \"1.12\" },\n AppsAccountsResetsResult: { problem: \"1.12\" },\n ColdChat: { hidden: \"1.78\" },\n SpendChat: { hidden: \"1.78\" },\n SpendLive: { hidden: \"1.78\" },\n SpendIdle: { hidden: \"1.78\" },\n ChatRow: { app_project: \"1.13\", tokens: \"1.13\", original_title: \"1.14\", title_source: \"1.14\", title_override: \"1.14\", archived: \"1.15\", session_id: \"1.59\", app_groups: \"1.59\", parent: \"1.59\", prior_sessions: \"1.59\", title_sync: \"1.61\", moved: \"1.62\", home: \"1.63\", hidden: \"1.70\", pin_sync: \"1.72\" },\n AccountUsage: { plan: \"1.13\", credits: \"1.13\", five_hour_resets_by_ms: \"1.25\", read_source: \"1.73\" },\n AppAccount: { profile: \"1.73\", read_source: \"1.73\", session_cost_usd: \"1.73\", readings: \"1.79\" },\n ResourcesDisk: { name: \"1.17\" },\n StackServer: { cpu_percent: \"1.18\", memory_bytes: \"1.18\" },\n AudioDevice: { kind: \"1.24\" },\n AudioRecordParams: { channels: \"1.66\", sample_rate: \"1.66\" },\n AudioRecordResult: { channels: \"1.66\", sample_rate: \"1.66\" },\n AudioPlayParams: { device_id: \"1.66\" },\n WindowListParams: { app: \"1.66\" },\n WindowMinimizeParams: { mode: \"1.66\" },\n WindowMinimizeResult: { mode: \"1.66\" },\n ScreenDisplay: { rotation: \"1.24\", refresh_hz: \"1.24\", builtin: \"1.24\" },\n PowerStatusResult: { energy: \"1.24\" },\n AppsSpendResult: { days: \"1.24\" },\n AppsWindowsUpdateStateResult: { closed_by_update: \"1.27\" },\n AppsProjectsToWindowParams: { pin: \"1.32\", chat_ids: \"1.36\", take_off_from: \"1.36\", group_id: \"1.43\", group_name: \"1.43\" },\n AppsProjectsToWindowResult: { pin: \"1.32\", chats: \"1.43\" },\n ProjectMoveGroup: { when: \"1.43\", group_id: \"1.43\" },\n AppsChatsTitlesCheckResult: { stale_windows: \"1.33\" },\n AccountAgent: { tags: \"1.39\", model_id: \"1.39\", access_level: \"1.39\", organization_id: \"1.39\", origin: \"1.39\", is_archived: \"1.39\", orchestra: \"1.39\" },\n WebScrapeParams: { engine: \"1.40\", land: \"1.40\" },\n WebScrapePage: { source: \"1.40\" },\n WebBrowserFetchParams: { land: \"1.40\" },\n WebBrowserFetchResult: { source: \"1.40\" },\n SysinfoGetResult: { requirements: \"1.41\" },\n \"SysinfoGetResult.permissions[]\": { detail: \"1.41\" },\n MessagesSendParams: { service: \"1.42\" },\n // 1.67: Matrx Local's local_mac_apps and local_windows_ps contracts, carried whole.\n MailAccount: { mailboxes: \"1.67\" },\n MailSendParams: { bcc: \"1.67\" },\n MessagesChat: { last_message: \"1.67\" },\n MessagesListParams: { contact: \"1.67\", unread_only: \"1.67\" },\n MessagesMessage: { read: \"1.67\", service: \"1.67\", chat_name: \"1.67\" },\n CalendarListParams: { calendars: \"1.67\" },\n CalendarEvent: { url: \"1.67\" },\n RemindersListParams: { lists: \"1.67\" },\n Reminder: { priority: \"1.67\", completed_at_ms: \"1.67\" },\n PhotosSearchParams: { media_type: \"1.67\" },\n Photo: { media_type: \"1.67\", duration_s: \"1.67\" },\n PhotosGetParams: { thumbnail_size: \"1.67\" },\n PhotosGetResult: { thumbnail_png_base64: \"1.67\" },\n LocationGetResult: { altitude_m: \"1.67\", vertical_accuracy_m: \"1.67\", speed_mps: \"1.67\", course_deg: \"1.67\" },\n WindowsServicesParams: { status: \"1.67\" },\n WindowsEventLogParams: { source: \"1.67\" },\n WindowsFeaturesParams: { installed_only: \"1.67\" },\n SysinfoHardwareResult: { graphics: \"1.45\" },\n DownloadRow: { error: \"1.46\" },\n CopyRestart: { reopened: \"1.60\" },\n AccountAgentsRestoreVersionResult: { new_version: \"1.68\", unchanged: \"1.68\" },\n} as const satisfies Record<string, Record<string, `${number}.${number}`>>;\n\nexport type FieldsSincePath = keyof typeof FIELDS_SINCE;\n\n/**\n * 1.0 fields that a later minor lets be null, and what a peer older than that minor is sent\n * instead (the value that meant the same thing before). Widening a field any other way is a major.\n */\nexport const NULL_SINCE = {\n \"RelayDeviceStatusEvent.since_ms\": { since: \"1.1\", olderPeersGet: 0 },\n} as const satisfies Record<string, { since: `${number}.${number}`; olderPeersGet: unknown }>;\n\n/**\n * Error reasons added after x.0, with the minor that added each. An older peer's strict enum would\n * refuse the whole error body, so `forPeer` drops a reason the peer does not know (the code, the\n * message and `retryable` still tell it what happened).\n */\nexport const REASONS_SINCE = {\n runtime_not_installed: \"1.2\",\n model_not_installed: \"1.2\",\n unsupported_media: \"1.2\",\n download_failed: \"1.2\",\n service_starting: \"1.2\",\n service_restarted: \"1.2\",\n service_failed: \"1.2\",\n browser_not_connected: \"1.28\",\n browser_ambiguous: \"1.28\",\n browser_account_mismatch: \"1.28\",\n browser_connection_off: \"1.28\",\n awaiting_confirmation: \"1.28\",\n tool_disabled_on_device: \"1.34\",\n model_not_running: \"1.76\",\n model_server_unreachable: \"1.76\",\n} as const satisfies Partial<Record<ErrorReasonName, `${number}.${number}`>>;\n\n/**\n * (1.41) Values a later minor added to an enum a peer reads inside a list, by the minor that added\n * each: sysinfo.get's permission names. An older peer's strict enum would refuse the whole answer,\n * so `forPeer` leaves out the rows it does not know (it is never sent a name it cannot read).\n */\nexport const PERMISSIONS_SINCE = {\n reminders: \"1.41\",\n speech_recognition: \"1.41\",\n messages: \"1.41\",\n mail: \"1.41\",\n wifi: \"1.41\",\n} as const satisfies Record<string, `${number}.${number}`>;\n\n/**\n * (1.80) Values a later minor added to SetupItemKind (apps.setup.list `setups[].items[].kind`), by\n * the minor that added each. An older peer's strict enum would refuse the whole answer, so `forPeer`\n * leaves out the items it does not know.\n */\nexport const SETUP_KINDS_SINCE = {\n skill: \"1.80\",\n} as const satisfies Record<string, `${number}.${number}`>;\n\nfunction setupItemsForPeer(value: unknown, version: string): unknown {\n if (value === null || typeof value !== \"object\" || Array.isArray(value)) return value;\n const body = value as { setups?: unknown };\n if (!Array.isArray(body.setups)) return value;\n const since = SETUP_KINDS_SINCE as Record<string, string>;\n const setups: unknown[] = body.setups;\n const next = setups.map((s: unknown) => {\n const items = (s as { items?: unknown } | null)?.items;\n if (!Array.isArray(items)) return s;\n const kept = items.filter((i: unknown) => {\n const kind = (i as { kind?: unknown } | null)?.kind;\n const added = typeof kind === \"string\" ? since[kind] : undefined;\n return !added || knows(version, added);\n });\n return kept.length === items.length ? s : { ...(s as Record<string, unknown>), items: kept };\n });\n return next.some((s, i) => s !== setups[i]) ? { ...body, setups: next } : value;\n}\n\nfunction permissionsForPeer(value: unknown, version: string): unknown {\n if (value === null || typeof value !== \"object\" || Array.isArray(value)) return value;\n const body = value as { permissions?: unknown };\n if (!Array.isArray(body.permissions)) return value;\n const since = PERMISSIONS_SINCE as Record<string, string>;\n const kept = body.permissions.filter((p: unknown) => {\n const name = (p as { name?: unknown } | null)?.name;\n const added = typeof name === \"string\" ? since[name] : undefined;\n return !added || knows(version, added);\n });\n return kept.length === body.permissions.length ? value : { ...body, permissions: kept };\n}\n\n/** A device status for a reader at `version`: `since_ms` null (\"never\") becomes 0 before 1.1. */\nexport function statusForPeer<T extends { since_ms: number | null }>(status: T, version: string): T {\n const rule = NULL_SINCE[\"RelayDeviceStatusEvent.since_ms\"];\n return status.since_ms === null && !knows(version, rule.since) ? { ...status, since_ms: rule.olderPeersGet } : status;\n}\n\n/**\n * A WebSocket client announces the newest minor it reads at connect time by also offering\n * `matrx.v<major>.<minor>` beside SUBPROTOCOL (servers still answer SUBPROTOCOL). Before hello is\n * possible, this is how the relay picks the right shape for its greeting.\n */\nexport function versionSubprotocol(version: string): string {\n return `matrx.v${version}`;\n}\n\n/** The version a client announced in its offered subprotocols; \"1.0\" when it did not. */\nexport function announcedVersion(offered: readonly string[]): string {\n let best = `${PROTOCOL_MAJOR}.0`;\n for (const p of offered) {\n const m = /^matrx\\.v(\\d+\\.\\d+)$/.exec(p.trim());\n if (m?.[1] && compareVersions(m[1], best) > 0 && m[1].startsWith(`${PROTOCOL_MAJOR}.`)) best = m[1];\n }\n return best;\n}\n\n/** True when a peer at `version` knows a field added in `since`. */\nexport function knows(version: string, since: string): boolean {\n return compareVersions(version, since) >= 0;\n}\n\n/** The version two peers speak: the lower minor within this major. */\nexport function negotiate(peerVersion: string): string {\n const [major = 0, minor = 0] = peerVersion.split(\".\").map(Number);\n if (major !== PROTOCOL_MAJOR) return `${PROTOCOL_MAJOR}.0`;\n return `${PROTOCOL_MAJOR}.${Math.min(minor, PROTOCOL_MINOR)}`;\n}\n\nfunction strip(value: unknown, fields: Record<string, string> | undefined, version: string): unknown {\n if (!fields || value === null || typeof value !== \"object\" || Array.isArray(value)) return value;\n let out: Record<string, unknown> | null = null;\n for (const [field, since] of Object.entries(fields)) {\n if (field in (value as object) && !knows(version, since)) {\n out ??= { ...(value as Record<string, unknown>) };\n delete out[field];\n }\n }\n return out ?? value;\n}\n\nconst RESULT_PATH = new Map<OpName, FieldsSincePath>([\n [\"fs.patch\", \"FsPatchResult\"],\n [\"apps.chats.list\", \"AppsChatsListResult\"],\n [\"apps.accounts.usage\", \"AppsAccountsUsageResult\"],\n [\"apps.accounts.resets\", \"AppsAccountsResetsResult\"],\n [\"apps.windows.update_state\", \"AppsWindowsUpdateStateResult\"],\n [\"web.fetch_with_browser\", \"WebBrowserFetchResult\"],\n [\"sysinfo.get\", \"SysinfoGetResult\"],\n [\"sysinfo.hardware\", \"SysinfoHardwareResult\"],\n [\"apps.projects.to_window\", \"AppsProjectsToWindowResult\"],\n // 1.67: Matrx Local's local_mac_apps result fields.\n [\"photos.get\", \"PhotosGetResult\"],\n [\"location.get\", \"LocationGetResult\"],\n [\"account.agents.restore_version\", \"AccountAgentsRestoreVersionResult\"],\n]);\n\n/** 1.13: results that carry a named schema with versioned fields under a key (one object or an array of them). */\nconst NESTED_RESULTS: ReadonlyMap<OpName, ReadonlyArray<readonly [string, FieldsSincePath]>> = new Map<OpName, ReadonlyArray<readonly [string, FieldsSincePath]>>([\n [\"apps.chats.list\", [[\"chats\", \"ChatRow\"]]],\n [\"apps.projects.file\", [[\"chat\", \"ChatRow\"]]],\n [\"apps.projects.file_many\", [[\"chats\", \"ChatRow\"]]],\n [\"apps.projects.unfile\", [[\"chat\", \"ChatRow\"]]],\n [\"apps.projects.move\", [[\"chat\", \"ChatRow\"]]],\n [\"apps.chats.star\", [[\"chat\", \"ChatRow\"]]],\n // 1.78: our Hide on the cold and spend rows.\n [\"apps.chats.cold\", [[\"waiting\", \"ColdChat\"], [\"recently_cold\", \"ColdChat\"]]],\n [\"apps.spend\", [[\"chats\", \"SpendChat\"], [\"live\", \"SpendLive\"], [\"idle\", \"SpendIdle\"]]],\n [\"apps.chats.place\", [[\"chat\", \"ChatRow\"]]],\n [\"apps.accounts.usage\", [[\"accounts\", \"AccountUsage\"]]],\n // 1.73/1.79: the account rows' newer fields (profile, read_source, session_cost_usd, readings).\n [\"apps.accounts.list\", [[\"accounts\", \"AppAccount\"]]],\n [\"resources.snapshot\", [[\"disks\", \"ResourcesDisk\"]]],\n [\"stack.state\", [[\"servers\", \"StackServer\"]]],\n [\"account.agents.list\", [[\"agents\", \"AccountAgent\"]]],\n [\"web.scrape\", [[\"pages\", \"WebScrapePage\"]]],\n [\"sysinfo.get\", [[\"permissions\", \"SysinfoGetResult.permissions[]\"]]],\n [\"models.downloads.list\", [[\"downloads\", \"DownloadRow\"]]],\n [\"apps.projects.to_window\", [[\"group\", \"ProjectMoveGroup\"]]],\n // 1.60: each closed window's reopen outcome in a restart_verify copy.\n [\"apps.chats.copy_to_account\", [[\"restart\", \"CopyRestart\"]]],\n [\"apps.windows.list\", [[\"windows\", \"AppWindowInfo\"]]],\n // 1.63: what an instance record still lacks.\n [\"apps.instances.list\", [[\"instances\", \"AppInstance\"]]],\n [\"apps.windows.set_remote_control\", [[\"remote_control\", \"WindowRemoteControl\"]]],\n // 1.67: Matrx Local's local_mac_apps result fields.\n [\"mail.accounts\", [[\"accounts\", \"MailAccount\"]]],\n [\"messages.chats\", [[\"chats\", \"MessagesChat\"]]],\n [\"messages.list\", [[\"messages\", \"MessagesMessage\"]]],\n [\"calendar.list\", [[\"events\", \"CalendarEvent\"]]],\n [\"reminders.list\", [[\"reminders\", \"Reminder\"]]],\n [\"photos.search\", [[\"photos\", \"Photo\"]]],\n [\"photos.get\", [[\"photo\", \"Photo\"]]],\n [\"coding.providers\", [[\"providers\", \"CodingProviderStatus\"]]],\n // 1.57: the account a coding record belongs to.\n [\"coding.sessions.list\", [[\"sessions\", \"CodingSessionRecord\"], [\"recent\", \"CodingRecentRow\"]]],\n [\"coding.recent.seen\", [[\"recent\", \"CodingRecentRow\"]]],\n [\"coding.discover\", [[\"chats\", \"CodingDiscoveredChat\"]]],\n [\"coding.search\", [[\"hits\", \"CodingSearchHit\"]]],\n [\"coding.start\", [[\"session\", \"CodingSessionRecord\"]]],\n [\"coding.send\", [[\"session\", \"CodingSessionRecord\"]]],\n [\"coding.takeover\", [[\"session\", \"CodingSessionRecord\"]]],\n [\"coding.options.set\", [[\"session\", \"CodingSessionRecord\"]]],\n [\"coding.agent.set\", [[\"session\", \"CodingSessionRecord\"]]],\n [\"coding.account.continue\", [[\"session\", \"CodingSessionRecord\"]]],\n]);\n\nfunction stripNested(value: unknown, nested: ReadonlyArray<readonly [string, FieldsSincePath]>, version: string): unknown {\n if (value === null || typeof value !== \"object\" || Array.isArray(value)) return value;\n let body = value as Record<string, unknown>;\n for (const [key, path] of nested) {\n const inner = body[key];\n if (inner === undefined || inner === null) continue;\n const fields = FIELDS_SINCE[path];\n if (Array.isArray(inner)) {\n const next = inner.map((x: unknown) => strip(x, fields, version));\n if (next.some((x, i) => x !== inner[i])) body = { ...body, [key]: next };\n } else {\n const next = strip(inner, fields, version);\n if (next !== inner) body = { ...body, [key]: next };\n }\n }\n return body;\n}\n\n/**\n * (1.52) apps.windows.list for a peer older than 1.52: each window's `remote_control` loses `problem`,\n * and a window whose settings file is damaged (\"unreadable\", a value its strict enum does not know)\n * has no `remote_control` at all (not known) instead of failing the whole list.\n */\nfunction windowListRemoteControlForPeer(value: unknown, version: string): unknown {\n if (knows(version, \"1.52\") || value === null || typeof value !== \"object\") return value;\n const body = value as { windows?: unknown };\n if (!Array.isArray(body.windows)) return value;\n const windows: unknown[] = body.windows;\n const next = windows.map((w: unknown) => {\n const rc = (w as { remote_control?: unknown } | null)?.remote_control;\n if (rc === null || typeof rc !== \"object\") return w;\n if ((rc as { setting?: unknown }).setting === \"unreadable\") {\n const { remote_control: _dropped, ...rest } = w as Record<string, unknown>;\n return rest;\n }\n const kept = strip(rc, FIELDS_SINCE.WindowRemoteControl, version);\n return kept === rc ? w : { ...(w as Record<string, unknown>), remote_control: kept };\n });\n return next.some((w, i) => w !== windows[i]) ? { ...body, windows: next } : value;\n}\n\n/**\n * coding.providers, one level below the providers:\n * (1.54) for a peer older than 1.54, a default model whose source is \"account\" (a value its strict\n * enum does not know) is sent as \"driver\" (the app picked it, not the person's settings\n * file), instead of failing the whole answer;\n * (1.57) each of a provider's `accounts` loses the fields newer than the peer (its health, usage\n * and \"Continue on\").\n */\nfunction providersForPeer(value: unknown, version: string): unknown {\n if (knows(version, \"1.57\") || value === null || typeof value !== \"object\") return value;\n const body = value as { providers?: unknown };\n if (!Array.isArray(body.providers)) return value;\n const providers: unknown[] = body.providers;\n const next = providers.map((p: unknown) => {\n if (p === null || typeof p !== \"object\") return p;\n let out = p as Record<string, unknown>;\n const dm = out.defaultModel;\n if (!knows(version, \"1.54\") && dm !== null && typeof dm === \"object\" && (dm as { source?: unknown }).source === \"account\") {\n out = { ...out, defaultModel: { ...(dm as Record<string, unknown>), source: \"driver\" } };\n }\n const accounts = out.accounts;\n if (Array.isArray(accounts)) {\n const kept = accounts.map((a: unknown) => strip(a, FIELDS_SINCE.CodingProviderAccount, version));\n if (kept.some((a, i) => a !== accounts[i])) out = { ...out, accounts: kept };\n }\n return out;\n });\n return next.some((p, i) => p !== providers[i]) ? { ...body, providers: next } : value;\n}\n\n/**\n * (1.65) coding.history / coding.transcript.read for a peer older than 1.65: a `continued` item (a\n * kind its strict union does not know, which would refuse the whole transcript) is sent as the\n * info `notice` it was before (\"Continued from Alpha\").\n */\nfunction transcriptItemsForPeer(value: unknown, version: string): unknown {\n if (knows(version, \"1.65\") || value === null || typeof value !== \"object\") return value;\n const body = value as { items?: unknown };\n if (!Array.isArray(body.items)) return value;\n const items: unknown[] = body.items;\n const next = items.map((item: unknown) => {\n const it = item as { kind?: unknown; id?: unknown; text?: unknown } | null;\n if (it?.kind !== \"continued\") return item;\n return { kind: \"notice\", id: it.id, level: \"info\", text: it.text };\n });\n return next.some((it, i) => it !== items[i]) ? { ...body, items: next } : value;\n}\n\n/** Results that carry WindowInfo (window.list's `windows`, focus/move's `window`). */\nconst WINDOW_RESULTS: ReadonlyMap<OpName, \"windows\" | \"window\"> = new Map([\n [\"window.list\", \"windows\"],\n [\"window.focus\", \"window\"],\n [\"window.move\", \"window\"],\n]);\n\nfunction stripWindows(value: unknown, key: \"windows\" | \"window\", version: string): unknown {\n if (value === null || typeof value !== \"object\") return value;\n const body = value as Record<string, unknown>;\n const inner = body[key];\n if (inner === undefined) return value;\n const fields = FIELDS_SINCE.WindowInfo;\n if (Array.isArray(inner)) {\n const next = inner.map((w: unknown) => strip(w, fields, version));\n return next.some((w, i) => w !== inner[i]) ? { ...body, [key]: next } : value;\n }\n const next = strip(inner, fields, version);\n return next === inner ? value : { ...body, [key]: next };\n}\n\n/**\n * What to send a peer that negotiated `version`: `result` of `op`, or an error body, with every\n * field newer than that version removed (rule 2). Unchanged for a current peer.\n */\nexport function forPeer(op: OpName, part: \"result\", value: unknown, version: string): unknown;\nexport function forPeer(op: OpName | null, part: \"error\", value: unknown, version: string): unknown;\nexport function forPeer(op: OpName | null, part: \"result\" | \"error\", value: unknown, version: string): unknown {\n if (part === \"result\") {\n const windowKey = op ? WINDOW_RESULTS.get(op) : undefined;\n if (windowKey) return stripWindows(value, windowKey, version);\n const path = op ? RESULT_PATH.get(op) : undefined;\n const known = op === \"sysinfo.get\" ? permissionsForPeer(value, version) : value;\n const top = path ? strip(known, FIELDS_SINCE[path], version) : known;\n const nested = op ? NESTED_RESULTS.get(op) : undefined;\n const stripped = nested ? stripNested(top, nested, version) : top;\n if (op === \"coding.providers\") return providersForPeer(stripped, version);\n if (op === \"coding.history\" || op === \"coding.transcript.read\") return transcriptItemsForPeer(stripped, version);\n if (op === \"apps.setup.list\") return setupItemsForPeer(stripped, version);\n return op === \"apps.windows.list\" ? windowListRemoteControlForPeer(stripped, version) : stripped;\n }\n if (value === null || typeof value !== \"object\") return value;\n const body = value as { data?: unknown };\n if (body.data === undefined) return value;\n let data = strip(body.data, FIELDS_SINCE[\"ProtocolErrorBody.data\"], version);\n const reason = (data as { reason?: unknown }).reason;\n const reasonSince = typeof reason === \"string\" ? (REASONS_SINCE as Record<string, string>)[reason] : undefined;\n if (reasonSince && !knows(version, reasonSince)) {\n const { reason: _dropped, ...rest } = data as Record<string, unknown>;\n data = rest;\n }\n return data === body.data ? value : { ...body, data };\n}\n\n/** Every op whose result has a versioned field is wired into forPeer (checked by the test). */\nexport const VERSIONED_RESULT_OPS: readonly OpName[] = [...new Set([...RESULT_PATH.keys(), ...WINDOW_RESULTS.keys(), ...NESTED_RESULTS.keys()])];\n","/**\n * What a connecting side does after each WebSocket close — the ONE table every client reads (the\n * package client, the desktop's relay transport, any other dialer). Never keep a local list of\n * \"terminal\" codes: a code added to CloseCode without a rule here fails to compile.\n *\n * reconnect_now the far side went away on purpose or the socket died; dial again at once if the\n * connection had opened, with backoff otherwise (a dead network never spins).\n * reconnect transient refusal; dial again with backoff.\n * reauth the token was refused; get a FRESH token and dial once more. A second refusal in\n * a row (no successful open between) is terminal with outcome \"signed_out\".\n * stop retrying cannot help: stop dialing until something changes (a new sign-in, a\n * new device, an update) and show the outcome.\n */\nimport type { ErrorCodeName } from \"./types\";\nimport { CloseCode, type CloseCodeValue } from \"./schema/envelope\";\n\nexport type CloseAction = \"reconnect_now\" | \"reconnect\" | \"reauth\" | \"stop\";\n\n/** The one state a person is shown when dialing stops. */\nexport type CloseOutcome = \"signed_out\" | \"not_owned\" | \"removed\" | \"revoked\" | \"replaced\" | \"upgrade_required\";\n\nexport interface CloseRule {\n readonly action: CloseAction;\n /** Set for `stop` and `reauth` (the outcome when the fresh token is refused too). */\n readonly outcome?: CloseOutcome;\n /** The error a caller's pending work is failed with. */\n readonly error: readonly [ErrorCodeName, string];\n}\n\nexport const CLOSE_RULES = {\n [CloseCode.NORMAL]: { action: \"reconnect\", error: [\"DEVICE_OFFLINE\", \"Connection closed\"] },\n [CloseCode.GOING_AWAY]: { action: \"reconnect_now\", error: [\"DEVICE_OFFLINE\", \"Connection lost\"] },\n [CloseCode.ABNORMAL]: { action: \"reconnect_now\", error: [\"DEVICE_OFFLINE\", \"Connection lost\"] },\n [CloseCode.DEVICE_RECONNECTED]: { action: \"reconnect_now\", error: [\"DEVICE_OFFLINE\", \"Device reconnected\"] },\n [CloseCode.TRY_AGAIN_LATER]: { action: \"reconnect\", error: [\"DEVICE_OFFLINE\", \"Relay busy; retrying\"] },\n [CloseCode.AUTH_INVALID]: { action: \"reauth\", outcome: \"signed_out\", error: [\"AUTH_INVALID\", \"Sign-in was not accepted\"] },\n [CloseCode.AUTH_FORBIDDEN]: { action: \"stop\", outcome: \"not_owned\", error: [\"AUTH_FORBIDDEN\", \"Not this device's owner\"] },\n [CloseCode.DEVICE_NOT_FOUND]: { action: \"stop\", outcome: \"removed\", error: [\"NOT_FOUND\", \"Device not found\"] },\n [CloseCode.AUTH_EXPIRED]: { action: \"reauth\", outcome: \"signed_out\", error: [\"AUTH_EXPIRED\", \"Sign-in expired\"] },\n [CloseCode.REPLACED]: { action: \"stop\", outcome: \"replaced\", error: [\"CONFLICT\", \"Replaced by a newer connection\"] },\n [CloseCode.DEVICE_REVOKED]: { action: \"stop\", outcome: \"revoked\", error: [\"AUTH_DEVICE_REVOKED\", \"This device was revoked\"] },\n // A malformed message, or a connection the relay lost track of: a fresh socket starts clean.\n [CloseCode.PROTOCOL_ERROR]: { action: \"reconnect\", error: [\"PROTOCOL_ERROR\", \"Connection reset by the relay\"] },\n [CloseCode.UPGRADE_REQUIRED]: { action: \"stop\", outcome: \"upgrade_required\", error: [\"PROTOCOL_VERSION_UNSUPPORTED\", \"Protocol upgrade required\"] },\n} as const satisfies Record<CloseCodeValue, CloseRule>;\n\nconst UNKNOWN: CloseRule = { action: \"reconnect\", error: [\"DEVICE_OFFLINE\", \"Connection lost\"] };\n\n/** The rule for any close code; one this table does not know (or null: no close frame) reconnects with backoff. */\nexport function closeRule(code: number | null | undefined): CloseRule {\n if (code === null || code === undefined) return CLOSE_RULES[CloseCode.ABNORMAL];\n return (CLOSE_RULES as Record<number, CloseRule>)[code] ?? UNKNOWN;\n}\n\n/** True when dialing must stop after this close (no retry will help). */\nexport function isTerminalClose(code: number | null | undefined): boolean {\n return closeRule(code).action === \"stop\";\n}\n"],"mappings":"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","names":["next"]}
@@ -33,7 +33,7 @@ import {
33
33
  epochMs,
34
34
  nonNegInt,
35
35
  u32
36
- } from "./chunk-server-QLS73E3X.js";
36
+ } from "./chunk-server-VYJA3PFP.js";
37
37
 
38
38
  // src/schema/sysinfo.ts
39
39
  import { z } from "zod";
@@ -473,13 +473,79 @@ var ModelsTranscribeResult = z5.strictObject({
473
473
  segments: z5.array(TranscriptSegment).max(2e4),
474
474
  elapsed_ms: nonNegInt
475
475
  });
476
+ var TtsVoiceId = z5.string().min(1).max(64).regex(/^[a-z0-9][a-z0-9_]*$/);
477
+ var TtsVoice = z5.strictObject({
478
+ id: TtsVoiceId,
479
+ name: z5.string().min(1).max(80),
480
+ /** Null for a saved voice (a blend has no single gender). */
481
+ gender: z5.enum(["female", "male"]).nullable(),
482
+ /** The language's name (`American English`). */
483
+ language: z5.string().min(1).max(64),
484
+ /** Kokoro's language code (`a`, `b`, `j`, `z`, `e`, `f`, `h`, `i`, `p`). */
485
+ lang_code: z5.string().min(1).max(4),
486
+ /** The published quality grade (`A`, `B-`, `C+`); null for a saved voice. */
487
+ grade: z5.string().max(4).nullable(),
488
+ traits: z5.array(z5.string().min(1).max(32)).max(8),
489
+ custom: z5.boolean()
490
+ });
491
+ var TtsModelInfo = z5.strictObject({ id: ModelKey, size_bytes: nonNegInt, installed: z5.boolean() });
492
+ var ModelsTtsStatusParams = z5.strictObject({});
493
+ var ModelsTtsStatusResult = z5.strictObject({
494
+ /** Null when the catalog offers no speech model this computer can run. */
495
+ model: TtsModelInfo.nullable(),
496
+ runtime: MlRuntimeState,
497
+ /** Every voice: builtin first (in catalog order), then saved ones. Unbounded in practice; capped for the wire. */
498
+ voices: z5.array(TtsVoice).max(1e3),
499
+ default_voice: TtsVoiceId,
500
+ /** Hertz of every chunk this engine produces (24 000 for Kokoro v1.0). */
501
+ sample_rate: z5.int().min(8e3).max(192e3),
502
+ speed_min: z5.number().min(0),
503
+ speed_max: z5.number().min(0),
504
+ /** The last install or load failure, one human line. */
505
+ error: z5.string().max(300).nullable()
506
+ });
507
+ var ModelsTtsInstallParams = z5.strictObject({});
508
+ var ModelsTtsInstallResult = z5.strictObject({ model: ModelKey, elapsed_ms: nonNegInt });
509
+ var TtsBlendPart = z5.strictObject({ voice: TtsVoiceId, weight: z5.number().min(0).max(1) });
510
+ var ModelsTtsSpeakParams = z5.strictObject({
511
+ text: z5.string().min(1).max(1e5),
512
+ voice: TtsVoiceId.optional(),
513
+ blend: z5.array(TtsBlendPart).min(2).max(5).optional(),
514
+ speed: z5.number().min(0.5).max(2).default(1),
515
+ /** Text longer than this many characters is split at sentences into chunks (Matrx Local's ttsStreamingThreshold). */
516
+ chunk_chars: z5.int().min(40).max(5e3).optional()
517
+ });
518
+ var ModelsTtsSpeakResult = z5.strictObject({
519
+ chunks: nonNegInt,
520
+ duration_s: z5.number().min(0),
521
+ sample_rate: z5.int().min(8e3).max(192e3),
522
+ voice: z5.string().min(1).max(200),
523
+ elapsed_ms: nonNegInt
524
+ });
525
+ var TtsAudioChunk = z5.strictObject({
526
+ index: nonNegInt,
527
+ sample_rate: z5.int().min(8e3).max(192e3),
528
+ pcm16_base64: z5.string().max(8e6),
529
+ /** The text this chunk speaks. */
530
+ text: z5.string().max(5e3)
531
+ });
532
+ var ModelsTtsVoiceSaveParams = z5.strictObject({
533
+ name: z5.string().min(1).max(80),
534
+ blend: z5.array(TtsBlendPart).min(2).max(5).optional(),
535
+ path: AbsPath.optional()
536
+ });
537
+ var ModelsTtsVoiceSaveResult = z5.strictObject({ voice: TtsVoice });
538
+ var ModelsTtsVoiceRemoveParams = z5.strictObject({ voice: TtsVoiceId });
539
+ var ModelsTtsVoiceRemoveResult = z5.strictObject({ removed: z5.boolean() });
476
540
  var MlProgress = z5.strictObject({
477
- kind: z5.enum(["install", "transcribe"]),
541
+ kind: z5.enum(["install", "transcribe", "speak"]),
478
542
  /** 0–1 when known (transcribe: audio covered so far; install: bytes so far). */
479
543
  fraction: z5.number().min(0).max(1).nullable(),
480
544
  install: MlInstallProgress.nullable(),
481
545
  /** The segment just transcribed (transcribe only): text appears as it is recognized. */
482
- segment: TranscriptSegment.nullable()
546
+ segment: TranscriptSegment.nullable(),
547
+ /** (1.81) The chunk just synthesized (speak only). */
548
+ audio: TtsAudioChunk.optional()
483
549
  });
484
550
  var TextModelId = ModelKey;
485
551
  var TextModelInfo = z5.strictObject({
@@ -604,7 +670,9 @@ var MlCatalogSetParams = z5.strictObject({
604
670
  /** When the catalog was last changed (catalog_updated_at), for the service's log. */
605
671
  catalog_updated_at: z5.string().max(40),
606
672
  /** (1.69) Language models on this computer that cannot run here, each with its one-line reason: models.llm.status lists them. */
607
- unusable: z5.array(UnusableTextModel).optional()
673
+ unusable: z5.array(UnusableTextModel).optional(),
674
+ /** (1.81) Text-to-speech models (Kokoro): what models.tts.* runs. */
675
+ speech: z5.array(CatalogModelEntry).optional()
608
676
  });
609
677
  var MlCatalogSetResult = z5.strictObject({ text: nonNegInt, transcription: nonNegInt });
610
678
  var DownloadKind = z5.enum(["speech_model", "text_model", "runtime"]);
@@ -4568,6 +4636,11 @@ var OPS = {
4568
4636
  "models.downloads.cancel": { params: ModelsDownloadsCancelParams, result: ModelsDownloadsCancelResult, kind: "unary", since: "1.45", errors: ["NOT_FOUND", "INTERNAL"] },
4569
4637
  "models.local.list": { params: ModelsLocalListParams, result: ModelsLocalListResult, kind: "unary", since: "1.74", errors: ["INTERNAL"] },
4570
4638
  "models.local.remove": { params: ModelsLocalRemoveParams, result: ModelsLocalRemoveResult, kind: "unary", since: "1.74", errors: ["NOT_FOUND", "INVALID_PARAMS", "RESOURCE_BUSY", "INTERNAL"] },
4639
+ "models.tts.status": { params: ModelsTtsStatusParams, result: ModelsTtsStatusResult, kind: "unary", since: "1.81", errors: ["RESOURCE_BUSY", "INTERNAL"] },
4640
+ "models.tts.install": { params: ModelsTtsInstallParams, result: ModelsTtsInstallResult, kind: "unary", since: "1.81", errors: ["NOT_FOUND", "RESOURCE_BUSY", "RESOURCE_GONE", "TIMEOUT", "CANCELLED", "INTERNAL"] },
4641
+ "models.tts.speak": { params: ModelsTtsSpeakParams, result: ModelsTtsSpeakResult, kind: "unary", since: "1.81", errors: ["NOT_FOUND", "INVALID_PARAMS", "RESOURCE_BUSY", "RESOURCE_GONE", "TIMEOUT", "CANCELLED", "INTERNAL"] },
4642
+ "models.tts.voice_save": { params: ModelsTtsVoiceSaveParams, result: ModelsTtsVoiceSaveResult, kind: "unary", since: "1.81", errors: ["NOT_FOUND", "INVALID_PARAMS", "PAYLOAD_TOO_LARGE", "CONFLICT", "RESOURCE_BUSY", "INTERNAL"] },
4643
+ "models.tts.voice_remove": { params: ModelsTtsVoiceRemoveParams, result: ModelsTtsVoiceRemoveResult, kind: "unary", since: "1.81", errors: ["NOT_FOUND", "INVALID_PARAMS", "INTERNAL"] },
4571
4644
  // Desktop apps and their profiles (SPEC §6 apps); profiles are rows in users.desktop_app_profile.
4572
4645
  "apps.list": { params: AppsListParams, result: AppsListResult, kind: "unary", since: "1.2", errors: ["INTERNAL"] },
4573
4646
  "apps.profiles.list": { params: AppsProfilesListParams, result: AppsProfilesListResult, kind: "unary", since: "1.2", errors: ["NOT_FOUND", "INVALID_PARAMS", "INTERNAL"] },
@@ -4850,6 +4923,11 @@ var SERVICES = {
4850
4923
  "ml.download_cancel": { params: ModelsDownloadsCancelParams, result: ModelsDownloadsCancelResult },
4851
4924
  "ml.local_list": { params: ModelsLocalListParams, result: ModelsLocalListResult },
4852
4925
  "ml.local_remove": { params: ModelsLocalRemoveParams, result: ModelsLocalRemoveResult },
4926
+ "ml.tts_status": { params: ModelsTtsStatusParams, result: ModelsTtsStatusResult },
4927
+ "ml.tts_install": { params: ModelsTtsInstallParams, result: ModelsTtsInstallResult },
4928
+ "ml.tts_speak": { params: ModelsTtsSpeakParams, result: ModelsTtsSpeakResult },
4929
+ "ml.tts_voice_save": { params: ModelsTtsVoiceSaveParams, result: ModelsTtsVoiceSaveResult },
4930
+ "ml.tts_voice_remove": { params: ModelsTtsVoiceRemoveParams, result: ModelsTtsVoiceRemoveResult },
4853
4931
  "ml.catalog_set": { params: MlCatalogSetParams, result: MlCatalogSetResult }
4854
4932
  }
4855
4933
  },
@@ -5057,6 +5135,21 @@ var NAMED_SCHEMAS = {
5057
5135
  ModelsLocalListResult,
5058
5136
  ModelsLocalRemoveParams,
5059
5137
  ModelsLocalRemoveResult,
5138
+ TtsVoiceId,
5139
+ TtsVoice,
5140
+ TtsModelInfo,
5141
+ ModelsTtsStatusParams,
5142
+ ModelsTtsStatusResult,
5143
+ ModelsTtsInstallParams,
5144
+ ModelsTtsInstallResult,
5145
+ TtsBlendPart,
5146
+ ModelsTtsSpeakParams,
5147
+ ModelsTtsSpeakResult,
5148
+ TtsAudioChunk,
5149
+ ModelsTtsVoiceSaveParams,
5150
+ ModelsTtsVoiceSaveResult,
5151
+ ModelsTtsVoiceRemoveParams,
5152
+ ModelsTtsVoiceRemoveResult,
5060
5153
  CodingServiceCredentials,
5061
5154
  CodingHistoryBlocked,
5062
5155
  CodingHistoryFailure,
@@ -5813,6 +5906,21 @@ export {
5813
5906
  ModelsInstallResult,
5814
5907
  ModelsTranscribeParams,
5815
5908
  ModelsTranscribeResult,
5909
+ TtsVoiceId,
5910
+ TtsVoice,
5911
+ TtsModelInfo,
5912
+ ModelsTtsStatusParams,
5913
+ ModelsTtsStatusResult,
5914
+ ModelsTtsInstallParams,
5915
+ ModelsTtsInstallResult,
5916
+ TtsBlendPart,
5917
+ ModelsTtsSpeakParams,
5918
+ ModelsTtsSpeakResult,
5919
+ TtsAudioChunk,
5920
+ ModelsTtsVoiceSaveParams,
5921
+ ModelsTtsVoiceSaveResult,
5922
+ ModelsTtsVoiceRemoveParams,
5923
+ ModelsTtsVoiceRemoveResult,
5816
5924
  MlProgress,
5817
5925
  TextModelId,
5818
5926
  TextModelInfo,
@@ -6545,4 +6653,4 @@ export {
6545
6653
  SERVICES,
6546
6654
  NAMED_SCHEMAS
6547
6655
  };
6548
- //# sourceMappingURL=chunk-server-NFPTVX44.js.map
6656
+ //# sourceMappingURL=chunk-server-FSNIDZGR.js.map