@ai-matrx/desktop-protocol 0.21.85 → 0.21.86

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.
@@ -4579,7 +4579,8 @@
4579
4579
  "type": "string",
4580
4580
  "enum": [
4581
4581
  "install",
4582
- "transcribe"
4582
+ "transcribe",
4583
+ "speak"
4583
4584
  ]
4584
4585
  },
4585
4586
  "fraction": {
@@ -4613,6 +4614,9 @@
4613
4614
  "type": "null"
4614
4615
  }
4615
4616
  ]
4617
+ },
4618
+ "audio": {
4619
+ "$ref": "#/$defs/TtsAudioChunk"
4616
4620
  }
4617
4621
  },
4618
4622
  "required": [
@@ -4963,6 +4967,12 @@
4963
4967
  "items": {
4964
4968
  "$ref": "#/$defs/UnusableTextModel"
4965
4969
  }
4970
+ },
4971
+ "speech": {
4972
+ "type": "array",
4973
+ "items": {
4974
+ "$ref": "#/$defs/CatalogModelEntry"
4975
+ }
4966
4976
  }
4967
4977
  },
4968
4978
  "required": [
@@ -5561,6 +5571,378 @@
5561
5571
  ],
5562
5572
  "additionalProperties": false
5563
5573
  },
5574
+ "TtsVoiceId": {
5575
+ "type": "string",
5576
+ "minLength": 1,
5577
+ "maxLength": 64,
5578
+ "pattern": "^[a-z0-9][a-z0-9_]*$"
5579
+ },
5580
+ "TtsVoice": {
5581
+ "type": "object",
5582
+ "properties": {
5583
+ "id": {
5584
+ "$ref": "#/$defs/TtsVoiceId"
5585
+ },
5586
+ "name": {
5587
+ "type": "string",
5588
+ "minLength": 1,
5589
+ "maxLength": 80
5590
+ },
5591
+ "gender": {
5592
+ "anyOf": [
5593
+ {
5594
+ "type": "string",
5595
+ "enum": [
5596
+ "female",
5597
+ "male"
5598
+ ]
5599
+ },
5600
+ {
5601
+ "type": "null"
5602
+ }
5603
+ ]
5604
+ },
5605
+ "language": {
5606
+ "type": "string",
5607
+ "minLength": 1,
5608
+ "maxLength": 64
5609
+ },
5610
+ "lang_code": {
5611
+ "type": "string",
5612
+ "minLength": 1,
5613
+ "maxLength": 4
5614
+ },
5615
+ "grade": {
5616
+ "anyOf": [
5617
+ {
5618
+ "type": "string",
5619
+ "maxLength": 4
5620
+ },
5621
+ {
5622
+ "type": "null"
5623
+ }
5624
+ ]
5625
+ },
5626
+ "traits": {
5627
+ "maxItems": 8,
5628
+ "type": "array",
5629
+ "items": {
5630
+ "type": "string",
5631
+ "minLength": 1,
5632
+ "maxLength": 32
5633
+ }
5634
+ },
5635
+ "custom": {
5636
+ "type": "boolean"
5637
+ }
5638
+ },
5639
+ "required": [
5640
+ "id",
5641
+ "name",
5642
+ "gender",
5643
+ "language",
5644
+ "lang_code",
5645
+ "grade",
5646
+ "traits",
5647
+ "custom"
5648
+ ],
5649
+ "additionalProperties": false
5650
+ },
5651
+ "TtsModelInfo": {
5652
+ "type": "object",
5653
+ "properties": {
5654
+ "id": {
5655
+ "$ref": "#/$defs/ModelKey"
5656
+ },
5657
+ "size_bytes": {
5658
+ "type": "integer",
5659
+ "minimum": 0,
5660
+ "maximum": 9007199254740991
5661
+ },
5662
+ "installed": {
5663
+ "type": "boolean"
5664
+ }
5665
+ },
5666
+ "required": [
5667
+ "id",
5668
+ "size_bytes",
5669
+ "installed"
5670
+ ],
5671
+ "additionalProperties": false
5672
+ },
5673
+ "ModelsTtsStatusParams": {
5674
+ "type": "object",
5675
+ "properties": {},
5676
+ "additionalProperties": false
5677
+ },
5678
+ "ModelsTtsStatusResult": {
5679
+ "type": "object",
5680
+ "properties": {
5681
+ "model": {
5682
+ "anyOf": [
5683
+ {
5684
+ "$ref": "#/$defs/TtsModelInfo"
5685
+ },
5686
+ {
5687
+ "type": "null"
5688
+ }
5689
+ ]
5690
+ },
5691
+ "runtime": {
5692
+ "$ref": "#/$defs/MlRuntimeState"
5693
+ },
5694
+ "voices": {
5695
+ "maxItems": 1000,
5696
+ "type": "array",
5697
+ "items": {
5698
+ "$ref": "#/$defs/TtsVoice"
5699
+ }
5700
+ },
5701
+ "default_voice": {
5702
+ "$ref": "#/$defs/TtsVoiceId"
5703
+ },
5704
+ "sample_rate": {
5705
+ "type": "integer",
5706
+ "minimum": 8000,
5707
+ "maximum": 192000
5708
+ },
5709
+ "speed_min": {
5710
+ "type": "number",
5711
+ "minimum": 0
5712
+ },
5713
+ "speed_max": {
5714
+ "type": "number",
5715
+ "minimum": 0
5716
+ },
5717
+ "error": {
5718
+ "anyOf": [
5719
+ {
5720
+ "type": "string",
5721
+ "maxLength": 300
5722
+ },
5723
+ {
5724
+ "type": "null"
5725
+ }
5726
+ ]
5727
+ }
5728
+ },
5729
+ "required": [
5730
+ "model",
5731
+ "runtime",
5732
+ "voices",
5733
+ "default_voice",
5734
+ "sample_rate",
5735
+ "speed_min",
5736
+ "speed_max",
5737
+ "error"
5738
+ ],
5739
+ "additionalProperties": false
5740
+ },
5741
+ "ModelsTtsInstallParams": {
5742
+ "type": "object",
5743
+ "properties": {},
5744
+ "additionalProperties": false
5745
+ },
5746
+ "ModelsTtsInstallResult": {
5747
+ "type": "object",
5748
+ "properties": {
5749
+ "model": {
5750
+ "$ref": "#/$defs/ModelKey"
5751
+ },
5752
+ "elapsed_ms": {
5753
+ "type": "integer",
5754
+ "minimum": 0,
5755
+ "maximum": 9007199254740991
5756
+ }
5757
+ },
5758
+ "required": [
5759
+ "model",
5760
+ "elapsed_ms"
5761
+ ],
5762
+ "additionalProperties": false
5763
+ },
5764
+ "TtsBlendPart": {
5765
+ "type": "object",
5766
+ "properties": {
5767
+ "voice": {
5768
+ "$ref": "#/$defs/TtsVoiceId"
5769
+ },
5770
+ "weight": {
5771
+ "type": "number",
5772
+ "minimum": 0,
5773
+ "maximum": 1
5774
+ }
5775
+ },
5776
+ "required": [
5777
+ "voice",
5778
+ "weight"
5779
+ ],
5780
+ "additionalProperties": false
5781
+ },
5782
+ "ModelsTtsSpeakParams": {
5783
+ "type": "object",
5784
+ "properties": {
5785
+ "text": {
5786
+ "type": "string",
5787
+ "minLength": 1,
5788
+ "maxLength": 100000
5789
+ },
5790
+ "voice": {
5791
+ "$ref": "#/$defs/TtsVoiceId"
5792
+ },
5793
+ "blend": {
5794
+ "minItems": 2,
5795
+ "maxItems": 5,
5796
+ "type": "array",
5797
+ "items": {
5798
+ "$ref": "#/$defs/TtsBlendPart"
5799
+ }
5800
+ },
5801
+ "speed": {
5802
+ "default": 1,
5803
+ "type": "number",
5804
+ "minimum": 0.5,
5805
+ "maximum": 2
5806
+ },
5807
+ "chunk_chars": {
5808
+ "type": "integer",
5809
+ "minimum": 40,
5810
+ "maximum": 5000
5811
+ }
5812
+ },
5813
+ "required": [
5814
+ "text"
5815
+ ],
5816
+ "additionalProperties": false
5817
+ },
5818
+ "ModelsTtsSpeakResult": {
5819
+ "type": "object",
5820
+ "properties": {
5821
+ "chunks": {
5822
+ "type": "integer",
5823
+ "minimum": 0,
5824
+ "maximum": 9007199254740991
5825
+ },
5826
+ "duration_s": {
5827
+ "type": "number",
5828
+ "minimum": 0
5829
+ },
5830
+ "sample_rate": {
5831
+ "type": "integer",
5832
+ "minimum": 8000,
5833
+ "maximum": 192000
5834
+ },
5835
+ "voice": {
5836
+ "type": "string",
5837
+ "minLength": 1,
5838
+ "maxLength": 200
5839
+ },
5840
+ "elapsed_ms": {
5841
+ "type": "integer",
5842
+ "minimum": 0,
5843
+ "maximum": 9007199254740991
5844
+ }
5845
+ },
5846
+ "required": [
5847
+ "chunks",
5848
+ "duration_s",
5849
+ "sample_rate",
5850
+ "voice",
5851
+ "elapsed_ms"
5852
+ ],
5853
+ "additionalProperties": false
5854
+ },
5855
+ "TtsAudioChunk": {
5856
+ "type": "object",
5857
+ "properties": {
5858
+ "index": {
5859
+ "type": "integer",
5860
+ "minimum": 0,
5861
+ "maximum": 9007199254740991
5862
+ },
5863
+ "sample_rate": {
5864
+ "type": "integer",
5865
+ "minimum": 8000,
5866
+ "maximum": 192000
5867
+ },
5868
+ "pcm16_base64": {
5869
+ "type": "string",
5870
+ "maxLength": 8000000
5871
+ },
5872
+ "text": {
5873
+ "type": "string",
5874
+ "maxLength": 5000
5875
+ }
5876
+ },
5877
+ "required": [
5878
+ "index",
5879
+ "sample_rate",
5880
+ "pcm16_base64",
5881
+ "text"
5882
+ ],
5883
+ "additionalProperties": false
5884
+ },
5885
+ "ModelsTtsVoiceSaveParams": {
5886
+ "type": "object",
5887
+ "properties": {
5888
+ "name": {
5889
+ "type": "string",
5890
+ "minLength": 1,
5891
+ "maxLength": 80
5892
+ },
5893
+ "blend": {
5894
+ "minItems": 2,
5895
+ "maxItems": 5,
5896
+ "type": "array",
5897
+ "items": {
5898
+ "$ref": "#/$defs/TtsBlendPart"
5899
+ }
5900
+ },
5901
+ "path": {
5902
+ "$ref": "#/$defs/AbsPath"
5903
+ }
5904
+ },
5905
+ "required": [
5906
+ "name"
5907
+ ],
5908
+ "additionalProperties": false
5909
+ },
5910
+ "ModelsTtsVoiceSaveResult": {
5911
+ "type": "object",
5912
+ "properties": {
5913
+ "voice": {
5914
+ "$ref": "#/$defs/TtsVoice"
5915
+ }
5916
+ },
5917
+ "required": [
5918
+ "voice"
5919
+ ],
5920
+ "additionalProperties": false
5921
+ },
5922
+ "ModelsTtsVoiceRemoveParams": {
5923
+ "type": "object",
5924
+ "properties": {
5925
+ "voice": {
5926
+ "$ref": "#/$defs/TtsVoiceId"
5927
+ }
5928
+ },
5929
+ "required": [
5930
+ "voice"
5931
+ ],
5932
+ "additionalProperties": false
5933
+ },
5934
+ "ModelsTtsVoiceRemoveResult": {
5935
+ "type": "object",
5936
+ "properties": {
5937
+ "removed": {
5938
+ "type": "boolean"
5939
+ }
5940
+ },
5941
+ "required": [
5942
+ "removed"
5943
+ ],
5944
+ "additionalProperties": false
5945
+ },
5564
5946
  "CodingServiceCredentials": {
5565
5947
  "type": "object",
5566
5948
  "properties": {
@@ -25471,6 +25853,70 @@
25471
25853
  "INTERNAL"
25472
25854
  ]
25473
25855
  },
25856
+ "models.tts.status": {
25857
+ "params": "ModelsTtsStatusParams",
25858
+ "result": "ModelsTtsStatusResult",
25859
+ "kind": "unary",
25860
+ "since": "1.81",
25861
+ "errors": [
25862
+ "RESOURCE_BUSY",
25863
+ "INTERNAL"
25864
+ ]
25865
+ },
25866
+ "models.tts.install": {
25867
+ "params": "ModelsTtsInstallParams",
25868
+ "result": "ModelsTtsInstallResult",
25869
+ "kind": "unary",
25870
+ "since": "1.81",
25871
+ "errors": [
25872
+ "NOT_FOUND",
25873
+ "RESOURCE_BUSY",
25874
+ "RESOURCE_GONE",
25875
+ "TIMEOUT",
25876
+ "CANCELLED",
25877
+ "INTERNAL"
25878
+ ]
25879
+ },
25880
+ "models.tts.speak": {
25881
+ "params": "ModelsTtsSpeakParams",
25882
+ "result": "ModelsTtsSpeakResult",
25883
+ "kind": "unary",
25884
+ "since": "1.81",
25885
+ "errors": [
25886
+ "NOT_FOUND",
25887
+ "INVALID_PARAMS",
25888
+ "RESOURCE_BUSY",
25889
+ "RESOURCE_GONE",
25890
+ "TIMEOUT",
25891
+ "CANCELLED",
25892
+ "INTERNAL"
25893
+ ]
25894
+ },
25895
+ "models.tts.voice_save": {
25896
+ "params": "ModelsTtsVoiceSaveParams",
25897
+ "result": "ModelsTtsVoiceSaveResult",
25898
+ "kind": "unary",
25899
+ "since": "1.81",
25900
+ "errors": [
25901
+ "NOT_FOUND",
25902
+ "INVALID_PARAMS",
25903
+ "PAYLOAD_TOO_LARGE",
25904
+ "CONFLICT",
25905
+ "RESOURCE_BUSY",
25906
+ "INTERNAL"
25907
+ ]
25908
+ },
25909
+ "models.tts.voice_remove": {
25910
+ "params": "ModelsTtsVoiceRemoveParams",
25911
+ "result": "ModelsTtsVoiceRemoveResult",
25912
+ "kind": "unary",
25913
+ "since": "1.81",
25914
+ "errors": [
25915
+ "NOT_FOUND",
25916
+ "INVALID_PARAMS",
25917
+ "INTERNAL"
25918
+ ]
25919
+ },
25474
25920
  "apps.list": {
25475
25921
  "params": "AppsListParams",
25476
25922
  "result": "AppsListResult",
@@ -28126,6 +28572,26 @@
28126
28572
  "params": "ModelsLocalRemoveParams",
28127
28573
  "result": "ModelsLocalRemoveResult"
28128
28574
  },
28575
+ "ml.tts_status": {
28576
+ "params": "ModelsTtsStatusParams",
28577
+ "result": "ModelsTtsStatusResult"
28578
+ },
28579
+ "ml.tts_install": {
28580
+ "params": "ModelsTtsInstallParams",
28581
+ "result": "ModelsTtsInstallResult"
28582
+ },
28583
+ "ml.tts_speak": {
28584
+ "params": "ModelsTtsSpeakParams",
28585
+ "result": "ModelsTtsSpeakResult"
28586
+ },
28587
+ "ml.tts_voice_save": {
28588
+ "params": "ModelsTtsVoiceSaveParams",
28589
+ "result": "ModelsTtsVoiceSaveResult"
28590
+ },
28591
+ "ml.tts_voice_remove": {
28592
+ "params": "ModelsTtsVoiceRemoveParams",
28593
+ "result": "ModelsTtsVoiceRemoveResult"
28594
+ },
28129
28595
  "ml.catalog_set": {
28130
28596
  "params": "MlCatalogSetParams",
28131
28597
  "result": "MlCatalogSetResult"
@@ -28190,7 +28656,11 @@
28190
28656
  "problem": "1.69"
28191
28657
  },
28192
28658
  "MlCatalogSetParams": {
28193
- "unusable": "1.69"
28659
+ "unusable": "1.69",
28660
+ "speech": "1.81"
28661
+ },
28662
+ "MlProgress": {
28663
+ "audio": "1.81"
28194
28664
  },
28195
28665
  "ModelsLlmStartParams": {
28196
28666
  "gpu_layers": "1.48",
@@ -28491,5 +28961,5 @@
28491
28961
  "olderPeersGet": 0
28492
28962
  }
28493
28963
  },
28494
- "x-protocol-version": "1.80"
28964
+ "x-protocol-version": "1.81"
28495
28965
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ai-matrx/desktop-protocol",
3
- "version": "0.21.85",
3
+ "version": "0.21.86",
4
4
  "description": "The one wire contract between Matrx 2 (the desktop app) and every client that drives it — phone, web app, extension, server: zod schemas for the envelope and every cap.op, the 16-byte binary frame codec, a reconnecting request/stream/credit/reattach client, React hooks, and a generated JSON Schema + Pydantic twin that CI keeps byte-identical.",
5
5
  "type": "module",
6
6
  "main": "./dist/index.cjs",
@@ -78,9 +78,9 @@
78
78
  "./package.json": "./package.json"
79
79
  },
80
80
  "dependencies": {
81
- "zod": "^4.6.5",
82
81
  "@ai-matrx/data": "latest",
83
- "@ai-matrx/kit": "latest"
82
+ "@ai-matrx/kit": "latest",
83
+ "zod": "^4.6.5"
84
84
  },
85
85
  "devDependencies": {
86
86
  "@arethetypeswrong/cli": "^0.18.5",
@@ -137,5 +137,5 @@
137
137
  "test:watch": "vitest",
138
138
  "verify:tarball": "node ./scripts/verify-tarball.mjs"
139
139
  },
140
- "gitHead": "0a2b8c9356bcba5cf0338a6c2c63b1c6058374ef"
140
+ "gitHead": "348cc633ad717531de3fdce77009453d3bbd1422"
141
141
  }
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/versioning.ts","../src/close-policy.ts"],"sourcesContent":["/**\n * Version skew is the normal state: a phone, the server and a desktop app in the field run\n * different package versions, and a minor protocol bump must never make any of them fail.\n *\n * THE RULE (enforced by src/versioning.test.ts against generated/baseline-1.0.json):\n * 1. Within a major, a minor may only ADD. A field added after x.0 is OPTIONAL in the schema\n * (an older peer omits it) and is listed in FIELDS_SINCE with the minor that added it.\n * 2. A writer never sends a field newer than the version its peer negotiated (hello/welcome, or\n * the /call version header): older peers' strict schemas refuse unknown keys. `forPeer`\n * does the stripping; the core's Router applies it to every result and error it sends.\n * 3. A reader that needs a newer field checks the peer's version and says so loudly when the\n * peer is older (e.g. aidream's local_proxy marks a patch answer from a 1.0 app).\n */\nimport { compareVersions } from \"@ai-matrx/kit/versions\";\n\nimport type { OpName } from \"./schema/registry\";\nimport type { ErrorReasonName } from \"./types\";\nimport { PROTOCOL_MAJOR, PROTOCOL_MINOR } from \"./schema/primitives\";\n\n/**\n * Fields added after x.0, by schema location: a named schema (`FsPatchResult`), a property path\n * inside one (`ProtocolErrorBody.data`), or a union branch (`RelayCallResponse|0`).\n */\nexport const FIELDS_SINCE = {\n LlmRunning: { context_length: \"1.48\", gpu_layers: \"1.48\", threads: \"1.48\" },\n TextModelInfo: { title: \"1.69\", problem: \"1.69\" },\n MlCatalogSetParams: { unusable: \"1.69\" },\n ModelsLlmStartParams: { gpu_layers: \"1.48\", threads: \"1.48\", load_timeout_s: \"1.48\" },\n FsPatchResult: { edits_applied: \"1.1\", edits_failed: \"1.1\" },\n \"ProtocolErrorBody.data\": { edits_failed: \"1.1\" },\n \"RelayCallResponse|0\": { protocol_version: \"1.1\" },\n \"RelayCallResponse|1\": { protocol_version: \"1.1\" },\n WindowInfo: { app: \"1.7\", pid: \"1.7\" },\n AppWindowInfo: { remote_control: \"1.50\" },\n WindowRemoteControl: { problem: \"1.52\" },\n CodingProviderStatus: { accounts: \"1.53\", accountsProblem: \"1.53\", usage: \"1.57\", continueOn: \"1.57\" },\n CodingProviderAccount: { ready: \"1.57\", lastProblem: \"1.57\", problem: \"1.57\", fix: \"1.57\", usage: \"1.57\", continueOn: \"1.57\" },\n CodingSessionRecord: { accountId: \"1.57\" },\n CodingDiscoveredChat: { accountId: \"1.57\" },\n CodingRecentRow: { accountId: \"1.57\" },\n CodingSearchHit: { accountId: \"1.57\" },\n AppInstance: { missing: \"1.63\" },\n AppsInstancesListParams: { fresh: \"1.51\" },\n AppsInstancesListResult: { as_of_ms: \"1.51\", refreshing: \"1.51\", computer: \"1.71\", elsewhere: \"1.71\", shared_problem: \"1.71\" },\n AppsAccountsListParams: { fresh: \"1.51\" },\n AppsAccountsListResult: { as_of_ms: \"1.51\", refreshing: \"1.51\", shared_problem: \"1.71\" },\n AppsChatsListResult: { updating: \"1.9\", live: \"1.9\", families: \"1.10\" },\n AppsAccountsUsageResult: { problem: \"1.12\" },\n AppsAccountsResetsResult: { problem: \"1.12\" },\n ColdChat: { hidden: \"1.78\" },\n SpendChat: { hidden: \"1.78\" },\n SpendLive: { hidden: \"1.78\" },\n SpendIdle: { hidden: \"1.78\" },\n ChatRow: { app_project: \"1.13\", tokens: \"1.13\", original_title: \"1.14\", title_source: \"1.14\", title_override: \"1.14\", archived: \"1.15\", session_id: \"1.59\", app_groups: \"1.59\", parent: \"1.59\", prior_sessions: \"1.59\", title_sync: \"1.61\", moved: \"1.62\", home: \"1.63\", hidden: \"1.70\", pin_sync: \"1.72\" },\n AccountUsage: { plan: \"1.13\", credits: \"1.13\", five_hour_resets_by_ms: \"1.25\", read_source: \"1.73\" },\n AppAccount: { profile: \"1.73\", read_source: \"1.73\", session_cost_usd: \"1.73\", readings: \"1.79\" },\n ResourcesDisk: { name: \"1.17\" },\n StackServer: { cpu_percent: \"1.18\", memory_bytes: \"1.18\" },\n AudioDevice: { kind: \"1.24\" },\n AudioRecordParams: { channels: \"1.66\", sample_rate: \"1.66\" },\n AudioRecordResult: { channels: \"1.66\", sample_rate: \"1.66\" },\n AudioPlayParams: { device_id: \"1.66\" },\n WindowListParams: { app: \"1.66\" },\n WindowMinimizeParams: { mode: \"1.66\" },\n WindowMinimizeResult: { mode: \"1.66\" },\n ScreenDisplay: { rotation: \"1.24\", refresh_hz: \"1.24\", builtin: \"1.24\" },\n PowerStatusResult: { energy: \"1.24\" },\n AppsSpendResult: { days: \"1.24\" },\n AppsWindowsUpdateStateResult: { closed_by_update: \"1.27\" },\n AppsProjectsToWindowParams: { pin: \"1.32\", chat_ids: \"1.36\", take_off_from: \"1.36\", group_id: \"1.43\", group_name: \"1.43\" },\n AppsProjectsToWindowResult: { pin: \"1.32\", chats: \"1.43\" },\n ProjectMoveGroup: { when: \"1.43\", group_id: \"1.43\" },\n AppsChatsTitlesCheckResult: { stale_windows: \"1.33\" },\n AccountAgent: { tags: \"1.39\", model_id: \"1.39\", access_level: \"1.39\", organization_id: \"1.39\", origin: \"1.39\", is_archived: \"1.39\", orchestra: \"1.39\" },\n WebScrapeParams: { engine: \"1.40\", land: \"1.40\" },\n WebScrapePage: { source: \"1.40\" },\n WebBrowserFetchParams: { land: \"1.40\" },\n WebBrowserFetchResult: { source: \"1.40\" },\n SysinfoGetResult: { requirements: \"1.41\" },\n \"SysinfoGetResult.permissions[]\": { detail: \"1.41\" },\n MessagesSendParams: { service: \"1.42\" },\n // 1.67: Matrx Local's local_mac_apps and local_windows_ps contracts, carried whole.\n MailAccount: { mailboxes: \"1.67\" },\n MailSendParams: { bcc: \"1.67\" },\n MessagesChat: { last_message: \"1.67\" },\n MessagesListParams: { contact: \"1.67\", unread_only: \"1.67\" },\n MessagesMessage: { read: \"1.67\", service: \"1.67\", chat_name: \"1.67\" },\n CalendarListParams: { calendars: \"1.67\" },\n CalendarEvent: { url: \"1.67\" },\n RemindersListParams: { lists: \"1.67\" },\n Reminder: { priority: \"1.67\", completed_at_ms: \"1.67\" },\n PhotosSearchParams: { media_type: \"1.67\" },\n Photo: { media_type: \"1.67\", duration_s: \"1.67\" },\n PhotosGetParams: { thumbnail_size: \"1.67\" },\n PhotosGetResult: { thumbnail_png_base64: \"1.67\" },\n LocationGetResult: { altitude_m: \"1.67\", vertical_accuracy_m: \"1.67\", speed_mps: \"1.67\", course_deg: \"1.67\" },\n WindowsServicesParams: { status: \"1.67\" },\n WindowsEventLogParams: { source: \"1.67\" },\n WindowsFeaturesParams: { installed_only: \"1.67\" },\n SysinfoHardwareResult: { graphics: \"1.45\" },\n DownloadRow: { error: \"1.46\" },\n CopyRestart: { reopened: \"1.60\" },\n AccountAgentsRestoreVersionResult: { new_version: \"1.68\", unchanged: \"1.68\" },\n} as const satisfies Record<string, Record<string, `${number}.${number}`>>;\n\nexport type FieldsSincePath = keyof typeof FIELDS_SINCE;\n\n/**\n * 1.0 fields that a later minor lets be null, and what a peer older than that minor is sent\n * instead (the value that meant the same thing before). Widening a field any other way is a major.\n */\nexport const NULL_SINCE = {\n \"RelayDeviceStatusEvent.since_ms\": { since: \"1.1\", olderPeersGet: 0 },\n} as const satisfies Record<string, { since: `${number}.${number}`; olderPeersGet: unknown }>;\n\n/**\n * Error reasons added after x.0, with the minor that added each. An older peer's strict enum would\n * refuse the whole error body, so `forPeer` drops a reason the peer does not know (the code, the\n * message and `retryable` still tell it what happened).\n */\nexport const REASONS_SINCE = {\n runtime_not_installed: \"1.2\",\n model_not_installed: \"1.2\",\n unsupported_media: \"1.2\",\n download_failed: \"1.2\",\n service_starting: \"1.2\",\n service_restarted: \"1.2\",\n service_failed: \"1.2\",\n browser_not_connected: \"1.28\",\n browser_ambiguous: \"1.28\",\n browser_account_mismatch: \"1.28\",\n browser_connection_off: \"1.28\",\n awaiting_confirmation: \"1.28\",\n tool_disabled_on_device: \"1.34\",\n model_not_running: \"1.76\",\n model_server_unreachable: \"1.76\",\n} as const satisfies Partial<Record<ErrorReasonName, `${number}.${number}`>>;\n\n/**\n * (1.41) Values a later minor added to an enum a peer reads inside a list, by the minor that added\n * each: sysinfo.get's permission names. An older peer's strict enum would refuse the whole answer,\n * so `forPeer` leaves out the rows it does not know (it is never sent a name it cannot read).\n */\nexport const PERMISSIONS_SINCE = {\n reminders: \"1.41\",\n speech_recognition: \"1.41\",\n messages: \"1.41\",\n mail: \"1.41\",\n wifi: \"1.41\",\n} as const satisfies Record<string, `${number}.${number}`>;\n\n/**\n * (1.80) Values a later minor added to SetupItemKind (apps.setup.list `setups[].items[].kind`), by\n * the minor that added each. An older peer's strict enum would refuse the whole answer, so `forPeer`\n * leaves out the items it does not know.\n */\nexport const SETUP_KINDS_SINCE = {\n skill: \"1.80\",\n} as const satisfies Record<string, `${number}.${number}`>;\n\nfunction setupItemsForPeer(value: unknown, version: string): unknown {\n if (value === null || typeof value !== \"object\" || Array.isArray(value)) return value;\n const body = value as { setups?: unknown };\n if (!Array.isArray(body.setups)) return value;\n const since = SETUP_KINDS_SINCE as Record<string, string>;\n const setups: unknown[] = body.setups;\n const next = setups.map((s: unknown) => {\n const items = (s as { items?: unknown } | null)?.items;\n if (!Array.isArray(items)) return s;\n const kept = items.filter((i: unknown) => {\n const kind = (i as { kind?: unknown } | null)?.kind;\n const added = typeof kind === \"string\" ? since[kind] : undefined;\n return !added || knows(version, added);\n });\n return kept.length === items.length ? s : { ...(s as Record<string, unknown>), items: kept };\n });\n return next.some((s, i) => s !== setups[i]) ? { ...body, setups: next } : value;\n}\n\nfunction permissionsForPeer(value: unknown, version: string): unknown {\n if (value === null || typeof value !== \"object\" || Array.isArray(value)) return value;\n const body = value as { permissions?: unknown };\n if (!Array.isArray(body.permissions)) return value;\n const since = PERMISSIONS_SINCE as Record<string, string>;\n const kept = body.permissions.filter((p: unknown) => {\n const name = (p as { name?: unknown } | null)?.name;\n const added = typeof name === \"string\" ? since[name] : undefined;\n return !added || knows(version, added);\n });\n return kept.length === body.permissions.length ? value : { ...body, permissions: kept };\n}\n\n/** A device status for a reader at `version`: `since_ms` null (\"never\") becomes 0 before 1.1. */\nexport function statusForPeer<T extends { since_ms: number | null }>(status: T, version: string): T {\n const rule = NULL_SINCE[\"RelayDeviceStatusEvent.since_ms\"];\n return status.since_ms === null && !knows(version, rule.since) ? { ...status, since_ms: rule.olderPeersGet } : status;\n}\n\n/**\n * A WebSocket client announces the newest minor it reads at connect time by also offering\n * `matrx.v<major>.<minor>` beside SUBPROTOCOL (servers still answer SUBPROTOCOL). Before hello is\n * possible, this is how the relay picks the right shape for its greeting.\n */\nexport function versionSubprotocol(version: string): string {\n return `matrx.v${version}`;\n}\n\n/** The version a client announced in its offered subprotocols; \"1.0\" when it did not. */\nexport function announcedVersion(offered: readonly string[]): string {\n let best = `${PROTOCOL_MAJOR}.0`;\n for (const p of offered) {\n const m = /^matrx\\.v(\\d+\\.\\d+)$/.exec(p.trim());\n if (m?.[1] && compareVersions(m[1], best) > 0 && m[1].startsWith(`${PROTOCOL_MAJOR}.`)) best = m[1];\n }\n return best;\n}\n\n/** True when a peer at `version` knows a field added in `since`. */\nexport function knows(version: string, since: string): boolean {\n return compareVersions(version, since) >= 0;\n}\n\n/** The version two peers speak: the lower minor within this major. */\nexport function negotiate(peerVersion: string): string {\n const [major = 0, minor = 0] = peerVersion.split(\".\").map(Number);\n if (major !== PROTOCOL_MAJOR) return `${PROTOCOL_MAJOR}.0`;\n return `${PROTOCOL_MAJOR}.${Math.min(minor, PROTOCOL_MINOR)}`;\n}\n\nfunction strip(value: unknown, fields: Record<string, string> | undefined, version: string): unknown {\n if (!fields || value === null || typeof value !== \"object\" || Array.isArray(value)) return value;\n let out: Record<string, unknown> | null = null;\n for (const [field, since] of Object.entries(fields)) {\n if (field in (value as object) && !knows(version, since)) {\n out ??= { ...(value as Record<string, unknown>) };\n delete out[field];\n }\n }\n return out ?? value;\n}\n\nconst RESULT_PATH = new Map<OpName, FieldsSincePath>([\n [\"fs.patch\", \"FsPatchResult\"],\n [\"apps.chats.list\", \"AppsChatsListResult\"],\n [\"apps.accounts.usage\", \"AppsAccountsUsageResult\"],\n [\"apps.accounts.resets\", \"AppsAccountsResetsResult\"],\n [\"apps.windows.update_state\", \"AppsWindowsUpdateStateResult\"],\n [\"web.fetch_with_browser\", \"WebBrowserFetchResult\"],\n [\"sysinfo.get\", \"SysinfoGetResult\"],\n [\"sysinfo.hardware\", \"SysinfoHardwareResult\"],\n [\"apps.projects.to_window\", \"AppsProjectsToWindowResult\"],\n // 1.67: Matrx Local's local_mac_apps result fields.\n [\"photos.get\", \"PhotosGetResult\"],\n [\"location.get\", \"LocationGetResult\"],\n [\"account.agents.restore_version\", \"AccountAgentsRestoreVersionResult\"],\n]);\n\n/** 1.13: results that carry a named schema with versioned fields under a key (one object or an array of them). */\nconst NESTED_RESULTS: ReadonlyMap<OpName, ReadonlyArray<readonly [string, FieldsSincePath]>> = new Map<OpName, ReadonlyArray<readonly [string, FieldsSincePath]>>([\n [\"apps.chats.list\", [[\"chats\", \"ChatRow\"]]],\n [\"apps.projects.file\", [[\"chat\", \"ChatRow\"]]],\n [\"apps.projects.file_many\", [[\"chats\", \"ChatRow\"]]],\n [\"apps.projects.unfile\", [[\"chat\", \"ChatRow\"]]],\n [\"apps.projects.move\", [[\"chat\", \"ChatRow\"]]],\n [\"apps.chats.star\", [[\"chat\", \"ChatRow\"]]],\n // 1.78: our Hide on the cold and spend rows.\n [\"apps.chats.cold\", [[\"waiting\", \"ColdChat\"], [\"recently_cold\", \"ColdChat\"]]],\n [\"apps.spend\", [[\"chats\", \"SpendChat\"], [\"live\", \"SpendLive\"], [\"idle\", \"SpendIdle\"]]],\n [\"apps.chats.place\", [[\"chat\", \"ChatRow\"]]],\n [\"apps.accounts.usage\", [[\"accounts\", \"AccountUsage\"]]],\n // 1.73/1.79: the account rows' newer fields (profile, read_source, session_cost_usd, readings).\n [\"apps.accounts.list\", [[\"accounts\", \"AppAccount\"]]],\n [\"resources.snapshot\", [[\"disks\", \"ResourcesDisk\"]]],\n [\"stack.state\", [[\"servers\", \"StackServer\"]]],\n [\"account.agents.list\", [[\"agents\", \"AccountAgent\"]]],\n [\"web.scrape\", [[\"pages\", \"WebScrapePage\"]]],\n [\"sysinfo.get\", [[\"permissions\", \"SysinfoGetResult.permissions[]\"]]],\n [\"models.downloads.list\", [[\"downloads\", \"DownloadRow\"]]],\n [\"apps.projects.to_window\", [[\"group\", \"ProjectMoveGroup\"]]],\n // 1.60: each closed window's reopen outcome in a restart_verify copy.\n [\"apps.chats.copy_to_account\", [[\"restart\", \"CopyRestart\"]]],\n [\"apps.windows.list\", [[\"windows\", \"AppWindowInfo\"]]],\n // 1.63: what an instance record still lacks.\n [\"apps.instances.list\", [[\"instances\", \"AppInstance\"]]],\n [\"apps.windows.set_remote_control\", [[\"remote_control\", \"WindowRemoteControl\"]]],\n // 1.67: Matrx Local's local_mac_apps result fields.\n [\"mail.accounts\", [[\"accounts\", \"MailAccount\"]]],\n [\"messages.chats\", [[\"chats\", \"MessagesChat\"]]],\n [\"messages.list\", [[\"messages\", \"MessagesMessage\"]]],\n [\"calendar.list\", [[\"events\", \"CalendarEvent\"]]],\n [\"reminders.list\", [[\"reminders\", \"Reminder\"]]],\n [\"photos.search\", [[\"photos\", \"Photo\"]]],\n [\"photos.get\", [[\"photo\", \"Photo\"]]],\n [\"coding.providers\", [[\"providers\", \"CodingProviderStatus\"]]],\n // 1.57: the account a coding record belongs to.\n [\"coding.sessions.list\", [[\"sessions\", \"CodingSessionRecord\"], [\"recent\", \"CodingRecentRow\"]]],\n [\"coding.recent.seen\", [[\"recent\", \"CodingRecentRow\"]]],\n [\"coding.discover\", [[\"chats\", \"CodingDiscoveredChat\"]]],\n [\"coding.search\", [[\"hits\", \"CodingSearchHit\"]]],\n [\"coding.start\", [[\"session\", \"CodingSessionRecord\"]]],\n [\"coding.send\", [[\"session\", \"CodingSessionRecord\"]]],\n [\"coding.takeover\", [[\"session\", \"CodingSessionRecord\"]]],\n [\"coding.options.set\", [[\"session\", \"CodingSessionRecord\"]]],\n [\"coding.agent.set\", [[\"session\", \"CodingSessionRecord\"]]],\n [\"coding.account.continue\", [[\"session\", \"CodingSessionRecord\"]]],\n]);\n\nfunction stripNested(value: unknown, nested: ReadonlyArray<readonly [string, FieldsSincePath]>, version: string): unknown {\n if (value === null || typeof value !== \"object\" || Array.isArray(value)) return value;\n let body = value as Record<string, unknown>;\n for (const [key, path] of nested) {\n const inner = body[key];\n if (inner === undefined || inner === null) continue;\n const fields = FIELDS_SINCE[path];\n if (Array.isArray(inner)) {\n const next = inner.map((x: unknown) => strip(x, fields, version));\n if (next.some((x, i) => x !== inner[i])) body = { ...body, [key]: next };\n } else {\n const next = strip(inner, fields, version);\n if (next !== inner) body = { ...body, [key]: next };\n }\n }\n return body;\n}\n\n/**\n * (1.52) apps.windows.list for a peer older than 1.52: each window's `remote_control` loses `problem`,\n * and a window whose settings file is damaged (\"unreadable\", a value its strict enum does not know)\n * has no `remote_control` at all (not known) instead of failing the whole list.\n */\nfunction windowListRemoteControlForPeer(value: unknown, version: string): unknown {\n if (knows(version, \"1.52\") || value === null || typeof value !== \"object\") return value;\n const body = value as { windows?: unknown };\n if (!Array.isArray(body.windows)) return value;\n const windows: unknown[] = body.windows;\n const next = windows.map((w: unknown) => {\n const rc = (w as { remote_control?: unknown } | null)?.remote_control;\n if (rc === null || typeof rc !== \"object\") return w;\n if ((rc as { setting?: unknown }).setting === \"unreadable\") {\n const { remote_control: _dropped, ...rest } = w as Record<string, unknown>;\n return rest;\n }\n const kept = strip(rc, FIELDS_SINCE.WindowRemoteControl, version);\n return kept === rc ? w : { ...(w as Record<string, unknown>), remote_control: kept };\n });\n return next.some((w, i) => w !== windows[i]) ? { ...body, windows: next } : value;\n}\n\n/**\n * coding.providers, one level below the providers:\n * (1.54) for a peer older than 1.54, a default model whose source is \"account\" (a value its strict\n * enum does not know) is sent as \"driver\" (the app picked it, not the person's settings\n * file), instead of failing the whole answer;\n * (1.57) each of a provider's `accounts` loses the fields newer than the peer (its health, usage\n * and \"Continue on\").\n */\nfunction providersForPeer(value: unknown, version: string): unknown {\n if (knows(version, \"1.57\") || value === null || typeof value !== \"object\") return value;\n const body = value as { providers?: unknown };\n if (!Array.isArray(body.providers)) return value;\n const providers: unknown[] = body.providers;\n const next = providers.map((p: unknown) => {\n if (p === null || typeof p !== \"object\") return p;\n let out = p as Record<string, unknown>;\n const dm = out.defaultModel;\n if (!knows(version, \"1.54\") && dm !== null && typeof dm === \"object\" && (dm as { source?: unknown }).source === \"account\") {\n out = { ...out, defaultModel: { ...(dm as Record<string, unknown>), source: \"driver\" } };\n }\n const accounts = out.accounts;\n if (Array.isArray(accounts)) {\n const kept = accounts.map((a: unknown) => strip(a, FIELDS_SINCE.CodingProviderAccount, version));\n if (kept.some((a, i) => a !== accounts[i])) out = { ...out, accounts: kept };\n }\n return out;\n });\n return next.some((p, i) => p !== providers[i]) ? { ...body, providers: next } : value;\n}\n\n/**\n * (1.65) coding.history / coding.transcript.read for a peer older than 1.65: a `continued` item (a\n * kind its strict union does not know, which would refuse the whole transcript) is sent as the\n * info `notice` it was before (\"Continued from Alpha\").\n */\nfunction transcriptItemsForPeer(value: unknown, version: string): unknown {\n if (knows(version, \"1.65\") || value === null || typeof value !== \"object\") return value;\n const body = value as { items?: unknown };\n if (!Array.isArray(body.items)) return value;\n const items: unknown[] = body.items;\n const next = items.map((item: unknown) => {\n const it = item as { kind?: unknown; id?: unknown; text?: unknown } | null;\n if (it?.kind !== \"continued\") return item;\n return { kind: \"notice\", id: it.id, level: \"info\", text: it.text };\n });\n return next.some((it, i) => it !== items[i]) ? { ...body, items: next } : value;\n}\n\n/** Results that carry WindowInfo (window.list's `windows`, focus/move's `window`). */\nconst WINDOW_RESULTS: ReadonlyMap<OpName, \"windows\" | \"window\"> = new Map([\n [\"window.list\", \"windows\"],\n [\"window.focus\", \"window\"],\n [\"window.move\", \"window\"],\n]);\n\nfunction stripWindows(value: unknown, key: \"windows\" | \"window\", version: string): unknown {\n if (value === null || typeof value !== \"object\") return value;\n const body = value as Record<string, unknown>;\n const inner = body[key];\n if (inner === undefined) return value;\n const fields = FIELDS_SINCE.WindowInfo;\n if (Array.isArray(inner)) {\n const next = inner.map((w: unknown) => strip(w, fields, version));\n return next.some((w, i) => w !== inner[i]) ? { ...body, [key]: next } : value;\n }\n const next = strip(inner, fields, version);\n return next === inner ? value : { ...body, [key]: next };\n}\n\n/**\n * What to send a peer that negotiated `version`: `result` of `op`, or an error body, with every\n * field newer than that version removed (rule 2). Unchanged for a current peer.\n */\nexport function forPeer(op: OpName, part: \"result\", value: unknown, version: string): unknown;\nexport function forPeer(op: OpName | null, part: \"error\", value: unknown, version: string): unknown;\nexport function forPeer(op: OpName | null, part: \"result\" | \"error\", value: unknown, version: string): unknown {\n if (part === \"result\") {\n const windowKey = op ? WINDOW_RESULTS.get(op) : undefined;\n if (windowKey) return stripWindows(value, windowKey, version);\n const path = op ? RESULT_PATH.get(op) : undefined;\n const known = op === \"sysinfo.get\" ? permissionsForPeer(value, version) : value;\n const top = path ? strip(known, FIELDS_SINCE[path], version) : known;\n const nested = op ? NESTED_RESULTS.get(op) : undefined;\n const stripped = nested ? stripNested(top, nested, version) : top;\n if (op === \"coding.providers\") return providersForPeer(stripped, version);\n if (op === \"coding.history\" || op === \"coding.transcript.read\") return transcriptItemsForPeer(stripped, version);\n if (op === \"apps.setup.list\") return setupItemsForPeer(stripped, version);\n return op === \"apps.windows.list\" ? windowListRemoteControlForPeer(stripped, version) : stripped;\n }\n if (value === null || typeof value !== \"object\") return value;\n const body = value as { data?: unknown };\n if (body.data === undefined) return value;\n let data = strip(body.data, FIELDS_SINCE[\"ProtocolErrorBody.data\"], version);\n const reason = (data as { reason?: unknown }).reason;\n const reasonSince = typeof reason === \"string\" ? (REASONS_SINCE as Record<string, string>)[reason] : undefined;\n if (reasonSince && !knows(version, reasonSince)) {\n const { reason: _dropped, ...rest } = data as Record<string, unknown>;\n data = rest;\n }\n return data === body.data ? value : { ...body, data };\n}\n\n/** Every op whose result has a versioned field is wired into forPeer (checked by the test). */\nexport const VERSIONED_RESULT_OPS: readonly OpName[] = [...new Set([...RESULT_PATH.keys(), ...WINDOW_RESULTS.keys(), ...NESTED_RESULTS.keys()])];\n","/**\n * What a connecting side does after each WebSocket close — the ONE table every client reads (the\n * package client, the desktop's relay transport, any other dialer). Never keep a local list of\n * \"terminal\" codes: a code added to CloseCode without a rule here fails to compile.\n *\n * reconnect_now the far side went away on purpose or the socket died; dial again at once if the\n * connection had opened, with backoff otherwise (a dead network never spins).\n * reconnect transient refusal; dial again with backoff.\n * reauth the token was refused; get a FRESH token and dial once more. A second refusal in\n * a row (no successful open between) is terminal with outcome \"signed_out\".\n * stop retrying cannot help: stop dialing until something changes (a new sign-in, a\n * new device, an update) and show the outcome.\n */\nimport type { ErrorCodeName } from \"./types\";\nimport { CloseCode, type CloseCodeValue } from \"./schema/envelope\";\n\nexport type CloseAction = \"reconnect_now\" | \"reconnect\" | \"reauth\" | \"stop\";\n\n/** The one state a person is shown when dialing stops. */\nexport type CloseOutcome = \"signed_out\" | \"not_owned\" | \"removed\" | \"revoked\" | \"replaced\" | \"upgrade_required\";\n\nexport interface CloseRule {\n readonly action: CloseAction;\n /** Set for `stop` and `reauth` (the outcome when the fresh token is refused too). */\n readonly outcome?: CloseOutcome;\n /** The error a caller's pending work is failed with. */\n readonly error: readonly [ErrorCodeName, string];\n}\n\nexport const CLOSE_RULES = {\n [CloseCode.NORMAL]: { action: \"reconnect\", error: [\"DEVICE_OFFLINE\", \"Connection closed\"] },\n [CloseCode.GOING_AWAY]: { action: \"reconnect_now\", error: [\"DEVICE_OFFLINE\", \"Connection lost\"] },\n [CloseCode.ABNORMAL]: { action: \"reconnect_now\", error: [\"DEVICE_OFFLINE\", \"Connection lost\"] },\n [CloseCode.DEVICE_RECONNECTED]: { action: \"reconnect_now\", error: [\"DEVICE_OFFLINE\", \"Device reconnected\"] },\n [CloseCode.TRY_AGAIN_LATER]: { action: \"reconnect\", error: [\"DEVICE_OFFLINE\", \"Relay busy; retrying\"] },\n [CloseCode.AUTH_INVALID]: { action: \"reauth\", outcome: \"signed_out\", error: [\"AUTH_INVALID\", \"Sign-in was not accepted\"] },\n [CloseCode.AUTH_FORBIDDEN]: { action: \"stop\", outcome: \"not_owned\", error: [\"AUTH_FORBIDDEN\", \"Not this device's owner\"] },\n [CloseCode.DEVICE_NOT_FOUND]: { action: \"stop\", outcome: \"removed\", error: [\"NOT_FOUND\", \"Device not found\"] },\n [CloseCode.AUTH_EXPIRED]: { action: \"reauth\", outcome: \"signed_out\", error: [\"AUTH_EXPIRED\", \"Sign-in expired\"] },\n [CloseCode.REPLACED]: { action: \"stop\", outcome: \"replaced\", error: [\"CONFLICT\", \"Replaced by a newer connection\"] },\n [CloseCode.DEVICE_REVOKED]: { action: \"stop\", outcome: \"revoked\", error: [\"AUTH_DEVICE_REVOKED\", \"This device was revoked\"] },\n // A malformed message, or a connection the relay lost track of: a fresh socket starts clean.\n [CloseCode.PROTOCOL_ERROR]: { action: \"reconnect\", error: [\"PROTOCOL_ERROR\", \"Connection reset by the relay\"] },\n [CloseCode.UPGRADE_REQUIRED]: { action: \"stop\", outcome: \"upgrade_required\", error: [\"PROTOCOL_VERSION_UNSUPPORTED\", \"Protocol upgrade required\"] },\n} as const satisfies Record<CloseCodeValue, CloseRule>;\n\nconst UNKNOWN: CloseRule = { action: \"reconnect\", error: [\"DEVICE_OFFLINE\", \"Connection lost\"] };\n\n/** The rule for any close code; one this table does not know (or null: no close frame) reconnects with backoff. */\nexport function closeRule(code: number | null | undefined): CloseRule {\n if (code === null || code === undefined) return CLOSE_RULES[CloseCode.ABNORMAL];\n return (CLOSE_RULES as Record<number, CloseRule>)[code] ?? UNKNOWN;\n}\n\n/** True when dialing must stop after this close (no retry will help). */\nexport function isTerminalClose(code: number | null | undefined): boolean {\n return closeRule(code).action === \"stop\";\n}\n"],"mappings":"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","names":["next"]}