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.
- package/README.md +1 -21
- package/package.json +5 -5
- package/web/.next/standalone/packages/web/.next/BUILD_ID +1 -1
- package/web/.next/standalone/packages/web/.next/app-path-routes-manifest.json +1 -3
- package/web/.next/standalone/packages/web/.next/build-manifest.json +2 -2
- package/web/.next/standalone/packages/web/.next/prerender-manifest.json +3 -3
- package/web/.next/standalone/packages/web/.next/routes-manifest.json +6 -22
- package/web/.next/standalone/packages/web/.next/server/app/_global-error.html +2 -2
- package/web/.next/standalone/packages/web/.next/server/app/_global-error.rsc +1 -1
- package/web/.next/standalone/packages/web/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +1 -1
- package/web/.next/standalone/packages/web/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
- package/web/.next/standalone/packages/web/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
- package/web/.next/standalone/packages/web/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
- package/web/.next/standalone/packages/web/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
- package/web/.next/standalone/packages/web/.next/server/app/_not-found/page/server-reference-manifest.json +7 -7
- package/web/.next/standalone/packages/web/.next/server/app/_not-found/page.js.nft.json +1 -1
- package/web/.next/standalone/packages/web/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
- package/web/.next/standalone/packages/web/.next/server/app/_not-found.html +1 -1
- package/web/.next/standalone/packages/web/.next/server/app/_not-found.rsc +4 -4
- package/web/.next/standalone/packages/web/.next/server/app/_not-found.segments/_full.segment.rsc +4 -4
- package/web/.next/standalone/packages/web/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
- package/web/.next/standalone/packages/web/.next/server/app/_not-found.segments/_index.segment.rsc +4 -4
- package/web/.next/standalone/packages/web/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
- package/web/.next/standalone/packages/web/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
- package/web/.next/standalone/packages/web/.next/server/app/_not-found.segments/_tree.segment.rsc +2 -2
- package/web/.next/standalone/packages/web/.next/server/app/api/access/route.js +1 -1
- package/web/.next/standalone/packages/web/.next/server/app/api/access/route.js.nft.json +1 -1
- package/web/.next/standalone/packages/web/.next/server/app/api/agents/route.js +1 -1
- package/web/.next/standalone/packages/web/.next/server/app/api/agents/route.js.nft.json +1 -1
- package/web/.next/standalone/packages/web/.next/server/app/api/app-update/route.js +1 -1
- package/web/.next/standalone/packages/web/.next/server/app/api/app-update/route.js.nft.json +1 -1
- package/web/.next/standalone/packages/web/.next/server/app/api/attachments/route.js +1 -1
- package/web/.next/standalone/packages/web/.next/server/app/api/attachments/route.js.nft.json +1 -1
- package/web/.next/standalone/packages/web/.next/server/app/api/auth/session/route.js +1 -1
- package/web/.next/standalone/packages/web/.next/server/app/api/auth/session/route.js.nft.json +1 -1
- package/web/.next/standalone/packages/web/.next/server/app/api/boards/comments/route.js +1 -1
- package/web/.next/standalone/packages/web/.next/server/app/api/boards/comments/route.js.nft.json +1 -1
- package/web/.next/standalone/packages/web/.next/server/app/api/boards/route.js +1 -1
- package/web/.next/standalone/packages/web/.next/server/app/api/boards/route.js.nft.json +1 -1
- package/web/.next/standalone/packages/web/.next/server/app/api/config/route.js +1 -1
- package/web/.next/standalone/packages/web/.next/server/app/api/config/route.js.nft.json +1 -1
- package/web/.next/standalone/packages/web/.next/server/app/api/context-files/open/route.js +1 -1
- package/web/.next/standalone/packages/web/.next/server/app/api/context-files/open/route.js.nft.json +1 -1
- package/web/.next/standalone/packages/web/.next/server/app/api/context-files/route.js +1 -1
- package/web/.next/standalone/packages/web/.next/server/app/api/context-files/route.js.nft.json +1 -1
- package/web/.next/standalone/packages/web/.next/server/app/api/events/route.js +1 -1
- package/web/.next/standalone/packages/web/.next/server/app/api/events/route.js.nft.json +1 -1
- package/web/.next/standalone/packages/web/.next/server/app/api/executor/health/route.js +1 -1
- package/web/.next/standalone/packages/web/.next/server/app/api/executor/health/route.js.nft.json +1 -1
- package/web/.next/standalone/packages/web/.next/server/app/api/filesystem/directory/route.js +1 -1
- package/web/.next/standalone/packages/web/.next/server/app/api/filesystem/directory/route.js.nft.json +1 -1
- package/web/.next/standalone/packages/web/.next/server/app/api/filesystem/pick-directory/route.js +1 -1
- package/web/.next/standalone/packages/web/.next/server/app/api/filesystem/pick-directory/route.js.nft.json +1 -1
- package/web/.next/standalone/packages/web/.next/server/app/api/github/repos/route.js +1 -1
- package/web/.next/standalone/packages/web/.next/server/app/api/github/repos/route.js.nft.json +1 -1
- package/web/.next/standalone/packages/web/.next/server/app/api/github/webhook/route.js +1 -1
- package/web/.next/standalone/packages/web/.next/server/app/api/github/webhook/route.js.nft.json +1 -1
- package/web/.next/standalone/packages/web/.next/server/app/api/health/boards/route.js +1 -1
- package/web/.next/standalone/packages/web/.next/server/app/api/health/boards/route.js.nft.json +1 -1
- package/web/.next/standalone/packages/web/.next/server/app/api/health/sessions/route.js +1 -1
- package/web/.next/standalone/packages/web/.next/server/app/api/health/sessions/route.js.nft.json +1 -1
- package/web/.next/standalone/packages/web/.next/server/app/api/notifications/route.js +1 -1
- package/web/.next/standalone/packages/web/.next/server/app/api/notifications/route.js.nft.json +1 -1
- package/web/.next/standalone/packages/web/.next/server/app/api/preferences/route.js +1 -1
- package/web/.next/standalone/packages/web/.next/server/app/api/preferences/route.js.nft.json +1 -1
- package/web/.next/standalone/packages/web/.next/server/app/api/remote-access/route.js +1 -1
- package/web/.next/standalone/packages/web/.next/server/app/api/remote-access/route.js.nft.json +1 -1
- package/web/.next/standalone/packages/web/.next/server/app/api/repositories/[id]/route.js +1 -1
- package/web/.next/standalone/packages/web/.next/server/app/api/repositories/[id]/route.js.nft.json +1 -1
- package/web/.next/standalone/packages/web/.next/server/app/api/repositories/route.js +1 -1
- package/web/.next/standalone/packages/web/.next/server/app/api/repositories/route.js.nft.json +1 -1
- package/web/.next/standalone/packages/web/.next/server/app/api/sessions/[id]/actions/route.js +1 -1
- package/web/.next/standalone/packages/web/.next/server/app/api/sessions/[id]/actions/route.js.nft.json +1 -1
- package/web/.next/standalone/packages/web/.next/server/app/api/sessions/[id]/archive/route.js +1 -1
- package/web/.next/standalone/packages/web/.next/server/app/api/sessions/[id]/archive/route.js.nft.json +1 -1
- package/web/.next/standalone/packages/web/.next/server/app/api/sessions/[id]/checks/route.js +1 -1
- package/web/.next/standalone/packages/web/.next/server/app/api/sessions/[id]/checks/route.js.nft.json +1 -1
- package/web/.next/standalone/packages/web/.next/server/app/api/sessions/[id]/diff/route.js +1 -1
- package/web/.next/standalone/packages/web/.next/server/app/api/sessions/[id]/diff/route.js.nft.json +1 -1
- package/web/.next/standalone/packages/web/.next/server/app/api/sessions/[id]/feed/route.js +1 -1
- package/web/.next/standalone/packages/web/.next/server/app/api/sessions/[id]/feed/route.js.nft.json +1 -1
- package/web/.next/standalone/packages/web/.next/server/app/api/sessions/[id]/feedback/route.js +1 -1
- package/web/.next/standalone/packages/web/.next/server/app/api/sessions/[id]/feedback/route.js.nft.json +1 -1
- package/web/.next/standalone/packages/web/.next/server/app/api/sessions/[id]/files/route.js +1 -1
- package/web/.next/standalone/packages/web/.next/server/app/api/sessions/[id]/files/route.js.nft.json +1 -1
- package/web/.next/standalone/packages/web/.next/server/app/api/sessions/[id]/interrupt/route.js +1 -1
- package/web/.next/standalone/packages/web/.next/server/app/api/sessions/[id]/interrupt/route.js.nft.json +1 -1
- package/web/.next/standalone/packages/web/.next/server/app/api/sessions/[id]/kill/route.js +1 -1
- package/web/.next/standalone/packages/web/.next/server/app/api/sessions/[id]/kill/route.js.nft.json +1 -1
- package/web/.next/standalone/packages/web/.next/server/app/api/sessions/[id]/output/route.js +1 -1
- package/web/.next/standalone/packages/web/.next/server/app/api/sessions/[id]/output/route.js.nft.json +1 -1
- package/web/.next/standalone/packages/web/.next/server/app/api/sessions/[id]/preview/dom/route.js +1 -1
- package/web/.next/standalone/packages/web/.next/server/app/api/sessions/[id]/preview/dom/route.js.nft.json +1 -1
- package/web/.next/standalone/packages/web/.next/server/app/api/sessions/[id]/preview/route.js +1 -1
- package/web/.next/standalone/packages/web/.next/server/app/api/sessions/[id]/preview/route.js.nft.json +1 -1
- package/web/.next/standalone/packages/web/.next/server/app/api/sessions/[id]/preview/screenshot/route.js +1 -1
- package/web/.next/standalone/packages/web/.next/server/app/api/sessions/[id]/preview/screenshot/route.js.nft.json +1 -1
- package/web/.next/standalone/packages/web/.next/server/app/api/sessions/[id]/restore/route.js +1 -1
- package/web/.next/standalone/packages/web/.next/server/app/api/sessions/[id]/restore/route.js.nft.json +1 -1
- package/web/.next/standalone/packages/web/.next/server/app/api/sessions/[id]/route.js +1 -1
- package/web/.next/standalone/packages/web/.next/server/app/api/sessions/[id]/route.js.nft.json +1 -1
- package/web/.next/standalone/packages/web/.next/server/app/api/sessions/[id]/terminal/snapshot/route.js +1 -1
- package/web/.next/standalone/packages/web/.next/server/app/api/sessions/[id]/terminal/snapshot/route.js.nft.json +1 -1
- package/web/.next/standalone/packages/web/.next/server/app/api/sessions/[id]/terminal/token/route/app-paths-manifest.json +3 -0
- package/web/.next/standalone/packages/web/.next/server/app/api/sessions/[id]/terminal/token/route.js +10 -0
- package/web/.next/standalone/packages/web/.next/server/app/api/sessions/[id]/terminal/token/route.js.nft.json +1 -0
- package/web/.next/standalone/packages/web/.next/server/app/api/sessions/[id]/terminal/token/route_client-reference-manifest.js +2 -0
- package/web/.next/standalone/packages/web/.next/server/app/api/sessions/route.js +1 -1
- package/web/.next/standalone/packages/web/.next/server/app/api/sessions/route.js.nft.json +1 -1
- package/web/.next/standalone/packages/web/.next/server/app/api/spawn/route.js +1 -1
- package/web/.next/standalone/packages/web/.next/server/app/api/spawn/route.js.nft.json +1 -1
- package/web/.next/standalone/packages/web/.next/server/app/api/workspaces/branches/route.js +1 -1
- package/web/.next/standalone/packages/web/.next/server/app/api/workspaces/branches/route.js.nft.json +1 -1
- package/web/.next/standalone/packages/web/.next/server/app/api/workspaces/route.js +1 -1
- package/web/.next/standalone/packages/web/.next/server/app/api/workspaces/route.js.nft.json +1 -1
- package/web/.next/standalone/packages/web/.next/server/app/page/react-loadable-manifest.json +1 -1
- package/web/.next/standalone/packages/web/.next/server/app/page/server-reference-manifest.json +7 -7
- package/web/.next/standalone/packages/web/.next/server/app/page.js.nft.json +1 -1
- package/web/.next/standalone/packages/web/.next/server/app/page_client-reference-manifest.js +1 -1
- package/web/.next/standalone/packages/web/.next/server/app/sessions/[id]/page/react-loadable-manifest.json +1 -1
- package/web/.next/standalone/packages/web/.next/server/app/sessions/[id]/page/server-reference-manifest.json +7 -7
- package/web/.next/standalone/packages/web/.next/server/app/sessions/[id]/page.js.nft.json +1 -1
- package/web/.next/standalone/packages/web/.next/server/app/sessions/[id]/page_client-reference-manifest.js +1 -1
- package/web/.next/standalone/packages/web/.next/server/app/sign-in/[[...sign-in]]/page/server-reference-manifest.json +7 -7
- package/web/.next/standalone/packages/web/.next/server/app/sign-in/[[...sign-in]]/page.js.nft.json +1 -1
- package/web/.next/standalone/packages/web/.next/server/app/sign-in/[[...sign-in]]/page_client-reference-manifest.js +1 -1
- package/web/.next/standalone/packages/web/.next/server/app/unlock/page/server-reference-manifest.json +7 -7
- package/web/.next/standalone/packages/web/.next/server/app/unlock/page.js.nft.json +1 -1
- package/web/.next/standalone/packages/web/.next/server/app/unlock/page_client-reference-manifest.js +1 -1
- package/web/.next/standalone/packages/web/.next/server/app-paths-manifest.json +1 -3
- package/web/.next/standalone/packages/web/.next/server/chunks/26076_server_app_api_sessions_[id]_terminal_token_route_actions_9c4b3c06.js +3 -0
- package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__63017d21._.js +3 -0
- package/web/.next/standalone/packages/web/.next/server/chunks/{[root-of-the-server]__f3d09d5c._.js → [root-of-the-server]__9279c912._.js} +1 -1
- package/web/.next/standalone/packages/web/.next/server/chunks/_2c837d66._.js +80 -0
- package/web/.next/standalone/packages/web/.next/server/chunks/ssr/[root-of-the-server]__379d412d._.js +1 -1
- package/web/.next/standalone/packages/web/.next/server/chunks/ssr/{[root-of-the-server]__da08a50a._.js → [root-of-the-server]__443ba186._.js} +2 -2
- package/web/.next/standalone/packages/web/.next/server/chunks/ssr/{[root-of-the-server]__a565f9a3._.js → [root-of-the-server]__742dad30._.js} +2 -2
- package/web/.next/standalone/packages/web/.next/server/chunks/ssr/[root-of-the-server]__749fe4b2._.js +1 -1
- package/web/.next/standalone/packages/web/.next/server/chunks/ssr/{[root-of-the-server]__992cdcf8._.js → [root-of-the-server]__a8fa29c1._.js} +2 -2
- package/web/.next/standalone/packages/web/.next/server/chunks/ssr/_0e1412de._.js +1 -1
- package/web/.next/standalone/packages/web/.next/server/chunks/ssr/_532f707d._.js +1 -1
- package/web/.next/standalone/packages/web/.next/server/chunks/ssr/_69e05fca._.js +1 -1
- package/web/.next/standalone/packages/web/.next/server/chunks/ssr/_80efe193._.js +1 -1
- package/web/.next/standalone/packages/web/.next/server/chunks/ssr/{_62d206cc._.js → _9bf43d8d._.js} +2 -2
- package/web/.next/standalone/packages/web/.next/server/chunks/ssr/_c0f0e227._.js +1 -1
- package/web/.next/standalone/packages/web/.next/server/chunks/ssr/_f36ddaa9._.js +1 -1
- package/web/.next/standalone/packages/web/.next/server/chunks/ssr/{node_modules_5646ec2d._.js → node_modules_91aa5708._.js} +1 -1
- package/web/.next/standalone/packages/web/.next/server/chunks/ssr/node_modules_@clerk_nextjs_dist_esm_app-router_3964db17._.js +3 -0
- package/web/.next/standalone/packages/web/.next/server/chunks/ssr/node_modules_@clerk_nextjs_dist_esm_app-router_5c863a0e._.js +3 -0
- package/web/.next/standalone/packages/web/.next/server/chunks/ssr/{node_modules_6d2fa1ea._.js → node_modules_be1275d0._.js} +1 -1
- package/web/.next/standalone/packages/web/.next/server/chunks/ssr/packages_web_src_components_sessions_SessionTerminal_tsx_eaf9458b._.js +1 -1
- package/web/.next/standalone/packages/web/.next/server/functions-config-manifest.json +2 -4
- package/web/.next/standalone/packages/web/.next/server/pages/404.html +1 -1
- package/web/.next/standalone/packages/web/.next/server/pages/500.html +2 -2
- package/web/.next/standalone/packages/web/.next/server/server-reference-manifest.js +1 -1
- package/web/.next/standalone/packages/web/.next/server/server-reference-manifest.json +8 -8
- package/web/.next/standalone/packages/web/.next/static/chunks/{c1e720eabb98af26.js → 2037d1500c64fbef.js} +1 -1
- package/web/.next/standalone/packages/web/.next/static/chunks/{58a9b117e5684e7c.js → 3ad6d404d5657604.js} +1 -1
- package/web/.next/standalone/packages/web/.next/static/chunks/4d288f280972fd06.js +1 -0
- package/web/.next/standalone/packages/web/.next/static/chunks/65bc9229d60adf9f.css +4 -0
- package/web/.next/standalone/packages/web/.next/static/chunks/97e7e5343941de65.js +1 -0
- package/web/.next/{static/chunks/8d05dc3b261207bb.js → standalone/packages/web/.next/static/chunks/ab8cea4266d5034c.js} +1 -1
- package/web/.next/standalone/packages/web/.next/static/chunks/{655db4d21daaca4d.js → b2b84b9e8ccbeafa.js} +1 -1
- package/web/.next/standalone/packages/web/.next/static/chunks/b9a43bac36046bf9.js +138 -0
- package/web/.next/{static/chunks/9331c73d4edcd945.js → standalone/packages/web/.next/static/chunks/d1cbb83a98e765b5.js} +1 -1
- package/web/.next/standalone/packages/web/.next/static/chunks/{301802e8e898dd01.js → f2fea305b6822999.js} +1 -1
- package/web/.next/standalone/packages/web/.next/static/chunks/f48f57293e98e0d8.js +1 -0
- package/web/.next/standalone/packages/web/.next/static/chunks/fe52c44944adc7f2.js +1 -0
- package/web/.next/standalone/packages/web/src/app/api/sessions/[id]/terminal/token/route.ts +13 -0
- package/web/.next/standalone/packages/web/src/components/sessions/SessionTerminal.tsx +77 -39
- package/web/.next/standalone/packages/web/src/components/sessions/sessionTerminalUtils.test.ts +0 -122
- package/web/.next/standalone/packages/web/src/components/sessions/sessionTerminalUtils.ts +0 -220
- package/web/.next/standalone/packages/web/src/components/sessions/terminal/terminalApi.ts +89 -87
- package/web/.next/standalone/packages/web/src/components/sessions/terminal/terminalCache.ts +2 -73
- package/web/.next/standalone/packages/web/src/components/sessions/terminal/terminalConstants.ts +0 -8
- package/web/.next/standalone/packages/web/src/components/sessions/terminal/terminalTypes.ts +0 -19
- package/web/.next/standalone/packages/web/src/components/sessions/terminal/ttydClient.ts +122 -27
- package/web/.next/standalone/packages/web/src/components/sessions/terminal/useTtydConnection.ts +9 -12
- package/web/.next/standalone/packages/web/src/lib/sessionState.ts +0 -473
- package/web/.next/static/chunks/{c1e720eabb98af26.js → 2037d1500c64fbef.js} +1 -1
- package/web/.next/static/chunks/{58a9b117e5684e7c.js → 3ad6d404d5657604.js} +1 -1
- package/web/.next/static/chunks/4d288f280972fd06.js +1 -0
- package/web/.next/static/chunks/65bc9229d60adf9f.css +4 -0
- package/web/.next/static/chunks/97e7e5343941de65.js +1 -0
- package/web/.next/{standalone/packages/web/.next/static/chunks/8d05dc3b261207bb.js → static/chunks/ab8cea4266d5034c.js} +1 -1
- package/web/.next/static/chunks/{655db4d21daaca4d.js → b2b84b9e8ccbeafa.js} +1 -1
- package/web/.next/static/chunks/b9a43bac36046bf9.js +138 -0
- package/web/.next/{standalone/packages/web/.next/static/chunks/9331c73d4edcd945.js → static/chunks/d1cbb83a98e765b5.js} +1 -1
- package/web/.next/static/chunks/{301802e8e898dd01.js → f2fea305b6822999.js} +1 -1
- package/web/.next/static/chunks/f48f57293e98e0d8.js +1 -0
- package/web/.next/static/chunks/fe52c44944adc7f2.js +1 -0
- package/web/.next/standalone/packages/web/.next/server/app/api/sessions/[id]/feed/stream/route/app-paths-manifest.json +0 -3
- package/web/.next/standalone/packages/web/.next/server/app/api/sessions/[id]/feed/stream/route.js +0 -10
- package/web/.next/standalone/packages/web/.next/server/app/api/sessions/[id]/feed/stream/route.js.nft.json +0 -1
- package/web/.next/standalone/packages/web/.next/server/app/api/sessions/[id]/feed/stream/route_client-reference-manifest.js +0 -2
- package/web/.next/standalone/packages/web/.next/server/app/api/sessions/[id]/output/stream/route/app-paths-manifest.json +0 -3
- package/web/.next/standalone/packages/web/.next/server/app/api/sessions/[id]/output/stream/route/build-manifest.json +0 -11
- package/web/.next/standalone/packages/web/.next/server/app/api/sessions/[id]/output/stream/route/server-reference-manifest.json +0 -4
- package/web/.next/standalone/packages/web/.next/server/app/api/sessions/[id]/output/stream/route.js +0 -10
- package/web/.next/standalone/packages/web/.next/server/app/api/sessions/[id]/output/stream/route.js.map +0 -5
- package/web/.next/standalone/packages/web/.next/server/app/api/sessions/[id]/output/stream/route.js.nft.json +0 -1
- package/web/.next/standalone/packages/web/.next/server/app/api/sessions/[id]/output/stream/route_client-reference-manifest.js +0 -2
- package/web/.next/standalone/packages/web/.next/server/app/api/sessions/[id]/terminal/connection/route/app-paths-manifest.json +0 -3
- package/web/.next/standalone/packages/web/.next/server/app/api/sessions/[id]/terminal/connection/route/build-manifest.json +0 -11
- package/web/.next/standalone/packages/web/.next/server/app/api/sessions/[id]/terminal/connection/route/server-reference-manifest.json +0 -4
- package/web/.next/standalone/packages/web/.next/server/app/api/sessions/[id]/terminal/connection/route.js +0 -10
- package/web/.next/standalone/packages/web/.next/server/app/api/sessions/[id]/terminal/connection/route.js.map +0 -5
- package/web/.next/standalone/packages/web/.next/server/app/api/sessions/[id]/terminal/connection/route.js.nft.json +0 -1
- package/web/.next/standalone/packages/web/.next/server/app/api/sessions/[id]/terminal/connection/route_client-reference-manifest.js +0 -2
- package/web/.next/standalone/packages/web/.next/server/chunks/26076_server_app_api_sessions_[id]_terminal_connection_route_actions_46c114ee.js +0 -3
- 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
- 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
- package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__1029f927._.js +0 -3
- package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__d74c0f7a._.js +0 -3
- package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__ddad8d14._.js +0 -3
- package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__ede5c8ca._.js +0 -3
- package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__f56e5b36._.js +0 -3
- package/web/.next/standalone/packages/web/.next/server/chunks/_24c4e75d._.js +0 -80
- package/web/.next/standalone/packages/web/.next/server/chunks/_3d39aff4._.js +0 -80
- package/web/.next/standalone/packages/web/.next/server/chunks/ssr/_307d7608._.js +0 -3
- package/web/.next/standalone/packages/web/.next/server/chunks/ssr/_3ed93faf._.js +0 -3
- package/web/.next/standalone/packages/web/.next/server/chunks/ssr/node_modules_@clerk_nextjs_dist_esm_app-router_4f296b1d._.js +0 -3
- package/web/.next/standalone/packages/web/.next/server/chunks/ssr/node_modules_@clerk_nextjs_dist_esm_app-router_599a1810._.js +0 -3
- package/web/.next/standalone/packages/web/.next/static/chunks/06eb75e40dff98f1.css +0 -4
- package/web/.next/standalone/packages/web/.next/static/chunks/1382eff030c401e3.js +0 -1
- package/web/.next/standalone/packages/web/.next/static/chunks/1684a3f76eefe776.js +0 -1
- package/web/.next/standalone/packages/web/.next/static/chunks/267e541b481c3c75.js +0 -1
- package/web/.next/standalone/packages/web/.next/static/chunks/810a3d36795ae9fd.js +0 -138
- package/web/.next/standalone/packages/web/.next/static/chunks/a8cd591e904d769e.js +0 -1
- package/web/.next/standalone/packages/web/src/app/api/sessions/[id]/feed/stream/route.ts +0 -80
- package/web/.next/standalone/packages/web/src/app/api/sessions/[id]/output/stream/route.ts +0 -80
- package/web/.next/standalone/packages/web/src/app/api/sessions/[id]/terminal/connection/route.test.ts +0 -343
- package/web/.next/standalone/packages/web/src/app/api/sessions/[id]/terminal/connection/route.ts +0 -120
- package/web/.next/standalone/packages/web/src/components/Dashboard.tsx +0 -3444
- package/web/.next/standalone/packages/web/src/components/TerminalView.tsx +0 -770
- package/web/.next/standalone/packages/web/src/components/sessions/ChatPanel.tsx +0 -2097
- package/web/.next/standalone/packages/web/src/hooks/useSessionFeed.ts +0 -10
- package/web/.next/standalone/packages/web/src/hooks/useSessionOutputStream.ts +0 -166
- package/web/.next/standalone/packages/web/src/lib/chatFeed.ts +0 -196
- package/web/.next/static/chunks/06eb75e40dff98f1.css +0 -4
- package/web/.next/static/chunks/1382eff030c401e3.js +0 -1
- package/web/.next/static/chunks/1684a3f76eefe776.js +0 -1
- package/web/.next/static/chunks/267e541b481c3c75.js +0 -1
- package/web/.next/static/chunks/810a3d36795ae9fd.js +0 -138
- package/web/.next/static/chunks/a8cd591e904d769e.js +0 -1
- /package/web/.next/standalone/packages/web/.next/server/app/api/sessions/[id]/{feed/stream → terminal/token}/route/build-manifest.json +0 -0
- /package/web/.next/standalone/packages/web/.next/server/app/api/sessions/[id]/{feed/stream → terminal/token}/route/server-reference-manifest.json +0 -0
- /package/web/.next/standalone/packages/web/.next/server/app/api/sessions/[id]/{feed/stream → terminal/token}/route.js.map +0 -0
- /package/web/.next/standalone/packages/web/.next/static/{FHjp9qazH2xWUCRt6mqg4 → O7I3Iz18_tPidBRAWeKh8}/_buildManifest.js +0 -0
- /package/web/.next/standalone/packages/web/.next/static/{FHjp9qazH2xWUCRt6mqg4 → O7I3Iz18_tPidBRAWeKh8}/_clientMiddlewareManifest.json +0 -0
- /package/web/.next/standalone/packages/web/.next/static/{FHjp9qazH2xWUCRt6mqg4 → O7I3Iz18_tPidBRAWeKh8}/_ssgManifest.js +0 -0
- /package/web/.next/static/{FHjp9qazH2xWUCRt6mqg4 → O7I3Iz18_tPidBRAWeKh8}/_buildManifest.js +0 -0
- /package/web/.next/static/{FHjp9qazH2xWUCRt6mqg4 → O7I3Iz18_tPidBRAWeKh8}/_clientMiddlewareManifest.json +0 -0
- /package/web/.next/static/{FHjp9qazH2xWUCRt6mqg4 → O7I3Iz18_tPidBRAWeKh8}/_ssgManifest.js +0 -0
package/web/.next/standalone/packages/web/src/components/sessions/terminal/terminalConstants.ts
CHANGED
|
@@ -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
|
-
/**
|
|
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
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
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 —
|
|
225
|
-
this.
|
|
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
|
-
*
|
|
250
|
-
*
|
|
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
|
-
|
|
253
|
-
|
|
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
|
-
|
|
259
|
-
|
|
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
|
-
//
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
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
|
-
//
|
|
270
|
-
this.terminal.write(
|
|
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'
|
package/web/.next/standalone/packages/web/src/components/sessions/terminal/useTtydConnection.ts
CHANGED
|
@@ -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;
|