@ai-matrx/desktop-protocol 0.21.67 → 0.21.68

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -1,7 +1,21 @@
1
1
  # Changelog
2
2
 
3
+ ## 0.21.68
4
+
5
+ UNVERIFIED: this release has no Unreleased entry and the source comparison could not be made (the caller supplied no source comparison). Whether source changed is unknown; consumer action is unknown.
6
+ Check the package's gitHead on npm against this version's gitHead: `git diff <previous gitHead> <this gitHead> -- apps/shared/desktop-protocol/src`.
7
+
3
8
  ## 0.21.67
4
9
 
10
+ SOURCE CHANGED WITH NO RELEASE NOTE. This release shipped source changes that nobody described in an Unreleased entry,
11
+ so they may include breaking API changes. Consumer action is UNKNOWN: read the diff before upgrading.
12
+ Diff: `git diff c483bfa702 8cbdd93fc9 -- apps/shared/desktop-protocol/src`
13
+
14
+ Changed shipped source files (1):
15
+ - `apps/shared/desktop-protocol/src/schema/audio.ts`
16
+
17
+ ## 0.21.66
18
+
5
19
  - **Protocol 1.67 — Matrx Local's local_mac_apps and local_windows_ps contracts, carried whole (2026-10-21).** Every parameter and result field those two dispatchers had now has a home: `mail.send` `bcc`; `mail.accounts` `mailboxes`; `messages.list` `contact` / `unread_only` (+ `read`, `service`, `chat_name`); `messages.chats` `last_message`; `contacts.search` without a `query` (the first `limit`); `calendar.list` `calendars` (+ `url`); `reminders.list` `lists` (+ `priority`, `completed_at_ms`); `photos.search` `media_type` (+ `media_type`, `duration_s`); `photos.get` `thumbnail_size` (+ `thumbnail_png_base64`); `location.get` `altitude_m`, `vertical_accuracy_m`, `speed_mps`, `course_deg`; `windows.services` `status`; `windows.service_control` `pause` / `resume`; `windows.event_log` `source`; `windows.features` `installed_only`. Optional; result fields stripped for a 1.66 peer by `forPeer`. Consumer action: Matrx 2's core serves them (matrx-desktop test/unit/legacy-contract-parity.test.ts).
6
20
  - **Protocol 1.66 — matrx-local's window and audio contracts on Matrx 2 (2026-10-21).** `window.list` takes `app` (owning app name substring, local_window's app_filter); `window.minimize` takes `mode` minimize / maximize / restore (local_window's window_action) and echoes it; `audio.record` takes `channels` and `sample_rate` and reports both; `audio.play` takes `device_id` (an output from audio.devices). Optional fields only, in FIELDS_SINCE; an older core refuses the new params as INVALID_PARAMS. Consumer action: none.
7
21
  - **Protocol 1.65 — "Continued from <account>" is a transcript item (2026-10-21).** `CodingTranscriptItem` gains `continued` (`id`, `from`, `text`, `at`): the line across a coding chat where it moved from another account (@ai-matrx/coding-sessions emits it where it used to emit an info `notice`). `forPeer` sends a 1.64 peer's `coding.history` / `coding.transcript.read` each as that `notice`, so its strict union never refuses the whole transcript. Consumer action: draw it as a divider at its place (the coding-sessions screen does).
@@ -11,6 +25,16 @@
11
25
  - **Protocol 1.61 — where a chat's title shows (2026-10-20).** `ChatRow.title_sync` (`ChatTitleSync`: `state` synced / not_synced / unsupported, and a `note`): the title facet's sync state for the chat's app, so a screen can say honestly whether the app shows the person's name. Optional; stripped for a 1.60 peer by `forPeer`. Consumer action: none.
12
26
  - **Shared code ships once per side (2026-10-18).** Built `splitting: false`, the root, `/frame` and `/client` each carried their own copy of 44 shared modules. ESM now builds them in one split pass (`chunk-server-*.js`, no banner); `/react` builds alone, stamped. CJS unsplit; declarations per group. ESM JS 610,843 -> 398,722 bytes; root + `/client` together 597 KB -> 390 KB; `/frame` stays zod-free (6 KB); every entry's export names identical (ESM and CJS). Guard: `../scripts/check-ships-once.mjs`, run in `build`. Consumer action: none.
13
27
 
28
+ ## 0.21.65
29
+
30
+ - **Protocol 1.66 — matrx-local's window and audio contracts on Matrx 2 (2026-10-21).** `window.list` takes `app` (owning app name substring, local_window's app_filter); `window.minimize` takes `mode` minimize / maximize / restore (local_window's window_action) and echoes it; `audio.record` takes `channels` and `sample_rate` and reports both; `audio.play` takes `device_id` (an output from audio.devices). Optional fields only, in FIELDS_SINCE; an older core refuses the new params as INVALID_PARAMS. Consumer action: none.
31
+ - **Protocol 1.65 — "Continued from <account>" is a transcript item (2026-10-21).** `CodingTranscriptItem` gains `continued` (`id`, `from`, `text`, `at`): the line across a coding chat where it moved from another account (@ai-matrx/coding-sessions emits it where it used to emit an info `notice`). `forPeer` sends a 1.64 peer's `coding.history` / `coding.transcript.read` each as that `notice`, so its strict union never refuses the whole transcript. Consumer action: draw it as a divider at its place (the coding-sessions screen does).
32
+ - **Protocol 1.64 — agent versions in Matrx 2 (2026-10-21).** New ops `account.agents.versions` (an agent's saved versions: number, age, note; the current version), `account.agents.version_diff` (one version and the current one as agent-definition records for `@ai-matrx/agents/versions/react` AgentDiffViewer) and `account.agents.restore_version` (`agx_promote_version`). New ops only; an older peer never sees them. Consumer action: none.
33
+ - **Protocol 1.63 — a chat's instance, and what an instance record lacks (2026-10-21).** `ChatRow.home` (`ChatPlace`): the instance whose folder holds the chat, read only (Claude: the side window holding its newest record copy, else main; Codex: the home whose database holds it). `AppInstance.missing` (`InstanceGap[]`: account / email / version): what the record still lacks after Matrx filled what it remembered (Matrx 2 ledger D10). Optional; stripped for a 1.62 peer by `forPeer`. Consumer action: none.
34
+ - **Protocol 1.62 — moves as records (2026-10-20).** `ChatRow.moved` (`ChatMove[]`, newest first: `kind` move / copy, `from`, `to`, `at_ms`, `back_at_ms`): every Move and Copy of a chat between instances as Matrx recorded it, so a screen reads where a chat went and whether it came back from the record, never from a project named "From X". Optional; stripped for a 1.61 peer by `forPeer`. Consumer action: none.
35
+ - **Protocol 1.61 — where a chat's title shows (2026-10-20).** `ChatRow.title_sync` (`ChatTitleSync`: `state` synced / not_synced / unsupported, and a `note`): the title facet's sync state for the chat's app, so a screen can say honestly whether the app shows the person's name. Optional; stripped for a 1.60 peer by `forPeer`. Consumer action: none.
36
+ - **Shared code ships once per side (2026-10-18).** Built `splitting: false`, the root, `/frame` and `/client` each carried their own copy of 44 shared modules. ESM now builds them in one split pass (`chunk-server-*.js`, no banner); `/react` builds alone, stamped. CJS unsplit; declarations per group. ESM JS 610,843 -> 398,722 bytes; root + `/client` together 597 KB -> 390 KB; `/frame` stays zod-free (6 KB); every entry's export names identical (ESM and CJS). Guard: `../scripts/check-ships-once.mjs`, run in `build`. Consumer action: none.
37
+
14
38
  ## 0.21.64
15
39
 
16
40
  SOURCE CHANGED WITH NO RELEASE NOTE. This release shipped source changes that nobody described in an Unreleased entry,
package/dist/client.cjs CHANGED
@@ -5013,6 +5013,13 @@ function createDesktopClient(options) {
5013
5013
  const listeners = /* @__PURE__ */ new Set();
5014
5014
  const readyWaiters = /* @__PURE__ */ new Set();
5015
5015
  const pending = /* @__PURE__ */ new Map();
5016
+ const abandoned = /* @__PURE__ */ new Set();
5017
+ const ABANDONED_MAX = 1024;
5018
+ function abandon(id) {
5019
+ if (!sendJson({ id, type: "cancel" })) return;
5020
+ abandoned.add(id);
5021
+ if (abandoned.size > ABANDONED_MAX) abandoned.delete(abandoned.values().next().value);
5022
+ }
5016
5023
  const streams = /* @__PURE__ */ new Map();
5017
5024
  const bySid = /* @__PURE__ */ new Map();
5018
5025
  const eventHandlers = /* @__PURE__ */ new Map();
@@ -5131,6 +5138,7 @@ function createDesktopClient(options) {
5131
5138
  const stopped = rule !== null && (rule.action === "stop" || rule.action === "reauth" && authRefusals >= 2);
5132
5139
  const terminal = stopped && rule ? rule : void 0;
5133
5140
  const lost = error ?? (terminal ? new DesktopProtocolError(terminal.error[0], terminal.error[1]) : rule && rule.action === "reauth" ? new DesktopProtocolError(rule.error[0], rule.error[1], { retryable: true }) : new DesktopProtocolError("DEVICE_OFFLINE", "Connection lost", { retryable: true }));
5141
+ abandoned.clear();
5134
5142
  for (const [id, p] of pending) {
5135
5143
  pending.delete(id);
5136
5144
  p.cleanup();
@@ -5234,7 +5242,10 @@ function createDesktopClient(options) {
5234
5242
  const s = streams.get(msg.id);
5235
5243
  if (s) return onStreamResult(s, msg.result);
5236
5244
  const p = pending.get(msg.id);
5237
- if (!p) return diagnose({ kind: "unknown_request", id: msg.id, type: msg.type });
5245
+ if (!p) {
5246
+ if (abandoned.delete(msg.id)) return;
5247
+ return diagnose({ kind: "unknown_request", id: msg.id, type: msg.type });
5248
+ }
5238
5249
  pending.delete(msg.id);
5239
5250
  p.cleanup();
5240
5251
  p.resolve(msg.result);
@@ -5251,7 +5262,10 @@ function createDesktopClient(options) {
5251
5262
  return endStream(s, null, error);
5252
5263
  }
5253
5264
  const p = pending.get(msg.id);
5254
- if (!p) return diagnose({ kind: "unknown_request", id: msg.id, type: msg.type });
5265
+ if (!p) {
5266
+ if (abandoned.delete(msg.id)) return;
5267
+ return diagnose({ kind: "unknown_request", id: msg.id, type: msg.type });
5268
+ }
5255
5269
  pending.delete(msg.id);
5256
5270
  p.cleanup();
5257
5271
  p.reject(error);
@@ -5482,13 +5496,13 @@ function createDesktopClient(options) {
5482
5496
  const timer = timers.setTimeout(() => {
5483
5497
  pending.delete(id);
5484
5498
  cleanup();
5485
- sendJson({ id, type: "cancel" });
5499
+ abandon(id);
5486
5500
  reject(new DesktopProtocolError("TIMEOUT", `${op} timed out`, { retryable: true }));
5487
5501
  }, timeoutMs);
5488
5502
  const onAbort = () => {
5489
5503
  pending.delete(id);
5490
5504
  cleanup();
5491
- sendJson({ id, type: "cancel" });
5505
+ abandon(id);
5492
5506
  reject(new DesktopProtocolError("CANCELLED", "Aborted"));
5493
5507
  };
5494
5508
  function cleanup() {