@jingyi0605/codingns 0.4.0 → 0.5.1

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 (282) hide show
  1. package/bin/codingns.mjs +425 -1
  2. package/dist/public/assets/AdaptiveButlerPage-B153lk5H.css +1 -0
  3. package/dist/public/assets/AdaptiveButlerPage-SffCV4Vb.js +3 -0
  4. package/dist/public/assets/App-DUAg5urj.css +1 -0
  5. package/dist/public/assets/App-WOLwMld_.js +30 -0
  6. package/dist/public/assets/BootstrapPage--zExdgfM.js +1 -0
  7. package/dist/public/assets/ConversationPage-D9pzRmOg.js +2 -0
  8. package/dist/public/assets/DesktopDetachPreviewPage-DvI9CIKi.js +1 -0
  9. package/dist/public/assets/DesktopWindowPage-D8FpOSLE.js +2 -0
  10. package/dist/public/assets/FileContextPanel-C8T7oqRN.js +1 -0
  11. package/dist/public/assets/GitSidebar-Bze7DNnc.js +6 -0
  12. package/dist/public/assets/MobileCreateSessionSheet-CXSKMnYn.js +1 -0
  13. package/dist/public/assets/MobileSheet-Gzc14EpR.js +1 -0
  14. package/dist/public/assets/MobileTopHeaderFrame-BWorAJ1C.js +1 -0
  15. package/dist/public/assets/MobileWorkspaceSwitcherHeader-DOr4pTUq.js +1 -0
  16. package/dist/public/assets/ServerSettingsModal-BYB0GvTl.js +1 -0
  17. package/dist/public/assets/SessionIndexPage-CR3IARXX.js +1 -0
  18. package/dist/public/assets/SettingsPage-B_BQtnwE.js +1 -0
  19. package/dist/public/assets/TerminalManagerPanel-PQ-EM64j.js +1 -0
  20. package/dist/public/assets/{TerminalPage-6jHZV9Mh.js → TerminalPage-CvnHXBhw.js} +19 -19
  21. package/dist/public/assets/TerminalRuntimeFallbackModal-D7Aq186N.js +1 -0
  22. package/dist/public/assets/ToolFilesPage-Qzkc6K2I.js +1 -0
  23. package/dist/public/assets/ToolGitPage-BdNDN-cV.js +1 -0
  24. package/dist/public/assets/ToolProcessesPage-EXJ9DHWI.js +1 -0
  25. package/dist/public/assets/ToolsHomePage-CjF3CWzR.js +1 -0
  26. package/dist/public/assets/WorkbenchLandingPage-DZPk4SmX.js +1 -0
  27. package/dist/public/assets/WorkbenchLayout-rwQib5In.js +3 -0
  28. package/dist/public/assets/WorkbenchModal-B09hC9b5.js +1 -0
  29. package/dist/public/assets/WorkbenchShellRoute-Cerk5uK7.js +1 -0
  30. package/dist/public/assets/WorkbenchShellRoute-DsW4mBTX.css +1 -0
  31. package/dist/public/assets/WorkspaceDebugDetailPage-Bcq8s-Ma.js +1 -0
  32. package/dist/public/assets/WorkspaceDetailPage-DNAa8pKr.js +1 -0
  33. package/dist/public/assets/WorkspaceHomePage-BoiLuACV.js +1 -0
  34. package/dist/public/assets/butler-records-events-DgWCG364.js +1 -0
  35. package/dist/public/assets/client-runtime-manager-CRQ-F5d2.js +1 -0
  36. package/dist/public/assets/default-session-permission-mode-D0wZ9Jek.js +1 -0
  37. package/dist/public/assets/event-DvH9tcej.js +1 -0
  38. package/dist/public/assets/file-tree-icon-Dp_xhVfD.js +31 -0
  39. package/dist/public/assets/index-C2G8Gmf1.js +42 -0
  40. package/dist/public/assets/index-CpPTUeA3.css +1 -0
  41. package/dist/public/assets/preferences-service-gOt2ZjKZ.js +1 -0
  42. package/dist/public/assets/session-runtime-machine-Dq3pW-UF.js +17 -0
  43. package/dist/public/assets/styles-BWPBZvze.css +1 -0
  44. package/dist/public/assets/styles-CSUx5LGe.js +1 -0
  45. package/dist/public/assets/terminal-runtime-meta-BMT-rSEe.js +1 -0
  46. package/dist/public/assets/useRegisteredDebugTemplates-zMcEOGca.js +1 -0
  47. package/dist/public/assets/window-BWqRixxq.js +1 -0
  48. package/dist/public/index.html +2 -2
  49. package/dist/server/middlewares/auth-guard.d.ts +4 -0
  50. package/dist/server/middlewares/auth-guard.js +42 -4
  51. package/dist/server/middlewares/auth-guard.js.map +1 -1
  52. package/dist/server/modules/assistant-capability/assistant-capability-controller.d.ts +62 -1
  53. package/dist/server/modules/assistant-capability/assistant-capability-controller.js +58 -0
  54. package/dist/server/modules/assistant-capability/assistant-capability-controller.js.map +1 -1
  55. package/dist/server/modules/assistant-capability/assistant-capability-service.d.ts +66 -3
  56. package/dist/server/modules/assistant-capability/assistant-capability-service.js +173 -1
  57. package/dist/server/modules/assistant-capability/assistant-capability-service.js.map +1 -1
  58. package/dist/server/modules/auth/auth-controller.d.ts +11 -1
  59. package/dist/server/modules/auth/auth-controller.js +61 -2
  60. package/dist/server/modules/auth/auth-controller.js.map +1 -1
  61. package/dist/server/modules/auth/auth-device-display-name.d.ts +10 -0
  62. package/dist/server/modules/auth/auth-device-display-name.js +190 -0
  63. package/dist/server/modules/auth/auth-device-display-name.js.map +1 -0
  64. package/dist/server/modules/auth/auth-service.d.ts +80 -5
  65. package/dist/server/modules/auth/auth-service.js +333 -23
  66. package/dist/server/modules/auth/auth-service.js.map +1 -1
  67. package/dist/server/modules/butler/assistant-automation-service.d.ts +2 -0
  68. package/dist/server/modules/butler/assistant-automation-service.js +46 -0
  69. package/dist/server/modules/butler/assistant-automation-service.js.map +1 -1
  70. package/dist/server/modules/butler/assistant-sandbox-cleanup-scheduler.d.ts +32 -0
  71. package/dist/server/modules/butler/assistant-sandbox-cleanup-scheduler.js +93 -0
  72. package/dist/server/modules/butler/assistant-sandbox-cleanup-scheduler.js.map +1 -0
  73. package/dist/server/modules/butler/assistant-sandbox-service.d.ts +16 -2
  74. package/dist/server/modules/butler/assistant-sandbox-service.js +137 -4
  75. package/dist/server/modules/butler/assistant-sandbox-service.js.map +1 -1
  76. package/dist/server/modules/butler/butler-auth-service.js +7 -2
  77. package/dist/server/modules/butler/butler-auth-service.js.map +1 -1
  78. package/dist/server/modules/butler/butler-control-session-service.d.ts +4 -1
  79. package/dist/server/modules/butler/butler-control-session-service.js +20 -1
  80. package/dist/server/modules/butler/butler-control-session-service.js.map +1 -1
  81. package/dist/server/modules/butler/butler-follow-up-evaluation-instruction-adapter.d.ts +2 -1
  82. package/dist/server/modules/butler/butler-follow-up-evaluation-instruction-adapter.js +27 -25
  83. package/dist/server/modules/butler/butler-follow-up-evaluation-instruction-adapter.js.map +1 -1
  84. package/dist/server/modules/butler/butler-follow-up-service.d.ts +32 -4
  85. package/dist/server/modules/butler/butler-follow-up-service.js +436 -331
  86. package/dist/server/modules/butler/butler-follow-up-service.js.map +1 -1
  87. package/dist/server/modules/butler/butler-inbox-analysis-service.d.ts +1 -1
  88. package/dist/server/modules/butler/butler-inbox-analysis-service.js.map +1 -1
  89. package/dist/server/modules/butler/butler-inbox-service.js +1 -0
  90. package/dist/server/modules/butler/butler-inbox-service.js.map +1 -1
  91. package/dist/server/modules/butler/butler-session-service.d.ts +3 -1
  92. package/dist/server/modules/butler/butler-session-service.js +15 -1
  93. package/dist/server/modules/butler/butler-session-service.js.map +1 -1
  94. package/dist/server/modules/butler/butler-workspace-context.d.ts +1 -1
  95. package/dist/server/modules/butler/butler-workspace-context.js +54 -28
  96. package/dist/server/modules/butler/butler-workspace-context.js.map +1 -1
  97. package/dist/server/modules/client/client-controller.js +1 -1
  98. package/dist/server/modules/client/client-controller.js.map +1 -1
  99. package/dist/server/modules/client/client-service.d.ts +16 -2
  100. package/dist/server/modules/client/client-service.js +21 -3
  101. package/dist/server/modules/client/client-service.js.map +1 -1
  102. package/dist/server/modules/provider/provider-controller.d.ts +1 -1
  103. package/dist/server/modules/provider/provider-controller.js.map +1 -1
  104. package/dist/server/modules/relay-tunnel/crypto/relay-tunnel-identity-service.d.ts +10 -0
  105. package/dist/server/modules/relay-tunnel/crypto/relay-tunnel-identity-service.js +48 -0
  106. package/dist/server/modules/relay-tunnel/crypto/relay-tunnel-identity-service.js.map +1 -0
  107. package/dist/server/modules/relay-tunnel/crypto/relay-tunnel-packets.d.ts +48 -0
  108. package/dist/server/modules/relay-tunnel/crypto/relay-tunnel-packets.js +11 -0
  109. package/dist/server/modules/relay-tunnel/crypto/relay-tunnel-packets.js.map +1 -0
  110. package/dist/server/modules/relay-tunnel/crypto/relay-tunnel-protocol.d.ts +74 -0
  111. package/dist/server/modules/relay-tunnel/crypto/relay-tunnel-protocol.js +302 -0
  112. package/dist/server/modules/relay-tunnel/crypto/relay-tunnel-protocol.js.map +1 -0
  113. package/dist/server/modules/relay-tunnel/relay-tunnel-controller.d.ts +33 -0
  114. package/dist/server/modules/relay-tunnel/relay-tunnel-controller.js +57 -0
  115. package/dist/server/modules/relay-tunnel/relay-tunnel-controller.js.map +1 -0
  116. package/dist/server/modules/relay-tunnel/relay-tunnel-edge-proof.d.ts +9 -0
  117. package/dist/server/modules/relay-tunnel/relay-tunnel-edge-proof.js +25 -0
  118. package/dist/server/modules/relay-tunnel/relay-tunnel-edge-proof.js.map +1 -0
  119. package/dist/server/modules/relay-tunnel/relay-tunnel-gateway-service.d.ts +18 -0
  120. package/dist/server/modules/relay-tunnel/relay-tunnel-gateway-service.js +230 -0
  121. package/dist/server/modules/relay-tunnel/relay-tunnel-gateway-service.js.map +1 -0
  122. package/dist/server/modules/relay-tunnel/relay-tunnel-runtime-adapter.d.ts +41 -0
  123. package/dist/server/modules/relay-tunnel/relay-tunnel-runtime-adapter.js +443 -0
  124. package/dist/server/modules/relay-tunnel/relay-tunnel-runtime-adapter.js.map +1 -0
  125. package/dist/server/modules/relay-tunnel/relay-tunnel-service.d.ts +112 -0
  126. package/dist/server/modules/relay-tunnel/relay-tunnel-service.js +966 -0
  127. package/dist/server/modules/relay-tunnel/relay-tunnel-service.js.map +1 -0
  128. package/dist/server/modules/sessions/codex-app-server-helper-client.d.ts +2 -1
  129. package/dist/server/modules/sessions/codex-app-server-helper-client.js +78 -0
  130. package/dist/server/modules/sessions/codex-app-server-helper-client.js.map +1 -1
  131. package/dist/server/modules/sessions/codex-app-server-helper-process.js +84 -2
  132. package/dist/server/modules/sessions/codex-app-server-helper-process.js.map +1 -1
  133. package/dist/server/modules/sessions/provider-session-delete-cli.d.ts +15 -0
  134. package/dist/server/modules/sessions/provider-session-delete-cli.js +148 -0
  135. package/dist/server/modules/sessions/provider-session-delete-cli.js.map +1 -0
  136. package/dist/server/modules/sessions/session-controller.d.ts +4 -1
  137. package/dist/server/modules/sessions/session-controller.js +4 -0
  138. package/dist/server/modules/sessions/session-controller.js.map +1 -1
  139. package/dist/server/modules/sessions/session-history-service.d.ts +17 -0
  140. package/dist/server/modules/sessions/session-history-service.js +150 -1
  141. package/dist/server/modules/sessions/session-history-service.js.map +1 -1
  142. package/dist/server/modules/sessions/session-live-runtime-router-service.d.ts +25 -0
  143. package/dist/server/modules/sessions/session-live-runtime-router-service.js +42 -0
  144. package/dist/server/modules/sessions/session-live-runtime-router-service.js.map +1 -0
  145. package/dist/server/modules/sessions/session-live-runtime-service.js +34 -18
  146. package/dist/server/modules/sessions/session-live-runtime-service.js.map +1 -1
  147. package/dist/server/modules/sessions/session-message-attachment-service.d.ts +1 -0
  148. package/dist/server/modules/sessions/session-message-attachment-service.js +22 -0
  149. package/dist/server/modules/sessions/session-message-attachment-service.js.map +1 -1
  150. package/dist/server/modules/sessions/session-permission-request-service.d.ts +1 -0
  151. package/dist/server/modules/sessions/session-permission-request-service.js +200 -5
  152. package/dist/server/modules/sessions/session-permission-request-service.js.map +1 -1
  153. package/dist/server/modules/sessions/session-provider-error-mapper.js +32 -0
  154. package/dist/server/modules/sessions/session-provider-error-mapper.js.map +1 -1
  155. package/dist/server/modules/sessions/session-provider-usage-guard-service.d.ts +37 -0
  156. package/dist/server/modules/sessions/session-provider-usage-guard-service.js +179 -0
  157. package/dist/server/modules/sessions/session-provider-usage-guard-service.js.map +1 -0
  158. package/dist/server/modules/sessions/session-provider-usage-limit.d.ts +17 -0
  159. package/dist/server/modules/sessions/session-provider-usage-limit.js +465 -0
  160. package/dist/server/modules/sessions/session-provider-usage-limit.js.map +1 -0
  161. package/dist/server/modules/skills/assistant-runtime-skill-catalog.d.ts +8 -0
  162. package/dist/server/modules/skills/assistant-runtime-skill-catalog.js +26 -0
  163. package/dist/server/modules/skills/assistant-runtime-skill-catalog.js.map +1 -0
  164. package/dist/server/modules/skills/assistant-runtime-skill-cleanup.d.ts +9 -0
  165. package/dist/server/modules/skills/assistant-runtime-skill-cleanup.js +55 -0
  166. package/dist/server/modules/skills/assistant-runtime-skill-cleanup.js.map +1 -0
  167. package/dist/server/modules/skills/builtin-skill-service.js +1 -6
  168. package/dist/server/modules/skills/builtin-skill-service.js.map +1 -1
  169. package/dist/server/modules/skills/skill-controller.d.ts +2 -2
  170. package/dist/server/modules/skills/skill-controller.js +9 -1
  171. package/dist/server/modules/skills/skill-controller.js.map +1 -1
  172. package/dist/server/modules/skills/skill-manager-service.d.ts +26 -1
  173. package/dist/server/modules/skills/skill-manager-service.js +346 -90
  174. package/dist/server/modules/skills/skill-manager-service.js.map +1 -1
  175. package/dist/server/modules/skills/skill-name-policy.d.ts +2 -0
  176. package/dist/server/modules/skills/skill-name-policy.js +10 -0
  177. package/dist/server/modules/skills/skill-name-policy.js.map +1 -0
  178. package/dist/server/modules/tailscale/tailscale-service.d.ts +2 -0
  179. package/dist/server/modules/tailscale/tailscale-service.js +21 -8
  180. package/dist/server/modules/tailscale/tailscale-service.js.map +1 -1
  181. package/dist/server/modules/tasks/task-types.d.ts +3 -0
  182. package/dist/server/modules/tasks/task-types.js +3 -0
  183. package/dist/server/modules/tasks/task-types.js.map +1 -1
  184. package/dist/server/modules/terminal/template-reverse-proxy-service.js +71 -3
  185. package/dist/server/modules/terminal/template-reverse-proxy-service.js.map +1 -1
  186. package/dist/server/modules/workbench/snapshot-revision.d.ts +4 -0
  187. package/dist/server/modules/workbench/snapshot-revision.js +13 -0
  188. package/dist/server/modules/workbench/snapshot-revision.js.map +1 -0
  189. package/dist/server/modules/workbench/workbench-service.d.ts +1 -0
  190. package/dist/server/modules/workbench/workbench-service.js +3 -2
  191. package/dist/server/modules/workbench/workbench-service.js.map +1 -1
  192. package/dist/server/modules/workbench/workspace-panel-snapshot-service.d.ts +6 -1
  193. package/dist/server/modules/workbench/workspace-panel-snapshot-service.js +10 -8
  194. package/dist/server/modules/workbench/workspace-panel-snapshot-service.js.map +1 -1
  195. package/dist/server/routes/assistant.js +30 -0
  196. package/dist/server/routes/assistant.js.map +1 -1
  197. package/dist/server/routes/auth.js +4 -0
  198. package/dist/server/routes/auth.js.map +1 -1
  199. package/dist/server/routes/sessions.js +1 -0
  200. package/dist/server/routes/sessions.js.map +1 -1
  201. package/dist/server/routes/system.d.ts +2 -1
  202. package/dist/server/routes/system.js +13 -1
  203. package/dist/server/routes/system.js.map +1 -1
  204. package/dist/server/server/create-server.d.ts +10 -0
  205. package/dist/server/server/create-server.js +83 -13
  206. package/dist/server/server/create-server.js.map +1 -1
  207. package/dist/server/shared/utils/tokens.d.ts +3 -1
  208. package/dist/server/shared/utils/tokens.js +9 -2
  209. package/dist/server/shared/utils/tokens.js.map +1 -1
  210. package/dist/server/storage/repositories/assistant-automation-task-repository.d.ts +2 -0
  211. package/dist/server/storage/repositories/assistant-automation-task-repository.js +8 -2
  212. package/dist/server/storage/repositories/assistant-automation-task-repository.js.map +1 -1
  213. package/dist/server/storage/repositories/assistant-sandbox-workspace-repository.d.ts +1 -0
  214. package/dist/server/storage/repositories/assistant-sandbox-workspace-repository.js +27 -0
  215. package/dist/server/storage/repositories/assistant-sandbox-workspace-repository.js.map +1 -1
  216. package/dist/server/storage/repositories/auth-device-repository.d.ts +22 -0
  217. package/dist/server/storage/repositories/auth-device-repository.js +97 -0
  218. package/dist/server/storage/repositories/auth-device-repository.js.map +1 -0
  219. package/dist/server/storage/repositories/auth-device-session-repository.d.ts +17 -0
  220. package/dist/server/storage/repositories/auth-device-session-repository.js +82 -0
  221. package/dist/server/storage/repositories/auth-device-session-repository.js.map +1 -0
  222. package/dist/server/storage/repositories/auth-login-event-repository.d.ts +9 -0
  223. package/dist/server/storage/repositories/auth-login-event-repository.js +53 -0
  224. package/dist/server/storage/repositories/auth-login-event-repository.js.map +1 -0
  225. package/dist/server/storage/repositories/auth-token-repository.d.ts +4 -0
  226. package/dist/server/storage/repositories/auth-token-repository.js +58 -5
  227. package/dist/server/storage/repositories/auth-token-repository.js.map +1 -1
  228. package/dist/server/storage/repositories/butler-follow-up-task-repository.js +21 -3
  229. package/dist/server/storage/repositories/butler-follow-up-task-repository.js.map +1 -1
  230. package/dist/server/storage/repositories/instance-relay-tunnel-identity-repository.d.ts +8 -0
  231. package/dist/server/storage/repositories/instance-relay-tunnel-identity-repository.js +52 -0
  232. package/dist/server/storage/repositories/instance-relay-tunnel-identity-repository.js.map +1 -0
  233. package/dist/server/storage/repositories/instance-relay-tunnel-repository.d.ts +10 -0
  234. package/dist/server/storage/repositories/instance-relay-tunnel-repository.js +153 -0
  235. package/dist/server/storage/repositories/instance-relay-tunnel-repository.js.map +1 -0
  236. package/dist/server/storage/repositories/instance-tailscale-repository.js +6 -3
  237. package/dist/server/storage/repositories/instance-tailscale-repository.js.map +1 -1
  238. package/dist/server/storage/repositories/managed-skill-repository.d.ts +2 -1
  239. package/dist/server/storage/repositories/managed-skill-repository.js +14 -4
  240. package/dist/server/storage/repositories/managed-skill-repository.js.map +1 -1
  241. package/dist/server/storage/repositories/session-message-attachment-repository.d.ts +2 -0
  242. package/dist/server/storage/repositories/session-message-attachment-repository.js +24 -0
  243. package/dist/server/storage/repositories/session-message-attachment-repository.js.map +1 -1
  244. package/dist/server/storage/sqlite/client.js +297 -2
  245. package/dist/server/storage/sqlite/client.js.map +1 -1
  246. package/dist/server/storage/sqlite/schema.sql +122 -4
  247. package/dist/server/types/domain.d.ts +91 -1
  248. package/dist/server/ws/workbench-ws-hub.js +225 -99
  249. package/dist/server/ws/workbench-ws-hub.js.map +1 -1
  250. package/dist/server/ws/ws-auth-guard.js +1 -4
  251. package/dist/server/ws/ws-auth-guard.js.map +1 -1
  252. package/dist/server/ws/ws-server.d.ts +1 -1
  253. package/dist/server/ws/ws-server.js.map +1 -1
  254. package/node_modules/@codingns/session-sync-core/dist/codex-resume-history.d.ts +1 -0
  255. package/node_modules/@codingns/session-sync-core/dist/codex-resume-history.js +80 -0
  256. package/node_modules/@codingns/session-sync-core/dist/codex-resume-history.js.map +1 -0
  257. package/node_modules/@codingns/session-sync-core/dist/providers/claude-code.d.ts +1 -0
  258. package/node_modules/@codingns/session-sync-core/dist/providers/claude-code.js +11 -1
  259. package/node_modules/@codingns/session-sync-core/dist/providers/claude-code.js.map +1 -1
  260. package/node_modules/@codingns/session-sync-core/dist/providers/codex.d.ts +11 -0
  261. package/node_modules/@codingns/session-sync-core/dist/providers/codex.js +132 -21
  262. package/node_modules/@codingns/session-sync-core/dist/providers/codex.js.map +1 -1
  263. package/node_modules/@codingns/session-sync-core/dist/providers/gemini.d.ts +2 -0
  264. package/node_modules/@codingns/session-sync-core/dist/providers/gemini.js +53 -1
  265. package/node_modules/@codingns/session-sync-core/dist/providers/gemini.js.map +1 -1
  266. package/node_modules/@codingns/session-sync-core/dist/providers/kimi.d.ts +1 -0
  267. package/node_modules/@codingns/session-sync-core/dist/providers/kimi.js +10 -1
  268. package/node_modules/@codingns/session-sync-core/dist/providers/kimi.js.map +1 -1
  269. package/node_modules/@codingns/session-sync-core/dist/providers/opencode.d.ts +1 -0
  270. package/node_modules/@codingns/session-sync-core/dist/providers/opencode.js +30 -0
  271. package/node_modules/@codingns/session-sync-core/dist/providers/opencode.js.map +1 -1
  272. package/node_modules/@codingns/session-sync-core/dist/runtime/codex-runtime.d.ts +5 -1
  273. package/node_modules/@codingns/session-sync-core/dist/runtime/codex-runtime.js +145 -58
  274. package/node_modules/@codingns/session-sync-core/dist/runtime/codex-runtime.js.map +1 -1
  275. package/node_modules/@codingns/session-sync-core/dist/services.d.ts +1 -0
  276. package/node_modules/@codingns/session-sync-core/dist/services.js +7 -0
  277. package/node_modules/@codingns/session-sync-core/dist/services.js.map +1 -1
  278. package/node_modules/@codingns/session-sync-core/dist/types.d.ts +2 -0
  279. package/package.json +1 -1
  280. package/scripts/postinstall.mjs +0 -33
  281. package/dist/public/assets/index-CSVhg7I8.js +0 -123
  282. package/dist/public/assets/index-Ce1VX19m.css +0 -1
@@ -39,69 +39,80 @@ export class WorkbenchWsHub {
39
39
  const userId = authContext.user.userId;
40
40
  const channel = this.getOrCreateChannel(userId);
41
41
  this.attachClient(client, userId, channel);
42
- switch (message.type) {
43
- case "workbench.subscribe":
44
- void this.sendWorkbenchSnapshotToClient(client, userId, channel);
45
- if (this.workbenchService.shouldRefreshSnapshot()) {
46
- this.workbenchService.scheduleSnapshotRefresh(userId);
47
- }
48
- return true;
49
- case "workbench.refresh":
50
- void this.refreshAndBroadcast(userId, true);
51
- return true;
52
- case "fileTree.subscribe":
53
- this.replaceFileTreeSubscription(client, message.workspaceId, message.paths);
54
- void this.refreshFileTreeSubscriptions(client);
55
- return true;
56
- case "fileTree.refresh":
57
- for (const path of normalizePanelPaths(message.paths)) {
58
- this.workspacePanelSnapshotService.invalidateFileTree(message.workspaceId.trim(), path);
59
- }
60
- this.ensureFileTreeSubscription(client, message.workspaceId, message.paths);
61
- void this.refreshFileTreeSubscriptions(client, true);
62
- return true;
63
- case "git.subscribe":
64
- this.ensureGitSubscription(client, message.workspaceId);
65
- void this.refreshGitSubscription(client, false, {
66
- deliverIfUnchanged: true,
67
- ignoreMinInterval: true
68
- });
69
- return true;
70
- case "git.refresh":
71
- this.workspacePanelSnapshotService.invalidateGit(message.workspaceId.trim());
72
- this.ensureGitSubscription(client, message.workspaceId);
73
- this.scheduleGitRefresh(client, {
74
- force: true
75
- });
76
- return true;
77
- case "terminalManager.subscribe":
78
- this.ensureTerminalManagerSubscription(client, message.workspaceId);
79
- this.scheduleTerminalManagerRefresh(client);
80
- return true;
81
- case "terminalManager.refresh":
82
- this.workspacePanelSnapshotService.invalidateTerminalManager(message.workspaceId.trim());
83
- this.ensureTerminalManagerSubscription(client, message.workspaceId);
84
- this.scheduleTerminalManagerRefresh(client, {
85
- force: true
86
- });
87
- return true;
88
- case "workspaceManagement.subscribe":
89
- this.clientWorkspaceManagementSubscriptions.set(client, {
90
- workspaceId: message.workspaceId.trim(),
91
- lastPayload: null
92
- });
93
- void this.refreshWorkspaceManagementSubscription(client);
94
- return true;
95
- case "workspaceManagement.refresh":
96
- this.workspacePanelSnapshotService.invalidateWorkspaceManagement(message.workspaceId.trim());
97
- this.clientWorkspaceManagementSubscriptions.set(client, {
98
- workspaceId: message.workspaceId.trim(),
99
- lastPayload: null
100
- });
101
- void this.refreshWorkspaceManagementSubscription(client, true);
102
- return true;
103
- default:
104
- return false;
42
+ try {
43
+ switch (message.type) {
44
+ case "workbench.subscribe":
45
+ void this.sendWorkbenchSnapshotToClient(client, userId, channel, message.knownRevision);
46
+ if (this.workbenchService.shouldRefreshSnapshot()) {
47
+ this.workbenchService.scheduleSnapshotRefresh(userId);
48
+ }
49
+ return true;
50
+ case "workbench.refresh":
51
+ void this.refreshAndBroadcast(userId, true);
52
+ return true;
53
+ case "fileTree.subscribe":
54
+ this.replaceFileTreeSubscription(client, message.workspaceId, message.paths, message.knownRevisions);
55
+ void this.refreshFileTreeSubscriptions(client);
56
+ return true;
57
+ case "fileTree.refresh":
58
+ for (const path of normalizePanelPaths(message.paths)) {
59
+ this.workspacePanelSnapshotService.invalidateFileTree(message.workspaceId.trim(), path);
60
+ }
61
+ this.ensureFileTreeSubscription(client, message.workspaceId, message.paths, message.knownRevisions);
62
+ void this.refreshFileTreeSubscriptions(client, true);
63
+ return true;
64
+ case "git.subscribe":
65
+ this.ensureGitSubscription(client, message.workspaceId, message.knownRevision);
66
+ void this.refreshGitSubscription(client, false, {
67
+ deliverIfUnchanged: true,
68
+ ignoreMinInterval: true
69
+ });
70
+ return true;
71
+ case "git.refresh":
72
+ this.workspacePanelSnapshotService.invalidateGit(message.workspaceId.trim());
73
+ this.ensureGitSubscription(client, message.workspaceId, message.knownRevision);
74
+ this.scheduleGitRefresh(client, {
75
+ force: true
76
+ });
77
+ return true;
78
+ case "terminalManager.subscribe":
79
+ this.ensureTerminalManagerSubscription(client, message.workspaceId, message.knownRevision);
80
+ this.scheduleTerminalManagerRefresh(client);
81
+ return true;
82
+ case "terminalManager.refresh":
83
+ this.workspacePanelSnapshotService.invalidateTerminalManager(message.workspaceId.trim());
84
+ this.ensureTerminalManagerSubscription(client, message.workspaceId, message.knownRevision);
85
+ this.scheduleTerminalManagerRefresh(client, {
86
+ force: true
87
+ });
88
+ return true;
89
+ case "workspaceManagement.subscribe":
90
+ this.clientWorkspaceManagementSubscriptions.set(client, {
91
+ workspaceId: message.workspaceId.trim(),
92
+ lastPayload: null,
93
+ knownRevision: normalizeKnownRevision(message.knownRevision) ?? null
94
+ });
95
+ void this.refreshWorkspaceManagementSubscription(client);
96
+ return true;
97
+ case "workspaceManagement.refresh":
98
+ this.workspacePanelSnapshotService.invalidateWorkspaceManagement(message.workspaceId.trim());
99
+ this.clientWorkspaceManagementSubscriptions.set(client, {
100
+ workspaceId: message.workspaceId.trim(),
101
+ lastPayload: null,
102
+ knownRevision: normalizeKnownRevision(message.knownRevision) ?? null
103
+ });
104
+ void this.refreshWorkspaceManagementSubscription(client, true);
105
+ return true;
106
+ default:
107
+ return false;
108
+ }
109
+ }
110
+ catch (error) {
111
+ this.reportAsyncError("handleMessage", error, {
112
+ userId,
113
+ workspaceId: extractWorkspaceIdFromWorkbenchMessage(message)
114
+ });
115
+ return true;
105
116
  }
106
117
  }
107
118
  cleanupClient(client) {
@@ -178,11 +189,13 @@ export class WorkbenchWsHub {
178
189
  channel.realtimeBroadcastTask = (async () => {
179
190
  const startedAtMs = terminalDebugNowMs();
180
191
  try {
181
- const payload = buildWorkbenchPayload(this.workbenchService.getSnapshot(userId));
192
+ const snapshot = this.workbenchService.getSnapshot(userId);
193
+ const payload = buildWorkbenchPayload(snapshot);
182
194
  if (payload === channel.lastWorkbenchPayload) {
183
195
  return;
184
196
  }
185
197
  channel.lastWorkbenchPayload = payload;
198
+ channel.lastWorkbenchRevision = snapshot.revision;
186
199
  for (const client of channel.clients) {
187
200
  client.send(payload);
188
201
  }
@@ -254,6 +267,7 @@ export class WorkbenchWsHub {
254
267
  channel = {
255
268
  clients: new Set(),
256
269
  lastWorkbenchPayload: null,
270
+ lastWorkbenchRevision: null,
257
271
  workbenchTimer: null,
258
272
  workspaceManagementTimer: null,
259
273
  realtimeBroadcastTimer: null,
@@ -279,11 +293,12 @@ export class WorkbenchWsHub {
279
293
  this.userChannels.set(userId, channel);
280
294
  return channel;
281
295
  }
282
- async sendWorkbenchSnapshotToClient(client, userId, channel) {
296
+ async sendWorkbenchSnapshotToClient(client, userId, channel, knownRevision) {
283
297
  try {
284
- const payload = buildWorkbenchPayload(this.workbenchService.getSnapshot(userId));
285
- channel.lastWorkbenchPayload = payload;
286
- client.send(payload);
298
+ const snapshot = this.workbenchService.getSnapshot(userId);
299
+ channel.lastWorkbenchPayload = buildWorkbenchPayload(snapshot);
300
+ channel.lastWorkbenchRevision = snapshot.revision;
301
+ client.send(buildWorkbenchPayload(snapshot, knownRevision));
287
302
  }
288
303
  catch (error) {
289
304
  this.reportAsyncError("sendWorkbenchSnapshotToClient", error, { userId });
@@ -306,6 +321,7 @@ export class WorkbenchWsHub {
306
321
  return;
307
322
  }
308
323
  channel.lastWorkbenchPayload = payload;
324
+ channel.lastWorkbenchRevision = snapshot.revision;
309
325
  for (const client of channel.clients) {
310
326
  client.send(payload);
311
327
  }
@@ -325,30 +341,33 @@ export class WorkbenchWsHub {
325
341
  });
326
342
  return channel.refreshTask;
327
343
  }
328
- ensureFileTreeSubscription(client, workspaceId, paths) {
344
+ ensureFileTreeSubscription(client, workspaceId, paths, knownRevisions) {
329
345
  const current = this.clientFileTreeSubscriptions.get(client);
330
346
  const normalizedWorkspaceId = workspaceId.trim();
331
347
  const normalizedPaths = normalizePanelPaths(paths);
332
348
  const nextPaths = normalizedPaths.length > 0 ? normalizedPaths : [""];
349
+ const nextKnownRevisionByPath = buildKnownRevisionByPathMap(nextPaths, knownRevisions);
333
350
  if (current &&
334
351
  current.workspaceId === normalizedWorkspaceId &&
335
352
  areStringArraysEqual(current.paths, nextPaths)) {
353
+ current.knownRevisionByPath = nextKnownRevisionByPath;
336
354
  return current;
337
355
  }
338
- if (current) {
339
- this.fileWatcher.unsubscribeFileTree(current.workspaceId, current.paths);
340
- }
341
356
  const next = {
342
357
  workspaceId: normalizedWorkspaceId,
343
358
  paths: nextPaths,
344
- lastPayloadByPath: new Map()
359
+ lastPayloadByPath: new Map(),
360
+ knownRevisionByPath: nextKnownRevisionByPath
345
361
  };
346
- this.clientFileTreeSubscriptions.set(client, next);
347
362
  this.fileWatcher.subscribeFileTree(normalizedWorkspaceId, nextPaths);
363
+ this.clientFileTreeSubscriptions.set(client, next);
364
+ if (current) {
365
+ this.fileWatcher.unsubscribeFileTree(current.workspaceId, current.paths);
366
+ }
348
367
  return next;
349
368
  }
350
- replaceFileTreeSubscription(client, workspaceId, paths) {
351
- return this.ensureFileTreeSubscription(client, workspaceId, paths);
369
+ replaceFileTreeSubscription(client, workspaceId, paths, knownRevisions) {
370
+ return this.ensureFileTreeSubscription(client, workspaceId, paths, knownRevisions);
352
371
  }
353
372
  async refreshFileTreeSubscriptions(client, force = false) {
354
373
  const subscription = this.clientFileTreeSubscriptions.get(client);
@@ -359,11 +378,12 @@ export class WorkbenchWsHub {
359
378
  const uniquePaths = normalizePanelPaths(subscription.paths);
360
379
  for (const path of uniquePaths) {
361
380
  const snapshot = await this.workspacePanelSnapshotService.getFileTreeSnapshot(subscription.workspaceId, path, { force });
362
- const payload = buildFileTreePayload(snapshot);
381
+ const payload = buildFileTreePayload(snapshot, subscription.knownRevisionByPath.get(path) ?? null);
363
382
  const lastPayload = subscription.lastPayloadByPath.get(path) ?? null;
364
383
  if (payload === lastPayload) {
365
384
  continue;
366
385
  }
386
+ subscription.knownRevisionByPath.set(path, snapshot.revision);
367
387
  subscription.lastPayloadByPath.set(path, payload);
368
388
  client.send(payload);
369
389
  }
@@ -413,10 +433,11 @@ export class WorkbenchWsHub {
413
433
  if (controller.signal.aborted) {
414
434
  return;
415
435
  }
416
- const payload = buildGitPayload(snapshot);
436
+ const payload = buildGitPayload(snapshot, subscription.knownRevision);
417
437
  if (payload === subscription.lastPayload && !options?.deliverIfUnchanged) {
418
438
  return;
419
439
  }
440
+ subscription.knownRevision = snapshot.revision;
420
441
  subscription.lastPayload = payload;
421
442
  client.send(payload);
422
443
  logTerminalDebug("workbench.git_refresh.completed", {
@@ -446,22 +467,18 @@ export class WorkbenchWsHub {
446
467
  });
447
468
  return subscription.refreshTask;
448
469
  }
449
- ensureGitSubscription(client, workspaceId) {
470
+ ensureGitSubscription(client, workspaceId, knownRevision) {
450
471
  const normalizedWorkspaceId = workspaceId.trim();
451
472
  const current = this.clientGitSubscriptions.get(client);
473
+ const normalizedKnownRevision = normalizeKnownRevision(knownRevision) ?? null;
452
474
  if (current && current.workspaceId === normalizedWorkspaceId) {
475
+ current.knownRevision = normalizedKnownRevision;
453
476
  return current;
454
477
  }
455
- if (current) {
456
- current.refreshController?.abort(new Error("git subscription replaced"));
457
- if (current.refreshTimer) {
458
- clearTimeout(current.refreshTimer);
459
- }
460
- this.fileWatcher.unsubscribeGit(current.workspaceId);
461
- }
462
478
  const next = {
463
479
  workspaceId: normalizedWorkspaceId,
464
480
  lastPayload: null,
481
+ knownRevision: normalizedKnownRevision,
465
482
  lastRequestedAt: 0,
466
483
  refreshTask: null,
467
484
  refreshController: null,
@@ -469,8 +486,15 @@ export class WorkbenchWsHub {
469
486
  queuedRefresh: false,
470
487
  queuedForce: false
471
488
  };
472
- this.clientGitSubscriptions.set(client, next);
473
489
  this.fileWatcher.subscribeGit(normalizedWorkspaceId);
490
+ this.clientGitSubscriptions.set(client, next);
491
+ if (current) {
492
+ current.refreshController?.abort(new Error("git subscription replaced"));
493
+ if (current.refreshTimer) {
494
+ clearTimeout(current.refreshTimer);
495
+ }
496
+ this.fileWatcher.unsubscribeGit(current.workspaceId);
497
+ }
474
498
  return next;
475
499
  }
476
500
  scheduleGitRefresh(client, options) {
@@ -514,10 +538,12 @@ export class WorkbenchWsHub {
514
538
  this.flushQueuedGitRefresh(client);
515
539
  }, Math.max(0, delayMs));
516
540
  }
517
- ensureTerminalManagerSubscription(client, workspaceId) {
541
+ ensureTerminalManagerSubscription(client, workspaceId, knownRevision) {
518
542
  const normalizedWorkspaceId = workspaceId.trim();
519
543
  const current = this.clientTerminalManagerSubscriptions.get(client);
544
+ const normalizedKnownRevision = normalizeKnownRevision(knownRevision) ?? null;
520
545
  if (current && current.workspaceId === normalizedWorkspaceId) {
546
+ current.knownRevision = normalizedKnownRevision;
521
547
  return current;
522
548
  }
523
549
  if (current?.refreshTimer) {
@@ -526,6 +552,7 @@ export class WorkbenchWsHub {
526
552
  const next = {
527
553
  workspaceId: normalizedWorkspaceId,
528
554
  lastPayload: null,
555
+ knownRevision: normalizedKnownRevision,
529
556
  refreshTask: null,
530
557
  refreshTimer: null,
531
558
  queuedRefresh: false,
@@ -593,11 +620,12 @@ export class WorkbenchWsHub {
593
620
  const startedAtMs = terminalDebugNowMs();
594
621
  const snapshot = await this.workspacePanelSnapshotService.getTerminalManagerSnapshot(subscription.workspaceId, { force });
595
622
  const payloadStartedAtMs = terminalDebugNowMs();
596
- const payload = buildTerminalManagerPayload(snapshot);
623
+ const payload = buildTerminalManagerPayload(snapshot, subscription.knownRevision);
597
624
  const payloadBuildMs = terminalDebugNowMs() - payloadStartedAtMs;
598
625
  if (payload === subscription.lastPayload) {
599
626
  return;
600
627
  }
628
+ subscription.knownRevision = snapshot.revision;
601
629
  subscription.lastPayload = payload;
602
630
  const sendStartedAtMs = terminalDebugNowMs();
603
631
  client.send(payload);
@@ -632,10 +660,11 @@ export class WorkbenchWsHub {
632
660
  }
633
661
  try {
634
662
  const snapshot = await this.workspacePanelSnapshotService.getWorkspaceManagementSnapshot(subscription.workspaceId, { force });
635
- const payload = buildWorkspaceManagementPayload(snapshot);
663
+ const payload = buildWorkspaceManagementPayload(snapshot, subscription.knownRevision);
636
664
  if (payload === subscription.lastPayload) {
637
665
  return;
638
666
  }
667
+ subscription.knownRevision = snapshot.revision;
639
668
  subscription.lastPayload = payload;
640
669
  client.send(payload);
641
670
  }
@@ -691,7 +720,8 @@ function parseWorkbenchMessage(payload) {
691
720
  case "workbench.subscribe":
692
721
  case "workbench.refresh":
693
722
  return {
694
- type: candidate.type
723
+ type: candidate.type,
724
+ knownRevision: normalizeKnownRevision(candidate.knownRevision)
695
725
  };
696
726
  case "fileTree.subscribe":
697
727
  case "fileTree.refresh":
@@ -701,7 +731,8 @@ function parseWorkbenchMessage(payload) {
701
731
  workspaceId: candidate.workspaceId,
702
732
  paths: Array.isArray(candidate.paths)
703
733
  ? candidate.paths.filter((value) => typeof value === "string")
704
- : undefined
734
+ : undefined,
735
+ knownRevisions: normalizeKnownRevisionRecord(candidate.knownRevisions)
705
736
  }
706
737
  : null;
707
738
  case "git.subscribe":
@@ -709,7 +740,8 @@ function parseWorkbenchMessage(payload) {
709
740
  return typeof candidate.workspaceId === "string"
710
741
  ? {
711
742
  type: candidate.type,
712
- workspaceId: candidate.workspaceId
743
+ workspaceId: candidate.workspaceId,
744
+ knownRevision: normalizeKnownRevision(candidate.knownRevision)
713
745
  }
714
746
  : null;
715
747
  case "terminalManager.subscribe":
@@ -719,13 +751,29 @@ function parseWorkbenchMessage(payload) {
719
751
  return typeof candidate.workspaceId === "string"
720
752
  ? {
721
753
  type: candidate.type,
722
- workspaceId: candidate.workspaceId
754
+ workspaceId: candidate.workspaceId,
755
+ knownRevision: normalizeKnownRevision(candidate.knownRevision)
723
756
  }
724
757
  : null;
725
758
  default:
726
759
  return null;
727
760
  }
728
761
  }
762
+ function extractWorkspaceIdFromWorkbenchMessage(message) {
763
+ switch (message.type) {
764
+ case "fileTree.subscribe":
765
+ case "fileTree.refresh":
766
+ case "git.subscribe":
767
+ case "git.refresh":
768
+ case "terminalManager.subscribe":
769
+ case "terminalManager.refresh":
770
+ case "workspaceManagement.subscribe":
771
+ case "workspaceManagement.refresh":
772
+ return message.workspaceId.trim();
773
+ default:
774
+ return undefined;
775
+ }
776
+ }
729
777
  function normalizePanelPaths(paths) {
730
778
  const uniquePaths = new Set();
731
779
  for (const value of paths ?? [""]) {
@@ -740,34 +788,112 @@ function areStringArraysEqual(left, right) {
740
788
  }
741
789
  return left.every((value, index) => value === right[index]);
742
790
  }
743
- function buildWorkbenchPayload(snapshot) {
791
+ function buildWorkbenchPayload(snapshot, knownRevision) {
792
+ if (knownRevision && knownRevision === snapshot.revision) {
793
+ return JSON.stringify({
794
+ type: "workbench.snapshot",
795
+ revision: snapshot.revision,
796
+ unchanged: true,
797
+ snapshot: null
798
+ });
799
+ }
744
800
  return JSON.stringify({
745
801
  type: "workbench.snapshot",
802
+ revision: snapshot.revision,
803
+ unchanged: false,
746
804
  snapshot
747
805
  });
748
806
  }
749
- function buildFileTreePayload(snapshot) {
807
+ function buildFileTreePayload(snapshot, knownRevision) {
808
+ if (knownRevision && knownRevision === snapshot.revision) {
809
+ return JSON.stringify({
810
+ type: "fileTree.snapshot",
811
+ revision: snapshot.revision,
812
+ unchanged: true,
813
+ snapshot: null
814
+ });
815
+ }
750
816
  return JSON.stringify({
751
817
  type: "fileTree.snapshot",
818
+ revision: snapshot.revision,
819
+ unchanged: false,
752
820
  snapshot
753
821
  });
754
822
  }
755
- function buildGitPayload(snapshot) {
823
+ function buildGitPayload(snapshot, knownRevision) {
824
+ if (knownRevision && knownRevision === snapshot.revision) {
825
+ return JSON.stringify({
826
+ type: "git.snapshot",
827
+ revision: snapshot.revision,
828
+ unchanged: true,
829
+ snapshot: null
830
+ });
831
+ }
756
832
  return JSON.stringify({
757
833
  type: "git.snapshot",
834
+ revision: snapshot.revision,
835
+ unchanged: false,
758
836
  snapshot
759
837
  });
760
838
  }
761
- function buildTerminalManagerPayload(snapshot) {
839
+ function buildTerminalManagerPayload(snapshot, knownRevision) {
840
+ if (knownRevision && knownRevision === snapshot.revision) {
841
+ return JSON.stringify({
842
+ type: "terminalManager.snapshot",
843
+ revision: snapshot.revision,
844
+ unchanged: true,
845
+ snapshot: null
846
+ });
847
+ }
762
848
  return JSON.stringify({
763
849
  type: "terminalManager.snapshot",
850
+ revision: snapshot.revision,
851
+ unchanged: false,
764
852
  snapshot
765
853
  });
766
854
  }
767
- function buildWorkspaceManagementPayload(snapshot) {
855
+ function buildWorkspaceManagementPayload(snapshot, knownRevision) {
856
+ if (knownRevision && knownRevision === snapshot.revision) {
857
+ return JSON.stringify({
858
+ type: "workspaceManagement.snapshot",
859
+ revision: snapshot.revision,
860
+ unchanged: true,
861
+ snapshot: null
862
+ });
863
+ }
768
864
  return JSON.stringify({
769
865
  type: "workspaceManagement.snapshot",
866
+ revision: snapshot.revision,
867
+ unchanged: false,
770
868
  snapshot
771
869
  });
772
870
  }
871
+ function normalizeKnownRevision(value) {
872
+ return typeof value === "string" && value.trim().length > 0 ? value.trim() : undefined;
873
+ }
874
+ function normalizeKnownRevisionRecord(value) {
875
+ if (typeof value !== "object" || value === null || Array.isArray(value)) {
876
+ return undefined;
877
+ }
878
+ const normalizedEntries = Object.entries(value)
879
+ .map(([key, candidate]) => [key.trim(), normalizeKnownRevision(candidate)])
880
+ .filter((entry) => Boolean(entry[1]));
881
+ if (normalizedEntries.length === 0) {
882
+ return undefined;
883
+ }
884
+ return Object.fromEntries(normalizedEntries);
885
+ }
886
+ function buildKnownRevisionByPathMap(paths, knownRevisions) {
887
+ const map = new Map();
888
+ if (!knownRevisions) {
889
+ return map;
890
+ }
891
+ for (const path of paths) {
892
+ const knownRevision = knownRevisions[path];
893
+ if (knownRevision) {
894
+ map.set(path, knownRevision);
895
+ }
896
+ }
897
+ return map;
898
+ }
773
899
  //# sourceMappingURL=workbench-ws-hub.js.map