conductor-oss 0.18.2 → 0.18.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 (254) hide show
  1. package/README.md +1 -21
  2. package/package.json +5 -5
  3. package/web/.next/standalone/packages/web/.next/BUILD_ID +1 -1
  4. package/web/.next/standalone/packages/web/.next/app-path-routes-manifest.json +1 -3
  5. package/web/.next/standalone/packages/web/.next/build-manifest.json +2 -2
  6. package/web/.next/standalone/packages/web/.next/prerender-manifest.json +3 -3
  7. package/web/.next/standalone/packages/web/.next/routes-manifest.json +6 -22
  8. package/web/.next/standalone/packages/web/.next/server/app/_global-error.html +2 -2
  9. package/web/.next/standalone/packages/web/.next/server/app/_global-error.rsc +1 -1
  10. package/web/.next/standalone/packages/web/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +1 -1
  11. package/web/.next/standalone/packages/web/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  12. package/web/.next/standalone/packages/web/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  13. package/web/.next/standalone/packages/web/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  14. package/web/.next/standalone/packages/web/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  15. package/web/.next/standalone/packages/web/.next/server/app/_not-found/page/server-reference-manifest.json +7 -7
  16. package/web/.next/standalone/packages/web/.next/server/app/_not-found/page.js.nft.json +1 -1
  17. package/web/.next/standalone/packages/web/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  18. package/web/.next/standalone/packages/web/.next/server/app/_not-found.html +1 -1
  19. package/web/.next/standalone/packages/web/.next/server/app/_not-found.rsc +4 -4
  20. package/web/.next/standalone/packages/web/.next/server/app/_not-found.segments/_full.segment.rsc +4 -4
  21. package/web/.next/standalone/packages/web/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
  22. package/web/.next/standalone/packages/web/.next/server/app/_not-found.segments/_index.segment.rsc +4 -4
  23. package/web/.next/standalone/packages/web/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
  24. package/web/.next/standalone/packages/web/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
  25. package/web/.next/standalone/packages/web/.next/server/app/_not-found.segments/_tree.segment.rsc +2 -2
  26. package/web/.next/standalone/packages/web/.next/server/app/api/access/route.js +1 -1
  27. package/web/.next/standalone/packages/web/.next/server/app/api/access/route.js.nft.json +1 -1
  28. package/web/.next/standalone/packages/web/.next/server/app/api/agents/route.js +1 -1
  29. package/web/.next/standalone/packages/web/.next/server/app/api/agents/route.js.nft.json +1 -1
  30. package/web/.next/standalone/packages/web/.next/server/app/api/app-update/route.js +1 -1
  31. package/web/.next/standalone/packages/web/.next/server/app/api/app-update/route.js.nft.json +1 -1
  32. package/web/.next/standalone/packages/web/.next/server/app/api/attachments/route.js +1 -1
  33. package/web/.next/standalone/packages/web/.next/server/app/api/attachments/route.js.nft.json +1 -1
  34. package/web/.next/standalone/packages/web/.next/server/app/api/auth/session/route.js +1 -1
  35. package/web/.next/standalone/packages/web/.next/server/app/api/auth/session/route.js.nft.json +1 -1
  36. package/web/.next/standalone/packages/web/.next/server/app/api/boards/comments/route.js +1 -1
  37. package/web/.next/standalone/packages/web/.next/server/app/api/boards/comments/route.js.nft.json +1 -1
  38. package/web/.next/standalone/packages/web/.next/server/app/api/boards/route.js +1 -1
  39. package/web/.next/standalone/packages/web/.next/server/app/api/boards/route.js.nft.json +1 -1
  40. package/web/.next/standalone/packages/web/.next/server/app/api/config/route.js +1 -1
  41. package/web/.next/standalone/packages/web/.next/server/app/api/config/route.js.nft.json +1 -1
  42. package/web/.next/standalone/packages/web/.next/server/app/api/context-files/open/route.js +1 -1
  43. package/web/.next/standalone/packages/web/.next/server/app/api/context-files/open/route.js.nft.json +1 -1
  44. package/web/.next/standalone/packages/web/.next/server/app/api/context-files/route.js +1 -1
  45. package/web/.next/standalone/packages/web/.next/server/app/api/context-files/route.js.nft.json +1 -1
  46. package/web/.next/standalone/packages/web/.next/server/app/api/events/route.js +1 -1
  47. package/web/.next/standalone/packages/web/.next/server/app/api/events/route.js.nft.json +1 -1
  48. package/web/.next/standalone/packages/web/.next/server/app/api/executor/health/route.js +1 -1
  49. package/web/.next/standalone/packages/web/.next/server/app/api/executor/health/route.js.nft.json +1 -1
  50. package/web/.next/standalone/packages/web/.next/server/app/api/filesystem/directory/route.js +1 -1
  51. package/web/.next/standalone/packages/web/.next/server/app/api/filesystem/directory/route.js.nft.json +1 -1
  52. package/web/.next/standalone/packages/web/.next/server/app/api/filesystem/pick-directory/route.js +1 -1
  53. package/web/.next/standalone/packages/web/.next/server/app/api/filesystem/pick-directory/route.js.nft.json +1 -1
  54. package/web/.next/standalone/packages/web/.next/server/app/api/github/repos/route.js +1 -1
  55. package/web/.next/standalone/packages/web/.next/server/app/api/github/repos/route.js.nft.json +1 -1
  56. package/web/.next/standalone/packages/web/.next/server/app/api/github/webhook/route.js +1 -1
  57. package/web/.next/standalone/packages/web/.next/server/app/api/github/webhook/route.js.nft.json +1 -1
  58. package/web/.next/standalone/packages/web/.next/server/app/api/health/boards/route.js +1 -1
  59. package/web/.next/standalone/packages/web/.next/server/app/api/health/boards/route.js.nft.json +1 -1
  60. package/web/.next/standalone/packages/web/.next/server/app/api/health/sessions/route.js +1 -1
  61. package/web/.next/standalone/packages/web/.next/server/app/api/health/sessions/route.js.nft.json +1 -1
  62. package/web/.next/standalone/packages/web/.next/server/app/api/notifications/route.js +1 -1
  63. package/web/.next/standalone/packages/web/.next/server/app/api/notifications/route.js.nft.json +1 -1
  64. package/web/.next/standalone/packages/web/.next/server/app/api/preferences/route.js +1 -1
  65. package/web/.next/standalone/packages/web/.next/server/app/api/preferences/route.js.nft.json +1 -1
  66. package/web/.next/standalone/packages/web/.next/server/app/api/remote-access/route.js +1 -1
  67. package/web/.next/standalone/packages/web/.next/server/app/api/remote-access/route.js.nft.json +1 -1
  68. package/web/.next/standalone/packages/web/.next/server/app/api/repositories/[id]/route.js +1 -1
  69. package/web/.next/standalone/packages/web/.next/server/app/api/repositories/[id]/route.js.nft.json +1 -1
  70. package/web/.next/standalone/packages/web/.next/server/app/api/repositories/route.js +1 -1
  71. package/web/.next/standalone/packages/web/.next/server/app/api/repositories/route.js.nft.json +1 -1
  72. package/web/.next/standalone/packages/web/.next/server/app/api/sessions/[id]/actions/route.js +1 -1
  73. package/web/.next/standalone/packages/web/.next/server/app/api/sessions/[id]/actions/route.js.nft.json +1 -1
  74. package/web/.next/standalone/packages/web/.next/server/app/api/sessions/[id]/archive/route.js +1 -1
  75. package/web/.next/standalone/packages/web/.next/server/app/api/sessions/[id]/archive/route.js.nft.json +1 -1
  76. package/web/.next/standalone/packages/web/.next/server/app/api/sessions/[id]/checks/route.js +1 -1
  77. package/web/.next/standalone/packages/web/.next/server/app/api/sessions/[id]/checks/route.js.nft.json +1 -1
  78. package/web/.next/standalone/packages/web/.next/server/app/api/sessions/[id]/diff/route.js +1 -1
  79. package/web/.next/standalone/packages/web/.next/server/app/api/sessions/[id]/diff/route.js.nft.json +1 -1
  80. package/web/.next/standalone/packages/web/.next/server/app/api/sessions/[id]/feed/route.js +1 -1
  81. package/web/.next/standalone/packages/web/.next/server/app/api/sessions/[id]/feed/route.js.nft.json +1 -1
  82. package/web/.next/standalone/packages/web/.next/server/app/api/sessions/[id]/feedback/route.js +1 -1
  83. package/web/.next/standalone/packages/web/.next/server/app/api/sessions/[id]/feedback/route.js.nft.json +1 -1
  84. package/web/.next/standalone/packages/web/.next/server/app/api/sessions/[id]/files/route.js +1 -1
  85. package/web/.next/standalone/packages/web/.next/server/app/api/sessions/[id]/files/route.js.nft.json +1 -1
  86. package/web/.next/standalone/packages/web/.next/server/app/api/sessions/[id]/interrupt/route.js +1 -1
  87. package/web/.next/standalone/packages/web/.next/server/app/api/sessions/[id]/interrupt/route.js.nft.json +1 -1
  88. package/web/.next/standalone/packages/web/.next/server/app/api/sessions/[id]/kill/route.js +1 -1
  89. package/web/.next/standalone/packages/web/.next/server/app/api/sessions/[id]/kill/route.js.nft.json +1 -1
  90. package/web/.next/standalone/packages/web/.next/server/app/api/sessions/[id]/output/route.js +1 -1
  91. package/web/.next/standalone/packages/web/.next/server/app/api/sessions/[id]/output/route.js.nft.json +1 -1
  92. package/web/.next/standalone/packages/web/.next/server/app/api/sessions/[id]/preview/dom/route.js +1 -1
  93. package/web/.next/standalone/packages/web/.next/server/app/api/sessions/[id]/preview/dom/route.js.nft.json +1 -1
  94. package/web/.next/standalone/packages/web/.next/server/app/api/sessions/[id]/preview/route.js +1 -1
  95. package/web/.next/standalone/packages/web/.next/server/app/api/sessions/[id]/preview/route.js.nft.json +1 -1
  96. package/web/.next/standalone/packages/web/.next/server/app/api/sessions/[id]/preview/screenshot/route.js +1 -1
  97. package/web/.next/standalone/packages/web/.next/server/app/api/sessions/[id]/preview/screenshot/route.js.nft.json +1 -1
  98. package/web/.next/standalone/packages/web/.next/server/app/api/sessions/[id]/restore/route.js +1 -1
  99. package/web/.next/standalone/packages/web/.next/server/app/api/sessions/[id]/restore/route.js.nft.json +1 -1
  100. package/web/.next/standalone/packages/web/.next/server/app/api/sessions/[id]/route.js +1 -1
  101. package/web/.next/standalone/packages/web/.next/server/app/api/sessions/[id]/route.js.nft.json +1 -1
  102. package/web/.next/standalone/packages/web/.next/server/app/api/sessions/[id]/terminal/snapshot/route.js +1 -1
  103. package/web/.next/standalone/packages/web/.next/server/app/api/sessions/[id]/terminal/snapshot/route.js.nft.json +1 -1
  104. package/web/.next/standalone/packages/web/.next/server/app/api/sessions/[id]/terminal/token/route/app-paths-manifest.json +3 -0
  105. package/web/.next/standalone/packages/web/.next/server/app/api/sessions/[id]/terminal/token/route.js +10 -0
  106. package/web/.next/standalone/packages/web/.next/server/app/api/sessions/[id]/terminal/token/route.js.nft.json +1 -0
  107. package/web/.next/standalone/packages/web/.next/server/app/api/sessions/[id]/terminal/token/route_client-reference-manifest.js +2 -0
  108. package/web/.next/standalone/packages/web/.next/server/app/api/sessions/route.js +1 -1
  109. package/web/.next/standalone/packages/web/.next/server/app/api/sessions/route.js.nft.json +1 -1
  110. package/web/.next/standalone/packages/web/.next/server/app/api/spawn/route.js +1 -1
  111. package/web/.next/standalone/packages/web/.next/server/app/api/spawn/route.js.nft.json +1 -1
  112. package/web/.next/standalone/packages/web/.next/server/app/api/workspaces/branches/route.js +1 -1
  113. package/web/.next/standalone/packages/web/.next/server/app/api/workspaces/branches/route.js.nft.json +1 -1
  114. package/web/.next/standalone/packages/web/.next/server/app/api/workspaces/route.js +1 -1
  115. package/web/.next/standalone/packages/web/.next/server/app/api/workspaces/route.js.nft.json +1 -1
  116. package/web/.next/standalone/packages/web/.next/server/app/page/react-loadable-manifest.json +1 -1
  117. package/web/.next/standalone/packages/web/.next/server/app/page/server-reference-manifest.json +7 -7
  118. package/web/.next/standalone/packages/web/.next/server/app/page.js.nft.json +1 -1
  119. package/web/.next/standalone/packages/web/.next/server/app/page_client-reference-manifest.js +1 -1
  120. package/web/.next/standalone/packages/web/.next/server/app/sessions/[id]/page/react-loadable-manifest.json +1 -1
  121. package/web/.next/standalone/packages/web/.next/server/app/sessions/[id]/page/server-reference-manifest.json +7 -7
  122. package/web/.next/standalone/packages/web/.next/server/app/sessions/[id]/page.js.nft.json +1 -1
  123. package/web/.next/standalone/packages/web/.next/server/app/sessions/[id]/page_client-reference-manifest.js +1 -1
  124. package/web/.next/standalone/packages/web/.next/server/app/sign-in/[[...sign-in]]/page/server-reference-manifest.json +7 -7
  125. package/web/.next/standalone/packages/web/.next/server/app/sign-in/[[...sign-in]]/page.js.nft.json +1 -1
  126. package/web/.next/standalone/packages/web/.next/server/app/sign-in/[[...sign-in]]/page_client-reference-manifest.js +1 -1
  127. package/web/.next/standalone/packages/web/.next/server/app/unlock/page/server-reference-manifest.json +7 -7
  128. package/web/.next/standalone/packages/web/.next/server/app/unlock/page.js.nft.json +1 -1
  129. package/web/.next/standalone/packages/web/.next/server/app/unlock/page_client-reference-manifest.js +1 -1
  130. package/web/.next/standalone/packages/web/.next/server/app-paths-manifest.json +1 -3
  131. package/web/.next/standalone/packages/web/.next/server/chunks/26076_server_app_api_sessions_[id]_terminal_token_route_actions_9c4b3c06.js +3 -0
  132. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__63017d21._.js +3 -0
  133. package/web/.next/standalone/packages/web/.next/server/chunks/{[root-of-the-server]__f3d09d5c._.js → [root-of-the-server]__9279c912._.js} +1 -1
  134. package/web/.next/standalone/packages/web/.next/server/chunks/_2c837d66._.js +80 -0
  135. package/web/.next/standalone/packages/web/.next/server/chunks/ssr/[root-of-the-server]__379d412d._.js +1 -1
  136. package/web/.next/standalone/packages/web/.next/server/chunks/ssr/{[root-of-the-server]__da08a50a._.js → [root-of-the-server]__443ba186._.js} +2 -2
  137. package/web/.next/standalone/packages/web/.next/server/chunks/ssr/{[root-of-the-server]__a565f9a3._.js → [root-of-the-server]__742dad30._.js} +2 -2
  138. package/web/.next/standalone/packages/web/.next/server/chunks/ssr/[root-of-the-server]__749fe4b2._.js +1 -1
  139. package/web/.next/standalone/packages/web/.next/server/chunks/ssr/{[root-of-the-server]__992cdcf8._.js → [root-of-the-server]__a8fa29c1._.js} +2 -2
  140. package/web/.next/standalone/packages/web/.next/server/chunks/ssr/_0e1412de._.js +1 -1
  141. package/web/.next/standalone/packages/web/.next/server/chunks/ssr/_532f707d._.js +1 -1
  142. package/web/.next/standalone/packages/web/.next/server/chunks/ssr/_69e05fca._.js +1 -1
  143. package/web/.next/standalone/packages/web/.next/server/chunks/ssr/_80efe193._.js +1 -1
  144. package/web/.next/standalone/packages/web/.next/server/chunks/ssr/{_62d206cc._.js → _9bf43d8d._.js} +2 -2
  145. package/web/.next/standalone/packages/web/.next/server/chunks/ssr/_c0f0e227._.js +1 -1
  146. package/web/.next/standalone/packages/web/.next/server/chunks/ssr/_f36ddaa9._.js +1 -1
  147. package/web/.next/standalone/packages/web/.next/server/chunks/ssr/{node_modules_5646ec2d._.js → node_modules_91aa5708._.js} +1 -1
  148. package/web/.next/standalone/packages/web/.next/server/chunks/ssr/node_modules_@clerk_nextjs_dist_esm_app-router_3964db17._.js +3 -0
  149. package/web/.next/standalone/packages/web/.next/server/chunks/ssr/node_modules_@clerk_nextjs_dist_esm_app-router_5c863a0e._.js +3 -0
  150. package/web/.next/standalone/packages/web/.next/server/chunks/ssr/{node_modules_6d2fa1ea._.js → node_modules_be1275d0._.js} +1 -1
  151. package/web/.next/standalone/packages/web/.next/server/chunks/ssr/packages_web_src_components_sessions_SessionTerminal_tsx_eaf9458b._.js +1 -1
  152. package/web/.next/standalone/packages/web/.next/server/functions-config-manifest.json +2 -4
  153. package/web/.next/standalone/packages/web/.next/server/pages/404.html +1 -1
  154. package/web/.next/standalone/packages/web/.next/server/pages/500.html +2 -2
  155. package/web/.next/standalone/packages/web/.next/server/server-reference-manifest.js +1 -1
  156. package/web/.next/standalone/packages/web/.next/server/server-reference-manifest.json +8 -8
  157. package/web/.next/standalone/packages/web/.next/static/chunks/{c1e720eabb98af26.js → 2037d1500c64fbef.js} +1 -1
  158. package/web/.next/standalone/packages/web/.next/static/chunks/{58a9b117e5684e7c.js → 3ad6d404d5657604.js} +1 -1
  159. package/web/.next/standalone/packages/web/.next/static/chunks/4d288f280972fd06.js +1 -0
  160. package/web/.next/standalone/packages/web/.next/static/chunks/65bc9229d60adf9f.css +4 -0
  161. package/web/.next/standalone/packages/web/.next/static/chunks/97e7e5343941de65.js +1 -0
  162. package/web/.next/{static/chunks/8d05dc3b261207bb.js → standalone/packages/web/.next/static/chunks/ab8cea4266d5034c.js} +1 -1
  163. package/web/.next/standalone/packages/web/.next/static/chunks/{655db4d21daaca4d.js → b2b84b9e8ccbeafa.js} +1 -1
  164. package/web/.next/standalone/packages/web/.next/static/chunks/b9a43bac36046bf9.js +138 -0
  165. package/web/.next/{static/chunks/9331c73d4edcd945.js → standalone/packages/web/.next/static/chunks/d1cbb83a98e765b5.js} +1 -1
  166. package/web/.next/standalone/packages/web/.next/static/chunks/{301802e8e898dd01.js → f2fea305b6822999.js} +1 -1
  167. package/web/.next/standalone/packages/web/.next/static/chunks/f48f57293e98e0d8.js +1 -0
  168. package/web/.next/standalone/packages/web/.next/static/chunks/fe52c44944adc7f2.js +1 -0
  169. package/web/.next/standalone/packages/web/src/app/api/sessions/[id]/terminal/token/route.ts +13 -0
  170. package/web/.next/standalone/packages/web/src/components/sessions/SessionTerminal.tsx +77 -39
  171. package/web/.next/standalone/packages/web/src/components/sessions/sessionTerminalUtils.test.ts +0 -122
  172. package/web/.next/standalone/packages/web/src/components/sessions/sessionTerminalUtils.ts +0 -220
  173. package/web/.next/standalone/packages/web/src/components/sessions/terminal/terminalApi.ts +89 -87
  174. package/web/.next/standalone/packages/web/src/components/sessions/terminal/terminalCache.ts +2 -73
  175. package/web/.next/standalone/packages/web/src/components/sessions/terminal/terminalConstants.ts +0 -8
  176. package/web/.next/standalone/packages/web/src/components/sessions/terminal/terminalTypes.ts +0 -19
  177. package/web/.next/standalone/packages/web/src/components/sessions/terminal/ttydClient.ts +122 -27
  178. package/web/.next/standalone/packages/web/src/components/sessions/terminal/useTtydConnection.ts +9 -12
  179. package/web/.next/standalone/packages/web/src/lib/sessionState.ts +0 -473
  180. package/web/.next/static/chunks/{c1e720eabb98af26.js → 2037d1500c64fbef.js} +1 -1
  181. package/web/.next/static/chunks/{58a9b117e5684e7c.js → 3ad6d404d5657604.js} +1 -1
  182. package/web/.next/static/chunks/4d288f280972fd06.js +1 -0
  183. package/web/.next/static/chunks/65bc9229d60adf9f.css +4 -0
  184. package/web/.next/static/chunks/97e7e5343941de65.js +1 -0
  185. package/web/.next/{standalone/packages/web/.next/static/chunks/8d05dc3b261207bb.js → static/chunks/ab8cea4266d5034c.js} +1 -1
  186. package/web/.next/static/chunks/{655db4d21daaca4d.js → b2b84b9e8ccbeafa.js} +1 -1
  187. package/web/.next/static/chunks/b9a43bac36046bf9.js +138 -0
  188. package/web/.next/{standalone/packages/web/.next/static/chunks/9331c73d4edcd945.js → static/chunks/d1cbb83a98e765b5.js} +1 -1
  189. package/web/.next/static/chunks/{301802e8e898dd01.js → f2fea305b6822999.js} +1 -1
  190. package/web/.next/static/chunks/f48f57293e98e0d8.js +1 -0
  191. package/web/.next/static/chunks/fe52c44944adc7f2.js +1 -0
  192. package/web/.next/standalone/packages/web/.next/server/app/api/sessions/[id]/feed/stream/route/app-paths-manifest.json +0 -3
  193. package/web/.next/standalone/packages/web/.next/server/app/api/sessions/[id]/feed/stream/route.js +0 -10
  194. package/web/.next/standalone/packages/web/.next/server/app/api/sessions/[id]/feed/stream/route.js.nft.json +0 -1
  195. package/web/.next/standalone/packages/web/.next/server/app/api/sessions/[id]/feed/stream/route_client-reference-manifest.js +0 -2
  196. package/web/.next/standalone/packages/web/.next/server/app/api/sessions/[id]/output/stream/route/app-paths-manifest.json +0 -3
  197. package/web/.next/standalone/packages/web/.next/server/app/api/sessions/[id]/output/stream/route/build-manifest.json +0 -11
  198. package/web/.next/standalone/packages/web/.next/server/app/api/sessions/[id]/output/stream/route/server-reference-manifest.json +0 -4
  199. package/web/.next/standalone/packages/web/.next/server/app/api/sessions/[id]/output/stream/route.js +0 -10
  200. package/web/.next/standalone/packages/web/.next/server/app/api/sessions/[id]/output/stream/route.js.map +0 -5
  201. package/web/.next/standalone/packages/web/.next/server/app/api/sessions/[id]/output/stream/route.js.nft.json +0 -1
  202. package/web/.next/standalone/packages/web/.next/server/app/api/sessions/[id]/output/stream/route_client-reference-manifest.js +0 -2
  203. package/web/.next/standalone/packages/web/.next/server/app/api/sessions/[id]/terminal/connection/route/app-paths-manifest.json +0 -3
  204. package/web/.next/standalone/packages/web/.next/server/app/api/sessions/[id]/terminal/connection/route/build-manifest.json +0 -11
  205. package/web/.next/standalone/packages/web/.next/server/app/api/sessions/[id]/terminal/connection/route/server-reference-manifest.json +0 -4
  206. package/web/.next/standalone/packages/web/.next/server/app/api/sessions/[id]/terminal/connection/route.js +0 -10
  207. package/web/.next/standalone/packages/web/.next/server/app/api/sessions/[id]/terminal/connection/route.js.map +0 -5
  208. package/web/.next/standalone/packages/web/.next/server/app/api/sessions/[id]/terminal/connection/route.js.nft.json +0 -1
  209. package/web/.next/standalone/packages/web/.next/server/app/api/sessions/[id]/terminal/connection/route_client-reference-manifest.js +0 -2
  210. package/web/.next/standalone/packages/web/.next/server/chunks/26076_server_app_api_sessions_[id]_terminal_connection_route_actions_46c114ee.js +0 -3
  211. package/web/.next/standalone/packages/web/.next/server/chunks/29f24__next-internal_server_app_api_sessions_[id]_feed_stream_route_actions_1262f517.js +0 -3
  212. package/web/.next/standalone/packages/web/.next/server/chunks/43d70_next-internal_server_app_api_sessions_[id]_output_stream_route_actions_9bfa500e.js +0 -3
  213. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__1029f927._.js +0 -3
  214. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__d74c0f7a._.js +0 -3
  215. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__ddad8d14._.js +0 -3
  216. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__ede5c8ca._.js +0 -3
  217. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__f56e5b36._.js +0 -3
  218. package/web/.next/standalone/packages/web/.next/server/chunks/_24c4e75d._.js +0 -80
  219. package/web/.next/standalone/packages/web/.next/server/chunks/_3d39aff4._.js +0 -80
  220. package/web/.next/standalone/packages/web/.next/server/chunks/ssr/_307d7608._.js +0 -3
  221. package/web/.next/standalone/packages/web/.next/server/chunks/ssr/_3ed93faf._.js +0 -3
  222. package/web/.next/standalone/packages/web/.next/server/chunks/ssr/node_modules_@clerk_nextjs_dist_esm_app-router_4f296b1d._.js +0 -3
  223. package/web/.next/standalone/packages/web/.next/server/chunks/ssr/node_modules_@clerk_nextjs_dist_esm_app-router_599a1810._.js +0 -3
  224. package/web/.next/standalone/packages/web/.next/static/chunks/06eb75e40dff98f1.css +0 -4
  225. package/web/.next/standalone/packages/web/.next/static/chunks/1382eff030c401e3.js +0 -1
  226. package/web/.next/standalone/packages/web/.next/static/chunks/1684a3f76eefe776.js +0 -1
  227. package/web/.next/standalone/packages/web/.next/static/chunks/267e541b481c3c75.js +0 -1
  228. package/web/.next/standalone/packages/web/.next/static/chunks/810a3d36795ae9fd.js +0 -138
  229. package/web/.next/standalone/packages/web/.next/static/chunks/a8cd591e904d769e.js +0 -1
  230. package/web/.next/standalone/packages/web/src/app/api/sessions/[id]/feed/stream/route.ts +0 -80
  231. package/web/.next/standalone/packages/web/src/app/api/sessions/[id]/output/stream/route.ts +0 -80
  232. package/web/.next/standalone/packages/web/src/app/api/sessions/[id]/terminal/connection/route.test.ts +0 -343
  233. package/web/.next/standalone/packages/web/src/app/api/sessions/[id]/terminal/connection/route.ts +0 -120
  234. package/web/.next/standalone/packages/web/src/components/Dashboard.tsx +0 -3444
  235. package/web/.next/standalone/packages/web/src/components/TerminalView.tsx +0 -770
  236. package/web/.next/standalone/packages/web/src/components/sessions/ChatPanel.tsx +0 -2097
  237. package/web/.next/standalone/packages/web/src/hooks/useSessionFeed.ts +0 -10
  238. package/web/.next/standalone/packages/web/src/hooks/useSessionOutputStream.ts +0 -166
  239. package/web/.next/standalone/packages/web/src/lib/chatFeed.ts +0 -196
  240. package/web/.next/static/chunks/06eb75e40dff98f1.css +0 -4
  241. package/web/.next/static/chunks/1382eff030c401e3.js +0 -1
  242. package/web/.next/static/chunks/1684a3f76eefe776.js +0 -1
  243. package/web/.next/static/chunks/267e541b481c3c75.js +0 -1
  244. package/web/.next/static/chunks/810a3d36795ae9fd.js +0 -138
  245. package/web/.next/static/chunks/a8cd591e904d769e.js +0 -1
  246. /package/web/.next/standalone/packages/web/.next/server/app/api/sessions/[id]/{feed/stream → terminal/token}/route/build-manifest.json +0 -0
  247. /package/web/.next/standalone/packages/web/.next/server/app/api/sessions/[id]/{feed/stream → terminal/token}/route/server-reference-manifest.json +0 -0
  248. /package/web/.next/standalone/packages/web/.next/server/app/api/sessions/[id]/{feed/stream → terminal/token}/route.js.map +0 -0
  249. /package/web/.next/standalone/packages/web/.next/static/{FHjp9qazH2xWUCRt6mqg4 → O7I3Iz18_tPidBRAWeKh8}/_buildManifest.js +0 -0
  250. /package/web/.next/standalone/packages/web/.next/static/{FHjp9qazH2xWUCRt6mqg4 → O7I3Iz18_tPidBRAWeKh8}/_clientMiddlewareManifest.json +0 -0
  251. /package/web/.next/standalone/packages/web/.next/static/{FHjp9qazH2xWUCRt6mqg4 → O7I3Iz18_tPidBRAWeKh8}/_ssgManifest.js +0 -0
  252. /package/web/.next/static/{FHjp9qazH2xWUCRt6mqg4 → O7I3Iz18_tPidBRAWeKh8}/_buildManifest.js +0 -0
  253. /package/web/.next/static/{FHjp9qazH2xWUCRt6mqg4 → O7I3Iz18_tPidBRAWeKh8}/_clientMiddlewareManifest.json +0 -0
  254. /package/web/.next/static/{FHjp9qazH2xWUCRt6mqg4 → O7I3Iz18_tPidBRAWeKh8}/_ssgManifest.js +0 -0
@@ -24,8 +24,6 @@ export const RESUMABLE_STATUSES = new Set([
24
24
  export const RECONNECT_BASE_DELAY_MS = 300;
25
25
  export const RECONNECT_MAX_DELAY_MS = 1600;
26
26
  export const RENDERER_RECOVERY_THROTTLE_MS = 120;
27
- export const TERMINAL_WRITE_BATCH_MAX_DELAY_MS = 16;
28
- export const TERMINAL_HTTP_CONTROL_BATCH_MAX_DELAY_MS = 10;
29
27
 
30
28
  // Keep enough scrollback so users can scroll through recent output without
31
29
  // losing context on tab switch or mobile scroll. The backend owns the full
@@ -38,13 +36,7 @@ export const LIVE_TERMINAL_SCROLLBACK =
38
36
  ? MOBILE_TERMINAL_SCROLLBACK
39
37
  : DESKTOP_TERMINAL_SCROLLBACK;
40
38
 
41
- export const READ_ONLY_TERMINAL_SNAPSHOT_LINES = 10_000;
42
-
43
- export const TERMINAL_CONNECTION_CACHE_MAX_TTL_MS = 5_000;
44
- export const TERMINAL_CONNECTION_CACHE_MAX_ENTRIES = 2;
45
- export const TERMINAL_SNAPSHOT_CACHE_MAX_ENTRIES = 8;
46
39
  export const TERMINAL_UI_STATE_CACHE_MAX_ENTRIES = 4;
47
- export const TERMINAL_SNAPSHOT_CACHE_MAX_AGE_MS = 15 * 60 * 1000;
48
40
  export const TERMINAL_UI_STATE_CACHE_MAX_AGE_MS = 12 * 60 * 60 * 1000;
49
41
 
50
42
  export const LIVE_TERMINAL_HELPER_KEYS = [
@@ -27,27 +27,8 @@ export type TerminalConnectionInfo = {
27
27
  interactive: boolean;
28
28
  };
29
29
 
30
- export type TerminalSnapshot = {
31
- snapshot: string;
32
- transcript: string;
33
- source: string;
34
- live: boolean;
35
- restored: boolean;
36
- sequence: number | null;
37
- modes?: import("../sessionTerminalUtils").TerminalModeState;
38
- };
39
-
40
30
  export type PreferredFocusTarget = "none" | "terminal" | "resume";
41
31
 
42
- export type CachedTerminalConnection = {
43
- value: TerminalConnectionInfo;
44
- expiresAt: number;
45
- };
46
-
47
- export type CachedTerminalSnapshot = TerminalSnapshot & {
48
- updatedAt: number;
49
- };
50
-
51
32
  export type CachedTerminalUiState = {
52
33
  message: string;
53
34
  searchOpen: boolean;
@@ -76,9 +76,19 @@ export class TtydClient {
76
76
 
77
77
  // Flow control state — track pending writes
78
78
  private pending = 0;
79
+ private paused = false;
80
+
81
+ // Write batching — accumulate output within a single animation frame
82
+ // and flush as one terminal.write() call to prevent mid-frame rendering.
83
+ private batchChunks: Uint8Array[] = [];
84
+ private batchBytes = 0;
85
+ private batchFrameId: number | null = null;
79
86
 
80
87
  private textEncoder = new TextEncoder();
81
88
  private textDecoder = new TextDecoder("utf-8", { fatal: false });
89
+ // Streaming decoder for terminal output — maintains state across flushes
90
+ // to correctly handle multi-byte UTF-8 sequences split across frames.
91
+ private streamDecoder = new TextDecoder("utf-8", { fatal: false });
82
92
 
83
93
  constructor(
84
94
  terminal: Terminal,
@@ -107,6 +117,12 @@ export class TtydClient {
107
117
  this.socket = null;
108
118
  }
109
119
 
120
+ // Reset flow control, batch state, and streaming decoder for the new connection
121
+ this.pending = 0;
122
+ this.paused = false;
123
+ this.cancelBatch();
124
+ this.streamDecoder = new TextDecoder("utf-8", { fatal: false });
125
+
110
126
  const wsUrl = resolveWebSocketUrl(url);
111
127
  this.socket = new WebSocket(wsUrl);
112
128
  this.socket.binaryType = "arraybuffer";
@@ -137,12 +153,16 @@ export class TtydClient {
137
153
  };
138
154
 
139
155
  this.socket.onmessage = (event) => {
156
+ if (typeof event.data === "string") {
157
+ return;
158
+ }
140
159
  this.handleMessage(event.data as ArrayBuffer);
141
160
  };
142
161
 
143
162
  this.socket.onclose = (event) => {
144
163
  clearTimeout(timeout);
145
164
  this.socket = null;
165
+ this.flushBatch(); // flush any pending output before signalling disconnect
146
166
  this.callbacks.onDisconnected?.(event.code, event.reason || "");
147
167
  // no-op if promise already resolved
148
168
  reject(new Error(`WebSocket closed: ${event.code}`));
@@ -163,6 +183,13 @@ export class TtydClient {
163
183
  * Disconnect from the WebSocket.
164
184
  */
165
185
  disconnect(): void {
186
+ this.flushBatch();
187
+ // Flush any incomplete UTF-8 bytes remaining in the streaming decoder
188
+ const trailing = this.streamDecoder.decode(new Uint8Array(0), { stream: false });
189
+ if (trailing.length > 0 && this.terminal) {
190
+ this.terminal.write(trailing);
191
+ }
192
+ this.cancelBatch();
166
193
  if (this.socket) {
167
194
  this.socket.onopen = null;
168
195
  this.socket.onmessage = null;
@@ -173,22 +200,40 @@ export class TtydClient {
173
200
  }
174
201
  }
175
202
 
176
- /** Send keyboard input to the PTY: [INPUT='0'][payload] */
203
+ /**
204
+ * Send keyboard/paste input to the PTY: [INPUT='0'][payload]
205
+ *
206
+ * Large pastes are chunked into 4 KB frames to avoid overwhelming the PTY
207
+ * write buffer or hitting WebSocket frame limits — matches the reference
208
+ * ttyd client behaviour.
209
+ */
210
+ private static readonly INPUT_CHUNK_SIZE = 4096;
211
+
177
212
  sendInput(data: string | Uint8Array): void {
178
213
  if (!this.isConnected()) return;
179
214
 
180
- let payload: Uint8Array;
181
- if (typeof data === "string") {
182
- const buffer = new Uint8Array(data.length * 3 + 1);
183
- buffer[0] = CMD_INPUT;
184
- const stats = this.textEncoder.encodeInto(data, buffer.subarray(1));
185
- payload = buffer.subarray(0, (stats.written ?? 0) + 1);
186
- } else {
187
- payload = new Uint8Array(data.length + 1);
188
- payload[0] = CMD_INPUT;
189
- payload.set(data, 1);
215
+ const bytes = typeof data === "string"
216
+ ? this.textEncoder.encode(data)
217
+ : data;
218
+
219
+ // Small inputs (single keystrokes, short pastes): send in one frame.
220
+ if (bytes.length <= TtydClient.INPUT_CHUNK_SIZE) {
221
+ const frame = new Uint8Array(1 + bytes.length);
222
+ frame[0] = CMD_INPUT;
223
+ frame.set(bytes, 1);
224
+ this.socket?.send(frame);
225
+ return;
226
+ }
227
+
228
+ // Large pastes: chunk to avoid PTY buffer overflow.
229
+ for (let offset = 0; offset < bytes.length; offset += TtydClient.INPUT_CHUNK_SIZE) {
230
+ const end = Math.min(offset + TtydClient.INPUT_CHUNK_SIZE, bytes.length);
231
+ const chunk = bytes.subarray(offset, end);
232
+ const frame = new Uint8Array(1 + chunk.length);
233
+ frame[0] = CMD_INPUT;
234
+ frame.set(chunk, 1);
235
+ this.socket?.send(frame);
190
236
  }
191
- this.socket?.send(payload);
192
237
  }
193
238
 
194
239
  /** Send resize request: [RESIZE='1'][JSON{columns,rows}] */
@@ -221,8 +266,8 @@ export class TtydClient {
221
266
 
222
267
  switch (cmd) {
223
268
  case CMD_OUTPUT:
224
- // Terminal output — write directly with flow control
225
- this.writeOutput(payload);
269
+ // Terminal output — accumulate into batch buffer, flush on next frame
270
+ this.enqueueOutput(payload);
226
271
  break;
227
272
  case CMD_SET_TITLE:
228
273
  try {
@@ -246,28 +291,68 @@ export class TtydClient {
246
291
  }
247
292
 
248
293
  /**
249
- * Write output data directly to xterm.js with flow control.
250
- * Decodes UTF-8 and applies backpressure via PAUSE/RESUME.
294
+ * Accumulate output data into the batch buffer. The batch is flushed as a
295
+ * single terminal.write() call on the next animation frame. This prevents
296
+ * xterm.js from rendering intermediate partial TUI states when the backend
297
+ * sends a large update as multiple WebSocket messages within one frame.
251
298
  */
252
- // Whether PAUSE has been sent and we're waiting for pending to drop
253
- private paused = false;
299
+ private enqueueOutput(data: Uint8Array): void {
300
+ if (!this.terminal || data.byteLength === 0) return;
301
+
302
+ // Copy the data since the underlying ArrayBuffer may be reused
303
+ this.batchChunks.push(new Uint8Array(data));
304
+ this.batchBytes += data.byteLength;
305
+
306
+ // Schedule flush on next animation frame (only once per frame)
307
+ if (this.batchFrameId === null) {
308
+ this.batchFrameId = requestAnimationFrame(() => {
309
+ this.batchFrameId = null;
310
+ this.flushBatch();
311
+ });
312
+ }
313
+ }
314
+
315
+ /**
316
+ * Flush all accumulated output to the terminal as a single write.
317
+ */
318
+ private flushBatch(): void {
319
+ if (this.batchChunks.length === 0 || !this.terminal) return;
254
320
 
255
- private writeOutput(data: Uint8Array): void {
256
321
  const { highWater, lowWater } = this.flowControl;
257
322
 
258
- if (!this.terminal) {
259
- return;
323
+ // Combine all chunks into a single buffer
324
+ let combined: Uint8Array;
325
+ if (this.batchChunks.length === 1) {
326
+ combined = this.batchChunks[0]!;
327
+ } else {
328
+ combined = new Uint8Array(this.batchBytes);
329
+ let offset = 0;
330
+ for (const chunk of this.batchChunks) {
331
+ combined.set(chunk, offset);
332
+ offset += chunk.byteLength;
333
+ }
260
334
  }
261
335
 
262
- // Write raw bytes directly to xterm.js it handles UTF-8 internally.
263
- // For small writes, use fast path (no callback overhead).
264
- if (data.byteLength < 1024) {
265
- this.terminal.write(data);
336
+ // Reset batch state before writing (in case write triggers synchronous events)
337
+ this.batchChunks.length = 0;
338
+ this.batchBytes = 0;
339
+
340
+ // Decode bytes to string using the streaming decoder. This correctly
341
+ // handles multi-byte UTF-8 sequences split across animation frames —
342
+ // the decoder buffers incomplete trailing bytes and prepends them to
343
+ // the next flush. Passing { stream: true } is critical; without it,
344
+ // split sequences produce U+FFFD replacement characters (blocks).
345
+ const text = this.streamDecoder.decode(combined, { stream: true });
346
+ if (text.length === 0) return;
347
+
348
+ // Small batches: fast path without callback overhead
349
+ if (text.length < 4096) {
350
+ this.terminal.write(text);
266
351
  return;
267
352
  }
268
353
 
269
- // For larger writes, track pending with callback for flow control
270
- this.terminal.write(data, () => {
354
+ // Large batches: track pending writes for flow control
355
+ this.terminal.write(text, () => {
271
356
  this.pending = Math.max(this.pending - 1, 0);
272
357
  // Send RESUME exactly once when pending drops below lowWater
273
358
  if (this.paused && this.pending < lowWater) {
@@ -283,6 +368,16 @@ export class TtydClient {
283
368
  }
284
369
  }
285
370
 
371
+ /** Cancel any pending batch flush. */
372
+ private cancelBatch(): void {
373
+ if (this.batchFrameId !== null) {
374
+ cancelAnimationFrame(this.batchFrameId);
375
+ this.batchFrameId = null;
376
+ }
377
+ this.batchChunks.length = 0;
378
+ this.batchBytes = 0;
379
+ }
380
+
286
381
  private sendPause(): void {
287
382
  if (!this.isConnected()) return;
288
383
  this.socket?.send(new Uint8Array([0x32])); // '2'
@@ -19,6 +19,7 @@ export interface UseTtydConnectionOptions {
19
19
  onConnectionReady?: () => void;
20
20
  onConnectionError?: (error: Error) => void;
21
21
  onConnectionClosed?: (code: number, reason: string) => void;
22
+ onReconnectsExhausted?: () => void;
22
23
  }
23
24
 
24
25
  export interface UseTtydConnectionResult {
@@ -34,7 +35,7 @@ export interface UseTtydConnectionResult {
34
35
  export function useTtydConnection(
35
36
  options: UseTtydConnectionOptions
36
37
  ): UseTtydConnectionResult {
37
- const { terminal, fitAddon, ptyWsUrl, enabled = true, onConnectionReady, onConnectionError, onConnectionClosed } = options;
38
+ const { terminal, fitAddon, ptyWsUrl, enabled = true, onConnectionReady, onConnectionError, onConnectionClosed, onReconnectsExhausted } = options;
38
39
 
39
40
  const clientRef = useRef<TtydClient | null>(null);
40
41
  const [isConnected, setIsConnected] = useState(false);
@@ -48,9 +49,11 @@ export function useTtydConnection(
48
49
  const onConnectionReadyRef = useRef(onConnectionReady);
49
50
  const onConnectionErrorRef = useRef(onConnectionError);
50
51
  const onConnectionClosedRef = useRef(onConnectionClosed);
52
+ const onReconnectsExhaustedRef = useRef(onReconnectsExhausted);
51
53
  onConnectionReadyRef.current = onConnectionReady;
52
54
  onConnectionErrorRef.current = onConnectionError;
53
55
  onConnectionClosedRef.current = onConnectionClosed;
56
+ onReconnectsExhaustedRef.current = onReconnectsExhausted;
54
57
 
55
58
  // Reset connection state when ptyWsUrl changes (new URL = fresh connection attempt)
56
59
  const prevPtyWsUrlRef = useRef(ptyWsUrl);
@@ -60,6 +63,7 @@ export function useTtydConnection(
60
63
  setError(null);
61
64
  setIsConnected(false);
62
65
  setIsConnecting(false);
66
+ reconnectAttemptsRef.current = 0;
63
67
  }
64
68
  }, [ptyWsUrl]);
65
69
 
@@ -106,6 +110,10 @@ export function useTtydConnection(
106
110
  reconnectTimerRef.current = null;
107
111
  setError(null); // allow auto-connect effect to fire
108
112
  }, delayMs);
113
+ } else if (code !== 1000) {
114
+ // All reconnect attempts exhausted — signal parent to refresh URL/token
115
+ setError(new Error("Connection lost"));
116
+ onReconnectsExhaustedRef.current?.();
109
117
  }
110
118
  },
111
119
  onError: (errorMsg) => {
@@ -127,17 +135,6 @@ export function useTtydConnection(
127
135
  };
128
136
  }, [enabled, terminal]);
129
137
 
130
- // Wire terminal input → WebSocket
131
- useEffect(() => {
132
- if (!terminal || !clientRef.current) return;
133
-
134
- const disposable = terminal.onData((data: string) => {
135
- clientRef.current?.sendInput(data);
136
- });
137
-
138
- return () => disposable.dispose();
139
- }, [terminal]);
140
-
141
138
  // Wire terminal resize → WebSocket
142
139
  useEffect(() => {
143
140
  if (!terminal || !fitAddon || !clientRef.current) return;