@ai-matrx/desktop-protocol 0.21.94 → 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/dist/client.d.cts CHANGED
@@ -1,9 +1,9 @@
1
1
  import { BackoffOptions } from '@ai-matrx/data/realtime';
2
2
  export { RECONNECT_ALARM_ATTEMPTS } from '@ai-matrx/data/realtime';
3
3
  import { z } from 'zod';
4
- import { D as DesktopProtocolError, O as OpName, a as OpParams, b as OpResult } from './models-D2apXuiZ.cjs';
4
+ import { D as DesktopProtocolError, O as OpName, a as OpParams, b as OpResult } from './models-BfCwxx-G.cjs';
5
5
  import { Welcome, CloseOutcome, OPS, StreamMeta, EndReason, EVENTS, ClientType, ModelsTranscribeResult, TranscriptionModelId, MlProgress } from './index.cjs';
6
- export { i as isDesktopProtocolError } from './models-D2apXuiZ.cjs';
6
+ export { i as isDesktopProtocolError } from './models-BfCwxx-G.cjs';
7
7
  import { FrameHeader } from './frame.cjs';
8
8
 
9
9
  /** The subset of the WHATWG WebSocket the client uses — browser, React Native, `ws` and Workers all fit. */
package/dist/client.d.ts CHANGED
@@ -1,9 +1,9 @@
1
1
  import { BackoffOptions } from '@ai-matrx/data/realtime';
2
2
  export { RECONNECT_ALARM_ATTEMPTS } from '@ai-matrx/data/realtime';
3
3
  import { z } from 'zod';
4
- import { D as DesktopProtocolError, O as OpName, a as OpParams, b as OpResult } from './models-D2apXuiZ.js';
4
+ import { D as DesktopProtocolError, O as OpName, a as OpParams, b as OpResult } from './models-BfCwxx-G.js';
5
5
  import { Welcome, CloseOutcome, OPS, StreamMeta, EndReason, EVENTS, ClientType, ModelsTranscribeResult, TranscriptionModelId, MlProgress } from './index.js';
6
- export { i as isDesktopProtocolError } from './models-D2apXuiZ.js';
6
+ export { i as isDesktopProtocolError } from './models-BfCwxx-G.js';
7
7
  import { FrameHeader } from './frame.js';
8
8
 
9
9
  /** The subset of the WHATWG WebSocket the client uses — browser, React Native, `ws` and Workers all fit. */
package/dist/client.js CHANGED
@@ -1,7 +1,7 @@
1
1
  import {
2
2
  closeRule,
3
3
  knows
4
- } from "./chunk-server-Q7F4IE6F.js";
4
+ } from "./chunk-server-46JNNDT7.js";
5
5
  import {
6
6
  CloseCode,
7
7
  CoreToClientMsg,
@@ -12,7 +12,7 @@ import {
12
12
  PROTOCOL_MAJOR,
13
13
  PROTOCOL_MINOR,
14
14
  Welcome
15
- } from "./chunk-server-5MKSD7FQ.js";
15
+ } from "./chunk-server-IHK7SYRO.js";
16
16
  import {
17
17
  DesktopProtocolError,
18
18
  FRAME_VERSION,
@@ -28,7 +28,7 @@ var registry = null;
28
28
  var registryLoad = null;
29
29
  function loadRegistry() {
30
30
  if (registry) return Promise.resolve(registry);
31
- registryLoad ??= import("./chunk-server-PXHL7V3H.js").then((m) => registry = m);
31
+ registryLoad ??= import("./chunk-server-ESQX6XVP.js").then((m) => registry = m);
32
32
  return registryLoad;
33
33
  }
34
34
  var WS_OPEN = 1;
package/dist/index.cjs CHANGED
@@ -660,6 +660,14 @@ __export(src_exports, {
660
660
  ModelsTtsVoiceRemoveResult: () => ModelsTtsVoiceRemoveResult,
661
661
  ModelsTtsVoiceSaveParams: () => ModelsTtsVoiceSaveParams,
662
662
  ModelsTtsVoiceSaveResult: () => ModelsTtsVoiceSaveResult,
663
+ ModelsWakeCloseParams: () => ModelsWakeCloseParams,
664
+ ModelsWakeCloseResult: () => ModelsWakeCloseResult,
665
+ ModelsWakeDetectParams: () => ModelsWakeDetectParams,
666
+ ModelsWakeDetectResult: () => ModelsWakeDetectResult,
667
+ ModelsWakeInstallParams: () => ModelsWakeInstallParams,
668
+ ModelsWakeInstallResult: () => ModelsWakeInstallResult,
669
+ ModelsWakeStatusParams: () => ModelsWakeStatusParams,
670
+ ModelsWakeStatusResult: () => ModelsWakeStatusResult,
663
671
  NAMED_SCHEMAS: () => NAMED_SCHEMAS,
664
672
  NULL_SINCE: () => NULL_SINCE,
665
673
  NetAddress: () => NetAddress,
@@ -922,13 +930,23 @@ __export(src_exports, {
922
930
  VaultFieldSummary: () => VaultFieldSummary,
923
931
  VaultItemKind: () => VaultItemKind,
924
932
  VaultItemSummary: () => VaultItemSummary,
933
+ WAKE_PCM_MAX_CHARS: () => WAKE_PCM_MAX_CHARS,
925
934
  WEB_MAX_TEXT_CHARS: () => WEB_MAX_TEXT_CHARS,
935
+ WakeEngine: () => WakeEngine,
936
+ WakeModelInfo: () => WakeModelInfo,
926
937
  WebAttachTarget: () => WebAttachTarget,
927
938
  WebBrowserFetchParams: () => WebBrowserFetchParams,
928
939
  WebBrowserFetchResult: () => WebBrowserFetchResult,
929
940
  WebFetchParams: () => WebFetchParams,
930
941
  WebFetchResult: () => WebFetchResult,
931
942
  WebHeader: () => WebHeader,
943
+ WebHomeFetchParams: () => WebHomeFetchParams,
944
+ WebHomeFetchResult: () => WebHomeFetchResult,
945
+ WebHomeHistoryEntry: () => WebHomeHistoryEntry,
946
+ WebHomeQueueItem: () => WebHomeQueueItem,
947
+ WebHomeQueueState: () => WebHomeQueueState,
948
+ WebHomeStatusParams: () => WebHomeStatusParams,
949
+ WebHomeStatusResult: () => WebHomeStatusResult,
932
950
  WebLand: () => WebLand,
933
951
  WebLogCaller: () => WebLogCaller,
934
952
  WebLogClearParams: () => WebLogClearParams,
@@ -1035,7 +1053,7 @@ module.exports = __toCommonJS(src_exports);
1035
1053
  var import_zod = require("zod");
1036
1054
  var import_uuid = require("@ai-matrx/kit/uuid");
1037
1055
  var PROTOCOL_MAJOR = 1;
1038
- var PROTOCOL_MINOR = 88;
1056
+ var PROTOCOL_MINOR = 90;
1039
1057
  var PROTOCOL_VERSION = `${PROTOCOL_MAJOR}.${PROTOCOL_MINOR}`;
1040
1058
  var ProtocolVersion = import_zod.z.string().regex(/^[1-9][0-9]{0,2}\.[0-9]{1,3}$/);
1041
1059
  var RequestId = import_zod.z.string().min(1).max(64).regex(/^[A-Za-z0-9_-]+$/);
@@ -2025,6 +2043,51 @@ var ModelsTtsVoiceSaveParams = import_zod11.z.strictObject({
2025
2043
  var ModelsTtsVoiceSaveResult = import_zod11.z.strictObject({ voice: TtsVoice });
2026
2044
  var ModelsTtsVoiceRemoveParams = import_zod11.z.strictObject({ voice: TtsVoiceId });
2027
2045
  var ModelsTtsVoiceRemoveResult = import_zod11.z.strictObject({ removed: import_zod11.z.boolean() });
2046
+ var WakeEngine = import_zod11.z.enum(["oww", "whisper"]);
2047
+ var WakeModelInfo = import_zod11.z.strictObject({
2048
+ id: ModelKey,
2049
+ size_bytes: nonNegInt,
2050
+ installed: import_zod11.z.boolean(),
2051
+ problem: import_zod11.z.string().max(300).nullable()
2052
+ });
2053
+ var ModelsWakeStatusParams = import_zod11.z.strictObject({});
2054
+ var ModelsWakeStatusResult = import_zod11.z.strictObject({
2055
+ /** The first-use runtime (onnxruntime, faster-whisper) is installed. */
2056
+ runtime_ready: import_zod11.z.boolean(),
2057
+ /** openWakeWord models this computer can fetch (the catalog's wake words). */
2058
+ models: import_zod11.z.array(WakeModelInfo),
2059
+ /** The Whisper model the phrase engine uses (the catalog's smallest); null when the catalog has none. */
2060
+ whisper: WakeModelInfo.nullable(),
2061
+ error: import_zod11.z.string().max(500).nullable()
2062
+ });
2063
+ var ModelsWakeInstallParams = import_zod11.z.strictObject({ engine: WakeEngine, model: ModelKey.optional() });
2064
+ var ModelsWakeInstallResult = import_zod11.z.strictObject({ model: ModelKey, elapsed_ms: nonNegInt });
2065
+ var WAKE_PCM_MAX_CHARS = 44e4;
2066
+ var ModelsWakeDetectParams = import_zod11.z.strictObject({
2067
+ /** The caller's listening session: the engine keeps its rolling audio per stream. */
2068
+ stream: import_zod11.z.string().min(1).max(64),
2069
+ engine: WakeEngine,
2070
+ /** (oww) The wake-word model; (whisper) unused. */
2071
+ model: ModelKey.optional(),
2072
+ /** (whisper) The phrase to hear, e.g. "hey matrix". */
2073
+ keyword: import_zod11.z.string().min(1).max(64).optional(),
2074
+ /** (oww) The score that counts as heard, 0–1. */
2075
+ threshold: import_zod11.z.number().min(0).max(1).optional(),
2076
+ /** Base64 of 16 kHz mono signed 16-bit little-endian PCM that follows the stream's last call. */
2077
+ pcm: import_zod11.z.string().max(WAKE_PCM_MAX_CHARS)
2078
+ });
2079
+ var ModelsWakeDetectResult = import_zod11.z.strictObject({
2080
+ detected: import_zod11.z.boolean(),
2081
+ /** (oww) The highest score in this audio; null for whisper. */
2082
+ score: import_zod11.z.number().min(0).max(1).nullable(),
2083
+ /** (whisper) What the window said, when it ran; null otherwise. */
2084
+ heard: import_zod11.z.string().max(500).nullable(),
2085
+ /** The audio's level, 0–1. */
2086
+ rms: import_zod11.z.number().min(0).max(1),
2087
+ elapsed_ms: nonNegInt
2088
+ });
2089
+ var ModelsWakeCloseParams = import_zod11.z.strictObject({ stream: import_zod11.z.string().min(1).max(64) });
2090
+ var ModelsWakeCloseResult = import_zod11.z.strictObject({ closed: import_zod11.z.boolean() });
2028
2091
  var MlProgress = import_zod11.z.strictObject({
2029
2092
  kind: import_zod11.z.enum(["install", "transcribe", "speak"]),
2030
2093
  /** 0–1 when known (transcribe: audio covered so far; install: bytes so far). */
@@ -2194,7 +2257,9 @@ var MlCatalogSetParams = import_zod11.z.strictObject({
2194
2257
  /** (1.81) Text-to-speech models (Kokoro): what models.tts.* runs. */
2195
2258
  speech: import_zod11.z.array(CatalogModelEntry).optional(),
2196
2259
  /** (1.88) Embedding models (GGUF, run by llama-server with --embeddings in the embeddings slot): what models.embed runs. */
2197
- embedding: import_zod11.z.array(CatalogModelEntry).optional()
2260
+ embedding: import_zod11.z.array(CatalogModelEntry).optional(),
2261
+ /** (1.89) Wake-word models (openWakeWord ONNX): what models.wake.* runs. */
2262
+ wake: import_zod11.z.array(CatalogModelEntry).optional()
2198
2263
  });
2199
2264
  var MlCatalogSetResult = import_zod11.z.strictObject({ text: nonNegInt, transcription: nonNegInt });
2200
2265
  var DownloadKind = import_zod11.z.enum(["speech_model", "text_model", "runtime"]);
@@ -4147,6 +4212,62 @@ var WebResearchFetchResult = import_zod23.z.strictObject({
4147
4212
  cannot_edit: nonNegInt
4148
4213
  });
4149
4214
  var ToolsServiceProgress = import_zod23.z.strictObject({ phase: import_zod23.z.enum(["fetching", "installing"]), done: nonNegInt, total: nonNegInt });
4215
+ var WebHomeFetchParams = import_zod23.z.strictObject({
4216
+ url: WebUrl,
4217
+ method: import_zod23.z.enum(["GET", "HEAD"]).default("GET"),
4218
+ headers: import_zod23.z.array(WebHeader).max(32).default([]),
4219
+ /** Why the server's own fetch failed (its block reason, e.g. `cloudflare_block`, `bad_status:403`). */
4220
+ reason: import_zod23.z.string().min(1).max(64),
4221
+ /** The server's id for this request: asking again with it returns the same queued item. */
4222
+ request_id: import_zod23.z.string().min(1).max(128),
4223
+ /** Keep it and retry when it cannot be fetched now (saved as a Source once read). */
4224
+ queue: import_zod23.z.boolean().default(false),
4225
+ timeout_s: import_zod23.z.int().min(1).max(300).default(30)
4226
+ });
4227
+ var WebHomeQueueState = import_zod23.z.enum(["pending", "in_progress", "succeeded", "failed", "dead_letter"]);
4228
+ var WebHomeQueueItem = import_zod23.z.strictObject({
4229
+ queue_id: import_zod23.z.string().min(1).max(64),
4230
+ request_id: import_zod23.z.string().min(1).max(128),
4231
+ url: import_zod23.z.string().max(8192),
4232
+ reason: import_zod23.z.string().max(64),
4233
+ state: WebHomeQueueState,
4234
+ attempts: nonNegInt,
4235
+ max_attempts: nonNegInt,
4236
+ created_at_ms: nonNegInt,
4237
+ next_attempt_at_ms: nonNegInt.nullable(),
4238
+ last_error: import_zod23.z.string().max(2e3).nullable()
4239
+ });
4240
+ var WebHomeFetchResult = import_zod23.z.strictObject({
4241
+ /** `fetched`: `fetch` holds the answer. `queued`: it waits on this computer (`item`). */
4242
+ state: import_zod23.z.enum(["fetched", "queued"]),
4243
+ fetch: WebFetchResult.nullable(),
4244
+ item: WebHomeQueueItem.nullable(),
4245
+ /** One sentence for the person (and the server's result trail). */
4246
+ message: import_zod23.z.string().max(2e3)
4247
+ });
4248
+ var WebHomeHistoryEntry = import_zod23.z.strictObject({
4249
+ at_ms: nonNegInt,
4250
+ url: import_zod23.z.string().max(8192),
4251
+ reason: import_zod23.z.string().max(64),
4252
+ /** `fetched` (status says how the site answered), `refused` (off, a private address, the limit), `queued`, `failed`. */
4253
+ outcome: import_zod23.z.enum(["fetched", "refused", "queued", "failed"]),
4254
+ status: import_zod23.z.int().min(0).max(999).nullable(),
4255
+ bytes: nonNegInt,
4256
+ elapsed_ms: nonNegInt,
4257
+ detail: import_zod23.z.string().max(2e3)
4258
+ });
4259
+ var WebHomeStatusParams = import_zod23.z.strictObject({});
4260
+ var WebHomeStatusResult = import_zod23.z.strictObject({
4261
+ enabled: import_zod23.z.boolean(),
4262
+ max_per_hour: nonNegInt,
4263
+ max_body_bytes: nonNegInt,
4264
+ timeout_s: nonNegInt,
4265
+ used_last_hour: nonNegInt,
4266
+ queue: import_zod23.z.array(WebHomeQueueItem).max(1e3),
4267
+ history: import_zod23.z.array(WebHomeHistoryEntry).max(1e3),
4268
+ /** One sentence: on/off, how much of the hour is used, what waits. */
4269
+ summary: import_zod23.z.string().max(2e3)
4270
+ });
4150
4271
 
4151
4272
  // src/schema/system.ts
4152
4273
  var import_zod24 = require("zod");
@@ -6540,6 +6661,10 @@ var OPS = {
6540
6661
  "models.tts.speak": { params: ModelsTtsSpeakParams, result: ModelsTtsSpeakResult, kind: "unary", since: "1.81", errors: ["NOT_FOUND", "INVALID_PARAMS", "RESOURCE_BUSY", "RESOURCE_GONE", "TIMEOUT", "CANCELLED", "INTERNAL"] },
6541
6662
  "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"] },
6542
6663
  "models.tts.voice_remove": { params: ModelsTtsVoiceRemoveParams, result: ModelsTtsVoiceRemoveResult, kind: "unary", since: "1.81", errors: ["NOT_FOUND", "INVALID_PARAMS", "INTERNAL"] },
6664
+ "models.wake.status": { params: ModelsWakeStatusParams, result: ModelsWakeStatusResult, kind: "unary", since: "1.89", errors: ["RESOURCE_BUSY", "INTERNAL"] },
6665
+ "models.wake.install": { params: ModelsWakeInstallParams, result: ModelsWakeInstallResult, kind: "unary", since: "1.89", errors: ["NOT_FOUND", "RESOURCE_BUSY", "RESOURCE_GONE", "TIMEOUT", "CANCELLED", "INTERNAL"] },
6666
+ "models.wake.detect": { params: ModelsWakeDetectParams, result: ModelsWakeDetectResult, kind: "unary", since: "1.89", errors: ["NOT_FOUND", "INVALID_PARAMS", "RESOURCE_BUSY", "RESOURCE_GONE", "INTERNAL"] },
6667
+ "models.wake.close": { params: ModelsWakeCloseParams, result: ModelsWakeCloseResult, kind: "unary", since: "1.89", errors: ["INTERNAL"] },
6543
6668
  // Desktop apps and their profiles (SPEC §6 apps); profiles are rows in users.desktop_app_profile.
6544
6669
  "apps.list": { params: AppsListParams, result: AppsListResult, kind: "unary", since: "1.2", errors: ["INTERNAL"] },
6545
6670
  "apps.profiles.list": { params: AppsProfilesListParams, result: AppsProfilesListResult, kind: "unary", since: "1.2", errors: ["NOT_FOUND", "INVALID_PARAMS", "INTERNAL"] },
@@ -6722,6 +6847,8 @@ var OPS = {
6722
6847
  "web.log.clear": { params: WebLogClearParams, result: WebLogClearResult, kind: "unary", since: "1.40", errors: ["INTERNAL"] },
6723
6848
  "web.research.queue": { params: WebResearchQueueParams, result: WebResearchQueueResult, kind: "unary", since: "1.40", errors: ["INVALID_PARAMS", "INTERNAL"] },
6724
6849
  "web.research.fetch": { params: WebResearchFetchParams, result: WebResearchFetchResult, kind: "unary", since: "1.40", errors: ["INVALID_PARAMS", "AUTH_REQUIRED", "RESOURCE_BUSY", "CANCELLED", "INTERNAL"] },
6850
+ "web.home_fetch": { params: WebHomeFetchParams, result: WebHomeFetchResult, kind: "unary", since: "1.90", errors: ["INVALID_PARAMS", "AUTH_FORBIDDEN", "RATE_LIMITED", "TIMEOUT", "INTERNAL"] },
6851
+ "web.home.status": { params: WebHomeStatusParams, result: WebHomeStatusResult, kind: "unary", since: "1.90", errors: ["INTERNAL"] },
6725
6852
  // 1.23: the signed-in person's own agents and Vault, read as them (the desktop's Agents library and Vault).
6726
6853
  "account.agents.list": { params: AccountAgentsListParams, result: AccountAgentsListResult, kind: "unary", since: "1.23", errors: ["INTERNAL"] },
6727
6854
  "account.vault.list": { params: AccountVaultListParams, result: AccountVaultListResult, kind: "unary", since: "1.23", errors: ["INTERNAL"] },
@@ -6845,6 +6972,10 @@ var SERVICES = {
6845
6972
  "ml.tts_speak": { params: ModelsTtsSpeakParams, result: ModelsTtsSpeakResult },
6846
6973
  "ml.tts_voice_save": { params: ModelsTtsVoiceSaveParams, result: ModelsTtsVoiceSaveResult },
6847
6974
  "ml.tts_voice_remove": { params: ModelsTtsVoiceRemoveParams, result: ModelsTtsVoiceRemoveResult },
6975
+ "ml.wake_status": { params: ModelsWakeStatusParams, result: ModelsWakeStatusResult },
6976
+ "ml.wake_install": { params: ModelsWakeInstallParams, result: ModelsWakeInstallResult },
6977
+ "ml.wake_detect": { params: ModelsWakeDetectParams, result: ModelsWakeDetectResult },
6978
+ "ml.wake_close": { params: ModelsWakeCloseParams, result: ModelsWakeCloseResult },
6848
6979
  "ml.catalog_set": { params: MlCatalogSetParams, result: MlCatalogSetResult }
6849
6980
  }
6850
6981
  },
@@ -7130,6 +7261,16 @@ var NAMED_SCHEMAS = {
7130
7261
  ModelsTtsVoiceSaveResult,
7131
7262
  ModelsTtsVoiceRemoveParams,
7132
7263
  ModelsTtsVoiceRemoveResult,
7264
+ WakeEngine,
7265
+ WakeModelInfo,
7266
+ ModelsWakeStatusParams,
7267
+ ModelsWakeStatusResult,
7268
+ ModelsWakeInstallParams,
7269
+ ModelsWakeInstallResult,
7270
+ ModelsWakeDetectParams,
7271
+ ModelsWakeDetectResult,
7272
+ ModelsWakeCloseParams,
7273
+ ModelsWakeCloseResult,
7133
7274
  CodingServiceCredentials,
7134
7275
  CodingHistoryBlocked,
7135
7276
  CodingHistoryFailure,
@@ -7599,6 +7740,13 @@ var NAMED_SCHEMAS = {
7599
7740
  WebLogListResult,
7600
7741
  WebLogClearParams,
7601
7742
  WebLogClearResult,
7743
+ WebHomeFetchParams,
7744
+ WebHomeFetchResult,
7745
+ WebHomeQueueState,
7746
+ WebHomeQueueItem,
7747
+ WebHomeHistoryEntry,
7748
+ WebHomeStatusParams,
7749
+ WebHomeStatusResult,
7602
7750
  WebProgressEvent,
7603
7751
  WebResearchItemState,
7604
7752
  WebResearchItem,
@@ -7815,7 +7963,7 @@ var import_versions = require("@ai-matrx/kit/versions");
7815
7963
  var FIELDS_SINCE = {
7816
7964
  LlmRunning: { context_length: "1.48", gpu_layers: "1.48", threads: "1.48" },
7817
7965
  TextModelInfo: { title: "1.69", problem: "1.69" },
7818
- MlCatalogSetParams: { unusable: "1.69", speech: "1.81", embedding: "1.88" },
7966
+ MlCatalogSetParams: { unusable: "1.69", speech: "1.81", embedding: "1.88", wake: "1.89" },
7819
7967
  ModelsLlmStatusResult: { embedding: "1.88" },
7820
7968
  ModelsLlmStopParams: { slot: "1.88" },
7821
7969
  MlProgress: { audio: "1.81" },
@@ -8169,7 +8317,7 @@ function forPeer(op, part, value, version) {
8169
8317
  var VERSIONED_RESULT_OPS = [.../* @__PURE__ */ new Set([...RESULT_PATH.keys(), ...WINDOW_RESULTS.keys(), ...NESTED_RESULTS.keys()])];
8170
8318
 
8171
8319
  // src/contract.ts
8172
- var CONTRACT_SHA256 = "24650f34e966ce74c997fefcc7e6474b71fb9737ea81e81bfd1513a5e5018768";
8320
+ var CONTRACT_SHA256 = "c506c1188555e5a6810a0fb4c8517ee0b7328c66f5b4ddcf7eb1fe55bc737914";
8173
8321
 
8174
8322
  // src/close-policy.ts
8175
8323
  var CLOSE_RULES = {
@@ -8255,9 +8403,10 @@ var TOOL_CATALOG = [
8255
8403
  { name: "desktop_documents", group: "tools_service", state: "built", path: "device_op", ops: ["documents.pdf_text", "documents.ocr", "documents.image_resize", "documents.office_generate"], platforms: ALL, summary: "PDF text, OCR, images, Word and Excel files" },
8256
8404
  { name: "desktop_web", group: "tools_service", state: "built", path: "device_op", ops: ["web.fetch", "web.scrape", "web.search", "web.fetch_with_browser"], platforms: ALL, summary: "Fetch, scrape, search and research the web from this computer's own connection (research: search on AI Matrx, every result read here)" },
8257
8405
  { name: "desktop_entities", group: "tools_service", state: "built", path: "device_op", ops: ["entities.ner", "entities.pii"], platforms: ALL, summary: "Names, places, organizations and private data, found on the device" },
8258
- // matrx-local's SemanticFindPaths: needs a local embedding index of this computer's files and an
8259
- // embedding model on the device; neither exists yet, so it is Coming soon on Agents › Tools.
8260
- { name: "desktop_semantic_find", group: "files_shell", state: "planned", path: "device_op", ops: ["fs.search_semantic"], platforms: ALL, summary: "Find files by meaning (a local embedding index of this computer's files)" },
8406
+ // matrx-local's SemanticFindPaths: the local embedding index of this computer's files (1.87) searched by an
8407
+ // embedding model on the device (1.88: the model service's embeddings slot). fs.semantic_status tells an agent
8408
+ // whether the index is ready (indexed N of M, or why not) before it asks.
8409
+ { name: "desktop_semantic_find", group: "files_shell", state: "built", path: "device_op", ops: ["fs.search_semantic", "fs.semantic_status"], platforms: ALL, summary: "Find files by meaning (a local embedding index of this computer's files, searched by an embedding model on the device)" },
8261
8410
  { name: "desktop_notes", group: "files_shell", state: "built", path: "device_op", ops: ["notes.folders", "notes.list", "notes.read", "notes.write", "notes.search"], platforms: ALL, summary: "The person's local notes (Documents/Matrx/Notes): list, read, write, search" },
8262
8411
  // ── 5. Python `ml` service ───────────────────────────────────────────────────────────────────
8263
8412
  // Built: models.transcribe through local_proxy's POST /op/{cap.op} (matrx-ai implementations/desktop.py).
@@ -8286,7 +8435,7 @@ var LEGACY_ACTIONS = {
8286
8435
  "local_file.list": tool("fs_list"),
8287
8436
  "local_file.places": dropped("The device's home and folders reach the agent in its binding briefing (sysinfo.get)"),
8288
8437
  "local_file.find": tool("fs_search"),
8289
- "local_file.semantic_find": dropped("Needs a local embedding index; desktop_semantic_find is planned (Coming soon on Agents \u203A Tools) until it exists"),
8438
+ "local_file.semantic_find": tool("desktop_semantic_find"),
8290
8439
  "local_shell.run": tool("shell_execute"),
8291
8440
  "local_shell.output": tool("shell_job"),
8292
8441
  "local_shell.stop": tool("shell_job"),