tmux-ide 2.7.0 → 2.9.0-beta.11

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 (1449) hide show
  1. package/README.md +95 -115
  2. package/bin/cli.js +81169 -11778
  3. package/package.json +74 -37
  4. package/packages/contracts/package.json +3 -2
  5. package/packages/contracts/src/__tests__/actions-contract.test.ts +119 -0
  6. package/packages/contracts/src/__tests__/agent-graph-overlay.test.ts +428 -0
  7. package/packages/contracts/src/__tests__/app-window-mutation.test.ts +51 -0
  8. package/packages/contracts/src/__tests__/app-window-state.test.ts +34 -0
  9. package/packages/contracts/src/__tests__/application-shell.test.ts +635 -0
  10. package/packages/contracts/src/__tests__/causal-cell.test.ts +47 -0
  11. package/packages/contracts/src/__tests__/client-view-state.test.ts +115 -0
  12. package/packages/contracts/src/__tests__/cohesion-fixture.test.ts +106 -0
  13. package/packages/contracts/src/__tests__/commands.test.ts +86 -0
  14. package/packages/contracts/src/__tests__/control.test.ts +154 -0
  15. package/packages/contracts/src/__tests__/daemon-events.test.ts +400 -0
  16. package/packages/contracts/src/__tests__/daemon-resources.test.ts +143 -0
  17. package/packages/contracts/src/__tests__/daemon-wire.test.ts +117 -0
  18. package/packages/contracts/src/__tests__/desktop-host.test.ts +269 -0
  19. package/packages/contracts/src/__tests__/desktop-missions.test.ts +211 -0
  20. package/packages/contracts/src/__tests__/experience-conformance.test.ts +153 -0
  21. package/packages/contracts/src/__tests__/experience-kernel-boundary.test.ts +109 -0
  22. package/packages/contracts/src/__tests__/experience-shell.test.ts +65 -0
  23. package/packages/contracts/src/__tests__/fixtures/daemon-wire-v2.json +35 -0
  24. package/packages/contracts/src/__tests__/fleet-agent-graph.test.ts +231 -0
  25. package/packages/contracts/src/__tests__/fleet-catalog.test.ts +268 -0
  26. package/packages/contracts/src/__tests__/fleet-lifecycle.test.ts +62 -0
  27. package/packages/contracts/src/__tests__/focus-overlay.test.ts +110 -0
  28. package/packages/contracts/src/__tests__/ide-config.test.ts +18 -0
  29. package/packages/contracts/src/__tests__/issue-error.test.ts +78 -0
  30. package/packages/contracts/src/__tests__/mission-projections.test.ts +186 -0
  31. package/packages/contracts/src/__tests__/missions.test.ts +272 -0
  32. package/packages/contracts/src/__tests__/multiplexer-verbs.test.ts +240 -0
  33. package/packages/contracts/src/__tests__/pane-appearance.test.ts +146 -0
  34. package/packages/contracts/src/__tests__/pane-stream.test.ts +488 -0
  35. package/packages/contracts/src/__tests__/pane-widget-marker.test.ts +327 -0
  36. package/packages/contracts/src/__tests__/performance-metrics.test.ts +73 -0
  37. package/packages/contracts/src/__tests__/performance-qualification.test.ts +137 -0
  38. package/packages/contracts/src/__tests__/rich-card-widget.test.ts +29 -0
  39. package/packages/contracts/src/__tests__/session-runtime.test.ts +504 -0
  40. package/packages/contracts/src/__tests__/startup-readiness.test.ts +409 -0
  41. package/packages/contracts/src/__tests__/terminal-attachment-stream.test.ts +72 -0
  42. package/packages/contracts/src/__tests__/terminal-attachments.test.ts +329 -0
  43. package/packages/contracts/src/__tests__/terminal-delivery.test.ts +88 -0
  44. package/packages/contracts/src/__tests__/terminal-runtime-inventory.test.ts +68 -0
  45. package/packages/contracts/src/__tests__/visual-tokens.test.ts +224 -0
  46. package/packages/contracts/src/__tests__/workspace-changes-resource.test.ts +317 -0
  47. package/packages/contracts/src/__tests__/workspace-changes-view.test.ts +122 -0
  48. package/packages/contracts/src/__tests__/workspace-config.test.ts +294 -0
  49. package/packages/contracts/src/__tests__/workspace-files-resource.test.ts +261 -0
  50. package/packages/contracts/src/__tests__/workspace-files-tree.test.ts +147 -0
  51. package/packages/contracts/src/__tests__/workspace-pane-creation.test.ts +249 -0
  52. package/packages/contracts/src/__tests__/workspace-promotion.test.ts +94 -0
  53. package/packages/contracts/src/__tests__/workspace-resource-identity.test.ts +90 -0
  54. package/packages/contracts/src/actions-contract.ts +205 -0
  55. package/packages/contracts/src/actions-errors.ts +20 -0
  56. package/packages/contracts/src/agent-graph-overlay.ts +425 -0
  57. package/packages/contracts/src/app-window-mutation.ts +103 -0
  58. package/packages/contracts/src/app-window-state.ts +446 -0
  59. package/packages/contracts/src/application-shell-resource.ts +54 -0
  60. package/packages/contracts/src/application-shell.ts +1094 -0
  61. package/packages/contracts/src/causal-cell.ts +168 -0
  62. package/packages/contracts/src/client-view-state.ts +156 -0
  63. package/packages/contracts/src/cohesion-fixture.ts +647 -0
  64. package/packages/contracts/src/commands.ts +153 -0
  65. package/packages/contracts/src/control.ts +217 -0
  66. package/packages/contracts/src/daemon-events.ts +374 -0
  67. package/packages/contracts/src/daemon-resource-request.test.ts +192 -0
  68. package/packages/contracts/src/daemon-resource-request.ts +397 -0
  69. package/packages/contracts/src/daemon-resources.ts +108 -0
  70. package/packages/contracts/src/daemon-wire.ts +100 -0
  71. package/packages/contracts/src/desktop-daemon-issue.ts +83 -0
  72. package/packages/contracts/src/desktop-host.ts +746 -0
  73. package/packages/contracts/src/desktop-missions.ts +159 -0
  74. package/packages/contracts/src/desktop-update.ts +48 -0
  75. package/packages/contracts/src/desktop-workspace-name.ts +18 -0
  76. package/packages/contracts/src/domain.ts +493 -0
  77. package/packages/contracts/src/experience-identifiers.ts +53 -0
  78. package/packages/contracts/src/experience-shell.ts +249 -0
  79. package/packages/contracts/src/fleet-agent-graph.ts +171 -0
  80. package/packages/contracts/src/fleet-catalog.ts +190 -0
  81. package/packages/contracts/src/fleet-lifecycle.ts +136 -0
  82. package/packages/contracts/src/focus-overlay.ts +175 -0
  83. package/packages/contracts/src/ide-config.ts +40 -20
  84. package/packages/contracts/src/index.ts +64 -0
  85. package/packages/contracts/src/interaction-receipts.ts +438 -0
  86. package/packages/contracts/src/issue-error.ts +107 -0
  87. package/packages/contracts/src/mission-projections.ts +269 -0
  88. package/packages/contracts/src/multiplexer-verbs.ts +447 -0
  89. package/packages/contracts/src/pane-appearance.ts +248 -0
  90. package/packages/contracts/src/pane-stream.ts +711 -0
  91. package/packages/contracts/src/pane-widget-descriptor.ts +62 -0
  92. package/packages/contracts/src/pane-widget-marker.ts +301 -0
  93. package/packages/contracts/src/performance-metrics.ts +128 -0
  94. package/packages/contracts/src/performance-qualification.ts +276 -0
  95. package/packages/contracts/src/rich-card-widget.ts +72 -0
  96. package/packages/contracts/src/saved-machines.ts +50 -0
  97. package/packages/contracts/src/semantic-identity.ts +39 -0
  98. package/packages/contracts/src/session-runtime.ts +364 -0
  99. package/packages/contracts/src/shared-monotonic-clock.ts +18 -0
  100. package/packages/contracts/src/startup-readiness.ts +432 -0
  101. package/packages/contracts/src/terminal-attachment-stream.ts +119 -0
  102. package/packages/contracts/src/terminal-attachments.ts +347 -0
  103. package/packages/contracts/src/terminal-delivery.ts +245 -0
  104. package/packages/contracts/src/terminal-replica.ts +133 -0
  105. package/packages/contracts/src/terminal-runtime-inventory.ts +42 -0
  106. package/packages/contracts/src/visual-recipes.ts +126 -0
  107. package/packages/contracts/src/visual-theme-presets.ts +499 -0
  108. package/packages/contracts/src/visual-tokens.ts +883 -0
  109. package/packages/contracts/src/widget-asset.ts +43 -0
  110. package/packages/contracts/src/workspace-catalog-resource.test.ts +146 -0
  111. package/packages/contracts/src/workspace-catalog-resource.ts +180 -0
  112. package/packages/contracts/src/workspace-changes-resource.ts +405 -0
  113. package/packages/contracts/src/workspace-changes-view.ts +195 -0
  114. package/packages/contracts/src/workspace-config.ts +303 -0
  115. package/packages/contracts/src/workspace-files-resource.ts +310 -0
  116. package/packages/contracts/src/workspace-files-tree.ts +167 -0
  117. package/packages/contracts/src/workspace-missions-resource.ts +32 -0
  118. package/packages/contracts/src/workspace-multiplexer.ts +373 -0
  119. package/packages/contracts/src/workspace-open-handoff.ts +99 -0
  120. package/packages/contracts/src/workspace-open.ts +64 -0
  121. package/packages/contracts/src/workspace-pane-creation.ts +223 -0
  122. package/packages/contracts/src/workspace-promotion.ts +109 -0
  123. package/packages/contracts/src/workspace-resource-identity.ts +81 -0
  124. package/packages/contracts/src/workspace-state.ts +530 -0
  125. package/packages/contracts/src/workspace.ts +14 -2
  126. package/packages/core/package.json +35 -0
  127. package/packages/core/src/agent-provisioning.test.ts +42 -0
  128. package/packages/core/src/agent-provisioning.ts +112 -0
  129. package/packages/core/src/app-window-identity.ts +33 -0
  130. package/packages/core/src/application-shell-session.test.ts +105 -0
  131. package/packages/core/src/application-shell-session.ts +195 -0
  132. package/packages/core/src/index.ts +17 -0
  133. package/packages/core/src/interaction-flow.test.ts +66 -0
  134. package/packages/core/src/interaction-flow.ts +159 -0
  135. package/packages/core/src/interaction-receipts.test.ts +361 -0
  136. package/packages/core/src/interaction-receipts.ts +336 -0
  137. package/packages/core/src/navigator.test.ts +34 -0
  138. package/packages/core/src/navigator.ts +74 -0
  139. package/packages/core/src/optimistic-projection-conformance.test.ts +75 -0
  140. package/packages/core/src/optimistic-projection-conformance.ts +61 -0
  141. package/packages/core/src/optimistic-projection-store.ts +71 -0
  142. package/packages/core/src/optimistic-projection.test.ts +118 -0
  143. package/packages/core/src/optimistic-projection.ts +194 -0
  144. package/packages/core/src/performance-metrics.test.ts +121 -0
  145. package/packages/core/src/performance-metrics.ts +241 -0
  146. package/packages/core/src/performance-qualification.test.ts +283 -0
  147. package/packages/core/src/performance-qualification.ts +360 -0
  148. package/packages/core/src/saved-machines.test.ts +80 -0
  149. package/packages/core/src/saved-machines.ts +53 -0
  150. package/packages/core/src/terminal-compact-capability.ts +31 -0
  151. package/packages/core/src/terminal-compact-cold.test.ts +87 -0
  152. package/packages/core/src/terminal-conformance.test.ts +48 -0
  153. package/packages/core/src/terminal-conformance.ts +405 -0
  154. package/packages/core/src/terminal-delivery.test.ts +1400 -0
  155. package/packages/core/src/terminal-delivery.ts +2977 -0
  156. package/packages/core/src/terminal-fnv64-wasm-bytes.ts +20 -0
  157. package/packages/core/src/terminal-fnv64-wasm.test.ts +61 -0
  158. package/packages/core/src/terminal-fnv64-wasm.ts +110 -0
  159. package/packages/core/src/terminal-replica-cold.test.ts +31 -0
  160. package/packages/core/src/terminal-replica-hash-cache.test.ts +283 -0
  161. package/packages/core/src/terminal-replica-hash-cache.ts +399 -0
  162. package/packages/core/src/terminal-replica.test.ts +347 -0
  163. package/packages/core/src/terminal-replica.ts +950 -0
  164. package/packages/core/src/workspace-selection.test.ts +63 -0
  165. package/packages/core/src/workspace-selection.ts +97 -0
  166. package/packages/daemon/dist/attach.js +2 -2
  167. package/packages/daemon/dist/canonical.js +1 -1
  168. package/packages/daemon/dist/cli.js +38 -37
  169. package/packages/daemon/dist/command-center/actions/command-definitions.js +70 -0
  170. package/packages/daemon/dist/command-center/actions/dispatcher.js +228 -10
  171. package/packages/daemon/dist/command-center/actions/handlers/_project-context.js +3 -4
  172. package/packages/daemon/dist/command-center/actions/handlers/app-set-remote-access.js +6 -2
  173. package/packages/daemon/dist/command-center/actions/handlers/app-window-mutate.js +39 -0
  174. package/packages/daemon/dist/command-center/actions/handlers/config-actions.js +44 -20
  175. package/packages/daemon/dist/command-center/actions/handlers/daemon-shutdown.js +11 -1
  176. package/packages/daemon/dist/command-center/actions/handlers/fleet-lifecycle.js +56 -0
  177. package/packages/daemon/dist/command-center/actions/handlers/project-launch.js +16 -4
  178. package/packages/daemon/dist/command-center/actions/handlers/workspace-multiplexer.js +55 -0
  179. package/packages/daemon/dist/command-center/actions/handlers/workspace-open.js +89 -0
  180. package/packages/daemon/dist/command-center/actions/handlers/workspace-pane-create.js +34 -0
  181. package/packages/daemon/dist/command-center/actions/handlers/workspace-promote.js +34 -0
  182. package/packages/daemon/dist/command-center/actions/registry.js +126 -0
  183. package/packages/daemon/dist/command-center/actions/semantic-multiplexer-actions.js +16 -0
  184. package/packages/daemon/dist/command-center/agent-status-watch.js +170 -0
  185. package/packages/daemon/dist/command-center/daemon-fleet-facts-observer.js +395 -0
  186. package/packages/daemon/dist/command-center/discovery.js +262 -3
  187. package/packages/daemon/dist/command-center/owner-authority.js +46 -0
  188. package/packages/daemon/dist/command-center/pane-stream-issue.js +185 -0
  189. package/packages/daemon/dist/command-center/resources/agent-graph-overlay.js +234 -0
  190. package/packages/daemon/dist/command-center/resources/application-shell.js +641 -0
  191. package/packages/daemon/dist/command-center/resources/desktop-missions.js +132 -0
  192. package/packages/daemon/dist/command-center/resources/fleet-catalog.js +163 -0
  193. package/packages/daemon/dist/command-center/resources/fleet-resource-route.js +48 -0
  194. package/packages/daemon/dist/command-center/resources/startup-readiness-route.js +121 -0
  195. package/packages/daemon/dist/command-center/resources/startup-readiness.js +183 -0
  196. package/packages/daemon/dist/command-center/resources/terminal-native-backing-route.js +82 -0
  197. package/packages/daemon/dist/command-center/resources/terminal-runtime-inventory.js +24 -0
  198. package/packages/daemon/dist/command-center/resources/workspace-changes-authority.js +451 -0
  199. package/packages/daemon/dist/command-center/resources/workspace-changes-git.js +222 -0
  200. package/packages/daemon/dist/command-center/resources/workspace-files-authority.js +493 -0
  201. package/packages/daemon/dist/command-center/resources/workspace-missions-route.js +75 -0
  202. package/packages/daemon/dist/command-center/resources/workspace-resource-ids.js +69 -0
  203. package/packages/daemon/dist/command-center/resources/workspace-resource-routes.js +116 -0
  204. package/packages/daemon/dist/command-center/server.js +540 -51
  205. package/packages/daemon/dist/command-center/terminal-attachment-issue.js +191 -0
  206. package/packages/daemon/dist/command-center/workspace-resource-observer.js +453 -0
  207. package/packages/daemon/dist/command-center/ws-events.js +681 -63
  208. package/packages/daemon/dist/config.js +31 -25
  209. package/packages/daemon/dist/control/client.js +105 -0
  210. package/packages/daemon/dist/control/dispatch.js +83 -0
  211. package/packages/daemon/dist/control/fanout.js +37 -0
  212. package/packages/daemon/dist/control/frames.js +37 -0
  213. package/packages/daemon/dist/control/lifecycle.js +124 -0
  214. package/packages/daemon/dist/control/server.js +214 -0
  215. package/packages/daemon/dist/control/verbs.js +91 -0
  216. package/packages/daemon/dist/detect.js +23 -20
  217. package/packages/daemon/dist/doctor.js +130 -23
  218. package/packages/daemon/dist/index.js +20 -1
  219. package/packages/daemon/dist/init.js +24 -22
  220. package/packages/daemon/dist/inspect.js +33 -8
  221. package/packages/daemon/dist/launch.js +38 -26
  222. package/packages/daemon/dist/lib/__tests__/fixtures/workspace-state-writer.js +58 -0
  223. package/packages/daemon/dist/lib/agent-discovery.js +29 -14
  224. package/packages/daemon/dist/lib/agent-kind.js +24 -0
  225. package/packages/daemon/dist/lib/app-config.js +132 -5
  226. package/packages/daemon/dist/lib/app-window-kernel.js +556 -0
  227. package/packages/daemon/dist/lib/app-window-mutation.js +139 -0
  228. package/packages/daemon/dist/lib/app-window-repository.js +368 -0
  229. package/packages/daemon/dist/lib/app-window-state.js +415 -0
  230. package/packages/daemon/dist/lib/application-shell-app-windows.js +285 -0
  231. package/packages/daemon/dist/lib/auth/middleware.js +7 -3
  232. package/packages/daemon/dist/lib/bundled-tmux.js +90 -0
  233. package/packages/daemon/dist/lib/canonical-daemon-bootstrap.js +276 -0
  234. package/packages/daemon/dist/lib/canonical-daemon.js +507 -70
  235. package/packages/daemon/dist/lib/chrome-front-door.js +13 -0
  236. package/packages/daemon/dist/lib/cli-action-bridge.js +112 -82
  237. package/packages/daemon/dist/lib/command-registry.js +107 -0
  238. package/packages/daemon/dist/lib/config-context.js +34 -0
  239. package/packages/daemon/dist/lib/daemon-embed.js +1072 -363
  240. package/packages/daemon/dist/lib/daemon-session-monitor.js +194 -0
  241. package/packages/daemon/dist/lib/daemon.js +3 -47
  242. package/packages/daemon/dist/lib/directory-watcher.js +118 -0
  243. package/packages/daemon/dist/lib/embedded-daemon-lifecycle.js +102 -0
  244. package/packages/daemon/dist/lib/environment-identity.js +79 -0
  245. package/packages/daemon/dist/lib/fleet-agent-lifecycle.js +65 -0
  246. package/packages/daemon/dist/lib/fleet-lifecycle-authority.js +437 -0
  247. package/packages/daemon/dist/lib/headless-daemon.js +353 -0
  248. package/packages/daemon/dist/lib/launch-plan.js +96 -1
  249. package/packages/daemon/dist/lib/legacy-config-adapter.js +19 -0
  250. package/packages/daemon/dist/lib/legacy-config-migration.js +110 -0
  251. package/packages/daemon/dist/lib/legacy-theme-compat.js +25 -0
  252. package/packages/daemon/dist/lib/manifest-pack.js +232 -0
  253. package/packages/daemon/dist/lib/mission-projections.js +615 -0
  254. package/packages/daemon/dist/lib/mission-repository.js +775 -0
  255. package/packages/daemon/dist/lib/onboarding-marker.js +51 -0
  256. package/packages/daemon/dist/lib/pane-chrome.js +12 -0
  257. package/packages/daemon/dist/lib/pane-source-credentials.js +178 -0
  258. package/packages/daemon/dist/lib/pane-widget.js +126 -0
  259. package/packages/daemon/dist/lib/project-inspect.js +4 -0
  260. package/packages/daemon/dist/lib/project-onboard.js +17 -21
  261. package/packages/daemon/dist/lib/project-probe.js +28 -22
  262. package/packages/daemon/dist/lib/project-readiness-probe.js +425 -0
  263. package/packages/daemon/dist/lib/project-readiness.js +680 -0
  264. package/packages/daemon/dist/lib/project-registry.js +42 -9
  265. package/packages/daemon/dist/lib/project-resolver.js +245 -0
  266. package/packages/daemon/dist/lib/project-runtime-errors.js +21 -0
  267. package/packages/daemon/dist/lib/project-runtime-repository.js +876 -0
  268. package/packages/daemon/dist/lib/remote-daemon-info.js +21 -0
  269. package/packages/daemon/dist/lib/resolved-config.js +318 -0
  270. package/packages/daemon/dist/lib/runtime-namespace.js +136 -0
  271. package/packages/daemon/dist/lib/saved-machines.js +53 -0
  272. package/packages/daemon/dist/lib/semantic-resource-id.js +14 -0
  273. package/packages/daemon/dist/lib/session-monitor.js +29 -23
  274. package/packages/daemon/dist/lib/session-options.js +3 -10
  275. package/packages/daemon/dist/lib/ssh-daemon-transport.js +280 -0
  276. package/packages/daemon/dist/lib/state-home.js +11 -0
  277. package/packages/daemon/dist/lib/theme-mode.js +9 -0
  278. package/packages/daemon/dist/lib/tmux-authority-replacement.js +102 -0
  279. package/packages/daemon/dist/lib/tmux-external-interaction-observer.js +534 -0
  280. package/packages/daemon/dist/lib/tmux-interaction-options.js +126 -0
  281. package/packages/daemon/dist/lib/tmux-named-socket-fence.js +61 -0
  282. package/packages/daemon/dist/lib/tmux-terminal-color.js +37 -0
  283. package/packages/daemon/dist/lib/tui-binary.js +291 -28
  284. package/packages/daemon/dist/lib/unix-socket-authority.js +48 -0
  285. package/packages/daemon/dist/lib/update-check.js +5 -0
  286. package/packages/daemon/dist/lib/widget-asset-policy.js +3 -0
  287. package/packages/daemon/dist/lib/widget-asset-store.js +166 -0
  288. package/packages/daemon/dist/lib/workspace-config-loader.js +280 -0
  289. package/packages/daemon/dist/lib/workspace-multiplexer-verbs.js +1138 -0
  290. package/packages/daemon/dist/lib/workspace-open-handoff.js +219 -0
  291. package/packages/daemon/dist/lib/workspace-open.js +740 -0
  292. package/packages/daemon/dist/lib/workspace-pane-creation.js +1137 -0
  293. package/packages/daemon/dist/lib/workspace-promotion.js +809 -0
  294. package/packages/daemon/dist/lib/workspace-registry.js +150 -23
  295. package/packages/daemon/dist/lib/workspace-state-repository.js +790 -0
  296. package/packages/daemon/dist/lib/workspace-state.js +765 -0
  297. package/packages/daemon/dist/lib/yaml-io.js +4 -18
  298. package/packages/daemon/dist/migrate.js +105 -0
  299. package/packages/daemon/dist/native/tmux/darwin-arm64/COPYING +13 -0
  300. package/packages/daemon/dist/native/tmux/darwin-arm64/lib/libevent_core-2.1.7.dylib +0 -0
  301. package/packages/daemon/dist/native/tmux/darwin-arm64/lib/libncursesw.6.dylib +0 -0
  302. package/packages/daemon/dist/native/tmux/darwin-arm64/lib/libutf8proc.3.2.3.dylib +0 -0
  303. package/packages/daemon/dist/native/tmux/darwin-arm64/licenses/libevent_core-2.1.7.dylib.txt +99 -0
  304. package/packages/daemon/dist/native/tmux/darwin-arm64/licenses/libncursesw.6.dylib.txt +29 -0
  305. package/packages/daemon/dist/native/tmux/darwin-arm64/licenses/libutf8proc.3.2.3.dylib.txt +93 -0
  306. package/packages/daemon/dist/native/tmux/darwin-arm64/manifest.json +21 -0
  307. package/packages/daemon/dist/native/tmux/darwin-arm64/tmux +0 -0
  308. package/packages/daemon/dist/restart.js +2 -2
  309. package/packages/daemon/dist/restore.js +62 -21
  310. package/packages/daemon/dist/schemas/inspect.js +9 -1
  311. package/packages/daemon/dist/schemas/registry.js +5 -19
  312. package/packages/daemon/dist/schemas/ws-events.js +4 -107
  313. package/packages/daemon/dist/send.js +136 -20
  314. package/packages/daemon/dist/server/index.js +4 -2
  315. package/packages/daemon/dist/server/pane-stream-upgrade.js +117 -0
  316. package/packages/daemon/dist/server/terminal-attachment-upgrade.js +121 -0
  317. package/packages/daemon/dist/status.js +11 -8
  318. package/packages/daemon/dist/stop.js +2 -2
  319. package/packages/daemon/dist/terminal/MonotonicPtyInput.js +130 -0
  320. package/packages/daemon/dist/terminal/NodePtyAdapter.js +37 -10
  321. package/packages/daemon/dist/terminal/PtyAdapter.js +18 -0
  322. package/packages/daemon/dist/terminal/__tests__/MockPtyAdapter.js +33 -6
  323. package/packages/daemon/dist/terminal/attachments/admission-util.js +87 -0
  324. package/packages/daemon/dist/terminal/attachments/agent-status-probe.js +325 -0
  325. package/packages/daemon/dist/terminal/attachments/direct-websocket.js +1069 -0
  326. package/packages/daemon/dist/terminal/attachments/grouped-tmux.js +213 -0
  327. package/packages/daemon/dist/terminal/attachments/lease-manager.js +655 -0
  328. package/packages/daemon/dist/terminal/attachments/native-runtime.js +1597 -0
  329. package/packages/daemon/dist/terminal/attachments/pty-tmux-attachment-launcher.js +607 -0
  330. package/packages/daemon/dist/terminal/attachments/semantic-pane-catalog.js +208 -0
  331. package/packages/daemon/dist/terminal/attachments/tmux-view-executor.js +825 -0
  332. package/packages/daemon/dist/terminal/mirror/__tests__/scripted-channel.js +86 -0
  333. package/packages/daemon/dist/terminal/mirror/__tests__/simulated-channel.js +147 -0
  334. package/packages/daemon/dist/terminal/mirror/control-channel.js +739 -0
  335. package/packages/daemon/dist/terminal/mirror/control-mode-ownership.js +30 -0
  336. package/packages/daemon/dist/terminal/mirror/events.js +18 -0
  337. package/packages/daemon/dist/terminal/mirror/flow-ledger.js +56 -0
  338. package/packages/daemon/dist/terminal/mirror/mirror-service.js +338 -0
  339. package/packages/daemon/dist/terminal/mirror/native-frozen-grid.js +126 -0
  340. package/packages/daemon/dist/terminal/mirror/native-grid-capture.js +144 -0
  341. package/packages/daemon/dist/terminal/mirror/native-grid-projection.js +99 -0
  342. package/packages/daemon/dist/terminal/mirror/native-grid-reader.js +81 -0
  343. package/packages/daemon/dist/terminal/mirror/native-grid-reflow.js +183 -0
  344. package/packages/daemon/dist/terminal/mirror/pane-feed.js +196 -0
  345. package/packages/daemon/dist/terminal/mirror/session-channel.js +2670 -0
  346. package/packages/daemon/dist/terminal/pane-stream/lease-manager.js +245 -0
  347. package/packages/daemon/dist/terminal/pane-stream/pane-stream-websocket.js +2067 -0
  348. package/packages/daemon/dist/terminal/pane-stream/runtime.js +53 -0
  349. package/packages/daemon/dist/terminal/pane-stream/wire-ledger.js +110 -0
  350. package/packages/daemon/dist/terminal/protocol/chunk-bytes.js +21 -0
  351. package/packages/daemon/dist/terminal/protocol/control.js +111 -0
  352. package/packages/daemon/dist/terminal/protocol/input-coalescer.js +125 -0
  353. package/packages/daemon/dist/terminal/protocol/layout-parse.js +127 -0
  354. package/packages/daemon/dist/terminal/protocol/native-backing-client.js +44 -0
  355. package/packages/daemon/dist/terminal/protocol/pane-display-name.js +155 -0
  356. package/packages/daemon/dist/terminal/protocol/session-descriptor-discovery.js +294 -0
  357. package/packages/daemon/dist/terminal/protocol/workspace-tmux-adapter.js +213 -0
  358. package/packages/daemon/dist/terminal/session-runtime/authority-arbiter.js +266 -0
  359. package/packages/daemon/dist/terminal/session-runtime/causal-cell-ledger.js +278 -0
  360. package/packages/daemon/dist/terminal/session-runtime/interaction-receipt-facts.js +147 -0
  361. package/packages/daemon/dist/terminal/session-runtime/multiplexer-backend.js +116 -0
  362. package/packages/daemon/dist/terminal/session-runtime/registry.js +1387 -0
  363. package/packages/daemon/dist/terminal/session-runtime/runtime-observability.js +72 -0
  364. package/packages/daemon/dist/terminal/session-runtime/runtime-scheduler.js +10 -0
  365. package/packages/daemon/dist/terminal/session-runtime/runtime-trace-correlator.js +48 -0
  366. package/packages/daemon/dist/terminal/session-runtime/semantic-mutation-executor.js +353 -0
  367. package/packages/daemon/dist/terminal/session-runtime/semantic-mutation-resource-changes.js +32 -0
  368. package/packages/daemon/dist/terminal/session-runtime/terminal-delivery-hub.js +1399 -0
  369. package/packages/daemon/dist/terminal/session-runtime/terminal-delivery-observation-identity.js +9 -0
  370. package/packages/daemon/dist/terminal/session-runtime/terminal-replica-interpreter.js +559 -0
  371. package/packages/daemon/dist/terminal/session-runtime/terminal-replica-owner.js +552 -0
  372. package/packages/daemon/dist/terminal/session-runtime/terminal-replica-shadow-projections.js +21 -0
  373. package/packages/daemon/dist/terminal/session-runtime/transport-binding.js +474 -0
  374. package/packages/daemon/dist/terminal/session-runtime/xterm-terminal-interpreter-backend.js +414 -0
  375. package/packages/daemon/dist/tui/async-disposable-slot.js +57 -0
  376. package/packages/daemon/dist/tui/chrome/cheatsheet.js +211 -0
  377. package/packages/daemon/dist/tui/chrome/chip.js +25 -0
  378. package/packages/daemon/dist/tui/chrome/events.js +94 -0
  379. package/packages/daemon/dist/tui/chrome/front-door.js +16 -0
  380. package/packages/daemon/dist/tui/chrome/kitty-keys.js +54 -0
  381. package/packages/daemon/dist/tui/chrome/menu.js +251 -0
  382. package/packages/daemon/dist/tui/chrome/notify-prefs.js +13 -0
  383. package/packages/daemon/dist/tui/chrome/notify-state.js +77 -0
  384. package/packages/daemon/dist/tui/chrome/notify.js +711 -0
  385. package/packages/daemon/dist/tui/chrome/panels.js +60 -0
  386. package/packages/daemon/dist/tui/chrome/sidebar.js +183 -0
  387. package/packages/daemon/dist/tui/chrome/snapshot.js +290 -0
  388. package/packages/daemon/dist/tui/chrome/statusline.js +552 -0
  389. package/packages/daemon/dist/tui/chrome/updater.js +651 -0
  390. package/packages/daemon/dist/tui/chrome/welcome.js +117 -0
  391. package/packages/daemon/dist/tui/compiled.js +194 -0
  392. package/packages/daemon/dist/tui/detect/agent-resolution.js +60 -0
  393. package/packages/daemon/dist/tui/detect/classify.js +184 -0
  394. package/packages/daemon/dist/tui/detect/manifest-loader.js +242 -0
  395. package/packages/daemon/dist/tui/detect/manifest.js +126 -0
  396. package/packages/daemon/dist/tui/detect/manifests.js +535 -0
  397. package/packages/daemon/dist/tui/detect/process-tree.js +194 -0
  398. package/packages/daemon/dist/tui/detect/session-id.js +414 -0
  399. package/packages/daemon/dist/tui/detect/snapshot.js +81 -0
  400. package/packages/daemon/dist/tui/integrations/claude.js +151 -0
  401. package/packages/daemon/dist/tui/integrations/offer.js +134 -0
  402. package/packages/daemon/dist/tui/integrations/opencode.js +117 -0
  403. package/packages/daemon/dist/tui/mirror/ack-writer.js +78 -0
  404. package/packages/daemon/dist/tui/mirror/activity-surface-view.jsx +69 -0
  405. package/packages/daemon/dist/tui/mirror/activity-surface.js +271 -0
  406. package/packages/daemon/dist/tui/mirror/agent-chip.js +84 -0
  407. package/packages/daemon/dist/tui/mirror/agent-lifecycle.js +372 -0
  408. package/packages/daemon/dist/tui/mirror/agent-provisioning-executor.js +111 -0
  409. package/packages/daemon/dist/tui/mirror/agent-rows.js +126 -0
  410. package/packages/daemon/dist/tui/mirror/ansi-palette.js +3 -0
  411. package/packages/daemon/dist/tui/mirror/app-state.js +294 -0
  412. package/packages/daemon/dist/tui/mirror/application-keybindings.js +33 -0
  413. package/packages/daemon/dist/tui/mirror/application-shell-daemon-connection.js +270 -0
  414. package/packages/daemon/dist/tui/mirror/application-shell-daemon-session.js +45 -0
  415. package/packages/daemon/dist/tui/mirror/attention.js +59 -0
  416. package/packages/daemon/dist/tui/mirror/blit.js +120 -0
  417. package/packages/daemon/dist/tui/mirror/canonical-workspace-routing.js +54 -0
  418. package/packages/daemon/dist/tui/mirror/changes-surface-view.jsx +92 -0
  419. package/packages/daemon/dist/tui/mirror/changes-surface.js +210 -0
  420. package/packages/daemon/dist/tui/mirror/composite-layout.js +539 -0
  421. package/packages/daemon/dist/tui/mirror/configless-session-bootstrap.js +134 -0
  422. package/packages/daemon/dist/tui/mirror/dialog-model.js +183 -0
  423. package/packages/daemon/dist/tui/mirror/dialog-stack-core.js +232 -0
  424. package/packages/daemon/dist/tui/mirror/dialog-stack.js +2 -0
  425. package/packages/daemon/dist/tui/mirror/diff-model.js +332 -0
  426. package/packages/daemon/dist/tui/mirror/editor-buffer.js +47 -0
  427. package/packages/daemon/dist/tui/mirror/editor-open-policy.js +9 -0
  428. package/packages/daemon/dist/tui/mirror/features/changes/controller.js +454 -0
  429. package/packages/daemon/dist/tui/mirror/features/changes/feature.jsx +9 -0
  430. package/packages/daemon/dist/tui/mirror/features/dialogs/feature.jsx +123 -0
  431. package/packages/daemon/dist/tui/mirror/features/dialogs/session.js +160 -0
  432. package/packages/daemon/dist/tui/mirror/features/files/feature.jsx +15 -0
  433. package/packages/daemon/dist/tui/mirror/features/files/session.js +617 -0
  434. package/packages/daemon/dist/tui/mirror/features/home/feature.jsx +122 -0
  435. package/packages/daemon/dist/tui/mirror/features/missions-activity/contract.js +3 -0
  436. package/packages/daemon/dist/tui/mirror/features/missions-activity/feature.jsx +5 -0
  437. package/packages/daemon/dist/tui/mirror/features/missions-activity/session.js +377 -0
  438. package/packages/daemon/dist/tui/mirror/features/palette/buffer-geometry.js +36 -0
  439. package/packages/daemon/dist/tui/mirror/features/palette/contract.js +9 -0
  440. package/packages/daemon/dist/tui/mirror/features/palette/feature.js +3 -0
  441. package/packages/daemon/dist/tui/mirror/features/palette/session.js +394 -0
  442. package/packages/daemon/dist/tui/mirror/features/palette/surface.jsx +50 -0
  443. package/packages/daemon/dist/tui/mirror/features/performance-hud/feature.jsx +2 -0
  444. package/packages/daemon/dist/tui/mirror/features/performance-hud/session.js +148 -0
  445. package/packages/daemon/dist/tui/mirror/features/performance-hud/surface.jsx +64 -0
  446. package/packages/daemon/dist/tui/mirror/features/rich-preview/asset-loader.js +125 -0
  447. package/packages/daemon/dist/tui/mirror/features/rich-preview/contract.js +1 -0
  448. package/packages/daemon/dist/tui/mirror/features/rich-preview/feature.jsx +103 -0
  449. package/packages/daemon/dist/tui/mirror/features/rich-preview/session.js +310 -0
  450. package/packages/daemon/dist/tui/mirror/features/settings/catalog.js +10 -0
  451. package/packages/daemon/dist/tui/mirror/features/settings/contract.js +1 -0
  452. package/packages/daemon/dist/tui/mirror/features/settings/feature.js +2 -0
  453. package/packages/daemon/dist/tui/mirror/features/settings/session.js +309 -0
  454. package/packages/daemon/dist/tui/mirror/file-tree.js +283 -0
  455. package/packages/daemon/dist/tui/mirror/files-surface-view.jsx +92 -0
  456. package/packages/daemon/dist/tui/mirror/files-surface.js +237 -0
  457. package/packages/daemon/dist/tui/mirror/focus-projection.js +80 -0
  458. package/packages/daemon/dist/tui/mirror/folder-picker.js +114 -0
  459. package/packages/daemon/dist/tui/mirror/frame-coalescer.js +74 -0
  460. package/packages/daemon/dist/tui/mirror/home-model.js +125 -0
  461. package/packages/daemon/dist/tui/mirror/home-surface-model.js +297 -0
  462. package/packages/daemon/dist/tui/mirror/home-surface.jsx +110 -0
  463. package/packages/daemon/dist/tui/mirror/host-terminal.js +33 -0
  464. package/packages/daemon/dist/tui/mirror/hosted.js +239 -0
  465. package/packages/daemon/dist/tui/mirror/input-lifecycle.js +147 -0
  466. package/packages/daemon/dist/tui/mirror/interaction-flow.js +41 -0
  467. package/packages/daemon/dist/tui/mirror/legacy/missions-workspace-loader.js +84 -0
  468. package/packages/daemon/dist/tui/mirror/menu-model.js +143 -0
  469. package/packages/daemon/dist/tui/mirror/missions-dashboard.js +261 -0
  470. package/packages/daemon/dist/tui/mirror/missions-render-fixtures.js +330 -0
  471. package/packages/daemon/dist/tui/mirror/missions-surface-controller.js +314 -0
  472. package/packages/daemon/dist/tui/mirror/missions-surface.jsx +239 -0
  473. package/packages/daemon/dist/tui/mirror/missions-workspace.js +1399 -0
  474. package/packages/daemon/dist/tui/mirror/multiplexer-action-executor.js +252 -0
  475. package/packages/daemon/dist/tui/mirror/open-tui-pane-stream-socket.js +32 -0
  476. package/packages/daemon/dist/tui/mirror/open-tui-verified-routing.js +95 -0
  477. package/packages/daemon/dist/tui/mirror/open-tui-workspace-runtime-port.js +1087 -0
  478. package/packages/daemon/dist/tui/mirror/palette-surface-adapter.js +384 -0
  479. package/packages/daemon/dist/tui/mirror/palette.js +522 -0
  480. package/packages/daemon/dist/tui/mirror/pane-frame-state.js +124 -0
  481. package/packages/daemon/dist/tui/mirror/pane-mirror.js +584 -0
  482. package/packages/daemon/dist/tui/mirror/pane-surface.jsx +950 -0
  483. package/packages/daemon/dist/tui/mirror/panel-host-reactive.js +13 -0
  484. package/packages/daemon/dist/tui/mirror/panel-host.js +242 -0
  485. package/packages/daemon/dist/tui/mirror/perf-tap.js +32 -0
  486. package/packages/daemon/dist/tui/mirror/performance-events.js +46 -0
  487. package/packages/daemon/dist/tui/mirror/recipe-components.jsx +135 -0
  488. package/packages/daemon/dist/tui/mirror/recipes.js +395 -0
  489. package/packages/daemon/dist/tui/mirror/reference-performance-trace.js +598 -0
  490. package/packages/daemon/dist/tui/mirror/renderer-commands.js +250 -0
  491. package/packages/daemon/dist/tui/mirror/resize-model.js +105 -0
  492. package/packages/daemon/dist/tui/mirror/resize-transaction.js +221 -0
  493. package/packages/daemon/dist/tui/mirror/rich-placement-projection.js +80 -0
  494. package/packages/daemon/dist/tui/mirror/runtime/application-appearance-owner.js +176 -0
  495. package/packages/daemon/dist/tui/mirror/runtime/application-bootstrap.js +51 -0
  496. package/packages/daemon/dist/tui/mirror/runtime/application-daemon-authority-owner.js +235 -0
  497. package/packages/daemon/dist/tui/mirror/runtime/application-daemon-authority.js +8 -0
  498. package/packages/daemon/dist/tui/mirror/runtime/application-generation-starter.js +90 -0
  499. package/packages/daemon/dist/tui/mirror/runtime/application-home-agent-navigation.js +86 -0
  500. package/packages/daemon/dist/tui/mirror/runtime/application-home-agent-observer.js +301 -0
  501. package/packages/daemon/dist/tui/mirror/runtime/application-home-agent-roster.jsx +170 -0
  502. package/packages/daemon/dist/tui/mirror/runtime/application-home-agent-selection.js +83 -0
  503. package/packages/daemon/dist/tui/mirror/runtime/application-home-agent-transport.js +199 -0
  504. package/packages/daemon/dist/tui/mirror/runtime/application-home-agents-owner.js +221 -0
  505. package/packages/daemon/dist/tui/mirror/runtime/application-home-agents.js +30 -0
  506. package/packages/daemon/dist/tui/mirror/runtime/application-home-catalog-owner.js +104 -0
  507. package/packages/daemon/dist/tui/mirror/runtime/application-home-catalog.js +329 -0
  508. package/packages/daemon/dist/tui/mirror/runtime/application-host-focus-control-binding.js +111 -0
  509. package/packages/daemon/dist/tui/mirror/runtime/application-host-focus-control-capability.js +25 -0
  510. package/packages/daemon/dist/tui/mirror/runtime/application-host-focus-presentation.js +129 -0
  511. package/packages/daemon/dist/tui/mirror/runtime/application-host-focus-test-control.js +242 -0
  512. package/packages/daemon/dist/tui/mirror/runtime/application-input-readiness.js +20 -0
  513. package/packages/daemon/dist/tui/mirror/runtime/application-lifecycle.js +297 -0
  514. package/packages/daemon/dist/tui/mirror/runtime/application-machine-authority.js +289 -0
  515. package/packages/daemon/dist/tui/mirror/runtime/application-machine-catalog.js +223 -0
  516. package/packages/daemon/dist/tui/mirror/runtime/application-machine-navigation.js +133 -0
  517. package/packages/daemon/dist/tui/mirror/runtime/application-machine-sidebar.jsx +156 -0
  518. package/packages/daemon/dist/tui/mirror/runtime/application-machine-startup.js +35 -0
  519. package/packages/daemon/dist/tui/mirror/runtime/application-optional-features.js +12 -0
  520. package/packages/daemon/dist/tui/mirror/runtime/application-palette-command-owner.js +132 -0
  521. package/packages/daemon/dist/tui/mirror/runtime/application-palette-input.js +69 -0
  522. package/packages/daemon/dist/tui/mirror/runtime/application-palette-search-owner.js +67 -0
  523. package/packages/daemon/dist/tui/mirror/runtime/application-pane-activity-owner.js +61 -0
  524. package/packages/daemon/dist/tui/mirror/runtime/application-pane-menu-owner.js +82 -0
  525. package/packages/daemon/dist/tui/mirror/runtime/application-pane-rename-input.js +41 -0
  526. package/packages/daemon/dist/tui/mirror/runtime/application-pane-rename-owner.js +46 -0
  527. package/packages/daemon/dist/tui/mirror/runtime/application-pending-terminal-input.js +74 -0
  528. package/packages/daemon/dist/tui/mirror/runtime/application-performance-log.js +126 -0
  529. package/packages/daemon/dist/tui/mirror/runtime/application-post-render-runtime.js +117 -0
  530. package/packages/daemon/dist/tui/mirror/runtime/application-root-configuration.js +21 -0
  531. package/packages/daemon/dist/tui/mirror/runtime/application-root-renderer.js +160 -0
  532. package/packages/daemon/dist/tui/mirror/runtime/application-session-focus-owner.js +65 -0
  533. package/packages/daemon/dist/tui/mirror/runtime/application-shell-binding.js +313 -0
  534. package/packages/daemon/dist/tui/mirror/runtime/application-shell-home.jsx +113 -0
  535. package/packages/daemon/dist/tui/mirror/runtime/application-shell-viewport.js +14 -0
  536. package/packages/daemon/dist/tui/mirror/runtime/application-terminal-frame-readiness-owner.js +20 -0
  537. package/packages/daemon/dist/tui/mirror/runtime/application-terminal-host-focus-owner.js +25 -0
  538. package/packages/daemon/dist/tui/mirror/runtime/application-terminal-input-ingress.js +102 -0
  539. package/packages/daemon/dist/tui/mirror/runtime/application-terminal-interaction-controller.js +1360 -0
  540. package/packages/daemon/dist/tui/mirror/runtime/application-terminal-palette-owner.js +217 -0
  541. package/packages/daemon/dist/tui/mirror/runtime/application-terminal-paste.js +22 -0
  542. package/packages/daemon/dist/tui/mirror/runtime/application-terminal-renderer-sources.js +31 -0
  543. package/packages/daemon/dist/tui/mirror/runtime/application-terminal-selection-owner.js +217 -0
  544. package/packages/daemon/dist/tui/mirror/runtime/application-terminal-workspace-policy.js +193 -0
  545. package/packages/daemon/dist/tui/mirror/runtime/application-terminal-workspace.jsx +1286 -0
  546. package/packages/daemon/dist/tui/mirror/runtime/application-theme-repaint.js +34 -0
  547. package/packages/daemon/dist/tui/mirror/runtime/application-transient-note-owner.js +29 -0
  548. package/packages/daemon/dist/tui/mirror/runtime/bounded-performance-record-writer.js +67 -0
  549. package/packages/daemon/dist/tui/mirror/runtime/causal-cell-client-ledger.js +281 -0
  550. package/packages/daemon/dist/tui/mirror/runtime/causal-cell-input-fixture.js +43 -0
  551. package/packages/daemon/dist/tui/mirror/runtime/changes-deferred-identity.js +17 -0
  552. package/packages/daemon/dist/tui/mirror/runtime/daemon-authority-rebind.js +128 -0
  553. package/packages/daemon/dist/tui/mirror/runtime/deferred-intent-queue.js +40 -0
  554. package/packages/daemon/dist/tui/mirror/runtime/editor-primitives.js +39 -0
  555. package/packages/daemon/dist/tui/mirror/runtime/file-content-primitives.js +9 -0
  556. package/packages/daemon/dist/tui/mirror/runtime/fleet-lifecycle-client.js +30 -0
  557. package/packages/daemon/dist/tui/mirror/runtime/focus-framebuffer-projection.js +53 -0
  558. package/packages/daemon/dist/tui/mirror/runtime/generation-bound-slot.js +23 -0
  559. package/packages/daemon/dist/tui/mirror/runtime/host-local-tmux-adapter.js +203 -0
  560. package/packages/daemon/dist/tui/mirror/runtime/hosted-tty-size-bridge.js +166 -0
  561. package/packages/daemon/dist/tui/mirror/runtime/latest-intent-fence.js +14 -0
  562. package/packages/daemon/dist/tui/mirror/runtime/local-view-controller.js +58 -0
  563. package/packages/daemon/dist/tui/mirror/runtime/modal-admission-coordinator.js +118 -0
  564. package/packages/daemon/dist/tui/mirror/runtime/modal-pointer-capture.js +12 -0
  565. package/packages/daemon/dist/tui/mirror/runtime/open-tui-generation-host.js +833 -0
  566. package/packages/daemon/dist/tui/mirror/runtime/open-tui-session-owner.js +178 -0
  567. package/packages/daemon/dist/tui/mirror/runtime/optional-feature-registry.js +178 -0
  568. package/packages/daemon/dist/tui/mirror/runtime/optional-feature-registry.typecheck.js +1 -0
  569. package/packages/daemon/dist/tui/mirror/runtime/palette-production-controller.js +126 -0
  570. package/packages/daemon/dist/tui/mirror/runtime/pane-resize-geometry.js +17 -0
  571. package/packages/daemon/dist/tui/mirror/runtime/pane-scoped-terminal-surface.jsx +67 -0
  572. package/packages/daemon/dist/tui/mirror/runtime/product-surface-policy.js +12 -0
  573. package/packages/daemon/dist/tui/mirror/runtime/renderer-cadence.js +7 -0
  574. package/packages/daemon/dist/tui/mirror/runtime/renderer-frame-optimizer.js +88 -0
  575. package/packages/daemon/dist/tui/mirror/runtime/renderer-output-transport.js +56 -0
  576. package/packages/daemon/dist/tui/mirror/runtime/resize-terminal-pane.js +91 -0
  577. package/packages/daemon/dist/tui/mirror/runtime/rich-preview-demand.js +14 -0
  578. package/packages/daemon/dist/tui/mirror/runtime/runtime-layout-presentation.js +111 -0
  579. package/packages/daemon/dist/tui/mirror/runtime/select-terminal-pane.js +90 -0
  580. package/packages/daemon/dist/tui/mirror/runtime/semantic-pane-publication.js +14 -0
  581. package/packages/daemon/dist/tui/mirror/runtime/semantic-shell-viewport-resize.js +56 -0
  582. package/packages/daemon/dist/tui/mirror/runtime/terminal-copy-cursor.js +122 -0
  583. package/packages/daemon/dist/tui/mirror/runtime/terminal-copy-selection.js +65 -0
  584. package/packages/daemon/dist/tui/mirror/runtime/terminal-dimensions-owner.js +9 -0
  585. package/packages/daemon/dist/tui/mirror/runtime/terminal-fast-lane-renderer-adapter.js +901 -0
  586. package/packages/daemon/dist/tui/mirror/runtime/terminal-frame-readiness.js +84 -0
  587. package/packages/daemon/dist/tui/mirror/runtime/terminal-host-focus.js +347 -0
  588. package/packages/daemon/dist/tui/mirror/runtime/terminal-host-frame-diagnostics.js +37 -0
  589. package/packages/daemon/dist/tui/mirror/runtime/terminal-input-adapter.js +50 -0
  590. package/packages/daemon/dist/tui/mirror/runtime/terminal-layout-projection.js +105 -0
  591. package/packages/daemon/dist/tui/mirror/runtime/terminal-link-opener.js +23 -0
  592. package/packages/daemon/dist/tui/mirror/runtime/terminal-links.js +81 -0
  593. package/packages/daemon/dist/tui/mirror/runtime/terminal-pane-input-router.js +83 -0
  594. package/packages/daemon/dist/tui/mirror/runtime/terminal-row-projection-cache.js +88 -0
  595. package/packages/daemon/dist/tui/mirror/runtime/terminal-selection-units.js +123 -0
  596. package/packages/daemon/dist/tui/mirror/runtime/terminal-selection.js +202 -0
  597. package/packages/daemon/dist/tui/mirror/runtime/terminal-session-handoff.js +89 -0
  598. package/packages/daemon/dist/tui/mirror/runtime/terminal-tool-readiness.js +64 -0
  599. package/packages/daemon/dist/tui/mirror/runtime/tool-resource-controller.js +636 -0
  600. package/packages/daemon/dist/tui/mirror/runtime/tool-resource-projection.js +169 -0
  601. package/packages/daemon/dist/tui/mirror/runtime/viewport-fit-coordinator.js +7 -0
  602. package/packages/daemon/dist/tui/mirror/runtime/workspace-terminal-fast-lane.js +498 -0
  603. package/packages/daemon/dist/tui/mirror/scrollbar-model.js +64 -0
  604. package/packages/daemon/dist/tui/mirror/search-model.js +62 -0
  605. package/packages/daemon/dist/tui/mirror/selection.js +264 -0
  606. package/packages/daemon/dist/tui/mirror/semantic-pane-render-source.js +581 -0
  607. package/packages/daemon/dist/tui/mirror/semantic-session-view.js +269 -0
  608. package/packages/daemon/dist/tui/mirror/settings-model.js +304 -0
  609. package/packages/daemon/dist/tui/mirror/shell-chrome.js +313 -0
  610. package/packages/daemon/dist/tui/mirror/size-truth.js +104 -0
  611. package/packages/daemon/dist/tui/mirror/spans.js +31 -0
  612. package/packages/daemon/dist/tui/mirror/status-grammar.js +29 -0
  613. package/packages/daemon/dist/tui/mirror/terminal-native-reflow.js +1 -0
  614. package/packages/daemon/dist/tui/mirror/terminal-retained-row.js +10 -0
  615. package/packages/daemon/dist/tui/mirror/terminal-surface.js +92 -0
  616. package/packages/daemon/dist/tui/mirror/terminal-text.js +52 -0
  617. package/packages/daemon/dist/tui/mirror/terminal-viewport.js +436 -0
  618. package/packages/daemon/dist/tui/mirror/theme.js +765 -0
  619. package/packages/daemon/dist/tui/mirror/ui/agent-badge.jsx +14 -0
  620. package/packages/daemon/dist/tui/mirror/ui/badge.jsx +15 -0
  621. package/packages/daemon/dist/tui/mirror/ui/button.jsx +66 -0
  622. package/packages/daemon/dist/tui/mirror/ui/dialog.jsx +8 -0
  623. package/packages/daemon/dist/tui/mirror/ui/index.js +16 -0
  624. package/packages/daemon/dist/tui/mirror/ui/key-hint.jsx +39 -0
  625. package/packages/daemon/dist/tui/mirror/ui/keyboard-router.jsx +46 -0
  626. package/packages/daemon/dist/tui/mirror/ui/menu.jsx +24 -0
  627. package/packages/daemon/dist/tui/mirror/ui/navigation-row.jsx +62 -0
  628. package/packages/daemon/dist/tui/mirror/ui/overlay-frame.jsx +54 -0
  629. package/packages/daemon/dist/tui/mirror/ui/overlay-host.jsx +33 -0
  630. package/packages/daemon/dist/tui/mirror/ui/overlay-list-row.jsx +29 -0
  631. package/packages/daemon/dist/tui/mirror/ui/overlay-model.js +45 -0
  632. package/packages/daemon/dist/tui/mirror/ui/state.js +171 -0
  633. package/packages/daemon/dist/tui/mirror/ui/status-bar.jsx +102 -0
  634. package/packages/daemon/dist/tui/mirror/ui/surface.jsx +45 -0
  635. package/packages/daemon/dist/tui/mirror/ui/tabs.jsx +88 -0
  636. package/packages/daemon/dist/tui/mirror/widget-fallback.js +52 -0
  637. package/packages/daemon/dist/tui/mirror/widget-surface-model.js +145 -0
  638. package/packages/daemon/dist/tui/mirror/widget-surface.jsx +31 -0
  639. package/packages/daemon/dist/tui/mirror/workspace/agent-terminal-canvas.js +77 -0
  640. package/packages/daemon/dist/tui/mirror/workspace/application-command-description.js +44 -0
  641. package/packages/daemon/dist/tui/mirror/workspace/application-root-controller.js +99 -0
  642. package/packages/daemon/dist/tui/mirror/workspace/application-shell-controller.js +292 -0
  643. package/packages/daemon/dist/tui/mirror/workspace/application-shell-surface-commands.js +28 -0
  644. package/packages/daemon/dist/tui/mirror/workspace/application-shell.js +97 -0
  645. package/packages/daemon/dist/tui/mirror/workspace/command-palette-surface-view.jsx +158 -0
  646. package/packages/daemon/dist/tui/mirror/workspace/command-palette-surface.js +353 -0
  647. package/packages/daemon/dist/tui/mirror/workspace/connection-feedback.js +99 -0
  648. package/packages/daemon/dist/tui/mirror/workspace/icons.js +43 -0
  649. package/packages/daemon/dist/tui/mirror/workspace/pane-action-menu-model.js +8 -0
  650. package/packages/daemon/dist/tui/mirror/workspace/pane-action-menu.jsx +15 -0
  651. package/packages/daemon/dist/tui/mirror/workspace/pane-frame.js +452 -0
  652. package/packages/daemon/dist/tui/mirror/workspace/terminal-pane-chrome.js +555 -0
  653. package/packages/daemon/dist/tui/mirror/workspace/terminal-pane-header.jsx +159 -0
  654. package/packages/daemon/dist/tui/mirror/workspace/terminal-scrollback.js +179 -0
  655. package/packages/daemon/dist/tui/mirror/workspace/terminal-window-strip.jsx +253 -0
  656. package/packages/daemon/dist/tui/mirror/workspace/text.js +27 -0
  657. package/packages/daemon/dist/tui/mirror/workspace/workbench-controller.js +34 -0
  658. package/packages/daemon/dist/tui/mirror/workspace/workbench-shell.js +286 -0
  659. package/packages/daemon/dist/tui/mirror/workspace-ui-state.js +885 -0
  660. package/packages/daemon/dist/tui/readiness.js +34 -0
  661. package/packages/daemon/dist/tui/team/entry.js +20 -0
  662. package/packages/daemon/dist/tui/team/fuzzy.js +141 -0
  663. package/packages/daemon/dist/tui/team/home.js +115 -0
  664. package/packages/daemon/dist/tui/team/input.js +21 -0
  665. package/packages/daemon/dist/tui/team/keymap.js +99 -0
  666. package/packages/daemon/dist/tui/team/mouse.js +17 -0
  667. package/packages/daemon/dist/tui/team/nav.js +33 -0
  668. package/packages/daemon/dist/tui/team/preview.js +35 -0
  669. package/packages/daemon/dist/tui/team/projects.js +159 -0
  670. package/packages/daemon/dist/tui/team/report.js +37 -0
  671. package/packages/daemon/dist/tui/team/sessions.js +292 -0
  672. package/packages/daemon/dist/tui/team/tree.js +42 -0
  673. package/packages/daemon/dist/tui/team/wait-receipts.js +153 -0
  674. package/packages/daemon/dist/tui/team/wait.js +90 -0
  675. package/packages/daemon/dist/validate.js +16 -10
  676. package/packages/daemon/dist/widgets/lib/watcher.js +5 -92
  677. package/packages/daemon/dist/widgets/resolve.js +12 -9
  678. package/packages/daemon/dist/widgets/setup/setup-model.js +7 -9
  679. package/packages/daemon/src/attach.ts +2 -2
  680. package/packages/daemon/src/canonical.ts +19 -2
  681. package/packages/daemon/src/cli.ts +39 -37
  682. package/packages/daemon/src/command-center/actions/command-definitions.ts +91 -0
  683. package/packages/daemon/src/command-center/actions/dispatcher.ts +291 -10
  684. package/packages/daemon/src/command-center/actions/errors.ts +40 -0
  685. package/packages/daemon/src/command-center/actions/handlers/_project-context.ts +4 -5
  686. package/packages/daemon/src/command-center/actions/handlers/app-set-remote-access.ts +9 -1
  687. package/packages/daemon/src/command-center/actions/handlers/app-window-mutate.ts +54 -0
  688. package/packages/daemon/src/command-center/actions/handlers/config-actions.ts +59 -29
  689. package/packages/daemon/src/command-center/actions/handlers/daemon-shutdown.ts +12 -0
  690. package/packages/daemon/src/command-center/actions/handlers/fleet-lifecycle.ts +104 -0
  691. package/packages/daemon/src/command-center/actions/handlers/project-launch.ts +20 -4
  692. package/packages/daemon/src/command-center/actions/handlers/workspace-multiplexer.ts +96 -0
  693. package/packages/daemon/src/command-center/actions/handlers/workspace-open.ts +141 -0
  694. package/packages/daemon/src/command-center/actions/handlers/workspace-pane-create.ts +48 -0
  695. package/packages/daemon/src/command-center/actions/handlers/workspace-promote.ts +48 -0
  696. package/packages/daemon/src/command-center/actions/registry.ts +200 -1
  697. package/packages/daemon/src/command-center/actions/semantic-multiplexer-actions.ts +26 -0
  698. package/packages/daemon/src/command-center/agent-status-watch.ts +222 -0
  699. package/packages/daemon/src/command-center/daemon-fleet-facts-observer.ts +465 -0
  700. package/packages/daemon/src/command-center/discovery.ts +310 -5
  701. package/packages/daemon/src/command-center/owner-authority.ts +118 -0
  702. package/packages/daemon/src/command-center/pane-stream-issue.ts +247 -0
  703. package/packages/daemon/src/command-center/resources/agent-graph-overlay.ts +270 -0
  704. package/packages/daemon/src/command-center/resources/application-shell.ts +909 -0
  705. package/packages/daemon/src/command-center/resources/desktop-missions.ts +171 -0
  706. package/packages/daemon/src/command-center/resources/fleet-catalog.ts +200 -0
  707. package/packages/daemon/src/command-center/resources/fleet-resource-route.ts +69 -0
  708. package/packages/daemon/src/command-center/resources/startup-readiness-route.ts +172 -0
  709. package/packages/daemon/src/command-center/resources/startup-readiness.ts +250 -0
  710. package/packages/daemon/src/command-center/resources/terminal-native-backing-route.ts +87 -0
  711. package/packages/daemon/src/command-center/resources/terminal-runtime-inventory.ts +45 -0
  712. package/packages/daemon/src/command-center/resources/workspace-changes-authority.ts +594 -0
  713. package/packages/daemon/src/command-center/resources/workspace-changes-git.ts +278 -0
  714. package/packages/daemon/src/command-center/resources/workspace-files-authority.ts +583 -0
  715. package/packages/daemon/src/command-center/resources/workspace-missions-route.ts +125 -0
  716. package/packages/daemon/src/command-center/resources/workspace-resource-ids.ts +81 -0
  717. package/packages/daemon/src/command-center/resources/workspace-resource-routes.ts +147 -0
  718. package/packages/daemon/src/command-center/server.ts +732 -59
  719. package/packages/daemon/src/command-center/terminal-attachment-issue.ts +257 -0
  720. package/packages/daemon/src/command-center/workspace-resource-observer.ts +560 -0
  721. package/packages/daemon/src/command-center/ws-events.ts +853 -66
  722. package/packages/daemon/src/config.ts +35 -25
  723. package/packages/daemon/src/control/client.ts +128 -0
  724. package/packages/daemon/src/control/dispatch.ts +107 -0
  725. package/packages/daemon/src/control/fanout.ts +44 -0
  726. package/packages/daemon/src/control/frames.ts +40 -0
  727. package/packages/daemon/src/control/lifecycle.ts +163 -0
  728. package/packages/daemon/src/control/server.ts +237 -0
  729. package/packages/daemon/src/control/verbs.ts +118 -0
  730. package/packages/daemon/src/detect.ts +25 -20
  731. package/packages/daemon/src/doctor.ts +137 -35
  732. package/packages/daemon/src/index.ts +244 -2
  733. package/packages/daemon/src/init.ts +23 -22
  734. package/packages/daemon/src/inspect.ts +41 -8
  735. package/packages/daemon/src/launch.ts +56 -28
  736. package/packages/daemon/src/lib/agent-discovery.ts +53 -13
  737. package/packages/daemon/src/lib/agent-kind.ts +23 -0
  738. package/packages/daemon/src/lib/app-config.ts +146 -9
  739. package/packages/daemon/src/lib/app-window-kernel.ts +777 -0
  740. package/packages/daemon/src/lib/app-window-mutation.ts +178 -0
  741. package/packages/daemon/src/lib/app-window-repository.ts +650 -0
  742. package/packages/daemon/src/lib/app-window-state.ts +599 -0
  743. package/packages/daemon/src/lib/application-shell-app-windows.ts +357 -0
  744. package/packages/daemon/src/lib/auth/middleware.ts +9 -3
  745. package/packages/daemon/src/lib/bundled-tmux.ts +100 -0
  746. package/packages/daemon/src/lib/canonical-daemon-bootstrap.ts +392 -0
  747. package/packages/daemon/src/lib/canonical-daemon.ts +695 -73
  748. package/packages/daemon/src/lib/chrome-front-door.ts +17 -0
  749. package/packages/daemon/src/lib/cli-action-bridge.ts +127 -91
  750. package/packages/daemon/src/lib/command-registry.ts +152 -0
  751. package/packages/daemon/src/lib/config-context.ts +61 -0
  752. package/packages/daemon/src/lib/daemon-embed.ts +1373 -390
  753. package/packages/daemon/src/lib/daemon-session-monitor.ts +274 -0
  754. package/packages/daemon/src/lib/daemon.ts +3 -46
  755. package/packages/daemon/src/lib/directory-watcher.ts +166 -0
  756. package/packages/daemon/src/lib/embedded-daemon-lifecycle.ts +106 -0
  757. package/packages/daemon/src/lib/environment-identity.ts +82 -0
  758. package/packages/daemon/src/lib/errors.ts +7 -1
  759. package/packages/daemon/src/lib/fleet-agent-lifecycle.ts +74 -0
  760. package/packages/daemon/src/lib/fleet-lifecycle-authority.ts +535 -0
  761. package/packages/daemon/src/lib/headless-daemon.ts +459 -0
  762. package/packages/daemon/src/lib/launch-plan.ts +123 -4
  763. package/packages/daemon/src/lib/legacy-config-adapter.ts +28 -0
  764. package/packages/daemon/src/lib/legacy-config-migration.ts +145 -0
  765. package/packages/daemon/src/lib/legacy-theme-compat.ts +40 -0
  766. package/packages/daemon/src/lib/manifest-pack.ts +255 -0
  767. package/packages/daemon/src/lib/mission-projections.ts +775 -0
  768. package/packages/daemon/src/lib/mission-repository.ts +1311 -0
  769. package/packages/daemon/src/lib/onboarding-marker.ts +51 -0
  770. package/packages/daemon/src/lib/pane-chrome.ts +14 -0
  771. package/packages/daemon/src/lib/pane-source-credentials.ts +200 -0
  772. package/packages/daemon/src/lib/pane-widget.ts +182 -0
  773. package/packages/daemon/src/lib/project-inspect.ts +4 -0
  774. package/packages/daemon/src/lib/project-onboard.ts +19 -24
  775. package/packages/daemon/src/lib/project-probe.ts +38 -30
  776. package/packages/daemon/src/lib/project-readiness-probe.ts +578 -0
  777. package/packages/daemon/src/lib/project-readiness.ts +1034 -0
  778. package/packages/daemon/src/lib/project-registry.ts +45 -9
  779. package/packages/daemon/src/lib/project-resolver.ts +350 -0
  780. package/packages/daemon/src/lib/project-runtime-errors.ts +41 -0
  781. package/packages/daemon/src/lib/project-runtime-repository.ts +1194 -0
  782. package/packages/daemon/src/lib/remote-daemon-info.ts +42 -0
  783. package/packages/daemon/src/lib/resolved-config.ts +425 -0
  784. package/packages/daemon/src/lib/runtime-namespace.ts +186 -0
  785. package/packages/daemon/src/lib/saved-machines.ts +63 -0
  786. package/packages/daemon/src/lib/semantic-resource-id.ts +17 -0
  787. package/packages/daemon/src/lib/session-monitor.ts +28 -20
  788. package/packages/daemon/src/lib/session-options.ts +3 -10
  789. package/packages/daemon/src/lib/ssh-daemon-transport.ts +303 -0
  790. package/packages/daemon/src/lib/state-home.ts +12 -0
  791. package/packages/daemon/src/lib/theme-mode.ts +11 -0
  792. package/packages/daemon/src/lib/tmux-authority-replacement.ts +119 -0
  793. package/packages/daemon/src/lib/tmux-external-interaction-observer.ts +632 -0
  794. package/packages/daemon/src/lib/tmux-interaction-options.ts +171 -0
  795. package/packages/daemon/src/lib/tmux-named-socket-fence.ts +66 -0
  796. package/packages/daemon/src/lib/tmux-terminal-color.ts +44 -0
  797. package/packages/daemon/src/lib/tui-binary.ts +354 -34
  798. package/packages/daemon/src/lib/unix-socket-authority.ts +65 -0
  799. package/packages/daemon/src/lib/update-check.ts +5 -0
  800. package/packages/daemon/src/lib/widget-asset-policy.ts +3 -0
  801. package/packages/daemon/src/lib/widget-asset-store.ts +218 -0
  802. package/packages/daemon/src/lib/workspace-config-loader.ts +378 -0
  803. package/packages/daemon/src/lib/workspace-multiplexer-verbs.ts +1362 -0
  804. package/packages/daemon/src/lib/workspace-open-handoff.ts +340 -0
  805. package/packages/daemon/src/lib/workspace-open.ts +983 -0
  806. package/packages/daemon/src/lib/workspace-pane-creation.ts +1434 -0
  807. package/packages/daemon/src/lib/workspace-promotion.ts +1035 -0
  808. package/packages/daemon/src/lib/workspace-registry.ts +193 -25
  809. package/packages/daemon/src/lib/workspace-state-repository.ts +1204 -0
  810. package/packages/daemon/src/lib/workspace-state.ts +960 -0
  811. package/packages/daemon/src/lib/yaml-io.ts +8 -17
  812. package/packages/daemon/src/migrate.ts +134 -0
  813. package/packages/daemon/src/restart.ts +2 -2
  814. package/packages/daemon/src/restore.ts +67 -24
  815. package/packages/daemon/src/schemas/inspect.ts +9 -1
  816. package/packages/daemon/src/schemas/registry.ts +12 -22
  817. package/packages/daemon/src/schemas/ws-events.ts +14 -131
  818. package/packages/daemon/src/send.ts +191 -22
  819. package/packages/daemon/src/server/README.md +1 -1
  820. package/packages/daemon/src/server/index.ts +6 -2
  821. package/packages/daemon/src/server/pane-stream-upgrade.ts +141 -0
  822. package/packages/daemon/src/server/terminal-attachment-upgrade.ts +153 -0
  823. package/packages/daemon/src/status.ts +13 -8
  824. package/packages/daemon/src/stop.ts +2 -2
  825. package/packages/daemon/src/terminal/MonotonicPtyInput.ts +153 -0
  826. package/packages/daemon/src/terminal/NodePtyAdapter.ts +53 -11
  827. package/packages/daemon/src/terminal/PtyAdapter.ts +111 -3
  828. package/packages/daemon/src/terminal/README.md +34 -16
  829. package/packages/daemon/src/terminal/attachments/admission-util.ts +97 -0
  830. package/packages/daemon/src/terminal/attachments/agent-status-probe.ts +474 -0
  831. package/packages/daemon/src/terminal/attachments/direct-websocket.ts +1482 -0
  832. package/packages/daemon/src/terminal/attachments/grouped-tmux.ts +293 -0
  833. package/packages/daemon/src/terminal/attachments/lease-manager.ts +1042 -0
  834. package/packages/daemon/src/terminal/attachments/native-runtime.ts +2246 -0
  835. package/packages/daemon/src/terminal/attachments/pty-tmux-attachment-launcher.ts +750 -0
  836. package/packages/daemon/src/terminal/attachments/semantic-pane-catalog.ts +365 -0
  837. package/packages/daemon/src/terminal/attachments/tmux-view-executor.ts +1095 -0
  838. package/packages/daemon/src/terminal/mirror/control-channel.ts +1003 -0
  839. package/packages/daemon/src/terminal/mirror/control-mode-ownership.ts +34 -0
  840. package/packages/daemon/src/terminal/mirror/events.ts +159 -0
  841. package/packages/daemon/src/terminal/mirror/flow-ledger.ts +65 -0
  842. package/packages/daemon/src/terminal/mirror/mirror-service.ts +501 -0
  843. package/packages/daemon/src/terminal/mirror/native-frozen-grid.ts +152 -0
  844. package/packages/daemon/src/terminal/mirror/native-grid-capture.ts +182 -0
  845. package/packages/daemon/src/terminal/mirror/native-grid-projection.ts +125 -0
  846. package/packages/daemon/src/terminal/mirror/native-grid-reader.ts +109 -0
  847. package/packages/daemon/src/terminal/mirror/native-grid-reflow.ts +217 -0
  848. package/packages/daemon/src/terminal/mirror/pane-feed.ts +258 -0
  849. package/packages/daemon/src/terminal/mirror/session-channel.ts +3253 -0
  850. package/packages/daemon/src/terminal/mirror/trusted-inventory.ts +29 -0
  851. package/packages/daemon/src/terminal/pane-stream/lease-manager.ts +375 -0
  852. package/packages/daemon/src/terminal/pane-stream/pane-stream-websocket.ts +2625 -0
  853. package/packages/daemon/src/terminal/pane-stream/runtime.ts +78 -0
  854. package/packages/daemon/src/terminal/pane-stream/wire-ledger.ts +155 -0
  855. package/packages/daemon/src/terminal/protocol/README.md +14 -0
  856. package/packages/daemon/src/terminal/protocol/chunk-bytes.ts +20 -0
  857. package/packages/daemon/src/terminal/protocol/control.ts +130 -0
  858. package/packages/daemon/src/terminal/protocol/input-coalescer.ts +131 -0
  859. package/packages/daemon/src/terminal/protocol/layout-parse.ts +154 -0
  860. package/packages/daemon/src/terminal/protocol/native-backing-client.ts +65 -0
  861. package/packages/daemon/src/terminal/protocol/pane-display-name.ts +192 -0
  862. package/packages/daemon/src/terminal/protocol/session-descriptor-discovery.ts +382 -0
  863. package/packages/daemon/src/terminal/protocol/workspace-tmux-adapter.ts +470 -0
  864. package/packages/daemon/src/terminal/session-runtime/authority-arbiter.ts +318 -0
  865. package/packages/daemon/src/terminal/session-runtime/causal-cell-ledger.ts +359 -0
  866. package/packages/daemon/src/terminal/session-runtime/interaction-receipt-facts.ts +173 -0
  867. package/packages/daemon/src/terminal/session-runtime/multiplexer-backend.ts +194 -0
  868. package/packages/daemon/src/terminal/session-runtime/registry.ts +2074 -0
  869. package/packages/daemon/src/terminal/session-runtime/runtime-observability.ts +267 -0
  870. package/packages/daemon/src/terminal/session-runtime/runtime-scheduler.ts +22 -0
  871. package/packages/daemon/src/terminal/session-runtime/runtime-trace-correlator.ts +58 -0
  872. package/packages/daemon/src/terminal/session-runtime/semantic-mutation-executor.ts +555 -0
  873. package/packages/daemon/src/terminal/session-runtime/semantic-mutation-resource-changes.ts +48 -0
  874. package/packages/daemon/src/terminal/session-runtime/terminal-delivery-hub.ts +1853 -0
  875. package/packages/daemon/src/terminal/session-runtime/terminal-delivery-observation-identity.ts +18 -0
  876. package/packages/daemon/src/terminal/session-runtime/terminal-interpreter-backend.ts +74 -0
  877. package/packages/daemon/src/terminal/session-runtime/terminal-replica-interpreter.ts +738 -0
  878. package/packages/daemon/src/terminal/session-runtime/terminal-replica-owner.ts +681 -0
  879. package/packages/daemon/src/terminal/session-runtime/terminal-replica-shadow-projections.ts +36 -0
  880. package/packages/daemon/src/terminal/session-runtime/transport-binding.ts +682 -0
  881. package/packages/daemon/src/terminal/session-runtime/xterm-headless-provenance.json +51 -0
  882. package/packages/daemon/src/terminal/session-runtime/xterm-terminal-interpreter-backend.ts +556 -0
  883. package/packages/daemon/src/tui/async-disposable-slot.ts +60 -0
  884. package/packages/daemon/src/tui/chrome/events.ts +4 -4
  885. package/packages/daemon/src/tui/chrome/front-door.ts +27 -0
  886. package/packages/daemon/src/tui/chrome/notify-prefs.ts +58 -0
  887. package/packages/daemon/src/tui/chrome/notify-state.ts +76 -0
  888. package/packages/daemon/src/tui/chrome/notify.ts +582 -84
  889. package/packages/daemon/src/tui/chrome/sidebar.ts +11 -5
  890. package/packages/daemon/src/tui/chrome/statusline.ts +15 -6
  891. package/packages/daemon/src/tui/chrome/updater.ts +367 -64
  892. package/packages/daemon/src/tui/compiled.ts +132 -6
  893. package/packages/daemon/src/tui/detect/agent-resolution.ts +85 -0
  894. package/packages/daemon/src/tui/detect/classify.ts +34 -0
  895. package/packages/daemon/src/tui/detect/manifest-loader.ts +54 -5
  896. package/packages/daemon/src/tui/detect/manifest.ts +24 -3
  897. package/packages/daemon/src/tui/detect/manifests.ts +240 -6
  898. package/packages/daemon/src/tui/detect/process-tree.ts +30 -4
  899. package/packages/daemon/src/tui/detect/session-id.ts +503 -0
  900. package/packages/daemon/src/tui/detect/snapshot.ts +38 -3
  901. package/packages/daemon/src/tui/integrations/claude.ts +1 -0
  902. package/packages/daemon/src/tui/integrations/opencode.ts +121 -0
  903. package/packages/daemon/src/tui/main.ts +56 -0
  904. package/packages/daemon/src/tui/mirror/RECIPES.md +59 -0
  905. package/packages/daemon/src/tui/mirror/SHELL_CHROME.md +39 -0
  906. package/packages/daemon/src/tui/mirror/THEME.md +48 -0
  907. package/packages/daemon/src/tui/mirror/__snapshots__/activity-surface-renderer.test.tsx.snap +42 -0
  908. package/packages/daemon/src/tui/mirror/__snapshots__/changes-terminal-surface-renderer.test.tsx.snap +267 -0
  909. package/packages/daemon/src/tui/mirror/__snapshots__/home-files-surface-renderer.test.tsx.snap +267 -0
  910. package/packages/daemon/src/tui/mirror/__snapshots__/missions-surface-renderer.test.tsx.snap +134 -0
  911. package/packages/daemon/src/tui/mirror/__snapshots__/recipes-gallery-renderer.test.tsx.snap +141 -0
  912. package/packages/daemon/src/tui/mirror/__snapshots__/shell-chrome-renderer.test.tsx.snap +134 -0
  913. package/packages/daemon/src/tui/mirror/activity-surface-view.tsx +169 -0
  914. package/packages/daemon/src/tui/mirror/activity-surface.ts +430 -0
  915. package/packages/daemon/src/tui/mirror/agent-chip.ts +40 -11
  916. package/packages/daemon/src/tui/mirror/agent-lifecycle.ts +468 -0
  917. package/packages/daemon/src/tui/mirror/agent-provisioning-executor.ts +175 -0
  918. package/packages/daemon/src/tui/mirror/agent-rows.ts +61 -5
  919. package/packages/daemon/src/tui/mirror/ansi-palette.ts +3 -0
  920. package/packages/daemon/src/tui/mirror/app-state.ts +185 -9
  921. package/packages/daemon/src/tui/mirror/app.tsx +2 -5264
  922. package/packages/daemon/src/tui/mirror/application-keybindings.ts +54 -0
  923. package/packages/daemon/src/tui/mirror/application-shell-daemon-connection.ts +370 -0
  924. package/packages/daemon/src/tui/mirror/application-shell-daemon-session.ts +74 -0
  925. package/packages/daemon/src/tui/mirror/attention.ts +110 -0
  926. package/packages/daemon/src/tui/mirror/canonical-workspace-routing.ts +90 -0
  927. package/packages/daemon/src/tui/mirror/changes-surface-view.tsx +263 -0
  928. package/packages/daemon/src/tui/mirror/changes-surface.ts +338 -0
  929. package/packages/daemon/src/tui/mirror/composite-layout.ts +710 -0
  930. package/packages/daemon/src/tui/mirror/configless-session-bootstrap.ts +192 -0
  931. package/packages/daemon/src/tui/mirror/dialog-model.ts +2 -2
  932. package/packages/daemon/src/tui/mirror/dialog-stack-core.ts +264 -0
  933. package/packages/daemon/src/tui/mirror/dialog-stack.ts +2 -354
  934. package/packages/daemon/src/tui/mirror/diff-model.ts +279 -4
  935. package/packages/daemon/src/tui/mirror/editor-buffer.ts +9 -70
  936. package/packages/daemon/src/tui/mirror/editor-open-policy.ts +16 -0
  937. package/packages/daemon/src/tui/mirror/features/changes/contract.ts +84 -0
  938. package/packages/daemon/src/tui/mirror/features/changes/controller.ts +470 -0
  939. package/packages/daemon/src/tui/mirror/features/changes/feature.tsx +19 -0
  940. package/packages/daemon/src/tui/mirror/features/dialogs/contract.ts +64 -0
  941. package/packages/daemon/src/tui/mirror/features/dialogs/feature.tsx +227 -0
  942. package/packages/daemon/src/tui/mirror/features/dialogs/session.ts +186 -0
  943. package/packages/daemon/src/tui/mirror/features/files/feature.tsx +54 -0
  944. package/packages/daemon/src/tui/mirror/features/files/session.ts +694 -0
  945. package/packages/daemon/src/tui/mirror/features/home/feature.tsx +172 -0
  946. package/packages/daemon/src/tui/mirror/features/missions-activity/contract.ts +106 -0
  947. package/packages/daemon/src/tui/mirror/features/missions-activity/feature.tsx +19 -0
  948. package/packages/daemon/src/tui/mirror/features/missions-activity/session.ts +470 -0
  949. package/packages/daemon/src/tui/mirror/features/palette/buffer-geometry.ts +46 -0
  950. package/packages/daemon/src/tui/mirror/features/palette/contract.ts +121 -0
  951. package/packages/daemon/src/tui/mirror/features/palette/feature.ts +14 -0
  952. package/packages/daemon/src/tui/mirror/features/palette/session.ts +443 -0
  953. package/packages/daemon/src/tui/mirror/features/palette/surface.tsx +133 -0
  954. package/packages/daemon/src/tui/mirror/features/performance-hud/contract.ts +20 -0
  955. package/packages/daemon/src/tui/mirror/features/performance-hud/feature.tsx +8 -0
  956. package/packages/daemon/src/tui/mirror/features/performance-hud/session.ts +152 -0
  957. package/packages/daemon/src/tui/mirror/features/performance-hud/surface.tsx +137 -0
  958. package/packages/daemon/src/tui/mirror/features/rich-preview/asset-loader.ts +153 -0
  959. package/packages/daemon/src/tui/mirror/features/rich-preview/contract.ts +94 -0
  960. package/packages/daemon/src/tui/mirror/features/rich-preview/feature.tsx +141 -0
  961. package/packages/daemon/src/tui/mirror/features/rich-preview/session.ts +387 -0
  962. package/packages/daemon/src/tui/mirror/features/settings/catalog.ts +26 -0
  963. package/packages/daemon/src/tui/mirror/features/settings/contract.ts +41 -0
  964. package/packages/daemon/src/tui/mirror/features/settings/feature.ts +3 -0
  965. package/packages/daemon/src/tui/mirror/features/settings/session.ts +375 -0
  966. package/packages/daemon/src/tui/mirror/file-tree.ts +231 -6
  967. package/packages/daemon/src/tui/mirror/files-surface-view.tsx +242 -0
  968. package/packages/daemon/src/tui/mirror/files-surface.ts +371 -0
  969. package/packages/daemon/src/tui/mirror/focus-projection.ts +113 -0
  970. package/packages/daemon/src/tui/mirror/frame-coalescer.ts +87 -0
  971. package/packages/daemon/src/tui/mirror/home-model.ts +1 -1
  972. package/packages/daemon/src/tui/mirror/home-surface-model.ts +440 -0
  973. package/packages/daemon/src/tui/mirror/home-surface.tsx +254 -0
  974. package/packages/daemon/src/tui/mirror/host-terminal.ts +49 -0
  975. package/packages/daemon/src/tui/mirror/hosted.ts +286 -0
  976. package/packages/daemon/src/tui/mirror/input-lifecycle.ts +248 -0
  977. package/packages/daemon/src/tui/mirror/interaction-flow.ts +83 -0
  978. package/packages/daemon/src/tui/mirror/legacy/missions-workspace-loader.ts +117 -0
  979. package/packages/daemon/src/tui/mirror/menu-model.ts +28 -18
  980. package/packages/daemon/src/tui/mirror/missions-dashboard.ts +451 -0
  981. package/packages/daemon/src/tui/mirror/missions-render-fixtures.ts +371 -0
  982. package/packages/daemon/src/tui/mirror/missions-surface-controller.ts +530 -0
  983. package/packages/daemon/src/tui/mirror/missions-surface.tsx +434 -0
  984. package/packages/daemon/src/tui/mirror/missions-workspace.ts +1996 -0
  985. package/packages/daemon/src/tui/mirror/multiplexer-action-executor.ts +393 -0
  986. package/packages/daemon/src/tui/mirror/open-tui-pane-stream-socket.ts +47 -0
  987. package/packages/daemon/src/tui/mirror/open-tui-verified-routing.ts +152 -0
  988. package/packages/daemon/src/tui/mirror/open-tui-workspace-runtime-port.ts +1340 -0
  989. package/packages/daemon/src/tui/mirror/palette-surface-adapter.ts +465 -0
  990. package/packages/daemon/src/tui/mirror/palette.ts +485 -34
  991. package/packages/daemon/src/tui/mirror/pane-frame-state.ts +209 -0
  992. package/packages/daemon/src/tui/mirror/pane-mirror.ts +216 -50
  993. package/packages/daemon/src/tui/mirror/pane-surface.tsx +874 -62
  994. package/packages/daemon/src/tui/mirror/panel-host-reactive.ts +17 -0
  995. package/packages/daemon/src/tui/mirror/panel-host.ts +384 -0
  996. package/packages/daemon/src/tui/mirror/perf-tap.ts +1 -122
  997. package/packages/daemon/src/tui/mirror/performance-events.ts +488 -0
  998. package/packages/daemon/src/tui/mirror/recipe-components.tsx +310 -0
  999. package/packages/daemon/src/tui/mirror/recipes-gallery.tsx +256 -0
  1000. package/packages/daemon/src/tui/mirror/recipes.ts +543 -0
  1001. package/packages/daemon/src/tui/mirror/reference-performance-trace.ts +727 -0
  1002. package/packages/daemon/src/tui/mirror/renderer-commands.ts +344 -0
  1003. package/packages/daemon/src/tui/mirror/resize-model.ts +74 -9
  1004. package/packages/daemon/src/tui/mirror/resize-transaction.ts +342 -0
  1005. package/packages/daemon/src/tui/mirror/rich-placement-projection.ts +173 -0
  1006. package/packages/daemon/src/tui/mirror/runtime/__snapshots__/application-shell-view-renderer.test.tsx.snap +87 -0
  1007. package/packages/daemon/src/tui/mirror/runtime/application-add-machine-dialog.tsx +88 -0
  1008. package/packages/daemon/src/tui/mirror/runtime/application-appearance-owner.ts +229 -0
  1009. package/packages/daemon/src/tui/mirror/runtime/application-bootstrap.ts +118 -0
  1010. package/packages/daemon/src/tui/mirror/runtime/application-daemon-authority-owner.ts +259 -0
  1011. package/packages/daemon/src/tui/mirror/runtime/application-daemon-authority.ts +16 -0
  1012. package/packages/daemon/src/tui/mirror/runtime/application-entry.ts +226 -0
  1013. package/packages/daemon/src/tui/mirror/runtime/application-generation-starter.ts +130 -0
  1014. package/packages/daemon/src/tui/mirror/runtime/application-home-agent-navigation.ts +174 -0
  1015. package/packages/daemon/src/tui/mirror/runtime/application-home-agent-observer.ts +363 -0
  1016. package/packages/daemon/src/tui/mirror/runtime/application-home-agent-roster.tsx +276 -0
  1017. package/packages/daemon/src/tui/mirror/runtime/application-home-agent-selection.ts +99 -0
  1018. package/packages/daemon/src/tui/mirror/runtime/application-home-agent-transport.ts +232 -0
  1019. package/packages/daemon/src/tui/mirror/runtime/application-home-agents-owner.ts +295 -0
  1020. package/packages/daemon/src/tui/mirror/runtime/application-home-agents.ts +70 -0
  1021. package/packages/daemon/src/tui/mirror/runtime/application-home-catalog-owner.ts +130 -0
  1022. package/packages/daemon/src/tui/mirror/runtime/application-home-catalog.ts +451 -0
  1023. package/packages/daemon/src/tui/mirror/runtime/application-host-focus-control-binding.ts +143 -0
  1024. package/packages/daemon/src/tui/mirror/runtime/application-host-focus-control-capability.ts +46 -0
  1025. package/packages/daemon/src/tui/mirror/runtime/application-host-focus-presentation.ts +176 -0
  1026. package/packages/daemon/src/tui/mirror/runtime/application-host-focus-test-control.ts +313 -0
  1027. package/packages/daemon/src/tui/mirror/runtime/application-input-readiness.ts +28 -0
  1028. package/packages/daemon/src/tui/mirror/runtime/application-lifecycle.ts +374 -0
  1029. package/packages/daemon/src/tui/mirror/runtime/application-machine-authority.ts +337 -0
  1030. package/packages/daemon/src/tui/mirror/runtime/application-machine-catalog.ts +256 -0
  1031. package/packages/daemon/src/tui/mirror/runtime/application-machine-navigation.ts +140 -0
  1032. package/packages/daemon/src/tui/mirror/runtime/application-machine-sidebar.tsx +248 -0
  1033. package/packages/daemon/src/tui/mirror/runtime/application-machine-startup.ts +39 -0
  1034. package/packages/daemon/src/tui/mirror/runtime/application-optional-features.ts +25 -0
  1035. package/packages/daemon/src/tui/mirror/runtime/application-palette-command-owner.ts +162 -0
  1036. package/packages/daemon/src/tui/mirror/runtime/application-palette-input.ts +108 -0
  1037. package/packages/daemon/src/tui/mirror/runtime/application-palette-search-owner.ts +78 -0
  1038. package/packages/daemon/src/tui/mirror/runtime/application-pane-activity-owner.ts +79 -0
  1039. package/packages/daemon/src/tui/mirror/runtime/application-pane-menu-owner.ts +95 -0
  1040. package/packages/daemon/src/tui/mirror/runtime/application-pane-rename-input.ts +61 -0
  1041. package/packages/daemon/src/tui/mirror/runtime/application-pane-rename-owner.ts +50 -0
  1042. package/packages/daemon/src/tui/mirror/runtime/application-pending-terminal-input.ts +117 -0
  1043. package/packages/daemon/src/tui/mirror/runtime/application-performance-log.ts +166 -0
  1044. package/packages/daemon/src/tui/mirror/runtime/application-post-render-runtime.ts +163 -0
  1045. package/packages/daemon/src/tui/mirror/runtime/application-root-configuration.ts +47 -0
  1046. package/packages/daemon/src/tui/mirror/runtime/application-root-renderer.ts +165 -0
  1047. package/packages/daemon/src/tui/mirror/runtime/application-root-v2.tsx +588 -0
  1048. package/packages/daemon/src/tui/mirror/runtime/application-session-focus-owner.ts +80 -0
  1049. package/packages/daemon/src/tui/mirror/runtime/application-shell-binding.ts +375 -0
  1050. package/packages/daemon/src/tui/mirror/runtime/application-shell-catalog.tsx +448 -0
  1051. package/packages/daemon/src/tui/mirror/runtime/application-shell-home.tsx +252 -0
  1052. package/packages/daemon/src/tui/mirror/runtime/application-shell-overlay-stack.tsx +37 -0
  1053. package/packages/daemon/src/tui/mirror/runtime/application-shell-overlays.tsx +381 -0
  1054. package/packages/daemon/src/tui/mirror/runtime/application-shell-sidebar.tsx +188 -0
  1055. package/packages/daemon/src/tui/mirror/runtime/application-shell-view.tsx +531 -0
  1056. package/packages/daemon/src/tui/mirror/runtime/application-shell-viewport.ts +18 -0
  1057. package/packages/daemon/src/tui/mirror/runtime/application-terminal-frame-readiness-owner.ts +33 -0
  1058. package/packages/daemon/src/tui/mirror/runtime/application-terminal-host-focus-owner.ts +36 -0
  1059. package/packages/daemon/src/tui/mirror/runtime/application-terminal-input-ingress.ts +139 -0
  1060. package/packages/daemon/src/tui/mirror/runtime/application-terminal-interaction-controller.ts +1673 -0
  1061. package/packages/daemon/src/tui/mirror/runtime/application-terminal-palette-owner.ts +302 -0
  1062. package/packages/daemon/src/tui/mirror/runtime/application-terminal-paste.ts +33 -0
  1063. package/packages/daemon/src/tui/mirror/runtime/application-terminal-renderer-sources.ts +33 -0
  1064. package/packages/daemon/src/tui/mirror/runtime/application-terminal-selection-owner.ts +277 -0
  1065. package/packages/daemon/src/tui/mirror/runtime/application-terminal-workspace-policy.ts +311 -0
  1066. package/packages/daemon/src/tui/mirror/runtime/application-terminal-workspace.tsx +1921 -0
  1067. package/packages/daemon/src/tui/mirror/runtime/application-theme-repaint.ts +45 -0
  1068. package/packages/daemon/src/tui/mirror/runtime/application-transient-note-owner.ts +42 -0
  1069. package/packages/daemon/src/tui/mirror/runtime/bounded-performance-record-writer.ts +75 -0
  1070. package/packages/daemon/src/tui/mirror/runtime/causal-cell-client-ledger.ts +406 -0
  1071. package/packages/daemon/src/tui/mirror/runtime/causal-cell-input-fixture.ts +55 -0
  1072. package/packages/daemon/src/tui/mirror/runtime/changes-deferred-identity.ts +34 -0
  1073. package/packages/daemon/src/tui/mirror/runtime/daemon-authority-rebind.ts +163 -0
  1074. package/packages/daemon/src/tui/mirror/runtime/deferred-intent-queue.ts +45 -0
  1075. package/packages/daemon/src/tui/mirror/runtime/editor-primitives.ts +56 -0
  1076. package/packages/daemon/src/tui/mirror/runtime/file-content-primitives.ts +8 -0
  1077. package/packages/daemon/src/tui/mirror/runtime/fleet-lifecycle-client.ts +67 -0
  1078. package/packages/daemon/src/tui/mirror/runtime/focus-framebuffer-projection.ts +71 -0
  1079. package/packages/daemon/src/tui/mirror/runtime/generation-bound-slot.ts +23 -0
  1080. package/packages/daemon/src/tui/mirror/runtime/host-local-tmux-adapter.ts +233 -0
  1081. package/packages/daemon/src/tui/mirror/runtime/hosted-tty-size-bridge.ts +213 -0
  1082. package/packages/daemon/src/tui/mirror/runtime/latest-intent-fence.ts +22 -0
  1083. package/packages/daemon/src/tui/mirror/runtime/local-view-controller.ts +95 -0
  1084. package/packages/daemon/src/tui/mirror/runtime/modal-admission-coordinator.ts +158 -0
  1085. package/packages/daemon/src/tui/mirror/runtime/modal-pointer-capture.ts +23 -0
  1086. package/packages/daemon/src/tui/mirror/runtime/open-tui-generation-host.ts +1003 -0
  1087. package/packages/daemon/src/tui/mirror/runtime/open-tui-session-owner.ts +229 -0
  1088. package/packages/daemon/src/tui/mirror/runtime/optional-feature-registry.ts +234 -0
  1089. package/packages/daemon/src/tui/mirror/runtime/optional-feature-registry.typecheck.ts +14 -0
  1090. package/packages/daemon/src/tui/mirror/runtime/palette-production-controller.ts +170 -0
  1091. package/packages/daemon/src/tui/mirror/runtime/palette-production-overlay.tsx +65 -0
  1092. package/packages/daemon/src/tui/mirror/runtime/pane-resize-geometry.ts +29 -0
  1093. package/packages/daemon/src/tui/mirror/runtime/pane-scoped-terminal-surface.tsx +156 -0
  1094. package/packages/daemon/src/tui/mirror/runtime/product-surface-policy.ts +16 -0
  1095. package/packages/daemon/src/tui/mirror/runtime/renderer-cadence.ts +7 -0
  1096. package/packages/daemon/src/tui/mirror/runtime/renderer-frame-optimizer.ts +92 -0
  1097. package/packages/daemon/src/tui/mirror/runtime/renderer-output-transport.ts +57 -0
  1098. package/packages/daemon/src/tui/mirror/runtime/resize-terminal-pane.ts +134 -0
  1099. package/packages/daemon/src/tui/mirror/runtime/rich-preview-demand.ts +26 -0
  1100. package/packages/daemon/src/tui/mirror/runtime/rich-preview-overlay.tsx +54 -0
  1101. package/packages/daemon/src/tui/mirror/runtime/runtime-layout-presentation.ts +119 -0
  1102. package/packages/daemon/src/tui/mirror/runtime/select-terminal-pane.ts +127 -0
  1103. package/packages/daemon/src/tui/mirror/runtime/semantic-pane-publication.ts +26 -0
  1104. package/packages/daemon/src/tui/mirror/runtime/semantic-shell-viewport-resize.ts +88 -0
  1105. package/packages/daemon/src/tui/mirror/runtime/terminal-copy-cursor.ts +169 -0
  1106. package/packages/daemon/src/tui/mirror/runtime/terminal-copy-selection.ts +79 -0
  1107. package/packages/daemon/src/tui/mirror/runtime/terminal-dimensions-owner.ts +20 -0
  1108. package/packages/daemon/src/tui/mirror/runtime/terminal-fast-lane-renderer-adapter.ts +1065 -0
  1109. package/packages/daemon/src/tui/mirror/runtime/terminal-frame-readiness.ts +100 -0
  1110. package/packages/daemon/src/tui/mirror/runtime/terminal-host-focus.ts +519 -0
  1111. package/packages/daemon/src/tui/mirror/runtime/terminal-host-frame-diagnostics.ts +47 -0
  1112. package/packages/daemon/src/tui/mirror/runtime/terminal-input-adapter.ts +69 -0
  1113. package/packages/daemon/src/tui/mirror/runtime/terminal-layout-projection.ts +145 -0
  1114. package/packages/daemon/src/tui/mirror/runtime/terminal-link-opener.ts +30 -0
  1115. package/packages/daemon/src/tui/mirror/runtime/terminal-links.ts +97 -0
  1116. package/packages/daemon/src/tui/mirror/runtime/terminal-pane-input-router.ts +95 -0
  1117. package/packages/daemon/src/tui/mirror/runtime/terminal-row-projection-cache.ts +115 -0
  1118. package/packages/daemon/src/tui/mirror/runtime/terminal-selection-units.ts +128 -0
  1119. package/packages/daemon/src/tui/mirror/runtime/terminal-selection.ts +285 -0
  1120. package/packages/daemon/src/tui/mirror/runtime/terminal-session-handoff.ts +143 -0
  1121. package/packages/daemon/src/tui/mirror/runtime/terminal-tool-readiness.ts +72 -0
  1122. package/packages/daemon/src/tui/mirror/runtime/tool-resource-controller.ts +799 -0
  1123. package/packages/daemon/src/tui/mirror/runtime/tool-resource-projection.ts +223 -0
  1124. package/packages/daemon/src/tui/mirror/runtime/viewport-fit-coordinator.ts +12 -0
  1125. package/packages/daemon/src/tui/mirror/runtime/workspace-terminal-fast-lane.ts +597 -0
  1126. package/packages/daemon/src/tui/mirror/selection.ts +122 -29
  1127. package/packages/daemon/src/tui/mirror/semantic-pane-render-source.ts +786 -0
  1128. package/packages/daemon/src/tui/mirror/semantic-session-view.ts +366 -0
  1129. package/packages/daemon/src/tui/mirror/settings-model.ts +95 -57
  1130. package/packages/daemon/src/tui/mirror/shell-chrome-view.tsx +346 -0
  1131. package/packages/daemon/src/tui/mirror/shell-chrome.ts +509 -0
  1132. package/packages/daemon/src/tui/mirror/sidebar.tsx +321 -0
  1133. package/packages/daemon/src/tui/mirror/size-truth.ts +53 -0
  1134. package/packages/daemon/src/tui/mirror/terminal-native-reflow.ts +1 -0
  1135. package/packages/daemon/src/tui/mirror/terminal-retained-row.ts +24 -0
  1136. package/packages/daemon/src/tui/mirror/terminal-surface.ts +157 -0
  1137. package/packages/daemon/src/tui/mirror/terminal-surface.tsx +84 -0
  1138. package/packages/daemon/src/tui/mirror/terminal-text.ts +54 -0
  1139. package/packages/daemon/src/tui/mirror/terminal-viewport.ts +514 -0
  1140. package/packages/daemon/src/tui/mirror/theme.ts +1081 -0
  1141. package/packages/daemon/src/tui/mirror/ui/agent-badge.tsx +41 -0
  1142. package/packages/daemon/src/tui/mirror/ui/badge.tsx +42 -0
  1143. package/packages/daemon/src/tui/mirror/ui/button.tsx +127 -0
  1144. package/packages/daemon/src/tui/mirror/ui/dialog.tsx +45 -0
  1145. package/packages/daemon/src/tui/mirror/ui/index.ts +59 -0
  1146. package/packages/daemon/src/tui/mirror/ui/key-hint.tsx +63 -0
  1147. package/packages/daemon/src/tui/mirror/ui/keyboard-router.tsx +72 -0
  1148. package/packages/daemon/src/tui/mirror/ui/menu.tsx +86 -0
  1149. package/packages/daemon/src/tui/mirror/ui/navigation-row.tsx +114 -0
  1150. package/packages/daemon/src/tui/mirror/ui/overlay-frame.tsx +117 -0
  1151. package/packages/daemon/src/tui/mirror/ui/overlay-host.tsx +71 -0
  1152. package/packages/daemon/src/tui/mirror/ui/overlay-list-row.tsx +68 -0
  1153. package/packages/daemon/src/tui/mirror/ui/overlay-model.ts +75 -0
  1154. package/packages/daemon/src/tui/mirror/ui/state.ts +218 -0
  1155. package/packages/daemon/src/tui/mirror/ui/status-bar.tsx +208 -0
  1156. package/packages/daemon/src/tui/mirror/ui/surface.tsx +71 -0
  1157. package/packages/daemon/src/tui/mirror/ui/tabs.tsx +168 -0
  1158. package/packages/daemon/src/tui/mirror/widget-fallback.ts +66 -0
  1159. package/packages/daemon/src/tui/mirror/widget-surface-model.ts +170 -0
  1160. package/packages/daemon/src/tui/mirror/widget-surface.tsx +79 -0
  1161. package/packages/daemon/src/tui/mirror/workspace/README.md +79 -0
  1162. package/packages/daemon/src/tui/mirror/workspace/__snapshots__/agent-terminal-canvas-renderer.test.tsx.snap +348 -0
  1163. package/packages/daemon/src/tui/mirror/workspace/__snapshots__/application-shell-renderer.test.tsx.snap +134 -0
  1164. package/packages/daemon/src/tui/mirror/workspace/__snapshots__/command-palette-surface-renderer.test.tsx.snap +255 -0
  1165. package/packages/daemon/src/tui/mirror/workspace/__snapshots__/pane-frame-renderer.test.tsx.snap +525 -0
  1166. package/packages/daemon/src/tui/mirror/workspace/__snapshots__/terminal-pane-header-polish-renderer.test.tsx.snap +31 -0
  1167. package/packages/daemon/src/tui/mirror/workspace/__snapshots__/workbench-shell-renderer.test.tsx.snap +134 -0
  1168. package/packages/daemon/src/tui/mirror/workspace/agent-terminal-canvas-view.tsx +61 -0
  1169. package/packages/daemon/src/tui/mirror/workspace/agent-terminal-canvas.ts +131 -0
  1170. package/packages/daemon/src/tui/mirror/workspace/application-command-description.ts +77 -0
  1171. package/packages/daemon/src/tui/mirror/workspace/application-root-controller.ts +169 -0
  1172. package/packages/daemon/src/tui/mirror/workspace/application-shell-controller.ts +430 -0
  1173. package/packages/daemon/src/tui/mirror/workspace/application-shell-surface-commands.ts +64 -0
  1174. package/packages/daemon/src/tui/mirror/workspace/application-shell-view.tsx +169 -0
  1175. package/packages/daemon/src/tui/mirror/workspace/application-shell.ts +179 -0
  1176. package/packages/daemon/src/tui/mirror/workspace/command-palette-surface-view.tsx +356 -0
  1177. package/packages/daemon/src/tui/mirror/workspace/command-palette-surface.ts +557 -0
  1178. package/packages/daemon/src/tui/mirror/workspace/connection-feedback.ts +105 -0
  1179. package/packages/daemon/src/tui/mirror/workspace/icons.ts +56 -0
  1180. package/packages/daemon/src/tui/mirror/workspace/pane-action-menu-model.ts +33 -0
  1181. package/packages/daemon/src/tui/mirror/workspace/pane-action-menu.tsx +54 -0
  1182. package/packages/daemon/src/tui/mirror/workspace/pane-frame.ts +675 -0
  1183. package/packages/daemon/src/tui/mirror/workspace/pane-frame.tsx +490 -0
  1184. package/packages/daemon/src/tui/mirror/workspace/terminal-pane-chrome-view.tsx +125 -0
  1185. package/packages/daemon/src/tui/mirror/workspace/terminal-pane-chrome.ts +833 -0
  1186. package/packages/daemon/src/tui/mirror/workspace/terminal-pane-header.tsx +326 -0
  1187. package/packages/daemon/src/tui/mirror/workspace/terminal-scrollback.ts +216 -0
  1188. package/packages/daemon/src/tui/mirror/workspace/terminal-window-strip.tsx +466 -0
  1189. package/packages/daemon/src/tui/mirror/workspace/text.ts +28 -0
  1190. package/packages/daemon/src/tui/mirror/workspace/workbench-controller.ts +75 -0
  1191. package/packages/daemon/src/tui/mirror/workspace/workbench-dock-opentui.tsx +224 -0
  1192. package/packages/daemon/src/tui/mirror/workspace/workbench-shell.ts +486 -0
  1193. package/packages/daemon/src/tui/mirror/workspace/workbench-shell.tsx +95 -0
  1194. package/packages/daemon/src/tui/mirror/workspace-ui-state.ts +1278 -0
  1195. package/packages/daemon/src/tui/readiness.ts +52 -0
  1196. package/packages/daemon/src/tui/team/entry.ts +23 -13
  1197. package/packages/daemon/src/tui/team/fuzzy.ts +20 -0
  1198. package/packages/daemon/src/tui/team/home.ts +1 -1
  1199. package/packages/daemon/src/tui/team/index.tsx +27 -8
  1200. package/packages/daemon/src/tui/team/projects.ts +12 -0
  1201. package/packages/daemon/src/tui/team/sessions.ts +119 -46
  1202. package/packages/daemon/src/tui/team/wait-receipts.ts +192 -0
  1203. package/packages/daemon/src/tui/team/wait.ts +144 -0
  1204. package/packages/daemon/src/ui/pane-frame/fixture.ts +43 -0
  1205. package/packages/daemon/src/ui/workbench-dock/fixture.ts +61 -0
  1206. package/packages/daemon/src/validate.ts +21 -9
  1207. package/packages/daemon/src/widgets/config/README.md +1 -1
  1208. package/packages/daemon/src/widgets/config/index.tsx +15 -115
  1209. package/packages/daemon/src/widgets/lib/watcher.ts +3 -130
  1210. package/packages/daemon/src/widgets/resolve.ts +18 -9
  1211. package/packages/daemon/src/widgets/setup/footer.tsx +0 -7
  1212. package/packages/daemon/src/widgets/setup/index.tsx +18 -20
  1213. package/packages/daemon/src/widgets/setup/review-panel.tsx +15 -10
  1214. package/packages/daemon/src/widgets/setup/setup-model.ts +7 -10
  1215. package/packages/daemon-client/package.json +42 -0
  1216. package/packages/daemon-client/src/application-shell-session.test.ts +196 -0
  1217. package/packages/daemon-client/src/application-shell-session.ts +450 -0
  1218. package/packages/daemon-client/src/bootstrap-coordinator.test.ts +122 -0
  1219. package/packages/daemon-client/src/bootstrap-coordinator.ts +293 -0
  1220. package/packages/daemon-client/src/connection-supervisor.test.ts +109 -0
  1221. package/packages/daemon-client/src/connection-supervisor.ts +216 -0
  1222. package/packages/daemon-client/src/direct-application-shell-transport.test.ts +939 -0
  1223. package/packages/daemon-client/src/direct-application-shell-transport.ts +1144 -0
  1224. package/packages/daemon-client/src/first-latest-coordinator.test.ts +175 -0
  1225. package/packages/daemon-client/src/first-latest-coordinator.ts +82 -0
  1226. package/packages/daemon-client/src/generation-bound-store-timers.test.ts +74 -0
  1227. package/packages/daemon-client/src/generation-bound-store.ts +908 -0
  1228. package/packages/daemon-client/src/index.ts +25 -0
  1229. package/packages/daemon-client/src/owner-action-client.test.ts +180 -0
  1230. package/packages/daemon-client/src/owner-action-client.ts +113 -0
  1231. package/packages/daemon-client/src/pane-stream-client.test.ts +2771 -0
  1232. package/packages/daemon-client/src/pane-stream-client.ts +1665 -0
  1233. package/packages/daemon-client/src/pane-stream-clock-calibration.test.ts +207 -0
  1234. package/packages/daemon-client/src/pane-stream-clock-calibration.ts +161 -0
  1235. package/packages/daemon-client/src/pane-stream-loopback-benchmark.test.ts +51 -0
  1236. package/packages/daemon-client/src/push-resource-session.test.ts +509 -0
  1237. package/packages/daemon-client/src/push-resource-session.ts +797 -0
  1238. package/packages/daemon-client/src/resource-replica.test.ts +186 -0
  1239. package/packages/daemon-client/src/resource-replica.ts +280 -0
  1240. package/packages/daemon-client/src/runtime-resource-ledger.test.ts +18 -0
  1241. package/packages/daemon-client/src/runtime-resource-ledger.ts +69 -0
  1242. package/packages/daemon-client/src/terminal-fast-lane.test.ts +817 -0
  1243. package/packages/daemon-client/src/terminal-fast-lane.ts +817 -0
  1244. package/packages/daemon-client/src/terminal-fast-lane.typecheck.ts +16 -0
  1245. package/packages/daemon-client/src/workspace-catalog-v2.test.ts +109 -0
  1246. package/packages/daemon-client/src/workspace-catalog-v2.ts +66 -0
  1247. package/packages/daemon-client/src/workspace-client-boundaries.test.ts +59 -0
  1248. package/packages/daemon-client/src/workspace-client-conformance.ts +67 -0
  1249. package/packages/daemon-client/src/workspace-client-operations.test.ts +47 -0
  1250. package/packages/daemon-client/src/workspace-client-operations.ts +220 -0
  1251. package/packages/daemon-client/src/workspace-client-types.ts +302 -0
  1252. package/packages/daemon-client/src/workspace-client.test.ts +2752 -0
  1253. package/packages/daemon-client/src/workspace-client.ts +1452 -0
  1254. package/packages/daemon-client/src/workspace-event-supervisor.test.ts +1086 -0
  1255. package/packages/daemon-client/src/workspace-event-supervisor.ts +719 -0
  1256. package/packages/daemon-client/src/workspace-pane-client.test.ts +80 -0
  1257. package/packages/daemon-client/src/workspace-pane-client.ts +63 -0
  1258. package/packages/presentation/package.json +28 -0
  1259. package/packages/presentation/src/index.ts +2 -0
  1260. package/packages/presentation/src/pane-frame/action-state.ts +72 -0
  1261. package/packages/presentation/src/pane-frame/index.ts +3 -0
  1262. package/packages/presentation/src/pane-frame/model.ts +517 -0
  1263. package/packages/presentation/src/pane-frame/presenter.tsx +335 -0
  1264. package/packages/presentation/src/pane-frame/web-entry.tsx +22 -0
  1265. package/packages/presentation/src/pane-frame/web-host-unstyled.tsx +280 -0
  1266. package/packages/presentation/src/pane-frame/web-host.css +388 -0
  1267. package/packages/presentation/src/pane-frame/web-host.tsx +3 -0
  1268. package/packages/presentation/src/presentation-contract.test.ts +63 -0
  1269. package/packages/presentation/src/workbench-dock/index.ts +2 -0
  1270. package/packages/presentation/src/workbench-dock/navigation.ts +54 -0
  1271. package/packages/presentation/src/workbench-dock/presenter.tsx +252 -0
  1272. package/packages/presentation/src/workbench-dock/web-entry.tsx +19 -0
  1273. package/packages/presentation/src/workbench-dock/web-host-unstyled.tsx +198 -0
  1274. package/packages/presentation/src/workbench-dock/web-host.css +204 -0
  1275. package/packages/presentation/src/workbench-dock/web-host.tsx +3 -0
  1276. package/packages/tmux-bridge/src/index.ts +9 -1
  1277. package/packages/tmux-bridge/src/panes.ts +4 -0
  1278. package/packages/tmux-bridge/src/runner.test.ts +72 -0
  1279. package/packages/tmux-bridge/src/runner.ts +43 -2
  1280. package/packages/tmux-bridge/src/sessions.ts +8 -1
  1281. package/scripts/postinstall.js +65 -7
  1282. package/skill/SKILL.md +115 -30
  1283. package/templates/agent-team-monorepo.yml +28 -30
  1284. package/templates/agent-team-nextjs.yml +24 -26
  1285. package/templates/agent-team.yml +24 -24
  1286. package/templates/convex.yml +24 -16
  1287. package/templates/default.yml +26 -21
  1288. package/templates/go.yml +21 -14
  1289. package/templates/missions.yml +25 -40
  1290. package/templates/nextjs.yml +24 -16
  1291. package/templates/python.yml +21 -14
  1292. package/templates/vite.yml +21 -14
  1293. package/bin/cli.ts +0 -1476
  1294. package/packages/daemon/dist/__tests__/support.d.ts +0 -7
  1295. package/packages/daemon/dist/agent-explain.d.ts +0 -52
  1296. package/packages/daemon/dist/attach.d.ts +0 -3
  1297. package/packages/daemon/dist/bin.d.ts +0 -2
  1298. package/packages/daemon/dist/canonical.d.ts +0 -2
  1299. package/packages/daemon/dist/cli.d.ts +0 -1
  1300. package/packages/daemon/dist/command-center/actions/contract.d.ts +0 -1
  1301. package/packages/daemon/dist/command-center/actions/dispatcher.d.ts +0 -27
  1302. package/packages/daemon/dist/command-center/actions/errors.d.ts +0 -38
  1303. package/packages/daemon/dist/command-center/actions/handlers/_project-context.d.ts +0 -12
  1304. package/packages/daemon/dist/command-center/actions/handlers/_resolve-project.d.ts +0 -42
  1305. package/packages/daemon/dist/command-center/actions/handlers/app-set-remote-access.d.ts +0 -23
  1306. package/packages/daemon/dist/command-center/actions/handlers/config-actions.d.ts +0 -12
  1307. package/packages/daemon/dist/command-center/actions/handlers/daemon-shutdown.d.ts +0 -6
  1308. package/packages/daemon/dist/command-center/actions/handlers/project-activate.d.ts +0 -7
  1309. package/packages/daemon/dist/command-center/actions/handlers/project-launch.d.ts +0 -18
  1310. package/packages/daemon/dist/command-center/actions/handlers/project-open-terminal.d.ts +0 -32
  1311. package/packages/daemon/dist/command-center/actions/handlers/project-restart.d.ts +0 -17
  1312. package/packages/daemon/dist/command-center/actions/handlers/project-stop.d.ts +0 -24
  1313. package/packages/daemon/dist/command-center/actions/handlers/terminal-respawn.d.ts +0 -24
  1314. package/packages/daemon/dist/command-center/actions/handlers/terminal-stop.d.ts +0 -14
  1315. package/packages/daemon/dist/command-center/actions/registry.d.ts +0 -35
  1316. package/packages/daemon/dist/command-center/discovery.d.ts +0 -23
  1317. package/packages/daemon/dist/command-center/index.d.ts +0 -10
  1318. package/packages/daemon/dist/command-center/schemas.d.ts +0 -76
  1319. package/packages/daemon/dist/command-center/server.d.ts +0 -26
  1320. package/packages/daemon/dist/command-center/ws-events.d.ts +0 -59
  1321. package/packages/daemon/dist/config.d.ts +0 -19
  1322. package/packages/daemon/dist/detect.d.ts +0 -15
  1323. package/packages/daemon/dist/doctor.d.ts +0 -21
  1324. package/packages/daemon/dist/embed.d.ts +0 -1
  1325. package/packages/daemon/dist/index.d.ts +0 -3
  1326. package/packages/daemon/dist/init.d.ts +0 -4
  1327. package/packages/daemon/dist/inspect.d.ts +0 -54
  1328. package/packages/daemon/dist/launch.d.ts +0 -23
  1329. package/packages/daemon/dist/lib/active-projects.d.ts +0 -12
  1330. package/packages/daemon/dist/lib/agent-discovery.d.ts +0 -43
  1331. package/packages/daemon/dist/lib/app-config.d.ts +0 -147
  1332. package/packages/daemon/dist/lib/app-settings.d.ts +0 -9
  1333. package/packages/daemon/dist/lib/auth/auth-service.d.ts +0 -33
  1334. package/packages/daemon/dist/lib/auth/middleware.d.ts +0 -16
  1335. package/packages/daemon/dist/lib/auth/types.d.ts +0 -1
  1336. package/packages/daemon/dist/lib/auth-token.d.ts +0 -1
  1337. package/packages/daemon/dist/lib/authorship.d.ts +0 -62
  1338. package/packages/daemon/dist/lib/canonical-daemon.d.ts +0 -21
  1339. package/packages/daemon/dist/lib/cli-action-bridge.d.ts +0 -27
  1340. package/packages/daemon/dist/lib/daemon-embed.d.ts +0 -31
  1341. package/packages/daemon/dist/lib/daemon-watchdog.d.ts +0 -16
  1342. package/packages/daemon/dist/lib/daemon.d.ts +0 -8
  1343. package/packages/daemon/dist/lib/dot-path.d.ts +0 -2
  1344. package/packages/daemon/dist/lib/errors.d.ts +0 -37
  1345. package/packages/daemon/dist/lib/filesystem-browser.d.ts +0 -85
  1346. package/packages/daemon/dist/lib/launch-plan.d.ts +0 -6
  1347. package/packages/daemon/dist/lib/log.d.ts +0 -40
  1348. package/packages/daemon/dist/lib/output.d.ts +0 -9
  1349. package/packages/daemon/dist/lib/project-init-runner.d.ts +0 -46
  1350. package/packages/daemon/dist/lib/project-inspect.d.ts +0 -28
  1351. package/packages/daemon/dist/lib/project-onboard.d.ts +0 -58
  1352. package/packages/daemon/dist/lib/project-probe.d.ts +0 -35
  1353. package/packages/daemon/dist/lib/project-registry.d.ts +0 -76
  1354. package/packages/daemon/dist/lib/session-monitor.d.ts +0 -15
  1355. package/packages/daemon/dist/lib/session-options.d.ts +0 -13
  1356. package/packages/daemon/dist/lib/shell.d.ts +0 -5
  1357. package/packages/daemon/dist/lib/sizes.d.ts +0 -16
  1358. package/packages/daemon/dist/lib/skill-sync.d.ts +0 -60
  1359. package/packages/daemon/dist/lib/slugify.d.ts +0 -4
  1360. package/packages/daemon/dist/lib/terminals-store.d.ts +0 -27
  1361. package/packages/daemon/dist/lib/tui-binary.d.ts +0 -57
  1362. package/packages/daemon/dist/lib/update-check.d.ts +0 -118
  1363. package/packages/daemon/dist/lib/update.d.ts +0 -65
  1364. package/packages/daemon/dist/lib/workspace-registry.d.ts +0 -84
  1365. package/packages/daemon/dist/lib/worktree.d.ts +0 -76
  1366. package/packages/daemon/dist/lib/yaml-io.d.ts +0 -10
  1367. package/packages/daemon/dist/ls.d.ts +0 -3
  1368. package/packages/daemon/dist/restart.d.ts +0 -4
  1369. package/packages/daemon/dist/restore.d.ts +0 -86
  1370. package/packages/daemon/dist/schemas/domain.d.ts +0 -1
  1371. package/packages/daemon/dist/schemas/filesystem.d.ts +0 -29
  1372. package/packages/daemon/dist/schemas/ide-config.d.ts +0 -1
  1373. package/packages/daemon/dist/schemas/index.d.ts +0 -12
  1374. package/packages/daemon/dist/schemas/inspect.d.ts +0 -53
  1375. package/packages/daemon/dist/schemas/registry.d.ts +0 -35
  1376. package/packages/daemon/dist/schemas/ws-events.d.ts +0 -72
  1377. package/packages/daemon/dist/send.d.ts +0 -27
  1378. package/packages/daemon/dist/server/index.d.ts +0 -10
  1379. package/packages/daemon/dist/server/pty-bridge.d.ts +0 -174
  1380. package/packages/daemon/dist/server/ws-route.d.ts +0 -74
  1381. package/packages/daemon/dist/status.d.ts +0 -3
  1382. package/packages/daemon/dist/stop.d.ts +0 -3
  1383. package/packages/daemon/dist/terminal/NodePtyAdapter.d.ts +0 -44
  1384. package/packages/daemon/dist/terminal/PtyAdapter.d.ts +0 -124
  1385. package/packages/daemon/dist/terminal/__tests__/MockPtyAdapter.d.ts +0 -77
  1386. package/packages/daemon/dist/types.d.ts +0 -2
  1387. package/packages/daemon/dist/validate.d.ts +0 -4
  1388. package/packages/daemon/dist/widgets/changes/index.jsx +0 -575
  1389. package/packages/daemon/dist/widgets/config/index.d.ts +0 -1
  1390. package/packages/daemon/dist/widgets/config/index.jsx +0 -395
  1391. package/packages/daemon/dist/widgets/explorer/breadcrumbs.d.ts +0 -10
  1392. package/packages/daemon/dist/widgets/explorer/breadcrumbs.jsx +0 -51
  1393. package/packages/daemon/dist/widgets/explorer/footer.d.ts +0 -6
  1394. package/packages/daemon/dist/widgets/explorer/footer.jsx +0 -11
  1395. package/packages/daemon/dist/widgets/explorer/index.jsx +0 -393
  1396. package/packages/daemon/dist/widgets/explorer/tree-model.d.ts +0 -13
  1397. package/packages/daemon/dist/widgets/explorer/tree.d.ts +0 -13
  1398. package/packages/daemon/dist/widgets/explorer/tree.jsx +0 -108
  1399. package/packages/daemon/dist/widgets/lib/config-model.d.ts +0 -22
  1400. package/packages/daemon/dist/widgets/lib/files.d.ts +0 -11
  1401. package/packages/daemon/dist/widgets/lib/git.d.ts +0 -11
  1402. package/packages/daemon/dist/widgets/lib/grammar.d.ts +0 -79
  1403. package/packages/daemon/dist/widgets/lib/help-overlay.d.ts +0 -19
  1404. package/packages/daemon/dist/widgets/lib/help-overlay.jsx +0 -69
  1405. package/packages/daemon/dist/widgets/lib/pane-comms.d.ts +0 -28
  1406. package/packages/daemon/dist/widgets/lib/theme.d.ts +0 -44
  1407. package/packages/daemon/dist/widgets/lib/watcher.d.ts +0 -9
  1408. package/packages/daemon/dist/widgets/preview/index.jsx +0 -371
  1409. package/packages/daemon/dist/widgets/resolve.d.ts +0 -20
  1410. package/packages/daemon/dist/widgets/setup/agent-naming.d.ts +0 -9
  1411. package/packages/daemon/dist/widgets/setup/agent-naming.jsx +0 -81
  1412. package/packages/daemon/dist/widgets/setup/config-tree.d.ts +0 -13
  1413. package/packages/daemon/dist/widgets/setup/config-tree.jsx +0 -203
  1414. package/packages/daemon/dist/widgets/setup/detect-panel.d.ts +0 -14
  1415. package/packages/daemon/dist/widgets/setup/detect-panel.jsx +0 -48
  1416. package/packages/daemon/dist/widgets/setup/field-editor.d.ts +0 -12
  1417. package/packages/daemon/dist/widgets/setup/field-editor.jsx +0 -163
  1418. package/packages/daemon/dist/widgets/setup/footer.d.ts +0 -17
  1419. package/packages/daemon/dist/widgets/setup/footer.jsx +0 -64
  1420. package/packages/daemon/dist/widgets/setup/index.d.ts +0 -1
  1421. package/packages/daemon/dist/widgets/setup/index.jsx +0 -261
  1422. package/packages/daemon/dist/widgets/setup/layout-picker.d.ts +0 -9
  1423. package/packages/daemon/dist/widgets/setup/layout-picker.jsx +0 -69
  1424. package/packages/daemon/dist/widgets/setup/setup-model.d.ts +0 -15
  1425. package/packages/daemon/dist/widgets/sidebar/index.jsx +0 -462
  1426. package/packages/daemon/src/tui/mirror/control-client.ts +0 -214
  1427. package/packages/daemon/src/tui/mirror/control.ts +0 -97
  1428. package/packages/daemon/src/tui/mirror/focus-border.ts +0 -57
  1429. package/packages/daemon/src/tui/mirror/input-coalescer.ts +0 -105
  1430. package/packages/daemon/src/tui/mirror/session-mirror.ts +0 -443
  1431. package/packages/daemon/src/widgets/setup/orchestrator-panel.tsx +0 -200
  1432. package/scripts/build-cli.mjs +0 -101
  1433. package/scripts/build-tui.mjs +0 -65
  1434. package/scripts/capture-codex-traffic.mjs +0 -195
  1435. package/scripts/check-src-additions.sh +0 -74
  1436. package/scripts/coverage-summary.mjs +0 -68
  1437. package/scripts/install-git-hooks.js +0 -53
  1438. package/scripts/merge-update-manifests.mjs +0 -58
  1439. package/scripts/merge-update-manifests.test.mjs +0 -82
  1440. package/scripts/pack-check-run.mjs +0 -83
  1441. package/scripts/perf-mirror.mjs +0 -313
  1442. package/scripts/prepublish-check.mjs +0 -44
  1443. package/scripts/stress-test.ts +0 -141
  1444. package/scripts/verify-endpoints.sh +0 -90
  1445. /package/packages/daemon/dist/{server/standalone.d.ts → terminal/mirror/trusted-inventory.js} +0 -0
  1446. /package/packages/daemon/dist/{widgets/changes/index.d.ts → terminal/session-runtime/terminal-interpreter-backend.js} +0 -0
  1447. /package/packages/daemon/dist/{widgets/explorer/index.d.ts → tui/mirror/features/changes/contract.js} +0 -0
  1448. /package/packages/daemon/dist/{widgets/preview/index.d.ts → tui/mirror/features/dialogs/contract.js} +0 -0
  1449. /package/packages/daemon/dist/{widgets/sidebar/index.d.ts → tui/mirror/features/performance-hud/contract.js} +0 -0
@@ -1,9 +1,3 @@
1
- /**
2
- * Programmatic tmux-ide daemon entrypoint.
3
- *
4
- * This is the shared runtime used by the standalone daemon process and by
5
- * embedders such as Electron's main process.
6
- */
7
1
  var __rewriteRelativeImportExtension = (this && this.__rewriteRelativeImportExtension) || function (path, preserveJsx) {
8
2
  if (typeof path === "string" && /^\.\.?\//.test(path)) {
9
3
  return path.replace(/\.(tsx)$|((?:\.d)?)((?:\.[^./]+?)?)\.([cm]?)ts$/i, function (m, tsx, d, ext, cm) {
@@ -12,26 +6,85 @@ var __rewriteRelativeImportExtension = (this && this.__rewriteRelativeImportExte
12
6
  }
13
7
  return path;
14
8
  };
9
+ import { mountTerminalNativeBackingRoute } from "../command-center/resources/terminal-native-backing-route.js";
10
+ import { startOwnedEmbeddedDaemon } from "./embedded-daemon-lifecycle.js";
11
+ /**
12
+ * Programmatic tmux-ide daemon entrypoint.
13
+ *
14
+ * This is the shared runtime used by the standalone daemon process and by
15
+ * embedders such as Electron's main process.
16
+ */
15
17
  import { execFileSync } from "node:child_process";
16
- import { randomBytes } from "node:crypto";
18
+ import { randomBytes, randomUUID } from "node:crypto";
19
+ import { createWriteStream } from "node:fs";
17
20
  import { createServer } from "node:http";
18
21
  import { createRequire } from "node:module";
22
+ import { performance } from "node:perf_hooks";
19
23
  import { WebSocket, WebSocketServer } from "ws";
20
- import { computeAgentStates, computePortPanes } from "./session-monitor.js";
24
+ import { ownerBearerMatches } from "../command-center/owner-authority.js";
25
+ import { createTmuxAuthorityReplacementProbe } from "./tmux-authority-replacement.js";
26
+ import { createNamedSocketFence } from "./tmux-named-socket-fence.js";
27
+ import { fleetSessionIdForName } from "../command-center/resources/fleet-catalog.js";
28
+ import { DAEMON_WIRE_PROTOCOL_VERSION, DaemonInstanceIdentitySchemaZ, PANE_STREAM_REDEEM_PATH, PaneStreamLoopbackWebSocketUrlSchemaZ, TERMINAL_ATTACHMENT_REDEEM_PATH, TerminalAttachmentLoopbackWebSocketUrlSchemaZ, } from "@tmux-ide/contracts";
29
+ import { classifySessionInspectionError, DaemonSessionMonitor, execTmuxAsync, isConfirmedMissingTmuxTarget, parseDaemonMonitorPanes, readPortProcessFactsAsync, } from "./daemon-session-monitor.js";
21
30
  import { DaemonShutdownError, DaemonStartupError } from "./errors.js";
22
31
  import { handlePtyWebSocket, shutdownPtyBridges } from "../server/ws-route.js";
23
- import { handleWsEventsConnection } from "../command-center/ws-events.js";
24
- import { setRemoteAccessRestartBackend } from "../command-center/actions/handlers/app-set-remote-access.js";
32
+ import { broadcastInteractionReceipt, broadcastResourceChanged, handleWsEventsConnection, setFleetFactsObserverDiagnostics, setFleetFactsTmuxRunner, shutdownWsEventObservation, } from "../command-center/ws-events.js";
33
+ import { setRemoteAccessRestartBackend, } from "../command-center/actions/handlers/app-set-remote-access.js";
25
34
  import { setDaemonShutdownBackend } from "../command-center/actions/handlers/daemon-shutdown.js";
26
35
  import { readAppSettings } from "./app-settings.js";
27
- import { getDefaultWorkspaceRegistry } from "./workspace-registry.js";
36
+ import { getDefaultWorkspaceRegistry, readWorkspaceRegistrySessionInventory, WORKSPACE_REGISTRY_TMUX_TIMEOUT_MS, } from "./workspace-registry.js";
37
+ import { createPinnedWorkspaceTmuxRunner, createPinnedWorkspaceTmuxAsyncRunner, resolveWorkspacePaneTmuxAuthority, WorkspacePaneCreationAuthority, } from "./workspace-pane-creation.js";
38
+ import { discoverLiveSessionSummaries, readAdoptedFleet } from "../command-center/discovery.js";
39
+ import { WorkspaceOpenAuthority } from "./workspace-open.js";
40
+ import { WorkspacePromotionAuthority } from "./workspace-promotion.js";
41
+ import { WorkspaceOpenHandoffCoordinator } from "./workspace-open-handoff.js";
42
+ import { FleetLifecycleAuthority } from "./fleet-lifecycle-authority.js";
43
+ import { AppWindowMutationAuthority } from "./app-window-mutation.js";
44
+ import { WorkspaceMultiplexerAuthority } from "./workspace-multiplexer-verbs.js";
45
+ import { TmuxExternalInteractionObserver } from "./tmux-external-interaction-observer.js";
46
+ import { createNativeTerminalAttachmentRuntime, WorkspaceTerminalInventoryRuntime, } from "../terminal/attachments/native-runtime.js";
47
+ import { createTmuxAgentStatusProbe } from "../terminal/attachments/agent-status-probe.js";
48
+ import { attachTerminalAttachmentWebSocket, } from "../server/terminal-attachment-upgrade.js";
49
+ import { attachPaneStreamWebSocket, } from "../server/pane-stream-upgrade.js";
50
+ import { createPaneStreamRuntime, } from "../terminal/pane-stream/runtime.js";
51
+ import { SessionRuntimeRegistry } from "../terminal/session-runtime/registry.js";
52
+ import { createSessionRuntimeObservability } from "../terminal/session-runtime/runtime-observability.js";
53
+ import { createSessionRuntimeMultiplexerBackend } from "../terminal/session-runtime/multiplexer-backend.js";
54
+ import { PaneSourceCredentialAuthority, reconcilePaneSourceCredentialsAtStartup, } from "./pane-source-credentials.js";
28
55
  import { setActivationBackend } from "./active-projects.js";
29
- import { clearCanonicalDaemonInfo, isCanonicalDaemonAlive, readCanonicalDaemonInfo, writeCanonicalDaemonInfo, } from "./canonical-daemon.js";
56
+ import { readOrMintEnvironmentId } from "./environment-identity.js";
57
+ import { canonicalDaemonUrl, clearCanonicalDaemonInfoIfOwned, clearCanonicalDaemonInfoIfUnchanged, inspectCanonicalDaemonInfo, isCanonicalDaemonAlive, isCanonicalDaemonRecordOwnerProvenDead, probeCanonicalDaemonHealth, probeCanonicalDaemonIdentity, releaseCanonicalDaemonClaim, tryAcquireCanonicalDaemonClaim, writeCanonicalDaemonInfo, } from "./canonical-daemon.js";
30
58
  const requireFromHere = createRequire(import.meta.url);
31
59
  const DEFAULT_HOSTNAME = "127.0.0.1";
32
60
  const DEFAULT_GRACEFUL_MS = 2000;
33
- const MONITOR_INTERVAL_MS = 1000;
34
61
  const EMBEDDED_SESSION_NAME = "__embedded__";
62
+ const TAKEOVER_TIMEOUT_MS = 10_000;
63
+ const TAKEOVER_POLL_MS = 50;
64
+ const TAKEOVER_DEADLINE_TEST_OVERRIDE = Symbol.for("tmux-ide.daemon-embed.takeover-deadline-ms.test-only");
65
+ function loadBundledPackage() {
66
+ return requireFromHere("../../package.json");
67
+ }
68
+ /**
69
+ * Resolve diagnostic version metadata without making daemon startup depend on
70
+ * package.json being present next to a bundled executable.
71
+ */
72
+ export function resolveDaemonProductVersion(explicit, loadPackage = loadBundledPackage) {
73
+ if (typeof explicit === "string" && explicit.trim().length > 0)
74
+ return explicit.trim();
75
+ try {
76
+ const pkg = loadPackage();
77
+ if (pkg && typeof pkg === "object" && "version" in pkg) {
78
+ const version = pkg.version;
79
+ if (typeof version === "string" && version.trim().length > 0)
80
+ return version.trim();
81
+ }
82
+ }
83
+ catch {
84
+ // Bundled/single-file hosts may have no package.json at this relative path.
85
+ }
86
+ return "0.0.0";
87
+ }
35
88
  function tmux(...args) {
36
89
  return execFileSync("tmux", args, {
37
90
  encoding: "utf-8",
@@ -41,6 +94,7 @@ function tmux(...args) {
41
94
  // child spawn fails with EBADF. The visible symptom is sessionExists()
42
95
  // returning false → stopSelf → ghost daemon.
43
96
  stdio: ["ignore", "pipe", "pipe"],
97
+ timeout: 2_000,
44
98
  }).trim();
45
99
  }
46
100
  function tmuxSilent(...args) {
@@ -51,9 +105,9 @@ function tmuxSilent(...args) {
51
105
  return "";
52
106
  }
53
107
  }
54
- function assertTmuxSession(sessionName) {
108
+ function assertTmuxSession(sessionName, runTmux = (args) => tmux(...args)) {
55
109
  try {
56
- tmux("has-session", "-t", sessionName);
110
+ runTmux(["has-session", "-t", sessionName]);
57
111
  }
58
112
  catch (err) {
59
113
  throw new DaemonStartupError(`tmux session "${sessionName}" does not exist`, "tmux_session_missing", { cause: err });
@@ -64,6 +118,50 @@ function validatePort(port) {
64
118
  throw new DaemonStartupError(`Invalid daemon port: ${port}`, "port_invalid");
65
119
  }
66
120
  }
121
+ /**
122
+ * Renderer descriptors are always local capabilities, even when the HTTP
123
+ * server listens on a wildcard. Explicit remote-only binds are deliberately
124
+ * unsupported rather than leaking an unreachable or remotely addressable URL.
125
+ */
126
+ export function terminalAttachmentWebSocketUrl(bindHostname, port) {
127
+ const descriptorHostname = bindHostname === "0.0.0.0" ? "127.0.0.1" : bindHostname === "::" ? "::1" : bindHostname;
128
+ if (!["127.0.0.1", "localhost", "::1"].includes(descriptorHostname)) {
129
+ throw new TypeError("Terminal attachment listener must include a canonical loopback address.");
130
+ }
131
+ return TerminalAttachmentLoopbackWebSocketUrlSchemaZ.parse(canonicalDaemonUrl("ws", descriptorHostname, port, TERMINAL_ATTACHMENT_REDEEM_PATH));
132
+ }
133
+ /** Pane-stream descriptors share the loopback-only discipline above. */
134
+ export function paneStreamWebSocketUrl(bindHostname, port) {
135
+ const descriptorHostname = bindHostname === "0.0.0.0" ? "127.0.0.1" : bindHostname === "::" ? "::1" : bindHostname;
136
+ if (!["127.0.0.1", "localhost", "::1"].includes(descriptorHostname)) {
137
+ throw new TypeError("Pane-stream listener must include a canonical loopback address.");
138
+ }
139
+ return PaneStreamLoopbackWebSocketUrlSchemaZ.parse(canonicalDaemonUrl("ws", descriptorHostname, port, PANE_STREAM_REDEEM_PATH));
140
+ }
141
+ /**
142
+ * Start both direct-terminal retirement barriers before awaiting either one.
143
+ * The runtime call closes admission and PTYs; the boundary call detaches the
144
+ * upgrade listener. Returning failures lets the outer daemon shutdown keep
145
+ * retiring legacy transports, HTTP, and canonical publication.
146
+ */
147
+ export async function retireTerminalAttachmentTransport(runtime, boundary) {
148
+ let runtimeDisposal;
149
+ try {
150
+ runtimeDisposal = runtime?.dispose() ?? Promise.resolve();
151
+ }
152
+ catch (error) {
153
+ runtimeDisposal = Promise.reject(error);
154
+ }
155
+ let boundaryClose;
156
+ try {
157
+ boundaryClose = boundary.close();
158
+ }
159
+ catch (error) {
160
+ boundaryClose = Promise.reject(error);
161
+ }
162
+ const results = await Promise.allSettled([runtimeDisposal, boundaryClose]);
163
+ return results.flatMap((result) => (result.status === "rejected" ? [result.reason] : []));
164
+ }
67
165
  async function pickFreePort(hostname) {
68
166
  const probe = createServer();
69
167
  return await new Promise((resolve, reject) => {
@@ -80,50 +178,6 @@ async function pickFreePort(hostname) {
80
178
  });
81
179
  });
82
180
  }
83
- function sessionExists(sessionName) {
84
- try {
85
- tmux("has-session", "-t", sessionName);
86
- return "yes";
87
- }
88
- catch (err) {
89
- const msg = err.message ?? "";
90
- const code = err.code;
91
- // Spawn-level failures (EBADF, EAGAIN, etc.) are transient OS issues,
92
- // not "session is gone" signals. Same for non-zero exits without stderr
93
- // — `has-session` returns 1 only when the session is genuinely missing,
94
- // and tmux always writes to stderr in that case.
95
- if (code === "EBADF" ||
96
- code === "EAGAIN" ||
97
- code === "EMFILE" ||
98
- code === "ENFILE" ||
99
- msg.includes("EBADF") ||
100
- msg.includes("EAGAIN")) {
101
- console.error("[daemon] sessionExists transient spawn error:", msg);
102
- return "unknown";
103
- }
104
- return "no";
105
- }
106
- }
107
- function hasClients() {
108
- return tmuxSilent("list-clients").length > 0;
109
- }
110
- function listPanes(sessionName) {
111
- const raw = tmuxSilent("list-panes", "-t", sessionName, "-F", "#{pane_id}\t#{pane_pid}\t#{pane_current_command}\t#{pane_title}\t#{@ide_role}\t#{@ide_type}\t#{@ide_name}");
112
- if (!raw)
113
- return [];
114
- return raw.split("\n").map((line) => {
115
- const [id, pid, cmd, title, role, type, name] = line.split("\t");
116
- return {
117
- id: id,
118
- pid: pid,
119
- cmd,
120
- title,
121
- role: role || undefined,
122
- type: type || undefined,
123
- name: name || undefined,
124
- };
125
- });
126
- }
127
181
  function bearerToken(authHeader) {
128
182
  const value = Array.isArray(authHeader) ? authHeader[0] : authHeader;
129
183
  if (!value?.startsWith("Bearer "))
@@ -172,7 +226,7 @@ function rejectUpgradeWithPolicy(wss, req, socket, head) {
172
226
  ws.close(1008, "Remote access token required");
173
227
  });
174
228
  }
175
- function attachWebSockets(server, opts = {}) {
229
+ function attachWebSockets(server, opts) {
176
230
  const eventsWss = new WebSocketServer({ noServer: true });
177
231
  const ptyWss = new WebSocketServer({ noServer: true });
178
232
  const clients = new Set();
@@ -191,7 +245,11 @@ function attachWebSockets(server, opts = {}) {
191
245
  if (pathname === "/ws/events") {
192
246
  eventsWss.handleUpgrade(req, socket, head, (ws) => {
193
247
  track(ws);
194
- handleWsEventsConnection(ws);
248
+ const requestUrl = new URL(req.url ?? "/ws/events", "http://daemon.local");
249
+ handleWsEventsConnection(ws, opts.daemonIdentity, {
250
+ mode: requestUrl.searchParams.get("mode") === "semantic" ? "semantic" : "legacy",
251
+ ownerAuthorized: ownerBearerMatches(req.headers.authorization, opts.ownerToken ?? null),
252
+ });
195
253
  });
196
254
  return;
197
255
  }
@@ -242,64 +300,155 @@ function delay(ms) {
242
300
  function generateLocalBypassToken() {
243
301
  return randomBytes(32).toString("base64url");
244
302
  }
245
- function probeHostname(bindHostname) {
246
- return bindHostname === "0.0.0.0" ? "127.0.0.1" : bindHostname;
247
- }
248
- function timeoutSignal(ms) {
303
+ function createTakeoverDeadline(timeoutMs) {
304
+ if (!Number.isFinite(timeoutMs) || timeoutMs <= 0) {
305
+ throw new TypeError("Takeover deadline must be a positive finite duration.");
306
+ }
249
307
  const controller = new AbortController();
250
- setTimeout(() => controller.abort(), ms).unref?.();
251
- return controller.signal;
308
+ const expiresAt = performance.now() + timeoutMs;
309
+ const timer = setTimeout(() => controller.abort(), timeoutMs);
310
+ timer.unref?.();
311
+ return {
312
+ signal: controller.signal,
313
+ expiresAt,
314
+ remainingMs: () => Math.max(0, expiresAt - performance.now()),
315
+ dispose: () => clearTimeout(timer),
316
+ };
252
317
  }
253
- async function healthGone(port, bindHostname) {
254
- try {
255
- const res = await fetch(`http://${probeHostname(bindHostname)}:${port}/health`, {
256
- signal: timeoutSignal(500),
257
- });
258
- return !res.ok;
318
+ function takeoverTimeoutMs() {
319
+ const override = globalThis[TAKEOVER_DEADLINE_TEST_OVERRIDE];
320
+ return typeof override === "number" ? override : TAKEOVER_TIMEOUT_MS;
321
+ }
322
+ function throwTakeoverTimeout(message) {
323
+ throw new DaemonStartupError(message, "canonical_takeover_timeout");
324
+ }
325
+ function assertTakeoverDeadline(deadline, message) {
326
+ if (deadline.signal.aborted || deadline.remainingMs() <= 0)
327
+ throwTakeoverTimeout(message);
328
+ }
329
+ async function waitForTakeoverPoll(deadline) {
330
+ assertTakeoverDeadline(deadline, "Canonical daemon did not quiesce before the takeover deadline");
331
+ const waitMs = Math.min(TAKEOVER_POLL_MS, deadline.remainingMs());
332
+ await new Promise((resolve) => {
333
+ const timer = setTimeout(finish, waitMs);
334
+ const onAbort = () => finish();
335
+ function finish() {
336
+ clearTimeout(timer);
337
+ deadline.signal.removeEventListener("abort", onAbort);
338
+ resolve();
339
+ }
340
+ deadline.signal.addEventListener("abort", onAbort, { once: true });
341
+ });
342
+ assertTakeoverDeadline(deadline, "Canonical daemon did not quiesce before the takeover deadline");
343
+ }
344
+ function sameCanonicalInstance(left, right) {
345
+ return (left.pid === right.pid &&
346
+ left.port === right.port &&
347
+ left.protocolVersion === right.protocolVersion &&
348
+ left.instanceId === right.instanceId &&
349
+ left.startedAt === right.startedAt &&
350
+ left.bindHostname === right.bindHostname);
351
+ }
352
+ async function requestValidatedDaemonShutdown(info, deadline) {
353
+ const identity = await probeCanonicalDaemonIdentity(info, deadline.signal);
354
+ assertTakeoverDeadline(deadline, "Canonical daemon did not answer the takeover request before the takeover deadline");
355
+ if (!identity ||
356
+ identity.pid !== info.pid ||
357
+ identity.protocolVersion !== info.protocolVersion ||
358
+ identity.protocolVersion !== DAEMON_WIRE_PROTOCOL_VERSION ||
359
+ identity.instanceId !== info.instanceId ||
360
+ identity.startedAt !== info.startedAt) {
361
+ throw new DaemonStartupError("Canonical daemon identity changed before takeover", "canonical_takeover_identity_mismatch");
259
362
  }
260
- catch {
261
- return true;
363
+ const health = await probeCanonicalDaemonHealth(info, deadline.signal);
364
+ assertTakeoverDeadline(deadline, "Canonical daemon did not answer the takeover request before the takeover deadline");
365
+ if (!health ||
366
+ health.protocolVersion !== info.protocolVersion ||
367
+ health.protocolVersion !== DAEMON_WIRE_PROTOCOL_VERSION) {
368
+ throw new DaemonStartupError("Canonical daemon protocol or health is incompatible with takeover", "canonical_takeover_refused");
262
369
  }
263
- }
264
- async function requestDaemonShutdown(port, bindHostname) {
370
+ const current = inspectCanonicalDaemonInfo();
371
+ if (current.status !== "valid" || !sameCanonicalInstance(current.info, info)) {
372
+ throw new DaemonStartupError("Canonical daemon generation changed before takeover", "canonical_takeover_identity_mismatch");
373
+ }
374
+ const headers = { "Content-Type": "application/json" };
375
+ if (info.authToken)
376
+ headers.Authorization = `Bearer ${info.authToken}`;
377
+ let response;
265
378
  try {
266
- await fetch(`http://${probeHostname(bindHostname)}:${port}/api/v2/action/daemon.shutdown`, {
379
+ response = await fetch(canonicalDaemonUrl("http", info.bindHostname, info.port, "/api/v2/action/daemon.shutdown"), {
267
380
  method: "POST",
268
- headers: { "Content-Type": "application/json" },
269
- body: JSON.stringify({ reason: "takeover" }),
270
- signal: timeoutSignal(1_000),
381
+ headers,
382
+ body: JSON.stringify({ reason: "takeover", expectedInstanceId: info.instanceId }),
383
+ signal: deadline.signal,
271
384
  });
272
385
  }
273
- catch {
274
- // The existing daemon may predate the action or be mid-shutdown. Polling
275
- // and the final PID kill below handle both cases.
276
- }
277
- }
278
- async function takeoverCanonicalDaemon(info) {
279
- await requestDaemonShutdown(info.port, info.bindHostname);
280
- const deadline = Date.now() + 10_000;
281
- while (Date.now() < deadline) {
282
- const current = readCanonicalDaemonInfo();
283
- const fileGone = !current || current.pid !== info.pid || current.port !== info.port;
284
- const serverGone = await healthGone(info.port, info.bindHostname);
285
- if (fileGone && serverGone)
286
- return;
287
- await delay(150);
386
+ catch (error) {
387
+ if (error instanceof Error && error.name === "AbortError") {
388
+ throw new DaemonStartupError("Canonical daemon did not answer the takeover request in time", "canonical_takeover_timeout", { cause: error });
389
+ }
390
+ throw new DaemonStartupError("Canonical daemon did not accept the takeover request", "canonical_takeover_refused", { cause: error });
288
391
  }
289
- try {
290
- process.kill(info.pid, "SIGTERM");
392
+ const envelope = (await response.json().catch(() => null));
393
+ assertTakeoverDeadline(deadline, "Canonical daemon did not answer the takeover request before the takeover deadline");
394
+ if (envelope?.error?.code === "daemon_instance_mismatch") {
395
+ throw new DaemonStartupError("Canonical daemon generation changed before shutdown", "canonical_takeover_identity_mismatch");
291
396
  }
292
- catch {
293
- // Already gone or not ours.
397
+ if (!response.ok || envelope?.ok !== true || envelope.result?.stopping !== true) {
398
+ throw new DaemonStartupError(`Canonical daemon refused takeover (HTTP ${response.status})`, "canonical_takeover_refused");
294
399
  }
295
- await delay(500);
296
- try {
297
- process.kill(info.pid, "SIGKILL");
400
+ }
401
+ async function waitForTakeoverQuiescence(info, deadline) {
402
+ while (!deadline.signal.aborted) {
403
+ const current = inspectCanonicalDaemonInfo();
404
+ if (current.status === "valid" && !sameCanonicalInstance(current.info, info)) {
405
+ throw new DaemonStartupError("Another daemon generation won the takeover race", "canonical_already_running");
406
+ }
407
+ const recordOwnerGone = current.status === "missing" || (await isCanonicalDaemonRecordOwnerProvenDead(current));
408
+ const [identity, health] = await Promise.all([
409
+ probeCanonicalDaemonIdentity(info, deadline.signal),
410
+ probeCanonicalDaemonHealth(info, deadline.signal),
411
+ ]);
412
+ assertTakeoverDeadline(deadline, "Canonical daemon retained its generation after accepting takeover");
413
+ if (recordOwnerGone && identity === null && health === null)
414
+ return;
415
+ await waitForTakeoverPoll(deadline);
298
416
  }
299
- catch {
300
- // Already gone or not ours.
417
+ throwTakeoverTimeout("Canonical daemon retained its generation after accepting takeover");
418
+ }
419
+ async function acquireCanonicalDaemonClaimAfterTakeover(info, deadline) {
420
+ while (!deadline.signal.aborted) {
421
+ const current = inspectCanonicalDaemonInfo();
422
+ if (current.status === "valid" && !sameCanonicalInstance(current.info, info)) {
423
+ throw new DaemonStartupError("Another daemon generation won the takeover race", "canonical_already_running");
424
+ }
425
+ const attempt = tryAcquireCanonicalDaemonClaim();
426
+ if (attempt.status === "acquired") {
427
+ try {
428
+ await waitForTakeoverQuiescence(info, deadline);
429
+ return attempt.claim;
430
+ }
431
+ catch (error) {
432
+ releaseCanonicalDaemonClaim(attempt.claim);
433
+ throw error;
434
+ }
435
+ }
436
+ if (attempt.status === "invalid") {
437
+ throw new DaemonStartupError(`Canonical daemon claim is invalid: ${attempt.detail}`, "canonical_record_invalid");
438
+ }
439
+ await waitForTakeoverPoll(deadline);
301
440
  }
302
- clearCanonicalDaemonInfo();
441
+ throwTakeoverTimeout("Canonical daemon did not release its startup claim after accepting takeover");
442
+ }
443
+ function acquireCanonicalDaemonClaim() {
444
+ const attempt = tryAcquireCanonicalDaemonClaim();
445
+ if (attempt.status === "busy") {
446
+ throw new DaemonStartupError(`Canonical daemon startup is owned by PID ${attempt.owner.pid}`, "canonical_claim_busy");
447
+ }
448
+ if (attempt.status === "invalid") {
449
+ throw new DaemonStartupError(`Canonical daemon claim is invalid: ${attempt.detail}`, "canonical_record_invalid");
450
+ }
451
+ return attempt.claim;
303
452
  }
304
453
  function closeWsGoingAway(ws) {
305
454
  const reason = Buffer.from("going away");
@@ -314,20 +463,22 @@ function closeWsGoingAway(ws) {
314
463
  }
315
464
  ws.close(1001, reason);
316
465
  }
317
- async function startHttpServer({ sessionName, requestedPort, bindHostname, dir, authToken, localBypassToken, silent, }) {
466
+ async function startHttpServer({ sessionName, requestedPort, bindHostname, dir, authToken, localBypassToken, silent, readProjectAuth, daemonIdentity, workspacePaneCreationBackend, workspaceOpenBackend, workspaceOpenHandoffBackend, fleetLifecycleBackend, workspacePromotionBackend, appWindowMutationBackend, workspaceMultiplexerBackend, workspaceRegistry, terminalInventoryRuntime, getTerminalAttachmentRuntime, peekTerminalAttachmentRuntime, paneStreamRuntime, catalogLiveSessions, catalogFleet, sessionRuntimeRegistry, }) {
318
467
  const { createApp } = await import("../command-center/server.js");
319
468
  const { getRequestListener } = await import(__rewriteRelativeImportExtension(requireFromHere.resolve("@hono/node-server"), true));
320
469
  const { AuthService } = await import("./auth/auth-service.js");
321
470
  const { AuthConfigSchema } = await import("./auth/types.js");
322
471
  let authConfig = AuthConfigSchema.parse({});
323
- try {
324
- const { readConfig } = await import("./yaml-io.js");
325
- const { config } = readConfig(dir);
326
- if (config.auth)
327
- authConfig = AuthConfigSchema.parse(config.auth);
328
- }
329
- catch {
330
- // Config not readable — use defaults.
472
+ if (readProjectAuth !== false) {
473
+ try {
474
+ const { resolveConfig } = await import("./resolved-config.js");
475
+ const { launchConfig } = await resolveConfig(dir);
476
+ if (launchConfig?.auth)
477
+ authConfig = AuthConfigSchema.parse(launchConfig.auth);
478
+ }
479
+ catch {
480
+ // Config not readable — use defaults.
481
+ }
331
482
  }
332
483
  const authService = new AuthService(authConfig.secret);
333
484
  const app = createApp({
@@ -337,55 +488,119 @@ async function startHttpServer({ sessionName, requestedPort, bindHostname, dir,
337
488
  bindHostname,
338
489
  token: authToken ?? null,
339
490
  localBypassToken: localBypassToken ?? null,
491
+ ownerToken: localBypassToken ?? null,
492
+ },
493
+ daemonIdentity,
494
+ workspacePaneCreationBackend,
495
+ workspaceOpenBackend,
496
+ workspaceOpenHandoffBackend,
497
+ fleetLifecycleBackend,
498
+ workspacePromotionBackend,
499
+ appWindowMutationBackend,
500
+ // Named in this function's parameter type since the verb routes shipped and
501
+ // never forwarded, so every multiplexer verb answered "not available from
502
+ // this daemon" in every real process. Only the in-test dispatcher, which is
503
+ // handed the authority directly, ever reached it.
504
+ workspaceMultiplexerBackend,
505
+ workspaceRegistry,
506
+ terminalAttachmentIssueBackend: {
507
+ issue: (request, context) => getTerminalAttachmentRuntime().admission.issue(request, context),
340
508
  },
509
+ paneStreamIssueBackend: paneStreamRuntime.coordinator,
510
+ applicationShellInventoryBackend: terminalInventoryRuntime,
511
+ startupReadinessAttachmentBackend: terminalInventoryRuntime,
512
+ catalogLiveSessions,
513
+ catalogFleet,
514
+ });
515
+ mountTerminalNativeBackingRoute(app, {
516
+ ownerToken: localBypassToken ?? null,
517
+ generation: daemonIdentity.instanceId,
518
+ resolveSession: (workspace) => workspaceRegistry.get(workspace)?.sessionName ?? null,
519
+ capture: (session, pane) => sessionRuntimeRegistry.captureNativeBacking(session, pane),
341
520
  });
342
521
  app.get("/api/daemon/health", (c) => {
343
- return c.json({ ok: true, session: sessionName });
522
+ return c.json({
523
+ ok: true,
524
+ session: sessionName,
525
+ compatibilityTerminalAttachmentRuntimeConstructed: peekTerminalAttachmentRuntime() !== null,
526
+ });
344
527
  });
345
528
  const server = createServer(getRequestListener(app.fetch));
346
529
  const sockets = new Set();
347
530
  server.on("connection", (socket) => {
348
531
  sockets.add(socket);
349
532
  socket.on("close", () => sockets.delete(socket));
533
+ // `upgrade` hands the raw TCP socket to our route boundaries. A route can
534
+ // deliberately decline an unrelated path, leaving no protocol-specific
535
+ // owner to observe a later peer reset. Keep error ownership at this common
536
+ // accepted-socket boundary so ECONNRESET is connection-local and can never
537
+ // terminate the canonical daemon during client/session teardown.
538
+ socket.on("error", () => sockets.delete(socket));
350
539
  });
351
540
  const { closeClients, closeServers: closeWsServers } = attachWebSockets(server, {
352
541
  authToken,
353
542
  localBypassToken,
354
543
  bindHostname,
544
+ daemonIdentity: DaemonInstanceIdentitySchemaZ.parse({
545
+ protocolVersion: DAEMON_WIRE_PROTOCOL_VERSION,
546
+ ...daemonIdentity,
547
+ }),
548
+ ownerToken: localBypassToken,
355
549
  });
356
- await new Promise((resolve, reject) => {
357
- const onError = (err) => {
358
- server.off("listening", onListening);
359
- if (err.code === "EADDRINUSE") {
360
- reject(new DaemonStartupError(`Port ${requestedPort} is already in use`, "port_in_use", {
361
- cause: err,
362
- }));
363
- }
364
- else {
365
- reject(new DaemonStartupError(`Failed to bind daemon on port ${requestedPort}`, "bind_failed", {
366
- cause: err,
367
- }));
368
- }
369
- };
370
- const onListening = () => {
371
- server.off("error", onError);
372
- if (!silent) {
373
- console.log(`[daemon] Command Center on http://${bindHostname}:${requestedPort} (session: ${sessionName})`);
374
- }
375
- resolve();
376
- };
377
- server.once("error", onError);
378
- server.once("listening", onListening);
379
- server.listen(requestedPort, bindHostname);
380
- });
550
+ const terminalAttachmentBoundary = attachTerminalAttachmentWebSocket(server, (create) => (create ? getTerminalAttachmentRuntime() : peekTerminalAttachmentRuntime())?.admission ??
551
+ null);
552
+ const paneStreamBoundary = attachPaneStreamWebSocket(server, paneStreamRuntime.coordinator);
553
+ try {
554
+ await new Promise((resolve, reject) => {
555
+ const onError = (err) => {
556
+ server.off("listening", onListening);
557
+ if (err.code === "EADDRINUSE") {
558
+ reject(new DaemonStartupError(`Port ${requestedPort} is already in use`, "port_in_use", {
559
+ cause: err,
560
+ }));
561
+ }
562
+ else {
563
+ reject(new DaemonStartupError(`Failed to bind daemon on port ${requestedPort}`, "bind_failed", { cause: err }));
564
+ }
565
+ };
566
+ const onListening = () => {
567
+ server.off("error", onError);
568
+ if (!silent) {
569
+ console.log(`[daemon] Command Center on http://${bindHostname}:${requestedPort} (session: ${sessionName})`);
570
+ }
571
+ resolve();
572
+ };
573
+ server.once("error", onError);
574
+ server.once("listening", onListening);
575
+ server.listen(requestedPort, bindHostname);
576
+ });
577
+ }
578
+ catch (error) {
579
+ await Promise.allSettled([
580
+ Promise.resolve().then(() => terminalAttachmentBoundary.close()),
581
+ Promise.resolve().then(() => paneStreamBoundary.close()),
582
+ Promise.resolve().then(() => closeClients()),
583
+ ...[...sockets].map((socket) => Promise.resolve().then(() => socket.destroy())),
584
+ ...(server.listening ? [waitForServerClose(server)] : []),
585
+ Promise.resolve().then(() => closeWsServers()),
586
+ ]);
587
+ throw error;
588
+ }
381
589
  return {
382
590
  server,
383
591
  sockets,
384
592
  closeClients,
385
593
  closeWsServers,
594
+ terminalAttachmentBoundary,
595
+ paneStreamBoundary,
386
596
  };
387
597
  }
388
598
  export async function startEmbeddedDaemon(opts) {
599
+ return opts.requestRestart
600
+ ? startEmbeddedDaemonGeneration(opts)
601
+ : startOwnedEmbeddedDaemon(opts, startEmbeddedDaemonGeneration);
602
+ }
603
+ async function startEmbeddedDaemonGeneration(opts) {
389
604
  const sessionName = opts.sessionName ?? EMBEDDED_SESSION_NAME;
390
605
  const sessionless = opts.sessionName == null;
391
606
  const appSettings = readAppSettings();
@@ -393,251 +608,745 @@ export async function startEmbeddedDaemon(opts) {
393
608
  ? appSettings.remoteAccess
394
609
  : null;
395
610
  const bindHostname = opts.bindHostname ?? opts.hostname ?? (persistedRemoteAccess ? "0.0.0.0" : DEFAULT_HOSTNAME);
396
- const authToken = opts.authToken ?? persistedRemoteAccess?.token ?? null;
611
+ // Explicit null means "no auth". This is important for the native app's
612
+ // loopback-only `tmux-ide --headless` child: persisted remote-access settings
613
+ // must not silently change the process contract it requested.
614
+ const authToken = Object.prototype.hasOwnProperty.call(opts, "authToken")
615
+ ? (opts.authToken ?? null)
616
+ : (persistedRemoteAccess?.token ?? null);
397
617
  const localBypassToken = opts.localBypassToken ?? generateLocalBypassToken();
398
- const existingCanonical = readCanonicalDaemonInfo();
399
- if (existingCanonical) {
400
- if (await isCanonicalDaemonAlive(existingCanonical)) {
401
- if (opts.takeoverIfRunning) {
402
- await takeoverCanonicalDaemon(existingCanonical);
618
+ let claim;
619
+ if (opts.takeoverIfRunning) {
620
+ const state = inspectCanonicalDaemonInfo();
621
+ if (state.status === "valid" && (await isCanonicalDaemonAlive(state.info))) {
622
+ const takeoverDeadline = createTakeoverDeadline(takeoverTimeoutMs());
623
+ try {
624
+ await requestValidatedDaemonShutdown(state.info, takeoverDeadline);
625
+ claim = await acquireCanonicalDaemonClaimAfterTakeover(state.info, takeoverDeadline);
403
626
  }
404
- else {
405
- throw new DaemonStartupError(`Canonical daemon is already running on port ${existingCanonical.port}`, "canonical_already_running");
627
+ finally {
628
+ takeoverDeadline.dispose();
406
629
  }
407
630
  }
408
631
  else {
409
- clearCanonicalDaemonInfo();
632
+ claim = acquireCanonicalDaemonClaim();
410
633
  }
411
634
  }
412
- if (!sessionless)
413
- assertTmuxSession(sessionName);
414
- const port = opts.port ?? (await pickFreePort(bindHostname));
415
- validatePort(port);
416
- const dir = process.cwd();
417
- // Workspace registry: load + reconcile against live tmux sessions on
418
- // startup. Backwards-compat: if TMUX_IDE_SESSION is set, auto-add it as
419
- // a workspace so legacy single-session callers (pre-T068) keep working.
420
- // The registry is the source of truth for /api/project/:name lookups.
421
- const workspaceRegistry = getDefaultWorkspaceRegistry();
422
- await workspaceRegistry.load();
423
- const legacySession = process.env.TMUX_IDE_SESSION;
424
- if (legacySession && !workspaceRegistry.has(legacySession)) {
425
- try {
426
- workspaceRegistry.add({
427
- name: legacySession,
428
- sessionName: legacySession,
429
- projectDir: dir,
430
- });
431
- }
432
- catch {
433
- // Already added or persistence failed; non-fatal.
434
- }
635
+ else {
636
+ claim = acquireCanonicalDaemonClaim();
435
637
  }
436
- // Also register the explicit sessionName when the daemon is launched
437
- // against a specific tmux session (e.g. `node daemon.ts new-name 6060`).
438
- // Without this the operator has to POST /api/workspaces by hand before
439
- // /api/sessions / /api/project/:name return anything — which was the
440
- // dashboard's "terminal not connecting" symptom before this fix.
441
- if (!sessionless &&
442
- sessionName !== EMBEDDED_SESSION_NAME &&
443
- !workspaceRegistry.has(sessionName)) {
444
- try {
445
- workspaceRegistry.add({
446
- name: sessionName,
447
- sessionName,
448
- projectDir: dir,
449
- });
450
- }
451
- catch {
452
- // Already added or persistence failed; non-fatal.
638
+ try {
639
+ const existingCanonical = inspectCanonicalDaemonInfo();
640
+ if (existingCanonical.status === "invalid") {
641
+ if (await isCanonicalDaemonRecordOwnerProvenDead(existingCanonical)) {
642
+ if (!clearCanonicalDaemonInfoIfUnchanged(existingCanonical, claim)) {
643
+ throw new DaemonStartupError("Canonical daemon metadata changed while stale state was being removed", "canonical_record_invalid");
644
+ }
645
+ }
646
+ else {
647
+ throw new DaemonStartupError(`Canonical daemon metadata is ${existingCanonical.reason}: ${existingCanonical.detail}. ` +
648
+ "Refusing to start another owner.", "canonical_record_invalid");
649
+ }
453
650
  }
454
- }
455
- const { server, sockets, closeClients, closeWsServers } = await startHttpServer({
456
- sessionName,
457
- requestedPort: port,
458
- bindHostname,
459
- dir,
460
- authToken,
461
- localBypassToken,
462
- silent: opts.silent,
463
- });
464
- const pkg = requireFromHere("../../package.json");
465
- writeCanonicalDaemonInfo({
466
- pid: process.pid,
467
- port,
468
- version: pkg.version ?? "0.0.0",
469
- startedAt: new Date().toISOString(),
470
- bindHostname,
471
- authToken,
472
- });
473
- let lastState = "";
474
- let stopped = false;
475
- let stopping = null;
476
- let stopSelf = null;
477
- const activeProjectStops = new Map();
478
- // Track active projects so the session-control surface can open/close
479
- // them. Orchestration moved out of tmux-ide (agent coordination lives in
480
- // sfora.ai), so activation is now bookkeeping only.
481
- const activateProjectOnDaemon = async (projectName, _options = {}) => {
482
- if (!activeProjectStops.has(projectName)) {
483
- activeProjectStops.set(projectName, { stop: () => undefined });
651
+ else if (existingCanonical.status === "valid") {
652
+ if (await isCanonicalDaemonAlive(existingCanonical.info)) {
653
+ throw new DaemonStartupError(`Canonical daemon is already running on port ${existingCanonical.info.port}`, "canonical_already_running");
654
+ }
655
+ else {
656
+ if (!clearCanonicalDaemonInfoIfUnchanged(existingCanonical, claim)) {
657
+ throw new DaemonStartupError("Canonical daemon metadata changed while stale state was being removed", "canonical_already_running");
658
+ }
659
+ }
484
660
  }
485
- return {
486
- stop: async () => {
487
- const current = activeProjectStops.get(projectName);
488
- if (!current)
489
- return;
490
- activeProjectStops.delete(projectName);
491
- current.stop();
492
- },
493
- };
494
- };
495
- setActivationBackend({
496
- activateProject: async (name, options) => {
497
- await activateProjectOnDaemon(name, options);
498
- },
499
- deactivateProject: async (name) => {
500
- const stop = activeProjectStops.get(name);
501
- if (!stop)
502
- return;
503
- activeProjectStops.delete(name);
504
- stop.stop();
505
- },
506
- });
507
- const tick = () => {
508
- if (sessionless)
509
- return;
510
- const session = sessionExists(sessionName);
511
- if (session === "no") {
512
- stopSelf?.();
513
- return;
661
+ // Resolve both tmux selectors before any state read. Registry discovery,
662
+ // explicit-session validation, catalog reads and later mutations must all
663
+ // observe one daemon-generation authority rather than whichever server a
664
+ // caller's ambient TMUX/PATH happens to select.
665
+ const tmuxAuthority = resolveWorkspacePaneTmuxAuthority();
666
+ const catalogTmuxRunner = createPinnedWorkspaceTmuxRunner(tmuxAuthority);
667
+ const fleetFactsTmuxRunner = createPinnedWorkspaceTmuxAsyncRunner(tmuxAuthority);
668
+ const tmuxAuthorityReplaced = createTmuxAuthorityReplacementProbe(tmuxAuthority, catalogTmuxRunner);
669
+ const registryTmuxRunner = createPinnedWorkspaceTmuxRunner(tmuxAuthority, {
670
+ timeoutMs: WORKSPACE_REGISTRY_TMUX_TIMEOUT_MS,
671
+ });
672
+ if (!sessionless)
673
+ assertTmuxSession(sessionName, catalogTmuxRunner);
674
+ const port = opts.port ?? (await pickFreePort(bindHostname));
675
+ validatePort(port);
676
+ const dir = process.cwd();
677
+ const productVersion = resolveDaemonProductVersion(opts.productVersion);
678
+ const instanceId = randomUUID();
679
+ const startedAt = new Date().toISOString();
680
+ // Stable across restarts, unlike the per-process nonce above; minted once
681
+ // per daemon state home and re-minted only if its record disappears.
682
+ const environmentId = readOrMintEnvironmentId();
683
+ // Workspace registry: load + reconcile against live tmux sessions on
684
+ // startup. Backwards-compat: if TMUX_IDE_SESSION is set, auto-add it as
685
+ // a workspace so legacy single-session callers (pre-T068) keep working.
686
+ // The registry is the source of truth for /api/project/:name lookups.
687
+ const workspaceRegistry = getDefaultWorkspaceRegistry();
688
+ await workspaceRegistry.load(() => readWorkspaceRegistrySessionInventory(registryTmuxRunner));
689
+ const paneSourceCredentials = new PaneSourceCredentialAuthority({
690
+ run: (args) => tmuxSilent(...args),
691
+ runAsync: (args, signal) => execTmuxAsync(args, signal),
692
+ });
693
+ const legacySession = process.env.TMUX_IDE_SESSION;
694
+ if (legacySession && !workspaceRegistry.has(legacySession)) {
695
+ try {
696
+ workspaceRegistry.add({
697
+ name: legacySession,
698
+ sessionName: legacySession,
699
+ projectDir: dir,
700
+ });
701
+ }
702
+ catch {
703
+ // Already added or persistence failed; non-fatal.
704
+ }
514
705
  }
515
- if (session === "unknown") {
516
- // Transient spawn failure — skip this tick rather than self-destruct.
517
- return;
706
+ // Also register the explicit sessionName when the daemon is launched
707
+ // against a specific tmux session (e.g. `node daemon.ts new-name 6060`).
708
+ // Without this the operator has to POST /api/workspaces by hand before
709
+ // /api/sessions / /api/project/:name return anything — which was the
710
+ // dashboard's "terminal not connecting" symptom before this fix.
711
+ if (!sessionless &&
712
+ sessionName !== EMBEDDED_SESSION_NAME &&
713
+ !workspaceRegistry.has(sessionName)) {
714
+ try {
715
+ workspaceRegistry.add({
716
+ name: sessionName,
717
+ sessionName,
718
+ projectDir: dir,
719
+ });
720
+ }
721
+ catch {
722
+ // Already added or persistence failed; non-fatal.
723
+ }
518
724
  }
519
- if (!hasClients())
520
- return;
521
- const panes = listPanes(sessionName);
522
- if (panes.length === 0)
523
- return;
524
- const portPanes = computePortPanes(panes);
525
- const agentStates = computeAgentStates(panes);
526
- const stateKey = panes
527
- .map((pane) => {
528
- const portState = portPanes.has(pane.id) ? "1" : "0";
529
- const agent = agentStates.get(pane.id) ?? "-";
530
- const titleDrift = pane.name && pane.title !== pane.name ? "d" : "ok";
531
- return `${pane.id}:${portState}:${agent}:${titleDrift}`;
532
- })
533
- .join("|");
534
- if (stateKey === lastState)
535
- return;
536
- for (const pane of panes) {
537
- const hasPort = portPanes.has(pane.id) ? "1" : "0";
538
- const agent = agentStates.get(pane.id);
539
- tmuxSilent("set-option", "-pqt", pane.id, "@has_port", hasPort);
540
- tmuxSilent("set-option", "-pqt", pane.id, "@agent_busy", agent === "busy" ? "1" : "0");
541
- tmuxSilent("set-option", "-pqt", pane.id, "@agent_idle", agent === "idle" ? "1" : "0");
542
- if (pane.name && pane.title !== pane.name) {
543
- tmuxSilent("select-pane", "-t", pane.id, "-T", pane.name);
725
+ await reconcilePaneSourceCredentialsAtStartup(paneSourceCredentials, workspaceRegistry.list().map((workspace) => workspace.sessionName));
726
+ const workspacePaneCreation = new WorkspacePaneCreationAuthority({
727
+ daemonInstanceId: instanceId,
728
+ registry: workspaceRegistry,
729
+ tmuxAuthority,
730
+ });
731
+ const workspaceOpen = new WorkspaceOpenAuthority({
732
+ daemonInstanceId: instanceId,
733
+ registry: workspaceRegistry,
734
+ tmuxAuthority,
735
+ });
736
+ const workspacePromotion = new WorkspacePromotionAuthority({
737
+ daemonInstanceId: instanceId,
738
+ registry: workspaceRegistry,
739
+ tmuxAuthority,
740
+ });
741
+ if (opts.restoreTmuxWorkspaces) {
742
+ for (const workspace of workspaceRegistry.list()) {
743
+ await workspacePromotion.promote({
744
+ expectedDaemonInstanceId: instanceId,
745
+ operationId: randomUUID(),
746
+ intent: { sessionId: fleetSessionIdForName(workspace.sessionName) },
747
+ });
544
748
  }
545
749
  }
546
- tmuxSilent("refresh-client", "-S");
547
- lastState = stateKey;
548
- };
549
- const monitorInterval = setInterval(tick, MONITOR_INTERVAL_MS);
550
- const apiBaseUrl = `http://${bindHostname}:${port}`;
551
- const wsUrl = `ws://${bindHostname}:${port}/ws/events`;
552
- const handle = {
553
- port,
554
- apiBaseUrl,
555
- wsUrl,
556
- localBypassToken,
557
- stop: async ({ gracefulMs = DEFAULT_GRACEFUL_MS } = {}) => {
558
- if (stopped)
559
- return;
560
- if (stopping)
561
- return stopping;
562
- stopping = (async () => {
563
- try {
564
- stopped = true;
565
- setActivationBackend(null);
566
- clearInterval(monitorInterval);
567
- const closePromise = waitForServerClose(server);
568
- closeClients();
569
- for (const stop of activeProjectStops.values()) {
570
- stop.stop();
571
- }
572
- activeProjectStops.clear();
573
- shutdownPtyBridges();
574
- await Promise.race([closePromise, delay(gracefulMs)]);
575
- for (const socket of sockets)
576
- socket.destroy();
577
- await Promise.race([closePromise.catch(() => undefined), delay(100)]);
578
- await closeWsServers();
579
- setRemoteAccessRestartBackend(null);
580
- setDaemonShutdownBackend(null);
581
- }
582
- catch (err) {
583
- throw new DaemonShutdownError("Daemon shutdown failed", { cause: err });
584
- }
585
- finally {
586
- clearCanonicalDaemonInfo();
750
+ const fleetLifecycle = new FleetLifecycleAuthority({
751
+ daemonInstanceId: instanceId,
752
+ productVersion,
753
+ startedAt,
754
+ registry: workspaceRegistry,
755
+ runTmux: catalogTmuxRunner,
756
+ readFleet: () => readAdoptedFleet(workspaceRegistry, catalogTmuxRunner),
757
+ });
758
+ const appWindowMutation = new AppWindowMutationAuthority({
759
+ daemonInstanceId: instanceId,
760
+ registry: workspaceRegistry,
761
+ });
762
+ const workspaceMultiplexer = new WorkspaceMultiplexerAuthority({
763
+ daemonInstanceId: instanceId,
764
+ registry: workspaceRegistry,
765
+ tmuxAuthority,
766
+ });
767
+ let sessionRuntimeRegistry = null;
768
+ let workspaceOpenHandoff = null;
769
+ let terminalInventoryRuntime = null;
770
+ const externalInteractionObserver = new TmuxExternalInteractionObserver({
771
+ daemonInstanceId: instanceId,
772
+ internalReadOwnerToken: localBypassToken,
773
+ registry: workspaceRegistry,
774
+ tmuxAuthority,
775
+ onObserved: ({ workspaceName, semanticPaneId, operationKind, operationId }) => {
776
+ if (operationKind !== "workspace.pane.read")
777
+ terminalInventoryRuntime?.invalidate();
778
+ if (operationId) {
779
+ const consumed = sessionRuntimeRegistry?.observeTmuxInteraction({
780
+ operationId,
781
+ workspaceName,
782
+ semanticPaneId,
783
+ operationKind,
784
+ }) ?? false;
785
+ if (consumed)
786
+ return true;
587
787
  }
588
- })();
589
- return stopping;
590
- },
591
- activateProject: activateProjectOnDaemon,
592
- };
593
- setDaemonShutdownBackend(async () => {
594
- await handle.stop({ gracefulMs: 500 });
595
- });
596
- setRemoteAccessRestartBackend((request) => {
597
- setTimeout(() => {
598
- void (async () => {
599
- const restartPort = request.port ?? port;
600
788
  try {
601
- await handle.stop({ gracefulMs: 500 });
789
+ broadcastInteractionReceipt({
790
+ operationId: randomUUID(),
791
+ origin: "external",
792
+ workspaceName,
793
+ target: { kind: "pane", semanticPaneId },
794
+ operationKind,
795
+ phase: "observed",
796
+ summary: operationKind === "workspace.pane.read"
797
+ ? { operationKind, observedOnly: true }
798
+ : { operationKind, observedOnly: true },
799
+ proof: { operationKind, observed: true, semanticPaneId },
800
+ }, instanceId);
602
801
  }
603
- catch (err) {
604
- console.error("[daemon] Remote access stop before restart failed:", err);
802
+ catch (error) {
803
+ if (!opts.silent)
804
+ console.error("[daemon] External interaction receipt failed:", error);
605
805
  }
606
- finally {
607
- clearCanonicalDaemonInfo();
806
+ return false;
807
+ },
808
+ });
809
+ let terminalAttachmentRuntime = null;
810
+ let paneStreamRuntime = null;
811
+ let runtimeTraceStream = null;
812
+ const closeRuntimeTraceStream = async () => {
813
+ externalInteractionObserver.setDiagnostics(null);
814
+ setFleetFactsObserverDiagnostics(null);
815
+ const stream = runtimeTraceStream;
816
+ runtimeTraceStream = null;
817
+ if (!stream || stream.closed || stream.destroyed)
818
+ return;
819
+ await new Promise((resolve) => stream.end(resolve));
820
+ };
821
+ let startedServer;
822
+ try {
823
+ const selector = tmuxAuthority.socketSelector;
824
+ const executeRuntimeIntent = (operationId, intent, timing) => {
825
+ if (intent.verb === "workspace.pane.read") {
826
+ workspaceMultiplexer.readPane(operationId, intent);
827
+ return;
608
828
  }
609
- for (let attempt = 0; attempt < 2; attempt++) {
829
+ return workspaceMultiplexer.mutate({ operationId, expectedDaemonInstanceId: instanceId, intent }, timing);
830
+ };
831
+ const runtimeTracePath = process.env.TMUX_IDE_SESSION_RUNTIME_TRACE_LOG;
832
+ runtimeTraceStream = runtimeTracePath
833
+ ? createWriteStream(runtimeTracePath, { flags: "a", highWaterMark: 64 * 1_024 })
834
+ : null;
835
+ let runtimeTraceSaturated = false;
836
+ runtimeTraceStream?.on("error", () => {
837
+ runtimeTraceSaturated = true;
838
+ });
839
+ runtimeTraceStream?.on("drain", () => {
840
+ runtimeTraceSaturated = false;
841
+ });
842
+ const runtimeObservability = runtimeTracePath
843
+ ? createSessionRuntimeObservability({
844
+ // The JSONL stream is the qualifying record. Keep only a small
845
+ // in-memory diagnostic tail so a sustained terminal flood cannot
846
+ // retain tens of thousands of frozen span objects or induce GC
847
+ // pauses on the daemon's input/output event loop.
848
+ capacity: 1_024,
849
+ onSpan: (span) => {
850
+ if (!runtimeTraceStream || runtimeTraceSaturated)
851
+ return;
852
+ runtimeTraceSaturated = !runtimeTraceStream.write(`${JSON.stringify({ version: 1, type: "performance.stage", ...span })}\n`);
853
+ },
854
+ })
855
+ : undefined;
856
+ if (runtimeTracePath) {
857
+ const publishObserverDiagnostic = (event) => {
858
+ try {
859
+ if (!runtimeTraceStream || runtimeTraceSaturated)
860
+ return;
861
+ runtimeTraceSaturated = !runtimeTraceStream.write(`${JSON.stringify({
862
+ version: 1,
863
+ type: "performance.daemon-observer",
864
+ ...event,
865
+ generation: instanceId,
866
+ })}\n`);
867
+ }
868
+ catch {
869
+ // Qualification diagnostics never alter daemon observation.
870
+ }
871
+ };
872
+ const diagnostics = {
873
+ nowMicros: () => Math.floor(performance.now() * 1_000),
874
+ createTraceId: randomUUID,
875
+ publish: publishObserverDiagnostic,
876
+ };
877
+ externalInteractionObserver.setDiagnostics(diagnostics);
878
+ setFleetFactsObserverDiagnostics(diagnostics);
879
+ }
880
+ sessionRuntimeRegistry = new SessionRuntimeRegistry({
881
+ generation: instanceId,
882
+ ...(runtimeObservability ? { observability: runtimeObservability } : {}),
883
+ semanticMutations: {
884
+ resolveSession: (workspaceName) => workspaceRegistry.get(workspaceName)?.sessionName ?? null,
885
+ execute: executeRuntimeIntent,
886
+ traceAuthority: { generation: instanceId, incarnation: null },
887
+ publishReceipt: (receipt) => broadcastInteractionReceipt(receipt, instanceId),
888
+ publishResourceChange: (change) => broadcastResourceChanged(change, instanceId),
889
+ },
890
+ mirror: {
891
+ executable: tmuxAuthority.executablePath,
892
+ resolveSocketPath: () => catalogTmuxRunner(["display-message", "-p", "#{socket_path}"]),
893
+ internalReadHookEmission: (runtimePaneId, marker) => externalInteractionObserver.internalReadHookEmission(runtimePaneId, marker),
894
+ ...(selector.kind === "path" ? { socketPath: selector.path } : {}),
895
+ ...(selector.kind === "name" && selector.name !== "default"
896
+ ? { socketName: selector.name }
897
+ : {}),
898
+ },
899
+ });
900
+ workspaceOpenHandoff = new WorkspaceOpenHandoffCoordinator({
901
+ daemonInstanceId: instanceId,
902
+ openProject: (request) => workspaceOpen.open(request),
903
+ adoptLiveSession: (request) => workspacePromotion.promote(request),
904
+ prewarmPrevious: async (workspaceName) => {
905
+ const record = workspaceRegistry.get(workspaceName);
906
+ if (record)
907
+ await sessionRuntimeRegistry.prewarmSession(record.sessionName);
908
+ },
909
+ prepareRuntime: async (workspaceName, preferredPaneId) => {
910
+ const record = workspaceRegistry.get(workspaceName);
911
+ if (!record)
912
+ throw new Error(`Prepared workspace ${workspaceName} is absent from the durable catalog.`);
913
+ await sessionRuntimeRegistry.prewarmSession(record.sessionName);
914
+ const consumer = sessionRuntimeRegistry.connect(record.sessionName, "workspace-open-prepare", `workspace-open-${randomUUID()}`);
610
915
  try {
611
- const nextHandle = await startEmbeddedDaemon({
612
- sessionName: sessionless ? undefined : sessionName,
613
- port: restartPort,
614
- bindHostname: request.bindHostname,
615
- authToken: request.token,
616
- localBypassToken,
916
+ const layout = await consumer.describe();
917
+ if (layout.degraded || layout.panes.length === 0) {
918
+ throw new Error(`Prepared workspace ${workspaceName} has no coherent semantic layout.`);
919
+ }
920
+ const semanticPaneId = layout.panes.find((pane) => pane.semanticPaneId === preferredPaneId)
921
+ ?.semanticPaneId ??
922
+ layout.panes.find((pane) => pane.active)?.semanticPaneId ??
923
+ layout.panes[0].semanticPaneId;
924
+ const seed = await new Promise((resolve, reject) => {
925
+ const timeout = setTimeout(() => reject(new Error("Timed out awaiting first coherent terminal seed.")), 5_000);
926
+ void consumer
927
+ .subscribeReplica(semanticPaneId, (update) => {
928
+ if (update.type !== "terminal.seed")
929
+ return;
930
+ clearTimeout(timeout);
931
+ resolve({ revision: update.revision, stateHash: update.stateHash });
932
+ })
933
+ .catch((error) => {
934
+ clearTimeout(timeout);
935
+ reject(error);
936
+ });
617
937
  });
618
- const mutableHandle = handle;
619
- mutableHandle.stop = nextHandle.stop;
620
- mutableHandle.activateProject = nextHandle.activateProject;
938
+ return {
939
+ semanticPaneId,
940
+ paneCount: layout.panes.length,
941
+ terminalRevision: seed.revision,
942
+ terminalStateHash: seed.stateHash,
943
+ };
944
+ }
945
+ finally {
946
+ await consumer.close();
947
+ }
948
+ },
949
+ });
950
+ const terminalRuntimeOptions = {
951
+ registry: workspaceRegistry,
952
+ sessionRuntimeRegistry,
953
+ tmuxAuthority: {
954
+ executablePath: tmuxAuthority.executablePath,
955
+ socketSelector: tmuxAuthority.socketSelector,
956
+ trustedCwd: dir,
957
+ ...(tmuxAuthority.socketSelector.kind === "name"
958
+ ? {
959
+ namedSocketFence: createNamedSocketFence(tmuxAuthority, tmuxAuthority.executablePath, { TERM: "xterm-256color" }),
960
+ }
961
+ : {}),
962
+ },
963
+ agentStatusProbeFactory: ({ run }) => createTmuxAgentStatusProbe({ run }),
964
+ onInventory: (snapshot) => workspaceMultiplexer.adoptPaneInventory(snapshot.panes),
965
+ onSessionInventory: (sessionName, snapshot) => workspaceMultiplexer.adoptSessionPaneInventory(sessionName, snapshot?.panes ?? []),
966
+ ...(runtimeObservability ? { observability: runtimeObservability } : {}),
967
+ };
968
+ terminalInventoryRuntime = new WorkspaceTerminalInventoryRuntime(terminalRuntimeOptions);
969
+ // Reconcile only cryptographically marked legacy view sessions before
970
+ // publishing this daemon generation. This neutral cleanup does not
971
+ // construct PTYs, attachment leases, or admission.
972
+ await terminalInventoryRuntime.whenReady();
973
+ const getTerminalAttachmentRuntime = () => {
974
+ if (terminalAttachmentRuntime)
975
+ return terminalAttachmentRuntime;
976
+ terminalAttachmentRuntime = createNativeTerminalAttachmentRuntime({
977
+ daemonInstanceId: instanceId,
978
+ webSocketUrl: terminalAttachmentWebSocketUrl(bindHostname, port),
979
+ ...terminalRuntimeOptions,
980
+ inventoryRuntime: terminalInventoryRuntime,
981
+ });
982
+ void terminalAttachmentRuntime.whenReady().catch(() => undefined);
983
+ return terminalAttachmentRuntime;
984
+ };
985
+ const peekTerminalAttachmentRuntime = () => terminalAttachmentRuntime;
986
+ paneStreamRuntime = createPaneStreamRuntime({
987
+ daemonInstanceId: instanceId,
988
+ webSocketUrl: paneStreamWebSocketUrl(bindHostname, port),
989
+ sessionRuntimeRegistry,
990
+ semanticPaneCatalog: terminalInventoryRuntime.semanticPaneCatalog,
991
+ ...(runtimeObservability ? { observability: runtimeObservability } : {}),
992
+ });
993
+ const orderedMultiplexerBackend = createSessionRuntimeMultiplexerBackend({
994
+ registry: sessionRuntimeRegistry,
995
+ resolveSession: (workspaceName) => workspaceRegistry.get(workspaceName)?.sessionName ?? null,
996
+ resolvePaneSourceCredential: (credential, resolvedSession, claimedSource) => paneSourceCredentials.resolve(credential, resolvedSession, claimedSource),
997
+ });
998
+ await externalInteractionObserver.start();
999
+ setFleetFactsTmuxRunner(fleetFactsTmuxRunner);
1000
+ startedServer = await startHttpServer({
1001
+ sessionName,
1002
+ requestedPort: port,
1003
+ bindHostname,
1004
+ dir,
1005
+ authToken,
1006
+ localBypassToken,
1007
+ silent: opts.silent,
1008
+ readProjectAuth: !sessionless,
1009
+ daemonIdentity: { productVersion, instanceId, startedAt, environmentId },
1010
+ workspacePaneCreationBackend: workspacePaneCreation,
1011
+ workspaceOpenBackend: workspaceOpen,
1012
+ workspaceOpenHandoffBackend: workspaceOpenHandoff,
1013
+ fleetLifecycleBackend: fleetLifecycle,
1014
+ workspacePromotionBackend: workspacePromotion,
1015
+ appWindowMutationBackend: appWindowMutation,
1016
+ workspaceMultiplexerBackend: orderedMultiplexerBackend,
1017
+ workspaceRegistry,
1018
+ terminalInventoryRuntime,
1019
+ getTerminalAttachmentRuntime,
1020
+ peekTerminalAttachmentRuntime,
1021
+ paneStreamRuntime,
1022
+ catalogLiveSessions: () => discoverLiveSessionSummaries(catalogTmuxRunner),
1023
+ catalogFleet: () => readAdoptedFleet(workspaceRegistry, catalogTmuxRunner),
1024
+ sessionRuntimeRegistry,
1025
+ });
1026
+ }
1027
+ catch (error) {
1028
+ setFleetFactsTmuxRunner(null);
1029
+ await Promise.allSettled([
1030
+ Promise.resolve().then(() => terminalAttachmentRuntime?.dispose()),
1031
+ Promise.resolve().then(() => terminalInventoryRuntime?.dispose()),
1032
+ paneStreamRuntime?.dispose() ?? Promise.resolve(),
1033
+ workspacePaneCreation.dispose(),
1034
+ workspaceOpen.dispose(),
1035
+ Promise.resolve().then(() => workspaceOpenHandoff?.dispose()),
1036
+ workspacePromotion.dispose(),
1037
+ appWindowMutation.dispose(),
1038
+ workspaceMultiplexer.dispose(),
1039
+ externalInteractionObserver.dispose(),
1040
+ closeRuntimeTraceStream(),
1041
+ ]);
1042
+ // The pane-stream coordinator may still hold runtime consumers while it
1043
+ // drains. Preserve the normal shutdown order on startup rollback too:
1044
+ // transports first, then the one session/control authority.
1045
+ await Promise.allSettled([sessionRuntimeRegistry?.dispose() ?? Promise.resolve()]);
1046
+ throw error;
1047
+ }
1048
+ const { server, sockets, closeClients, closeWsServers, terminalAttachmentBoundary, paneStreamBoundary, } = startedServer;
1049
+ const retirePaneStreamTransport = async () => {
1050
+ const transportResults = await Promise.allSettled([
1051
+ Promise.resolve().then(() => paneStreamRuntime.dispose()),
1052
+ Promise.resolve().then(() => paneStreamBoundary.close()),
1053
+ ]);
1054
+ const runtimeResults = await Promise.allSettled([
1055
+ Promise.resolve().then(() => sessionRuntimeRegistry.dispose()),
1056
+ ]);
1057
+ return [...transportResults, ...runtimeResults].flatMap((result) => result.status === "rejected" ? [result.reason] : []);
1058
+ };
1059
+ const abortStartedServer = async () => {
1060
+ setFleetFactsTmuxRunner(null);
1061
+ const terminalFailures = [
1062
+ ...(await retireTerminalAttachmentTransport(terminalAttachmentRuntime, terminalAttachmentBoundary)),
1063
+ ...(await retirePaneStreamTransport()),
1064
+ ];
1065
+ terminalInventoryRuntime.dispose();
1066
+ const paneDisposal = Promise.resolve().then(() => workspacePaneCreation.dispose());
1067
+ const workspaceOpenDisposal = Promise.resolve().then(() => workspaceOpen.dispose());
1068
+ const workspaceOpenHandoffDisposal = Promise.resolve().then(() => workspaceOpenHandoff?.dispose());
1069
+ const workspacePromotionDisposal = Promise.resolve().then(() => workspacePromotion.dispose());
1070
+ const appWindowMutationDisposal = Promise.resolve().then(() => appWindowMutation.dispose());
1071
+ const workspaceMultiplexerDisposal = Promise.resolve().then(() => workspaceMultiplexer.dispose());
1072
+ const externalInteractionDisposal = Promise.resolve().then(() => externalInteractionObserver.dispose());
1073
+ const closePromise = Promise.resolve()
1074
+ .then(() => waitForServerClose(server))
1075
+ .catch(() => undefined);
1076
+ await Promise.allSettled([
1077
+ paneDisposal,
1078
+ workspaceOpenDisposal,
1079
+ workspaceOpenHandoffDisposal,
1080
+ workspacePromotionDisposal,
1081
+ appWindowMutationDisposal,
1082
+ workspaceMultiplexerDisposal,
1083
+ externalInteractionDisposal,
1084
+ closeRuntimeTraceStream(),
1085
+ Promise.resolve().then(() => closeClients()),
1086
+ ...[...sockets].map((socket) => Promise.resolve().then(() => socket.destroy())),
1087
+ Promise.race([closePromise, delay(100)]),
1088
+ Promise.resolve().then(() => closeWsServers()),
1089
+ ]);
1090
+ if (terminalFailures.length > 0 && !opts.silent) {
1091
+ console.error("[daemon] Direct terminal startup rollback reported cleanup failures.");
1092
+ }
1093
+ };
1094
+ try {
1095
+ writeCanonicalDaemonInfo({
1096
+ pid: process.pid,
1097
+ port,
1098
+ protocolVersion: DAEMON_WIRE_PROTOCOL_VERSION,
1099
+ productVersion,
1100
+ instanceId,
1101
+ startedAt,
1102
+ environmentId,
1103
+ bindHostname,
1104
+ authToken: localBypassToken,
1105
+ }, claim);
1106
+ const published = inspectCanonicalDaemonInfo();
1107
+ if (published.status !== "valid" ||
1108
+ published.info.instanceId !== instanceId ||
1109
+ published.info.pid !== process.pid ||
1110
+ published.info.port !== port) {
1111
+ throw new DaemonStartupError("Canonical daemon publication does not belong to the started server", "canonical_publication_lost");
1112
+ }
1113
+ }
1114
+ catch (error) {
1115
+ await abortStartedServer();
1116
+ throw error;
1117
+ }
1118
+ let stopped = false;
1119
+ let stopping = null;
1120
+ let stopSelf = null;
1121
+ const activeProjectStops = new Map();
1122
+ // Track active projects so the session-control surface can open/close
1123
+ // them. Orchestration moved out of tmux-ide (agent coordination lives in
1124
+ // sfora.ai), so activation is now bookkeeping only.
1125
+ const activateProjectOnDaemon = async (projectName, _options = {}) => {
1126
+ if (!activeProjectStops.has(projectName)) {
1127
+ activeProjectStops.set(projectName, { stop: () => undefined });
1128
+ }
1129
+ return {
1130
+ stop: async () => {
1131
+ const current = activeProjectStops.get(projectName);
1132
+ if (!current)
621
1133
  return;
1134
+ activeProjectStops.delete(projectName);
1135
+ current.stop();
1136
+ },
1137
+ };
1138
+ };
1139
+ setActivationBackend({
1140
+ activateProject: async (name, options) => {
1141
+ await activateProjectOnDaemon(name, options);
1142
+ },
1143
+ deactivateProject: async (name) => {
1144
+ const stop = activeProjectStops.get(name);
1145
+ if (!stop)
1146
+ return;
1147
+ activeProjectStops.delete(name);
1148
+ stop.stop();
1149
+ },
1150
+ });
1151
+ const sessionMonitor = sessionless
1152
+ ? null
1153
+ : new DaemonSessionMonitor({
1154
+ sessionName,
1155
+ backend: {
1156
+ inspectSession: async (candidate, signal) => {
1157
+ try {
1158
+ await execTmuxAsync(["has-session", "-t", candidate], signal);
1159
+ return "yes";
1160
+ }
1161
+ catch (error) {
1162
+ if (signal.aborted)
1163
+ return "unknown";
1164
+ return classifySessionInspectionError(error);
1165
+ }
1166
+ },
1167
+ listCredentialSessions: () => workspaceRegistry.list().map((workspace) => workspace.sessionName),
1168
+ reconcileCredentials: async (workspaceSession, signal) => {
1169
+ try {
1170
+ await paneSourceCredentials.reconcileSessionAsync(workspaceSession, signal);
1171
+ }
1172
+ catch (error) {
1173
+ // Registry/session races are idempotent; transport/resource
1174
+ // failures must escape so this state is retried next cycle.
1175
+ if (!isConfirmedMissingTmuxTarget(error))
1176
+ throw error;
1177
+ }
1178
+ },
1179
+ hasClients: async (signal) => {
1180
+ try {
1181
+ return (await execTmuxAsync(["list-clients"], signal)).length > 0;
1182
+ }
1183
+ catch {
1184
+ return null;
1185
+ }
1186
+ },
1187
+ listPanes: async (candidate, signal) => {
1188
+ try {
1189
+ const raw = await execTmuxAsync([
1190
+ "list-panes",
1191
+ "-t",
1192
+ candidate,
1193
+ "-F",
1194
+ "#{pane_id}\t#{pane_pid}\t#{pane_current_command}\t#{pane_title}\t#{@ide_role}\t#{@ide_type}\t#{@ide_name}",
1195
+ ], signal);
1196
+ return parseDaemonMonitorPanes(raw);
1197
+ }
1198
+ catch {
1199
+ return null;
1200
+ }
1201
+ },
1202
+ readPortProcessFacts: async (signal) => {
1203
+ try {
1204
+ return await readPortProcessFactsAsync(signal);
1205
+ }
1206
+ catch {
1207
+ return null;
1208
+ }
1209
+ },
1210
+ setPaneOption: async (paneId, option, value, signal) => {
1211
+ try {
1212
+ await execTmuxAsync(["set-option", "-pt", paneId, option, value], signal);
1213
+ }
1214
+ catch (error) {
1215
+ if (!isConfirmedMissingTmuxTarget(error))
1216
+ throw error;
1217
+ }
1218
+ },
1219
+ setPaneTitle: async (paneId, title, signal) => {
1220
+ try {
1221
+ await execTmuxAsync(["select-pane", "-t", paneId, "-T", title], signal);
1222
+ }
1223
+ catch (error) {
1224
+ if (!isConfirmedMissingTmuxTarget(error))
1225
+ throw error;
1226
+ }
1227
+ },
1228
+ refreshClients: async (signal) => {
1229
+ try {
1230
+ await execTmuxAsync(["refresh-client", "-S"], signal);
1231
+ }
1232
+ catch (error) {
1233
+ if (!isConfirmedMissingTmuxTarget(error))
1234
+ throw error;
1235
+ }
1236
+ },
1237
+ onSessionGone: () => stopSelf?.(),
1238
+ },
1239
+ });
1240
+ sessionMonitor?.start();
1241
+ const apiBaseUrl = canonicalDaemonUrl("http", bindHostname, port);
1242
+ const wsUrl = canonicalDaemonUrl("ws", bindHostname, port, "/ws/events");
1243
+ const handle = {
1244
+ tmuxAuthorityReplaced,
1245
+ instanceId,
1246
+ pid: process.pid,
1247
+ port,
1248
+ apiBaseUrl,
1249
+ wsUrl,
1250
+ localBypassToken,
1251
+ compatibilityTerminalAttachmentRuntimeConstructed: () => terminalAttachmentRuntime !== null,
1252
+ stop: async ({ gracefulMs = DEFAULT_GRACEFUL_MS } = {}) => {
1253
+ if (stopping)
1254
+ return stopping;
1255
+ if (stopped)
1256
+ return;
1257
+ stopping = (async () => {
1258
+ const failures = [];
1259
+ const capture = async (operation) => {
1260
+ try {
1261
+ await operation();
1262
+ }
1263
+ catch (error) {
1264
+ failures.push(error);
1265
+ }
1266
+ };
1267
+ try {
1268
+ stopped = true;
1269
+ await capture(() => setActivationBackend(null));
1270
+ await capture(() => sessionMonitor?.stop());
1271
+ paneSourceCredentials.dispose();
1272
+ // Retire direct-ticket admission, live PTYs, and the direct upgrade
1273
+ // listener before touching the legacy WS or HTTP surfaces.
1274
+ failures.push(...(await retireTerminalAttachmentTransport(terminalAttachmentRuntime, terminalAttachmentBoundary)));
1275
+ failures.push(...(await retirePaneStreamTransport()));
1276
+ await capture(() => terminalInventoryRuntime.dispose());
1277
+ await capture(() => workspacePaneCreation.dispose());
1278
+ await capture(() => workspaceOpen.dispose());
1279
+ await capture(() => workspaceOpenHandoff?.dispose());
1280
+ await capture(() => workspacePromotion.dispose());
1281
+ await capture(() => appWindowMutation.dispose());
1282
+ await capture(() => workspaceMultiplexer.dispose());
1283
+ await capture(() => externalInteractionObserver.dispose());
1284
+ let closePromise;
1285
+ try {
1286
+ closePromise = waitForServerClose(server);
1287
+ }
1288
+ catch (error) {
1289
+ failures.push(error);
1290
+ closePromise = Promise.resolve();
1291
+ }
1292
+ await capture(() => closeClients());
1293
+ for (const stop of activeProjectStops.values()) {
1294
+ await capture(() => stop.stop());
1295
+ }
1296
+ activeProjectStops.clear();
1297
+ await capture(() => shutdownPtyBridges());
1298
+ await capture(() => Promise.race([closePromise, delay(gracefulMs)]));
1299
+ for (const socket of sockets) {
1300
+ await capture(() => {
1301
+ socket.destroy();
1302
+ });
1303
+ }
1304
+ await capture(() => Promise.race([closePromise, delay(100)]));
1305
+ await capture(() => closeWsServers());
1306
+ await capture(() => shutdownWsEventObservation());
1307
+ await capture(() => setFleetFactsTmuxRunner(null));
1308
+ await capture(() => closeRuntimeTraceStream());
1309
+ await capture(() => setRemoteAccessRestartBackend(null));
1310
+ await capture(() => setDaemonShutdownBackend(null));
1311
+ if (failures.length > 0) {
1312
+ const cause = failures.length === 1
1313
+ ? failures[0]
1314
+ : new AggregateError(failures, "Daemon resources reported shutdown failures");
1315
+ throw new DaemonShutdownError("Daemon shutdown failed", { cause: cause });
1316
+ }
622
1317
  }
623
- catch (err) {
624
- if (err instanceof DaemonStartupError &&
625
- err.reason === "port_in_use" &&
626
- attempt === 0) {
627
- await delay(150);
628
- continue;
1318
+ finally {
1319
+ try {
1320
+ clearCanonicalDaemonInfoIfOwned(instanceId, claim);
1321
+ }
1322
+ finally {
1323
+ releaseCanonicalDaemonClaim(claim);
629
1324
  }
630
- throw err;
631
1325
  }
632
- }
633
- })().catch((err) => {
634
- console.error("[daemon] Remote access restart failed:", err);
635
- clearCanonicalDaemonInfo();
636
- });
637
- }, 50).unref?.();
638
- return { port };
639
- });
640
- stopSelf = () => void handle.stop();
641
- tick();
642
- return handle;
1326
+ })();
1327
+ return stopping;
1328
+ },
1329
+ activateProject: activateProjectOnDaemon,
1330
+ };
1331
+ setDaemonShutdownBackend(async () => {
1332
+ await handle.stop({ gracefulMs: 500 });
1333
+ }, instanceId);
1334
+ setRemoteAccessRestartBackend((request) => {
1335
+ setTimeout(() => {
1336
+ void (async () => {
1337
+ await opts.requestRestart(request);
1338
+ })().catch((err) => {
1339
+ console.error("[daemon] Remote access restart failed:", err);
1340
+ });
1341
+ }, 50).unref?.();
1342
+ return { port };
1343
+ }, port);
1344
+ stopSelf = () => void handle.stop();
1345
+ void sessionMonitor?.runOnce();
1346
+ return handle;
1347
+ }
1348
+ catch (error) {
1349
+ releaseCanonicalDaemonClaim(claim);
1350
+ throw error;
1351
+ }
643
1352
  }