@dsh-cove/dsh-web-all 0.0.0-stage → 0.4.4

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 (900) hide show
  1. package/LICENSE +202 -0
  2. package/README.i18n.yaml +6 -0
  3. package/README.md +205 -2
  4. package/README.zh.md +205 -0
  5. package/cordis.patch.yml +59 -0
  6. package/lib/client.js +25413 -0
  7. package/lib/client.js.map +1 -0
  8. package/lib/index.js +20024 -0
  9. package/lib/invariant.js +6 -0
  10. package/lib/types/client/compat.d.ts +29 -0
  11. package/lib/types/client/compat.d.ts.map +1 -0
  12. package/lib/types/client/compat.js +69 -0
  13. package/lib/types/client/conversation/git-branch.d.ts +13 -0
  14. package/lib/types/client/conversation/git-branch.d.ts.map +1 -0
  15. package/lib/types/client/conversation/git-branch.js +121 -0
  16. package/lib/types/client/conversation/git-graph/api.d.ts +42 -0
  17. package/lib/types/client/conversation/git-graph/api.d.ts.map +1 -0
  18. package/lib/types/client/conversation/git-graph/api.js +72 -0
  19. package/lib/types/client/conversation/git-graph/branch-chip.d.ts +47 -0
  20. package/lib/types/client/conversation/git-graph/branch-chip.d.ts.map +1 -0
  21. package/lib/types/client/conversation/git-graph/branch-chip.js +268 -0
  22. package/lib/types/client/conversation/git-graph/branch-popover.d.ts +32 -0
  23. package/lib/types/client/conversation/git-graph/branch-popover.d.ts.map +1 -0
  24. package/lib/types/client/conversation/git-graph/branch-popover.js +108 -0
  25. package/lib/types/client/conversation/git-graph/chip.d.ts +24 -0
  26. package/lib/types/client/conversation/git-graph/chip.d.ts.map +1 -0
  27. package/lib/types/client/conversation/git-graph/chip.js +15 -0
  28. package/lib/types/client/conversation/git-graph/create-branch-dialog.d.ts +30 -0
  29. package/lib/types/client/conversation/git-graph/create-branch-dialog.d.ts.map +1 -0
  30. package/lib/types/client/conversation/git-graph/create-branch-dialog.js +52 -0
  31. package/lib/types/client/conversation/git-graph/error-copy.d.ts +17 -0
  32. package/lib/types/client/conversation/git-graph/error-copy.d.ts.map +1 -0
  33. package/lib/types/client/conversation/git-graph/error-copy.js +44 -0
  34. package/lib/types/client/conversation/git-graph/graph-dialog.d.ts +21 -0
  35. package/lib/types/client/conversation/git-graph/graph-dialog.d.ts.map +1 -0
  36. package/lib/types/client/conversation/git-graph/graph-dialog.js +112 -0
  37. package/lib/types/client/conversation/git-graph/hero-seat.d.ts +53 -0
  38. package/lib/types/client/conversation/git-graph/hero-seat.d.ts.map +1 -0
  39. package/lib/types/client/conversation/git-graph/hero-seat.js +54 -0
  40. package/lib/types/client/conversation/git-graph/locales.d.ts +88 -0
  41. package/lib/types/client/conversation/git-graph/locales.d.ts.map +1 -0
  42. package/lib/types/client/conversation/git-graph/locales.js +85 -0
  43. package/lib/types/client/conversation/git-graph/sse-leader.d.ts +37 -0
  44. package/lib/types/client/conversation/git-graph/sse-leader.d.ts.map +1 -0
  45. package/lib/types/client/conversation/git-graph/sse-leader.js +101 -0
  46. package/lib/types/client/conversation/index.d.ts +43 -0
  47. package/lib/types/client/conversation/index.d.ts.map +1 -0
  48. package/lib/types/client/conversation/index.js +39 -0
  49. package/lib/types/client/conversation/selector-context.d.ts +12 -0
  50. package/lib/types/client/conversation/selector-context.d.ts.map +1 -0
  51. package/lib/types/client/conversation/selector-context.js +11 -0
  52. package/lib/types/client/conversation/session-lane-chip.d.ts +72 -0
  53. package/lib/types/client/conversation/session-lane-chip.d.ts.map +1 -0
  54. package/lib/types/client/conversation/session-lane-chip.js +163 -0
  55. package/lib/types/client/conversation/session-lane-locales.d.ts +22 -0
  56. package/lib/types/client/conversation/session-lane-locales.d.ts.map +1 -0
  57. package/lib/types/client/conversation/session-lane-locales.js +29 -0
  58. package/lib/types/client/conversation/subagent-model-dom.d.ts +16 -0
  59. package/lib/types/client/conversation/subagent-model-dom.d.ts.map +1 -0
  60. package/lib/types/client/conversation/subagent-model-dom.js +138 -0
  61. package/lib/types/client/conversation/subagent-model.d.ts +17 -0
  62. package/lib/types/client/conversation/subagent-model.d.ts.map +1 -0
  63. package/lib/types/client/conversation/subagent-model.js +156 -0
  64. package/lib/types/client/conversation/worktree/api.d.ts +97 -0
  65. package/lib/types/client/conversation/worktree/api.d.ts.map +1 -0
  66. package/lib/types/client/conversation/worktree/api.js +239 -0
  67. package/lib/types/client/conversation/worktree/dialogs/DeleteWorktreeDialog.d.ts +35 -0
  68. package/lib/types/client/conversation/worktree/dialogs/DeleteWorktreeDialog.d.ts.map +1 -0
  69. package/lib/types/client/conversation/worktree/dialogs/DeleteWorktreeDialog.js +55 -0
  70. package/lib/types/client/conversation/worktree/dialogs/PrCreateDialog.d.ts +27 -0
  71. package/lib/types/client/conversation/worktree/dialogs/PrCreateDialog.d.ts.map +1 -0
  72. package/lib/types/client/conversation/worktree/dialogs/PrCreateDialog.js +49 -0
  73. package/lib/types/client/conversation/worktree/lane-binding.d.ts +46 -0
  74. package/lib/types/client/conversation/worktree/lane-binding.d.ts.map +1 -0
  75. package/lib/types/client/conversation/worktree/lane-binding.js +60 -0
  76. package/lib/types/client/conversation/worktree/lane-menu.d.ts +51 -0
  77. package/lib/types/client/conversation/worktree/lane-menu.d.ts.map +1 -0
  78. package/lib/types/client/conversation/worktree/lane-menu.js +140 -0
  79. package/lib/types/client/conversation/worktree/lane-open.d.ts +126 -0
  80. package/lib/types/client/conversation/worktree/lane-open.d.ts.map +1 -0
  81. package/lib/types/client/conversation/worktree/lane-open.js +140 -0
  82. package/lib/types/client/conversation/worktree/lane-workspace-sweeper.d.ts +79 -0
  83. package/lib/types/client/conversation/worktree/lane-workspace-sweeper.d.ts.map +1 -0
  84. package/lib/types/client/conversation/worktree/lane-workspace-sweeper.js +116 -0
  85. package/lib/types/client/conversation/worktree/lifecycle.d.ts +29 -0
  86. package/lib/types/client/conversation/worktree/lifecycle.d.ts.map +1 -0
  87. package/lib/types/client/conversation/worktree/lifecycle.js +67 -0
  88. package/lib/types/client/conversation/worktree/locales.d.ts +58 -0
  89. package/lib/types/client/conversation/worktree/locales.d.ts.map +1 -0
  90. package/lib/types/client/conversation/worktree/locales.js +86 -0
  91. package/lib/types/client/conversation/worktree/semantic.d.ts +11 -0
  92. package/lib/types/client/conversation/worktree/semantic.d.ts.map +1 -0
  93. package/lib/types/client/conversation/worktree/semantic.js +10 -0
  94. package/lib/types/client/index.d.ts +14 -0
  95. package/lib/types/client/index.d.ts.map +1 -0
  96. package/lib/types/client/index.js +45 -0
  97. package/lib/types/client/lark-inbox/i18n.d.ts +63 -0
  98. package/lib/types/client/lark-inbox/i18n.d.ts.map +1 -0
  99. package/lib/types/client/lark-inbox/i18n.js +119 -0
  100. package/lib/types/client/lark-inbox/wizard.d.ts +19 -0
  101. package/lib/types/client/lark-inbox/wizard.d.ts.map +1 -0
  102. package/lib/types/client/lark-inbox/wizard.js +158 -0
  103. package/lib/types/client/notify/i18n.d.ts +47 -0
  104. package/lib/types/client/notify/i18n.d.ts.map +1 -0
  105. package/lib/types/client/notify/i18n.js +87 -0
  106. package/lib/types/client/settings/family-scope.d.ts +23 -0
  107. package/lib/types/client/settings/family-scope.d.ts.map +1 -0
  108. package/lib/types/client/settings/family-scope.js +30 -0
  109. package/lib/types/client/settings/lark-inbox.d.ts +73 -0
  110. package/lib/types/client/settings/lark-inbox.d.ts.map +1 -0
  111. package/lib/types/client/settings/lark-inbox.js +144 -0
  112. package/lib/types/client/settings/notify.d.ts +66 -0
  113. package/lib/types/client/settings/notify.d.ts.map +1 -0
  114. package/lib/types/client/settings/notify.js +139 -0
  115. package/lib/types/client/settings/primitives-0.2.d.ts +137 -0
  116. package/lib/types/client/settings/primitives-0.2.d.ts.map +1 -0
  117. package/lib/types/client/settings/primitives-0.2.js +8 -0
  118. package/lib/types/client/sidebar/RenderBoundary.d.ts +17 -0
  119. package/lib/types/client/sidebar/RenderBoundary.d.ts.map +1 -0
  120. package/lib/types/client/sidebar/RenderBoundary.js +18 -0
  121. package/lib/types/client/sidebar/agent-browser.d.ts +9 -0
  122. package/lib/types/client/sidebar/agent-browser.d.ts.map +1 -0
  123. package/lib/types/client/sidebar/agent-browser.js +102 -0
  124. package/lib/types/client/sidebar/diff-view.d.ts +58 -0
  125. package/lib/types/client/sidebar/diff-view.d.ts.map +1 -0
  126. package/lib/types/client/sidebar/diff-view.js +223 -0
  127. package/lib/types/client/sidebar/git-workbench.d.ts +41 -0
  128. package/lib/types/client/sidebar/git-workbench.d.ts.map +1 -0
  129. package/lib/types/client/sidebar/git-workbench.js +480 -0
  130. package/lib/types/client/sidebar/icons.d.ts +9 -0
  131. package/lib/types/client/sidebar/icons.d.ts.map +1 -0
  132. package/lib/types/client/sidebar/icons.js +6 -0
  133. package/lib/types/client/sidebar/index.d.ts +19 -0
  134. package/lib/types/client/sidebar/index.d.ts.map +1 -0
  135. package/lib/types/client/sidebar/index.js +12 -0
  136. package/lib/types/client/sidebar/native-panels.d.ts +19 -0
  137. package/lib/types/client/sidebar/native-panels.d.ts.map +1 -0
  138. package/lib/types/client/sidebar/native-panels.js +103 -0
  139. package/lib/types/client/sidebar/page-shell.d.ts +52 -0
  140. package/lib/types/client/sidebar/page-shell.d.ts.map +1 -0
  141. package/lib/types/client/sidebar/page-shell.js +18 -0
  142. package/lib/types/client/sidebar/panels/memoir/api.d.ts +258 -0
  143. package/lib/types/client/sidebar/panels/memoir/api.d.ts.map +1 -0
  144. package/lib/types/client/sidebar/panels/memoir/api.js +135 -0
  145. package/lib/types/client/sidebar/panels/memoir/controller.d.ts +22 -0
  146. package/lib/types/client/sidebar/panels/memoir/controller.d.ts.map +1 -0
  147. package/lib/types/client/sidebar/panels/memoir/controller.js +38 -0
  148. package/lib/types/client/sidebar/panels/memoir/cwd.d.ts +80 -0
  149. package/lib/types/client/sidebar/panels/memoir/cwd.d.ts.map +1 -0
  150. package/lib/types/client/sidebar/panels/memoir/cwd.js +96 -0
  151. package/lib/types/client/sidebar/panels/memoir/i18n.d.ts +21 -0
  152. package/lib/types/client/sidebar/panels/memoir/i18n.d.ts.map +1 -0
  153. package/lib/types/client/sidebar/panels/memoir/i18n.js +288 -0
  154. package/lib/types/client/sidebar/panels/memoir/panel-activation.d.ts +11 -0
  155. package/lib/types/client/sidebar/panels/memoir/panel-activation.d.ts.map +1 -0
  156. package/lib/types/client/sidebar/panels/memoir/panel-activation.js +37 -0
  157. package/lib/types/client/sidebar/panels/memoir/panel.d.ts +26 -0
  158. package/lib/types/client/sidebar/panels/memoir/panel.d.ts.map +1 -0
  159. package/lib/types/client/sidebar/panels/memoir/panel.js +423 -0
  160. package/lib/types/client/sidebar/panels/memoir/styles.d.ts +22 -0
  161. package/lib/types/client/sidebar/panels/memoir/styles.d.ts.map +1 -0
  162. package/lib/types/client/sidebar/panels/memoir/styles.js +774 -0
  163. package/lib/types/client/sidebar/panels/memoir/types.d.ts +7 -0
  164. package/lib/types/client/sidebar/panels/memoir/types.d.ts.map +1 -0
  165. package/lib/types/client/sidebar/panels/memoir/types.js +5 -0
  166. package/lib/types/client/sidebar/panels/ssh/ClusterTab.d.ts +8 -0
  167. package/lib/types/client/sidebar/panels/ssh/ClusterTab.d.ts.map +1 -0
  168. package/lib/types/client/sidebar/panels/ssh/ClusterTab.js +53 -0
  169. package/lib/types/client/sidebar/panels/ssh/HostFormDialog.d.ts +13 -0
  170. package/lib/types/client/sidebar/panels/ssh/HostFormDialog.d.ts.map +1 -0
  171. package/lib/types/client/sidebar/panels/ssh/HostFormDialog.js +110 -0
  172. package/lib/types/client/sidebar/panels/ssh/HostsTab.d.ts +26 -0
  173. package/lib/types/client/sidebar/panels/ssh/HostsTab.d.ts.map +1 -0
  174. package/lib/types/client/sidebar/panels/ssh/HostsTab.js +175 -0
  175. package/lib/types/client/sidebar/panels/ssh/SshPanel.d.ts +14 -0
  176. package/lib/types/client/sidebar/panels/ssh/SshPanel.d.ts.map +1 -0
  177. package/lib/types/client/sidebar/panels/ssh/SshPanel.js +34 -0
  178. package/lib/types/client/sidebar/panels/ssh/TerminalTab.d.ts +18 -0
  179. package/lib/types/client/sidebar/panels/ssh/TerminalTab.d.ts.map +1 -0
  180. package/lib/types/client/sidebar/panels/ssh/TerminalTab.js +207 -0
  181. package/lib/types/client/sidebar/panels/ssh/TransferTab.d.ts +8 -0
  182. package/lib/types/client/sidebar/panels/ssh/TransferTab.d.ts.map +1 -0
  183. package/lib/types/client/sidebar/panels/ssh/TransferTab.js +168 -0
  184. package/lib/types/client/sidebar/panels/ssh/TunnelsTab.d.ts +18 -0
  185. package/lib/types/client/sidebar/panels/ssh/TunnelsTab.d.ts.map +1 -0
  186. package/lib/types/client/sidebar/panels/ssh/TunnelsTab.js +161 -0
  187. package/lib/types/client/sidebar/panels/ssh/api.d.ts +80 -0
  188. package/lib/types/client/sidebar/panels/ssh/api.d.ts.map +1 -0
  189. package/lib/types/client/sidebar/panels/ssh/api.js +333 -0
  190. package/lib/types/client/sidebar/panels/ssh/controller.d.ts +23 -0
  191. package/lib/types/client/sidebar/panels/ssh/controller.d.ts.map +1 -0
  192. package/lib/types/client/sidebar/panels/ssh/controller.js +41 -0
  193. package/lib/types/client/sidebar/panels/ssh/helpers.d.ts +44 -0
  194. package/lib/types/client/sidebar/panels/ssh/helpers.d.ts.map +1 -0
  195. package/lib/types/client/sidebar/panels/ssh/helpers.js +53 -0
  196. package/lib/types/client/sidebar/panels/ssh/locales.d.ts +155 -0
  197. package/lib/types/client/sidebar/panels/ssh/locales.d.ts.map +1 -0
  198. package/lib/types/client/sidebar/panels/ssh/locales.js +312 -0
  199. package/lib/types/client/sidebar/panels/ssh/xterm.css.d.ts +3 -0
  200. package/lib/types/client/sidebar/panels/ssh/xterm.css.d.ts.map +1 -0
  201. package/lib/types/client/sidebar/panels/ssh/xterm.css.js +2 -0
  202. package/lib/types/client/sidebar/right-pane-i18n.d.ts +121 -0
  203. package/lib/types/client/sidebar/right-pane-i18n.d.ts.map +1 -0
  204. package/lib/types/client/sidebar/right-pane-i18n.js +239 -0
  205. package/lib/types/client/sidebar/right-pane.d.ts +27 -0
  206. package/lib/types/client/sidebar/right-pane.d.ts.map +1 -0
  207. package/lib/types/client/sidebar/right-pane.js +112 -0
  208. package/lib/types/client/sidebar/scope.d.ts +17 -0
  209. package/lib/types/client/sidebar/scope.d.ts.map +1 -0
  210. package/lib/types/client/sidebar/scope.js +41 -0
  211. package/lib/types/client/trust.d.ts +78 -0
  212. package/lib/types/client/trust.d.ts.map +1 -0
  213. package/lib/types/client/trust.js +130 -0
  214. package/lib/types/client/ui-icons.d.ts +19 -0
  215. package/lib/types/client/ui-icons.d.ts.map +1 -0
  216. package/lib/types/client/ui-icons.js +33 -0
  217. package/lib/types/core/git-graph/commands.d.ts +36 -0
  218. package/lib/types/core/git-graph/commands.d.ts.map +1 -0
  219. package/lib/types/core/git-graph/commands.js +122 -0
  220. package/lib/types/core/git-graph/protocol.d.ts +104 -0
  221. package/lib/types/core/git-graph/protocol.d.ts.map +1 -0
  222. package/lib/types/core/git-graph/protocol.js +142 -0
  223. package/lib/types/core/index.d.ts +3 -0
  224. package/lib/types/core/index.d.ts.map +1 -0
  225. package/lib/types/core/index.js +2 -0
  226. package/lib/types/core/lark-inbox/gating.d.ts +21 -0
  227. package/lib/types/core/lark-inbox/gating.d.ts.map +1 -0
  228. package/lib/types/core/lark-inbox/gating.js +17 -0
  229. package/lib/types/core/lark-inbox/queue.d.ts +27 -0
  230. package/lib/types/core/lark-inbox/queue.d.ts.map +1 -0
  231. package/lib/types/core/lark-inbox/queue.js +78 -0
  232. package/lib/types/core/memoir/protocol.d.ts +42 -0
  233. package/lib/types/core/memoir/protocol.d.ts.map +1 -0
  234. package/lib/types/core/memoir/protocol.js +8 -0
  235. package/lib/types/core/no-browser-auth/contract.d.ts +22 -0
  236. package/lib/types/core/no-browser-auth/contract.d.ts.map +1 -0
  237. package/lib/types/core/no-browser-auth/contract.js +9 -0
  238. package/lib/types/core/notify/contract.d.ts +133 -0
  239. package/lib/types/core/notify/contract.d.ts.map +1 -0
  240. package/lib/types/core/notify/contract.js +186 -0
  241. package/lib/types/core/notify/feed.d.ts +116 -0
  242. package/lib/types/core/notify/feed.d.ts.map +1 -0
  243. package/lib/types/core/notify/feed.js +214 -0
  244. package/lib/types/core/playwright-sessions/contracts.d.ts +98 -0
  245. package/lib/types/core/playwright-sessions/contracts.d.ts.map +1 -0
  246. package/lib/types/core/playwright-sessions/contracts.js +68 -0
  247. package/lib/types/core/playwright-sessions/control.d.ts +19 -0
  248. package/lib/types/core/playwright-sessions/control.d.ts.map +1 -0
  249. package/lib/types/core/playwright-sessions/control.js +9 -0
  250. package/lib/types/core/playwright-sessions/index.d.ts +4 -0
  251. package/lib/types/core/playwright-sessions/index.d.ts.map +1 -0
  252. package/lib/types/core/playwright-sessions/index.js +3 -0
  253. package/lib/types/core/playwright-sessions/names.d.ts +4 -0
  254. package/lib/types/core/playwright-sessions/names.d.ts.map +1 -0
  255. package/lib/types/core/playwright-sessions/names.js +84 -0
  256. package/lib/types/core/playwright-sessions/schema.d.ts +4 -0
  257. package/lib/types/core/playwright-sessions/schema.d.ts.map +1 -0
  258. package/lib/types/core/playwright-sessions/schema.js +90 -0
  259. package/lib/types/core/playwright-sessions/wire.d.ts +78 -0
  260. package/lib/types/core/playwright-sessions/wire.d.ts.map +1 -0
  261. package/lib/types/core/playwright-sessions/wire.js +103 -0
  262. package/lib/types/core/remote-access/paths.d.ts +19 -0
  263. package/lib/types/core/remote-access/paths.d.ts.map +1 -0
  264. package/lib/types/core/remote-access/paths.js +18 -0
  265. package/lib/types/core/remote-web-ui/security.d.ts +35 -0
  266. package/lib/types/core/remote-web-ui/security.d.ts.map +1 -0
  267. package/lib/types/core/remote-web-ui/security.js +146 -0
  268. package/lib/types/core/right-pane/protocol.d.ts +25 -0
  269. package/lib/types/core/right-pane/protocol.d.ts.map +1 -0
  270. package/lib/types/core/right-pane/protocol.js +91 -0
  271. package/lib/types/core/schedule-mode/index.d.ts +7 -0
  272. package/lib/types/core/schedule-mode/index.d.ts.map +1 -0
  273. package/lib/types/core/schedule-mode/index.js +6 -0
  274. package/lib/types/core/schedule-mode/native.d.ts +35 -0
  275. package/lib/types/core/schedule-mode/native.d.ts.map +1 -0
  276. package/lib/types/core/schedule-mode/native.js +82 -0
  277. package/lib/types/core/schedule-mode/types.d.ts +177 -0
  278. package/lib/types/core/schedule-mode/types.d.ts.map +1 -0
  279. package/lib/types/core/schedule-mode/types.js +65 -0
  280. package/lib/types/core/schedule-mode/view.d.ts +62 -0
  281. package/lib/types/core/schedule-mode/view.d.ts.map +1 -0
  282. package/lib/types/core/schedule-mode/view.js +4 -0
  283. package/lib/types/core/ssh/protocol.d.ts +215 -0
  284. package/lib/types/core/ssh/protocol.d.ts.map +1 -0
  285. package/lib/types/core/ssh/protocol.js +23 -0
  286. package/lib/types/core/subagent-model/badges.d.ts +73 -0
  287. package/lib/types/core/subagent-model/badges.d.ts.map +1 -0
  288. package/lib/types/core/subagent-model/badges.js +105 -0
  289. package/lib/types/core/worktree/invariant.d.ts +62 -0
  290. package/lib/types/core/worktree/invariant.d.ts.map +1 -0
  291. package/lib/types/core/worktree/invariant.js +72 -0
  292. package/lib/types/core/worktree/manifest.d.ts +71 -0
  293. package/lib/types/core/worktree/manifest.d.ts.map +1 -0
  294. package/lib/types/core/worktree/manifest.js +98 -0
  295. package/lib/types/core/worktree/paths.d.ts +60 -0
  296. package/lib/types/core/worktree/paths.d.ts.map +1 -0
  297. package/lib/types/core/worktree/paths.js +118 -0
  298. package/lib/types/core/worktree/pr-create.d.ts +67 -0
  299. package/lib/types/core/worktree/pr-create.d.ts.map +1 -0
  300. package/lib/types/core/worktree/pr-create.js +118 -0
  301. package/lib/types/core/worktree/protocol.d.ts +7 -0
  302. package/lib/types/core/worktree/protocol.d.ts.map +1 -0
  303. package/lib/types/core/worktree/protocol.js +6 -0
  304. package/lib/types/core/worktree/types.d.ts +292 -0
  305. package/lib/types/core/worktree/types.d.ts.map +1 -0
  306. package/lib/types/core/worktree/types.js +14 -0
  307. package/lib/types/core/worktree/workspace-model.d.ts +56 -0
  308. package/lib/types/core/worktree/workspace-model.d.ts.map +1 -0
  309. package/lib/types/core/worktree/workspace-model.js +14 -0
  310. package/lib/types/host/services/access-trust/index.d.ts +54 -0
  311. package/lib/types/host/services/access-trust/index.d.ts.map +1 -0
  312. package/lib/types/host/services/access-trust/index.js +82 -0
  313. package/lib/types/host/services/access-trust/trust.d.ts +70 -0
  314. package/lib/types/host/services/access-trust/trust.d.ts.map +1 -0
  315. package/lib/types/host/services/access-trust/trust.js +187 -0
  316. package/lib/types/host/services/codex-bridge/bridge.d.ts +106 -0
  317. package/lib/types/host/services/codex-bridge/bridge.d.ts.map +1 -0
  318. package/lib/types/host/services/codex-bridge/bridge.js +321 -0
  319. package/lib/types/host/services/codex-bridge/codex-auth.d.ts +108 -0
  320. package/lib/types/host/services/codex-bridge/codex-auth.d.ts.map +1 -0
  321. package/lib/types/host/services/codex-bridge/codex-auth.js +241 -0
  322. package/lib/types/host/services/codex-bridge/dsh-integration.d.ts +58 -0
  323. package/lib/types/host/services/codex-bridge/dsh-integration.d.ts.map +1 -0
  324. package/lib/types/host/services/codex-bridge/dsh-integration.js +120 -0
  325. package/lib/types/host/services/codex-bridge/http.d.ts +43 -0
  326. package/lib/types/host/services/codex-bridge/http.d.ts.map +1 -0
  327. package/lib/types/host/services/codex-bridge/http.js +92 -0
  328. package/lib/types/host/services/codex-bridge/index.d.ts +63 -0
  329. package/lib/types/host/services/codex-bridge/index.d.ts.map +1 -0
  330. package/lib/types/host/services/codex-bridge/index.js +111 -0
  331. package/lib/types/host/services/codex-bridge/loopback.d.ts +25 -0
  332. package/lib/types/host/services/codex-bridge/loopback.d.ts.map +1 -0
  333. package/lib/types/host/services/codex-bridge/loopback.js +68 -0
  334. package/lib/types/host/services/codex-bridge/routes.d.ts +31 -0
  335. package/lib/types/host/services/codex-bridge/routes.d.ts.map +1 -0
  336. package/lib/types/host/services/codex-bridge/routes.js +126 -0
  337. package/lib/types/host/services/family-config.d.ts +71 -0
  338. package/lib/types/host/services/family-config.d.ts.map +1 -0
  339. package/lib/types/host/services/family-config.js +166 -0
  340. package/lib/types/host/services/family-namespaces.d.ts +24 -0
  341. package/lib/types/host/services/family-namespaces.d.ts.map +1 -0
  342. package/lib/types/host/services/family-namespaces.js +30 -0
  343. package/lib/types/host/services/git-graph/index.d.ts +6 -0
  344. package/lib/types/host/services/git-graph/index.d.ts.map +1 -0
  345. package/lib/types/host/services/git-graph/index.js +7 -0
  346. package/lib/types/host/services/git-graph/routes.d.ts +4 -0
  347. package/lib/types/host/services/git-graph/routes.d.ts.map +1 -0
  348. package/lib/types/host/services/git-graph/routes.js +241 -0
  349. package/lib/types/host/services/git-graph/service.d.ts +52 -0
  350. package/lib/types/host/services/git-graph/service.d.ts.map +1 -0
  351. package/lib/types/host/services/git-graph/service.js +301 -0
  352. package/lib/types/host/services/index.d.ts +23 -0
  353. package/lib/types/host/services/index.d.ts.map +1 -0
  354. package/lib/types/host/services/index.js +80 -0
  355. package/lib/types/host/services/lark-inbox/config.d.ts +24 -0
  356. package/lib/types/host/services/lark-inbox/config.d.ts.map +1 -0
  357. package/lib/types/host/services/lark-inbox/config.js +48 -0
  358. package/lib/types/host/services/lark-inbox/gateway.d.ts +53 -0
  359. package/lib/types/host/services/lark-inbox/gateway.d.ts.map +1 -0
  360. package/lib/types/host/services/lark-inbox/gateway.js +171 -0
  361. package/lib/types/host/services/lark-inbox/host-routes.d.ts +22 -0
  362. package/lib/types/host/services/lark-inbox/host-routes.d.ts.map +1 -0
  363. package/lib/types/host/services/lark-inbox/host-routes.js +146 -0
  364. package/lib/types/host/services/lark-inbox/inbox-store.d.ts +39 -0
  365. package/lib/types/host/services/lark-inbox/inbox-store.d.ts.map +1 -0
  366. package/lib/types/host/services/lark-inbox/inbox-store.js +124 -0
  367. package/lib/types/host/services/lark-inbox/index.d.ts +26 -0
  368. package/lib/types/host/services/lark-inbox/index.d.ts.map +1 -0
  369. package/lib/types/host/services/lark-inbox/index.js +135 -0
  370. package/lib/types/host/services/lark-inbox/tools.d.ts +7 -0
  371. package/lib/types/host/services/lark-inbox/tools.d.ts.map +1 -0
  372. package/lib/types/host/services/lark-inbox/tools.js +119 -0
  373. package/lib/types/host/services/lark-inbox/wizard.d.ts +62 -0
  374. package/lib/types/host/services/lark-inbox/wizard.d.ts.map +1 -0
  375. package/lib/types/host/services/lark-inbox/wizard.js +211 -0
  376. package/lib/types/host/services/lifecycle.d.ts +29 -0
  377. package/lib/types/host/services/lifecycle.d.ts.map +1 -0
  378. package/lib/types/host/services/lifecycle.js +93 -0
  379. package/lib/types/host/services/memoir/index.d.ts +40 -0
  380. package/lib/types/host/services/memoir/index.d.ts.map +1 -0
  381. package/lib/types/host/services/memoir/index.js +52 -0
  382. package/lib/types/host/services/memoir/routes.d.ts +30 -0
  383. package/lib/types/host/services/memoir/routes.d.ts.map +1 -0
  384. package/lib/types/host/services/memoir/routes.js +364 -0
  385. package/lib/types/host/services/memoir/settings.d.ts +27 -0
  386. package/lib/types/host/services/memoir/settings.d.ts.map +1 -0
  387. package/lib/types/host/services/memoir/settings.js +120 -0
  388. package/lib/types/host/services/memoir/store.d.ts +35 -0
  389. package/lib/types/host/services/memoir/store.d.ts.map +1 -0
  390. package/lib/types/host/services/memoir/store.js +124 -0
  391. package/lib/types/host/services/memoir/tools.d.ts +8 -0
  392. package/lib/types/host/services/memoir/tools.d.ts.map +1 -0
  393. package/lib/types/host/services/memoir/tools.js +154 -0
  394. package/lib/types/host/services/no-browser-auth/index.d.ts +25 -0
  395. package/lib/types/host/services/no-browser-auth/index.d.ts.map +1 -0
  396. package/lib/types/host/services/no-browser-auth/index.js +42 -0
  397. package/lib/types/host/services/notify/config.d.ts +105 -0
  398. package/lib/types/host/services/notify/config.d.ts.map +1 -0
  399. package/lib/types/host/services/notify/config.js +123 -0
  400. package/lib/types/host/services/notify/feishu-sender.d.ts +120 -0
  401. package/lib/types/host/services/notify/feishu-sender.d.ts.map +1 -0
  402. package/lib/types/host/services/notify/feishu-sender.js +186 -0
  403. package/lib/types/host/services/notify/host-routes.d.ts +69 -0
  404. package/lib/types/host/services/notify/host-routes.d.ts.map +1 -0
  405. package/lib/types/host/services/notify/host-routes.js +112 -0
  406. package/lib/types/host/services/notify/index.d.ts +80 -0
  407. package/lib/types/host/services/notify/index.d.ts.map +1 -0
  408. package/lib/types/host/services/notify/index.js +263 -0
  409. package/lib/types/host/services/playwright-sessions/child.d.ts +76 -0
  410. package/lib/types/host/services/playwright-sessions/child.d.ts.map +1 -0
  411. package/lib/types/host/services/playwright-sessions/child.js +197 -0
  412. package/lib/types/host/services/playwright-sessions/controller.d.ts +25 -0
  413. package/lib/types/host/services/playwright-sessions/controller.d.ts.map +1 -0
  414. package/lib/types/host/services/playwright-sessions/controller.js +104 -0
  415. package/lib/types/host/services/playwright-sessions/index.d.ts +6 -0
  416. package/lib/types/host/services/playwright-sessions/index.d.ts.map +1 -0
  417. package/lib/types/host/services/playwright-sessions/index.js +161 -0
  418. package/lib/types/host/services/playwright-sessions/live-view.d.ts +32 -0
  419. package/lib/types/host/services/playwright-sessions/live-view.d.ts.map +1 -0
  420. package/lib/types/host/services/playwright-sessions/live-view.js +188 -0
  421. package/lib/types/host/services/playwright-sessions/manager.d.ts +87 -0
  422. package/lib/types/host/services/playwright-sessions/manager.d.ts.map +1 -0
  423. package/lib/types/host/services/playwright-sessions/manager.js +203 -0
  424. package/lib/types/host/services/playwright-sessions/profile-gc.d.ts +39 -0
  425. package/lib/types/host/services/playwright-sessions/profile-gc.d.ts.map +1 -0
  426. package/lib/types/host/services/playwright-sessions/profile-gc.js +72 -0
  427. package/lib/types/host/services/playwright-sessions/routes.d.ts +18 -0
  428. package/lib/types/host/services/playwright-sessions/routes.d.ts.map +1 -0
  429. package/lib/types/host/services/playwright-sessions/routes.js +87 -0
  430. package/lib/types/host/services/remote-access/boot-scripts.d.ts +55 -0
  431. package/lib/types/host/services/remote-access/boot-scripts.d.ts.map +1 -0
  432. package/lib/types/host/services/remote-access/boot-scripts.js +109 -0
  433. package/lib/types/host/services/remote-access/index.d.ts +28 -0
  434. package/lib/types/host/services/remote-access/index.d.ts.map +1 -0
  435. package/lib/types/host/services/remote-access/index.js +47 -0
  436. package/lib/types/host/services/remote-access/routes.d.ts +42 -0
  437. package/lib/types/host/services/remote-access/routes.d.ts.map +1 -0
  438. package/lib/types/host/services/remote-access/routes.js +119 -0
  439. package/lib/types/host/services/remote-web-ui/index.d.ts +21 -0
  440. package/lib/types/host/services/remote-web-ui/index.d.ts.map +1 -0
  441. package/lib/types/host/services/remote-web-ui/index.js +325 -0
  442. package/lib/types/host/services/remote-web-ui/server-mode/accounts.d.ts +115 -0
  443. package/lib/types/host/services/remote-web-ui/server-mode/accounts.d.ts.map +1 -0
  444. package/lib/types/host/services/remote-web-ui/server-mode/accounts.js +396 -0
  445. package/lib/types/host/services/remote-web-ui/server-mode/cookie.d.ts +28 -0
  446. package/lib/types/host/services/remote-web-ui/server-mode/cookie.d.ts.map +1 -0
  447. package/lib/types/host/services/remote-web-ui/server-mode/cookie.js +48 -0
  448. package/lib/types/host/services/remote-web-ui/server-mode/dsh-home.d.ts +17 -0
  449. package/lib/types/host/services/remote-web-ui/server-mode/dsh-home.d.ts.map +1 -0
  450. package/lib/types/host/services/remote-web-ui/server-mode/dsh-home.js +40 -0
  451. package/lib/types/host/services/remote-web-ui/server-mode/external-auth.d.ts +73 -0
  452. package/lib/types/host/services/remote-web-ui/server-mode/external-auth.d.ts.map +1 -0
  453. package/lib/types/host/services/remote-web-ui/server-mode/external-auth.js +242 -0
  454. package/lib/types/host/services/remote-web-ui/server-mode/fence.d.ts +23 -0
  455. package/lib/types/host/services/remote-web-ui/server-mode/fence.d.ts.map +1 -0
  456. package/lib/types/host/services/remote-web-ui/server-mode/fence.js +24 -0
  457. package/lib/types/host/services/remote-web-ui/server-mode/gateway-routes.d.ts +89 -0
  458. package/lib/types/host/services/remote-web-ui/server-mode/gateway-routes.d.ts.map +1 -0
  459. package/lib/types/host/services/remote-web-ui/server-mode/gateway-routes.js +768 -0
  460. package/lib/types/host/services/remote-web-ui/server-mode/gateway.d.ts +99 -0
  461. package/lib/types/host/services/remote-web-ui/server-mode/gateway.d.ts.map +1 -0
  462. package/lib/types/host/services/remote-web-ui/server-mode/gateway.js +679 -0
  463. package/lib/types/host/services/remote-web-ui/server-mode/http.d.ts +43 -0
  464. package/lib/types/host/services/remote-web-ui/server-mode/http.d.ts.map +1 -0
  465. package/lib/types/host/services/remote-web-ui/server-mode/http.js +92 -0
  466. package/lib/types/host/services/remote-web-ui/server-mode/integrated-auth.d.ts +42 -0
  467. package/lib/types/host/services/remote-web-ui/server-mode/integrated-auth.d.ts.map +1 -0
  468. package/lib/types/host/services/remote-web-ui/server-mode/integrated-auth.js +73 -0
  469. package/lib/types/host/services/remote-web-ui/server-mode/lan.d.ts +13 -0
  470. package/lib/types/host/services/remote-web-ui/server-mode/lan.d.ts.map +1 -0
  471. package/lib/types/host/services/remote-web-ui/server-mode/lan.js +17 -0
  472. package/lib/types/host/services/remote-web-ui/server-mode/loopback.d.ts +25 -0
  473. package/lib/types/host/services/remote-web-ui/server-mode/loopback.d.ts.map +1 -0
  474. package/lib/types/host/services/remote-web-ui/server-mode/loopback.js +68 -0
  475. package/lib/types/host/services/remote-web-ui/server-mode/posture.d.ts +75 -0
  476. package/lib/types/host/services/remote-web-ui/server-mode/posture.d.ts.map +1 -0
  477. package/lib/types/host/services/remote-web-ui/server-mode/posture.js +116 -0
  478. package/lib/types/host/services/remote-web-ui/server-mode/roles.d.ts +44 -0
  479. package/lib/types/host/services/remote-web-ui/server-mode/roles.d.ts.map +1 -0
  480. package/lib/types/host/services/remote-web-ui/server-mode/roles.js +47 -0
  481. package/lib/types/host/services/remote-web-ui/server-mode/server-boot.d.ts +21 -0
  482. package/lib/types/host/services/remote-web-ui/server-mode/server-boot.d.ts.map +1 -0
  483. package/lib/types/host/services/remote-web-ui/server-mode/server-boot.js +37 -0
  484. package/lib/types/host/services/remote-web-ui/server-mode/sessions.d.ts +111 -0
  485. package/lib/types/host/services/remote-web-ui/server-mode/sessions.d.ts.map +1 -0
  486. package/lib/types/host/services/remote-web-ui/server-mode/sessions.js +298 -0
  487. package/lib/types/host/services/remote-web-ui/server.d.ts +82 -0
  488. package/lib/types/host/services/remote-web-ui/server.d.ts.map +1 -0
  489. package/lib/types/host/services/remote-web-ui/server.js +492 -0
  490. package/lib/types/host/services/resources.d.ts +9 -0
  491. package/lib/types/host/services/resources.d.ts.map +1 -0
  492. package/lib/types/host/services/resources.js +98 -0
  493. package/lib/types/host/services/right-pane/browser.d.ts +42 -0
  494. package/lib/types/host/services/right-pane/browser.d.ts.map +1 -0
  495. package/lib/types/host/services/right-pane/browser.js +106 -0
  496. package/lib/types/host/services/right-pane/index.d.ts +22 -0
  497. package/lib/types/host/services/right-pane/index.d.ts.map +1 -0
  498. package/lib/types/host/services/right-pane/index.js +114 -0
  499. package/lib/types/host/services/right-pane/wire.d.ts +6 -0
  500. package/lib/types/host/services/right-pane/wire.d.ts.map +1 -0
  501. package/lib/types/host/services/right-pane/wire.js +9 -0
  502. package/lib/types/host/services/schedule-mode/config.d.ts +11 -0
  503. package/lib/types/host/services/schedule-mode/config.d.ts.map +1 -0
  504. package/lib/types/host/services/schedule-mode/config.js +15 -0
  505. package/lib/types/host/services/schedule-mode/engine.d.ts +150 -0
  506. package/lib/types/host/services/schedule-mode/engine.d.ts.map +1 -0
  507. package/lib/types/host/services/schedule-mode/engine.js +672 -0
  508. package/lib/types/host/services/schedule-mode/index.d.ts +33 -0
  509. package/lib/types/host/services/schedule-mode/index.d.ts.map +1 -0
  510. package/lib/types/host/services/schedule-mode/index.js +175 -0
  511. package/lib/types/host/services/schedule-mode/routes.d.ts +31 -0
  512. package/lib/types/host/services/schedule-mode/routes.d.ts.map +1 -0
  513. package/lib/types/host/services/schedule-mode/routes.js +109 -0
  514. package/lib/types/host/services/schedule-mode/session-create.d.ts +27 -0
  515. package/lib/types/host/services/schedule-mode/session-create.d.ts.map +1 -0
  516. package/lib/types/host/services/schedule-mode/session-create.js +21 -0
  517. package/lib/types/host/services/schedule-mode/store.d.ts +36 -0
  518. package/lib/types/host/services/schedule-mode/store.d.ts.map +1 -0
  519. package/lib/types/host/services/schedule-mode/store.js +309 -0
  520. package/lib/types/host/services/schedule-mode/tools.d.ts +13 -0
  521. package/lib/types/host/services/schedule-mode/tools.d.ts.map +1 -0
  522. package/lib/types/host/services/schedule-mode/tools.js +132 -0
  523. package/lib/types/host/services/ssh/engine.d.ts +162 -0
  524. package/lib/types/host/services/ssh/engine.d.ts.map +1 -0
  525. package/lib/types/host/services/ssh/engine.js +699 -0
  526. package/lib/types/host/services/ssh/host-keys.d.ts +10 -0
  527. package/lib/types/host/services/ssh/host-keys.d.ts.map +1 -0
  528. package/lib/types/host/services/ssh/host-keys.js +108 -0
  529. package/lib/types/host/services/ssh/index.d.ts +38 -0
  530. package/lib/types/host/services/ssh/index.d.ts.map +1 -0
  531. package/lib/types/host/services/ssh/index.js +47 -0
  532. package/lib/types/host/services/ssh/routes.d.ts +29 -0
  533. package/lib/types/host/services/ssh/routes.d.ts.map +1 -0
  534. package/lib/types/host/services/ssh/routes.js +465 -0
  535. package/lib/types/host/services/ssh/store.d.ts +40 -0
  536. package/lib/types/host/services/ssh/store.d.ts.map +1 -0
  537. package/lib/types/host/services/ssh/store.js +330 -0
  538. package/lib/types/host/services/ssh/terminal-ws.d.ts +9 -0
  539. package/lib/types/host/services/ssh/terminal-ws.d.ts.map +1 -0
  540. package/lib/types/host/services/ssh/terminal-ws.js +142 -0
  541. package/lib/types/host/services/ssh/tools.d.ts +11 -0
  542. package/lib/types/host/services/ssh/tools.d.ts.map +1 -0
  543. package/lib/types/host/services/ssh/tools.js +270 -0
  544. package/lib/types/host/services/web-render/contracts.d.ts +93 -0
  545. package/lib/types/host/services/web-render/contracts.d.ts.map +1 -0
  546. package/lib/types/host/services/web-render/contracts.js +60 -0
  547. package/lib/types/host/services/web-render/index.d.ts +58 -0
  548. package/lib/types/host/services/web-render/index.d.ts.map +1 -0
  549. package/lib/types/host/services/web-render/index.js +90 -0
  550. package/lib/types/host/services/web-render/provider.d.ts +37 -0
  551. package/lib/types/host/services/web-render/provider.d.ts.map +1 -0
  552. package/lib/types/host/services/web-render/provider.js +274 -0
  553. package/lib/types/host/services/web-search-anthropic/contracts.d.ts +117 -0
  554. package/lib/types/host/services/web-search-anthropic/contracts.d.ts.map +1 -0
  555. package/lib/types/host/services/web-search-anthropic/contracts.js +90 -0
  556. package/lib/types/host/services/web-search-anthropic/index.d.ts +53 -0
  557. package/lib/types/host/services/web-search-anthropic/index.d.ts.map +1 -0
  558. package/lib/types/host/services/web-search-anthropic/index.js +123 -0
  559. package/lib/types/host/services/web-search-anthropic/provider.d.ts +101 -0
  560. package/lib/types/host/services/web-search-anthropic/provider.d.ts.map +1 -0
  561. package/lib/types/host/services/web-search-anthropic/provider.js +237 -0
  562. package/lib/types/host/services/worktree/git-runner.d.ts +82 -0
  563. package/lib/types/host/services/worktree/git-runner.d.ts.map +1 -0
  564. package/lib/types/host/services/worktree/git-runner.js +81 -0
  565. package/lib/types/host/services/worktree/git.d.ts +94 -0
  566. package/lib/types/host/services/worktree/git.d.ts.map +1 -0
  567. package/lib/types/host/services/worktree/git.js +153 -0
  568. package/lib/types/host/services/worktree/http.d.ts +12 -0
  569. package/lib/types/host/services/worktree/http.d.ts.map +1 -0
  570. package/lib/types/host/services/worktree/http.js +34 -0
  571. package/lib/types/host/services/worktree/index.d.ts +38 -0
  572. package/lib/types/host/services/worktree/index.d.ts.map +1 -0
  573. package/lib/types/host/services/worktree/index.js +78 -0
  574. package/lib/types/host/services/worktree/lane-tool.d.ts +22 -0
  575. package/lib/types/host/services/worktree/lane-tool.d.ts.map +1 -0
  576. package/lib/types/host/services/worktree/lane-tool.js +92 -0
  577. package/lib/types/host/services/worktree/manager.d.ts +410 -0
  578. package/lib/types/host/services/worktree/manager.d.ts.map +1 -0
  579. package/lib/types/host/services/worktree/manager.js +1485 -0
  580. package/lib/types/host/services/worktree/model-override.d.ts +20 -0
  581. package/lib/types/host/services/worktree/model-override.d.ts.map +1 -0
  582. package/lib/types/host/services/worktree/model-override.js +35 -0
  583. package/lib/types/host/services/worktree/routes.d.ts +50 -0
  584. package/lib/types/host/services/worktree/routes.d.ts.map +1 -0
  585. package/lib/types/host/services/worktree/routes.js +695 -0
  586. package/lib/types/host/services/worktree/run-command.d.ts +26 -0
  587. package/lib/types/host/services/worktree/run-command.d.ts.map +1 -0
  588. package/lib/types/host/services/worktree/run-command.js +36 -0
  589. package/lib/types/host/services/worktree/session-lane/manager.d.ts +109 -0
  590. package/lib/types/host/services/worktree/session-lane/manager.d.ts.map +1 -0
  591. package/lib/types/host/services/worktree/session-lane/manager.js +172 -0
  592. package/lib/types/host/services/worktree/workspace-model-routes.d.ts +21 -0
  593. package/lib/types/host/services/worktree/workspace-model-routes.d.ts.map +1 -0
  594. package/lib/types/host/services/worktree/workspace-model-routes.js +198 -0
  595. package/lib/types/host/services/worktree/workspace-model.d.ts +48 -0
  596. package/lib/types/host/services/worktree/workspace-model.d.ts.map +1 -0
  597. package/lib/types/host/services/worktree/workspace-model.js +113 -0
  598. package/lib/types/index.d.ts +47 -0
  599. package/lib/types/index.d.ts.map +1 -0
  600. package/lib/types/index.js +52 -0
  601. package/lib/types/invariant.d.ts +4 -0
  602. package/lib/types/invariant.d.ts.map +1 -0
  603. package/lib/types/invariant.js +3 -0
  604. package/package.json +153 -3
  605. package/presets/code-vibe/THIRD_PARTY_NOTICES.md +55 -0
  606. package/presets/code-vibe/skills/UPSTREAM.md +104 -0
  607. package/presets/code-vibe/skills/agent-experience/SKILL.md +15 -0
  608. package/presets/code-vibe/skills/agent-operation/SKILL.md +43 -0
  609. package/presets/code-vibe/skills/code-review/SKILL.md +45 -0
  610. package/presets/code-vibe/skills/dsh-ci-test-reliability/SKILL.md +133 -0
  611. package/presets/code-vibe/skills/dsh-ci-test-reliability/references/ci-flake-diagnosis.md +60 -0
  612. package/presets/code-vibe/skills/dsh-find-simplifications/SKILL.md +69 -0
  613. package/presets/code-vibe/skills/dsh-find-simplifications/references/historical-patterns.md +45 -0
  614. package/presets/code-vibe/skills/dsh-merging-stacked-prs/SKILL.md +129 -0
  615. package/presets/code-vibe/skills/dsh-prose-standard/SKILL.md +83 -0
  616. package/presets/code-vibe/skills/dsh-prose-standard/references/examples.md +169 -0
  617. package/presets/code-vibe/skills/dsh-speed-up-perf/SKILL.md +94 -0
  618. package/presets/code-vibe/skills/dsh-trim-cot-leakage/SKILL.md +47 -0
  619. package/presets/code-vibe/skills/dsh-trim-cot-leakage/references/examples.md +275 -0
  620. package/presets/code-vibe/skills/dsh-trim-cot-leakage/references/recall-batteries.md +52 -0
  621. package/presets/code-vibe/skills/frontend-design/SKILL.md +60 -0
  622. package/presets/code-vibe/skills/frontend-design/references/critique-format.md +35 -0
  623. package/presets/code-vibe/skills/frontend-design/references/design-standards/LOAD-MAP.md +81 -0
  624. package/presets/code-vibe/skills/frontend-design/references/design-standards/README.md +53 -0
  625. package/presets/code-vibe/skills/frontend-design/references/design-standards/anchor.md +51 -0
  626. package/presets/code-vibe/skills/frontend-design/references/design-standards/audit/ai-tells.md +59 -0
  627. package/presets/code-vibe/skills/frontend-design/references/design-standards/audit/web-interface.md +14 -0
  628. package/presets/code-vibe/skills/frontend-design/references/design-standards/change-control.md +62 -0
  629. package/presets/code-vibe/skills/frontend-design/references/design-standards/copy.md +65 -0
  630. package/presets/code-vibe/skills/frontend-design/references/design-standards/craft-knobs.md +61 -0
  631. package/presets/code-vibe/skills/frontend-design/references/design-standards/debug-playbook.md +37 -0
  632. package/presets/code-vibe/skills/frontend-design/references/design-standards/exemplars/README.md +64 -0
  633. package/presets/code-vibe/skills/frontend-design/references/design-standards/plan-architecture.checklist.json +13 -0
  634. package/presets/code-vibe/skills/frontend-design/references/design-standards/product-judgment.md +113 -0
  635. package/presets/code-vibe/skills/frontend-design/references/design-standards/system-architecture.md +108 -0
  636. package/presets/code-vibe/skills/frontend-design/references/design-standards/tokens/README.md +26 -0
  637. package/presets/code-vibe/skills/frontend-design/references/design-standards/tokens/color-roles.md +49 -0
  638. package/presets/code-vibe/skills/frontend-design/references/design-standards/tokens/motion.md +51 -0
  639. package/presets/code-vibe/skills/frontend-design/references/design-standards/tokens/scale.md +89 -0
  640. package/presets/code-vibe/skills/frontend-design/references/design-standards/ui-page-gate.md +61 -0
  641. package/presets/code-vibe/skills/frontend-design/references/design-standards/ui-surface.checklist.json +49 -0
  642. package/presets/code-vibe/skills/frontend-design/references/design-standards/ux.md +76 -0
  643. package/presets/code-vibe/skills/frontend-design/references/design-standards/visual.md +52 -0
  644. package/presets/code-vibe/skills/frontend-design/references/perceptible-path.md +27 -0
  645. package/presets/code-vibe/skills/frontend-design/references/product-package.md +80 -0
  646. package/presets/code-vibe/skills/frontend-design/references/scheme-antipatterns.md +21 -0
  647. package/presets/code-vibe/skills/quality-review/SKILL.md +57 -0
  648. package/presets/code-vibe/skills/quality-review/references/bounded-verify.md +37 -0
  649. package/presets/code-vibe/skills/quality-review/references/browser-verify.md +81 -0
  650. package/presets/code-vibe/skills/quality-review/references/evidence-contract.md +194 -0
  651. package/presets/code-vibe/skills/quality-review/references/falsify-checklist.md +44 -0
  652. package/presets/code-vibe/skills/quality-review/references/human-acceptance-pack.md +68 -0
  653. package/presets/code-vibe/skills/quality-review/references/product-regression.md +51 -0
  654. package/presets/code-vibe/skills/quality-review/references/ux-standards.md +37 -0
  655. package/presets/code-vibe/skills/quality-review/references/ux-walkthrough.md +49 -0
  656. package/presets/code-vibe/skills/quality-review/references/validation-report.md +22 -0
  657. package/presets/code-vibe/skills/quality-review/references/verification-loop.md +95 -0
  658. package/presets/code-vibe/skills/quality-review/references/version-acceptance-matrix.md +131 -0
  659. package/presets/code-vibe/skills/record-browser-gif/SKILL.md +174 -0
  660. package/presets/code-vibe/skills/record-browser-gif/scripts/encode_gif.py +337 -0
  661. package/presets/code-vibe/skills/record-browser-gif/scripts/test_encode_gif.py +103 -0
  662. package/presets/code-vibe/skills/wish-programming/SKILL.md +150 -0
  663. package/presets/code-vibe/skills/wish-programming/references/roles/arch-reviewer.md +26 -0
  664. package/presets/code-vibe/skills/wish-programming/references/roles/design-reviewer.md +32 -0
  665. package/presets/code-vibe/skills/wish-programming/references/roles/pm-reviewer.md +26 -0
  666. package/presets/code-vibe/skills/wish-programming/references/roles/qa-reviewer.md +16 -0
  667. package/presets/code-vibe/skills/wish-programming/references/roles/security-reviewer.md +16 -0
  668. package/presets/code-vibe/skills/wish-programming/references/roles/sre-reviewer.md +16 -0
  669. package/presets/code-vibe/skills/wish-programming/references/roles/ux-adversary.md +16 -0
  670. package/presets/code-vibe/skills/wish-programming/references/templates/arch.md.tpl +51 -0
  671. package/presets/code-vibe/skills/wish-programming/references/templates/brief.md.tpl +36 -0
  672. package/presets/code-vibe/skills/wish-programming/references/templates/confirmation-pack.md +54 -0
  673. package/presets/code-vibe/skills/wish-programming/references/templates/design-spec.md.tpl +49 -0
  674. package/presets/code-vibe/skills/wish-programming/references/templates/module-readme.md +37 -0
  675. package/presets/code-vibe/skills/wish-programming/references/templates/product.md.tpl +74 -0
  676. package/presets/code-vibe/skills/wish-programming/references/templates/requirements.md.tpl +31 -0
  677. package/presets/code-vibe/skills/wish-programming/references/workflow-template.md +122 -0
  678. package/presets/code-vibe/skills/wish-programming/scripts/MANIFEST.sha256 +11 -0
  679. package/presets/code-vibe/skills/wish-programming/scripts/check_spec.py +416 -0
  680. package/presets/code-vibe/skills/wish-programming/scripts/check_whitelist.py +193 -0
  681. package/presets/code-vibe/skills/wish-programming/scripts/coverage_check.py +199 -0
  682. package/presets/code-vibe/skills/wish-programming/scripts/gate-lock.sh +46 -0
  683. package/presets/code-vibe/skills/wish-programming/scripts/journey.sh +281 -0
  684. package/presets/code-vibe/skills/wish-programming/scripts/project.sh +152 -0
  685. package/presets/code-vibe/skills/wish-programming/scripts/replay.sh +65 -0
  686. package/presets/code-vibe/skills/wish-programming/scripts/scan_drift.py +79 -0
  687. package/presets/code-vibe/skills/wish-programming/scripts/verify.sh +169 -0
  688. package/presets/code-vibe/skills/wish-programming/scripts/verify_preset_budgets.py +218 -0
  689. package/presets/code-vibe/skills/wish-programming/scripts/wish.sh +150 -0
  690. package/presets/code-vibe.patch.yml +325 -0
  691. package/presets/hiopen.patch.yml +109 -0
  692. package/src/client/compat.ts +86 -0
  693. package/src/client/conversation/conversation.module.css +264 -0
  694. package/src/client/conversation/git-branch.tsx +152 -0
  695. package/src/client/conversation/git-graph/LICENSE.git-graph +202 -0
  696. package/src/client/conversation/git-graph/api.ts +85 -0
  697. package/src/client/conversation/git-graph/branch-chip.tsx +354 -0
  698. package/src/client/conversation/git-graph/branch-popover.tsx +185 -0
  699. package/src/client/conversation/git-graph/chip.tsx +47 -0
  700. package/src/client/conversation/git-graph/create-branch-dialog.tsx +108 -0
  701. package/src/client/conversation/git-graph/error-copy.ts +50 -0
  702. package/src/client/conversation/git-graph/git-graph.module.css +792 -0
  703. package/src/client/conversation/git-graph/graph-dialog.tsx +196 -0
  704. package/src/client/conversation/git-graph/hero-seat.ts +76 -0
  705. package/src/client/conversation/git-graph/locales.ts +90 -0
  706. package/src/client/conversation/git-graph/sse-leader.ts +124 -0
  707. package/src/client/conversation/index.ts +82 -0
  708. package/src/client/conversation/selector-context.tsx +24 -0
  709. package/src/client/conversation/session-lane-chip.tsx +262 -0
  710. package/src/client/conversation/session-lane-locales.ts +34 -0
  711. package/src/client/conversation/subagent-model-dom.ts +157 -0
  712. package/src/client/conversation/subagent-model.ts +198 -0
  713. package/src/client/conversation/worktree/api.ts +283 -0
  714. package/src/client/conversation/worktree/dialogs/DeleteWorktreeDialog.tsx +111 -0
  715. package/src/client/conversation/worktree/dialogs/PrCreateDialog.tsx +114 -0
  716. package/src/client/conversation/worktree/lane-binding.ts +77 -0
  717. package/src/client/conversation/worktree/lane-menu.tsx +247 -0
  718. package/src/client/conversation/worktree/lane-open.ts +204 -0
  719. package/src/client/conversation/worktree/lane-workspace-sweeper.ts +136 -0
  720. package/src/client/conversation/worktree/lifecycle.ts +75 -0
  721. package/src/client/conversation/worktree/locales.ts +97 -0
  722. package/src/client/conversation/worktree/semantic.ts +10 -0
  723. package/src/client/conversation/worktree/worktree.module.css +70 -0
  724. package/src/client/css-modules.d.ts +8 -0
  725. package/src/client/index.ts +58 -0
  726. package/src/client/lark-inbox/i18n.ts +125 -0
  727. package/src/client/lark-inbox/lark-wizard.module.css +88 -0
  728. package/src/client/lark-inbox/wizard.tsx +211 -0
  729. package/src/client/notify/i18n.ts +93 -0
  730. package/src/client/settings/family-scope.ts +45 -0
  731. package/src/client/settings/lark-inbox.tsx +319 -0
  732. package/src/client/settings/notify.tsx +288 -0
  733. package/src/client/settings/primitives-0.2.ts +148 -0
  734. package/src/client/settings/settings-shell.module.css +56 -0
  735. package/src/client/sidebar/RenderBoundary.tsx +17 -0
  736. package/src/client/sidebar/agent-browser.tsx +114 -0
  737. package/src/client/sidebar/diff-view.tsx +314 -0
  738. package/src/client/sidebar/git-workbench.tsx +700 -0
  739. package/src/client/sidebar/icons.tsx +23 -0
  740. package/src/client/sidebar/index.ts +28 -0
  741. package/src/client/sidebar/native-panels.tsx +149 -0
  742. package/src/client/sidebar/page-shell.module.css +96 -0
  743. package/src/client/sidebar/page-shell.tsx +86 -0
  744. package/src/client/sidebar/panels/memoir/api.ts +300 -0
  745. package/src/client/sidebar/panels/memoir/controller.ts +47 -0
  746. package/src/client/sidebar/panels/memoir/cwd.ts +140 -0
  747. package/src/client/sidebar/panels/memoir/i18n.ts +300 -0
  748. package/src/client/sidebar/panels/memoir/panel-activation.ts +42 -0
  749. package/src/client/sidebar/panels/memoir/panel.tsx +869 -0
  750. package/src/client/sidebar/panels/memoir/styles.ts +776 -0
  751. package/src/client/sidebar/panels/memoir/types.ts +7 -0
  752. package/src/client/sidebar/panels/ssh/ClusterTab.tsx +123 -0
  753. package/src/client/sidebar/panels/ssh/HostFormDialog.tsx +243 -0
  754. package/src/client/sidebar/panels/ssh/HostsTab.tsx +290 -0
  755. package/src/client/sidebar/panels/ssh/SshPanel.tsx +76 -0
  756. package/src/client/sidebar/panels/ssh/TerminalTab.tsx +290 -0
  757. package/src/client/sidebar/panels/ssh/TransferTab.tsx +232 -0
  758. package/src/client/sidebar/panels/ssh/TunnelsTab.tsx +204 -0
  759. package/src/client/sidebar/panels/ssh/api.ts +388 -0
  760. package/src/client/sidebar/panels/ssh/controller.ts +48 -0
  761. package/src/client/sidebar/panels/ssh/helpers.ts +70 -0
  762. package/src/client/sidebar/panels/ssh/locales.ts +318 -0
  763. package/src/client/sidebar/panels/ssh/panel.module.css +801 -0
  764. package/src/client/sidebar/panels/ssh/xterm.css.ts +2 -0
  765. package/src/client/sidebar/right-pane-i18n.ts +243 -0
  766. package/src/client/sidebar/right-pane.tsx +156 -0
  767. package/src/client/sidebar/scope.ts +54 -0
  768. package/src/client/sidebar/sidebar-header.module.css +72 -0
  769. package/src/client/sidebar/sidebar.module.css +619 -0
  770. package/src/client/trust.ts +187 -0
  771. package/src/client/ui-icons.ts +35 -0
  772. package/src/core/git-graph/commands.ts +107 -0
  773. package/src/core/git-graph/protocol.ts +238 -0
  774. package/src/core/index.ts +2 -0
  775. package/src/core/lark-inbox/gating.ts +35 -0
  776. package/src/core/lark-inbox/queue.ts +100 -0
  777. package/src/core/memoir/protocol.ts +46 -0
  778. package/src/core/no-browser-auth/contract.ts +25 -0
  779. package/src/core/notify/contract.ts +236 -0
  780. package/src/core/notify/feed.ts +235 -0
  781. package/src/core/playwright-sessions/contracts.ts +143 -0
  782. package/src/core/playwright-sessions/control.ts +33 -0
  783. package/src/core/playwright-sessions/index.ts +3 -0
  784. package/src/core/playwright-sessions/names.ts +83 -0
  785. package/src/core/playwright-sessions/schema.ts +102 -0
  786. package/src/core/playwright-sessions/wire.ts +142 -0
  787. package/src/core/remote-access/paths.ts +23 -0
  788. package/src/core/remote-web-ui/security.ts +171 -0
  789. package/src/core/right-pane/protocol.ts +94 -0
  790. package/src/core/schedule-mode/index.ts +6 -0
  791. package/src/core/schedule-mode/native.ts +105 -0
  792. package/src/core/schedule-mode/types.ts +182 -0
  793. package/src/core/schedule-mode/view.ts +66 -0
  794. package/src/core/ssh/protocol.ts +212 -0
  795. package/src/core/subagent-model/badges.ts +161 -0
  796. package/src/core/worktree/invariant.ts +101 -0
  797. package/src/core/worktree/manifest.ts +135 -0
  798. package/src/core/worktree/paths.ts +123 -0
  799. package/src/core/worktree/pr-create.ts +157 -0
  800. package/src/core/worktree/protocol.ts +7 -0
  801. package/src/core/worktree/types.ts +317 -0
  802. package/src/core/worktree/workspace-model.ts +61 -0
  803. package/src/host/services/access-trust/index.ts +127 -0
  804. package/src/host/services/access-trust/trust.ts +189 -0
  805. package/src/host/services/codex-bridge/bridge.ts +392 -0
  806. package/src/host/services/codex-bridge/codex-auth.ts +352 -0
  807. package/src/host/services/codex-bridge/dsh-integration.ts +169 -0
  808. package/src/host/services/codex-bridge/http.ts +105 -0
  809. package/src/host/services/codex-bridge/index.ts +154 -0
  810. package/src/host/services/codex-bridge/loopback.ts +63 -0
  811. package/src/host/services/codex-bridge/routes.ts +143 -0
  812. package/src/host/services/family-config.ts +224 -0
  813. package/src/host/services/family-namespaces.ts +39 -0
  814. package/src/host/services/git-graph/index.ts +11 -0
  815. package/src/host/services/git-graph/routes.ts +212 -0
  816. package/src/host/services/git-graph/service.ts +305 -0
  817. package/src/host/services/index.ts +94 -0
  818. package/src/host/services/lark-inbox/config.ts +66 -0
  819. package/src/host/services/lark-inbox/gateway.ts +184 -0
  820. package/src/host/services/lark-inbox/host-routes.ts +113 -0
  821. package/src/host/services/lark-inbox/inbox-store.ts +160 -0
  822. package/src/host/services/lark-inbox/index.ts +141 -0
  823. package/src/host/services/lark-inbox/tools.ts +124 -0
  824. package/src/host/services/lark-inbox/wizard.ts +206 -0
  825. package/src/host/services/lifecycle.ts +107 -0
  826. package/src/host/services/memoir/index.ts +80 -0
  827. package/src/host/services/memoir/routes.ts +346 -0
  828. package/src/host/services/memoir/settings.ts +122 -0
  829. package/src/host/services/memoir/store.ts +132 -0
  830. package/src/host/services/memoir/tools.ts +158 -0
  831. package/src/host/services/no-browser-auth/index.ts +70 -0
  832. package/src/host/services/notify/config.ts +178 -0
  833. package/src/host/services/notify/feishu-sender.ts +220 -0
  834. package/src/host/services/notify/host-routes.ts +133 -0
  835. package/src/host/services/notify/index.ts +305 -0
  836. package/src/host/services/playwright-sessions/child.ts +251 -0
  837. package/src/host/services/playwright-sessions/controller.ts +102 -0
  838. package/src/host/services/playwright-sessions/index.ts +146 -0
  839. package/src/host/services/playwright-sessions/live-view.ts +225 -0
  840. package/src/host/services/playwright-sessions/manager.ts +239 -0
  841. package/src/host/services/playwright-sessions/profile-gc.ts +97 -0
  842. package/src/host/services/playwright-sessions/routes.ts +90 -0
  843. package/src/host/services/remote-access/boot-scripts.ts +118 -0
  844. package/src/host/services/remote-access/index.ts +62 -0
  845. package/src/host/services/remote-access/routes.ts +137 -0
  846. package/src/host/services/remote-web-ui/index.ts +344 -0
  847. package/src/host/services/remote-web-ui/server-mode/accounts.ts +423 -0
  848. package/src/host/services/remote-web-ui/server-mode/cookie.ts +57 -0
  849. package/src/host/services/remote-web-ui/server-mode/dsh-home.ts +42 -0
  850. package/src/host/services/remote-web-ui/server-mode/external-auth.ts +296 -0
  851. package/src/host/services/remote-web-ui/server-mode/fence.ts +27 -0
  852. package/src/host/services/remote-web-ui/server-mode/gateway-routes.ts +797 -0
  853. package/src/host/services/remote-web-ui/server-mode/gateway.ts +684 -0
  854. package/src/host/services/remote-web-ui/server-mode/http.ts +105 -0
  855. package/src/host/services/remote-web-ui/server-mode/integrated-auth.ts +118 -0
  856. package/src/host/services/remote-web-ui/server-mode/lan.ts +19 -0
  857. package/src/host/services/remote-web-ui/server-mode/loopback.ts +63 -0
  858. package/src/host/services/remote-web-ui/server-mode/posture.ts +154 -0
  859. package/src/host/services/remote-web-ui/server-mode/roles.ts +51 -0
  860. package/src/host/services/remote-web-ui/server-mode/server-boot.ts +38 -0
  861. package/src/host/services/remote-web-ui/server-mode/sessions.ts +347 -0
  862. package/src/host/services/remote-web-ui/server.ts +591 -0
  863. package/src/host/services/resources.ts +78 -0
  864. package/src/host/services/right-pane/browser.ts +106 -0
  865. package/src/host/services/right-pane/index.ts +117 -0
  866. package/src/host/services/right-pane/wire.ts +10 -0
  867. package/src/host/services/schedule-mode/config.ts +26 -0
  868. package/src/host/services/schedule-mode/engine.ts +689 -0
  869. package/src/host/services/schedule-mode/index.ts +214 -0
  870. package/src/host/services/schedule-mode/routes.ts +130 -0
  871. package/src/host/services/schedule-mode/session-create.ts +36 -0
  872. package/src/host/services/schedule-mode/store.ts +304 -0
  873. package/src/host/services/schedule-mode/tools.ts +154 -0
  874. package/src/host/services/ssh/engine.ts +675 -0
  875. package/src/host/services/ssh/host-keys.ts +99 -0
  876. package/src/host/services/ssh/index.ts +84 -0
  877. package/src/host/services/ssh/routes.ts +442 -0
  878. package/src/host/services/ssh/store.ts +310 -0
  879. package/src/host/services/ssh/terminal-ws.ts +157 -0
  880. package/src/host/services/ssh/tools.ts +279 -0
  881. package/src/host/services/web-render/contracts.ts +138 -0
  882. package/src/host/services/web-render/index.ts +112 -0
  883. package/src/host/services/web-render/provider.ts +282 -0
  884. package/src/host/services/web-search-anthropic/contracts.ts +163 -0
  885. package/src/host/services/web-search-anthropic/index.ts +152 -0
  886. package/src/host/services/web-search-anthropic/provider.ts +325 -0
  887. package/src/host/services/worktree/git-runner.ts +124 -0
  888. package/src/host/services/worktree/git.ts +183 -0
  889. package/src/host/services/worktree/http.ts +36 -0
  890. package/src/host/services/worktree/index.ts +92 -0
  891. package/src/host/services/worktree/lane-tool.ts +100 -0
  892. package/src/host/services/worktree/manager.ts +1553 -0
  893. package/src/host/services/worktree/model-override.ts +43 -0
  894. package/src/host/services/worktree/routes.ts +570 -0
  895. package/src/host/services/worktree/run-command.ts +66 -0
  896. package/src/host/services/worktree/session-lane/manager.ts +228 -0
  897. package/src/host/services/worktree/workspace-model-routes.ts +156 -0
  898. package/src/host/services/worktree/workspace-model.ts +132 -0
  899. package/src/index.ts +84 -0
  900. package/src/invariant.ts +4 -0
@@ -0,0 +1,591 @@
1
+ /**
2
+ * dsh-remote-web-ui — server-mode plugin entry (host half).
3
+ *
4
+ * Server mode replaces the QR pairing model: this plugin turns `dsh web`
5
+ * into a deployable server on the LAN (and, with TLS configured, addressable
6
+ * from anywhere) without ever trusting the SDK's /api transport fence to be
7
+ * an authentication layer. The plugin owns ONE public listener — the
8
+ * gateway (default 0.0.0.0:3082, optional built-in TLS) — in front of the
9
+ * loopback webServer. Every request passes the account/session wall and the
10
+ * role check, then the gateway re-issues it to 127.0.0.1 as a loopback-shaped
11
+ * call (Host rewritten to loopback, same-origin marker, client cookies and
12
+ * Origin stripped), so the full host surface — including the SDK's
13
+ * loopback-pinned privileged methods — is reachable exactly as far as the
14
+ * role policy allows.
15
+ *
16
+ * Loopback-only surfaces stay on the webServer (never reachable directly
17
+ * from the LAN without the gateway): the /api/gateway admin surface
18
+ * (accounts + sessions, first-admin bootstrap). The gateway proxies every
19
+ * other path after the wall.
20
+ */
21
+
22
+ import { join } from 'node:path'
23
+ import { setInterval as nodeSetInterval, setTimeout as nodeSetTimeout } from 'node:timers'
24
+ import type { IncomingMessage, ServerResponse } from 'node:http'
25
+ import type { Context } from '@deepseek-ai/cordis'
26
+ import type {} from '@deepseek-ai/dsh-settings'
27
+ import z from 'schemastery'
28
+ import { familyNamespace, onFamilyConfigChange, registerFamilyNamespace } from '../family-config.ts'
29
+ import { registerResources, type OwnResource } from '../resources.ts'
30
+ import type { WebRoute } from '@deepseek-ai/dsh-host-webserver'
31
+
32
+ import { AccountStore, randomSalt } from './server-mode/accounts.ts'
33
+ import {
34
+ DEFAULT_IDLE_EXPIRE_MS,
35
+ DEFAULT_MAX_AGE_MS,
36
+ randomSessionId,
37
+ SessionStore,
38
+ } from './server-mode/sessions.ts'
39
+ import {
40
+ GATEWAY_API_PREFIX,
41
+ isPreAuthGatewayPath,
42
+ LoginLimiter,
43
+ makeGatewayRequestHandler,
44
+ type GatewayStatus,
45
+ } from './server-mode/gateway-routes.ts'
46
+ import { Gateway } from './server-mode/gateway.ts'
47
+ import { dshHome } from './server-mode/dsh-home.ts'
48
+ import { isLoopbackAdmin } from './server-mode/fence.ts'
49
+ import { claimPostureKey, postureTargets, probePosture, releasePostureKey } from './server-mode/posture.ts'
50
+ import { lanIPv4Addresses } from './server-mode/lan.ts'
51
+ import { SERVER_BOOT_SCRIPT } from './server-mode/server-boot.ts'
52
+ import { writeJson } from './server-mode/http.ts'
53
+ import {
54
+ installIntegratedBrowserAuth,
55
+ type BrowserConnectionLike,
56
+ } from './server-mode/integrated-auth.ts'
57
+ import { makeSetCookie, readCookie } from './server-mode/cookie.ts'
58
+ import {
59
+ ExternalAuthService,
60
+ externalAccountName,
61
+ type FeishuProviderConfig,
62
+ type OidcProviderConfig,
63
+ } from './server-mode/external-auth.ts'
64
+ import { safeLoginTarget } from './server-mode/integrated-auth.ts'
65
+
66
+ /** Stable cordis plugin name. */
67
+ /** Services required before the server-mode surfaces can mount. */
68
+ /**
69
+ * Settings namespace of the remote-control capability — the section the web
70
+ * settings surface edits. Spelled here rather than imported: the browser
71
+ * half spells the same value and must not depend on a Host package.
72
+ */
73
+ export const REMOTE_WEB_UI_SETTINGS_NAMESPACE = 'remote-web-ui'
74
+
75
+ /** Plugin config, validated by the same-named schemastery schema. */
76
+ export interface Config {
77
+ /** Master switch for the authenticated remote Web surface. */
78
+ enabled?: boolean
79
+ /** Accept account sessions on DSH's own Web origin. */
80
+ integratedAuthEnabled?: boolean
81
+ /** Compatibility listener on serverHost:serverPort. Disabled by default. */
82
+ legacyGatewayEnabled?: boolean
83
+ /** Gateway listen host (default 0.0.0.0 — the only public listener). */
84
+ serverHost?: string
85
+ /** Gateway listen port (default 3082; 0 requests an OS-assigned port). */
86
+ serverPort?: number
87
+ /**
88
+ * Optional built-in TLS: absolute path to the PEM certificate chain. Both
89
+ * cert and key must be set for the gateway to serve https (Secure cookies
90
+ * follow automatically). Paths are read at each listener (re)start.
91
+ */
92
+ serverTlsCert?: string
93
+ /** Optional built-in TLS: absolute path to the PEM private key. */
94
+ serverTlsKey?: string
95
+ /** Session cookie name (default dsh_gw_session). */
96
+ cookieName?: string
97
+ /** Session idle expiry (default 7 days of inactivity). */
98
+ idleExpireMs?: number
99
+ /** Session absolute lifetime cap (default 30 days). */
100
+ maxAgeMs?: number
101
+ /** Account store file (default $DSH_HOME/remote-web-ui-accounts.json, 0600). */
102
+ accountsFile?: string
103
+ /** Session store file (default $DSH_HOME/remote-web-ui-sessions.json, 0600). */
104
+ sessionsFile?: string
105
+ /**
106
+ * First-run bootstrap: when the account store is empty and both values are
107
+ * set, an admin account is created at startup (used for unattended
108
+ * deployments; the loopback admin surface can also create it manually).
109
+ */
110
+ bootstrapAdminUsername?: string
111
+ /** Bootstrap admin password (min 8 characters). */
112
+ bootstrapAdminPassword?: string
113
+ /** Public HTTPS origin used to build OAuth/OIDC callbacks. */
114
+ publicBaseUrl?: string
115
+ /** Generic OIDC providers. */
116
+ oidcProviders?: OidcProviderConfig[]
117
+ /** Feishu/Lark web-login provider. */
118
+ feishuAuth?: FeishuProviderConfig
119
+ }
120
+
121
+ export const Config = z.object({
122
+ enabled: z.boolean().default(true),
123
+ integratedAuthEnabled: z.boolean().default(true),
124
+ legacyGatewayEnabled: z.boolean().default(false),
125
+ serverHost: z.string().min(1).default('0.0.0.0'),
126
+ serverPort: z.number().step(1).min(0).max(65_535).default(3082),
127
+ serverTlsCert: z.string(),
128
+ // This is a filesystem path, not private-key content. Keep it readable so
129
+ // settings round-trips do not erase a configured path behind secret redaction.
130
+ serverTlsKey: z.string(),
131
+ cookieName: z.string().min(1).default('dsh_gw_session'),
132
+ idleExpireMs: z.number().step(1).min(60_000).default(DEFAULT_IDLE_EXPIRE_MS),
133
+ maxAgeMs: z.number().step(1).min(60_000).default(DEFAULT_MAX_AGE_MS),
134
+ accountsFile: z.string(),
135
+ sessionsFile: z.string(),
136
+ bootstrapAdminUsername: z.string(),
137
+ bootstrapAdminPassword: z.string().role('secret'),
138
+ publicBaseUrl: z.string(),
139
+ oidcProviders: z.array(z.object({
140
+ id: z.string(),
141
+ label: z.string(),
142
+ issuer: z.string(),
143
+ clientId: z.string(),
144
+ clientSecret: z.string().role('secret'),
145
+ scopes: z.array(z.string()).default(['openid', 'profile', 'email']),
146
+ allowedSubjects: z.array(z.string()).default([]),
147
+ allowedEmailDomains: z.array(z.string()).default([]),
148
+ defaultRole: z.union(['admin', 'user']).default('user'),
149
+ })).default([]),
150
+ feishuAuth: z.object({
151
+ id: z.string().default('feishu'),
152
+ label: z.string().default('飞书'),
153
+ appId: z.string(),
154
+ appSecret: z.string().role('secret'),
155
+ authorizationUrl: z.string().default('https://accounts.feishu.cn/open-apis/authen/v1/authorize'),
156
+ baseUrl: z.string().default('https://open.feishu.cn'),
157
+ allowedOpenIds: z.array(z.string()).default([]),
158
+ defaultRole: z.union(['admin', 'user']).default('user'),
159
+ }),
160
+ }) as unknown as z<Config>
161
+
162
+ registerFamilyNamespace(REMOTE_WEB_UI_SETTINGS_NAMESPACE, Config)
163
+
164
+ /** Fully resolved configuration (every field concrete). */
165
+ interface ResolvedConfig {
166
+ enabled: boolean
167
+ integratedAuthEnabled: boolean
168
+ legacyGatewayEnabled: boolean
169
+ serverHost: string
170
+ serverPort: number
171
+ serverTlsCert?: string
172
+ serverTlsKey?: string
173
+ cookieName: string
174
+ idleExpireMs: number
175
+ maxAgeMs: number
176
+ accountsFile: string
177
+ sessionsFile: string
178
+ bootstrapAdminUsername?: string
179
+ bootstrapAdminPassword?: string
180
+ publicBaseUrl?: string
181
+ oidcProviders: OidcProviderConfig[]
182
+ feishuAuth?: FeishuProviderConfig
183
+ }
184
+
185
+ /** The whole host-half behavior, factored for tests. */
186
+ export function registerServerMode(ctx: Context, config: Config = {}, env: { dshHome: string } = { dshHome: dshHome() }): () => void {
187
+ return registerResources(own => registerOwnedServerMode(ctx, config, env, own))
188
+ }
189
+
190
+ function registerOwnedServerMode(ctx: Context, config: Config, env: { dshHome: string }, own: OwnResource<() => void>): void {
191
+ let disposed = false
192
+ own(() => { disposed = true })
193
+ const home = env.dshHome
194
+ const DEFAULTS: Omit<ResolvedConfig, 'serverTlsCert' | 'serverTlsKey' | 'bootstrapAdminUsername' | 'bootstrapAdminPassword' | 'publicBaseUrl' | 'feishuAuth'> = {
195
+ enabled: true,
196
+ integratedAuthEnabled: true,
197
+ legacyGatewayEnabled: false,
198
+ serverHost: '0.0.0.0',
199
+ serverPort: 3082,
200
+ cookieName: 'dsh_gw_session',
201
+ idleExpireMs: DEFAULT_IDLE_EXPIRE_MS,
202
+ maxAgeMs: DEFAULT_MAX_AGE_MS,
203
+ accountsFile: join(home, 'remote-web-ui-accounts.json'),
204
+ sessionsFile: join(home, 'remote-web-ui-sessions.json'),
205
+ oidcProviders: [],
206
+ }
207
+
208
+ // The live source the surfaces read: the settings section once the web
209
+ // settings surface is served, the composition entry otherwise.
210
+ let current: () => Config = () => config ?? {}
211
+ const resolve = (): ResolvedConfig => {
212
+ const value = current()
213
+ return {
214
+ enabled: value.enabled ?? DEFAULTS.enabled,
215
+ integratedAuthEnabled: value.integratedAuthEnabled ?? DEFAULTS.integratedAuthEnabled,
216
+ legacyGatewayEnabled: value.legacyGatewayEnabled ?? DEFAULTS.legacyGatewayEnabled,
217
+ serverHost: value.serverHost ?? DEFAULTS.serverHost,
218
+ serverPort: value.serverPort ?? DEFAULTS.serverPort,
219
+ serverTlsCert: value.serverTlsCert,
220
+ serverTlsKey: value.serverTlsKey,
221
+ cookieName: value.cookieName ?? DEFAULTS.cookieName,
222
+ idleExpireMs: value.idleExpireMs ?? DEFAULTS.idleExpireMs,
223
+ maxAgeMs: value.maxAgeMs ?? DEFAULTS.maxAgeMs,
224
+ accountsFile: value.accountsFile ?? DEFAULTS.accountsFile,
225
+ sessionsFile: value.sessionsFile ?? DEFAULTS.sessionsFile,
226
+ bootstrapAdminUsername: value.bootstrapAdminUsername,
227
+ bootstrapAdminPassword: value.bootstrapAdminPassword,
228
+ publicBaseUrl: value.publicBaseUrl,
229
+ oidcProviders: value.oidcProviders ?? DEFAULTS.oidcProviders,
230
+ feishuAuth: value.feishuAuth?.appId && value.feishuAuth.appSecret ? value.feishuAuth : undefined,
231
+ }
232
+ }
233
+
234
+ // ── stores (rebuilt when a configured file path changes) ────────────────
235
+ let accountsFile = ''
236
+ let sessionsFile = ''
237
+ let accounts = new AccountStore(DEFAULTS.accountsFile, { now: () => Date.now(), randomSalt })
238
+ let sessions = new SessionStore(DEFAULTS.sessionsFile, { now: () => Date.now(), randomId: randomSessionId }, { idleExpireMs: DEFAULTS.idleExpireMs, maxAgeMs: DEFAULTS.maxAgeMs })
239
+ let externalAuthKey = ''
240
+ let externalAuth = new ExternalAuthService({})
241
+ const limiter = new LoginLimiter()
242
+
243
+ const ensureStores = (): void => {
244
+ const value = resolve()
245
+ if (value.accountsFile === accountsFile && value.sessionsFile === sessionsFile) return
246
+ accountsFile = value.accountsFile
247
+ sessionsFile = value.sessionsFile
248
+ const now = () => Date.now()
249
+ accounts = new AccountStore(accountsFile, { now, randomSalt })
250
+ sessions = new SessionStore(sessionsFile, { now, randomId: randomSessionId }, { idleExpireMs: value.idleExpireMs, maxAgeMs: value.maxAgeMs })
251
+ sessions.bindAccounts(accounts)
252
+ }
253
+
254
+ sessions.bindAccounts(accounts)
255
+
256
+ const ensureExternalAuth = (): ExternalAuthService => {
257
+ const value = resolve()
258
+ const key = JSON.stringify({ oidc: value.oidcProviders, feishu: value.feishuAuth })
259
+ if (key !== externalAuthKey) {
260
+ externalAuthKey = key
261
+ externalAuth = new ExternalAuthService({ oidc: value.oidcProviders, feishu: value.feishuAuth })
262
+ }
263
+ return externalAuth
264
+ }
265
+
266
+ // Compose the account session into DSH's own BrowserAuth. Connection keeps
267
+ // owning Host/Origin trust and the launch-token break-glass flow; its native
268
+ // index, HTTP RPC and /api/remote.mux paths all consult these methods.
269
+ const connection = (ctx as Context & { connection?: BrowserConnectionLike }).connection
270
+ ?? (ctx as Context & { get?: (id: string, strict?: boolean) => unknown }).get?.call(ctx, 'connection', false) as BrowserConnectionLike | undefined
271
+ if (connection === undefined) throw new Error('remote-web-ui: connection service unavailable for integrated WebAuth')
272
+ own(installIntegratedBrowserAuth(connection, {
273
+ enabled: () => resolve().enabled && resolve().integratedAuthEnabled,
274
+ hasSession: (request) => {
275
+ ensureStores()
276
+ const sessionId = readCookie(request.headers.cookie, resolve().cookieName)
277
+ try { return sessionId !== undefined && sessions.touch(sessionId) !== undefined } catch { return false }
278
+ },
279
+ }))
280
+
281
+ // ── first-run bootstrap ─────────────────────────────────────────────────
282
+ const applyBootstrap = (): void => {
283
+ const value = resolve()
284
+ if (
285
+ accounts.canBootstrap()
286
+ && value.bootstrapAdminUsername !== undefined
287
+ && value.bootstrapAdminPassword !== undefined
288
+ && value.bootstrapAdminPassword.length >= 8
289
+ ) {
290
+ accounts.create(value.bootstrapAdminUsername, value.bootstrapAdminPassword, 'admin')
291
+ console.log(`remote-web-ui: bootstrapped the first admin account "${value.bootstrapAdminUsername}"`)
292
+ }
293
+ }
294
+
295
+ // ── gateway lifecycle ───────────────────────────────────────────────────
296
+ const webServerPort = ctx.webServer.port
297
+ const tlsConfiguredOf = (value: ResolvedConfig): boolean =>
298
+ value.serverTlsCert !== undefined && value.serverTlsCert !== ''
299
+ && value.serverTlsKey !== undefined && value.serverTlsKey !== ''
300
+
301
+ const buildStatus = (): GatewayStatus => {
302
+ const value = resolve()
303
+ return {
304
+ loginRequired: true,
305
+ cookieName: value.cookieName,
306
+ tls: false,
307
+ noAccounts: accounts.isEmpty(),
308
+ port: value.serverPort,
309
+ host: value.serverHost,
310
+ secure: tlsConfiguredOf(value),
311
+ }
312
+ }
313
+ let status: GatewayStatus = buildStatus()
314
+ let gateway: Gateway | undefined
315
+ let gatewayKey = ''
316
+ let gatewayTail: Promise<void> = Promise.resolve()
317
+ own(() => {
318
+ disposed = true
319
+ // Drain already queued starts too: an in-flight start may not yet have
320
+ // published its Gateway into `gateway` when synchronous rollback runs.
321
+ gatewayTail = gatewayTail.catch(() => {}).then(async () => {
322
+ const old = gateway
323
+ gateway = undefined
324
+ if (old !== undefined) await old.close()
325
+ })
326
+ void gatewayTail.catch(error => { console.error('remote-web-ui: gateway cleanup failed:', error) })
327
+ })
328
+ let noAccountsLogged = false
329
+
330
+ const sessionRoutes = (): ReturnType<typeof makeGatewayRequestHandler> => {
331
+ const value = resolve()
332
+ ensureStores()
333
+ return makeGatewayRequestHandler('session', {
334
+ accounts,
335
+ sessions,
336
+ cookieName: value.cookieName,
337
+ secure: tlsConfiguredOf(value),
338
+ limiter,
339
+ status,
340
+ onAccountsChanged: applyGateway,
341
+ })
342
+ }
343
+ const loopbackRoutes = (): ReturnType<typeof makeGatewayRequestHandler> => {
344
+ ensureStores()
345
+ return makeGatewayRequestHandler('loopback', {
346
+ accounts,
347
+ sessions,
348
+ cookieName: resolve().cookieName,
349
+ secure: false,
350
+ limiter,
351
+ status,
352
+ onAccountsChanged: applyGateway,
353
+ })
354
+ }
355
+
356
+ /** (Re)apply the listener after config/store changes. Serialized. */
357
+ const applyGateway = (): void => {
358
+ if (disposed) return
359
+ const value = resolve()
360
+ const tlsOn = tlsConfiguredOf(value)
361
+ const key = `${value.serverHost}|${value.serverPort}|${tlsOn}|${value.cookieName}|${value.accountsFile}|${value.sessionsFile}`
362
+ gatewayTail = gatewayTail.then(async () => {
363
+ if (disposed) return
364
+ const shouldRun = resolve().enabled && resolve().legacyGatewayEnabled && !accounts.isEmpty()
365
+ if (gateway !== undefined && (!shouldRun || key !== gatewayKey)) {
366
+ const old = gateway
367
+ gateway = undefined
368
+ gatewayKey = ''
369
+ await old.close()
370
+ }
371
+ if (disposed) return
372
+ if (shouldRun && gateway === undefined) {
373
+ const next = new Gateway({
374
+ host: value.serverHost,
375
+ port: value.serverPort,
376
+ tlsCert: tlsOn ? value.serverTlsCert : undefined,
377
+ tlsKey: tlsOn ? value.serverTlsKey : undefined,
378
+ upstreamPort: webServerPort,
379
+ cookieName: value.cookieName,
380
+ routes: sessionRoutes(),
381
+ // Integrated WebAuth owns login/session on the DSH origin. The legacy
382
+ // listener stays a pure transport for those paths so the login page,
383
+ // provider list and cookies always describe the real browser origin.
384
+ proxyAuthRoutes: value.integratedAuthEnabled,
385
+ }, sessions)
386
+ try {
387
+ await next.start()
388
+ if (disposed) {
389
+ await next.close()
390
+ return
391
+ }
392
+ gateway = next
393
+ gatewayKey = key
394
+ console.log(`remote-web-ui: gateway listening on ${tlsOn ? 'https' : 'http'}://${value.serverHost}:${String(next.port)}${tlsOn ? ' (TLS)' : ' — WARNING: no TLS, plaintext LAN session'}`)
395
+ const scheme = next.secure ? 'https' : 'http'
396
+ const urls = lanIPv4Addresses().map(ip => `${scheme}://${ip}:${String(next.port)}/`).join(' , ')
397
+ console.log(`remote-web-ui: server reachable on the LAN at ${urls}`)
398
+ status.noAccounts = false
399
+ } catch (error) {
400
+ // start() may already have allocated its server before rejecting.
401
+ await next.close().catch(cleanupError => { console.error('remote-web-ui: failed gateway cleanup:', cleanupError) })
402
+ console.error(`remote-web-ui: gateway failed to start on ${value.serverHost}:${String(value.serverPort)}:`, error)
403
+ }
404
+ }
405
+ // Refresh the status probe the admin surface and boot redirect read.
406
+ status = buildStatus()
407
+ if (gateway !== undefined) status.secure = gateway.secure
408
+ const empty = accounts.isEmpty()
409
+ status.noAccounts = empty
410
+ if (empty && resolve().enabled && (resolve().integratedAuthEnabled || resolve().legacyGatewayEnabled) && !noAccountsLogged) {
411
+ noAccountsLogged = true
412
+ console.error('remote-web-ui: FAIL-CLOSED — no accounts exist, the gateway is held. Create the first admin account at http://127.0.0.1:3080/api/gateway/accounts (loopback only) or set bootstrapAdminUsername/bootstrapAdminPassword in the plugin config.')
413
+ }
414
+ })
415
+ }
416
+
417
+ const requestOrigin = (request: IncomingMessage): string => {
418
+ const configured = resolve().publicBaseUrl
419
+ if (configured !== undefined && configured !== '') return new URL(configured).origin
420
+ const host = request.headers.host
421
+ if (typeof host !== 'string' || host === '') throw new Error('missing request Host')
422
+ const forwarded = request.headers['x-forwarded-proto']
423
+ const protocol = typeof forwarded === 'string' && forwarded.split(',')[0].trim() === 'https' ? 'https' : 'http'
424
+ return `${protocol}://${host}`
425
+ }
426
+
427
+ const externalAuthHandler = async (request: IncomingMessage, response: ServerResponse): Promise<void> => {
428
+ try {
429
+ const url = new URL(request.url ?? '/', 'http://dsh.invalid')
430
+ const match = /^\/auth\/([a-z][a-z0-9-]{1,31})\/(start|callback)$/.exec(url.pathname)
431
+ if (request.method !== 'GET' || match === null) {
432
+ response.writeHead(404); response.end(); return
433
+ }
434
+ const providerId = match[1]
435
+ const action = match[2]
436
+ const callback = `${requestOrigin(request)}/auth/${providerId}/callback`
437
+ if (action === 'start') {
438
+ const next = safeLoginTarget(url.searchParams.get('next') ?? '/')
439
+ const target = await ensureExternalAuth().begin(providerId, callback, next)
440
+ response.writeHead(302, { location: target.href, 'cache-control': 'no-store', 'referrer-policy': 'no-referrer' })
441
+ response.end()
442
+ return
443
+ }
444
+ if (url.searchParams.get('error') !== null) throw new Error('external authorization was declined')
445
+ const code = url.searchParams.get('code')
446
+ const stateValue = url.searchParams.get('state')
447
+ if (code === null || stateValue === null) throw new Error('authorization callback is missing code or state')
448
+ const result = await ensureExternalAuth().callback(providerId, callback, code, stateValue)
449
+ ensureStores()
450
+ const username = externalAccountName(result.principal)
451
+ const account = accounts.ensureExternal(username, result.principal.role)
452
+ if (!account.enabled) throw new Error('external account is disabled')
453
+ const session = sessions.issue(username, account.role, { userAgent: request.headers['user-agent'], ip: request.socket.remoteAddress })
454
+ response.writeHead(303, {
455
+ location: safeLoginTarget(result.next),
456
+ 'cache-control': 'no-store',
457
+ 'referrer-policy': 'no-referrer',
458
+ 'set-cookie': makeSetCookie(resolve().cookieName, session.id, { secure: requestOrigin(request).startsWith('https:'), maxAgeSeconds: Math.floor(resolve().maxAgeMs / 1000) }),
459
+ })
460
+ response.end()
461
+ } catch (error) {
462
+ response.writeHead(400, { 'content-type': 'text/html; charset=utf-8', 'cache-control': 'no-store', 'referrer-policy': 'no-referrer' })
463
+ response.end(`<!doctype html><meta charset="utf-8"><meta name="viewport" content="width=device-width,initial-scale=1"><title>登录失败</title><main><h1>登录失败</h1><p>${String(error instanceof Error ? error.message : error).replace(/[&<>"']/g, character => ({ '&': '&amp;', '<': '&lt;', '>': '&gt;', '"': '&quot;', "'": '&#39;' }[character] ?? character))}</p><p><a href="/login">返回登录</a></p></main>`)
464
+ }
465
+ }
466
+
467
+ const providerListHandler = (_request: IncomingMessage, response: ServerResponse): void => {
468
+ writeJson(response, 200, { ok: true, providers: ensureExternalAuth().list() })
469
+ }
470
+
471
+ const originStatus = (request: IncomingMessage): GatewayStatus => {
472
+ const origin = requestOrigin(request)
473
+ const address = new URL(origin)
474
+ return {
475
+ ...status,
476
+ host: address.hostname,
477
+ port: address.port === '' ? (address.protocol === 'https:' ? 443 : 80) : Number(address.port),
478
+ tls: address.protocol === 'https:',
479
+ secure: address.protocol === 'https:',
480
+ }
481
+ }
482
+
483
+ const integratedSessionHandler = (request: IncomingMessage): ReturnType<typeof makeGatewayRequestHandler> =>
484
+ makeGatewayRequestHandler('session', {
485
+ accounts,
486
+ sessions,
487
+ cookieName: resolve().cookieName,
488
+ secure: requestOrigin(request).startsWith('https:'),
489
+ limiter,
490
+ status: originStatus(request),
491
+ onAccountsChanged: sync,
492
+ })
493
+
494
+ const integratedLoginHandler = async (request: IncomingMessage, response: ServerResponse): Promise<void> => {
495
+ await integratedSessionHandler(request)(request, response)
496
+ }
497
+
498
+ const integratedGatewayHandler = async (request: IncomingMessage, response: ServerResponse): Promise<void> => {
499
+ const url = new URL(request.url ?? '/', 'http://webserver.local')
500
+ const method = request.method ?? 'GET'
501
+ if (isPreAuthGatewayPath(method, url.pathname) || !isLoopbackAdmin(request)) {
502
+ await integratedSessionHandler(request)(request, response)
503
+ return
504
+ }
505
+ await loopbackRoutes()(request, response)
506
+ }
507
+
508
+ /** Every webServer route, rebuilt when settings change. */
509
+ const routes = (): WebRoute[] => [
510
+ { kind: 'exact', path: '/login', handler: integratedLoginHandler },
511
+ { kind: 'exact', path: '/api/gateway/auth/providers', handler: providerListHandler },
512
+ { kind: 'prefix', path: '/auth', handler: externalAuthHandler },
513
+ { kind: 'prefix', path: GATEWAY_API_PREFIX, handler: integratedGatewayHandler },
514
+ ]
515
+
516
+ // ── posture probe ───────────────────────────────────────────────────────
517
+ // Guardrail for the seam this plugin cannot close itself: the SDK's /api
518
+ // Host fence. Forged-Host probes against every LAN literal make a
519
+ // re-opened /api (a re-added --trusted-host, or the SDK's LAN auto-trust
520
+ // under 0.0.0.0) visible on the log instead of silently trusted.
521
+ let postureKey: string | undefined
522
+ let postureWasExposed = false
523
+ const runPostureProbe = (): void => {
524
+ if (disposed || !resolve().enabled) return
525
+ const targets = postureTargets(undefined, lanIPv4Addresses(), webServerPort)
526
+ if (targets.length === 0) {
527
+ postureKey = undefined
528
+ return
529
+ }
530
+ const key = targets.join('|')
531
+ const claim = claimPostureKey(postureKey, key)
532
+ if (!claim.run) return
533
+ postureKey = claim.next
534
+ void probePosture({ port: webServerPort, targets }).then((snapshot) => {
535
+ const exposedHosts = snapshot.hosts.filter(host => host.exposed).map(host => host.host)
536
+ const exposed = exposedHosts.length > 0
537
+ if (exposed && !postureWasExposed) {
538
+ console.error(`remote-web-ui: CRITICAL — the /api fence is OPEN for [${exposedHosts.join(', ')}]: requests that bypass the gateway reach the full host API. Remove --trusted-host for these hosts or bind loopback (the gateway is the only public door).`)
539
+ } else if (!exposed && postureWasExposed) {
540
+ console.log('remote-web-ui: the /api posture probe is clean again (every LAN literal refused with 403).')
541
+ }
542
+ postureWasExposed = exposed
543
+ }).catch(() => {
544
+ postureKey = releasePostureKey(postureKey, key)
545
+ })
546
+ }
547
+ // The first round waits for the connection plugin's /api route: a probe
548
+ // before it mounts would read the SPA fallback and false-positive.
549
+ const initialPostureTimer = nodeSetTimeout(() => { runPostureProbe() }, 5_000)
550
+ own(() => { clearTimeout(initialPostureTimer) })
551
+ initialPostureTimer.unref()
552
+
553
+ // ── sync: register routes + (re)apply the gateway on every change ──────
554
+ let disposeRoutes: (() => void) | undefined
555
+ own(() => { disposeRoutes?.(); disposeRoutes = undefined })
556
+ const sync = (): void => {
557
+ if (disposed) return
558
+ ensureStores()
559
+ applyBootstrap()
560
+ if (disposeRoutes !== undefined) {
561
+ disposeRoutes()
562
+ disposeRoutes = undefined
563
+ }
564
+ if (resolve().enabled) {
565
+ disposeRoutes = registerResources(ownRoute => {
566
+ for (const route of routes()) ownRoute(ctx.webServer.register(route))
567
+ })
568
+ }
569
+ applyGateway()
570
+ }
571
+
572
+ // Session sweep cadence: drop expired sessions promptly so the store file
573
+ // and the admin list never show dead rows.
574
+ const sessionSweepTimer = nodeSetInterval(() => { sessions.sweep() }, 60_000)
575
+ own(() => { clearInterval(sessionSweepTimer) })
576
+ sessionSweepTimer.unref()
577
+
578
+ // Inject the server-mode boot script that declares gateway host ownership
579
+ // (with a login redirect for unsigned sessions). The shared remote-access
580
+ // domain owns the remote-entry boot row plus the plain-HTTP shims, so this
581
+ // domain adds only its gateway-specific row.
582
+ own(ctx.on('webserver/index-inject', (table) => {
583
+ table.push({ kind: 'script', placement: 'head', text: SERVER_BOOT_SCRIPT })
584
+ }))
585
+
586
+ // 0.2:命名空间值取自聚合条目 Config 的 volatile 引用;设置变更由 loader 原地
587
+ // 热更新,userspace 只需在文档变更事件上重新 apply。
588
+ current = () => familyNamespace<Config>(REMOTE_WEB_UI_SETTINGS_NAMESPACE) ?? config ?? {}
589
+ own(onFamilyConfigChange(() => { sync() }))
590
+ sync()
591
+ }
@@ -0,0 +1,78 @@
1
+ /** Registration transactions for resources owned by one service domain. */
2
+ import type { ServiceDisposer } from './lifecycle.ts'
3
+
4
+ /** Record a disposer immediately after acquiring its resource. */
5
+ export type OwnResource<T extends ServiceDisposer = ServiceDisposer> = <D extends T>(dispose: D) => D
6
+
7
+ function failure(errors: unknown[]): void {
8
+ if (errors.length > 0) throw new AggregateError(errors, 'service resource cleanup failed')
9
+ }
10
+
11
+ /** Roll back partial synchronous setup and dispose every resource in reverse order. */
12
+ export function registerResources(setup: (own: OwnResource<() => void>) => void): () => void {
13
+ const resources: Array<() => void> = []
14
+ let disposed = false
15
+ const dispose = (): void => {
16
+ if (disposed) return
17
+ disposed = true
18
+ const errors: unknown[] = []
19
+ for (const release of resources.splice(0).reverse()) {
20
+ try { release() } catch (error) { errors.push(error) }
21
+ }
22
+ failure(errors)
23
+ }
24
+ try {
25
+ setup(release => {
26
+ if (disposed) release()
27
+ else resources.push(release)
28
+ return release
29
+ })
30
+ return dispose
31
+ } catch (error) {
32
+ try { dispose() } catch (cleanupError) {
33
+ throw new AggregateError([error, cleanupError], 'service registration and rollback failed')
34
+ }
35
+ throw error
36
+ }
37
+ }
38
+
39
+ /** Await rollback before rejecting asynchronous setup; disposal is single-shot and awaitable. */
40
+ export async function registerAsyncResources(setup: (own: OwnResource) => Promise<void>): Promise<() => Promise<void>> {
41
+ const resources: ServiceDisposer[] = []
42
+ let disposing: Promise<void> | undefined
43
+ const dispose = (): Promise<void> => {
44
+ disposing ??= (async () => {
45
+ const errors: unknown[] = []
46
+ for (const release of resources.splice(0).reverse()) {
47
+ try { await release() } catch (error) { errors.push(error) }
48
+ }
49
+ failure(errors)
50
+ })()
51
+ return disposing
52
+ }
53
+ try {
54
+ await setup(release => {
55
+ if (disposing === undefined) resources.push(release)
56
+ else {
57
+ // A failed setup may still have uncancelled asynchronous callbacks.
58
+ // Own their late acquisitions instead of stranding them after rollback.
59
+ let cleanup: void | Promise<void>
60
+ try { cleanup = release() } catch (error) { cleanup = Promise.reject(error) }
61
+ const late = Promise.resolve(cleanup)
62
+ void late.catch(() => {})
63
+ disposing = Promise.allSettled([disposing, late]).then(results => {
64
+ const errors = results.flatMap(result => result.status === 'rejected' ? [result.reason] : [])
65
+ failure(errors)
66
+ })
67
+ void disposing.catch(() => {})
68
+ }
69
+ return release
70
+ })
71
+ return dispose
72
+ } catch (error) {
73
+ try { await dispose() } catch (cleanupError) {
74
+ throw new AggregateError([error, cleanupError], 'service registration and rollback failed')
75
+ }
76
+ throw error
77
+ }
78
+ }