@ai-matrx/desktop-protocol 0.21.25 → 0.21.27

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/index.cjs CHANGED
@@ -253,10 +253,14 @@ __export(src_exports, {
253
253
  FrameHeader: () => FrameHeader,
254
254
  FsChange: () => FsChange,
255
255
  FsChangedEvent: () => FsChangedEvent,
256
+ FsCopyParams: () => FsCopyParams,
257
+ FsCopyResult: () => FsCopyResult,
256
258
  FsDeleteParams: () => FsDeleteParams,
257
259
  FsDeleteResult: () => FsDeleteResult,
258
260
  FsEncoding: () => FsEncoding,
259
261
  FsEntry: () => FsEntry,
262
+ FsInfoParams: () => FsInfoParams,
263
+ FsInfoResult: () => FsInfoResult,
260
264
  FsKind: () => FsKind,
261
265
  FsListParams: () => FsListParams,
262
266
  FsListResult: () => FsListResult,
@@ -274,6 +278,8 @@ __export(src_exports, {
274
278
  FsReadStreamResult: () => FsReadStreamResult,
275
279
  FsSearchContentParams: () => FsSearchContentParams,
276
280
  FsSearchContentResult: () => FsSearchContentResult,
281
+ FsSearchIndexParams: () => FsSearchIndexParams,
282
+ FsSearchIndexResult: () => FsSearchIndexResult,
277
283
  FsSearchPathsParams: () => FsSearchPathsParams,
278
284
  FsSearchPathsResult: () => FsSearchPathsResult,
279
285
  FsStatParams: () => FsStatParams,
@@ -325,6 +331,8 @@ __export(src_exports, {
325
331
  LEGACY_ACTIONS: () => LEGACY_ACTIONS,
326
332
  LEGACY_DISPATCHERS: () => LEGACY_DISPATCHERS,
327
333
  Limits: () => Limits,
334
+ LlmRunning: () => LlmRunning,
335
+ LlmServerState: () => LlmServerState,
328
336
  MATRX_EXTENSION_IDS: () => MATRX_EXTENSION_IDS,
329
337
  MlInstallPhase: () => MlInstallPhase,
330
338
  MlInstallProgress: () => MlInstallProgress,
@@ -336,6 +344,14 @@ __export(src_exports, {
336
344
  MlStatusResult: () => MlStatusResult,
337
345
  ModelsInstallParams: () => ModelsInstallParams,
338
346
  ModelsInstallResult: () => ModelsInstallResult,
347
+ ModelsLlmInstallParams: () => ModelsLlmInstallParams,
348
+ ModelsLlmInstallResult: () => ModelsLlmInstallResult,
349
+ ModelsLlmStartParams: () => ModelsLlmStartParams,
350
+ ModelsLlmStartResult: () => ModelsLlmStartResult,
351
+ ModelsLlmStatusParams: () => ModelsLlmStatusParams,
352
+ ModelsLlmStatusResult: () => ModelsLlmStatusResult,
353
+ ModelsLlmStopParams: () => ModelsLlmStopParams,
354
+ ModelsLlmStopResult: () => ModelsLlmStopResult,
339
355
  ModelsProgressEvent: () => ModelsProgressEvent,
340
356
  ModelsStatusParams: () => ModelsStatusParams,
341
357
  ModelsStatusResult: () => ModelsStatusResult,
@@ -370,6 +386,7 @@ __export(src_exports, {
370
386
  ProcSort: () => ProcSort,
371
387
  ProjectMoveChat: () => ProjectMoveChat,
372
388
  ProjectMoveGroup: () => ProjectMoveGroup,
389
+ ProjectMovePin: () => ProjectMovePin,
373
390
  ProjectMoveSkip: () => ProjectMoveSkip,
374
391
  ProtocolErrorBody: () => ProtocolErrorBody,
375
392
  ProtocolVersion: () => ProtocolVersion,
@@ -487,6 +504,8 @@ __export(src_exports, {
487
504
  TOOL_GROUPS: () => TOOL_GROUPS,
488
505
  TOOL_LEVELS: () => TOOL_LEVELS,
489
506
  TOOL_PLATFORMS: () => TOOL_PLATFORMS,
507
+ TextModelId: () => TextModelId,
508
+ TextModelInfo: () => TextModelInfo,
490
509
  TitleCopies: () => TitleCopies,
491
510
  TitleMismatch: () => TitleMismatch,
492
511
  ToolLevel: () => ToolLevel,
@@ -547,9 +566,12 @@ __export(src_exports, {
547
566
  negotiate: () => negotiate,
548
567
  nonNegInt: () => nonNegInt,
549
568
  readCid: () => readCid,
569
+ refusedOps: () => refusedOps,
550
570
  renderToolStatusMarkdown: () => renderToolStatusMarkdown,
571
+ sharedOpsBlocking: () => sharedOpsBlocking,
551
572
  stampCid: () => stampCid,
552
573
  statusForPeer: () => statusForPeer,
574
+ toolsSending: () => toolsSending,
553
575
  u32: () => u32,
554
576
  versionSubprotocol: () => versionSubprotocol
555
577
  });
@@ -559,7 +581,7 @@ module.exports = __toCommonJS(src_exports);
559
581
  var import_zod = require("zod");
560
582
  var import_uuid = require("@ai-matrx/kit/uuid");
561
583
  var PROTOCOL_MAJOR = 1;
562
- var PROTOCOL_MINOR = 29;
584
+ var PROTOCOL_MINOR = 32;
563
585
  var PROTOCOL_VERSION = `${PROTOCOL_MAJOR}.${PROTOCOL_MINOR}`;
564
586
  var ProtocolVersion = import_zod.z.string().regex(/^[1-9][0-9]{0,2}\.[0-9]{1,3}$/);
565
587
  var RequestId = import_zod.z.string().min(1).max(64).regex(/^[A-Za-z0-9_-]+$/);
@@ -1078,6 +1100,8 @@ var FsMkdirParams = import_zod6.z.strictObject({ path: AbsPath, parents: import_
1078
1100
  var FsMkdirResult = import_zod6.z.strictObject({ path: AbsPath, created: import_zod6.z.boolean() });
1079
1101
  var FsMoveParams = import_zod6.z.strictObject({ from_path: AbsPath, to_path: AbsPath, overwrite: import_zod6.z.boolean().default(false) });
1080
1102
  var FsMoveResult = import_zod6.z.strictObject({ from_path: AbsPath, to_path: AbsPath });
1103
+ var FsCopyParams = import_zod6.z.strictObject({ from_path: AbsPath, to_path: AbsPath, overwrite: import_zod6.z.boolean().default(false) });
1104
+ var FsCopyResult = import_zod6.z.strictObject({ from_path: AbsPath, to_path: AbsPath });
1081
1105
  var FsDeleteParams = import_zod6.z.strictObject({
1082
1106
  path: AbsPath,
1083
1107
  recursive: import_zod6.z.boolean().default(false),
@@ -1146,6 +1170,36 @@ var FsSearchContentResult = import_zod6.z.strictObject({
1146
1170
  })
1147
1171
  )
1148
1172
  });
1173
+ var FsSearchIndexParams = import_zod6.z.strictObject({
1174
+ query: import_zod6.z.string().min(1).max(256),
1175
+ /** Only under this folder; absent: the whole computer (the walk: the home folder). */
1176
+ scope: AbsPath.optional(),
1177
+ max_results: import_zod6.z.int().min(1).max(1e3).default(200)
1178
+ });
1179
+ var FsSearchIndexResult = import_zod6.z.strictObject({
1180
+ entries: import_zod6.z.array(FsEntry).max(1e3),
1181
+ truncated: import_zod6.z.boolean(),
1182
+ source: import_zod6.z.enum(["index", "walk"])
1183
+ });
1184
+ var FsInfoParams = import_zod6.z.strictObject({ path: AbsPath });
1185
+ var FsInfoResult = import_zod6.z.strictObject({
1186
+ entry: FsEntry,
1187
+ created: import_zod6.z.number().min(0).nullable(),
1188
+ // seconds, float
1189
+ owner: import_zod6.z.string().max(256).nullable(),
1190
+ group: import_zod6.z.string().max(256).nullable(),
1191
+ /** A file's logical size, or a folder's whole tree (null when the walk was cut short). */
1192
+ total_size: nonNegInt.nullable(),
1193
+ /** Bytes the OS uses for it on disk (blocks), same bound as total_size. */
1194
+ size_on_disk: nonNegInt.nullable(),
1195
+ /** A folder's own children (not its tree); null for a file. */
1196
+ items: nonNegInt.nullable(),
1197
+ hidden: import_zod6.z.boolean(),
1198
+ /** Finder's Locked (macOS uchg); null where the OS has no such flag. */
1199
+ locked: import_zod6.z.boolean().nullable(),
1200
+ /** The volume holding it refuses writes (a disk image, a read-only share). */
1201
+ read_only: import_zod6.z.boolean()
1202
+ });
1149
1203
  var FsChange = import_zod6.z.strictObject({
1150
1204
  type: import_zod6.z.enum(["created", "modified", "deleted", "moved"]),
1151
1205
  path: AbsPath,
@@ -1366,6 +1420,49 @@ var MlProgress = import_zod10.z.strictObject({
1366
1420
  /** The segment just transcribed (transcribe only): text appears as it is recognised. */
1367
1421
  segment: TranscriptSegment.nullable()
1368
1422
  });
1423
+ var TextModelId = import_zod10.z.enum([
1424
+ "smollm2-135m",
1425
+ "llama-3.2-3b",
1426
+ "phi-4-mini",
1427
+ "gemma-3-4b",
1428
+ "llama-3.1-8b",
1429
+ "qwen-2.5-7b",
1430
+ "mistral-small-3.1",
1431
+ "gpt-oss-20b",
1432
+ "qwen-2.5-coder-7b",
1433
+ "qwen-2.5-coder-14b"
1434
+ ]);
1435
+ var TextModelInfo = import_zod10.z.strictObject({
1436
+ id: TextModelId,
1437
+ /** Download size of the weights. */
1438
+ size_bytes: nonNegInt,
1439
+ installed: import_zod10.z.boolean()
1440
+ });
1441
+ var LlmServerState = import_zod10.z.enum(["stopped", "starting", "running", "failed"]);
1442
+ var LlmRunning = import_zod10.z.strictObject({ id: TextModelId, port: import_zod10.z.int().min(1024).max(65535) });
1443
+ var ModelsLlmStatusParams = import_zod10.z.strictObject({});
1444
+ var ModelsLlmStatusResult = import_zod10.z.strictObject({
1445
+ state: LlmServerState,
1446
+ /** Every model in the catalog, with whether its weights are on this computer. */
1447
+ models: import_zod10.z.array(TextModelInfo).max(64),
1448
+ running: LlmRunning.nullable(),
1449
+ /** The model being loaded while `state` is "starting". */
1450
+ starting: TextModelId.nullable(),
1451
+ /** Non-null while the server program or a model's weights are being downloaded. */
1452
+ install: MlInstallProgress.nullable(),
1453
+ /** Why the last start or download failed, one human line; null otherwise. */
1454
+ error: import_zod10.z.string().max(300).nullable()
1455
+ });
1456
+ var ModelsLlmInstallParams = import_zod10.z.strictObject({ model: TextModelId });
1457
+ var ModelsLlmInstallResult = import_zod10.z.strictObject({ model: TextModelId, elapsed_ms: nonNegInt });
1458
+ var ModelsLlmStartParams = import_zod10.z.strictObject({
1459
+ model: TextModelId,
1460
+ /** Tokens of context; the service picks a size that fits this computer when omitted. */
1461
+ context_length: import_zod10.z.int().min(512).max(131072).optional()
1462
+ });
1463
+ var ModelsLlmStartResult = import_zod10.z.strictObject({ running: LlmRunning, elapsed_ms: nonNegInt });
1464
+ var ModelsLlmStopParams = import_zod10.z.strictObject({});
1465
+ var ModelsLlmStopResult = import_zod10.z.strictObject({ stopped: import_zod10.z.boolean() });
1369
1466
  var MlServiceState = import_zod10.z.enum(["starting", "ready", "restarting", "failed", "stopped"]);
1370
1467
  var MlServiceStatus = import_zod10.z.strictObject({
1371
1468
  state: MlServiceState,
@@ -1847,6 +1944,19 @@ var ProjectMoveGroup = import_zod14.z.strictObject({
1847
1944
  /** A group of that name was already there (reused, never doubled). */
1848
1945
  group_exists: import_zod14.z.boolean().optional()
1849
1946
  });
1947
+ var ProjectMovePin = import_zod14.z.strictObject({
1948
+ ok: import_zod14.z.boolean(),
1949
+ /** "now" = written into the closed window; "next_close" = queued until that window closes. */
1950
+ when: import_zod14.z.enum(["now", "next_close"]),
1951
+ /** Pinned by this call (dry run: would be). */
1952
+ pinned: nonNegInt,
1953
+ /** Already pinned there. */
1954
+ already: nonNegInt,
1955
+ /** Waiting for the window to close (dry run: would wait). */
1956
+ queued: nonNegInt,
1957
+ /** Why not pinned (ok false), or why queued. */
1958
+ reason: import_zod14.z.string().max(400).optional()
1959
+ });
1850
1960
  var AppsProjectsToWindowParams = import_zod14.z.strictObject({
1851
1961
  app_key: AppKey,
1852
1962
  project_id: ChatProjectId,
@@ -1855,6 +1965,8 @@ var AppsProjectsToWindowParams = import_zod14.z.strictObject({
1855
1965
  take_off: import_zod14.z.boolean().default(false),
1856
1966
  /** Also group them under the project's name in that window's sidebar (closed windows only). */
1857
1967
  group: import_zod14.z.boolean().default(false),
1968
+ /** 1.32: also pin them in that window (now if closed, else when it next closes). */
1969
+ pin: import_zod14.z.boolean().optional(),
1858
1970
  dry_run: import_zod14.z.boolean().default(false)
1859
1971
  });
1860
1972
  var AppsProjectsToWindowResult = import_zod14.z.strictObject({
@@ -1868,6 +1980,8 @@ var AppsProjectsToWindowResult = import_zod14.z.strictObject({
1868
1980
  /** Chats of the project from other apps (no windows to place into), left as they are. */
1869
1981
  other_apps: nonNegInt,
1870
1982
  group: ProjectMoveGroup.nullable(),
1983
+ /** 1.32: the pin in the target window (absent: not asked). */
1984
+ pin: ProjectMovePin.optional(),
1871
1985
  message: import_zod14.z.string().max(400)
1872
1986
  });
1873
1987
  var ColdChat = import_zod14.z.strictObject({
@@ -3248,6 +3362,9 @@ var OPS = {
3248
3362
  "fs.write": { params: FsWriteParams, result: FsWriteResult, kind: "unary", since: "1.0", errors: [...FS_ERR, "CONFLICT", "PAYLOAD_TOO_LARGE"] },
3249
3363
  "fs.mkdir": { params: FsMkdirParams, result: FsMkdirResult, kind: "unary", since: "1.0", errors: [...FS_ERR, "CONFLICT"] },
3250
3364
  "fs.move": { params: FsMoveParams, result: FsMoveResult, kind: "unary", since: "1.0", errors: [...FS_ERR, "CONFLICT"] },
3365
+ "fs.copy": { params: FsCopyParams, result: FsCopyResult, kind: "unary", since: "1.30", errors: [...FS_ERR, "CONFLICT"] },
3366
+ "fs.info": { params: FsInfoParams, result: FsInfoResult, kind: "unary", since: "1.30", errors: FS_ERR },
3367
+ "fs.search_index": { params: FsSearchIndexParams, result: FsSearchIndexResult, kind: "unary", since: "1.30", errors: [...FS_ERR, "TIMEOUT"] },
3251
3368
  "fs.delete": { params: FsDeleteParams, result: FsDeleteResult, kind: "unary", since: "1.0", errors: FS_ERR },
3252
3369
  "fs.watch": { params: FsWatchParams, result: FsWatchResult, kind: "resource", since: "1.0", errors: [...FS_ERR, "RATE_LIMITED"] },
3253
3370
  "fs.patch": { params: FsPatchParams, result: FsPatchResult, kind: "unary", since: "1.0", errors: [...FS_ERR, "CONFLICT"] },
@@ -3268,6 +3385,10 @@ var OPS = {
3268
3385
  "models.status": { params: ModelsStatusParams, result: ModelsStatusResult, kind: "unary", since: "1.2", errors: ["INTERNAL"] },
3269
3386
  "models.install": { params: ModelsInstallParams, result: ModelsInstallResult, kind: "unary", since: "1.2", errors: ["RESOURCE_BUSY", "RESOURCE_GONE", "TIMEOUT", "CANCELLED", "INTERNAL"] },
3270
3387
  "models.transcribe": { params: ModelsTranscribeParams, result: ModelsTranscribeResult, kind: "unary", since: "1.2", errors: ["NOT_FOUND", "INVALID_PARAMS", "PERMISSION_DENIED_OS", "RESOURCE_BUSY", "RESOURCE_GONE", "CANCELLED", "PAYLOAD_TOO_LARGE", "INTERNAL"] },
3388
+ "models.llm.status": { params: ModelsLlmStatusParams, result: ModelsLlmStatusResult, kind: "unary", since: "1.31", errors: ["INTERNAL"] },
3389
+ "models.llm.install": { params: ModelsLlmInstallParams, result: ModelsLlmInstallResult, kind: "unary", since: "1.31", errors: ["RESOURCE_BUSY", "RESOURCE_GONE", "TIMEOUT", "CANCELLED", "PLATFORM_UNSUPPORTED", "INTERNAL"] },
3390
+ "models.llm.start": { params: ModelsLlmStartParams, result: ModelsLlmStartResult, kind: "unary", since: "1.31", errors: ["NOT_FOUND", "RESOURCE_BUSY", "RESOURCE_GONE", "TIMEOUT", "CANCELLED", "PLATFORM_UNSUPPORTED", "INTERNAL"] },
3391
+ "models.llm.stop": { params: ModelsLlmStopParams, result: ModelsLlmStopResult, kind: "unary", since: "1.31", errors: ["INTERNAL"] },
3271
3392
  // Desktop apps and their profiles (SPEC §6 apps); profiles are rows in users.desktop_app_profile.
3272
3393
  "apps.list": { params: AppsListParams, result: AppsListResult, kind: "unary", since: "1.2", errors: ["INTERNAL"] },
3273
3394
  "apps.profiles.list": { params: AppsProfilesListParams, result: AppsProfilesListResult, kind: "unary", since: "1.2", errors: ["NOT_FOUND", "INVALID_PARAMS", "INTERNAL"] },
@@ -3418,7 +3539,11 @@ var SERVICES = {
3418
3539
  ops: {
3419
3540
  "ml.status": { params: MlStatusParams, result: MlStatusResult },
3420
3541
  "ml.install": { params: ModelsInstallParams, result: ModelsInstallResult },
3421
- "ml.transcribe": { params: ModelsTranscribeParams, result: ModelsTranscribeResult }
3542
+ "ml.transcribe": { params: ModelsTranscribeParams, result: ModelsTranscribeResult },
3543
+ "ml.llm_status": { params: ModelsLlmStatusParams, result: ModelsLlmStatusResult },
3544
+ "ml.llm_install": { params: ModelsLlmInstallParams, result: ModelsLlmInstallResult },
3545
+ "ml.llm_start": { params: ModelsLlmStartParams, result: ModelsLlmStartResult },
3546
+ "ml.llm_stop": { params: ModelsLlmStopParams, result: ModelsLlmStopResult }
3422
3547
  }
3423
3548
  },
3424
3549
  coding: {
@@ -3488,6 +3613,12 @@ var NAMED_SCHEMAS = {
3488
3613
  FsMkdirResult,
3489
3614
  FsMoveParams,
3490
3615
  FsMoveResult,
3616
+ FsCopyParams,
3617
+ FsCopyResult,
3618
+ FsInfoParams,
3619
+ FsInfoResult,
3620
+ FsSearchIndexParams,
3621
+ FsSearchIndexResult,
3491
3622
  FsDeleteParams,
3492
3623
  FsDeleteResult,
3493
3624
  FsWatchParams,
@@ -3546,6 +3677,18 @@ var NAMED_SCHEMAS = {
3546
3677
  ModelsStatusParams,
3547
3678
  ModelsStatusResult,
3548
3679
  ModelsProgressEvent,
3680
+ TextModelId,
3681
+ TextModelInfo,
3682
+ LlmServerState,
3683
+ LlmRunning,
3684
+ ModelsLlmStatusParams,
3685
+ ModelsLlmStatusResult,
3686
+ ModelsLlmInstallParams,
3687
+ ModelsLlmInstallResult,
3688
+ ModelsLlmStartParams,
3689
+ ModelsLlmStartResult,
3690
+ ModelsLlmStopParams,
3691
+ ModelsLlmStopResult,
3549
3692
  CodingServiceCredentials,
3550
3693
  CodingHistoryBlocked,
3551
3694
  CodingHistoryFailure,
@@ -3785,6 +3928,7 @@ var NAMED_SCHEMAS = {
3785
3928
  ProjectMoveChat,
3786
3929
  ProjectMoveSkip,
3787
3930
  ProjectMoveGroup,
3931
+ ProjectMovePin,
3788
3932
  AppsProjectsToWindowParams,
3789
3933
  AppsProjectsToWindowResult,
3790
3934
  ShownSection,
@@ -3919,7 +4063,9 @@ var FIELDS_SINCE = {
3919
4063
  ScreenDisplay: { rotation: "1.24", refresh_hz: "1.24", builtin: "1.24" },
3920
4064
  PowerStatusResult: { energy: "1.24" },
3921
4065
  AppsSpendResult: { days: "1.24" },
3922
- AppsWindowsUpdateStateResult: { closed_by_update: "1.27" }
4066
+ AppsWindowsUpdateStateResult: { closed_by_update: "1.27" },
4067
+ AppsProjectsToWindowParams: { pin: "1.32" },
4068
+ AppsProjectsToWindowResult: { pin: "1.32" }
3923
4069
  };
3924
4070
  var NULL_SINCE = {
3925
4071
  "RelayDeviceStatusEvent.since_ms": { since: "1.1", olderPeersGet: 0 }
@@ -4055,7 +4201,7 @@ function forPeer(op, part, value, version) {
4055
4201
  var VERSIONED_RESULT_OPS = [.../* @__PURE__ */ new Set([...RESULT_PATH.keys(), ...WINDOW_RESULTS.keys(), ...NESTED_RESULTS.keys()])];
4056
4202
 
4057
4203
  // src/contract.ts
4058
- var CONTRACT_SHA256 = "5994ab9f6c2dba636a90e18c99bd3a90736f23782b3f8df9e0d2d7234b8e2b1b";
4204
+ var CONTRACT_SHA256 = "ee8e6c98c76f3557f832157e3b2b21bb23ebb74b67b79151f3b9ff788f5273ee";
4059
4205
 
4060
4206
  // src/close-policy.ts
4061
4207
  var CLOSE_RULES = {
@@ -4112,6 +4258,7 @@ var TOOL_CATALOG = [
4112
4258
  { name: "desktop_system", group: "os_control", state: "built", path: "device_op", ops: ["sysinfo.get", "sysinfo.hardware", "system.open_url", "system.open_path", "system.open_settings", "system.notify"], platforms: ALL, summary: "System facts, open, notify" },
4113
4259
  { name: "desktop_clipboard", group: "os_control", state: "built", path: "device_op", ops: ["clipboard.read", "clipboard.write"], platforms: ALL, summary: "Read and write the clipboard's text" },
4114
4260
  { name: "desktop_screen", group: "os_control", state: "built", path: "device_op", ops: ["screen.list", "screen.capture"], platforms: ALL, summary: "Displays and screenshots" },
4261
+ { name: "desktop_browser", group: "os_control", state: "built", path: "device_op", ops: ["browser.sessions", "browser.call"], platforms: ALL, summary: "The person's own browser through the AI Matrx extension: tabs, read, screenshot, navigate, click, type" },
4115
4262
  { name: "desktop_window", group: "os_control", state: "built", path: "device_op", ops: ["window.list", "window.focus", "window.move", "window.minimize"], platforms: ALL, summary: "Find, focus and arrange windows" },
4116
4263
  { name: "desktop_input", group: "os_control", state: "built", path: "device_op", ops: ["input.type_text", "input.hotkey", "input.mouse_click", "input.mouse_move", "input.keyboard_settings", "input.set_keyboard_settings"], platforms: ALL, summary: "Keyboard and mouse" },
4117
4264
  { name: "desktop_audio", group: "os_control", state: "built", path: "device_op", ops: ["audio.devices", "audio.levels", "audio.set_levels", "audio.record", "audio.play"], platforms: ALL, summary: "Audio devices, record, play" },
@@ -4194,14 +4341,15 @@ var LEGACY_ACTIONS = {
4194
4341
  "local_system.open_url": tool("desktop_system"),
4195
4342
  "local_system.open_path": tool("desktop_system"),
4196
4343
  "local_system.notify": tool("desktop_system"),
4197
- "local_browser.navigate": dropped("The browser agent is the extension (matrx-extend) and the cloud browser; a second Playwright on the device duplicates it"),
4198
- "local_browser.click": dropped("The browser agent is the extension (matrx-extend) and the cloud browser"),
4199
- "local_browser.type_text": dropped("The browser agent is the extension (matrx-extend) and the cloud browser"),
4200
- "local_browser.extract": dropped("The browser agent is the extension (matrx-extend) and the cloud browser"),
4201
- "local_browser.screenshot": dropped("The browser agent is the extension (matrx-extend) and the cloud browser"),
4202
- "local_browser.eval": dropped("The browser agent is the extension (matrx-extend) and the cloud browser"),
4203
- "local_browser.tabs": dropped("The browser agent is the extension (matrx-extend) and the cloud browser"),
4204
- "local_browser.close": dropped("The browser agent is the extension (matrx-extend) and the cloud browser"),
4344
+ // The person's own browser is the AI Matrx extension paired with Matrx 2 (cap browser).
4345
+ "local_browser.navigate": tool("desktop_browser"),
4346
+ "local_browser.click": tool("desktop_browser"),
4347
+ "local_browser.type_text": tool("desktop_browser"),
4348
+ "local_browser.extract": tool("desktop_browser"),
4349
+ "local_browser.screenshot": tool("desktop_browser"),
4350
+ "local_browser.eval": dropped("The extension runs no page script for Matrx 2: its script and cdp tools are privileged and refused over the desktop path; read, click and type cover what eval was used for"),
4351
+ "local_browser.tabs": tool("desktop_browser"),
4352
+ "local_browser.close": tool("desktop_browser"),
4205
4353
  "local_web.fetch": tool("desktop_web"),
4206
4354
  "local_web.fetch_with_browser": tool("desktop_web"),
4207
4355
  "local_web.scrape": tool("desktop_web"),
@@ -4397,4 +4545,27 @@ function renderToolStatusMarkdown(status) {
4397
4545
  }
4398
4546
  return lines.join("\n");
4399
4547
  }
4548
+
4549
+ // src/tools/policy.ts
4550
+ function refusedOps(disabledTools) {
4551
+ const off = new Set(disabledTools);
4552
+ const senders = /* @__PURE__ */ new Map();
4553
+ for (const tool2 of TOOL_CATALOG) for (const op of tool2.ops) senders.set(op, [...senders.get(op) ?? [], tool2.name]);
4554
+ const refused = /* @__PURE__ */ new Set();
4555
+ for (const [op, tools] of senders) if (tools.every((t) => off.has(t))) refused.add(op);
4556
+ return refused;
4557
+ }
4558
+ function toolsSending(op) {
4559
+ return TOOL_CATALOG.filter((t) => t.ops.includes(op)).map((t) => t.name);
4560
+ }
4561
+ function sharedOpsBlocking(tool2, disabledTools) {
4562
+ const entry = TOOL_CATALOG.find((t) => t.name === tool2);
4563
+ if (!entry || entry.ops.length === 0) return [];
4564
+ const off = /* @__PURE__ */ new Set([...disabledTools, tool2]);
4565
+ const refused = refusedOps([...off]);
4566
+ if (entry.ops.some((op) => refused.has(op))) return [];
4567
+ const keepers = /* @__PURE__ */ new Set();
4568
+ for (const op of entry.ops) for (const other of TOOL_CATALOG) if (other.name !== tool2 && !off.has(other.name) && other.ops.includes(op)) keepers.add(other.name);
4569
+ return [...keepers].sort();
4570
+ }
4400
4571
  //# sourceMappingURL=index.cjs.map