@ai-matrx/desktop-protocol 0.21.90 → 0.21.92

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.js CHANGED
@@ -14,7 +14,7 @@ import {
14
14
  negotiate,
15
15
  statusForPeer,
16
16
  versionSubprotocol
17
- } from "./chunk-server-WAAD7CFE.js";
17
+ } from "./chunk-server-YUJXCEFI.js";
18
18
  import {
19
19
  AccountAgent,
20
20
  AccountAgentDetail,
@@ -50,6 +50,48 @@ import {
50
50
  AccountVaultCopyResult,
51
51
  AccountVaultListParams,
52
52
  AccountVaultListResult,
53
+ ActionNeededAnswer,
54
+ ActionNeededAnswerEntry,
55
+ ActionNeededAnswerOutcome,
56
+ ActionNeededAnswerParams,
57
+ ActionNeededAnswerResult,
58
+ ActionNeededCancelParams,
59
+ ActionNeededCancelResult,
60
+ ActionNeededChangedEvent,
61
+ ActionNeededChoice,
62
+ ActionNeededDismissParams,
63
+ ActionNeededDismissResult,
64
+ ActionNeededGetParams,
65
+ ActionNeededGetResult,
66
+ ActionNeededItem,
67
+ ActionNeededKind,
68
+ ActionNeededListParams,
69
+ ActionNeededListResult,
70
+ ActionNeededRaiseParams,
71
+ ActionNeededRaiseResult,
72
+ ActionNeededRemedy,
73
+ ActionNeededStatus,
74
+ ActionNeededWaitParams,
75
+ ActionNeededWaitResult,
76
+ ActivityDropped,
77
+ ActivityHttp,
78
+ ActivityLevel,
79
+ ActivityLine,
80
+ ActivitySource,
81
+ ActivityTool,
82
+ AgentAssetCount,
83
+ AgentAssetFact,
84
+ AgentAssetKind,
85
+ AgentAssetLink,
86
+ AgentAssetOrigin,
87
+ AgentAssetRow,
88
+ AgentAssetTool,
89
+ AgentInstallParams,
90
+ AgentServiceProgress,
91
+ AgentServiceState,
92
+ AgentServiceStateName,
93
+ AgentStartParams,
94
+ AgentStatusParams,
53
95
  AppAccount,
54
96
  AppFeatureStatus,
55
97
  AppInfo,
@@ -246,6 +288,10 @@ import {
246
288
  CodingAgentSetResult,
247
289
  CodingAgentsAccessParams,
248
290
  CodingAgentsAccessResult,
291
+ CodingAssetsGetParams,
292
+ CodingAssetsGetResult,
293
+ CodingAssetsListParams,
294
+ CodingAssetsListResult,
249
295
  CodingChangedEvent,
250
296
  CodingChatPreference,
251
297
  CodingClientRequestId,
@@ -351,6 +397,11 @@ import {
351
397
  DISCOVERY_FILE,
352
398
  DOCUMENTS_MAX_TEXT_CHARS,
353
399
  DesktopHealth,
400
+ DiagActivityClearParams,
401
+ DiagActivityClearResult,
402
+ DiagActivityLinesEvent,
403
+ DiagActivityListParams,
404
+ DiagActivityListResult,
354
405
  DiagErrorEntry,
355
406
  DiagErrorKind,
356
407
  DiagErrorStatus,
@@ -868,7 +919,7 @@ import {
868
919
  WindowsServiceControlResult,
869
920
  WindowsServicesParams,
870
921
  WindowsServicesResult
871
- } from "./chunk-server-6SXF6ZJA.js";
922
+ } from "./chunk-server-AANZ3QIC.js";
872
923
  import {
873
924
  AbsPath,
874
925
  BEARER_PREFIX,
@@ -915,7 +966,7 @@ import {
915
966
  epochMs,
916
967
  nonNegInt,
917
968
  u32
918
- } from "./chunk-server-YNRFJNST.js";
969
+ } from "./chunk-server-WSXKBBEB.js";
919
970
  import {
920
971
  BROADCAST_CID,
921
972
  DesktopProtocolError,
@@ -936,7 +987,7 @@ import {
936
987
  } from "./chunk-server-OVLU5III.js";
937
988
 
938
989
  // src/contract.ts
939
- var CONTRACT_SHA256 = "4a4618c98fed42dea8316d756cf0a95cd6b0bbe1d5d8458b09efed2a071475b0";
990
+ var CONTRACT_SHA256 = "f2d7caf22aabba11530c3f2eb4d4341a58df82ac2c5d58e95bbde3f692865df5";
940
991
 
941
992
  // src/tools/catalog.ts
942
993
  var TOOL_GROUPS = [
@@ -966,6 +1017,7 @@ var TOOL_CATALOG = [
966
1017
  { name: "desktop_apps", group: "os_control", state: "built", path: "device_op", ops: ["apps.list", "apps.open"], platforms: ALL, summary: "Installed apps; open or bring one forward" },
967
1018
  { 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" },
968
1019
  { 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" },
1020
+ { name: "desktop_action_needed", group: "os_control", state: "built", path: "device_op", ops: ["action_needed.raise", "action_needed.wait", "action_needed.get", "action_needed.cancel", "action_needed.list"], platforms: ALL, summary: "Ask the person for an answer, a pick, an approval, a sign-in, a file or a permission; wait for or poll the answer" },
969
1021
  { name: "desktop_screen", group: "os_control", state: "built", path: "device_op", ops: ["screen.list", "screen.capture"], platforms: ALL, summary: "Displays and screenshots" },
970
1022
  { 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" },
971
1023
  { 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" },
@@ -989,7 +1041,7 @@ var TOOL_CATALOG = [
989
1041
  { name: "desktop_schedule", group: "personal_automation", state: "built", path: "device_op", ops: ["schedule.create", "schedule.list", "schedule.cancel"], platforms: ALL, summary: "Run a tool's op on this computer on an interval; list and cancel" },
990
1042
  // 1.38, code from anywhere: the person's Claude Code and Codex sessions on this computer. Turning
991
1043
  // either off in Agents › Tools refuses its ops on every relay connection (the existing switch).
992
- { name: "coding_sessions_read", group: "personal_automation", state: "built", path: "device_op", ops: ["coding.providers", "coding.sessions.list", "coding.discover", "coding.runs.list", "coding.history", "coding.transcript.read", "coding.item.full", "coding.activity", "coding.folders.recent", "coding.folders.check", "coding.agents.access", "coding.titles.status", "coding.prefs.list", "coding.recent.seen", "coding.search", "coding.transcript.raw", "coding.watch", "coding.session.watch"], platforms: ALL, summary: "Claude Code and Codex sessions: list, read live, search, download" },
1044
+ { name: "coding_sessions_read", group: "personal_automation", state: "built", path: "device_op", ops: ["coding.providers", "coding.sessions.list", "coding.discover", "coding.runs.list", "coding.history", "coding.transcript.read", "coding.item.full", "coding.activity", "coding.folders.recent", "coding.folders.check", "coding.agents.access", "coding.titles.status", "coding.prefs.list", "coding.recent.seen", "coding.search", "coding.transcript.raw", "coding.watch", "coding.session.watch", "coding.assets.list", "coding.assets.get"], platforms: ALL, summary: "Claude Code and Codex sessions: list, read live, search, download; the agents' memories and instructions" },
993
1045
  { name: "coding_sessions_drive", group: "personal_automation", state: "built", path: "device_op", ops: ["coding.start", "coding.takeover", "coding.send", "coding.stop", "coding.stop_elsewhere", "coding.options.set", "coding.account.continue", "coding.agent.set", "coding.folders.create", "coding.prefs.set", "coding.reconcile"], platforms: ALL, summary: "Claude Code and Codex sessions: start, send, stop, take over, rename" },
994
1046
  // ── 4. Documents, notes and entities (1.37: the core's `documents` and `notes` owners; desktop_web is the `tools` service) ──
995
1047
  { 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" },
@@ -1343,6 +1395,48 @@ export {
1343
1395
  AccountVaultCopyResult,
1344
1396
  AccountVaultListParams,
1345
1397
  AccountVaultListResult,
1398
+ ActionNeededAnswer,
1399
+ ActionNeededAnswerEntry,
1400
+ ActionNeededAnswerOutcome,
1401
+ ActionNeededAnswerParams,
1402
+ ActionNeededAnswerResult,
1403
+ ActionNeededCancelParams,
1404
+ ActionNeededCancelResult,
1405
+ ActionNeededChangedEvent,
1406
+ ActionNeededChoice,
1407
+ ActionNeededDismissParams,
1408
+ ActionNeededDismissResult,
1409
+ ActionNeededGetParams,
1410
+ ActionNeededGetResult,
1411
+ ActionNeededItem,
1412
+ ActionNeededKind,
1413
+ ActionNeededListParams,
1414
+ ActionNeededListResult,
1415
+ ActionNeededRaiseParams,
1416
+ ActionNeededRaiseResult,
1417
+ ActionNeededRemedy,
1418
+ ActionNeededStatus,
1419
+ ActionNeededWaitParams,
1420
+ ActionNeededWaitResult,
1421
+ ActivityDropped,
1422
+ ActivityHttp,
1423
+ ActivityLevel,
1424
+ ActivityLine,
1425
+ ActivitySource,
1426
+ ActivityTool,
1427
+ AgentAssetCount,
1428
+ AgentAssetFact,
1429
+ AgentAssetKind,
1430
+ AgentAssetLink,
1431
+ AgentAssetOrigin,
1432
+ AgentAssetRow,
1433
+ AgentAssetTool,
1434
+ AgentInstallParams,
1435
+ AgentServiceProgress,
1436
+ AgentServiceState,
1437
+ AgentServiceStateName,
1438
+ AgentStartParams,
1439
+ AgentStatusParams,
1346
1440
  AppAccount,
1347
1441
  AppFeatureStatus,
1348
1442
  AppInfo,
@@ -1548,6 +1642,10 @@ export {
1548
1642
  CodingAgentSetResult,
1549
1643
  CodingAgentsAccessParams,
1550
1644
  CodingAgentsAccessResult,
1645
+ CodingAssetsGetParams,
1646
+ CodingAssetsGetResult,
1647
+ CodingAssetsListParams,
1648
+ CodingAssetsListResult,
1551
1649
  CodingChangedEvent,
1552
1650
  CodingChatPreference,
1553
1651
  CodingClientRequestId,
@@ -1660,6 +1758,11 @@ export {
1660
1758
  DesktopHealth,
1661
1759
  DesktopProtocolError,
1662
1760
  DeviceId,
1761
+ DiagActivityClearParams,
1762
+ DiagActivityClearResult,
1763
+ DiagActivityLinesEvent,
1764
+ DiagActivityListParams,
1765
+ DiagActivityListResult,
1663
1766
  DiagErrorEntry,
1664
1767
  DiagErrorKind,
1665
1768
  DiagErrorStatus,
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/contract.ts","../src/tools/catalog.ts","../src/tools/status.ts","../src/tools/policy.ts"],"sourcesContent":["// AUTO-GENERATED by scripts/generate.ts — DO NOT EDIT. `pnpm generate --check` fails on any hand edit.\n/** SHA-256 of generated/desktop-protocol.schema.json: the contract both sides of a service connection were built from. */\nexport const CONTRACT_SHA256 = \"4a4618c98fed42dea8316d756cf0a95cd6b0bbe1d5d8458b09efed2a071475b0\" as const;\n","/**\n * The local tool catalog (SPEC §10): every tool a platform agent calls on a person's computer, the\n * protocol ops it reaches, the group it ships in, and what became of each of matrx-local's 139\n * handlers (120 actions + the 19 action-enum dispatchers that fanned out to them).\n *\n * Data only. The status table (./status.ts) joins it with the harnesses' results, so a tool listed\n * here with no passing result reads \"untested\", never \"working\". Design and the reasons behind each\n * group: matrx-desktop/design/local-tools.md.\n */\nimport type { OpName } from \"../schema/registry\";\nimport type { ToolPlatform } from \"../schema/tools\";\n\nexport type ToolGroupId = \"files_shell\" | \"os_control\" | \"personal_automation\" | \"tools_service\" | \"ml_service\" | \"windows_admin\";\n\nexport interface ToolGroup {\n readonly id: ToolGroupId;\n readonly order: number;\n readonly title: string;\n /** Who implements the ops: a TS capability owner in the core, or a Python service. */\n readonly owner: \"core\" | \"python_tools\" | \"python_ml\";\n}\n\nexport const TOOL_GROUPS: readonly ToolGroup[] = [\n { id: \"files_shell\", order: 1, title: \"Files and shell\", owner: \"core\" },\n { id: \"os_control\", order: 2, title: \"Computer control\", owner: \"core\" },\n { id: \"personal_automation\", order: 3, title: \"Personal apps and automation\", owner: \"core\" },\n { id: \"tools_service\", order: 4, title: \"Web, documents, OCR and entities\", owner: \"python_tools\" },\n { id: \"ml_service\", order: 5, title: \"Speech\", owner: \"python_ml\" },\n { id: \"windows_admin\", order: 6, title: \"Windows administration\", owner: \"core\" },\n];\n\n/**\n * How an agent's call reaches the device. Both end at the relay's `POST /v1/devices/{id}/call`:\n * - `sandbox_proxy`: the cloud-sandbox-shaped tools (fs_*, shell_*). matrx-ai's `_sandbox_proxy`\n * calls aidream `/api/local-proxy/{device}/{fs|search|exec}/…`, which maps the route to its op.\n * Agent code never knows a laptop from a cloud box (SPEC §6.1).\n * - `device_op`: desktop-only capabilities. One generic route, `/api/local-proxy/{device}/op/{cap.op}`,\n * params and result exactly the op's schema; the tool definition is generated from that schema.\n * - `server`: runs on the aidream server even when the turn is bound to a device (a defect when\n * the tool reads a local path; see `note`).\n */\nexport type ToolPath = \"sandbox_proxy\" | \"device_op\" | \"server\";\n\n/** `built`: the ops exist in the protocol and Matrx 2's core serves them (registered on the platform for agents with the server tool); `planned`: designed, not built; `broken`: registered but wrong on a device. */\nexport type ToolState = \"built\" | \"planned\" | \"broken\";\n\nexport interface CatalogTool {\n /** The platform registry name (`tool.definition.name`). */\n readonly name: string;\n readonly group: ToolGroupId;\n readonly state: ToolState;\n readonly path: ToolPath;\n /** Ops the tool sends. For `built` tools every one is in OPS (a test enforces it). */\n readonly ops: readonly string[];\n readonly platforms: readonly ToolPlatform[];\n /** One line for the status table. */\n readonly summary: string;\n /** Required for `broken`: what is wrong. */\n readonly note?: string;\n}\n\nconst ALL: readonly ToolPlatform[] = [\"darwin\", \"win32\", \"linux\"];\n\nexport const TOOL_CATALOG: readonly CatalogTool[] = [\n // ── 1. Files and shell (core `fs`, `exec`; the cloud sandbox's agent tools) ──────────────────\n { name: \"fs_read\", group: \"files_shell\", state: \"built\", path: \"sandbox_proxy\", ops: [\"fs.read\"], platforms: ALL, summary: \"Read a file, paged\" },\n { name: \"fs_write\", group: \"files_shell\", state: \"built\", path: \"sandbox_proxy\", ops: [\"fs.read\", \"fs.write\"], platforms: ALL, summary: \"Create or overwrite a file\" },\n { name: \"fs_edit\", group: \"files_shell\", state: \"built\", path: \"sandbox_proxy\", ops: [\"fs.read\", \"fs.patch\"], platforms: ALL, summary: \"Replace one exact string\" },\n { name: \"fs_patch\", group: \"files_shell\", state: \"built\", path: \"sandbox_proxy\", ops: [\"fs.read\", \"fs.patch\"], platforms: ALL, summary: \"Apply several exact edits at once\" },\n { name: \"fs_list\", group: \"files_shell\", state: \"built\", path: \"sandbox_proxy\", ops: [\"fs.list\"], platforms: ALL, summary: \"List a folder\" },\n { name: \"fs_mkdir\", group: \"files_shell\", state: \"built\", path: \"sandbox_proxy\", ops: [\"fs.mkdir\"], platforms: ALL, summary: \"Create a folder\" },\n { name: \"fs_search\", group: \"files_shell\", state: \"built\", path: \"sandbox_proxy\", ops: [\"fs.search_paths\", \"fs.search_content\"], platforms: ALL, summary: \"Find files by name or content\" },\n { name: \"shell_execute\", group: \"files_shell\", state: \"built\", path: \"sandbox_proxy\", ops: [\"exec.run\"], platforms: ALL, summary: \"Run a command; cd carries over\" },\n { name: \"shell_python\", group: \"files_shell\", state: \"built\", path: \"sandbox_proxy\", ops: [\"exec.run\"], platforms: ALL, summary: \"Run a Python script\" },\n { name: \"desktop_git\", group: \"files_shell\", state: \"built\", path: \"device_op\", ops: [\"git.status\", \"git.diff\", \"git.log\", \"git.add\", \"git.commit\", \"git.push\", \"git.pull\", \"git.branch\", \"git.stash\", \"git.clone\"], platforms: ALL, summary: \"Git: status, diff, log, commit, branches, push and pull\" },\n { name: \"shell_job\", group: \"files_shell\", state: \"built\", path: \"device_op\", ops: [\"exec.job.start\", \"exec.job.output\", \"exec.job.stop\", \"exec.job.list\"], platforms: ALL, summary: \"Background commands: start, read output, stop\" },\n\n // ── 2. Computer control (TS owners) ──────────────────────────────────────────────────────────\n { name: \"desktop_process\", group: \"os_control\", state: \"built\", path: \"device_op\", ops: [\"proc.list\", \"proc.ports\", \"proc.kill\"], platforms: ALL, summary: \"Running processes and ports; stop one\" },\n { name: \"desktop_apps\", group: \"os_control\", state: \"built\", path: \"device_op\", ops: [\"apps.list\", \"apps.open\"], platforms: ALL, summary: \"Installed apps; open or bring one forward\" },\n { 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\" },\n { 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\" },\n { name: \"desktop_screen\", group: \"os_control\", state: \"built\", path: \"device_op\", ops: [\"screen.list\", \"screen.capture\"], platforms: ALL, summary: \"Displays and screenshots\" },\n { 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\" },\n { 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\" },\n { 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\" },\n { 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\" },\n { name: \"desktop_power\", group: \"os_control\", state: \"built\", path: \"device_op\", ops: [\"power.status\", \"power.history\", \"power.prevent_sleep\"], platforms: ALL, summary: \"Battery and keep awake\" },\n { name: \"desktop_resources\", group: \"os_control\", state: \"built\", path: \"device_op\", ops: [\"resources.snapshot\", \"resources.activity\", \"resources.stop_job\", \"resources.incidents\"], platforms: ALL, summary: \"CPU, memory and disk use; what is using them, grouped into jobs; stop a job; the slowdown log\" },\n { name: \"fs_watch\", group: \"os_control\", state: \"built\", path: \"device_op\", ops: [\"fs.watch.start\", \"fs.watch.events\", \"fs.watch.stop\"], platforms: ALL, summary: \"Watch a folder; read what changed\" },\n\n // ── 3. Personal apps and automation (1.37: the core's `automation`, `personal`, `net` and `schedule` owners) ──\n { name: \"desktop_automation\", group: \"personal_automation\", state: \"built\", path: \"device_op\", ops: [\"automation.script\"], platforms: [\"darwin\", \"win32\"], summary: \"AppleScript or JavaScript for Automation on a Mac, PowerShell on Windows\" },\n { name: \"desktop_mail\", group: \"personal_automation\", state: \"built\", path: \"device_op\", ops: [\"mail.accounts\", \"mail.list\", \"mail.send\"], platforms: [\"darwin\"], summary: \"The Mail app: accounts, messages, send\" },\n { name: \"desktop_outlook\", group: \"personal_automation\", state: \"built\", path: \"device_op\", ops: [\"outlook.status\", \"outlook.draft\", \"outlook.list\", \"outlook.read\"], platforms: [\"win32\"], summary: \"The person's own Outlook: drafts with attachments, recent mail, one message\" },\n { name: \"desktop_messages\", group: \"personal_automation\", state: \"built\", path: \"device_op\", ops: [\"messages.chats\", \"messages.list\", \"messages.send\"], platforms: [\"darwin\"], summary: \"The Messages app: chats, messages, send\" },\n { name: \"desktop_contacts\", group: \"personal_automation\", state: \"built\", path: \"device_op\", ops: [\"contacts.search\", \"contacts.get\"], platforms: [\"darwin\"], summary: \"Contacts: search, one card\" },\n { name: \"desktop_calendar\", group: \"personal_automation\", state: \"built\", path: \"device_op\", ops: [\"calendar.list\", \"calendar.create\", \"reminders.list\", \"reminders.create\"], platforms: [\"darwin\"], summary: \"Calendar and Reminders: list and add\" },\n { name: \"desktop_photos\", group: \"personal_automation\", state: \"built\", path: \"device_op\", ops: [\"photos.search\", \"photos.get\"], platforms: [\"darwin\"], summary: \"The Photos library: find, export an original\" },\n // Windows comes back once a Windows location fix is proven (plan attack retire-local 2026-10-12, B6):\n // until then local_mac_apps (macOS-only) is judged on macOS and nothing claims Windows.\n { name: \"desktop_location\", group: \"personal_automation\", state: \"built\", path: \"device_op\", ops: [\"location.get\"], platforms: [\"darwin\"], summary: \"Where the computer is (the OS's location service)\" },\n { name: \"desktop_net\", group: \"personal_automation\", state: \"built\", path: \"device_op\", ops: [\"net.info\", \"net.wifi\", \"net.bluetooth\", \"net.devices\", \"net.mdns\", \"net.scan\", \"net.download\"], platforms: ALL, summary: \"Local network, Wi-Fi, Bluetooth, open ports and downloads\" },\n { name: \"desktop_schedule\", group: \"personal_automation\", state: \"built\", path: \"device_op\", ops: [\"schedule.create\", \"schedule.list\", \"schedule.cancel\"], platforms: ALL, summary: \"Run a tool's op on this computer on an interval; list and cancel\" },\n // 1.38, code from anywhere: the person's Claude Code and Codex sessions on this computer. Turning\n // either off in Agents › Tools refuses its ops on every relay connection (the existing switch).\n { name: \"coding_sessions_read\", group: \"personal_automation\", state: \"built\", path: \"device_op\", ops: [\"coding.providers\", \"coding.sessions.list\", \"coding.discover\", \"coding.runs.list\", \"coding.history\", \"coding.transcript.read\", \"coding.item.full\", \"coding.activity\", \"coding.folders.recent\", \"coding.folders.check\", \"coding.agents.access\", \"coding.titles.status\", \"coding.prefs.list\", \"coding.recent.seen\", \"coding.search\", \"coding.transcript.raw\", \"coding.watch\", \"coding.session.watch\"], platforms: ALL, summary: \"Claude Code and Codex sessions: list, read live, search, download\" },\n { name: \"coding_sessions_drive\", group: \"personal_automation\", state: \"built\", path: \"device_op\", ops: [\"coding.start\", \"coding.takeover\", \"coding.send\", \"coding.stop\", \"coding.stop_elsewhere\", \"coding.options.set\", \"coding.account.continue\", \"coding.agent.set\", \"coding.folders.create\", \"coding.prefs.set\", \"coding.reconcile\"], platforms: ALL, summary: \"Claude Code and Codex sessions: start, send, stop, take over, rename\" },\n\n // ── 4. Documents, notes and entities (1.37: the core's `documents` and `notes` owners; desktop_web is the `tools` service) ──\n { 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\" },\n { 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)\" },\n { 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\" },\n // matrx-local's SemanticFindPaths: needs a local embedding index of this computer's files and an\n // embedding model on the device; neither exists yet, so it is Coming soon on Agents › Tools.\n { 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)\" },\n { 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\" },\n\n // ── 5. Python `ml` service ───────────────────────────────────────────────────────────────────\n // Built: models.transcribe through local_proxy's POST /op/{cap.op} (matrx-ai implementations/desktop.py).\n // Whisper detects the language itself, so matrx-local's speech_locales needs no op of its own.\n { name: \"desktop_transcribe\", group: \"ml_service\", state: \"built\", path: \"device_op\", ops: [\"models.transcribe\"], platforms: ALL, summary: \"Speech to text on the device\" },\n\n // ── 6. Windows administration ────────────────────────────────────────────────────────────────\n { name: \"desktop_windows_admin\", group: \"windows_admin\", state: \"built\", path: \"device_op\", ops: [\"windows.registry_read\", \"windows.registry_write\", \"windows.services\", \"windows.service_control\", \"windows.event_log\", \"windows.features\"], platforms: [\"win32\"], summary: \"Registry, services, event log, optional features\" },\n];\n\n/**\n * Tools armed with a device binding that are deliberately NOT device tools, each with its reason.\n * They run on the server; the status table does not track them.\n */\nexport const EXCLUDED_TOOLS: Readonly<Record<string, string>> = {\n git_ingest:\n \"Runs on the server: it ingests repository URLs. A local path on a bound computer or sandbox is refused with the fs_* and shell remedy, since the server cannot see it\",\n};\n\n/** What became of one matrx-local handler. */\nexport type LegacyDisposition =\n | { readonly kind: \"tool\"; readonly tool: string }\n | { readonly kind: \"dropped\"; readonly reason: string };\n\nconst tool = (name: string): LegacyDisposition => ({ kind: \"tool\", tool: name });\nconst dropped = (reason: string): LegacyDisposition => ({ kind: \"dropped\", reason });\n\nconst SHELL_COVERS = \"Done with shell_execute (mv, cp, rm, tar), as every coding agent does\";\n\n/** matrx-local's 120 actions (`app/tools/actions.py` ACTION_GROUPS), keyed `<mega tool>.<action>`. */\nexport const LEGACY_ACTIONS: Readonly<Record<string, LegacyDisposition>> = {\n \"local_file.read\": tool(\"fs_read\"),\n \"local_file.write\": tool(\"fs_write\"),\n \"local_file.edit\": tool(\"fs_edit\"),\n \"local_file.move\": dropped(SHELL_COVERS),\n \"local_file.copy\": dropped(SHELL_COVERS),\n \"local_file.delete\": dropped(SHELL_COVERS),\n \"local_file.rename\": dropped(SHELL_COVERS),\n \"local_file.mkdir\": tool(\"fs_mkdir\"),\n \"local_file.glob\": tool(\"fs_search\"),\n \"local_file.grep\": tool(\"fs_search\"),\n \"local_file.list\": tool(\"fs_list\"),\n \"local_file.places\": dropped(\"The device's home and folders reach the agent in its binding briefing (sysinfo.get)\"),\n \"local_file.find\": tool(\"fs_search\"),\n \"local_file.semantic_find\": dropped(\"Needs a local embedding index; desktop_semantic_find is planned (Coming soon on Agents › Tools) until it exists\"),\n\n \"local_shell.run\": tool(\"shell_execute\"),\n \"local_shell.output\": tool(\"shell_job\"),\n \"local_shell.stop\": tool(\"shell_job\"),\n\n \"local_window.list\": tool(\"desktop_window\"),\n \"local_window.focus\": tool(\"desktop_window\"),\n \"local_window.move\": tool(\"desktop_window\"),\n \"local_window.minimize\": tool(\"desktop_window\"),\n\n \"local_process.list\": tool(\"desktop_process\"),\n \"local_process.ports\": tool(\"desktop_process\"),\n \"local_process.launch_app\": tool(\"desktop_apps\"),\n \"local_process.kill\": tool(\"desktop_process\"),\n \"local_process.focus_app\": tool(\"desktop_apps\"),\n \"local_process.terminals\": dropped(\"Matrx 2 terminals are exec sessions; the person's own terminal windows are not the agent's\"),\n \"local_process.tail_terminal\": dropped(\"Matrx 2 terminals are exec sessions; the person's own terminal windows are not the agent's\"),\n \"local_process.installed_apps\": tool(\"desktop_apps\"),\n\n \"local_input.type_text\": tool(\"desktop_input\"),\n \"local_input.hotkey\": tool(\"desktop_input\"),\n \"local_input.mouse_click\": tool(\"desktop_input\"),\n \"local_input.mouse_move\": tool(\"desktop_input\"),\n\n \"local_audio.devices\": tool(\"desktop_audio\"),\n \"local_audio.record\": tool(\"desktop_audio\"),\n \"local_audio.play\": tool(\"desktop_audio\"),\n \"local_audio.transcribe\": tool(\"desktop_transcribe\"),\n \"local_audio.transcribe_with_speech\": tool(\"desktop_transcribe\"),\n \"local_audio.speech_locales\": tool(\"desktop_transcribe\"),\n\n \"local_clipboard.read\": tool(\"desktop_clipboard\"),\n \"local_clipboard.write\": tool(\"desktop_clipboard\"),\n\n \"local_screen.screenshot\": tool(\"desktop_screen\"),\n \"local_screen.list\": tool(\"desktop_screen\"),\n \"local_screen.capture_book\": dropped(\"A one-off loop of screenshot plus page turn; the agent composes it from desktop_screen and desktop_input\"),\n\n \"local_system.info\": tool(\"desktop_system\"),\n \"local_system.open_url\": tool(\"desktop_system\"),\n \"local_system.open_path\": tool(\"desktop_system\"),\n \"local_system.notify\": tool(\"desktop_system\"),\n\n // The person's own browser is the AI Matrx extension paired with Matrx 2 (cap browser).\n \"local_browser.navigate\": tool(\"desktop_browser\"),\n \"local_browser.click\": tool(\"desktop_browser\"),\n \"local_browser.type_text\": tool(\"desktop_browser\"),\n \"local_browser.extract\": tool(\"desktop_browser\"),\n \"local_browser.screenshot\": tool(\"desktop_browser\"),\n \"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\"),\n \"local_browser.tabs\": tool(\"desktop_browser\"),\n \"local_browser.close\": tool(\"desktop_browser\"),\n\n \"local_web.fetch\": tool(\"desktop_web\"),\n \"local_web.fetch_with_browser\": tool(\"desktop_web\"),\n \"local_web.scrape\": tool(\"desktop_web\"),\n \"local_web.search\": tool(\"desktop_web\"),\n \"local_web.research\": tool(\"desktop_web\"),\n \"local_web.download\": tool(\"desktop_net\"),\n \"local_web.upload\": dropped(\"Uploads are cloud files (matrx-files) and file sync, one upload path\"),\n\n \"local_net.info\": tool(\"desktop_net\"),\n \"local_net.scan\": tool(\"desktop_net\"),\n \"local_net.port_scan\": tool(\"desktop_net\"),\n \"local_net.mdns_discover\": tool(\"desktop_net\"),\n \"local_net.wifi_networks\": tool(\"desktop_net\"),\n \"local_net.bluetooth_devices\": tool(\"desktop_net\"),\n \"local_net.connected_devices\": tool(\"desktop_net\"),\n\n \"local_monitor.resources\": tool(\"desktop_resources\"),\n \"local_monitor.battery\": tool(\"desktop_power\"),\n \"local_monitor.disk_usage\": tool(\"desktop_resources\"),\n \"local_monitor.top_processes\": tool(\"desktop_process\"),\n \"local_monitor.watch_directory\": tool(\"fs_watch\"),\n \"local_monitor.watch_events\": tool(\"fs_watch\"),\n \"local_monitor.stop_watch\": tool(\"fs_watch\"),\n \"local_monitor.heartbeat\": dropped(\"The relay's device status replaces the heartbeat\"),\n\n // Matrx Local's scheduler ran one of its tools on an interval; desktop_schedule runs an op so.\n \"local_schedule.create\": tool(\"desktop_schedule\"),\n \"local_schedule.list\": tool(\"desktop_schedule\"),\n \"local_schedule.cancel\": tool(\"desktop_schedule\"),\n \"local_schedule.prevent_sleep\": tool(\"desktop_power\"),\n\n // Matrx Local's documents are the Markdown notes in Documents/Matrx/Notes; desktop_notes reads and writes them.\n \"local_documents.list\": tool(\"desktop_notes\"),\n \"local_documents.folders\": tool(\"desktop_notes\"),\n \"local_documents.read\": tool(\"desktop_notes\"),\n \"local_documents.write\": tool(\"desktop_notes\"),\n \"local_documents.search\": tool(\"desktop_notes\"),\n\n \"local_media.ocr\": tool(\"desktop_documents\"),\n \"local_media.resize\": tool(\"desktop_documents\"),\n \"local_media.pdf_extract\": tool(\"desktop_documents\"),\n \"local_media.office_generate\": tool(\"desktop_documents\"),\n \"local_media.archive_create\": dropped(SHELL_COVERS),\n \"local_media.archive_extract\": dropped(SHELL_COVERS),\n\n \"local_ner.entities\": tool(\"desktop_entities\"),\n \"local_ner.pii\": tool(\"desktop_entities\"),\n\n \"local_mac_apps.applescript\": tool(\"desktop_automation\"),\n \"local_mac_apps.list_emails\": tool(\"desktop_mail\"),\n \"local_mac_apps.send_email\": tool(\"desktop_mail\"),\n \"local_mac_apps.email_accounts\": tool(\"desktop_mail\"),\n \"local_mac_apps.list_messages\": tool(\"desktop_messages\"),\n \"local_mac_apps.list_conversations\": tool(\"desktop_messages\"),\n \"local_mac_apps.send_message\": tool(\"desktop_messages\"),\n \"local_mac_apps.search_contacts\": tool(\"desktop_contacts\"),\n \"local_mac_apps.get_contact\": tool(\"desktop_contacts\"),\n \"local_mac_apps.list_events\": tool(\"desktop_calendar\"),\n \"local_mac_apps.create_event\": tool(\"desktop_calendar\"),\n \"local_mac_apps.list_reminders\": tool(\"desktop_calendar\"),\n \"local_mac_apps.create_reminder\": tool(\"desktop_calendar\"),\n \"local_mac_apps.search_photos\": tool(\"desktop_photos\"),\n \"local_mac_apps.get_photo\": tool(\"desktop_photos\"),\n \"local_mac_apps.location\": tool(\"desktop_location\"),\n\n \"local_windows_ps.run\": tool(\"desktop_automation\"),\n \"local_windows_ps.get_env\": dropped(\"Read with shell_execute; a per-command env rides exec.run\"),\n \"local_windows_ps.set_env\": dropped(\"Changing the person's persistent environment is not an agent tool\"),\n \"local_windows_ps.registry_read\": tool(\"desktop_windows_admin\"),\n \"local_windows_ps.registry_write\": tool(\"desktop_windows_admin\"),\n \"local_windows_ps.service_list\": tool(\"desktop_windows_admin\"),\n \"local_windows_ps.service_control\": tool(\"desktop_windows_admin\"),\n \"local_windows_ps.event_log\": tool(\"desktop_windows_admin\"),\n \"local_windows_ps.windows_features\": tool(\"desktop_windows_admin\"),\n};\n\n/**\n * matrx-local's 19 action-enum dispatchers. Each fanned an `action` out to the handlers above and\n * did nothing else; they retire with the `matrx-local` executor binding (the platform reaches a\n * device through the relay now, never by client delegation).\n */\nexport const LEGACY_DISPATCHERS: readonly string[] = [\n \"local_file\",\n \"local_shell\",\n \"local_window\",\n \"local_process\",\n \"local_input\",\n \"local_audio\",\n \"local_clipboard\",\n \"local_screen\",\n \"local_system\",\n \"local_browser\",\n \"local_web\",\n \"local_net\",\n \"local_monitor\",\n \"local_schedule\",\n \"local_documents\",\n \"local_media\",\n \"local_ner\",\n \"local_mac_apps\",\n \"local_windows_ps\",\n];\n\n/** Built tools' ops, typed: a built tool naming an op the protocol does not have fails to compile in the test. */\nexport function builtOps(): OpName[] {\n return TOOL_CATALOG.filter((t) => t.state === \"built\").flatMap((t) => t.ops as OpName[]);\n}\n","/**\n * The generated tool status table (SPEC §10): tool × level × platform, built ONLY from harness\n * results (`ToolResultsFile`) joined with the catalog. Never written by hand; the one status anyone\n * cites. `renderToolStatusMarkdown` is the committed text form; screens render `ToolStatus` itself.\n */\nimport { ToolResultsFile, type ToolLevel, type ToolLevelResult, type ToolPlatform, type ToolTransport } from \"../schema/tools\";\nimport { EXCLUDED_TOOLS, TOOL_CATALOG, TOOL_GROUPS, type CatalogTool, type ToolGroupId, type ToolState } from \"./catalog\";\n\nexport const TOOL_LEVELS: readonly ToolLevel[] = [\"programmatic\", \"protocol\", \"chat\"];\nexport const TOOL_PLATFORMS: readonly ToolPlatform[] = [\"darwin\", \"win32\", \"linux\"];\n\n/**\n * `pass`: every required proof passed and none failed. `partial`: passes so far, a required proof\n * missing (`missing` says which). `fail`: the latest run of some proof failed. `untested`: nothing\n * ran. `not_built`: the tool is planned. `unsupported`: the tool does not exist on this platform.\n */\nconst UUID_IN_NAME = /[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}/gi;\n\nexport type CellState = \"pass\" | \"partial\" | \"fail\" | \"untested\" | \"not_built\" | \"unsupported\";\n\nexport interface StatusEvidence {\n readonly suite: string;\n readonly test: string;\n readonly transport: ToolTransport;\n readonly outcome: ToolLevelResult[\"outcome\"];\n readonly remote_network: boolean;\n readonly commit: string;\n readonly run_at_ms: number;\n readonly detail: string;\n /** Chat level: the tool calls the turn made, of any tool (absent on older evidence). */\n readonly calls_made?: number;\n}\n\n/**\n * A run that never exercised the tool: a `skip`, or a chat turn that made no tool calls at all (the\n * model answered in prose, or the chat request failed). It is shown as the latest run but is never\n * evidence about the tool, so it can neither prove a cell nor turn a proven one red.\n */\nexport function isInconclusive(e: Pick<StatusEvidence, \"outcome\" | \"calls_made\">): boolean {\n return e.outcome === \"skip\" || e.calls_made === 0;\n}\n\nexport interface StatusCell {\n readonly state: CellState;\n /** Required proofs not yet passed, e.g. \"relay from another network\". */\n readonly missing: readonly string[];\n readonly last_run_at_ms: number | null;\n readonly evidence: readonly StatusEvidence[];\n}\n\nexport interface StatusRow {\n readonly tool: string;\n readonly group: ToolGroupId;\n readonly tool_state: ToolState;\n readonly summary: string;\n readonly note: string | null;\n readonly cells: Readonly<Record<ToolPlatform, Readonly<Record<ToolLevel, StatusCell>>>>;\n /** Working on a platform = all three levels pass there (SPEC §10). */\n readonly working: Readonly<Record<ToolPlatform, boolean>>;\n}\n\nexport interface ToolStatus {\n readonly schema: \"matrx.tool-status.v1\";\n readonly generated_at_ms: number;\n readonly commits: readonly string[];\n readonly rows: readonly StatusRow[];\n readonly totals: Readonly<Record<ToolPlatform, { readonly working: number; readonly built: number; readonly tools: number }>>;\n}\n\n/** What each level needs before it reads `pass`. Level 2 is the transports AND the relay from another network. */\nconst REQUIRED: Readonly<Record<ToolLevel, readonly { readonly label: string; readonly ok: (e: StatusEvidence) => boolean }[]>> = {\n programmatic: [{ label: \"in process\", ok: (e) => e.transport === \"in_process\" }],\n protocol: [\n { label: \"localhost\", ok: (e) => e.transport === \"localhost\" },\n { label: \"relay\", ok: (e) => e.transport === \"relay\" },\n { label: \"relay from another network\", ok: (e) => e.transport === \"relay\" && e.remote_network },\n ],\n chat: [{ label: \"a real agent in a real chat\", ok: (e) => e.transport === \"agent\" }],\n};\n\nfunction cellFor(tool: CatalogTool, platform: ToolPlatform, level: ToolLevel, evidence: StatusEvidence[]): StatusCell {\n if (!tool.platforms.includes(platform)) return { state: \"unsupported\", missing: [], last_run_at_ms: null, evidence: [] };\n // The latest DECISIVE run of each (suite, test, transport, network) decides; older runs are\n // history. A run that never exercised the tool (`isInconclusive`) never replaces a decisive one:\n // it is kept beside it, when newer, so the table still shows that the last run proved nothing.\n const latest = new Map<string, StatusEvidence>();\n const latestInconclusive = new Map<string, StatusEvidence>();\n for (const e of evidence) {\n // A uuid in a test name (the agent a chat proof ran, a conversation) is run data, never the\n // proof's identity: the same proof under a new test agent replaces the old one's result.\n const key = `${e.suite}\\u0000${e.test.replace(UUID_IN_NAME, \"<id>\")}\\u0000${e.transport}\\u0000${e.remote_network}`;\n const into = isInconclusive(e) ? latestInconclusive : latest;\n const prev = into.get(key);\n if (!prev || prev.run_at_ms < e.run_at_ms) into.set(key, e);\n }\n const runs = [...latest.values()].sort((a, b) => b.run_at_ms - a.run_at_ms);\n const unproven = [...latestInconclusive].filter(([k, e]) => (latest.get(k)?.run_at_ms ?? -1) < e.run_at_ms).map(([, e]) => e);\n const shown = [...runs, ...unproven].sort((a, b) => b.run_at_ms - a.run_at_ms);\n const last = runs[0]?.run_at_ms ?? null;\n if (tool.state === \"planned\" && runs.length === 0) return { state: \"not_built\", missing: [], last_run_at_ms: null, evidence: [] };\n if (runs.length === 0) return { state: \"untested\", missing: REQUIRED[level].map((r) => r.label), last_run_at_ms: null, evidence: shown };\n if (runs.some((e) => e.outcome === \"fail\")) return { state: \"fail\", missing: [], last_run_at_ms: last, evidence: shown };\n const missing = REQUIRED[level].filter((r) => !runs.some((e) => e.outcome === \"pass\" && r.ok(e))).map((r) => r.label);\n return { state: missing.length === 0 ? \"pass\" : \"partial\", missing, last_run_at_ms: last, evidence: shown };\n}\n\n/** Build the table from every results file. Throws when a file is off-contract (never silently skipped). */\nexport function buildToolStatus(files: readonly unknown[], opts: { readonly generatedAtMs: number }): ToolStatus {\n const parsed = files.map((f, i) => {\n const r = ToolResultsFile.safeParse(f);\n if (!r.success) throw new Error(`tool results file #${i} is off-contract: ${r.error.issues[0]?.path.join(\".\")} ${r.error.issues[0]?.message}`);\n return r.data;\n });\n const known = new Set(TOOL_CATALOG.map((t) => t.name));\n const byKey = new Map<string, StatusEvidence[]>();\n for (const file of parsed) {\n for (const r of file.results) {\n if (!known.has(r.tool)) throw new Error(`a result names ${r.tool}, which is not in the tool catalog`);\n const key = `${r.tool}|${r.platform}|${r.level}`;\n const list = byKey.get(key) ?? [];\n list.push({\n suite: r.suite,\n test: r.test,\n transport: r.transport,\n outcome: r.outcome,\n remote_network: r.remote_network,\n commit: file.commit,\n run_at_ms: r.run_at_ms,\n detail: r.detail,\n ...(r.calls_made === undefined ? {} : { calls_made: r.calls_made }),\n });\n byKey.set(key, list);\n }\n }\n const groupOrder = new Map(TOOL_GROUPS.map((g) => [g.id, g.order]));\n const tools = [...TOOL_CATALOG].sort((a, b) => (groupOrder.get(a.group) ?? 99) - (groupOrder.get(b.group) ?? 99));\n const rows: StatusRow[] = tools.map((tool) => {\n const cells = {} as Record<ToolPlatform, Record<ToolLevel, StatusCell>>;\n const working = {} as Record<ToolPlatform, boolean>;\n for (const platform of TOOL_PLATFORMS) {\n const perLevel = {} as Record<ToolLevel, StatusCell>;\n for (const level of TOOL_LEVELS) perLevel[level] = cellFor(tool, platform, level, byKey.get(`${tool.name}|${platform}|${level}`) ?? []);\n cells[platform] = perLevel;\n working[platform] = TOOL_LEVELS.every((l) => perLevel[l].state === \"pass\");\n }\n return { tool: tool.name, group: tool.group, tool_state: tool.state, summary: tool.summary, note: tool.note ?? null, cells, working };\n });\n const totals = {} as Record<ToolPlatform, { working: number; built: number; tools: number }>;\n for (const platform of TOOL_PLATFORMS) {\n const onPlatform = TOOL_CATALOG.filter((t) => t.platforms.includes(platform));\n totals[platform] = {\n working: rows.filter((r) => r.working[platform]).length,\n built: onPlatform.filter((t) => t.state !== \"planned\").length,\n tools: onPlatform.length,\n };\n }\n const commits = [...new Set(parsed.map((f) => f.commit))].sort();\n return { schema: \"matrx.tool-status.v1\", generated_at_ms: opts.generatedAtMs, commits, rows, totals };\n}\n\nconst MARK: Readonly<Record<CellState, string>> = { pass: \"✓\", partial: \"◐\", fail: \"✗\", untested: \"·\", not_built: \"—\", unsupported: \" \" };\n\n/** The committed text form. Columns: per platform, the three levels (P = programmatic, R = protocol, C = chat). */\nexport function renderToolStatusMarkdown(status: ToolStatus): string {\n const lines: string[] = [\n \"<!-- GENERATED by `pnpm tools:status` from test results. Never edit by hand. -->\",\n \"# Local tools: status\",\n \"\",\n `Generated ${new Date(status.generated_at_ms).toISOString()} from commits ${status.commits.join(\", \") || \"none\"}.`,\n \"\",\n \"✓ pass · ◐ passing so far, a required proof missing · ✗ fail · `·` untested · — not built. Levels: P programmatic, R protocol, C chat.\",\n \"\",\n \"| Platform | Working | Built | Tools |\",\n \"|---|---|---|---|\",\n ...TOOL_PLATFORMS.map((p) => `| ${p} | ${status.totals[p].working} | ${status.totals[p].built} | ${status.totals[p].tools} |`),\n \"\",\n ];\n for (const group of TOOL_GROUPS) {\n const rows = status.rows.filter((r) => r.group === group.id);\n if (rows.length === 0) continue;\n lines.push(`## ${group.order}. ${group.title}`, \"\", \"| Tool | darwin P R C | win32 P R C | linux P R C | Missing |\", \"|---|---|---|---|---|\");\n for (const r of rows) {\n const cols = TOOL_PLATFORMS.map((p) => TOOL_LEVELS.map((l) => MARK[r.cells[p][l].state]).join(\" \"));\n const missing = new Set<string>();\n for (const p of TOOL_PLATFORMS) for (const l of TOOL_LEVELS) for (const m of r.cells[p][l].missing) if (r.cells[p][l].state !== \"untested\") missing.add(`${p} ${l}: ${m}`);\n const name = r.tool_state === \"broken\" ? `${r.tool} (broken: ${r.note ?? \"\"})` : r.tool;\n lines.push(`| ${name} | ${cols.join(\" | \")} | ${[...missing].join(\"; \")} |`);\n }\n lines.push(\"\");\n }\n const excluded = Object.entries(EXCLUDED_TOOLS);\n if (excluded.length > 0) {\n lines.push(\"## Not device tools\", \"\", \"| Tool | Why |\", \"|---|---|\", ...excluded.map(([name, why]) => `| ${name} | ${why} |`), \"\");\n }\n return lines.join(\"\\n\");\n}\n","/**\n * The per-device tool policy's op rule (Matrx 2: Agents › Tools' switches, the\n * `desktop.tools/disabled_on_device` knob). The relay carries an op, never the tool that sent it, and\n * several tools share ops (fs_read, fs_write and fs_edit all read with `fs.read`; shell_execute and\n * shell_python both run `exec.run`). So an op is refused when EVERY catalog tool that sends it is\n * turned off. Pure, data-only: the core enforces it on relay connections, the screen explains it.\n */\nimport { TOOL_CATALOG } from \"./catalog\";\n\n/** The ops refused when these tools are off: those every sending tool has turned off. */\nexport function refusedOps(disabledTools: readonly string[]): ReadonlySet<string> {\n const off = new Set(disabledTools);\n const senders = new Map<string, string[]>();\n for (const tool of TOOL_CATALOG) for (const op of tool.ops) senders.set(op, [...(senders.get(op) ?? []), tool.name]);\n const refused = new Set<string>();\n for (const [op, tools] of senders) if (tools.every((t) => off.has(t))) refused.add(op);\n return refused;\n}\n\n/** The catalog tools that send this op. */\nexport function toolsSending(op: string): string[] {\n return TOOL_CATALOG.filter((t) => t.ops.includes(op)).map((t) => t.name);\n}\n\n/**\n * For one tool switched off: the tools still on that keep ALL its ops open (turning it off alone\n * stops nothing until they are off too). Empty when turning it off stops at least one op.\n */\nexport function sharedOpsBlocking(tool: string, disabledTools: readonly string[]): string[] {\n const entry = TOOL_CATALOG.find((t) => t.name === tool);\n if (!entry || entry.ops.length === 0) return [];\n const off = new Set([...disabledTools, tool]);\n const refused = refusedOps([...off]);\n if (entry.ops.some((op) => refused.has(op))) return [];\n const keepers = new Set<string>();\n for (const op of entry.ops) for (const other of TOOL_CATALOG) if (other.name !== tool && !off.has(other.name) && other.ops.includes(op)) keepers.add(other.name);\n return [...keepers].sort();\n}\n"],"mappings":"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","names":["tool","tool"]}
1
+ {"version":3,"sources":["../src/contract.ts","../src/tools/catalog.ts","../src/tools/status.ts","../src/tools/policy.ts"],"sourcesContent":["// AUTO-GENERATED by scripts/generate.ts — DO NOT EDIT. `pnpm generate --check` fails on any hand edit.\n/** SHA-256 of generated/desktop-protocol.schema.json: the contract both sides of a service connection were built from. */\nexport const CONTRACT_SHA256 = \"f2d7caf22aabba11530c3f2eb4d4341a58df82ac2c5d58e95bbde3f692865df5\" as const;\n","/**\n * The local tool catalog (SPEC §10): every tool a platform agent calls on a person's computer, the\n * protocol ops it reaches, the group it ships in, and what became of each of matrx-local's 139\n * handlers (120 actions + the 19 action-enum dispatchers that fanned out to them).\n *\n * Data only. The status table (./status.ts) joins it with the harnesses' results, so a tool listed\n * here with no passing result reads \"untested\", never \"working\". Design and the reasons behind each\n * group: matrx-desktop/design/local-tools.md.\n */\nimport type { OpName } from \"../schema/registry\";\nimport type { ToolPlatform } from \"../schema/tools\";\n\nexport type ToolGroupId = \"files_shell\" | \"os_control\" | \"personal_automation\" | \"tools_service\" | \"ml_service\" | \"windows_admin\";\n\nexport interface ToolGroup {\n readonly id: ToolGroupId;\n readonly order: number;\n readonly title: string;\n /** Who implements the ops: a TS capability owner in the core, or a Python service. */\n readonly owner: \"core\" | \"python_tools\" | \"python_ml\";\n}\n\nexport const TOOL_GROUPS: readonly ToolGroup[] = [\n { id: \"files_shell\", order: 1, title: \"Files and shell\", owner: \"core\" },\n { id: \"os_control\", order: 2, title: \"Computer control\", owner: \"core\" },\n { id: \"personal_automation\", order: 3, title: \"Personal apps and automation\", owner: \"core\" },\n { id: \"tools_service\", order: 4, title: \"Web, documents, OCR and entities\", owner: \"python_tools\" },\n { id: \"ml_service\", order: 5, title: \"Speech\", owner: \"python_ml\" },\n { id: \"windows_admin\", order: 6, title: \"Windows administration\", owner: \"core\" },\n];\n\n/**\n * How an agent's call reaches the device. Both end at the relay's `POST /v1/devices/{id}/call`:\n * - `sandbox_proxy`: the cloud-sandbox-shaped tools (fs_*, shell_*). matrx-ai's `_sandbox_proxy`\n * calls aidream `/api/local-proxy/{device}/{fs|search|exec}/…`, which maps the route to its op.\n * Agent code never knows a laptop from a cloud box (SPEC §6.1).\n * - `device_op`: desktop-only capabilities. One generic route, `/api/local-proxy/{device}/op/{cap.op}`,\n * params and result exactly the op's schema; the tool definition is generated from that schema.\n * - `server`: runs on the aidream server even when the turn is bound to a device (a defect when\n * the tool reads a local path; see `note`).\n */\nexport type ToolPath = \"sandbox_proxy\" | \"device_op\" | \"server\";\n\n/** `built`: the ops exist in the protocol and Matrx 2's core serves them (registered on the platform for agents with the server tool); `planned`: designed, not built; `broken`: registered but wrong on a device. */\nexport type ToolState = \"built\" | \"planned\" | \"broken\";\n\nexport interface CatalogTool {\n /** The platform registry name (`tool.definition.name`). */\n readonly name: string;\n readonly group: ToolGroupId;\n readonly state: ToolState;\n readonly path: ToolPath;\n /** Ops the tool sends. For `built` tools every one is in OPS (a test enforces it). */\n readonly ops: readonly string[];\n readonly platforms: readonly ToolPlatform[];\n /** One line for the status table. */\n readonly summary: string;\n /** Required for `broken`: what is wrong. */\n readonly note?: string;\n}\n\nconst ALL: readonly ToolPlatform[] = [\"darwin\", \"win32\", \"linux\"];\n\nexport const TOOL_CATALOG: readonly CatalogTool[] = [\n // ── 1. Files and shell (core `fs`, `exec`; the cloud sandbox's agent tools) ──────────────────\n { name: \"fs_read\", group: \"files_shell\", state: \"built\", path: \"sandbox_proxy\", ops: [\"fs.read\"], platforms: ALL, summary: \"Read a file, paged\" },\n { name: \"fs_write\", group: \"files_shell\", state: \"built\", path: \"sandbox_proxy\", ops: [\"fs.read\", \"fs.write\"], platforms: ALL, summary: \"Create or overwrite a file\" },\n { name: \"fs_edit\", group: \"files_shell\", state: \"built\", path: \"sandbox_proxy\", ops: [\"fs.read\", \"fs.patch\"], platforms: ALL, summary: \"Replace one exact string\" },\n { name: \"fs_patch\", group: \"files_shell\", state: \"built\", path: \"sandbox_proxy\", ops: [\"fs.read\", \"fs.patch\"], platforms: ALL, summary: \"Apply several exact edits at once\" },\n { name: \"fs_list\", group: \"files_shell\", state: \"built\", path: \"sandbox_proxy\", ops: [\"fs.list\"], platforms: ALL, summary: \"List a folder\" },\n { name: \"fs_mkdir\", group: \"files_shell\", state: \"built\", path: \"sandbox_proxy\", ops: [\"fs.mkdir\"], platforms: ALL, summary: \"Create a folder\" },\n { name: \"fs_search\", group: \"files_shell\", state: \"built\", path: \"sandbox_proxy\", ops: [\"fs.search_paths\", \"fs.search_content\"], platforms: ALL, summary: \"Find files by name or content\" },\n { name: \"shell_execute\", group: \"files_shell\", state: \"built\", path: \"sandbox_proxy\", ops: [\"exec.run\"], platforms: ALL, summary: \"Run a command; cd carries over\" },\n { name: \"shell_python\", group: \"files_shell\", state: \"built\", path: \"sandbox_proxy\", ops: [\"exec.run\"], platforms: ALL, summary: \"Run a Python script\" },\n { name: \"desktop_git\", group: \"files_shell\", state: \"built\", path: \"device_op\", ops: [\"git.status\", \"git.diff\", \"git.log\", \"git.add\", \"git.commit\", \"git.push\", \"git.pull\", \"git.branch\", \"git.stash\", \"git.clone\"], platforms: ALL, summary: \"Git: status, diff, log, commit, branches, push and pull\" },\n { name: \"shell_job\", group: \"files_shell\", state: \"built\", path: \"device_op\", ops: [\"exec.job.start\", \"exec.job.output\", \"exec.job.stop\", \"exec.job.list\"], platforms: ALL, summary: \"Background commands: start, read output, stop\" },\n\n // ── 2. Computer control (TS owners) ──────────────────────────────────────────────────────────\n { name: \"desktop_process\", group: \"os_control\", state: \"built\", path: \"device_op\", ops: [\"proc.list\", \"proc.ports\", \"proc.kill\"], platforms: ALL, summary: \"Running processes and ports; stop one\" },\n { name: \"desktop_apps\", group: \"os_control\", state: \"built\", path: \"device_op\", ops: [\"apps.list\", \"apps.open\"], platforms: ALL, summary: \"Installed apps; open or bring one forward\" },\n { 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\" },\n { 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\" },\n { name: \"desktop_action_needed\", group: \"os_control\", state: \"built\", path: \"device_op\", ops: [\"action_needed.raise\", \"action_needed.wait\", \"action_needed.get\", \"action_needed.cancel\", \"action_needed.list\"], platforms: ALL, summary: \"Ask the person for an answer, a pick, an approval, a sign-in, a file or a permission; wait for or poll the answer\" },\n { name: \"desktop_screen\", group: \"os_control\", state: \"built\", path: \"device_op\", ops: [\"screen.list\", \"screen.capture\"], platforms: ALL, summary: \"Displays and screenshots\" },\n { 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\" },\n { 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\" },\n { 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\" },\n { 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\" },\n { name: \"desktop_power\", group: \"os_control\", state: \"built\", path: \"device_op\", ops: [\"power.status\", \"power.history\", \"power.prevent_sleep\"], platforms: ALL, summary: \"Battery and keep awake\" },\n { name: \"desktop_resources\", group: \"os_control\", state: \"built\", path: \"device_op\", ops: [\"resources.snapshot\", \"resources.activity\", \"resources.stop_job\", \"resources.incidents\"], platforms: ALL, summary: \"CPU, memory and disk use; what is using them, grouped into jobs; stop a job; the slowdown log\" },\n { name: \"fs_watch\", group: \"os_control\", state: \"built\", path: \"device_op\", ops: [\"fs.watch.start\", \"fs.watch.events\", \"fs.watch.stop\"], platforms: ALL, summary: \"Watch a folder; read what changed\" },\n\n // ── 3. Personal apps and automation (1.37: the core's `automation`, `personal`, `net` and `schedule` owners) ──\n { name: \"desktop_automation\", group: \"personal_automation\", state: \"built\", path: \"device_op\", ops: [\"automation.script\"], platforms: [\"darwin\", \"win32\"], summary: \"AppleScript or JavaScript for Automation on a Mac, PowerShell on Windows\" },\n { name: \"desktop_mail\", group: \"personal_automation\", state: \"built\", path: \"device_op\", ops: [\"mail.accounts\", \"mail.list\", \"mail.send\"], platforms: [\"darwin\"], summary: \"The Mail app: accounts, messages, send\" },\n { name: \"desktop_outlook\", group: \"personal_automation\", state: \"built\", path: \"device_op\", ops: [\"outlook.status\", \"outlook.draft\", \"outlook.list\", \"outlook.read\"], platforms: [\"win32\"], summary: \"The person's own Outlook: drafts with attachments, recent mail, one message\" },\n { name: \"desktop_messages\", group: \"personal_automation\", state: \"built\", path: \"device_op\", ops: [\"messages.chats\", \"messages.list\", \"messages.send\"], platforms: [\"darwin\"], summary: \"The Messages app: chats, messages, send\" },\n { name: \"desktop_contacts\", group: \"personal_automation\", state: \"built\", path: \"device_op\", ops: [\"contacts.search\", \"contacts.get\"], platforms: [\"darwin\"], summary: \"Contacts: search, one card\" },\n { name: \"desktop_calendar\", group: \"personal_automation\", state: \"built\", path: \"device_op\", ops: [\"calendar.list\", \"calendar.create\", \"reminders.list\", \"reminders.create\"], platforms: [\"darwin\"], summary: \"Calendar and Reminders: list and add\" },\n { name: \"desktop_photos\", group: \"personal_automation\", state: \"built\", path: \"device_op\", ops: [\"photos.search\", \"photos.get\"], platforms: [\"darwin\"], summary: \"The Photos library: find, export an original\" },\n // Windows comes back once a Windows location fix is proven (plan attack retire-local 2026-10-12, B6):\n // until then local_mac_apps (macOS-only) is judged on macOS and nothing claims Windows.\n { name: \"desktop_location\", group: \"personal_automation\", state: \"built\", path: \"device_op\", ops: [\"location.get\"], platforms: [\"darwin\"], summary: \"Where the computer is (the OS's location service)\" },\n { name: \"desktop_net\", group: \"personal_automation\", state: \"built\", path: \"device_op\", ops: [\"net.info\", \"net.wifi\", \"net.bluetooth\", \"net.devices\", \"net.mdns\", \"net.scan\", \"net.download\"], platforms: ALL, summary: \"Local network, Wi-Fi, Bluetooth, open ports and downloads\" },\n { name: \"desktop_schedule\", group: \"personal_automation\", state: \"built\", path: \"device_op\", ops: [\"schedule.create\", \"schedule.list\", \"schedule.cancel\"], platforms: ALL, summary: \"Run a tool's op on this computer on an interval; list and cancel\" },\n // 1.38, code from anywhere: the person's Claude Code and Codex sessions on this computer. Turning\n // either off in Agents › Tools refuses its ops on every relay connection (the existing switch).\n { name: \"coding_sessions_read\", group: \"personal_automation\", state: \"built\", path: \"device_op\", ops: [\"coding.providers\", \"coding.sessions.list\", \"coding.discover\", \"coding.runs.list\", \"coding.history\", \"coding.transcript.read\", \"coding.item.full\", \"coding.activity\", \"coding.folders.recent\", \"coding.folders.check\", \"coding.agents.access\", \"coding.titles.status\", \"coding.prefs.list\", \"coding.recent.seen\", \"coding.search\", \"coding.transcript.raw\", \"coding.watch\", \"coding.session.watch\", \"coding.assets.list\", \"coding.assets.get\"], platforms: ALL, summary: \"Claude Code and Codex sessions: list, read live, search, download; the agents' memories and instructions\" },\n { name: \"coding_sessions_drive\", group: \"personal_automation\", state: \"built\", path: \"device_op\", ops: [\"coding.start\", \"coding.takeover\", \"coding.send\", \"coding.stop\", \"coding.stop_elsewhere\", \"coding.options.set\", \"coding.account.continue\", \"coding.agent.set\", \"coding.folders.create\", \"coding.prefs.set\", \"coding.reconcile\"], platforms: ALL, summary: \"Claude Code and Codex sessions: start, send, stop, take over, rename\" },\n\n // ── 4. Documents, notes and entities (1.37: the core's `documents` and `notes` owners; desktop_web is the `tools` service) ──\n { 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\" },\n { 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)\" },\n { 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\" },\n // matrx-local's SemanticFindPaths: needs a local embedding index of this computer's files and an\n // embedding model on the device; neither exists yet, so it is Coming soon on Agents › Tools.\n { 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)\" },\n { 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\" },\n\n // ── 5. Python `ml` service ───────────────────────────────────────────────────────────────────\n // Built: models.transcribe through local_proxy's POST /op/{cap.op} (matrx-ai implementations/desktop.py).\n // Whisper detects the language itself, so matrx-local's speech_locales needs no op of its own.\n { name: \"desktop_transcribe\", group: \"ml_service\", state: \"built\", path: \"device_op\", ops: [\"models.transcribe\"], platforms: ALL, summary: \"Speech to text on the device\" },\n\n // ── 6. Windows administration ────────────────────────────────────────────────────────────────\n { name: \"desktop_windows_admin\", group: \"windows_admin\", state: \"built\", path: \"device_op\", ops: [\"windows.registry_read\", \"windows.registry_write\", \"windows.services\", \"windows.service_control\", \"windows.event_log\", \"windows.features\"], platforms: [\"win32\"], summary: \"Registry, services, event log, optional features\" },\n];\n\n/**\n * Tools armed with a device binding that are deliberately NOT device tools, each with its reason.\n * They run on the server; the status table does not track them.\n */\nexport const EXCLUDED_TOOLS: Readonly<Record<string, string>> = {\n git_ingest:\n \"Runs on the server: it ingests repository URLs. A local path on a bound computer or sandbox is refused with the fs_* and shell remedy, since the server cannot see it\",\n};\n\n/** What became of one matrx-local handler. */\nexport type LegacyDisposition =\n | { readonly kind: \"tool\"; readonly tool: string }\n | { readonly kind: \"dropped\"; readonly reason: string };\n\nconst tool = (name: string): LegacyDisposition => ({ kind: \"tool\", tool: name });\nconst dropped = (reason: string): LegacyDisposition => ({ kind: \"dropped\", reason });\n\nconst SHELL_COVERS = \"Done with shell_execute (mv, cp, rm, tar), as every coding agent does\";\n\n/** matrx-local's 120 actions (`app/tools/actions.py` ACTION_GROUPS), keyed `<mega tool>.<action>`. */\nexport const LEGACY_ACTIONS: Readonly<Record<string, LegacyDisposition>> = {\n \"local_file.read\": tool(\"fs_read\"),\n \"local_file.write\": tool(\"fs_write\"),\n \"local_file.edit\": tool(\"fs_edit\"),\n \"local_file.move\": dropped(SHELL_COVERS),\n \"local_file.copy\": dropped(SHELL_COVERS),\n \"local_file.delete\": dropped(SHELL_COVERS),\n \"local_file.rename\": dropped(SHELL_COVERS),\n \"local_file.mkdir\": tool(\"fs_mkdir\"),\n \"local_file.glob\": tool(\"fs_search\"),\n \"local_file.grep\": tool(\"fs_search\"),\n \"local_file.list\": tool(\"fs_list\"),\n \"local_file.places\": dropped(\"The device's home and folders reach the agent in its binding briefing (sysinfo.get)\"),\n \"local_file.find\": tool(\"fs_search\"),\n \"local_file.semantic_find\": dropped(\"Needs a local embedding index; desktop_semantic_find is planned (Coming soon on Agents › Tools) until it exists\"),\n\n \"local_shell.run\": tool(\"shell_execute\"),\n \"local_shell.output\": tool(\"shell_job\"),\n \"local_shell.stop\": tool(\"shell_job\"),\n\n \"local_window.list\": tool(\"desktop_window\"),\n \"local_window.focus\": tool(\"desktop_window\"),\n \"local_window.move\": tool(\"desktop_window\"),\n \"local_window.minimize\": tool(\"desktop_window\"),\n\n \"local_process.list\": tool(\"desktop_process\"),\n \"local_process.ports\": tool(\"desktop_process\"),\n \"local_process.launch_app\": tool(\"desktop_apps\"),\n \"local_process.kill\": tool(\"desktop_process\"),\n \"local_process.focus_app\": tool(\"desktop_apps\"),\n \"local_process.terminals\": dropped(\"Matrx 2 terminals are exec sessions; the person's own terminal windows are not the agent's\"),\n \"local_process.tail_terminal\": dropped(\"Matrx 2 terminals are exec sessions; the person's own terminal windows are not the agent's\"),\n \"local_process.installed_apps\": tool(\"desktop_apps\"),\n\n \"local_input.type_text\": tool(\"desktop_input\"),\n \"local_input.hotkey\": tool(\"desktop_input\"),\n \"local_input.mouse_click\": tool(\"desktop_input\"),\n \"local_input.mouse_move\": tool(\"desktop_input\"),\n\n \"local_audio.devices\": tool(\"desktop_audio\"),\n \"local_audio.record\": tool(\"desktop_audio\"),\n \"local_audio.play\": tool(\"desktop_audio\"),\n \"local_audio.transcribe\": tool(\"desktop_transcribe\"),\n \"local_audio.transcribe_with_speech\": tool(\"desktop_transcribe\"),\n \"local_audio.speech_locales\": tool(\"desktop_transcribe\"),\n\n \"local_clipboard.read\": tool(\"desktop_clipboard\"),\n \"local_clipboard.write\": tool(\"desktop_clipboard\"),\n\n \"local_screen.screenshot\": tool(\"desktop_screen\"),\n \"local_screen.list\": tool(\"desktop_screen\"),\n \"local_screen.capture_book\": dropped(\"A one-off loop of screenshot plus page turn; the agent composes it from desktop_screen and desktop_input\"),\n\n \"local_system.info\": tool(\"desktop_system\"),\n \"local_system.open_url\": tool(\"desktop_system\"),\n \"local_system.open_path\": tool(\"desktop_system\"),\n \"local_system.notify\": tool(\"desktop_system\"),\n\n // The person's own browser is the AI Matrx extension paired with Matrx 2 (cap browser).\n \"local_browser.navigate\": tool(\"desktop_browser\"),\n \"local_browser.click\": tool(\"desktop_browser\"),\n \"local_browser.type_text\": tool(\"desktop_browser\"),\n \"local_browser.extract\": tool(\"desktop_browser\"),\n \"local_browser.screenshot\": tool(\"desktop_browser\"),\n \"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\"),\n \"local_browser.tabs\": tool(\"desktop_browser\"),\n \"local_browser.close\": tool(\"desktop_browser\"),\n\n \"local_web.fetch\": tool(\"desktop_web\"),\n \"local_web.fetch_with_browser\": tool(\"desktop_web\"),\n \"local_web.scrape\": tool(\"desktop_web\"),\n \"local_web.search\": tool(\"desktop_web\"),\n \"local_web.research\": tool(\"desktop_web\"),\n \"local_web.download\": tool(\"desktop_net\"),\n \"local_web.upload\": dropped(\"Uploads are cloud files (matrx-files) and file sync, one upload path\"),\n\n \"local_net.info\": tool(\"desktop_net\"),\n \"local_net.scan\": tool(\"desktop_net\"),\n \"local_net.port_scan\": tool(\"desktop_net\"),\n \"local_net.mdns_discover\": tool(\"desktop_net\"),\n \"local_net.wifi_networks\": tool(\"desktop_net\"),\n \"local_net.bluetooth_devices\": tool(\"desktop_net\"),\n \"local_net.connected_devices\": tool(\"desktop_net\"),\n\n \"local_monitor.resources\": tool(\"desktop_resources\"),\n \"local_monitor.battery\": tool(\"desktop_power\"),\n \"local_monitor.disk_usage\": tool(\"desktop_resources\"),\n \"local_monitor.top_processes\": tool(\"desktop_process\"),\n \"local_monitor.watch_directory\": tool(\"fs_watch\"),\n \"local_monitor.watch_events\": tool(\"fs_watch\"),\n \"local_monitor.stop_watch\": tool(\"fs_watch\"),\n \"local_monitor.heartbeat\": dropped(\"The relay's device status replaces the heartbeat\"),\n\n // Matrx Local's scheduler ran one of its tools on an interval; desktop_schedule runs an op so.\n \"local_schedule.create\": tool(\"desktop_schedule\"),\n \"local_schedule.list\": tool(\"desktop_schedule\"),\n \"local_schedule.cancel\": tool(\"desktop_schedule\"),\n \"local_schedule.prevent_sleep\": tool(\"desktop_power\"),\n\n // Matrx Local's documents are the Markdown notes in Documents/Matrx/Notes; desktop_notes reads and writes them.\n \"local_documents.list\": tool(\"desktop_notes\"),\n \"local_documents.folders\": tool(\"desktop_notes\"),\n \"local_documents.read\": tool(\"desktop_notes\"),\n \"local_documents.write\": tool(\"desktop_notes\"),\n \"local_documents.search\": tool(\"desktop_notes\"),\n\n \"local_media.ocr\": tool(\"desktop_documents\"),\n \"local_media.resize\": tool(\"desktop_documents\"),\n \"local_media.pdf_extract\": tool(\"desktop_documents\"),\n \"local_media.office_generate\": tool(\"desktop_documents\"),\n \"local_media.archive_create\": dropped(SHELL_COVERS),\n \"local_media.archive_extract\": dropped(SHELL_COVERS),\n\n \"local_ner.entities\": tool(\"desktop_entities\"),\n \"local_ner.pii\": tool(\"desktop_entities\"),\n\n \"local_mac_apps.applescript\": tool(\"desktop_automation\"),\n \"local_mac_apps.list_emails\": tool(\"desktop_mail\"),\n \"local_mac_apps.send_email\": tool(\"desktop_mail\"),\n \"local_mac_apps.email_accounts\": tool(\"desktop_mail\"),\n \"local_mac_apps.list_messages\": tool(\"desktop_messages\"),\n \"local_mac_apps.list_conversations\": tool(\"desktop_messages\"),\n \"local_mac_apps.send_message\": tool(\"desktop_messages\"),\n \"local_mac_apps.search_contacts\": tool(\"desktop_contacts\"),\n \"local_mac_apps.get_contact\": tool(\"desktop_contacts\"),\n \"local_mac_apps.list_events\": tool(\"desktop_calendar\"),\n \"local_mac_apps.create_event\": tool(\"desktop_calendar\"),\n \"local_mac_apps.list_reminders\": tool(\"desktop_calendar\"),\n \"local_mac_apps.create_reminder\": tool(\"desktop_calendar\"),\n \"local_mac_apps.search_photos\": tool(\"desktop_photos\"),\n \"local_mac_apps.get_photo\": tool(\"desktop_photos\"),\n \"local_mac_apps.location\": tool(\"desktop_location\"),\n\n \"local_windows_ps.run\": tool(\"desktop_automation\"),\n \"local_windows_ps.get_env\": dropped(\"Read with shell_execute; a per-command env rides exec.run\"),\n \"local_windows_ps.set_env\": dropped(\"Changing the person's persistent environment is not an agent tool\"),\n \"local_windows_ps.registry_read\": tool(\"desktop_windows_admin\"),\n \"local_windows_ps.registry_write\": tool(\"desktop_windows_admin\"),\n \"local_windows_ps.service_list\": tool(\"desktop_windows_admin\"),\n \"local_windows_ps.service_control\": tool(\"desktop_windows_admin\"),\n \"local_windows_ps.event_log\": tool(\"desktop_windows_admin\"),\n \"local_windows_ps.windows_features\": tool(\"desktop_windows_admin\"),\n};\n\n/**\n * matrx-local's 19 action-enum dispatchers. Each fanned an `action` out to the handlers above and\n * did nothing else; they retire with the `matrx-local` executor binding (the platform reaches a\n * device through the relay now, never by client delegation).\n */\nexport const LEGACY_DISPATCHERS: readonly string[] = [\n \"local_file\",\n \"local_shell\",\n \"local_window\",\n \"local_process\",\n \"local_input\",\n \"local_audio\",\n \"local_clipboard\",\n \"local_screen\",\n \"local_system\",\n \"local_browser\",\n \"local_web\",\n \"local_net\",\n \"local_monitor\",\n \"local_schedule\",\n \"local_documents\",\n \"local_media\",\n \"local_ner\",\n \"local_mac_apps\",\n \"local_windows_ps\",\n];\n\n/** Built tools' ops, typed: a built tool naming an op the protocol does not have fails to compile in the test. */\nexport function builtOps(): OpName[] {\n return TOOL_CATALOG.filter((t) => t.state === \"built\").flatMap((t) => t.ops as OpName[]);\n}\n","/**\n * The generated tool status table (SPEC §10): tool × level × platform, built ONLY from harness\n * results (`ToolResultsFile`) joined with the catalog. Never written by hand; the one status anyone\n * cites. `renderToolStatusMarkdown` is the committed text form; screens render `ToolStatus` itself.\n */\nimport { ToolResultsFile, type ToolLevel, type ToolLevelResult, type ToolPlatform, type ToolTransport } from \"../schema/tools\";\nimport { EXCLUDED_TOOLS, TOOL_CATALOG, TOOL_GROUPS, type CatalogTool, type ToolGroupId, type ToolState } from \"./catalog\";\n\nexport const TOOL_LEVELS: readonly ToolLevel[] = [\"programmatic\", \"protocol\", \"chat\"];\nexport const TOOL_PLATFORMS: readonly ToolPlatform[] = [\"darwin\", \"win32\", \"linux\"];\n\n/**\n * `pass`: every required proof passed and none failed. `partial`: passes so far, a required proof\n * missing (`missing` says which). `fail`: the latest run of some proof failed. `untested`: nothing\n * ran. `not_built`: the tool is planned. `unsupported`: the tool does not exist on this platform.\n */\nconst UUID_IN_NAME = /[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}/gi;\n\nexport type CellState = \"pass\" | \"partial\" | \"fail\" | \"untested\" | \"not_built\" | \"unsupported\";\n\nexport interface StatusEvidence {\n readonly suite: string;\n readonly test: string;\n readonly transport: ToolTransport;\n readonly outcome: ToolLevelResult[\"outcome\"];\n readonly remote_network: boolean;\n readonly commit: string;\n readonly run_at_ms: number;\n readonly detail: string;\n /** Chat level: the tool calls the turn made, of any tool (absent on older evidence). */\n readonly calls_made?: number;\n}\n\n/**\n * A run that never exercised the tool: a `skip`, or a chat turn that made no tool calls at all (the\n * model answered in prose, or the chat request failed). It is shown as the latest run but is never\n * evidence about the tool, so it can neither prove a cell nor turn a proven one red.\n */\nexport function isInconclusive(e: Pick<StatusEvidence, \"outcome\" | \"calls_made\">): boolean {\n return e.outcome === \"skip\" || e.calls_made === 0;\n}\n\nexport interface StatusCell {\n readonly state: CellState;\n /** Required proofs not yet passed, e.g. \"relay from another network\". */\n readonly missing: readonly string[];\n readonly last_run_at_ms: number | null;\n readonly evidence: readonly StatusEvidence[];\n}\n\nexport interface StatusRow {\n readonly tool: string;\n readonly group: ToolGroupId;\n readonly tool_state: ToolState;\n readonly summary: string;\n readonly note: string | null;\n readonly cells: Readonly<Record<ToolPlatform, Readonly<Record<ToolLevel, StatusCell>>>>;\n /** Working on a platform = all three levels pass there (SPEC §10). */\n readonly working: Readonly<Record<ToolPlatform, boolean>>;\n}\n\nexport interface ToolStatus {\n readonly schema: \"matrx.tool-status.v1\";\n readonly generated_at_ms: number;\n readonly commits: readonly string[];\n readonly rows: readonly StatusRow[];\n readonly totals: Readonly<Record<ToolPlatform, { readonly working: number; readonly built: number; readonly tools: number }>>;\n}\n\n/** What each level needs before it reads `pass`. Level 2 is the transports AND the relay from another network. */\nconst REQUIRED: Readonly<Record<ToolLevel, readonly { readonly label: string; readonly ok: (e: StatusEvidence) => boolean }[]>> = {\n programmatic: [{ label: \"in process\", ok: (e) => e.transport === \"in_process\" }],\n protocol: [\n { label: \"localhost\", ok: (e) => e.transport === \"localhost\" },\n { label: \"relay\", ok: (e) => e.transport === \"relay\" },\n { label: \"relay from another network\", ok: (e) => e.transport === \"relay\" && e.remote_network },\n ],\n chat: [{ label: \"a real agent in a real chat\", ok: (e) => e.transport === \"agent\" }],\n};\n\nfunction cellFor(tool: CatalogTool, platform: ToolPlatform, level: ToolLevel, evidence: StatusEvidence[]): StatusCell {\n if (!tool.platforms.includes(platform)) return { state: \"unsupported\", missing: [], last_run_at_ms: null, evidence: [] };\n // The latest DECISIVE run of each (suite, test, transport, network) decides; older runs are\n // history. A run that never exercised the tool (`isInconclusive`) never replaces a decisive one:\n // it is kept beside it, when newer, so the table still shows that the last run proved nothing.\n const latest = new Map<string, StatusEvidence>();\n const latestInconclusive = new Map<string, StatusEvidence>();\n for (const e of evidence) {\n // A uuid in a test name (the agent a chat proof ran, a conversation) is run data, never the\n // proof's identity: the same proof under a new test agent replaces the old one's result.\n const key = `${e.suite}\\u0000${e.test.replace(UUID_IN_NAME, \"<id>\")}\\u0000${e.transport}\\u0000${e.remote_network}`;\n const into = isInconclusive(e) ? latestInconclusive : latest;\n const prev = into.get(key);\n if (!prev || prev.run_at_ms < e.run_at_ms) into.set(key, e);\n }\n const runs = [...latest.values()].sort((a, b) => b.run_at_ms - a.run_at_ms);\n const unproven = [...latestInconclusive].filter(([k, e]) => (latest.get(k)?.run_at_ms ?? -1) < e.run_at_ms).map(([, e]) => e);\n const shown = [...runs, ...unproven].sort((a, b) => b.run_at_ms - a.run_at_ms);\n const last = runs[0]?.run_at_ms ?? null;\n if (tool.state === \"planned\" && runs.length === 0) return { state: \"not_built\", missing: [], last_run_at_ms: null, evidence: [] };\n if (runs.length === 0) return { state: \"untested\", missing: REQUIRED[level].map((r) => r.label), last_run_at_ms: null, evidence: shown };\n if (runs.some((e) => e.outcome === \"fail\")) return { state: \"fail\", missing: [], last_run_at_ms: last, evidence: shown };\n const missing = REQUIRED[level].filter((r) => !runs.some((e) => e.outcome === \"pass\" && r.ok(e))).map((r) => r.label);\n return { state: missing.length === 0 ? \"pass\" : \"partial\", missing, last_run_at_ms: last, evidence: shown };\n}\n\n/** Build the table from every results file. Throws when a file is off-contract (never silently skipped). */\nexport function buildToolStatus(files: readonly unknown[], opts: { readonly generatedAtMs: number }): ToolStatus {\n const parsed = files.map((f, i) => {\n const r = ToolResultsFile.safeParse(f);\n if (!r.success) throw new Error(`tool results file #${i} is off-contract: ${r.error.issues[0]?.path.join(\".\")} ${r.error.issues[0]?.message}`);\n return r.data;\n });\n const known = new Set(TOOL_CATALOG.map((t) => t.name));\n const byKey = new Map<string, StatusEvidence[]>();\n for (const file of parsed) {\n for (const r of file.results) {\n if (!known.has(r.tool)) throw new Error(`a result names ${r.tool}, which is not in the tool catalog`);\n const key = `${r.tool}|${r.platform}|${r.level}`;\n const list = byKey.get(key) ?? [];\n list.push({\n suite: r.suite,\n test: r.test,\n transport: r.transport,\n outcome: r.outcome,\n remote_network: r.remote_network,\n commit: file.commit,\n run_at_ms: r.run_at_ms,\n detail: r.detail,\n ...(r.calls_made === undefined ? {} : { calls_made: r.calls_made }),\n });\n byKey.set(key, list);\n }\n }\n const groupOrder = new Map(TOOL_GROUPS.map((g) => [g.id, g.order]));\n const tools = [...TOOL_CATALOG].sort((a, b) => (groupOrder.get(a.group) ?? 99) - (groupOrder.get(b.group) ?? 99));\n const rows: StatusRow[] = tools.map((tool) => {\n const cells = {} as Record<ToolPlatform, Record<ToolLevel, StatusCell>>;\n const working = {} as Record<ToolPlatform, boolean>;\n for (const platform of TOOL_PLATFORMS) {\n const perLevel = {} as Record<ToolLevel, StatusCell>;\n for (const level of TOOL_LEVELS) perLevel[level] = cellFor(tool, platform, level, byKey.get(`${tool.name}|${platform}|${level}`) ?? []);\n cells[platform] = perLevel;\n working[platform] = TOOL_LEVELS.every((l) => perLevel[l].state === \"pass\");\n }\n return { tool: tool.name, group: tool.group, tool_state: tool.state, summary: tool.summary, note: tool.note ?? null, cells, working };\n });\n const totals = {} as Record<ToolPlatform, { working: number; built: number; tools: number }>;\n for (const platform of TOOL_PLATFORMS) {\n const onPlatform = TOOL_CATALOG.filter((t) => t.platforms.includes(platform));\n totals[platform] = {\n working: rows.filter((r) => r.working[platform]).length,\n built: onPlatform.filter((t) => t.state !== \"planned\").length,\n tools: onPlatform.length,\n };\n }\n const commits = [...new Set(parsed.map((f) => f.commit))].sort();\n return { schema: \"matrx.tool-status.v1\", generated_at_ms: opts.generatedAtMs, commits, rows, totals };\n}\n\nconst MARK: Readonly<Record<CellState, string>> = { pass: \"✓\", partial: \"◐\", fail: \"✗\", untested: \"·\", not_built: \"—\", unsupported: \" \" };\n\n/** The committed text form. Columns: per platform, the three levels (P = programmatic, R = protocol, C = chat). */\nexport function renderToolStatusMarkdown(status: ToolStatus): string {\n const lines: string[] = [\n \"<!-- GENERATED by `pnpm tools:status` from test results. Never edit by hand. -->\",\n \"# Local tools: status\",\n \"\",\n `Generated ${new Date(status.generated_at_ms).toISOString()} from commits ${status.commits.join(\", \") || \"none\"}.`,\n \"\",\n \"✓ pass · ◐ passing so far, a required proof missing · ✗ fail · `·` untested · — not built. Levels: P programmatic, R protocol, C chat.\",\n \"\",\n \"| Platform | Working | Built | Tools |\",\n \"|---|---|---|---|\",\n ...TOOL_PLATFORMS.map((p) => `| ${p} | ${status.totals[p].working} | ${status.totals[p].built} | ${status.totals[p].tools} |`),\n \"\",\n ];\n for (const group of TOOL_GROUPS) {\n const rows = status.rows.filter((r) => r.group === group.id);\n if (rows.length === 0) continue;\n lines.push(`## ${group.order}. ${group.title}`, \"\", \"| Tool | darwin P R C | win32 P R C | linux P R C | Missing |\", \"|---|---|---|---|---|\");\n for (const r of rows) {\n const cols = TOOL_PLATFORMS.map((p) => TOOL_LEVELS.map((l) => MARK[r.cells[p][l].state]).join(\" \"));\n const missing = new Set<string>();\n for (const p of TOOL_PLATFORMS) for (const l of TOOL_LEVELS) for (const m of r.cells[p][l].missing) if (r.cells[p][l].state !== \"untested\") missing.add(`${p} ${l}: ${m}`);\n const name = r.tool_state === \"broken\" ? `${r.tool} (broken: ${r.note ?? \"\"})` : r.tool;\n lines.push(`| ${name} | ${cols.join(\" | \")} | ${[...missing].join(\"; \")} |`);\n }\n lines.push(\"\");\n }\n const excluded = Object.entries(EXCLUDED_TOOLS);\n if (excluded.length > 0) {\n lines.push(\"## Not device tools\", \"\", \"| Tool | Why |\", \"|---|---|\", ...excluded.map(([name, why]) => `| ${name} | ${why} |`), \"\");\n }\n return lines.join(\"\\n\");\n}\n","/**\n * The per-device tool policy's op rule (Matrx 2: Agents › Tools' switches, the\n * `desktop.tools/disabled_on_device` knob). The relay carries an op, never the tool that sent it, and\n * several tools share ops (fs_read, fs_write and fs_edit all read with `fs.read`; shell_execute and\n * shell_python both run `exec.run`). So an op is refused when EVERY catalog tool that sends it is\n * turned off. Pure, data-only: the core enforces it on relay connections, the screen explains it.\n */\nimport { TOOL_CATALOG } from \"./catalog\";\n\n/** The ops refused when these tools are off: those every sending tool has turned off. */\nexport function refusedOps(disabledTools: readonly string[]): ReadonlySet<string> {\n const off = new Set(disabledTools);\n const senders = new Map<string, string[]>();\n for (const tool of TOOL_CATALOG) for (const op of tool.ops) senders.set(op, [...(senders.get(op) ?? []), tool.name]);\n const refused = new Set<string>();\n for (const [op, tools] of senders) if (tools.every((t) => off.has(t))) refused.add(op);\n return refused;\n}\n\n/** The catalog tools that send this op. */\nexport function toolsSending(op: string): string[] {\n return TOOL_CATALOG.filter((t) => t.ops.includes(op)).map((t) => t.name);\n}\n\n/**\n * For one tool switched off: the tools still on that keep ALL its ops open (turning it off alone\n * stops nothing until they are off too). Empty when turning it off stops at least one op.\n */\nexport function sharedOpsBlocking(tool: string, disabledTools: readonly string[]): string[] {\n const entry = TOOL_CATALOG.find((t) => t.name === tool);\n if (!entry || entry.ops.length === 0) return [];\n const off = new Set([...disabledTools, tool]);\n const refused = refusedOps([...off]);\n if (entry.ops.some((op) => refused.has(op))) return [];\n const keepers = new Set<string>();\n for (const op of entry.ops) for (const other of TOOL_CATALOG) if (other.name !== tool && !off.has(other.name) && other.ops.includes(op)) keepers.add(other.name);\n return [...keepers].sort();\n}\n"],"mappings":"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","names":["tool","tool"]}