tmux-ide 2.9.2 → 2.9.3

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.
Files changed (263) hide show
  1. package/README.md +1 -1
  2. package/bin/cli.js +2071 -625
  3. package/package.json +14 -5
  4. package/packages/contracts/src/desktop-host.ts +3 -0
  5. package/packages/contracts/src/saved-machines.ts +19 -0
  6. package/packages/contracts/src/terminal-replica.ts +1 -1
  7. package/packages/core/package.json +3 -2
  8. package/packages/core/src/terminal-delivery.ts +51 -3
  9. package/packages/core/src/terminal-fnv64-wasm.ts +4 -3
  10. package/packages/core/src/terminal-replica-hash-cache.ts +129 -31
  11. package/packages/core/src/terminal-replica-owned-row.ts +27 -0
  12. package/packages/core/src/terminal-replica.ts +13 -28
  13. package/packages/daemon/dist/command-center/daemon-fleet-facts-observer.js +96 -10
  14. package/packages/daemon/dist/command-center/resources/saved-machine-route.js +40 -1
  15. package/packages/daemon/dist/command-center/ws-events.js +5 -24
  16. package/packages/daemon/dist/lib/canonical-daemon-bootstrap.js +8 -0
  17. package/packages/daemon/dist/lib/canonical-daemon.js +28 -2
  18. package/packages/daemon/dist/lib/daemon-embed.js +1 -1
  19. package/packages/daemon/dist/lib/daemon-service-manager.js +122 -0
  20. package/packages/daemon/dist/lib/daemon-service-plan.js +127 -0
  21. package/packages/daemon/dist/lib/daemon-service.js +259 -0
  22. package/packages/daemon/dist/lib/install-origin.js +2 -0
  23. package/packages/daemon/dist/lib/local-fleet-request.js +9 -3
  24. package/packages/daemon/dist/lib/log.js +6 -10
  25. package/packages/daemon/dist/lib/managed-installer-update.js +67 -0
  26. package/packages/daemon/dist/lib/{tui-download-lock.js → private-operation-lock.js} +11 -11
  27. package/packages/daemon/dist/lib/remote-daemon-info.js +3 -2
  28. package/packages/daemon/dist/lib/remote-daemon-lifecycle.js +4 -4
  29. package/packages/daemon/dist/lib/remote-tmux-command.js +10 -0
  30. package/packages/daemon/dist/lib/runtime-namespace.js +28 -16
  31. package/packages/daemon/dist/lib/saved-machines.js +40 -2
  32. package/packages/daemon/dist/lib/ssh-daemon-transport.js +24 -9
  33. package/packages/daemon/dist/lib/tmux-server-owner.js +1 -1
  34. package/packages/daemon/dist/lib/tmux-server-registration.js +21 -3
  35. package/packages/daemon/dist/lib/tui-binary.js +2 -2
  36. package/packages/daemon/dist/lib/update.js +18 -0
  37. package/packages/daemon/dist/lib/workspace-multiplexer-verbs.js +24 -1
  38. package/packages/daemon/dist/machines.js +40 -4
  39. package/packages/daemon/dist/native/TmuxIdeNotifier.app/Contents/Info.plist +2 -2
  40. package/packages/daemon/dist/native/TmuxIdeNotifier.app/Contents/MacOS/tmux-ide-notifier +0 -0
  41. package/packages/daemon/dist/native/TmuxIdeNotifier.app/Contents/Resources/Assets.car +0 -0
  42. package/packages/daemon/dist/native/TmuxIdeNotifier.app/Contents/_CodeSignature/CodeResources +2 -2
  43. package/packages/daemon/dist/terminal/attachments/direct-websocket.js +4 -1
  44. package/packages/daemon/dist/terminal/attachments/native-runtime.js +22 -13
  45. package/packages/daemon/dist/terminal/mirror/mirror-service.js +101 -3
  46. package/packages/daemon/dist/terminal/mirror/registered-window-guard.js +62 -0
  47. package/packages/daemon/dist/terminal/mirror/session-channel.js +75 -4
  48. package/packages/daemon/dist/terminal/mirror/shared-window-index.js +45 -0
  49. package/packages/daemon/dist/terminal/pane-stream/pane-stream-websocket.js +11 -1
  50. package/packages/daemon/dist/terminal/session-runtime/multiplexer-backend.js +1 -0
  51. package/packages/daemon/dist/terminal/session-runtime/registry.js +56 -7
  52. package/packages/daemon/dist/terminal/session-runtime/semantic-mutation-executor.js +3 -1
  53. package/packages/daemon/dist/tui/mirror/dialog-model.js +2 -35
  54. package/packages/daemon/dist/tui/mirror/runtime/application-daemon-authority-owner.js +8 -0
  55. package/packages/daemon/dist/tui/mirror/runtime/application-home-fleet.js +20 -2
  56. package/packages/daemon/dist/tui/mirror/runtime/application-machine-agents.js +7 -1
  57. package/packages/daemon/dist/tui/mirror/runtime/application-machine-authority.js +59 -9
  58. package/packages/daemon/dist/tui/mirror/runtime/application-machine-navigation.js +27 -19
  59. package/packages/daemon/dist/tui/mirror/runtime/application-machine-sidebar.jsx +23 -18
  60. package/packages/daemon/dist/tui/mirror/runtime/application-machine-startup.js +31 -2
  61. package/packages/daemon/dist/tui/mirror/runtime/application-palette-search-owner.js +7 -3
  62. package/packages/daemon/dist/tui/mirror/runtime/application-performance-log.js +3 -0
  63. package/packages/daemon/dist/tui/mirror/runtime/application-terminal-input-ingress.js +146 -2
  64. package/packages/daemon/dist/tui/mirror/runtime/application-terminal-interaction-controller.js +201 -50
  65. package/packages/daemon/dist/tui/mirror/runtime/bounded-performance-record-writer.js +50 -10
  66. package/packages/daemon/dist/tui/mirror/runtime/terminal-fast-lane-renderer-adapter.js +6 -5
  67. package/packages/daemon/dist/tui/mirror/runtime/terminal-pane-input-router.js +3 -0
  68. package/packages/daemon/dist/tui/mirror/runtime/workspace-terminal-fast-lane.js +8 -2
  69. package/packages/daemon/dist/tui/mirror/terminal-text.js +35 -0
  70. package/packages/daemon/dist/tui/mirror/workspace/connection-feedback.js +5 -3
  71. package/packages/daemon/src/command-center/daemon-fleet-facts-observer.ts +100 -10
  72. package/packages/daemon/src/command-center/resources/saved-machine-route.ts +48 -1
  73. package/packages/daemon/src/command-center/ws-events.ts +5 -25
  74. package/packages/daemon/src/lib/canonical-daemon-bootstrap.ts +12 -0
  75. package/packages/daemon/src/lib/canonical-daemon.ts +44 -2
  76. package/packages/daemon/src/lib/daemon-embed.ts +1 -0
  77. package/packages/daemon/src/lib/daemon-service-manager.ts +152 -0
  78. package/packages/daemon/src/lib/daemon-service-plan.ts +153 -0
  79. package/packages/daemon/src/lib/daemon-service.ts +301 -0
  80. package/packages/daemon/src/lib/install-origin.ts +5 -0
  81. package/packages/daemon/src/lib/local-fleet-request.ts +19 -3
  82. package/packages/daemon/src/lib/log.ts +13 -9
  83. package/packages/daemon/src/lib/managed-installer-update.ts +79 -0
  84. package/packages/daemon/src/lib/{tui-download-lock.ts → private-operation-lock.ts} +15 -11
  85. package/packages/daemon/src/lib/remote-daemon-info.ts +3 -3
  86. package/packages/daemon/src/lib/remote-daemon-lifecycle.ts +4 -4
  87. package/packages/daemon/src/lib/remote-tmux-command.ts +12 -0
  88. package/packages/daemon/src/lib/runtime-namespace.ts +27 -18
  89. package/packages/daemon/src/lib/saved-machines.ts +40 -1
  90. package/packages/daemon/src/lib/ssh-daemon-transport.ts +25 -7
  91. package/packages/daemon/src/lib/tmux-server-owner.ts +1 -0
  92. package/packages/daemon/src/lib/tmux-server-registration.ts +21 -3
  93. package/packages/daemon/src/lib/tui-binary.ts +2 -2
  94. package/packages/daemon/src/lib/update.ts +24 -0
  95. package/packages/daemon/src/lib/workspace-multiplexer-verbs.ts +22 -0
  96. package/packages/daemon/src/machines.ts +53 -5
  97. package/packages/daemon/src/terminal/attachments/direct-websocket.ts +8 -2
  98. package/packages/daemon/src/terminal/attachments/native-runtime.ts +28 -13
  99. package/packages/daemon/src/terminal/mirror/mirror-service.ts +105 -3
  100. package/packages/daemon/src/terminal/mirror/registered-window-guard.ts +66 -0
  101. package/packages/daemon/src/terminal/mirror/session-channel.ts +92 -4
  102. package/packages/daemon/src/terminal/mirror/shared-window-index.ts +42 -0
  103. package/packages/daemon/src/terminal/pane-stream/pane-stream-websocket.ts +12 -1
  104. package/packages/daemon/src/terminal/session-runtime/multiplexer-backend.ts +2 -0
  105. package/packages/daemon/src/terminal/session-runtime/registry.ts +70 -8
  106. package/packages/daemon/src/terminal/session-runtime/semantic-mutation-executor.ts +3 -1
  107. package/packages/daemon/src/tui/mirror/dialog-model.ts +2 -32
  108. package/packages/daemon/src/tui/mirror/runtime/application-daemon-authority-owner.ts +8 -0
  109. package/packages/daemon/src/tui/mirror/runtime/application-home-fleet.ts +19 -2
  110. package/packages/daemon/src/tui/mirror/runtime/application-machine-agents.ts +6 -1
  111. package/packages/daemon/src/tui/mirror/runtime/application-machine-authority.ts +60 -11
  112. package/packages/daemon/src/tui/mirror/runtime/application-machine-navigation.ts +39 -33
  113. package/packages/daemon/src/tui/mirror/runtime/application-machine-sidebar.tsx +31 -23
  114. package/packages/daemon/src/tui/mirror/runtime/application-machine-startup.ts +38 -2
  115. package/packages/daemon/src/tui/mirror/runtime/application-palette-search-owner.ts +7 -4
  116. package/packages/daemon/src/tui/mirror/runtime/application-performance-log.ts +3 -0
  117. package/packages/daemon/src/tui/mirror/runtime/application-root-v2.tsx +1 -1
  118. package/packages/daemon/src/tui/mirror/runtime/application-shell-view.tsx +47 -46
  119. package/packages/daemon/src/tui/mirror/runtime/application-terminal-input-ingress.ts +165 -2
  120. package/packages/daemon/src/tui/mirror/runtime/application-terminal-interaction-controller.ts +207 -53
  121. package/packages/daemon/src/tui/mirror/runtime/bounded-performance-record-writer.ts +49 -9
  122. package/packages/daemon/src/tui/mirror/runtime/terminal-fast-lane-renderer-adapter.ts +6 -5
  123. package/packages/daemon/src/tui/mirror/runtime/terminal-pane-input-router.ts +4 -0
  124. package/packages/daemon/src/tui/mirror/runtime/workspace-terminal-fast-lane.ts +8 -3
  125. package/packages/daemon/src/tui/mirror/terminal-text.ts +32 -0
  126. package/packages/daemon/src/tui/mirror/workspace/connection-feedback.ts +6 -3
  127. package/packages/daemon-client/src/fleet-connection-status.ts +10 -1
  128. package/packages/daemon-client/src/workspace-client.ts +4 -1
  129. package/packages/contracts/src/__tests__/actions-contract.test.ts +0 -119
  130. package/packages/contracts/src/__tests__/agent-graph-overlay.test.ts +0 -428
  131. package/packages/contracts/src/__tests__/app-window-mutation.test.ts +0 -51
  132. package/packages/contracts/src/__tests__/app-window-state.test.ts +0 -34
  133. package/packages/contracts/src/__tests__/application-shell.test.ts +0 -645
  134. package/packages/contracts/src/__tests__/automation-operations.test.ts +0 -78
  135. package/packages/contracts/src/__tests__/causal-cell.test.ts +0 -47
  136. package/packages/contracts/src/__tests__/client-view-state.test.ts +0 -115
  137. package/packages/contracts/src/__tests__/cohesion-fixture.test.ts +0 -106
  138. package/packages/contracts/src/__tests__/commands.test.ts +0 -86
  139. package/packages/contracts/src/__tests__/control.test.ts +0 -154
  140. package/packages/contracts/src/__tests__/daemon-events.test.ts +0 -405
  141. package/packages/contracts/src/__tests__/daemon-resources.test.ts +0 -143
  142. package/packages/contracts/src/__tests__/daemon-wire.test.ts +0 -149
  143. package/packages/contracts/src/__tests__/desktop-host.test.ts +0 -269
  144. package/packages/contracts/src/__tests__/desktop-missions.test.ts +0 -215
  145. package/packages/contracts/src/__tests__/experience-conformance.test.ts +0 -153
  146. package/packages/contracts/src/__tests__/experience-kernel-boundary.test.ts +0 -113
  147. package/packages/contracts/src/__tests__/experience-shell.test.ts +0 -65
  148. package/packages/contracts/src/__tests__/fixtures/daemon-wire-v2.json +0 -35
  149. package/packages/contracts/src/__tests__/fixtures/daemon-wire-v3.json +0 -35
  150. package/packages/contracts/src/__tests__/fixtures/daemon-wire-v4.json +0 -35
  151. package/packages/contracts/src/__tests__/fixtures/scoped-receipt.ts +0 -62
  152. package/packages/contracts/src/__tests__/fleet-agent-graph.test.ts +0 -231
  153. package/packages/contracts/src/__tests__/fleet-catalog.test.ts +0 -270
  154. package/packages/contracts/src/__tests__/fleet-lifecycle.test.ts +0 -62
  155. package/packages/contracts/src/__tests__/focus-overlay.test.ts +0 -110
  156. package/packages/contracts/src/__tests__/ide-config.test.ts +0 -64
  157. package/packages/contracts/src/__tests__/interaction-evidence.test.ts +0 -288
  158. package/packages/contracts/src/__tests__/interaction-receipt-v2.test.ts +0 -72
  159. package/packages/contracts/src/__tests__/issue-error.test.ts +0 -78
  160. package/packages/contracts/src/__tests__/mission-projections.test.ts +0 -186
  161. package/packages/contracts/src/__tests__/missions.test.ts +0 -272
  162. package/packages/contracts/src/__tests__/multiplexer-verbs.test.ts +0 -242
  163. package/packages/contracts/src/__tests__/pane-appearance.test.ts +0 -146
  164. package/packages/contracts/src/__tests__/pane-read-result.test.ts +0 -55
  165. package/packages/contracts/src/__tests__/pane-stream.test.ts +0 -536
  166. package/packages/contracts/src/__tests__/pane-widget-marker.test.ts +0 -327
  167. package/packages/contracts/src/__tests__/performance-metrics.test.ts +0 -73
  168. package/packages/contracts/src/__tests__/performance-qualification.test.ts +0 -137
  169. package/packages/contracts/src/__tests__/rich-card-widget.test.ts +0 -29
  170. package/packages/contracts/src/__tests__/session-runtime.test.ts +0 -512
  171. package/packages/contracts/src/__tests__/startup-readiness.test.ts +0 -409
  172. package/packages/contracts/src/__tests__/terminal-attachment-stream.test.ts +0 -72
  173. package/packages/contracts/src/__tests__/terminal-attachments.test.ts +0 -329
  174. package/packages/contracts/src/__tests__/terminal-delivery.test.ts +0 -88
  175. package/packages/contracts/src/__tests__/terminal-runtime-inventory.test.ts +0 -68
  176. package/packages/contracts/src/__tests__/terminals.test.ts +0 -87
  177. package/packages/contracts/src/__tests__/tmux-server-scope.test.ts +0 -166
  178. package/packages/contracts/src/__tests__/transport-contract-loading.test.ts +0 -91
  179. package/packages/contracts/src/__tests__/visual-tokens.test.ts +0 -224
  180. package/packages/contracts/src/__tests__/window-links.test.ts +0 -243
  181. package/packages/contracts/src/__tests__/workspace-changes-resource.test.ts +0 -317
  182. package/packages/contracts/src/__tests__/workspace-changes-view.test.ts +0 -122
  183. package/packages/contracts/src/__tests__/workspace-config.test.ts +0 -294
  184. package/packages/contracts/src/__tests__/workspace-files-resource.test.ts +0 -261
  185. package/packages/contracts/src/__tests__/workspace-files-tree.test.ts +0 -147
  186. package/packages/contracts/src/__tests__/workspace-pane-creation.test.ts +0 -249
  187. package/packages/contracts/src/__tests__/workspace-promotion.test.ts +0 -94
  188. package/packages/contracts/src/__tests__/workspace-resource-identity.test.ts +0 -90
  189. package/packages/contracts/src/daemon-resource-request.test.ts +0 -192
  190. package/packages/contracts/src/native-operation-identity.test.ts +0 -23
  191. package/packages/contracts/src/workspace-admission.test.ts +0 -21
  192. package/packages/contracts/src/workspace-catalog-resource.test.ts +0 -146
  193. package/packages/core/src/agent-provisioning.test.ts +0 -42
  194. package/packages/core/src/application-shell-session.test.ts +0 -105
  195. package/packages/core/src/interaction-evidence.test.ts +0 -134
  196. package/packages/core/src/interaction-flow.test.ts +0 -66
  197. package/packages/core/src/interaction-receipts.test.ts +0 -671
  198. package/packages/core/src/navigator.test.ts +0 -34
  199. package/packages/core/src/optimistic-projection-conformance.test.ts +0 -75
  200. package/packages/core/src/optimistic-projection.test.ts +0 -118
  201. package/packages/core/src/performance-metrics.test.ts +0 -121
  202. package/packages/core/src/performance-qualification.test.ts +0 -283
  203. package/packages/core/src/saved-machines.test.ts +0 -80
  204. package/packages/core/src/terminal-compact-cold.test.ts +0 -87
  205. package/packages/core/src/terminal-conformance.test.ts +0 -48
  206. package/packages/core/src/terminal-delivery-cache-lifetime.test.ts +0 -167
  207. package/packages/core/src/terminal-delivery-encode-cooperative.test.ts +0 -140
  208. package/packages/core/src/terminal-delivery-representation-hash.test.ts +0 -77
  209. package/packages/core/src/terminal-delivery.test.ts +0 -1471
  210. package/packages/core/src/terminal-fnv64-wasm.test.ts +0 -61
  211. package/packages/core/src/terminal-replica-cold.test.ts +0 -31
  212. package/packages/core/src/terminal-replica-cooperative.test.ts +0 -170
  213. package/packages/core/src/terminal-replica-hash-cache.test.ts +0 -283
  214. package/packages/core/src/terminal-replica.test.ts +0 -347
  215. package/packages/core/src/workspace-selection.test.ts +0 -63
  216. package/packages/daemon/dist/__tests__/support.js +0 -33
  217. package/packages/daemon/dist/lib/__tests__/fixtures/workspace-state-writer.js +0 -58
  218. package/packages/daemon/dist/lib/__tests__/installed-recovery-fixture.js +0 -400
  219. package/packages/daemon/dist/terminal/__tests__/MockPtyAdapter.js +0 -182
  220. package/packages/daemon/dist/terminal/mirror/__tests__/scripted-channel.js +0 -98
  221. package/packages/daemon/dist/terminal/mirror/__tests__/simulated-channel.js +0 -156
  222. package/packages/daemon/src/tui/mirror/__snapshots__/activity-surface-renderer.test.tsx.snap +0 -42
  223. package/packages/daemon/src/tui/mirror/__snapshots__/changes-terminal-surface-renderer.test.tsx.snap +0 -267
  224. package/packages/daemon/src/tui/mirror/__snapshots__/home-files-surface-renderer.test.tsx.snap +0 -267
  225. package/packages/daemon/src/tui/mirror/__snapshots__/missions-surface-renderer.test.tsx.snap +0 -134
  226. package/packages/daemon/src/tui/mirror/__snapshots__/recipes-gallery-renderer.test.tsx.snap +0 -141
  227. package/packages/daemon/src/tui/mirror/__snapshots__/shell-chrome-renderer.test.tsx.snap +0 -134
  228. package/packages/daemon/src/tui/mirror/runtime/__snapshots__/application-shell-view-renderer.test.tsx.snap +0 -87
  229. package/packages/daemon/src/tui/mirror/workspace/__snapshots__/agent-terminal-canvas-renderer.test.tsx.snap +0 -348
  230. package/packages/daemon/src/tui/mirror/workspace/__snapshots__/application-shell-renderer.test.tsx.snap +0 -134
  231. package/packages/daemon/src/tui/mirror/workspace/__snapshots__/command-palette-surface-renderer.test.tsx.snap +0 -255
  232. package/packages/daemon/src/tui/mirror/workspace/__snapshots__/pane-frame-renderer.test.tsx.snap +0 -525
  233. package/packages/daemon/src/tui/mirror/workspace/__snapshots__/terminal-pane-header-polish-renderer.test.tsx.snap +0 -31
  234. package/packages/daemon/src/tui/mirror/workspace/__snapshots__/workbench-shell-renderer.test.tsx.snap +0 -134
  235. package/packages/daemon-client/src/application-shell-session.test.ts +0 -196
  236. package/packages/daemon-client/src/automation-client.test.ts +0 -214
  237. package/packages/daemon-client/src/bootstrap-coordinator.test.ts +0 -145
  238. package/packages/daemon-client/src/connection-supervisor.test.ts +0 -109
  239. package/packages/daemon-client/src/direct-application-shell-transport.test.ts +0 -941
  240. package/packages/daemon-client/src/first-latest-coordinator.test.ts +0 -175
  241. package/packages/daemon-client/src/fleet-dial-scheduler.test.ts +0 -114
  242. package/packages/daemon-client/src/fleet-environments.test.ts +0 -40
  243. package/packages/daemon-client/src/generation-bound-store-timers.test.ts +0 -74
  244. package/packages/daemon-client/src/owner-action-client.test.ts +0 -245
  245. package/packages/daemon-client/src/pane-stream-client.test.ts +0 -2841
  246. package/packages/daemon-client/src/pane-stream-clock-calibration.test.ts +0 -207
  247. package/packages/daemon-client/src/pane-stream-loopback-benchmark.test.ts +0 -51
  248. package/packages/daemon-client/src/push-resource-session.test.ts +0 -509
  249. package/packages/daemon-client/src/resource-replica.test.ts +0 -186
  250. package/packages/daemon-client/src/runtime-resource-ledger.test.ts +0 -18
  251. package/packages/daemon-client/src/scoped-tmux-server-transport.test.ts +0 -114
  252. package/packages/daemon-client/src/terminal-fast-lane.test.ts +0 -835
  253. package/packages/daemon-client/src/tmux-server-client.test.ts +0 -279
  254. package/packages/daemon-client/src/tmux-server-interaction-events.test.ts +0 -230
  255. package/packages/daemon-client/src/workspace-catalog-v2.test.ts +0 -109
  256. package/packages/daemon-client/src/workspace-client-boundaries.test.ts +0 -59
  257. package/packages/daemon-client/src/workspace-client-operations.test.ts +0 -96
  258. package/packages/daemon-client/src/workspace-client.test.ts +0 -2912
  259. package/packages/daemon-client/src/workspace-event-supervisor.test.ts +0 -1086
  260. package/packages/daemon-client/src/workspace-pane-client.test.ts +0 -80
  261. package/packages/presentation/src/presentation-contract.test.ts +0 -63
  262. package/packages/tmux-bridge/src/runner.test.ts +0 -614
  263. package/packages/tmux-bridge/src/targeting.test.ts +0 -107
@@ -1,269 +0,0 @@
1
- import { describe, expect, it } from "vitest";
2
-
3
- import {
4
- DESKTOP_HOST_API_VERSION,
5
- DesktopApplicationShellTargetSchemaZ,
6
- DesktopDaemonCapabilityStateSchemaZ,
7
- DesktopDaemonEventSubscriptionRequestSchemaZ,
8
- DesktopDaemonEventSchemaZ,
9
- DesktopDaemonFetchApplicationShellRequestSchemaZ,
10
- DesktopDaemonListWorkspacesResultSchemaZ,
11
- DesktopDaemonRefreshConnectionResultSchemaZ,
12
- DesktopDaemonPreflightSchemaZ,
13
- DesktopDaemonHostDescriptorSchemaZ,
14
- DesktopHostBootstrapSchemaZ,
15
- } from "../desktop-host.ts";
16
-
17
- describe("desktop host contract", () => {
18
- it("accepts a bounded, versioned bootstrap payload", () => {
19
- expect(
20
- DesktopHostBootstrapSchemaZ.parse({
21
- apiVersion: DESKTOP_HOST_API_VERSION,
22
- runtime: "electron",
23
- platform: "darwin",
24
- appVersion: "2.8.0",
25
- theme: { mode: "dark", highContrast: false, reducedMotion: false },
26
- window: { maximized: false, fullscreen: false, focused: true },
27
- daemon: { status: "unavailable", code: "record-missing", reason: "owner not installed" },
28
- onboarding: { introAcknowledged: false },
29
- }),
30
- ).toMatchObject({ apiVersion: 13, runtime: "electron" });
31
- });
32
-
33
- it("does not permit unversioned daemon metadata to leak into the facade", () => {
34
- expect(() =>
35
- DesktopDaemonPreflightSchemaZ.parse({
36
- status: "connected",
37
- descriptor: {
38
- apiBaseUrl: "http://127.0.0.1:6060",
39
- protocolVersion: 1,
40
- productVersion: "2.8.0",
41
- instanceId: "9bcf33b0-c837-4a94-b5e8-c0977f54464f",
42
- startedAt: "2026-07-21T00:00:00.000Z",
43
- },
44
- pid: 42,
45
- }),
46
- ).toThrow();
47
- });
48
-
49
- it("exposes only an uncredentialed loopback daemon descriptor", () => {
50
- const descriptor = {
51
- apiBaseUrl: "http://127.0.0.1:6060",
52
- protocolVersion: 1,
53
- productVersion: "2.8.0",
54
- instanceId: "9bcf33b0-c837-4a94-b5e8-c0977f54464f",
55
- startedAt: "2026-07-21T00:00:00.000Z",
56
- };
57
- expect(DesktopDaemonHostDescriptorSchemaZ.parse(descriptor)).toEqual(descriptor);
58
- expect(
59
- DesktopDaemonHostDescriptorSchemaZ.safeParse({
60
- ...descriptor,
61
- apiBaseUrl: "http://192.0.2.1:6060",
62
- }).success,
63
- ).toBe(false);
64
- expect(
65
- DesktopDaemonHostDescriptorSchemaZ.safeParse({
66
- ...descriptor,
67
- apiBaseUrl: "http://secret@127.0.0.1:6060",
68
- }).success,
69
- ).toBe(false);
70
- expect(
71
- DesktopDaemonHostDescriptorSchemaZ.safeParse({
72
- ...descriptor,
73
- authToken: "must-not-cross-ipc",
74
- }).success,
75
- ).toBe(false);
76
- });
77
-
78
- it("carries the stable environment id additively on the daemon descriptor", () => {
79
- const descriptor = {
80
- apiBaseUrl: "http://127.0.0.1:6060",
81
- protocolVersion: 1,
82
- productVersion: "2.8.0",
83
- instanceId: "9bcf33b0-c837-4a94-b5e8-c0977f54464f",
84
- startedAt: "2026-07-21T00:00:00.000Z",
85
- };
86
- expect(DesktopDaemonHostDescriptorSchemaZ.parse(descriptor).environmentId).toBeUndefined();
87
- const withEnvironment = {
88
- ...descriptor,
89
- environmentId: "0f4e9a7c-2f4a-4d55-9d2e-1f6cf3a3b210",
90
- };
91
- expect(DesktopDaemonHostDescriptorSchemaZ.parse(withEnvironment)).toEqual(withEnvironment);
92
- expect(
93
- DesktopDaemonHostDescriptorSchemaZ.safeParse({
94
- ...descriptor,
95
- environmentId: "not-a-uuid",
96
- }).success,
97
- ).toBe(false);
98
- });
99
-
100
- it("rejects malformed or secret-bearing application-shell targets", () => {
101
- const target = {
102
- daemon: {
103
- protocolVersion: 1,
104
- productVersion: "2.8.0",
105
- instanceId: "9bcf33b0-c837-4a94-b5e8-c0977f54464f",
106
- startedAt: "2026-07-21T00:00:00.000Z",
107
- },
108
- workspaceName: " project ",
109
- };
110
- expect(DesktopApplicationShellTargetSchemaZ.parse(target).workspaceName).toBe("project");
111
- expect(
112
- DesktopApplicationShellTargetSchemaZ.safeParse({ ...target, token: "secret" }).success,
113
- ).toBe(false);
114
- expect(DesktopApplicationShellTargetSchemaZ.safeParse(null).success).toBe(false);
115
- });
116
-
117
- it("keeps the renderer-visible connected state identity-only", () => {
118
- const identity = {
119
- protocolVersion: 1,
120
- productVersion: "2.8.0",
121
- instanceId: "9bcf33b0-c837-4a94-b5e8-c0977f54464f",
122
- startedAt: "2026-07-21T00:00:00.000Z",
123
- };
124
- expect(DesktopDaemonCapabilityStateSchemaZ.parse({ status: "connected", identity })).toEqual({
125
- status: "connected",
126
- identity,
127
- });
128
- for (const forbidden of [
129
- { apiBaseUrl: "http://127.0.0.1:6060" },
130
- { token: "secret" },
131
- { sessionName: "raw-session" },
132
- ]) {
133
- expect(
134
- DesktopDaemonCapabilityStateSchemaZ.safeParse({
135
- status: "connected",
136
- identity,
137
- ...forbidden,
138
- }).success,
139
- ).toBe(false);
140
- }
141
- });
142
-
143
- it("accepts only bounded semantic daemon capability messages", () => {
144
- expect(
145
- DesktopDaemonFetchApplicationShellRequestSchemaZ.parse({ workspaceName: " product " }),
146
- ).toEqual({ workspaceName: "product" });
147
- expect(
148
- DesktopDaemonFetchApplicationShellRequestSchemaZ.parse({
149
- workspaceName: "product",
150
- resourceVersion: 2,
151
- }),
152
- ).toEqual({ workspaceName: "product", resourceVersion: 2 });
153
- expect(
154
- DesktopDaemonFetchApplicationShellRequestSchemaZ.safeParse({
155
- workspaceName: "product",
156
- resourceVersion: 1,
157
- }).success,
158
- ).toBe(false);
159
- expect(
160
- DesktopDaemonFetchApplicationShellRequestSchemaZ.safeParse({
161
- workspaceName: "product",
162
- sessionName: "raw-session",
163
- }).success,
164
- ).toBe(false);
165
- expect(
166
- DesktopDaemonEventSubscriptionRequestSchemaZ.safeParse({
167
- workspaceNames: ["product", "product"],
168
- }).success,
169
- ).toBe(false);
170
- expect(DesktopDaemonEventSubscriptionRequestSchemaZ.parse({ workspaceNames: [] })).toEqual({
171
- workspaceNames: [],
172
- });
173
- expect(
174
- DesktopDaemonListWorkspacesResultSchemaZ.safeParse({
175
- status: "ok",
176
- daemon: {
177
- protocolVersion: 1,
178
- productVersion: "2.8.0",
179
- instanceId: "9bcf33b0-c837-4a94-b5e8-c0977f54464f",
180
- startedAt: "2026-07-21T00:00:00.000Z",
181
- },
182
- workspaces: [{ workspaceName: "product", projectDir: "/private/leak" }],
183
- }).success,
184
- ).toBe(false);
185
- });
186
-
187
- it("models daemon replacement without exposing main-process connection material", () => {
188
- const identity = {
189
- protocolVersion: 1,
190
- productVersion: "2.8.0",
191
- instanceId: "3371dd7b-f76f-44e9-aefe-0e357a066056",
192
- startedAt: "2026-07-22T00:00:00.000Z",
193
- };
194
- const result = {
195
- outcome: "generation-replaced",
196
- previousIdentity: null,
197
- daemon: { status: "connected", identity },
198
- };
199
- expect(DesktopDaemonRefreshConnectionResultSchemaZ.parse(result)).toEqual(result);
200
- expect(
201
- DesktopDaemonRefreshConnectionResultSchemaZ.safeParse({
202
- ...result,
203
- apiBaseUrl: "http://127.0.0.1:6060",
204
- }).success,
205
- ).toBe(false);
206
- expect(
207
- DesktopDaemonEventSchemaZ.parse({
208
- type: "daemon-generation.changed",
209
- previousIdentity: identity,
210
- daemon: { status: "unavailable", code: "record-missing", reason: "not running" },
211
- }),
212
- ).toMatchObject({ type: "daemon-generation.changed" });
213
- expect(
214
- DesktopDaemonEventSchemaZ.safeParse({
215
- type: "daemon-generation.changed",
216
- previousIdentity: identity,
217
- daemon: { status: "connected", identity, sessionName: "raw-session" },
218
- }).success,
219
- ).toBe(false);
220
- });
221
-
222
- it("carries the supervisor-derived transport state as a typed event", () => {
223
- const error = {
224
- code: "event-unavailable",
225
- reason: "The daemon event connection is unavailable.",
226
- };
227
- for (const transport of [
228
- { phase: "idle" },
229
- { phase: "connecting" },
230
- { phase: "connected" },
231
- { phase: "degraded", error },
232
- {
233
- phase: "reconnecting",
234
- attempt: 2,
235
- maximumAttempts: 4,
236
- nextRetryAt: 1_753_000_000_000,
237
- error,
238
- },
239
- { phase: "stopped", error },
240
- ]) {
241
- const event = { type: "transport.changed", transport };
242
- expect(DesktopDaemonEventSchemaZ.parse(event)).toEqual(event);
243
- }
244
- expect(
245
- DesktopDaemonEventSchemaZ.safeParse({
246
- type: "transport.changed",
247
- transport: { phase: "reconnecting", attempt: 0, maximumAttempts: 4, nextRetryAt: 1, error },
248
- }).success,
249
- ).toBe(false);
250
- expect(
251
- DesktopDaemonEventSchemaZ.safeParse({
252
- type: "transport.changed",
253
- transport: { phase: "connected", endpoint: "http://127.0.0.1:1" },
254
- }).success,
255
- ).toBe(false);
256
- });
257
-
258
- it("carries an optional causal receipt with application-shell invalidations", () => {
259
- const event = {
260
- type: "application-shell.changed",
261
- workspaceName: "product",
262
- daemonInstanceId: "22222222-2222-4222-8222-222222222222",
263
- sequence: 9,
264
- revision: 4,
265
- causeOperationId: "10000000-0000-4000-8000-000000000001",
266
- };
267
- expect(DesktopDaemonEventSchemaZ.parse(event)).toEqual(event);
268
- });
269
- });
@@ -1,215 +0,0 @@
1
- import { describe, expect, it } from "vitest";
2
-
3
- import {
4
- ApplicationShellProjectionInputV3SchemaZ,
5
- COHESION_FIXTURE_V1,
6
- DESKTOP_MISSION_MAX_ACTIVITY,
7
- DesktopMissionWorkspaceResourceSchemaZ,
8
- } from "../index.ts";
9
-
10
- const proof = {
11
- hasProof: false,
12
- proofCount: 0,
13
- notesCount: 0,
14
- noProofReasons: ["Implementation proof has not been recorded yet."],
15
- tests: { suites: 0, passed: 0, failed: 0, skipped: 0, total: 0 },
16
- commitCount: 0,
17
- filesChanged: 0,
18
- insertions: 0,
19
- deletions: 0,
20
- pullRequestCount: 0,
21
- artifactCount: 0,
22
- } as const;
23
-
24
- const mission = {
25
- id: "mis_alpha",
26
- title: "Desktop mission journey",
27
- summary: "Show durable status, progress, evidence, and recovery.",
28
- status: "started",
29
- column: "running",
30
- updatedAt: "2026-07-22T10:00:00.000Z",
31
- durationMs: 1_000,
32
- progress: {
33
- total: 1,
34
- planned: 0,
35
- running: 1,
36
- review: 0,
37
- blocked: 0,
38
- completed: 0,
39
- failed: 0,
40
- cancelled: 0,
41
- done: 0,
42
- },
43
- blockedCount: 0,
44
- latestAttempt: null,
45
- proof,
46
- } as const;
47
-
48
- const activity = {
49
- id: "activity.1",
50
- sequence: 1,
51
- timestamp: "2026-07-22T10:00:00.000Z",
52
- missionId: "mis_alpha",
53
- type: "mission.started",
54
- label: "Mission started",
55
- actor: { type: "user", label: "Project manager" },
56
- } as const;
57
-
58
- describe("desktop mission workspace contract", () => {
59
- it("accepts bounded, path-free ready, empty, and degraded resources", () => {
60
- expect(
61
- DesktopMissionWorkspaceResourceSchemaZ.parse({
62
- status: "ready",
63
- counts: { missions: 1, history: 0, activity: 1 },
64
- missions: [mission],
65
- history: [],
66
- activity: [activity],
67
- truncated: false,
68
- }).status,
69
- ).toBe("ready");
70
- expect(
71
- DesktopMissionWorkspaceResourceSchemaZ.parse({
72
- status: "empty",
73
- counts: { missions: 0, history: 0, activity: 0 },
74
- missions: [],
75
- history: [],
76
- activity: [],
77
- truncated: false,
78
- }).status,
79
- ).toBe("empty");
80
- expect(
81
- DesktopMissionWorkspaceResourceSchemaZ.parse({
82
- status: "degraded",
83
- reason: "Mission history is temporarily unavailable.",
84
- }).status,
85
- ).toBe("degraded");
86
- });
87
-
88
- it("rejects authority-bearing fields and unbounded activity payloads", () => {
89
- expect(() =>
90
- DesktopMissionWorkspaceResourceSchemaZ.parse({
91
- status: "ready",
92
- counts: { missions: 1, history: 0, activity: 1 },
93
- missions: [{ ...mission, worktree: "/private/repo" }],
94
- history: [],
95
- activity: [activity],
96
- truncated: false,
97
- }),
98
- ).toThrow();
99
- expect(() =>
100
- DesktopMissionWorkspaceResourceSchemaZ.parse({
101
- status: "ready",
102
- counts: { missions: 0, history: 0, activity: DESKTOP_MISSION_MAX_ACTIVITY + 1 },
103
- missions: [],
104
- history: [],
105
- activity: Array.from({ length: DESKTOP_MISSION_MAX_ACTIVITY + 1 }, (_, index) => ({
106
- ...activity,
107
- id: `activity.${index + 1}`,
108
- sequence: index + 1,
109
- })),
110
- truncated: true,
111
- }),
112
- ).toThrow();
113
- });
114
-
115
- it("keeps the V3 mission projection optional for existing resource producers", () => {
116
- const parsed = ApplicationShellProjectionInputV3SchemaZ.safeParse({
117
- project: COHESION_FIXTURE_V1.project,
118
- workspace: COHESION_FIXTURE_V1.workspace,
119
- dock: COHESION_FIXTURE_V1.dock,
120
- focus: COHESION_FIXTURE_V1.focus,
121
- connection: COHESION_FIXTURE_V1.connection,
122
- terminalInventory: {
123
- resources: COHESION_FIXTURE_V1.workspace.sidebar.agents.map((agent) => ({
124
- id: agent.paneId,
125
- title: agent.name,
126
- kind: "agent" as const,
127
- active: agent.paneId === COHESION_FIXTURE_V1.focus.appFocusedPaneId,
128
- interactionEndpoint: null,
129
- nativeIdentity: null,
130
- attachability: { status: "available" as const, semanticPaneId: agent.paneId },
131
- })),
132
- activeResourceId: COHESION_FIXTURE_V1.focus.appFocusedPaneId,
133
- },
134
- appWindows: {
135
- version: 1,
136
- revision: 0,
137
- updatedAt: "2026-07-22T10:00:00.000Z",
138
- windows: {},
139
- dockRoot: null,
140
- dockState: {
141
- mode: "collapsed",
142
- preferredHeight: null,
143
- focusZone: "canvas",
144
- },
145
- floatingOrder: [],
146
- focusedWindowId: null,
147
- activeLayoutId: null,
148
- layouts: {},
149
- },
150
- });
151
- expect(parsed.success).toBe(true);
152
- });
153
-
154
- it("accepts an optional agent-graph overlay on V3 and rejects a malformed one", () => {
155
- const baseInput = {
156
- project: COHESION_FIXTURE_V1.project,
157
- workspace: COHESION_FIXTURE_V1.workspace,
158
- dock: COHESION_FIXTURE_V1.dock,
159
- focus: COHESION_FIXTURE_V1.focus,
160
- connection: COHESION_FIXTURE_V1.connection,
161
- terminalInventory: {
162
- resources: COHESION_FIXTURE_V1.workspace.sidebar.agents.map((agent) => ({
163
- id: agent.paneId,
164
- title: agent.name,
165
- kind: "agent" as const,
166
- active: agent.paneId === COHESION_FIXTURE_V1.focus.appFocusedPaneId,
167
- interactionEndpoint: null,
168
- nativeIdentity: null,
169
- attachability: { status: "available" as const, semanticPaneId: agent.paneId },
170
- })),
171
- activeResourceId: COHESION_FIXTURE_V1.focus.appFocusedPaneId,
172
- },
173
- appWindows: {
174
- version: 1,
175
- revision: 0,
176
- updatedAt: "2026-07-22T10:00:00.000Z",
177
- windows: {},
178
- dockRoot: null,
179
- dockState: { mode: "collapsed", preferredHeight: null, focusZone: "canvas" },
180
- floatingOrder: [],
181
- focusedWindowId: null,
182
- activeLayoutId: null,
183
- layouts: {},
184
- },
185
- };
186
- const node = {
187
- windowId: "window-terminal-pane.pm-0-abc",
188
- status: "working" as const,
189
- statusSource: "authority" as const,
190
- attention: false,
191
- label: "Fable",
192
- };
193
-
194
- const withOverlay = ApplicationShellProjectionInputV3SchemaZ.safeParse({
195
- ...baseInput,
196
- agentGraphOverlay: {
197
- nodes: { [node.windowId]: node },
198
- edges: [],
199
- groups: [],
200
- },
201
- });
202
- expect(withOverlay.success).toBe(true);
203
-
204
- // A raw tmux pane id can never key an overlay node -> the whole V3 input fails.
205
- const malformed = ApplicationShellProjectionInputV3SchemaZ.safeParse({
206
- ...baseInput,
207
- agentGraphOverlay: {
208
- nodes: { "%12": { ...node, windowId: "%12" } },
209
- edges: [],
210
- groups: [],
211
- },
212
- });
213
- expect(malformed.success).toBe(false);
214
- });
215
- });
@@ -1,153 +0,0 @@
1
- import { describe, expect, it } from "vitest";
2
- import {
3
- PANE_ROLE_IDS,
4
- PaneRoleIdSchemaZ,
5
- SEMANTIC_ICON_IDS,
6
- SemanticIconIdSchemaZ,
7
- } from "../experience-identifiers.ts";
8
- import {
9
- CANONICAL_SURFACE_REGISTRY,
10
- DOCK_TOOL_IDS,
11
- DockToolIdSchemaZ,
12
- PRIMARY_WORKSPACE_MODE_IDS,
13
- PRODUCT_SURFACE_IDS,
14
- PrimaryWorkspaceModeIdSchemaZ,
15
- ProductSurfaceIdSchemaZ,
16
- } from "../experience-shell.ts";
17
- import {
18
- AGENT_ACTIVITY_IDS,
19
- AgentActivitySchemaZ,
20
- CANONICAL_DOMAIN_STATUS_IDS,
21
- CanonicalDomainStatusSchemaZ,
22
- PANE_ATTENTION_IDS,
23
- PaneAttentionSchemaZ,
24
- statusToneForDomainStatus,
25
- } from "../pane-appearance.ts";
26
- import {
27
- BORDER_TOKEN_ROLES,
28
- BUILTIN_VISUAL_THEMES,
29
- DENSITY_TOKEN_ROLES,
30
- ELEVATION_TOKEN_ROLES,
31
- FOCUS_TOKEN_ROLES,
32
- MOTION_DURATION_ROLES,
33
- SELECTION_TOKEN_ROLES,
34
- SHAPE_TOKEN_ROLES,
35
- STATUS_TONE_ROLES,
36
- SURFACE_TOKEN_ROLES,
37
- TEXT_TOKEN_ROLES,
38
- TYPOGRAPHY_TOKEN_ROLES,
39
- VisualTokensV1SchemaZ,
40
- WINDOW_ACTIVITY_TOKEN_ROLES,
41
- type VisualTokensV1,
42
- } from "../visual-tokens.ts";
43
-
44
- const TOKEN_ROLES_BY_GROUP = {
45
- surfaces: SURFACE_TOKEN_ROLES,
46
- text: TEXT_TOKEN_ROLES,
47
- borders: BORDER_TOKEN_ROLES,
48
- statusTone: STATUS_TONE_ROLES,
49
- selection: SELECTION_TOKEN_ROLES,
50
- density: DENSITY_TOKEN_ROLES,
51
- shape: SHAPE_TOKEN_ROLES,
52
- elevation: ELEVATION_TOKEN_ROLES,
53
- motion: [...MOTION_DURATION_ROLES, "easing"],
54
- typography: TYPOGRAPHY_TOKEN_ROLES,
55
- focus: FOCUS_TOKEN_ROLES,
56
- windowActivity: WINDOW_ACTIVITY_TOKEN_ROLES,
57
- } as const satisfies Readonly<{
58
- [Group in keyof VisualTokensV1]: readonly (keyof VisualTokensV1[Group])[];
59
- }>;
60
-
61
- const jsonRoundTrip = <T>(value: T): T => JSON.parse(JSON.stringify(value)) as T;
62
-
63
- const TOKEN_IDS = Object.entries(TOKEN_ROLES_BY_GROUP).flatMap(([group, roles]) =>
64
- roles.map((role) => `${group}.${String(role)}`),
65
- );
66
-
67
- /** One transport-shaped identity fixture proves the complete host adapter vocabulary. */
68
- const CONFORMANCE_ID_FIXTURE_V1 = Object.freeze({
69
- version: 1 as const,
70
- tokens: TOKEN_IDS,
71
- icons: SEMANTIC_ICON_IDS,
72
- statuses: {
73
- agentActivity: AGENT_ACTIVITY_IDS,
74
- domain: CANONICAL_DOMAIN_STATUS_IDS,
75
- attention: PANE_ATTENTION_IDS,
76
- },
77
- surfaces: PRODUCT_SURFACE_IDS,
78
- paneRoles: PANE_ROLE_IDS,
79
- });
80
-
81
- function expectUniqueSerializableIds(
82
- ids: readonly string[],
83
- parse: (value: unknown) => unknown,
84
- ): void {
85
- expect(new Set(ids).size).toBe(ids.length);
86
- expect(jsonRoundTrip(ids)).toEqual(ids);
87
- for (const id of ids) expect(parse(jsonRoundTrip(id))).toBe(id);
88
- }
89
-
90
- describe("experience-kernel identifier conformance", () => {
91
- it("round-trips the complete adapter identity fixture", () => {
92
- expect(jsonRoundTrip(CONFORMANCE_ID_FIXTURE_V1)).toEqual(CONFORMANCE_ID_FIXTURE_V1);
93
- });
94
-
95
- it("keeps every required visual token role exhaustive and serializable", () => {
96
- expectUniqueSerializableIds(TOKEN_IDS, (id) => id);
97
-
98
- for (const tokens of Object.values(BUILTIN_VISUAL_THEMES)) {
99
- const roundTripped = VisualTokensV1SchemaZ.parse(jsonRoundTrip(tokens));
100
- for (const [group, roles] of Object.entries(TOKEN_ROLES_BY_GROUP)) {
101
- expect(Object.keys(roundTripped[group as keyof VisualTokensV1]).sort(), group).toEqual(
102
- [...roles].sort(),
103
- );
104
- }
105
- }
106
- });
107
-
108
- it("keeps every semantic icon ID exhaustive and serializable", () => {
109
- expectUniqueSerializableIds(SEMANTIC_ICON_IDS, (id) => SemanticIconIdSchemaZ.parse(id));
110
- expect(CANONICAL_SURFACE_REGISTRY.map(({ icon }) => icon)).toEqual([
111
- "home",
112
- "terminals",
113
- "files",
114
- "changes",
115
- "missions",
116
- "activity",
117
- ]);
118
- });
119
-
120
- it("keeps every canonical status ID exhaustive and serializable", () => {
121
- expectUniqueSerializableIds(AGENT_ACTIVITY_IDS, (id) => AgentActivitySchemaZ.parse(id));
122
- expectUniqueSerializableIds(CANONICAL_DOMAIN_STATUS_IDS, (id) =>
123
- CanonicalDomainStatusSchemaZ.parse(id),
124
- );
125
- expectUniqueSerializableIds(PANE_ATTENTION_IDS, (id) => PaneAttentionSchemaZ.parse(id));
126
- expect(
127
- Object.fromEntries(
128
- CANONICAL_DOMAIN_STATUS_IDS.map((status) => [status, statusToneForDomainStatus(status)]),
129
- ),
130
- ).toEqual({
131
- idle: "neutral",
132
- running: "info",
133
- blocked: "warning",
134
- review: "info",
135
- done: "success",
136
- disconnected: "danger",
137
- recovering: "danger",
138
- });
139
- });
140
-
141
- it("keeps every product surface ID exhaustive and serializable", () => {
142
- expectUniqueSerializableIds(PRIMARY_WORKSPACE_MODE_IDS, (id) =>
143
- PrimaryWorkspaceModeIdSchemaZ.parse(id),
144
- );
145
- expectUniqueSerializableIds(DOCK_TOOL_IDS, (id) => DockToolIdSchemaZ.parse(id));
146
- expectUniqueSerializableIds(PRODUCT_SURFACE_IDS, (id) => ProductSurfaceIdSchemaZ.parse(id));
147
- expect(CANONICAL_SURFACE_REGISTRY.map(({ id }) => id)).toEqual(PRODUCT_SURFACE_IDS);
148
- });
149
-
150
- it("keeps every pane-role ID exhaustive and serializable", () => {
151
- expectUniqueSerializableIds(PANE_ROLE_IDS, (id) => PaneRoleIdSchemaZ.parse(id));
152
- });
153
- });