@ai-matrx/desktop-protocol 0.21.93 → 0.21.95

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,37 @@
1
1
  # Changelog
2
2
 
3
- ## 0.21.93
3
+ ## 0.21.95
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.94
9
+
10
+ SOURCE CHANGED WITH NO RELEASE NOTE. This release shipped source changes that nobody described in an Unreleased entry,
11
+ so they may include breaking API changes. Consumer action is UNKNOWN: read the diff before upgrading.
12
+ Diff: `git diff 3aed0e63df d614c3a93c -- apps/shared/desktop-protocol/src`
13
+
14
+ Changed shipped source files (6):
15
+ - `apps/shared/desktop-protocol/src/contract.ts`
16
+ - `apps/shared/desktop-protocol/src/schema/errors.ts`
17
+ - `apps/shared/desktop-protocol/src/schema/models.ts`
18
+ - `apps/shared/desktop-protocol/src/schema/primitives.ts`
19
+ - `apps/shared/desktop-protocol/src/schema/registry.ts`
20
+ - `apps/shared/desktop-protocol/src/versioning.ts`
21
+
22
+ ## 0.21.93
23
+
24
+ SOURCE CHANGED WITH NO RELEASE NOTE. This release shipped source changes that nobody described in an Unreleased entry,
25
+ so they may include breaking API changes. Consumer action is UNKNOWN: read the diff before upgrading.
26
+ Diff: `git diff 39a89b390f 3aed0e63df -- apps/shared/desktop-protocol/src`
27
+
28
+ Changed shipped source files (5):
29
+ - `apps/shared/desktop-protocol/src/contract.ts`
30
+ - `apps/shared/desktop-protocol/src/index.ts`
31
+ - `apps/shared/desktop-protocol/src/schema/fs-semantic.ts`
32
+ - `apps/shared/desktop-protocol/src/schema/primitives.ts`
33
+ - `apps/shared/desktop-protocol/src/schema/registry.ts`
34
+
8
35
  ## 0.21.92
9
36
 
10
37
  SOURCE CHANGED WITH NO RELEASE NOTE. This release shipped source changes that nobody described in an Unreleased entry,
@@ -2,16 +2,18 @@ import {
2
2
  CloseCode,
3
3
  PROTOCOL_MAJOR,
4
4
  PROTOCOL_MINOR
5
- } from "./chunk-server-HBZSBBGI.js";
5
+ } from "./chunk-server-IHK7SYRO.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", speech: "1.81" },
12
+ MlCatalogSetParams: { unusable: "1.69", speech: "1.81", embedding: "1.88", wake: "1.89" },
13
+ ModelsLlmStatusResult: { embedding: "1.88" },
14
+ ModelsLlmStopParams: { slot: "1.88" },
13
15
  MlProgress: { audio: "1.81" },
14
- ModelsLlmStartParams: { gpu_layers: "1.48", threads: "1.48", load_timeout_s: "1.48" },
16
+ ModelsLlmStartParams: { gpu_layers: "1.48", threads: "1.48", load_timeout_s: "1.48", slot: "1.88" },
15
17
  FsPatchResult: { edits_applied: "1.1", edits_failed: "1.1" },
16
18
  "ProtocolErrorBody.data": { edits_failed: "1.1" },
17
19
  "RelayCallResponse|0": { protocol_version: "1.1" },
@@ -195,7 +197,9 @@ var RESULT_PATH = /* @__PURE__ */ new Map([
195
197
  // 1.67: Matrx Local's local_mac_apps result fields.
196
198
  ["photos.get", "PhotosGetResult"],
197
199
  ["location.get", "LocationGetResult"],
198
- ["account.agents.restore_version", "AccountAgentsRestoreVersionResult"]
200
+ ["account.agents.restore_version", "AccountAgentsRestoreVersionResult"],
201
+ // 1.88: the embeddings slot beside the chat model.
202
+ ["models.llm.status", "ModelsLlmStatusResult"]
199
203
  ]);
200
204
  var NESTED_RESULTS = /* @__PURE__ */ new Map([
201
205
  ["apps.chats.list", [["chats", "ChatRow"]]],
@@ -401,4 +405,4 @@ export {
401
405
  closeRule,
402
406
  isTerminalClose
403
407
  };
404
- //# sourceMappingURL=chunk-server-MCBYY6QK.js.map
408
+ //# sourceMappingURL=chunk-server-46JNNDT7.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\", embedding: \"1.88\", wake: \"1.89\" },\n ModelsLlmStatusResult: { embedding: \"1.88\" },\n ModelsLlmStopParams: { slot: \"1.88\" },\n MlProgress: { audio: \"1.81\" },\n ModelsLlmStartParams: { gpu_layers: \"1.48\", threads: \"1.48\", load_timeout_s: \"1.48\", slot: \"1.88\" },\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 // 1.88: the embeddings slot beside the chat model.\n [\"models.llm.status\", \"ModelsLlmStatusResult\"],\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-HBZSBBGI.js";
36
+ } from "./chunk-server-IHK7SYRO.js";
37
37
 
38
38
  // src/schema/fs-semantic.ts
39
39
  import { z } from "zod";
@@ -591,6 +591,51 @@ var ModelsTtsVoiceSaveParams = z6.strictObject({
591
591
  var ModelsTtsVoiceSaveResult = z6.strictObject({ voice: TtsVoice });
592
592
  var ModelsTtsVoiceRemoveParams = z6.strictObject({ voice: TtsVoiceId });
593
593
  var ModelsTtsVoiceRemoveResult = z6.strictObject({ removed: z6.boolean() });
594
+ var WakeEngine = z6.enum(["oww", "whisper"]);
595
+ var WakeModelInfo = z6.strictObject({
596
+ id: ModelKey,
597
+ size_bytes: nonNegInt,
598
+ installed: z6.boolean(),
599
+ problem: z6.string().max(300).nullable()
600
+ });
601
+ var ModelsWakeStatusParams = z6.strictObject({});
602
+ var ModelsWakeStatusResult = z6.strictObject({
603
+ /** The first-use runtime (onnxruntime, faster-whisper) is installed. */
604
+ runtime_ready: z6.boolean(),
605
+ /** openWakeWord models this computer can fetch (the catalog's wake words). */
606
+ models: z6.array(WakeModelInfo),
607
+ /** The Whisper model the phrase engine uses (the catalog's smallest); null when the catalog has none. */
608
+ whisper: WakeModelInfo.nullable(),
609
+ error: z6.string().max(500).nullable()
610
+ });
611
+ var ModelsWakeInstallParams = z6.strictObject({ engine: WakeEngine, model: ModelKey.optional() });
612
+ var ModelsWakeInstallResult = z6.strictObject({ model: ModelKey, elapsed_ms: nonNegInt });
613
+ var WAKE_PCM_MAX_CHARS = 44e4;
614
+ var ModelsWakeDetectParams = z6.strictObject({
615
+ /** The caller's listening session: the engine keeps its rolling audio per stream. */
616
+ stream: z6.string().min(1).max(64),
617
+ engine: WakeEngine,
618
+ /** (oww) The wake-word model; (whisper) unused. */
619
+ model: ModelKey.optional(),
620
+ /** (whisper) The phrase to hear, e.g. "hey matrix". */
621
+ keyword: z6.string().min(1).max(64).optional(),
622
+ /** (oww) The score that counts as heard, 0–1. */
623
+ threshold: z6.number().min(0).max(1).optional(),
624
+ /** Base64 of 16 kHz mono signed 16-bit little-endian PCM that follows the stream's last call. */
625
+ pcm: z6.string().max(WAKE_PCM_MAX_CHARS)
626
+ });
627
+ var ModelsWakeDetectResult = z6.strictObject({
628
+ detected: z6.boolean(),
629
+ /** (oww) The highest score in this audio; null for whisper. */
630
+ score: z6.number().min(0).max(1).nullable(),
631
+ /** (whisper) What the window said, when it ran; null otherwise. */
632
+ heard: z6.string().max(500).nullable(),
633
+ /** The audio's level, 0–1. */
634
+ rms: z6.number().min(0).max(1),
635
+ elapsed_ms: nonNegInt
636
+ });
637
+ var ModelsWakeCloseParams = z6.strictObject({ stream: z6.string().min(1).max(64) });
638
+ var ModelsWakeCloseResult = z6.strictObject({ closed: z6.boolean() });
594
639
  var MlProgress = z6.strictObject({
595
640
  kind: z6.enum(["install", "transcribe", "speak"]),
596
641
  /** 0–1 when known (transcribe: audio covered so far; install: bytes so far). */
@@ -631,6 +676,14 @@ var LlmRunning = z6.strictObject({
631
676
  gpu_layers: z6.int().min(-1).max(999).optional(),
632
677
  threads: z6.int().min(1).max(512).optional()
633
678
  });
679
+ var LlmSlot = z6.enum(["chat", "embed"]);
680
+ var LlmEmbeddingSlot = z6.strictObject({
681
+ state: LlmServerState,
682
+ models: z6.array(TextModelInfo),
683
+ running: LlmRunning.nullable(),
684
+ starting: TextModelId.nullable(),
685
+ error: z6.string().max(300).nullable()
686
+ });
634
687
  var ModelsLlmStatusParams = z6.strictObject({});
635
688
  var ModelsLlmStatusResult = z6.strictObject({
636
689
  state: LlmServerState,
@@ -646,7 +699,9 @@ var ModelsLlmStatusResult = z6.strictObject({
646
699
  /** Non-null while the server program or a model's weights are being downloaded. */
647
700
  install: MlInstallProgress.nullable(),
648
701
  /** Why the last start or download failed, one human line; null otherwise. */
649
- error: z6.string().max(300).nullable()
702
+ error: z6.string().max(300).nullable(),
703
+ /** (1.88) The embeddings slot: the same model service's second llama-server, in embeddings mode, beside the chat model. */
704
+ embedding: LlmEmbeddingSlot.optional()
650
705
  });
651
706
  var ModelsLlmInstallParams = z6.strictObject({
652
707
  model: TextModelId,
@@ -668,10 +723,15 @@ var ModelsLlmStartParams = z6.strictObject({
668
723
  /** (1.48) CPU threads, computed by the app from the knobs. */
669
724
  threads: z6.int().min(1).max(512).optional(),
670
725
  /** (1.48) Seconds to wait for the model to load, computed by the app from the knobs. */
671
- load_timeout_s: z6.int().min(10).max(3600).optional()
726
+ load_timeout_s: z6.int().min(10).max(3600).optional(),
727
+ /** (1.88) Which slot: `chat` (default) or `embed` (the embedding model, beside the chat model; neither stops the other). */
728
+ slot: LlmSlot.optional()
672
729
  });
673
730
  var ModelsLlmStartResult = z6.strictObject({ running: LlmRunning, elapsed_ms: nonNegInt });
674
- var ModelsLlmStopParams = z6.strictObject({});
731
+ var ModelsLlmStopParams = z6.strictObject({
732
+ /** (1.88) Which slot to stop: `chat` (default) or `embed`. */
733
+ slot: LlmSlot.optional()
734
+ });
675
735
  var ModelsLlmStopResult = z6.strictObject({ stopped: z6.boolean() });
676
736
  var ModelsLlmChatParams = z6.strictObject({
677
737
  model: TextModelId,
@@ -681,6 +741,23 @@ var ModelsLlmChatParams = z6.strictObject({
681
741
  window_bytes: z6.int().min(4096).max(16777216).optional()
682
742
  });
683
743
  var ModelsLlmChatResult = z6.strictObject({ model: TextModelId, content_type: z6.string().max(128) });
744
+ var ModelsEmbedParams = z6.strictObject({
745
+ model: TextModelId,
746
+ input: z6.union([z6.string().min(1).max(262144), z6.array(z6.string().min(1).max(262144)).min(1).max(256)]),
747
+ /** Start the model in the embeddings slot first when nothing runs there (a different embedding model running is never stopped). */
748
+ start_if_stopped: z6.boolean().optional()
749
+ });
750
+ var EmbeddingVector = z6.strictObject({
751
+ index: nonNegInt,
752
+ embedding: z6.array(z6.number()).min(1).max(16384)
753
+ });
754
+ var ModelsEmbedResult = z6.strictObject({
755
+ model: TextModelId,
756
+ /** The vector length (every row has it). */
757
+ dimensions: z6.int().min(1).max(16384),
758
+ data: z6.array(EmbeddingVector).min(1).max(256),
759
+ usage: z6.strictObject({ prompt_tokens: nonNegInt, total_tokens: nonNegInt })
760
+ });
684
761
  var Sha256Hex = z6.string().regex(/^[0-9a-f]{64}$/);
685
762
  var CatalogFile = z6.strictObject({
686
763
  /** Path inside the model's folder (the artifact's path_in_repo). */
@@ -726,7 +803,11 @@ var MlCatalogSetParams = z6.strictObject({
726
803
  /** (1.69) Language models on this computer that cannot run here, each with its one-line reason: models.llm.status lists them. */
727
804
  unusable: z6.array(UnusableTextModel).optional(),
728
805
  /** (1.81) Text-to-speech models (Kokoro): what models.tts.* runs. */
729
- speech: z6.array(CatalogModelEntry).optional()
806
+ speech: z6.array(CatalogModelEntry).optional(),
807
+ /** (1.88) Embedding models (GGUF, run by llama-server with --embeddings in the embeddings slot): what models.embed runs. */
808
+ embedding: z6.array(CatalogModelEntry).optional(),
809
+ /** (1.89) Wake-word models (openWakeWord ONNX): what models.wake.* runs. */
810
+ wake: z6.array(CatalogModelEntry).optional()
730
811
  });
731
812
  var MlCatalogSetResult = z6.strictObject({ text: nonNegInt, transcription: nonNegInt });
732
813
  var DownloadKind = z6.enum(["speech_model", "text_model", "runtime"]);
@@ -1393,6 +1474,62 @@ var WebResearchFetchResult = z12.strictObject({
1393
1474
  cannot_edit: nonNegInt
1394
1475
  });
1395
1476
  var ToolsServiceProgress = z12.strictObject({ phase: z12.enum(["fetching", "installing"]), done: nonNegInt, total: nonNegInt });
1477
+ var WebHomeFetchParams = z12.strictObject({
1478
+ url: WebUrl,
1479
+ method: z12.enum(["GET", "HEAD"]).default("GET"),
1480
+ headers: z12.array(WebHeader).max(32).default([]),
1481
+ /** Why the server's own fetch failed (its block reason, e.g. `cloudflare_block`, `bad_status:403`). */
1482
+ reason: z12.string().min(1).max(64),
1483
+ /** The server's id for this request: asking again with it returns the same queued item. */
1484
+ request_id: z12.string().min(1).max(128),
1485
+ /** Keep it and retry when it cannot be fetched now (saved as a Source once read). */
1486
+ queue: z12.boolean().default(false),
1487
+ timeout_s: z12.int().min(1).max(300).default(30)
1488
+ });
1489
+ var WebHomeQueueState = z12.enum(["pending", "in_progress", "succeeded", "failed", "dead_letter"]);
1490
+ var WebHomeQueueItem = z12.strictObject({
1491
+ queue_id: z12.string().min(1).max(64),
1492
+ request_id: z12.string().min(1).max(128),
1493
+ url: z12.string().max(8192),
1494
+ reason: z12.string().max(64),
1495
+ state: WebHomeQueueState,
1496
+ attempts: nonNegInt,
1497
+ max_attempts: nonNegInt,
1498
+ created_at_ms: nonNegInt,
1499
+ next_attempt_at_ms: nonNegInt.nullable(),
1500
+ last_error: z12.string().max(2e3).nullable()
1501
+ });
1502
+ var WebHomeFetchResult = z12.strictObject({
1503
+ /** `fetched`: `fetch` holds the answer. `queued`: it waits on this computer (`item`). */
1504
+ state: z12.enum(["fetched", "queued"]),
1505
+ fetch: WebFetchResult.nullable(),
1506
+ item: WebHomeQueueItem.nullable(),
1507
+ /** One sentence for the person (and the server's result trail). */
1508
+ message: z12.string().max(2e3)
1509
+ });
1510
+ var WebHomeHistoryEntry = z12.strictObject({
1511
+ at_ms: nonNegInt,
1512
+ url: z12.string().max(8192),
1513
+ reason: z12.string().max(64),
1514
+ /** `fetched` (status says how the site answered), `refused` (off, a private address, the limit), `queued`, `failed`. */
1515
+ outcome: z12.enum(["fetched", "refused", "queued", "failed"]),
1516
+ status: z12.int().min(0).max(999).nullable(),
1517
+ bytes: nonNegInt,
1518
+ elapsed_ms: nonNegInt,
1519
+ detail: z12.string().max(2e3)
1520
+ });
1521
+ var WebHomeStatusParams = z12.strictObject({});
1522
+ var WebHomeStatusResult = z12.strictObject({
1523
+ enabled: z12.boolean(),
1524
+ max_per_hour: nonNegInt,
1525
+ max_body_bytes: nonNegInt,
1526
+ timeout_s: nonNegInt,
1527
+ used_last_hour: nonNegInt,
1528
+ queue: z12.array(WebHomeQueueItem).max(1e3),
1529
+ history: z12.array(WebHomeHistoryEntry).max(1e3),
1530
+ /** One sentence: on/off, how much of the hour is used, what waits. */
1531
+ summary: z12.string().max(2e3)
1532
+ });
1396
1533
 
1397
1534
  // src/schema/account.ts
1398
1535
  import { z as z13 } from "zod";
@@ -5114,6 +5251,7 @@ var OPS = {
5114
5251
  "models.llm.start": { params: ModelsLlmStartParams, result: ModelsLlmStartResult, kind: "unary", since: "1.31", errors: ["NOT_FOUND", "RESOURCE_BUSY", "RESOURCE_GONE", "TIMEOUT", "CANCELLED", "PLATFORM_UNSUPPORTED", "INTERNAL"] },
5115
5252
  "models.llm.stop": { params: ModelsLlmStopParams, result: ModelsLlmStopResult, kind: "unary", since: "1.31", errors: ["INTERNAL"] },
5116
5253
  "models.llm.chat": { params: ModelsLlmChatParams, result: ModelsLlmChatResult, kind: "stream", since: "1.76", errors: ["NOT_FOUND", "RESOURCE_BUSY", "RESOURCE_GONE", "INVALID_PARAMS", "TIMEOUT", "CANCELLED", "RATE_LIMITED", "INTERNAL"] },
5254
+ "models.embed": { params: ModelsEmbedParams, result: ModelsEmbedResult, kind: "unary", since: "1.88", errors: ["NOT_FOUND", "RESOURCE_BUSY", "RESOURCE_GONE", "INVALID_PARAMS", "TIMEOUT", "CANCELLED", "INTERNAL"] },
5117
5255
  "models.downloads.list": { params: ModelsDownloadsListParams, result: ModelsDownloadsListResult, kind: "unary", since: "1.45", errors: ["INTERNAL"] },
5118
5256
  "models.downloads.cancel": { params: ModelsDownloadsCancelParams, result: ModelsDownloadsCancelResult, kind: "unary", since: "1.45", errors: ["NOT_FOUND", "INTERNAL"] },
5119
5257
  "models.local.list": { params: ModelsLocalListParams, result: ModelsLocalListResult, kind: "unary", since: "1.74", errors: ["INTERNAL"] },
@@ -5123,6 +5261,10 @@ var OPS = {
5123
5261
  "models.tts.speak": { params: ModelsTtsSpeakParams, result: ModelsTtsSpeakResult, kind: "unary", since: "1.81", errors: ["NOT_FOUND", "INVALID_PARAMS", "RESOURCE_BUSY", "RESOURCE_GONE", "TIMEOUT", "CANCELLED", "INTERNAL"] },
5124
5262
  "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"] },
5125
5263
  "models.tts.voice_remove": { params: ModelsTtsVoiceRemoveParams, result: ModelsTtsVoiceRemoveResult, kind: "unary", since: "1.81", errors: ["NOT_FOUND", "INVALID_PARAMS", "INTERNAL"] },
5264
+ "models.wake.status": { params: ModelsWakeStatusParams, result: ModelsWakeStatusResult, kind: "unary", since: "1.89", errors: ["RESOURCE_BUSY", "INTERNAL"] },
5265
+ "models.wake.install": { params: ModelsWakeInstallParams, result: ModelsWakeInstallResult, kind: "unary", since: "1.89", errors: ["NOT_FOUND", "RESOURCE_BUSY", "RESOURCE_GONE", "TIMEOUT", "CANCELLED", "INTERNAL"] },
5266
+ "models.wake.detect": { params: ModelsWakeDetectParams, result: ModelsWakeDetectResult, kind: "unary", since: "1.89", errors: ["NOT_FOUND", "INVALID_PARAMS", "RESOURCE_BUSY", "RESOURCE_GONE", "INTERNAL"] },
5267
+ "models.wake.close": { params: ModelsWakeCloseParams, result: ModelsWakeCloseResult, kind: "unary", since: "1.89", errors: ["INTERNAL"] },
5126
5268
  // Desktop apps and their profiles (SPEC §6 apps); profiles are rows in users.desktop_app_profile.
5127
5269
  "apps.list": { params: AppsListParams, result: AppsListResult, kind: "unary", since: "1.2", errors: ["INTERNAL"] },
5128
5270
  "apps.profiles.list": { params: AppsProfilesListParams, result: AppsProfilesListResult, kind: "unary", since: "1.2", errors: ["NOT_FOUND", "INVALID_PARAMS", "INTERNAL"] },
@@ -5305,6 +5447,8 @@ var OPS = {
5305
5447
  "web.log.clear": { params: WebLogClearParams, result: WebLogClearResult, kind: "unary", since: "1.40", errors: ["INTERNAL"] },
5306
5448
  "web.research.queue": { params: WebResearchQueueParams, result: WebResearchQueueResult, kind: "unary", since: "1.40", errors: ["INVALID_PARAMS", "INTERNAL"] },
5307
5449
  "web.research.fetch": { params: WebResearchFetchParams, result: WebResearchFetchResult, kind: "unary", since: "1.40", errors: ["INVALID_PARAMS", "AUTH_REQUIRED", "RESOURCE_BUSY", "CANCELLED", "INTERNAL"] },
5450
+ "web.home_fetch": { params: WebHomeFetchParams, result: WebHomeFetchResult, kind: "unary", since: "1.90", errors: ["INVALID_PARAMS", "AUTH_FORBIDDEN", "RATE_LIMITED", "TIMEOUT", "INTERNAL"] },
5451
+ "web.home.status": { params: WebHomeStatusParams, result: WebHomeStatusResult, kind: "unary", since: "1.90", errors: ["INTERNAL"] },
5308
5452
  // 1.23: the signed-in person's own agents and Vault, read as them (the desktop's Agents library and Vault).
5309
5453
  "account.agents.list": { params: AccountAgentsListParams, result: AccountAgentsListResult, kind: "unary", since: "1.23", errors: ["INTERNAL"] },
5310
5454
  "account.vault.list": { params: AccountVaultListParams, result: AccountVaultListResult, kind: "unary", since: "1.23", errors: ["INTERNAL"] },
@@ -5428,6 +5572,10 @@ var SERVICES = {
5428
5572
  "ml.tts_speak": { params: ModelsTtsSpeakParams, result: ModelsTtsSpeakResult },
5429
5573
  "ml.tts_voice_save": { params: ModelsTtsVoiceSaveParams, result: ModelsTtsVoiceSaveResult },
5430
5574
  "ml.tts_voice_remove": { params: ModelsTtsVoiceRemoveParams, result: ModelsTtsVoiceRemoveResult },
5575
+ "ml.wake_status": { params: ModelsWakeStatusParams, result: ModelsWakeStatusResult },
5576
+ "ml.wake_install": { params: ModelsWakeInstallParams, result: ModelsWakeInstallResult },
5577
+ "ml.wake_detect": { params: ModelsWakeDetectParams, result: ModelsWakeDetectResult },
5578
+ "ml.wake_close": { params: ModelsWakeCloseParams, result: ModelsWakeCloseResult },
5431
5579
  "ml.catalog_set": { params: MlCatalogSetParams, result: MlCatalogSetResult }
5432
5580
  }
5433
5581
  },
@@ -5681,6 +5829,11 @@ var NAMED_SCHEMAS = {
5681
5829
  ModelsLlmStopResult,
5682
5830
  ModelsLlmChatParams,
5683
5831
  ModelsLlmChatResult,
5832
+ ModelsEmbedParams,
5833
+ ModelsEmbedResult,
5834
+ EmbeddingVector,
5835
+ LlmSlot,
5836
+ LlmEmbeddingSlot,
5684
5837
  DownloadKind,
5685
5838
  DownloadRow,
5686
5839
  ModelsDownloadsListParams,
@@ -5708,6 +5861,16 @@ var NAMED_SCHEMAS = {
5708
5861
  ModelsTtsVoiceSaveResult,
5709
5862
  ModelsTtsVoiceRemoveParams,
5710
5863
  ModelsTtsVoiceRemoveResult,
5864
+ WakeEngine,
5865
+ WakeModelInfo,
5866
+ ModelsWakeStatusParams,
5867
+ ModelsWakeStatusResult,
5868
+ ModelsWakeInstallParams,
5869
+ ModelsWakeInstallResult,
5870
+ ModelsWakeDetectParams,
5871
+ ModelsWakeDetectResult,
5872
+ ModelsWakeCloseParams,
5873
+ ModelsWakeCloseResult,
5711
5874
  CodingServiceCredentials,
5712
5875
  CodingHistoryBlocked,
5713
5876
  CodingHistoryFailure,
@@ -6177,6 +6340,13 @@ var NAMED_SCHEMAS = {
6177
6340
  WebLogListResult,
6178
6341
  WebLogClearParams,
6179
6342
  WebLogClearResult,
6343
+ WebHomeFetchParams,
6344
+ WebHomeFetchResult,
6345
+ WebHomeQueueState,
6346
+ WebHomeQueueItem,
6347
+ WebHomeHistoryEntry,
6348
+ WebHomeStatusParams,
6349
+ WebHomeStatusResult,
6180
6350
  WebProgressEvent,
6181
6351
  WebResearchItemState,
6182
6352
  WebResearchItem,
@@ -6509,12 +6679,25 @@ export {
6509
6679
  ModelsTtsVoiceSaveResult,
6510
6680
  ModelsTtsVoiceRemoveParams,
6511
6681
  ModelsTtsVoiceRemoveResult,
6682
+ WakeEngine,
6683
+ WakeModelInfo,
6684
+ ModelsWakeStatusParams,
6685
+ ModelsWakeStatusResult,
6686
+ ModelsWakeInstallParams,
6687
+ ModelsWakeInstallResult,
6688
+ WAKE_PCM_MAX_CHARS,
6689
+ ModelsWakeDetectParams,
6690
+ ModelsWakeDetectResult,
6691
+ ModelsWakeCloseParams,
6692
+ ModelsWakeCloseResult,
6512
6693
  MlProgress,
6513
6694
  TextModelId,
6514
6695
  TextModelInfo,
6515
6696
  UnusableTextModel,
6516
6697
  LlmServerState,
6517
6698
  LlmRunning,
6699
+ LlmSlot,
6700
+ LlmEmbeddingSlot,
6518
6701
  ModelsLlmStatusParams,
6519
6702
  ModelsLlmStatusResult,
6520
6703
  ModelsLlmInstallParams,
@@ -6525,6 +6708,9 @@ export {
6525
6708
  ModelsLlmStopResult,
6526
6709
  ModelsLlmChatParams,
6527
6710
  ModelsLlmChatResult,
6711
+ ModelsEmbedParams,
6712
+ EmbeddingVector,
6713
+ ModelsEmbedResult,
6528
6714
  Sha256Hex,
6529
6715
  CatalogFile,
6530
6716
  CatalogModelEntry,
@@ -6886,6 +7072,13 @@ export {
6886
7072
  WebResearchFetchParams,
6887
7073
  WebResearchFetchResult,
6888
7074
  ToolsServiceProgress,
7075
+ WebHomeFetchParams,
7076
+ WebHomeQueueState,
7077
+ WebHomeQueueItem,
7078
+ WebHomeFetchResult,
7079
+ WebHomeHistoryEntry,
7080
+ WebHomeStatusParams,
7081
+ WebHomeStatusResult,
6889
7082
  SystemOpenUrlParams,
6890
7083
  SystemOpenUrlResult,
6891
7084
  SystemOpenPathParams,
@@ -7302,4 +7495,4 @@ export {
7302
7495
  SERVICES,
7303
7496
  NAMED_SCHEMAS
7304
7497
  };
7305
- //# sourceMappingURL=chunk-server-7CEUIBDY.js.map
7498
+ //# sourceMappingURL=chunk-server-BQQPFQSL.js.map