conductor-oss 0.3.4 → 0.4.0

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 (1214) hide show
  1. package/README.md +225 -201
  2. package/dist/commands/setup.d.ts.map +1 -1
  3. package/dist/commands/setup.js +28 -3
  4. package/dist/commands/setup.js.map +1 -1
  5. package/dist/commands/start.d.ts +14 -2
  6. package/dist/commands/start.d.ts.map +1 -1
  7. package/dist/commands/start.js +351 -180
  8. package/dist/commands/start.js.map +1 -1
  9. package/node_modules/@conductor-oss/core/dist/board-watcher.d.ts.map +1 -1
  10. package/node_modules/@conductor-oss/core/dist/board-watcher.js +11 -8
  11. package/node_modules/@conductor-oss/core/dist/board-watcher.js.map +1 -1
  12. package/node_modules/@conductor-oss/core/dist/config-sync.d.ts.map +1 -1
  13. package/node_modules/@conductor-oss/core/dist/config-sync.js +23 -2
  14. package/node_modules/@conductor-oss/core/dist/config-sync.js.map +1 -1
  15. package/node_modules/@conductor-oss/core/dist/config.d.ts.map +1 -1
  16. package/node_modules/@conductor-oss/core/dist/config.js +87 -4
  17. package/node_modules/@conductor-oss/core/dist/config.js.map +1 -1
  18. package/node_modules/@conductor-oss/core/dist/metadata.d.ts.map +1 -1
  19. package/node_modules/@conductor-oss/core/dist/metadata.js +4 -0
  20. package/node_modules/@conductor-oss/core/dist/metadata.js.map +1 -1
  21. package/node_modules/@conductor-oss/core/dist/prompt-builder.d.ts +1 -1
  22. package/node_modules/@conductor-oss/core/dist/prompt-builder.d.ts.map +1 -1
  23. package/node_modules/@conductor-oss/core/dist/prompt-builder.js +5 -0
  24. package/node_modules/@conductor-oss/core/dist/prompt-builder.js.map +1 -1
  25. package/node_modules/@conductor-oss/core/dist/scaffold.d.ts +20 -2
  26. package/node_modules/@conductor-oss/core/dist/scaffold.d.ts.map +1 -1
  27. package/node_modules/@conductor-oss/core/dist/scaffold.js +39 -5
  28. package/node_modules/@conductor-oss/core/dist/scaffold.js.map +1 -1
  29. package/node_modules/@conductor-oss/core/dist/session-manager.d.ts.map +1 -1
  30. package/node_modules/@conductor-oss/core/dist/session-manager.js +82 -9
  31. package/node_modules/@conductor-oss/core/dist/session-manager.js.map +1 -1
  32. package/node_modules/@conductor-oss/core/dist/types.d.ts +33 -7
  33. package/node_modules/@conductor-oss/core/dist/types.d.ts.map +1 -1
  34. package/node_modules/@conductor-oss/core/dist/types.js +151 -0
  35. package/node_modules/@conductor-oss/core/dist/types.js.map +1 -1
  36. package/node_modules/@conductor-oss/plugin-agent-amp/package.json +1 -1
  37. package/node_modules/@conductor-oss/plugin-agent-ccr/package.json +1 -1
  38. package/node_modules/@conductor-oss/plugin-agent-claude-code/package.json +1 -1
  39. package/node_modules/@conductor-oss/plugin-agent-codex/package.json +1 -1
  40. package/node_modules/@conductor-oss/plugin-agent-cursor-cli/package.json +1 -1
  41. package/node_modules/@conductor-oss/plugin-agent-droid/package.json +1 -1
  42. package/node_modules/@conductor-oss/plugin-agent-gemini/package.json +1 -1
  43. package/node_modules/@conductor-oss/plugin-agent-github-copilot/package.json +1 -1
  44. package/node_modules/@conductor-oss/plugin-agent-opencode/package.json +1 -1
  45. package/node_modules/@conductor-oss/plugin-agent-qwen-code/package.json +1 -1
  46. package/node_modules/@conductor-oss/plugin-mcp-server/package.json +1 -1
  47. package/node_modules/@conductor-oss/plugin-notifier-desktop/package.json +1 -1
  48. package/node_modules/@conductor-oss/plugin-notifier-discord/package.json +1 -1
  49. package/node_modules/@conductor-oss/plugin-runtime-tmux/package.json +1 -1
  50. package/node_modules/@conductor-oss/plugin-scm-github/package.json +1 -1
  51. package/node_modules/@conductor-oss/plugin-terminal-web/package.json +1 -1
  52. package/node_modules/@conductor-oss/plugin-tracker-github/package.json +1 -1
  53. package/node_modules/@conductor-oss/plugin-workspace-worktree/package.json +1 -1
  54. package/package.json +24 -23
  55. package/web/.next/standalone/node_modules/@babel/code-frame/lib/index.js +217 -0
  56. package/web/.next/standalone/node_modules/@babel/code-frame/package.json +32 -0
  57. package/web/.next/standalone/node_modules/@babel/helper-validator-identifier/lib/identifier.js +70 -0
  58. package/web/.next/standalone/node_modules/@babel/helper-validator-identifier/lib/index.js +57 -0
  59. package/web/.next/standalone/node_modules/@babel/helper-validator-identifier/lib/keyword.js +35 -0
  60. package/web/.next/standalone/node_modules/@babel/helper-validator-identifier/package.json +31 -0
  61. package/web/.next/standalone/node_modules/@puppeteer/browsers/lib/esm/CLI.js +338 -0
  62. package/web/.next/standalone/node_modules/@puppeteer/browsers/lib/esm/Cache.js +208 -0
  63. package/web/.next/standalone/node_modules/@puppeteer/browsers/lib/esm/DefaultProvider.js +35 -0
  64. package/web/.next/standalone/node_modules/@puppeteer/browsers/lib/esm/DefaultProvider.spec.js +75 -0
  65. package/web/.next/standalone/node_modules/@puppeteer/browsers/lib/esm/browser-data/browser-data.js +235 -0
  66. package/web/.next/standalone/node_modules/@puppeteer/browsers/lib/esm/browser-data/chrome-headless-shell.js +47 -0
  67. package/web/.next/standalone/node_modules/@puppeteer/browsers/lib/esm/browser-data/chrome.js +296 -0
  68. package/web/.next/standalone/node_modules/@puppeteer/browsers/lib/esm/browser-data/chromedriver.js +43 -0
  69. package/web/.next/standalone/node_modules/@puppeteer/browsers/lib/esm/browser-data/chromium.js +63 -0
  70. package/web/.next/standalone/node_modules/@puppeteer/browsers/lib/esm/browser-data/firefox.js +374 -0
  71. package/web/.next/standalone/node_modules/@puppeteer/browsers/lib/esm/browser-data/types.js +63 -0
  72. package/web/.next/standalone/node_modules/@puppeteer/browsers/lib/esm/debug.js +8 -0
  73. package/web/.next/standalone/node_modules/@puppeteer/browsers/lib/esm/detectPlatform.js +47 -0
  74. package/web/.next/standalone/node_modules/@puppeteer/browsers/lib/esm/fileUtil.js +156 -0
  75. package/web/.next/standalone/node_modules/@puppeteer/browsers/lib/esm/httpUtil.js +132 -0
  76. package/web/.next/standalone/node_modules/@puppeteer/browsers/lib/esm/install.js +351 -0
  77. package/web/.next/standalone/node_modules/@puppeteer/browsers/lib/esm/launch.js +426 -0
  78. package/web/.next/standalone/node_modules/@puppeteer/browsers/lib/esm/main-cli.js +9 -0
  79. package/web/.next/standalone/node_modules/@puppeteer/browsers/lib/esm/main.js +15 -0
  80. package/web/.next/standalone/node_modules/@puppeteer/browsers/lib/esm/package.json +1 -0
  81. package/web/.next/standalone/node_modules/@puppeteer/browsers/lib/esm/provider.js +13 -0
  82. package/web/.next/standalone/node_modules/@puppeteer/browsers/package.json +125 -0
  83. package/web/.next/standalone/node_modules/@tootallnate/quickjs-emscripten/dist/asyncify-helpers.js +53 -0
  84. package/web/.next/standalone/node_modules/@tootallnate/quickjs-emscripten/dist/context-asyncify.js +58 -0
  85. package/web/.next/standalone/node_modules/@tootallnate/quickjs-emscripten/dist/context.js +691 -0
  86. package/web/.next/standalone/node_modules/@tootallnate/quickjs-emscripten/dist/debug.js +6 -0
  87. package/web/.next/standalone/node_modules/@tootallnate/quickjs-emscripten/dist/deferred-promise.js +96 -0
  88. package/web/.next/standalone/node_modules/@tootallnate/quickjs-emscripten/dist/errors.js +58 -0
  89. package/web/.next/standalone/node_modules/@tootallnate/quickjs-emscripten/dist/esmHelpers.js +19 -0
  90. package/web/.next/standalone/node_modules/@tootallnate/quickjs-emscripten/dist/generated/emscripten-module.WASM_RELEASE_SYNC.js +387 -0
  91. package/web/.next/standalone/node_modules/@tootallnate/quickjs-emscripten/dist/generated/ffi.WASM_RELEASE_SYNC.js +71 -0
  92. package/web/.next/standalone/node_modules/@tootallnate/quickjs-emscripten/dist/index.js +128 -0
  93. package/web/.next/standalone/node_modules/@tootallnate/quickjs-emscripten/dist/lifetime.js +227 -0
  94. package/web/.next/standalone/node_modules/@tootallnate/quickjs-emscripten/dist/memory.js +41 -0
  95. package/web/.next/standalone/node_modules/@tootallnate/quickjs-emscripten/dist/module-asyncify.js +97 -0
  96. package/web/.next/standalone/node_modules/@tootallnate/quickjs-emscripten/dist/module-test.js +77 -0
  97. package/web/.next/standalone/node_modules/@tootallnate/quickjs-emscripten/dist/module.js +302 -0
  98. package/web/.next/standalone/node_modules/@tootallnate/quickjs-emscripten/dist/runtime-asyncify.js +49 -0
  99. package/web/.next/standalone/node_modules/@tootallnate/quickjs-emscripten/dist/runtime.js +300 -0
  100. package/web/.next/standalone/node_modules/@tootallnate/quickjs-emscripten/dist/types-ffi.js +38 -0
  101. package/web/.next/standalone/node_modules/@tootallnate/quickjs-emscripten/dist/types.js +58 -0
  102. package/web/.next/standalone/node_modules/@tootallnate/quickjs-emscripten/dist/variants.js +169 -0
  103. package/web/.next/standalone/node_modules/@tootallnate/quickjs-emscripten/dist/vm-interface.js +12 -0
  104. package/web/.next/standalone/node_modules/@tootallnate/quickjs-emscripten/package.json +60 -0
  105. package/web/.next/standalone/node_modules/agent-base/dist/helpers.js +66 -0
  106. package/web/.next/standalone/node_modules/agent-base/dist/index.js +178 -0
  107. package/web/.next/standalone/node_modules/agent-base/package.json +46 -0
  108. package/web/.next/standalone/node_modules/ast-types/def/babel-core.js +256 -0
  109. package/web/.next/standalone/node_modules/ast-types/def/babel.js +11 -0
  110. package/web/.next/standalone/node_modules/ast-types/def/core.js +298 -0
  111. package/web/.next/standalone/node_modules/ast-types/def/es-proposals.js +33 -0
  112. package/web/.next/standalone/node_modules/ast-types/def/es2020.js +16 -0
  113. package/web/.next/standalone/node_modules/ast-types/def/es6.js +210 -0
  114. package/web/.next/standalone/node_modules/ast-types/def/es7.js +34 -0
  115. package/web/.next/standalone/node_modules/ast-types/def/esprima.js +49 -0
  116. package/web/.next/standalone/node_modules/ast-types/def/flow.js +292 -0
  117. package/web/.next/standalone/node_modules/ast-types/def/jsx.js +103 -0
  118. package/web/.next/standalone/node_modules/ast-types/def/type-annotations.js +40 -0
  119. package/web/.next/standalone/node_modules/ast-types/def/typescript.js +344 -0
  120. package/web/.next/standalone/node_modules/ast-types/fork.js +52 -0
  121. package/web/.next/standalone/node_modules/ast-types/gen/namedTypes.js +6 -0
  122. package/web/.next/standalone/node_modules/ast-types/lib/equiv.js +154 -0
  123. package/web/.next/standalone/node_modules/ast-types/lib/node-path.js +411 -0
  124. package/web/.next/standalone/node_modules/ast-types/lib/path-visitor.js +343 -0
  125. package/web/.next/standalone/node_modules/ast-types/lib/path.js +331 -0
  126. package/web/.next/standalone/node_modules/ast-types/lib/scope.js +318 -0
  127. package/web/.next/standalone/node_modules/ast-types/lib/shared.js +47 -0
  128. package/web/.next/standalone/node_modules/ast-types/lib/types.js +780 -0
  129. package/web/.next/standalone/node_modules/ast-types/main.js +53 -0
  130. package/web/.next/standalone/node_modules/ast-types/package.json +65 -0
  131. package/web/.next/standalone/node_modules/b4a/index.js +188 -0
  132. package/web/.next/standalone/node_modules/b4a/package.json +49 -0
  133. package/web/.next/standalone/node_modules/basic-ftp/dist/Client.js +782 -0
  134. package/web/.next/standalone/node_modules/basic-ftp/dist/FileInfo.js +92 -0
  135. package/web/.next/standalone/node_modules/basic-ftp/dist/FtpContext.js +365 -0
  136. package/web/.next/standalone/node_modules/basic-ftp/dist/ProgressTracker.js +72 -0
  137. package/web/.next/standalone/node_modules/basic-ftp/dist/StringEncoding.js +2 -0
  138. package/web/.next/standalone/node_modules/basic-ftp/dist/StringWriter.js +23 -0
  139. package/web/.next/standalone/node_modules/basic-ftp/dist/index.js +28 -0
  140. package/web/.next/standalone/node_modules/basic-ftp/dist/netUtils.js +66 -0
  141. package/web/.next/standalone/node_modules/basic-ftp/dist/parseControlResponse.js +66 -0
  142. package/web/.next/standalone/node_modules/basic-ftp/dist/parseList.js +79 -0
  143. package/web/.next/standalone/node_modules/basic-ftp/dist/parseListDOS.js +52 -0
  144. package/web/.next/standalone/node_modules/basic-ftp/dist/parseListMLSD.js +187 -0
  145. package/web/.next/standalone/node_modules/basic-ftp/dist/parseListUnix.js +155 -0
  146. package/web/.next/standalone/node_modules/basic-ftp/dist/transfer.js +318 -0
  147. package/web/.next/standalone/node_modules/basic-ftp/package.json +52 -0
  148. package/web/.next/standalone/node_modules/buffer-crc32/index.js +111 -0
  149. package/web/.next/standalone/node_modules/buffer-crc32/package.json +39 -0
  150. package/web/.next/standalone/node_modules/callsites/index.js +13 -0
  151. package/web/.next/standalone/node_modules/callsites/package.json +39 -0
  152. package/web/.next/standalone/node_modules/cliui/build/lib/index.js +287 -0
  153. package/web/.next/standalone/node_modules/cliui/build/lib/string-utils.js +27 -0
  154. package/web/.next/standalone/node_modules/cliui/index.mjs +13 -0
  155. package/web/.next/standalone/node_modules/cliui/package.json +83 -0
  156. package/web/.next/standalone/node_modules/cosmiconfig/dist/Explorer.js +170 -0
  157. package/web/.next/standalone/node_modules/cosmiconfig/dist/ExplorerBase.js +126 -0
  158. package/web/.next/standalone/node_modules/cosmiconfig/dist/ExplorerSync.js +184 -0
  159. package/web/.next/standalone/node_modules/cosmiconfig/dist/cacheWrapper.js +32 -0
  160. package/web/.next/standalone/node_modules/cosmiconfig/dist/canUseDynamicImport.js +23 -0
  161. package/web/.next/standalone/node_modules/cosmiconfig/dist/defaults.js +105 -0
  162. package/web/.next/standalone/node_modules/cosmiconfig/dist/getDirectory.js +38 -0
  163. package/web/.next/standalone/node_modules/cosmiconfig/dist/getPropertyByPath.js +28 -0
  164. package/web/.next/standalone/node_modules/cosmiconfig/dist/index.js +148 -0
  165. package/web/.next/standalone/node_modules/cosmiconfig/dist/loaders.js +150 -0
  166. package/web/.next/standalone/node_modules/cosmiconfig/dist/merge.js +40 -0
  167. package/web/.next/standalone/node_modules/cosmiconfig/dist/readFile.js +56 -0
  168. package/web/.next/standalone/node_modules/cosmiconfig/dist/types.js +3 -0
  169. package/web/.next/standalone/node_modules/cosmiconfig/dist/util.js +99 -0
  170. package/web/.next/standalone/node_modules/cosmiconfig/package.json +103 -0
  171. package/web/.next/standalone/node_modules/data-uri-to-buffer/dist/common.js +54 -0
  172. package/web/.next/standalone/node_modules/data-uri-to-buffer/dist/node.js +26 -0
  173. package/web/.next/standalone/node_modules/data-uri-to-buffer/package.json +48 -0
  174. package/web/.next/standalone/node_modules/debug/package.json +64 -0
  175. package/web/.next/standalone/node_modules/debug/src/browser.js +272 -0
  176. package/web/.next/standalone/node_modules/debug/src/common.js +292 -0
  177. package/web/.next/standalone/node_modules/debug/src/index.js +10 -0
  178. package/web/.next/standalone/node_modules/debug/src/node.js +263 -0
  179. package/web/.next/standalone/node_modules/degenerator/dist/compile.js +107 -0
  180. package/web/.next/standalone/node_modules/degenerator/dist/degenerator.js +156 -0
  181. package/web/.next/standalone/node_modules/degenerator/dist/index.js +19 -0
  182. package/web/.next/standalone/node_modules/degenerator/package.json +42 -0
  183. package/web/.next/standalone/node_modules/end-of-stream/index.js +96 -0
  184. package/web/.next/standalone/node_modules/end-of-stream/package.json +37 -0
  185. package/web/.next/standalone/node_modules/env-paths/index.js +74 -0
  186. package/web/.next/standalone/node_modules/env-paths/license +9 -0
  187. package/web/.next/standalone/node_modules/env-paths/package.json +45 -0
  188. package/web/.next/standalone/node_modules/env-paths/readme.md +115 -0
  189. package/web/.next/standalone/node_modules/error-ex/index.js +141 -0
  190. package/web/.next/standalone/node_modules/error-ex/package.json +46 -0
  191. package/web/.next/standalone/node_modules/escalade/package.json +74 -0
  192. package/web/.next/standalone/node_modules/escalade/sync/index.d.mts +9 -0
  193. package/web/.next/standalone/node_modules/escalade/sync/index.js +18 -0
  194. package/web/.next/standalone/node_modules/escalade/sync/index.mjs +18 -0
  195. package/web/.next/standalone/node_modules/escodegen/escodegen.js +2667 -0
  196. package/web/.next/standalone/node_modules/escodegen/package.json +63 -0
  197. package/web/.next/standalone/node_modules/esprima/dist/esprima.js +6709 -0
  198. package/web/.next/standalone/node_modules/esprima/package.json +112 -0
  199. package/web/.next/standalone/node_modules/estraverse/estraverse.js +805 -0
  200. package/web/.next/standalone/node_modules/estraverse/package.json +40 -0
  201. package/web/.next/standalone/node_modules/esutils/lib/ast.js +144 -0
  202. package/web/.next/standalone/node_modules/esutils/lib/code.js +135 -0
  203. package/web/.next/standalone/node_modules/esutils/lib/keyword.js +165 -0
  204. package/web/.next/standalone/node_modules/esutils/lib/utils.js +33 -0
  205. package/web/.next/standalone/node_modules/esutils/package.json +44 -0
  206. package/web/.next/standalone/node_modules/events-universal/default.js +1 -0
  207. package/web/.next/standalone/node_modules/events-universal/package.json +39 -0
  208. package/web/.next/standalone/node_modules/extract-zip/LICENSE +23 -0
  209. package/web/.next/standalone/node_modules/extract-zip/cli.js +19 -0
  210. package/web/.next/standalone/node_modules/extract-zip/index.js +173 -0
  211. package/web/.next/standalone/node_modules/extract-zip/package.json +80 -0
  212. package/web/.next/standalone/node_modules/extract-zip/readme.md +57 -0
  213. package/web/.next/standalone/node_modules/fast-fifo/fixed-size.js +39 -0
  214. package/web/.next/standalone/node_modules/fast-fifo/index.js +48 -0
  215. package/web/.next/standalone/node_modules/fast-fifo/package.json +28 -0
  216. package/web/.next/standalone/node_modules/fd-slicer/index.js +296 -0
  217. package/web/.next/standalone/node_modules/fd-slicer/package.json +36 -0
  218. package/web/.next/standalone/node_modules/get-stream/buffer-stream.js +52 -0
  219. package/web/.next/standalone/node_modules/get-stream/index.js +60 -0
  220. package/web/.next/standalone/node_modules/get-stream/package.json +50 -0
  221. package/web/.next/standalone/node_modules/get-uri/dist/data.js +43 -0
  222. package/web/.next/standalone/node_modules/get-uri/dist/file.js +57 -0
  223. package/web/.next/standalone/node_modules/get-uri/dist/ftp.js +93 -0
  224. package/web/.next/standalone/node_modules/get-uri/dist/http-error.js +15 -0
  225. package/web/.next/standalone/node_modules/get-uri/dist/http.js +191 -0
  226. package/web/.next/standalone/node_modules/get-uri/dist/https.js +16 -0
  227. package/web/.next/standalone/node_modules/get-uri/dist/index.js +57 -0
  228. package/web/.next/standalone/node_modules/get-uri/dist/notfound.js +16 -0
  229. package/web/.next/standalone/node_modules/get-uri/dist/notmodified.js +17 -0
  230. package/web/.next/standalone/node_modules/get-uri/package.json +58 -0
  231. package/web/.next/standalone/node_modules/http-proxy-agent/dist/index.js +148 -0
  232. package/web/.next/standalone/node_modules/http-proxy-agent/package.json +47 -0
  233. package/web/.next/standalone/node_modules/https-proxy-agent/dist/index.js +180 -0
  234. package/web/.next/standalone/node_modules/https-proxy-agent/dist/parse-proxy-response.js +101 -0
  235. package/web/.next/standalone/node_modules/https-proxy-agent/package.json +50 -0
  236. package/web/.next/standalone/node_modules/import-fresh/index.js +34 -0
  237. package/web/.next/standalone/node_modules/import-fresh/node_modules/resolve-from/index.js +47 -0
  238. package/web/.next/standalone/node_modules/import-fresh/node_modules/resolve-from/license +9 -0
  239. package/web/.next/standalone/node_modules/import-fresh/node_modules/resolve-from/package.json +34 -0
  240. package/web/.next/standalone/node_modules/import-fresh/node_modules/resolve-from/readme.md +72 -0
  241. package/web/.next/standalone/node_modules/import-fresh/package.json +48 -0
  242. package/web/.next/standalone/node_modules/ip-address/dist/address-error.js +12 -0
  243. package/web/.next/standalone/node_modules/ip-address/dist/common.js +46 -0
  244. package/web/.next/standalone/node_modules/ip-address/dist/ip-address.js +35 -0
  245. package/web/.next/standalone/node_modules/ip-address/dist/ipv4.js +360 -0
  246. package/web/.next/standalone/node_modules/ip-address/dist/ipv6.js +1003 -0
  247. package/web/.next/standalone/node_modules/ip-address/dist/v4/constants.js +8 -0
  248. package/web/.next/standalone/node_modules/ip-address/dist/v6/constants.js +76 -0
  249. package/web/.next/standalone/node_modules/ip-address/dist/v6/helpers.js +45 -0
  250. package/web/.next/standalone/node_modules/ip-address/dist/v6/regular-expressions.js +95 -0
  251. package/web/.next/standalone/node_modules/ip-address/package.json +78 -0
  252. package/web/.next/standalone/node_modules/is-arrayish/index.js +10 -0
  253. package/web/.next/standalone/node_modules/is-arrayish/package.json +34 -0
  254. package/web/.next/standalone/node_modules/js-tokens/index.js +23 -0
  255. package/web/.next/standalone/node_modules/js-tokens/package.json +30 -0
  256. package/web/.next/standalone/node_modules/js-yaml/index.js +47 -0
  257. package/web/.next/standalone/node_modules/js-yaml/lib/common.js +59 -0
  258. package/web/.next/standalone/node_modules/js-yaml/lib/dumper.js +965 -0
  259. package/web/.next/standalone/node_modules/js-yaml/lib/exception.js +55 -0
  260. package/web/.next/standalone/node_modules/js-yaml/lib/loader.js +1733 -0
  261. package/web/.next/standalone/node_modules/js-yaml/lib/schema/core.js +11 -0
  262. package/web/.next/standalone/node_modules/js-yaml/lib/schema/default.js +22 -0
  263. package/web/.next/standalone/node_modules/js-yaml/lib/schema/failsafe.js +17 -0
  264. package/web/.next/standalone/node_modules/js-yaml/lib/schema/json.js +19 -0
  265. package/web/.next/standalone/node_modules/js-yaml/lib/schema.js +121 -0
  266. package/web/.next/standalone/node_modules/js-yaml/lib/snippet.js +101 -0
  267. package/web/.next/standalone/node_modules/js-yaml/lib/type/binary.js +125 -0
  268. package/web/.next/standalone/node_modules/js-yaml/lib/type/bool.js +35 -0
  269. package/web/.next/standalone/node_modules/js-yaml/lib/type/float.js +97 -0
  270. package/web/.next/standalone/node_modules/js-yaml/lib/type/int.js +156 -0
  271. package/web/.next/standalone/node_modules/js-yaml/lib/type/map.js +8 -0
  272. package/web/.next/standalone/node_modules/js-yaml/lib/type/merge.js +12 -0
  273. package/web/.next/standalone/node_modules/js-yaml/lib/type/null.js +35 -0
  274. package/web/.next/standalone/node_modules/js-yaml/lib/type/omap.js +44 -0
  275. package/web/.next/standalone/node_modules/js-yaml/lib/type/pairs.js +53 -0
  276. package/web/.next/standalone/node_modules/js-yaml/lib/type/seq.js +8 -0
  277. package/web/.next/standalone/node_modules/js-yaml/lib/type/set.js +29 -0
  278. package/web/.next/standalone/node_modules/js-yaml/lib/type/str.js +8 -0
  279. package/web/.next/standalone/node_modules/js-yaml/lib/type/timestamp.js +88 -0
  280. package/web/.next/standalone/node_modules/js-yaml/lib/type.js +66 -0
  281. package/web/.next/standalone/node_modules/js-yaml/package.json +66 -0
  282. package/web/.next/standalone/node_modules/json-parse-even-better-errors/index.js +121 -0
  283. package/web/.next/standalone/node_modules/json-parse-even-better-errors/package.json +33 -0
  284. package/web/.next/standalone/node_modules/lines-and-columns/build/index.js +62 -0
  285. package/web/.next/standalone/node_modules/lines-and-columns/package.json +49 -0
  286. package/web/.next/standalone/node_modules/lru-cache/index.js +1227 -0
  287. package/web/.next/standalone/node_modules/lru-cache/package.json +96 -0
  288. package/web/.next/standalone/node_modules/ms/index.js +162 -0
  289. package/web/.next/standalone/node_modules/ms/package.json +38 -0
  290. package/web/.next/standalone/node_modules/netmask/lib/netmask.js +208 -0
  291. package/web/.next/standalone/node_modules/netmask/package.json +36 -0
  292. package/web/.next/standalone/node_modules/once/once.js +42 -0
  293. package/web/.next/standalone/node_modules/once/package.json +33 -0
  294. package/web/.next/standalone/node_modules/pac-proxy-agent/dist/index.js +238 -0
  295. package/web/.next/standalone/node_modules/pac-proxy-agent/package.json +58 -0
  296. package/web/.next/standalone/node_modules/pac-resolver/dist/dateRange.js +73 -0
  297. package/web/.next/standalone/node_modules/pac-resolver/dist/dnsDomainIs.js +30 -0
  298. package/web/.next/standalone/node_modules/pac-resolver/dist/dnsDomainLevels.js +28 -0
  299. package/web/.next/standalone/node_modules/pac-resolver/dist/dnsResolve.js +32 -0
  300. package/web/.next/standalone/node_modules/pac-resolver/dist/index.js +87 -0
  301. package/web/.next/standalone/node_modules/pac-resolver/dist/ip.js +50 -0
  302. package/web/.next/standalone/node_modules/pac-resolver/dist/isInNet.js +42 -0
  303. package/web/.next/standalone/node_modules/pac-resolver/dist/isPlainHostName.js +23 -0
  304. package/web/.next/standalone/node_modules/pac-resolver/dist/isResolvable.js +23 -0
  305. package/web/.next/standalone/node_modules/pac-resolver/dist/localHostOrDomainIs.js +40 -0
  306. package/web/.next/standalone/node_modules/pac-resolver/dist/myIpAddress.js +50 -0
  307. package/web/.next/standalone/node_modules/pac-resolver/dist/shExpMatch.js +41 -0
  308. package/web/.next/standalone/node_modules/pac-resolver/dist/timeRange.js +92 -0
  309. package/web/.next/standalone/node_modules/pac-resolver/dist/util.js +22 -0
  310. package/web/.next/standalone/node_modules/pac-resolver/dist/weekdayRange.js +91 -0
  311. package/web/.next/standalone/node_modules/pac-resolver/package.json +47 -0
  312. package/web/.next/standalone/node_modules/parent-module/index.js +37 -0
  313. package/web/.next/standalone/node_modules/parent-module/package.json +46 -0
  314. package/web/.next/standalone/node_modules/parse-json/index.js +54 -0
  315. package/web/.next/standalone/node_modules/parse-json/package.json +45 -0
  316. package/web/.next/standalone/node_modules/pend/index.js +55 -0
  317. package/web/.next/standalone/node_modules/pend/package.json +18 -0
  318. package/web/.next/standalone/node_modules/picocolors/package.json +25 -0
  319. package/web/.next/standalone/node_modules/picocolors/picocolors.js +75 -0
  320. package/web/.next/standalone/node_modules/progress/index.js +1 -0
  321. package/web/.next/standalone/node_modules/progress/lib/node-progress.js +236 -0
  322. package/web/.next/standalone/node_modules/progress/package.json +26 -0
  323. package/web/.next/standalone/node_modules/proxy-agent/dist/index.js +138 -0
  324. package/web/.next/standalone/node_modules/proxy-agent/package.json +60 -0
  325. package/web/.next/standalone/node_modules/proxy-from-env/index.js +108 -0
  326. package/web/.next/standalone/node_modules/proxy-from-env/package.json +34 -0
  327. package/web/.next/standalone/node_modules/pump/index.js +86 -0
  328. package/web/.next/standalone/node_modules/pump/package.json +30 -0
  329. package/web/.next/standalone/node_modules/puppeteer/lib/esm/package.json +1 -0
  330. package/web/.next/standalone/node_modules/puppeteer/lib/esm/puppeteer/getConfiguration.js +122 -0
  331. package/web/.next/standalone/node_modules/puppeteer/lib/esm/puppeteer/puppeteer.js +40 -0
  332. package/web/.next/standalone/node_modules/puppeteer/package.json +145 -0
  333. package/web/.next/standalone/node_modules/puppeteer-core/lib/esm/package.json +1 -0
  334. package/web/.next/standalone/node_modules/puppeteer-core/lib/esm/puppeteer/api/Browser.js +204 -0
  335. package/web/.next/standalone/node_modules/puppeteer-core/lib/esm/puppeteer/api/BrowserContext.js +182 -0
  336. package/web/.next/standalone/node_modules/puppeteer-core/lib/esm/puppeteer/api/CDPSession.js +68 -0
  337. package/web/.next/standalone/node_modules/puppeteer-core/lib/esm/puppeteer/api/DeviceRequestPrompt.js +34 -0
  338. package/web/.next/standalone/node_modules/puppeteer-core/lib/esm/puppeteer/api/Dialog.js +90 -0
  339. package/web/.next/standalone/node_modules/puppeteer-core/lib/esm/puppeteer/api/ElementHandle.js +1406 -0
  340. package/web/.next/standalone/node_modules/puppeteer-core/lib/esm/puppeteer/api/ElementHandleSymbol.js +10 -0
  341. package/web/.next/standalone/node_modules/puppeteer-core/lib/esm/puppeteer/api/Frame.js +904 -0
  342. package/web/.next/standalone/node_modules/puppeteer-core/lib/esm/puppeteer/api/HTTPRequest.js +461 -0
  343. package/web/.next/standalone/node_modules/puppeteer-core/lib/esm/puppeteer/api/HTTPResponse.js +56 -0
  344. package/web/.next/standalone/node_modules/puppeteer-core/lib/esm/puppeteer/api/Input.js +211 -0
  345. package/web/.next/standalone/node_modules/puppeteer-core/lib/esm/puppeteer/api/JSHandle.js +227 -0
  346. package/web/.next/standalone/node_modules/puppeteer-core/lib/esm/puppeteer/api/Page.js +1511 -0
  347. package/web/.next/standalone/node_modules/puppeteer-core/lib/esm/puppeteer/api/Realm.js +44 -0
  348. package/web/.next/standalone/node_modules/puppeteer-core/lib/esm/puppeteer/api/Target.js +49 -0
  349. package/web/.next/standalone/node_modules/puppeteer-core/lib/esm/puppeteer/api/WebWorker.js +106 -0
  350. package/web/.next/standalone/node_modules/puppeteer-core/lib/esm/puppeteer/api/api.js +22 -0
  351. package/web/.next/standalone/node_modules/puppeteer-core/lib/esm/puppeteer/api/locators/locators.js +769 -0
  352. package/web/.next/standalone/node_modules/puppeteer-core/lib/esm/puppeteer/bidi/BrowserConnector.js +83 -0
  353. package/web/.next/standalone/node_modules/puppeteer-core/lib/esm/puppeteer/cdp/Accessibility.js +591 -0
  354. package/web/.next/standalone/node_modules/puppeteer-core/lib/esm/puppeteer/cdp/Binding.js +162 -0
  355. package/web/.next/standalone/node_modules/puppeteer-core/lib/esm/puppeteer/cdp/BluetoothEmulation.js +26 -0
  356. package/web/.next/standalone/node_modules/puppeteer-core/lib/esm/puppeteer/cdp/Browser.js +321 -0
  357. package/web/.next/standalone/node_modules/puppeteer-core/lib/esm/puppeteer/cdp/BrowserConnector.js +26 -0
  358. package/web/.next/standalone/node_modules/puppeteer-core/lib/esm/puppeteer/cdp/BrowserContext.js +192 -0
  359. package/web/.next/standalone/node_modules/puppeteer-core/lib/esm/puppeteer/cdp/CdpPreloadScript.js +39 -0
  360. package/web/.next/standalone/node_modules/puppeteer-core/lib/esm/puppeteer/cdp/CdpSession.js +129 -0
  361. package/web/.next/standalone/node_modules/puppeteer-core/lib/esm/puppeteer/cdp/Connection.js +244 -0
  362. package/web/.next/standalone/node_modules/puppeteer-core/lib/esm/puppeteer/cdp/Coverage.js +372 -0
  363. package/web/.next/standalone/node_modules/puppeteer-core/lib/esm/puppeteer/cdp/DeviceRequestPrompt.js +151 -0
  364. package/web/.next/standalone/node_modules/puppeteer-core/lib/esm/puppeteer/cdp/Dialog.js +23 -0
  365. package/web/.next/standalone/node_modules/puppeteer-core/lib/esm/puppeteer/cdp/ElementHandle.js +206 -0
  366. package/web/.next/standalone/node_modules/puppeteer-core/lib/esm/puppeteer/cdp/EmulationManager.js +458 -0
  367. package/web/.next/standalone/node_modules/puppeteer-core/lib/esm/puppeteer/cdp/ExecutionContext.js +457 -0
  368. package/web/.next/standalone/node_modules/puppeteer-core/lib/esm/puppeteer/cdp/ExtensionTransport.js +175 -0
  369. package/web/.next/standalone/node_modules/puppeteer-core/lib/esm/puppeteer/cdp/Frame.js +358 -0
  370. package/web/.next/standalone/node_modules/puppeteer-core/lib/esm/puppeteer/cdp/FrameManager.js +455 -0
  371. package/web/.next/standalone/node_modules/puppeteer-core/lib/esm/puppeteer/cdp/FrameManagerEvents.js +24 -0
  372. package/web/.next/standalone/node_modules/puppeteer-core/lib/esm/puppeteer/cdp/FrameTree.js +91 -0
  373. package/web/.next/standalone/node_modules/puppeteer-core/lib/esm/puppeteer/cdp/HTTPRequest.js +195 -0
  374. package/web/.next/standalone/node_modules/puppeteer-core/lib/esm/puppeteer/cdp/HTTPResponse.js +126 -0
  375. package/web/.next/standalone/node_modules/puppeteer-core/lib/esm/puppeteer/cdp/Input.js +499 -0
  376. package/web/.next/standalone/node_modules/puppeteer-core/lib/esm/puppeteer/cdp/IsolatedWorld.js +157 -0
  377. package/web/.next/standalone/node_modules/puppeteer-core/lib/esm/puppeteer/cdp/IsolatedWorlds.js +20 -0
  378. package/web/.next/standalone/node_modules/puppeteer-core/lib/esm/puppeteer/cdp/JSHandle.js +101 -0
  379. package/web/.next/standalone/node_modules/puppeteer-core/lib/esm/puppeteer/cdp/LifecycleWatcher.js +174 -0
  380. package/web/.next/standalone/node_modules/puppeteer-core/lib/esm/puppeteer/cdp/NetworkEventManager.js +162 -0
  381. package/web/.next/standalone/node_modules/puppeteer-core/lib/esm/puppeteer/cdp/NetworkManager.js +601 -0
  382. package/web/.next/standalone/node_modules/puppeteer-core/lib/esm/puppeteer/cdp/Page.js +1006 -0
  383. package/web/.next/standalone/node_modules/puppeteer-core/lib/esm/puppeteer/cdp/PredefinedNetworkConditions.js +69 -0
  384. package/web/.next/standalone/node_modules/puppeteer-core/lib/esm/puppeteer/cdp/Target.js +243 -0
  385. package/web/.next/standalone/node_modules/puppeteer-core/lib/esm/puppeteer/cdp/TargetManageEvents.js +7 -0
  386. package/web/.next/standalone/node_modules/puppeteer-core/lib/esm/puppeteer/cdp/TargetManager.js +320 -0
  387. package/web/.next/standalone/node_modules/puppeteer-core/lib/esm/puppeteer/cdp/Tracing.js +110 -0
  388. package/web/.next/standalone/node_modules/puppeteer-core/lib/esm/puppeteer/cdp/WebWorker.js +73 -0
  389. package/web/.next/standalone/node_modules/puppeteer-core/lib/esm/puppeteer/cdp/cdp.js +43 -0
  390. package/web/.next/standalone/node_modules/puppeteer-core/lib/esm/puppeteer/cdp/utils.js +216 -0
  391. package/web/.next/standalone/node_modules/puppeteer-core/lib/esm/puppeteer/common/AriaQueryHandler.js +54 -0
  392. package/web/.next/standalone/node_modules/puppeteer-core/lib/esm/puppeteer/common/BrowserConnector.js +129 -0
  393. package/web/.next/standalone/node_modules/puppeteer-core/lib/esm/puppeteer/common/BrowserWebSocketTransport.js +39 -0
  394. package/web/.next/standalone/node_modules/puppeteer-core/lib/esm/puppeteer/common/CSSQueryHandler.js +18 -0
  395. package/web/.next/standalone/node_modules/puppeteer-core/lib/esm/puppeteer/common/CallbackRegistry.js +133 -0
  396. package/web/.next/standalone/node_modules/puppeteer-core/lib/esm/puppeteer/common/ConsoleMessage.js +78 -0
  397. package/web/.next/standalone/node_modules/puppeteer-core/lib/esm/puppeteer/common/CustomQueryHandler.js +114 -0
  398. package/web/.next/standalone/node_modules/puppeteer-core/lib/esm/puppeteer/common/Debug.js +109 -0
  399. package/web/.next/standalone/node_modules/puppeteer-core/lib/esm/puppeteer/common/Device.js +1604 -0
  400. package/web/.next/standalone/node_modules/puppeteer-core/lib/esm/puppeteer/common/Errors.js +94 -0
  401. package/web/.next/standalone/node_modules/puppeteer-core/lib/esm/puppeteer/common/EventEmitter.js +128 -0
  402. package/web/.next/standalone/node_modules/puppeteer-core/lib/esm/puppeteer/common/FileChooser.js +75 -0
  403. package/web/.next/standalone/node_modules/puppeteer-core/lib/esm/puppeteer/common/GetQueryHandler.js +70 -0
  404. package/web/.next/standalone/node_modules/puppeteer-core/lib/esm/puppeteer/common/HandleIterator.js +142 -0
  405. package/web/.next/standalone/node_modules/puppeteer-core/lib/esm/puppeteer/common/LazyArg.js +23 -0
  406. package/web/.next/standalone/node_modules/puppeteer-core/lib/esm/puppeteer/common/NetworkManagerEvents.js +21 -0
  407. package/web/.next/standalone/node_modules/puppeteer-core/lib/esm/puppeteer/common/PDFOptions.js +58 -0
  408. package/web/.next/standalone/node_modules/puppeteer-core/lib/esm/puppeteer/common/PQueryHandler.js +18 -0
  409. package/web/.next/standalone/node_modules/puppeteer-core/lib/esm/puppeteer/common/PSelectorParser.js +100 -0
  410. package/web/.next/standalone/node_modules/puppeteer-core/lib/esm/puppeteer/common/PierceQueryHandler.js +18 -0
  411. package/web/.next/standalone/node_modules/puppeteer-core/lib/esm/puppeteer/common/Puppeteer.js +98 -0
  412. package/web/.next/standalone/node_modules/puppeteer-core/lib/esm/puppeteer/common/QueryHandler.js +225 -0
  413. package/web/.next/standalone/node_modules/puppeteer-core/lib/esm/puppeteer/common/ScriptInjector.js +51 -0
  414. package/web/.next/standalone/node_modules/puppeteer-core/lib/esm/puppeteer/common/SecurityDetails.js +69 -0
  415. package/web/.next/standalone/node_modules/puppeteer-core/lib/esm/puppeteer/common/TaskQueue.js +24 -0
  416. package/web/.next/standalone/node_modules/puppeteer-core/lib/esm/puppeteer/common/TextQueryHandler.js +15 -0
  417. package/web/.next/standalone/node_modules/puppeteer-core/lib/esm/puppeteer/common/TimeoutSettings.js +39 -0
  418. package/web/.next/standalone/node_modules/puppeteer-core/lib/esm/puppeteer/common/USKeyboardLayout.js +394 -0
  419. package/web/.next/standalone/node_modules/puppeteer-core/lib/esm/puppeteer/common/WaitTask.js +197 -0
  420. package/web/.next/standalone/node_modules/puppeteer-core/lib/esm/puppeteer/common/XPathQueryHandler.js +21 -0
  421. package/web/.next/standalone/node_modules/puppeteer-core/lib/esm/puppeteer/common/common.js +35 -0
  422. package/web/.next/standalone/node_modules/puppeteer-core/lib/esm/puppeteer/common/util.js +375 -0
  423. package/web/.next/standalone/node_modules/puppeteer-core/lib/esm/puppeteer/environment.js +24 -0
  424. package/web/.next/standalone/node_modules/puppeteer-core/lib/esm/puppeteer/generated/injected.js +9 -0
  425. package/web/.next/standalone/node_modules/puppeteer-core/lib/esm/puppeteer/index-browser.js +11 -0
  426. package/web/.next/standalone/node_modules/puppeteer-core/lib/esm/puppeteer/index.js +8 -0
  427. package/web/.next/standalone/node_modules/puppeteer-core/lib/esm/puppeteer/node/BrowserLauncher.js +312 -0
  428. package/web/.next/standalone/node_modules/puppeteer-core/lib/esm/puppeteer/node/ChromeLauncher.js +258 -0
  429. package/web/.next/standalone/node_modules/puppeteer-core/lib/esm/puppeteer/node/FirefoxLauncher.js +166 -0
  430. package/web/.next/standalone/node_modules/puppeteer-core/lib/esm/puppeteer/node/LaunchOptions.js +22 -0
  431. package/web/.next/standalone/node_modules/puppeteer-core/lib/esm/puppeteer/node/NodeWebSocketTransport.js +55 -0
  432. package/web/.next/standalone/node_modules/puppeteer-core/lib/esm/puppeteer/node/PipeTransport.js +72 -0
  433. package/web/.next/standalone/node_modules/puppeteer-core/lib/esm/puppeteer/node/PuppeteerNode.js +281 -0
  434. package/web/.next/standalone/node_modules/puppeteer-core/lib/esm/puppeteer/node/ScreenRecorder.js +279 -0
  435. package/web/.next/standalone/node_modules/puppeteer-core/lib/esm/puppeteer/node/node.js +12 -0
  436. package/web/.next/standalone/node_modules/puppeteer-core/lib/esm/puppeteer/node/util/fs.js +24 -0
  437. package/web/.next/standalone/node_modules/puppeteer-core/lib/esm/puppeteer/puppeteer-core.js +41 -0
  438. package/web/.next/standalone/node_modules/puppeteer-core/lib/esm/puppeteer/revisions.js +14 -0
  439. package/web/.next/standalone/node_modules/puppeteer-core/lib/esm/puppeteer/util/AsyncIterableUtil.js +29 -0
  440. package/web/.next/standalone/node_modules/puppeteer-core/lib/esm/puppeteer/util/Deferred.js +105 -0
  441. package/web/.next/standalone/node_modules/puppeteer-core/lib/esm/puppeteer/util/ErrorLike.js +41 -0
  442. package/web/.next/standalone/node_modules/puppeteer-core/lib/esm/puppeteer/util/Function.js +70 -0
  443. package/web/.next/standalone/node_modules/puppeteer-core/lib/esm/puppeteer/util/Mutex.js +46 -0
  444. package/web/.next/standalone/node_modules/puppeteer-core/lib/esm/puppeteer/util/assert.js +18 -0
  445. package/web/.next/standalone/node_modules/puppeteer-core/lib/esm/puppeteer/util/decorators.js +232 -0
  446. package/web/.next/standalone/node_modules/puppeteer-core/lib/esm/puppeteer/util/disposable.js +342 -0
  447. package/web/.next/standalone/node_modules/puppeteer-core/lib/esm/puppeteer/util/encoding.js +63 -0
  448. package/web/.next/standalone/node_modules/puppeteer-core/lib/esm/puppeteer/util/incremental-id-generator.js +18 -0
  449. package/web/.next/standalone/node_modules/puppeteer-core/lib/esm/puppeteer/util/util.js +13 -0
  450. package/web/.next/standalone/node_modules/puppeteer-core/lib/esm/puppeteer/util/version.js +10 -0
  451. package/web/.next/standalone/node_modules/puppeteer-core/lib/esm/third_party/mitt/mitt.js +44 -0
  452. package/web/.next/standalone/node_modules/puppeteer-core/lib/esm/third_party/parsel-js/parsel-js.js +196 -0
  453. package/web/.next/standalone/node_modules/puppeteer-core/lib/esm/third_party/rxjs/rxjs.js +2887 -0
  454. package/web/.next/standalone/node_modules/puppeteer-core/package.json +169 -0
  455. package/web/.next/standalone/node_modules/semver/functions/clean.js +8 -0
  456. package/web/.next/standalone/node_modules/semver/functions/compare-build.js +9 -0
  457. package/web/.next/standalone/node_modules/semver/functions/compare-loose.js +5 -0
  458. package/web/.next/standalone/node_modules/semver/functions/diff.js +60 -0
  459. package/web/.next/standalone/node_modules/semver/functions/inc.js +21 -0
  460. package/web/.next/standalone/node_modules/semver/functions/major.js +5 -0
  461. package/web/.next/standalone/node_modules/semver/functions/minor.js +5 -0
  462. package/web/.next/standalone/node_modules/semver/functions/patch.js +5 -0
  463. package/web/.next/standalone/node_modules/semver/functions/prerelease.js +8 -0
  464. package/web/.next/standalone/node_modules/semver/functions/rcompare.js +5 -0
  465. package/web/.next/standalone/node_modules/semver/functions/rsort.js +5 -0
  466. package/web/.next/standalone/node_modules/semver/functions/sort.js +5 -0
  467. package/web/.next/standalone/node_modules/semver/functions/valid.js +8 -0
  468. package/web/.next/standalone/node_modules/semver/index.js +91 -0
  469. package/web/.next/standalone/node_modules/semver/ranges/gtr.js +6 -0
  470. package/web/.next/standalone/node_modules/semver/ranges/intersects.js +9 -0
  471. package/web/.next/standalone/node_modules/semver/ranges/ltr.js +6 -0
  472. package/web/.next/standalone/node_modules/semver/ranges/max-satisfying.js +27 -0
  473. package/web/.next/standalone/node_modules/semver/ranges/min-satisfying.js +26 -0
  474. package/web/.next/standalone/node_modules/semver/ranges/min-version.js +63 -0
  475. package/web/.next/standalone/node_modules/semver/ranges/outside.js +82 -0
  476. package/web/.next/standalone/node_modules/semver/ranges/simplify.js +49 -0
  477. package/web/.next/standalone/node_modules/semver/ranges/subset.js +249 -0
  478. package/web/.next/standalone/node_modules/semver/ranges/to-comparators.js +10 -0
  479. package/web/.next/standalone/node_modules/semver/ranges/valid.js +13 -0
  480. package/web/.next/standalone/node_modules/smart-buffer/build/smartbuffer.js +1233 -0
  481. package/web/.next/standalone/node_modules/smart-buffer/build/utils.js +108 -0
  482. package/web/.next/standalone/node_modules/smart-buffer/package.json +79 -0
  483. package/web/.next/standalone/node_modules/socks/build/client/socksclient.js +793 -0
  484. package/web/.next/standalone/node_modules/socks/build/common/constants.js +108 -0
  485. package/web/.next/standalone/node_modules/socks/build/common/helpers.js +167 -0
  486. package/web/.next/standalone/node_modules/socks/build/common/receivebuffer.js +43 -0
  487. package/web/.next/standalone/node_modules/socks/build/common/util.js +25 -0
  488. package/web/.next/standalone/node_modules/socks/build/index.js +18 -0
  489. package/web/.next/standalone/node_modules/socks/package.json +58 -0
  490. package/web/.next/standalone/node_modules/socks-proxy-agent/dist/index.js +195 -0
  491. package/web/.next/standalone/node_modules/socks-proxy-agent/package.json +142 -0
  492. package/web/.next/standalone/node_modules/source-map/lib/array-set.js +121 -0
  493. package/web/.next/standalone/node_modules/source-map/lib/base64-vlq.js +140 -0
  494. package/web/.next/standalone/node_modules/source-map/lib/base64.js +67 -0
  495. package/web/.next/standalone/node_modules/source-map/lib/binary-search.js +111 -0
  496. package/web/.next/standalone/node_modules/source-map/lib/mapping-list.js +79 -0
  497. package/web/.next/standalone/node_modules/source-map/lib/quick-sort.js +114 -0
  498. package/web/.next/standalone/node_modules/source-map/lib/source-map-consumer.js +1145 -0
  499. package/web/.next/standalone/node_modules/source-map/lib/source-map-generator.js +425 -0
  500. package/web/.next/standalone/node_modules/source-map/lib/source-node.js +413 -0
  501. package/web/.next/standalone/node_modules/source-map/lib/util.js +488 -0
  502. package/web/.next/standalone/node_modules/source-map/package.json +73 -0
  503. package/web/.next/standalone/node_modules/source-map/source-map.js +8 -0
  504. package/web/.next/standalone/node_modules/streamx/index.js +1184 -0
  505. package/web/.next/standalone/node_modules/streamx/package.json +34 -0
  506. package/web/.next/standalone/node_modules/tar-fs/LICENSE +21 -0
  507. package/web/.next/standalone/node_modules/tar-fs/README.md +154 -0
  508. package/web/.next/standalone/node_modules/tar-fs/index.js +400 -0
  509. package/web/.next/standalone/node_modules/tar-fs/package.json +61 -0
  510. package/web/.next/standalone/node_modules/tar-stream/constants.js +14 -0
  511. package/web/.next/standalone/node_modules/tar-stream/extract.js +406 -0
  512. package/web/.next/standalone/node_modules/tar-stream/headers.js +321 -0
  513. package/web/.next/standalone/node_modules/tar-stream/index.js +2 -0
  514. package/web/.next/standalone/node_modules/tar-stream/pack.js +287 -0
  515. package/web/.next/standalone/node_modules/tar-stream/package.json +42 -0
  516. package/web/.next/standalone/node_modules/text-decoder/index.js +64 -0
  517. package/web/.next/standalone/node_modules/text-decoder/lib/pass-through-decoder.js +19 -0
  518. package/web/.next/standalone/node_modules/text-decoder/lib/utf8-decoder.js +185 -0
  519. package/web/.next/standalone/node_modules/text-decoder/package.json +39 -0
  520. package/web/.next/standalone/node_modules/tslib/package.json +47 -0
  521. package/web/.next/standalone/node_modules/tslib/tslib.js +484 -0
  522. package/web/.next/standalone/node_modules/wrappy/package.json +29 -0
  523. package/web/.next/standalone/node_modules/wrappy/wrappy.js +33 -0
  524. package/web/.next/standalone/node_modules/ws/lib/buffer-util.js +131 -0
  525. package/web/.next/standalone/node_modules/ws/lib/constants.js +19 -0
  526. package/web/.next/standalone/node_modules/ws/lib/event-target.js +292 -0
  527. package/web/.next/standalone/node_modules/ws/lib/extension.js +203 -0
  528. package/web/.next/standalone/node_modules/ws/lib/limiter.js +55 -0
  529. package/web/.next/standalone/node_modules/ws/lib/permessage-deflate.js +528 -0
  530. package/web/.next/standalone/node_modules/ws/lib/receiver.js +706 -0
  531. package/web/.next/standalone/node_modules/ws/lib/sender.js +602 -0
  532. package/web/.next/standalone/node_modules/ws/lib/stream.js +161 -0
  533. package/web/.next/standalone/node_modules/ws/lib/subprotocol.js +62 -0
  534. package/web/.next/standalone/node_modules/ws/lib/validation.js +152 -0
  535. package/web/.next/standalone/node_modules/ws/lib/websocket-server.js +554 -0
  536. package/web/.next/standalone/node_modules/ws/lib/websocket.js +1393 -0
  537. package/web/.next/standalone/node_modules/ws/package.json +69 -0
  538. package/web/.next/standalone/node_modules/ws/wrapper.mjs +8 -0
  539. package/web/.next/standalone/node_modules/y18n/build/lib/index.js +174 -0
  540. package/web/.next/standalone/node_modules/y18n/build/lib/platform-shims/node.js +19 -0
  541. package/web/.next/standalone/node_modules/y18n/index.mjs +8 -0
  542. package/web/.next/standalone/node_modules/y18n/package.json +70 -0
  543. package/web/.next/standalone/node_modules/yargs/build/lib/argsert.js +62 -0
  544. package/web/.next/standalone/node_modules/yargs/build/lib/command.js +449 -0
  545. package/web/.next/standalone/node_modules/yargs/build/lib/completion-templates.js +48 -0
  546. package/web/.next/standalone/node_modules/yargs/build/lib/completion.js +243 -0
  547. package/web/.next/standalone/node_modules/yargs/build/lib/middleware.js +88 -0
  548. package/web/.next/standalone/node_modules/yargs/build/lib/parse-command.js +32 -0
  549. package/web/.next/standalone/node_modules/yargs/build/lib/typings/common-types.js +9 -0
  550. package/web/.next/standalone/node_modules/yargs/build/lib/usage.js +584 -0
  551. package/web/.next/standalone/node_modules/yargs/build/lib/utils/apply-extends.js +59 -0
  552. package/web/.next/standalone/node_modules/yargs/build/lib/utils/is-promise.js +5 -0
  553. package/web/.next/standalone/node_modules/yargs/build/lib/utils/levenshtein.js +34 -0
  554. package/web/.next/standalone/node_modules/yargs/build/lib/utils/maybe-async-result.js +17 -0
  555. package/web/.next/standalone/node_modules/yargs/build/lib/utils/obj-filter.js +10 -0
  556. package/web/.next/standalone/node_modules/yargs/build/lib/utils/process-argv.js +17 -0
  557. package/web/.next/standalone/node_modules/yargs/build/lib/utils/set-blocking.js +12 -0
  558. package/web/.next/standalone/node_modules/yargs/build/lib/utils/which-module.js +10 -0
  559. package/web/.next/standalone/node_modules/yargs/build/lib/validation.js +305 -0
  560. package/web/.next/standalone/node_modules/yargs/build/lib/yargs-factory.js +1512 -0
  561. package/web/.next/standalone/node_modules/yargs/build/lib/yerror.js +9 -0
  562. package/web/.next/standalone/node_modules/yargs/helpers/helpers.mjs +10 -0
  563. package/web/.next/standalone/node_modules/yargs/index.mjs +8 -0
  564. package/web/.next/standalone/node_modules/yargs/lib/platform-shims/esm.mjs +73 -0
  565. package/web/.next/standalone/node_modules/yargs/package.json +123 -0
  566. package/web/.next/standalone/node_modules/yargs-parser/build/lib/index.js +62 -0
  567. package/web/.next/standalone/node_modules/yargs-parser/build/lib/string-utils.js +65 -0
  568. package/web/.next/standalone/node_modules/yargs-parser/build/lib/tokenize-arg-string.js +40 -0
  569. package/web/.next/standalone/node_modules/yargs-parser/build/lib/yargs-parser-types.js +12 -0
  570. package/web/.next/standalone/node_modules/yargs-parser/build/lib/yargs-parser.js +1045 -0
  571. package/web/.next/standalone/node_modules/yargs-parser/package.json +92 -0
  572. package/web/.next/standalone/node_modules/yauzl/LICENSE +21 -0
  573. package/web/.next/standalone/node_modules/yauzl/README.md +658 -0
  574. package/web/.next/standalone/node_modules/yauzl/index.js +796 -0
  575. package/web/.next/standalone/node_modules/yauzl/package.json +40 -0
  576. package/web/.next/standalone/packages/web/.next/BUILD_ID +1 -1
  577. package/web/.next/standalone/packages/web/.next/app-path-routes-manifest.json +10 -0
  578. package/web/.next/standalone/packages/web/.next/build-manifest.json +6 -6
  579. package/web/.next/standalone/packages/web/.next/node_modules/puppeteer-582bc9288a971b4a/lib/esm/package.json +1 -0
  580. package/web/.next/standalone/packages/web/.next/node_modules/puppeteer-582bc9288a971b4a/lib/esm/puppeteer/getConfiguration.js +122 -0
  581. package/web/.next/standalone/packages/web/.next/node_modules/puppeteer-582bc9288a971b4a/lib/esm/puppeteer/puppeteer.js +40 -0
  582. package/web/.next/standalone/packages/web/.next/node_modules/puppeteer-582bc9288a971b4a/package.json +145 -0
  583. package/web/.next/standalone/packages/web/.next/prerender-manifest.json +3 -27
  584. package/web/.next/standalone/packages/web/.next/routes-manifest.json +70 -0
  585. package/web/.next/standalone/packages/web/.next/server/app/_global-error/page/build-manifest.json +4 -4
  586. package/web/.next/standalone/packages/web/.next/server/app/_global-error/page.js +1 -1
  587. package/web/.next/standalone/packages/web/.next/server/app/_global-error/page.js.nft.json +1 -1
  588. package/web/.next/standalone/packages/web/.next/server/app/_global-error/page_client-reference-manifest.js +1 -1
  589. package/web/.next/standalone/packages/web/.next/server/app/_global-error.html +2 -2
  590. package/web/.next/standalone/packages/web/.next/server/app/_global-error.rsc +1 -1
  591. package/web/.next/standalone/packages/web/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +1 -1
  592. package/web/.next/standalone/packages/web/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  593. package/web/.next/standalone/packages/web/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  594. package/web/.next/standalone/packages/web/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  595. package/web/.next/standalone/packages/web/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  596. package/web/.next/standalone/packages/web/.next/server/app/_not-found/page/build-manifest.json +4 -4
  597. package/web/.next/standalone/packages/web/.next/server/app/_not-found/page/server-reference-manifest.json +7 -7
  598. package/web/.next/standalone/packages/web/.next/server/app/_not-found/page.js +10 -7
  599. package/web/.next/standalone/packages/web/.next/server/app/_not-found/page.js.nft.json +1 -1
  600. package/web/.next/standalone/packages/web/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  601. package/web/.next/standalone/packages/web/.next/server/app/_not-found.html +1 -1
  602. package/web/.next/standalone/packages/web/.next/server/app/_not-found.rsc +15 -14
  603. package/web/.next/standalone/packages/web/.next/server/app/_not-found.segments/_full.segment.rsc +15 -14
  604. package/web/.next/standalone/packages/web/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
  605. package/web/.next/standalone/packages/web/.next/server/app/_not-found.segments/_index.segment.rsc +6 -5
  606. package/web/.next/standalone/packages/web/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
  607. package/web/.next/standalone/packages/web/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
  608. package/web/.next/standalone/packages/web/.next/server/app/_not-found.segments/_tree.segment.rsc +2 -2
  609. package/web/.next/standalone/packages/web/.next/server/app/api/access/route.js +3 -3
  610. package/web/.next/standalone/packages/web/.next/server/app/api/access/route.js.nft.json +1 -1
  611. package/web/.next/standalone/packages/web/.next/server/app/api/agents/route.js +5 -4
  612. package/web/.next/standalone/packages/web/.next/server/app/api/agents/route.js.nft.json +1 -1
  613. package/web/.next/standalone/packages/web/.next/server/app/api/app-update/route/app-paths-manifest.json +3 -0
  614. package/web/.next/standalone/packages/web/.next/server/app/api/app-update/route/build-manifest.json +11 -0
  615. package/web/.next/standalone/packages/web/.next/server/app/api/app-update/route/server-reference-manifest.json +4 -0
  616. package/web/.next/standalone/packages/web/.next/server/app/api/app-update/route.js +10 -0
  617. package/web/.next/standalone/packages/web/.next/server/app/api/app-update/route.js.map +5 -0
  618. package/web/.next/standalone/packages/web/.next/server/app/api/app-update/route.js.nft.json +1 -0
  619. package/web/.next/standalone/packages/web/.next/server/app/api/app-update/route_client-reference-manifest.js +2 -0
  620. package/web/.next/standalone/packages/web/.next/server/app/api/attachments/route.js +3 -3
  621. package/web/.next/standalone/packages/web/.next/server/app/api/attachments/route.js.nft.json +1 -1
  622. package/web/.next/standalone/packages/web/.next/server/app/api/auth/session/route.js +3 -3
  623. package/web/.next/standalone/packages/web/.next/server/app/api/auth/session/route.js.nft.json +1 -1
  624. package/web/.next/standalone/packages/web/.next/server/app/api/boards/comments/route/app-paths-manifest.json +3 -0
  625. package/web/.next/standalone/packages/web/.next/server/app/api/boards/comments/route/build-manifest.json +11 -0
  626. package/web/.next/standalone/packages/web/.next/server/app/api/boards/comments/route/server-reference-manifest.json +4 -0
  627. package/web/.next/standalone/packages/web/.next/server/app/api/boards/comments/route.js +10 -0
  628. package/web/.next/standalone/packages/web/.next/server/app/api/boards/comments/route.js.map +5 -0
  629. package/web/.next/standalone/packages/web/.next/server/app/api/boards/comments/route.js.nft.json +1 -0
  630. package/web/.next/standalone/packages/web/.next/server/app/api/boards/comments/route_client-reference-manifest.js +2 -0
  631. package/web/.next/standalone/packages/web/.next/server/app/api/boards/route.js +3 -3
  632. package/web/.next/standalone/packages/web/.next/server/app/api/boards/route.js.nft.json +1 -1
  633. package/web/.next/standalone/packages/web/.next/server/app/api/config/route.js +3 -3
  634. package/web/.next/standalone/packages/web/.next/server/app/api/config/route.js.nft.json +1 -1
  635. package/web/.next/standalone/packages/web/.next/server/app/api/context-files/open/route/app-paths-manifest.json +3 -0
  636. package/web/.next/standalone/packages/web/.next/server/app/api/context-files/open/route/build-manifest.json +11 -0
  637. package/web/.next/standalone/packages/web/.next/server/app/api/context-files/open/route/server-reference-manifest.json +4 -0
  638. package/web/.next/standalone/packages/web/.next/server/app/api/context-files/open/route.js +10 -0
  639. package/web/.next/standalone/packages/web/.next/server/app/api/context-files/open/route.js.map +5 -0
  640. package/web/.next/standalone/packages/web/.next/server/app/api/context-files/open/route.js.nft.json +1 -0
  641. package/web/.next/standalone/packages/web/.next/server/app/api/context-files/open/route_client-reference-manifest.js +2 -0
  642. package/web/.next/standalone/packages/web/.next/server/app/api/context-files/route.js +3 -3
  643. package/web/.next/standalone/packages/web/.next/server/app/api/context-files/route.js.nft.json +1 -1
  644. package/web/.next/standalone/packages/web/.next/server/app/api/events/route.js +3 -3
  645. package/web/.next/standalone/packages/web/.next/server/app/api/events/route.js.nft.json +1 -1
  646. package/web/.next/standalone/packages/web/.next/server/app/api/executor/health/route.js +3 -3
  647. package/web/.next/standalone/packages/web/.next/server/app/api/executor/health/route.js.nft.json +1 -1
  648. package/web/.next/standalone/packages/web/.next/server/app/api/filesystem/directory/route.js +3 -3
  649. package/web/.next/standalone/packages/web/.next/server/app/api/filesystem/directory/route.js.nft.json +1 -1
  650. package/web/.next/standalone/packages/web/.next/server/app/api/filesystem/pick-directory/route.js +3 -3
  651. package/web/.next/standalone/packages/web/.next/server/app/api/filesystem/pick-directory/route.js.nft.json +1 -1
  652. package/web/.next/standalone/packages/web/.next/server/app/api/github/repos/route.js +3 -3
  653. package/web/.next/standalone/packages/web/.next/server/app/api/github/repos/route.js.nft.json +1 -1
  654. package/web/.next/standalone/packages/web/.next/server/app/api/github/webhook/route/app-paths-manifest.json +3 -0
  655. package/web/.next/standalone/packages/web/.next/server/app/api/github/webhook/route/build-manifest.json +11 -0
  656. package/web/.next/standalone/packages/web/.next/server/app/api/github/webhook/route/server-reference-manifest.json +4 -0
  657. package/web/.next/standalone/packages/web/.next/server/app/api/github/webhook/route.js +10 -0
  658. package/web/.next/standalone/packages/web/.next/server/app/api/github/webhook/route.js.map +5 -0
  659. package/web/.next/standalone/packages/web/.next/server/app/api/github/webhook/route.js.nft.json +1 -0
  660. package/web/.next/standalone/packages/web/.next/server/app/api/github/webhook/route_client-reference-manifest.js +2 -0
  661. package/web/.next/standalone/packages/web/.next/server/app/api/health/boards/route.js +3 -3
  662. package/web/.next/standalone/packages/web/.next/server/app/api/health/boards/route.js.nft.json +1 -1
  663. package/web/.next/standalone/packages/web/.next/server/app/api/health/sessions/route.js +3 -3
  664. package/web/.next/standalone/packages/web/.next/server/app/api/health/sessions/route.js.nft.json +1 -1
  665. package/web/.next/standalone/packages/web/.next/server/app/api/notifications/route.js +3 -3
  666. package/web/.next/standalone/packages/web/.next/server/app/api/notifications/route.js.nft.json +1 -1
  667. package/web/.next/standalone/packages/web/.next/server/app/api/preferences/route.js +3 -3
  668. package/web/.next/standalone/packages/web/.next/server/app/api/preferences/route.js.nft.json +1 -1
  669. package/web/.next/standalone/packages/web/.next/server/app/api/remote-access/route/app-paths-manifest.json +3 -0
  670. package/web/.next/standalone/packages/web/.next/server/app/api/remote-access/route/build-manifest.json +11 -0
  671. package/web/.next/standalone/packages/web/.next/server/app/api/remote-access/route/server-reference-manifest.json +4 -0
  672. package/web/.next/standalone/packages/web/.next/server/app/api/remote-access/route.js +11 -0
  673. package/web/.next/standalone/packages/web/.next/server/app/api/remote-access/route.js.map +5 -0
  674. package/web/.next/standalone/packages/web/.next/server/app/api/remote-access/route.js.nft.json +1 -0
  675. package/web/.next/standalone/packages/web/.next/server/app/api/remote-access/route_client-reference-manifest.js +2 -0
  676. package/web/.next/standalone/packages/web/.next/server/app/api/repositories/[id]/route.js +3 -3
  677. package/web/.next/standalone/packages/web/.next/server/app/api/repositories/[id]/route.js.nft.json +1 -1
  678. package/web/.next/standalone/packages/web/.next/server/app/api/repositories/route.js +3 -3
  679. package/web/.next/standalone/packages/web/.next/server/app/api/repositories/route.js.nft.json +1 -1
  680. package/web/.next/standalone/packages/web/.next/server/app/api/sessions/[id]/actions/route.js +3 -3
  681. package/web/.next/standalone/packages/web/.next/server/app/api/sessions/[id]/actions/route.js.nft.json +1 -1
  682. package/web/.next/standalone/packages/web/.next/server/app/api/sessions/[id]/archive/route.js +3 -3
  683. package/web/.next/standalone/packages/web/.next/server/app/api/sessions/[id]/archive/route.js.nft.json +1 -1
  684. package/web/.next/standalone/packages/web/.next/server/app/api/sessions/[id]/checks/route.js +3 -3
  685. package/web/.next/standalone/packages/web/.next/server/app/api/sessions/[id]/checks/route.js.nft.json +1 -1
  686. package/web/.next/standalone/packages/web/.next/server/app/api/sessions/[id]/diff/route.js +3 -3
  687. package/web/.next/standalone/packages/web/.next/server/app/api/sessions/[id]/diff/route.js.nft.json +1 -1
  688. package/web/.next/standalone/packages/web/.next/server/app/api/sessions/[id]/feed/route.js +3 -3
  689. package/web/.next/standalone/packages/web/.next/server/app/api/sessions/[id]/feed/route.js.nft.json +1 -1
  690. package/web/.next/standalone/packages/web/.next/server/app/api/sessions/[id]/feed/stream/route/app-paths-manifest.json +3 -0
  691. package/web/.next/standalone/packages/web/.next/server/app/api/sessions/[id]/feed/stream/route/build-manifest.json +11 -0
  692. package/web/.next/standalone/packages/web/.next/server/app/api/sessions/[id]/feed/stream/route/server-reference-manifest.json +4 -0
  693. package/web/.next/standalone/packages/web/.next/server/app/api/sessions/[id]/feed/stream/route.js +10 -0
  694. package/web/.next/standalone/packages/web/.next/server/app/api/sessions/[id]/feed/stream/route.js.map +5 -0
  695. package/web/.next/standalone/packages/web/.next/server/app/api/sessions/[id]/feed/stream/route.js.nft.json +1 -0
  696. package/web/.next/standalone/packages/web/.next/server/app/api/sessions/[id]/feed/stream/route_client-reference-manifest.js +2 -0
  697. package/web/.next/standalone/packages/web/.next/server/app/api/sessions/[id]/feedback/route.js +3 -3
  698. package/web/.next/standalone/packages/web/.next/server/app/api/sessions/[id]/feedback/route.js.nft.json +1 -1
  699. package/web/.next/standalone/packages/web/.next/server/app/api/sessions/[id]/files/route.js +3 -3
  700. package/web/.next/standalone/packages/web/.next/server/app/api/sessions/[id]/files/route.js.nft.json +1 -1
  701. package/web/.next/standalone/packages/web/.next/server/app/api/sessions/[id]/interrupt/route/app-paths-manifest.json +3 -0
  702. package/web/.next/standalone/packages/web/.next/server/app/api/sessions/[id]/interrupt/route/build-manifest.json +11 -0
  703. package/web/.next/standalone/packages/web/.next/server/app/api/sessions/[id]/interrupt/route/server-reference-manifest.json +4 -0
  704. package/web/.next/standalone/packages/web/.next/server/app/api/sessions/[id]/interrupt/route.js +10 -0
  705. package/web/.next/standalone/packages/web/.next/server/app/api/sessions/[id]/interrupt/route.js.map +5 -0
  706. package/web/.next/standalone/packages/web/.next/server/app/api/sessions/[id]/interrupt/route.js.nft.json +1 -0
  707. package/web/.next/standalone/packages/web/.next/server/app/api/sessions/[id]/interrupt/route_client-reference-manifest.js +2 -0
  708. package/web/.next/standalone/packages/web/.next/server/app/api/sessions/[id]/keys/route.js +3 -3
  709. package/web/.next/standalone/packages/web/.next/server/app/api/sessions/[id]/keys/route.js.nft.json +1 -1
  710. package/web/.next/standalone/packages/web/.next/server/app/api/sessions/[id]/kill/route.js +3 -3
  711. package/web/.next/standalone/packages/web/.next/server/app/api/sessions/[id]/kill/route.js.nft.json +1 -1
  712. package/web/.next/standalone/packages/web/.next/server/app/api/sessions/[id]/output/route.js +3 -3
  713. package/web/.next/standalone/packages/web/.next/server/app/api/sessions/[id]/output/route.js.nft.json +1 -1
  714. package/web/.next/standalone/packages/web/.next/server/app/api/sessions/[id]/output/stream/route.js +3 -3
  715. package/web/.next/standalone/packages/web/.next/server/app/api/sessions/[id]/output/stream/route.js.nft.json +1 -1
  716. package/web/.next/standalone/packages/web/.next/server/app/api/sessions/[id]/preview/dom/route/app-paths-manifest.json +3 -0
  717. package/web/.next/standalone/packages/web/.next/server/app/api/sessions/[id]/preview/dom/route/build-manifest.json +11 -0
  718. package/web/.next/standalone/packages/web/.next/server/app/api/sessions/[id]/preview/dom/route/server-reference-manifest.json +4 -0
  719. package/web/.next/standalone/packages/web/.next/server/app/api/sessions/[id]/preview/dom/route.js +10 -0
  720. package/web/.next/standalone/packages/web/.next/server/app/api/sessions/[id]/preview/dom/route.js.map +5 -0
  721. package/web/.next/standalone/packages/web/.next/server/app/api/sessions/[id]/preview/dom/route.js.nft.json +1 -0
  722. package/web/.next/standalone/packages/web/.next/server/app/api/sessions/[id]/preview/dom/route_client-reference-manifest.js +2 -0
  723. package/web/.next/standalone/packages/web/.next/server/app/api/sessions/[id]/preview/route/app-paths-manifest.json +3 -0
  724. package/web/.next/standalone/packages/web/.next/server/app/api/sessions/[id]/preview/route/build-manifest.json +11 -0
  725. package/web/.next/standalone/packages/web/.next/server/app/api/sessions/[id]/preview/route/server-reference-manifest.json +4 -0
  726. package/web/.next/standalone/packages/web/.next/server/app/api/sessions/[id]/preview/route.js +10 -0
  727. package/web/.next/standalone/packages/web/.next/server/app/api/sessions/[id]/preview/route.js.map +5 -0
  728. package/web/.next/standalone/packages/web/.next/server/app/api/sessions/[id]/preview/route.js.nft.json +1 -0
  729. package/web/.next/standalone/packages/web/.next/server/app/api/sessions/[id]/preview/route_client-reference-manifest.js +2 -0
  730. package/web/.next/standalone/packages/web/.next/server/app/api/sessions/[id]/preview/screenshot/route/app-paths-manifest.json +3 -0
  731. package/web/.next/standalone/packages/web/.next/server/app/api/sessions/[id]/preview/screenshot/route/build-manifest.json +11 -0
  732. package/web/.next/standalone/packages/web/.next/server/app/api/sessions/[id]/preview/screenshot/route/server-reference-manifest.json +4 -0
  733. package/web/.next/standalone/packages/web/.next/server/app/api/sessions/[id]/preview/screenshot/route.js +10 -0
  734. package/web/.next/standalone/packages/web/.next/server/app/api/sessions/[id]/preview/screenshot/route.js.map +5 -0
  735. package/web/.next/standalone/packages/web/.next/server/app/api/sessions/[id]/preview/screenshot/route.js.nft.json +1 -0
  736. package/web/.next/standalone/packages/web/.next/server/app/api/sessions/[id]/preview/screenshot/route_client-reference-manifest.js +2 -0
  737. package/web/.next/standalone/packages/web/.next/server/app/api/sessions/[id]/restore/route.js +3 -3
  738. package/web/.next/standalone/packages/web/.next/server/app/api/sessions/[id]/restore/route.js.nft.json +1 -1
  739. package/web/.next/standalone/packages/web/.next/server/app/api/sessions/[id]/route.js +3 -3
  740. package/web/.next/standalone/packages/web/.next/server/app/api/sessions/[id]/route.js.nft.json +1 -1
  741. package/web/.next/standalone/packages/web/.next/server/app/api/sessions/[id]/send/route.js +3 -3
  742. package/web/.next/standalone/packages/web/.next/server/app/api/sessions/[id]/send/route.js.nft.json +1 -1
  743. package/web/.next/standalone/packages/web/.next/server/app/api/sessions/route.js +3 -3
  744. package/web/.next/standalone/packages/web/.next/server/app/api/sessions/route.js.nft.json +1 -1
  745. package/web/.next/standalone/packages/web/.next/server/app/api/spawn/route.js +3 -3
  746. package/web/.next/standalone/packages/web/.next/server/app/api/spawn/route.js.nft.json +1 -1
  747. package/web/.next/standalone/packages/web/.next/server/app/api/workspaces/branches/route.js +3 -3
  748. package/web/.next/standalone/packages/web/.next/server/app/api/workspaces/branches/route.js.nft.json +1 -1
  749. package/web/.next/standalone/packages/web/.next/server/app/api/workspaces/route.js +3 -3
  750. package/web/.next/standalone/packages/web/.next/server/app/api/workspaces/route.js.nft.json +1 -1
  751. package/web/.next/standalone/packages/web/.next/server/app/auth/grant/route.js +1 -1
  752. package/web/.next/standalone/packages/web/.next/server/app/auth/grant/route.js.nft.json +1 -1
  753. package/web/.next/standalone/packages/web/.next/server/app/icon.svg/route.js +1 -1
  754. package/web/.next/standalone/packages/web/.next/server/app/icon.svg/route.js.nft.json +1 -1
  755. package/web/.next/standalone/packages/web/.next/server/app/page/build-manifest.json +4 -4
  756. package/web/.next/standalone/packages/web/.next/server/app/page/react-loadable-manifest.json +4 -3
  757. package/web/.next/standalone/packages/web/.next/server/app/page/server-reference-manifest.json +7 -7
  758. package/web/.next/standalone/packages/web/.next/server/app/page.js +13 -9
  759. package/web/.next/standalone/packages/web/.next/server/app/page.js.nft.json +1 -1
  760. package/web/.next/standalone/packages/web/.next/server/app/page_client-reference-manifest.js +1 -1
  761. package/web/.next/standalone/packages/web/.next/server/app/sessions/[id]/page/build-manifest.json +4 -4
  762. package/web/.next/standalone/packages/web/.next/server/app/sessions/[id]/page/server-reference-manifest.json +7 -7
  763. package/web/.next/standalone/packages/web/.next/server/app/sessions/[id]/page.js +13 -9
  764. package/web/.next/standalone/packages/web/.next/server/app/sessions/[id]/page.js.nft.json +1 -1
  765. package/web/.next/standalone/packages/web/.next/server/app/sessions/[id]/page_client-reference-manifest.js +1 -1
  766. package/web/.next/standalone/packages/web/.next/server/app/sign-in/[[...sign-in]]/page/build-manifest.json +4 -4
  767. package/web/.next/standalone/packages/web/.next/server/app/sign-in/[[...sign-in]]/page/server-reference-manifest.json +7 -7
  768. package/web/.next/standalone/packages/web/.next/server/app/sign-in/[[...sign-in]]/page.js +10 -7
  769. package/web/.next/standalone/packages/web/.next/server/app/sign-in/[[...sign-in]]/page.js.nft.json +1 -1
  770. package/web/.next/standalone/packages/web/.next/server/app/sign-in/[[...sign-in]]/page_client-reference-manifest.js +1 -1
  771. package/web/.next/standalone/packages/web/.next/server/app/unlock/page/build-manifest.json +4 -4
  772. package/web/.next/standalone/packages/web/.next/server/app/unlock/page/server-reference-manifest.json +7 -7
  773. package/web/.next/standalone/packages/web/.next/server/app/unlock/page.js +11 -8
  774. package/web/.next/standalone/packages/web/.next/server/app/unlock/page.js.nft.json +1 -1
  775. package/web/.next/standalone/packages/web/.next/server/app/unlock/page_client-reference-manifest.js +1 -1
  776. package/web/.next/standalone/packages/web/.next/server/app-paths-manifest.json +10 -0
  777. package/web/.next/standalone/packages/web/.next/server/chunks/26076_server_app_api_sessions_[id]_preview_screenshot_route_actions_dcbbcaf6.js +3 -0
  778. package/web/.next/standalone/packages/web/.next/server/chunks/29f24__next-internal_server_app_api_sessions_[id]_feed_stream_route_actions_1262f517.js +3 -0
  779. package/web/.next/standalone/packages/web/.next/server/chunks/29f24__next-internal_server_app_api_sessions_[id]_interrupt_route_actions_89990829.js +3 -0
  780. package/web/.next/standalone/packages/web/.next/server/chunks/29f24__next-internal_server_app_api_sessions_[id]_preview_dom_route_actions_fb81dadb.js +3 -0
  781. package/web/.next/standalone/packages/web/.next/server/chunks/730ea_web__next-internal_server_app_api_boards_comments_route_actions_7acfa960.js +3 -0
  782. package/web/.next/standalone/packages/web/.next/server/chunks/730ea_web__next-internal_server_app_api_context-files_open_route_actions_ffa7eab4.js +3 -0
  783. package/web/.next/standalone/packages/web/.next/server/chunks/730ea_web__next-internal_server_app_api_sessions_[id]_preview_route_actions_9f632c66.js +3 -0
  784. package/web/.next/standalone/packages/web/.next/server/chunks/[externals]__06cd15c5._.js +3 -0
  785. package/web/.next/standalone/packages/web/.next/server/chunks/{[root-of-the-server]__0c7f79b1._.js → [root-of-the-server]__025155ac._.js} +1 -1
  786. package/web/.next/standalone/packages/web/.next/server/chunks/{[root-of-the-server]__144e8e60._.js → [root-of-the-server]__03277e82._.js} +1 -1
  787. package/web/.next/standalone/packages/web/.next/server/chunks/{[root-of-the-server]__16d4a78f._.js → [root-of-the-server]__03d02e36._.js} +1 -1
  788. package/web/.next/standalone/packages/web/.next/server/chunks/{[root-of-the-server]__095ffdaa._.js → [root-of-the-server]__06d0fa23._.js} +1 -1
  789. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__07d320fc._.js +3 -0
  790. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__09d81126._.js +3 -0
  791. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__0a4bdecd._.js +3 -0
  792. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__0d3270b2._.js +3 -0
  793. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__0f87f848._.js +3 -0
  794. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__120e7cdf._.js +3 -0
  795. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__186317eb._.js +3 -0
  796. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__1888a793._.js +3 -0
  797. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__1ae07be2._.js +3 -0
  798. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__1b995ded._.js +3 -0
  799. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__1c1c0e68._.js +3 -0
  800. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__1ce34a21._.js +3 -0
  801. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__228603ec._.js +3 -0
  802. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__256d4deb._.js +3 -0
  803. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__2a02fc49._.js +3 -0
  804. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__2ce39d51._.js +1 -1
  805. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__2d6ad93c._.js +3 -0
  806. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__31703e2b._.js +3 -0
  807. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__394943dc._.js +3 -0
  808. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__3bab2cf7._.js +3 -0
  809. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__3f48e8a2._.js +3 -0
  810. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__405fc5bc._.js +3 -0
  811. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__412dec17._.js +3 -0
  812. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__428f1837._.js +3 -0
  813. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__446f586e._.js +3 -0
  814. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__46ba5636._.js +3 -0
  815. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__49e358a8._.js +3 -0
  816. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__4a3e9ddd._.js +3 -0
  817. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__4d8a3fa3._.js +3 -0
  818. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__5dc7cf0d._.js +3 -0
  819. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__5fd67791._.js +3 -0
  820. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__61a55b93._.js +3 -0
  821. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__621d9bca._.js +3 -0
  822. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__6313c91e._.js +28 -0
  823. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__65fcccc8._.js +3 -0
  824. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__668ff2cd._.js +3 -0
  825. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__66e8ccce._.js +3 -0
  826. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__6b163dd7._.js +3 -0
  827. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__6c5a5852._.js +3 -0
  828. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__73601621._.js +3 -0
  829. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__747ac51a._.js +3 -0
  830. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__78d6e137._.js +3 -0
  831. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__7dac9015._.js +3 -0
  832. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__7e929085._.js +3 -0
  833. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__7fcfdb86._.js +3 -0
  834. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__80fb443b._.js +3 -0
  835. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__85538066._.js +3 -0
  836. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__85b114a2._.js +3 -0
  837. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__865615a6._.js +3 -0
  838. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__893cfe3c._.js +3 -0
  839. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__90d02df4._.js +3 -0
  840. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__925bed49._.js +3 -0
  841. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__95440fe8._.js +3 -0
  842. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__968aabbd._.js +3 -0
  843. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__97658502._.js +3 -0
  844. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__9b2f424f._.js +3 -0
  845. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__9ca51739._.js +3 -0
  846. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__a45d3a1d._.js +3 -0
  847. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__b5c89bad._.js +3 -0
  848. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__b73a3118._.js +3 -0
  849. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__c06cb06b._.js +3 -0
  850. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__c624410f._.js +3 -0
  851. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__c6ecf2e6._.js +3 -0
  852. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__c9626ece._.js +3 -0
  853. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__c9b787f4._.js +3 -0
  854. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__cb1e2942._.js +3 -0
  855. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__cb29be7d._.js +3 -0
  856. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__cc4964a5._.js +3 -0
  857. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__cdcdbbe3._.js +3 -0
  858. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__ce529f57._.js +3 -0
  859. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__cfaae401._.js +3 -0
  860. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__d2afbd4e._.js +3 -0
  861. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__d62bf196._.js +3 -0
  862. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__d8cd86c9._.js +3 -0
  863. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__de098ee1._.js +3 -0
  864. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__e0d759be._.js +3 -0
  865. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__e6181b22._.js +3 -0
  866. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__e633102f._.js +3 -0
  867. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__ea845f9f._.js +7 -0
  868. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__eabdec9e._.js +3 -0
  869. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__eb0c88b2._.js +3 -0
  870. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__ececfccf._.js +3 -0
  871. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__ed83cdf3._.js +3 -0
  872. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__eda7b9ea._.js +3 -0
  873. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__ef38eeb2._.js +3 -0
  874. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__efbfac9f._.js +3 -0
  875. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__efd26bfc._.js +3 -0
  876. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__f12a3bd3._.js +3 -0
  877. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__f4786ce9._.js +3 -0
  878. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__f4d63c18._.js +3 -0
  879. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__f8ebc9db._.js +3 -0
  880. package/web/.next/standalone/packages/web/.next/server/chunks/_2c837d66._.js +80 -0
  881. package/web/.next/standalone/packages/web/.next/server/chunks/node_modules_next_dist_esm_build_templates_app-route_5eb57175.js +6 -0
  882. package/web/.next/standalone/packages/web/.next/server/chunks/node_modules_next_dist_esm_build_templates_app-route_eaad1f33.js +3 -0
  883. package/web/.next/standalone/packages/web/.next/server/chunks/packages_web__next-internal_server_app_api_app-update_route_actions_67fa9ca7.js +3 -0
  884. package/web/.next/standalone/packages/web/.next/server/chunks/packages_web__next-internal_server_app_api_github_webhook_route_actions_16ed82df.js +3 -0
  885. package/web/.next/standalone/packages/web/.next/server/chunks/packages_web__next-internal_server_app_api_remote-access_route_actions_5ebfaea6.js +3 -0
  886. package/web/.next/standalone/packages/web/.next/server/chunks/ssr/[externals]_node:async_hooks_b485b2a4._.js +3 -0
  887. package/web/.next/standalone/packages/web/.next/server/chunks/ssr/[root-of-the-server]__000b8c99._.js +4 -0
  888. package/web/.next/standalone/packages/web/.next/server/chunks/ssr/[root-of-the-server]__009ce29c._.js +3 -0
  889. package/web/.next/standalone/packages/web/.next/server/chunks/ssr/[root-of-the-server]__010700d3._.js +3 -0
  890. package/web/.next/standalone/packages/web/.next/server/chunks/ssr/[root-of-the-server]__0aa08967._.js +3 -0
  891. package/web/.next/standalone/packages/web/.next/server/chunks/ssr/[root-of-the-server]__11ca851a._.js +3 -0
  892. package/web/.next/standalone/packages/web/.next/server/chunks/ssr/[root-of-the-server]__29091976._.js +3 -0
  893. package/web/.next/standalone/packages/web/.next/server/chunks/ssr/[root-of-the-server]__29d8d063._.js +4 -0
  894. package/web/.next/standalone/packages/web/.next/server/chunks/ssr/[root-of-the-server]__4168e031._.js +3 -0
  895. package/web/.next/standalone/packages/web/.next/server/chunks/ssr/[root-of-the-server]__5fccda2c._.js +3 -0
  896. package/web/.next/standalone/packages/web/.next/server/chunks/ssr/{[root-of-the-server]__525ee5d4._.js → [root-of-the-server]__85aece6a._.js} +2 -2
  897. package/web/.next/standalone/packages/web/.next/server/chunks/ssr/[root-of-the-server]__8a6b25f0._.js +3 -0
  898. package/web/.next/standalone/packages/web/.next/server/chunks/ssr/[root-of-the-server]__8bcf983b._.js +1 -1
  899. package/web/.next/standalone/packages/web/.next/server/chunks/ssr/[root-of-the-server]__a3c8291e._.js +3 -0
  900. package/web/.next/standalone/packages/web/.next/server/chunks/ssr/[root-of-the-server]__b388693f._.js +1 -1
  901. package/web/.next/standalone/packages/web/.next/server/chunks/ssr/[root-of-the-server]__d1efcbf0._.js +3 -0
  902. package/web/.next/standalone/packages/web/.next/server/chunks/ssr/[root-of-the-server]__d800fc87._.js +3 -0
  903. package/web/.next/standalone/packages/web/.next/server/chunks/ssr/[root-of-the-server]__e6f079d9._.js +3 -0
  904. package/web/.next/standalone/packages/web/.next/server/chunks/ssr/_0e1412de._.js +1 -1
  905. package/web/.next/standalone/packages/web/.next/server/chunks/ssr/_1f2460d5._.js +3 -0
  906. package/web/.next/standalone/packages/web/.next/server/chunks/ssr/_230c0c14._.js +80 -0
  907. package/web/.next/standalone/packages/web/.next/server/chunks/ssr/_27fe5f5d._.js +1 -1
  908. package/web/.next/standalone/packages/web/.next/server/chunks/ssr/_69e05fca._.js +1 -1
  909. package/web/.next/standalone/packages/web/.next/server/chunks/ssr/_6cfd06c2._.js +3 -0
  910. package/web/.next/standalone/packages/web/.next/server/chunks/ssr/_7321b77f._.js +1 -1
  911. package/web/.next/standalone/packages/web/.next/server/chunks/ssr/_80efe193._.js +1 -1
  912. package/web/.next/standalone/packages/web/.next/server/chunks/ssr/_8982bbf3._.js +3 -0
  913. package/web/.next/standalone/packages/web/.next/server/chunks/ssr/_9f3d31e1._.js +1 -1
  914. package/web/.next/standalone/packages/web/.next/server/chunks/ssr/_b214b154._.js +3 -0
  915. package/web/.next/standalone/packages/web/.next/server/chunks/ssr/_b6d31783._.js +1 -1
  916. package/web/.next/standalone/packages/web/.next/server/chunks/ssr/_c0f0e227._.js +1 -1
  917. package/web/.next/standalone/packages/web/.next/server/chunks/ssr/_c9612a3a._.js +1 -1
  918. package/web/.next/standalone/packages/web/.next/server/chunks/ssr/_e1c18705._.js +3 -0
  919. package/web/.next/standalone/packages/web/.next/server/chunks/ssr/_f36ddaa9._.js +1 -1
  920. package/web/.next/standalone/packages/web/.next/server/chunks/ssr/node_modules_270cb834._.js +1 -1
  921. package/web/.next/standalone/packages/web/.next/server/chunks/ssr/node_modules_8d94411c._.js +3 -0
  922. package/web/.next/standalone/packages/web/.next/server/chunks/ssr/node_modules_@clerk_3d65ee57._.js +24 -0
  923. package/web/.next/standalone/packages/web/.next/server/chunks/ssr/node_modules_@clerk_902120fe._.js +31 -0
  924. package/web/.next/standalone/packages/web/.next/server/chunks/ssr/{node_modules_@clerk_nextjs_dist_esm_app-router_57153687._.js → node_modules_@clerk_nextjs_dist_esm_app-router_0a811c5a._.js} +2 -2
  925. package/web/.next/standalone/packages/web/.next/server/chunks/ssr/node_modules_@clerk_nextjs_dist_esm_app-router_2c78c2f3._.js +3 -0
  926. package/web/.next/standalone/packages/web/.next/server/chunks/ssr/node_modules_@clerk_nextjs_dist_esm_server_index_a054612e.js +3 -0
  927. package/web/.next/standalone/packages/web/.next/server/chunks/ssr/node_modules_@radix-ui_02f0d3f0._.js +3 -0
  928. package/web/.next/standalone/packages/web/.next/server/chunks/ssr/node_modules_lucide-react_dist_esm_icons_message-square_2e76b8d9.js +3 -0
  929. package/web/.next/standalone/packages/web/.next/server/chunks/ssr/node_modules_next_a9871523._.js +14 -0
  930. package/web/.next/standalone/packages/web/.next/server/chunks/ssr/node_modules_next_ae5d7b42._.js +3 -0
  931. package/web/.next/standalone/packages/web/.next/server/chunks/ssr/{node_modules_next_2a43e292._.js → node_modules_next_c73d6895._.js} +2 -2
  932. package/web/.next/standalone/packages/web/.next/server/chunks/ssr/node_modules_next_dist_08570d7f._.js +1 -1
  933. package/web/.next/standalone/packages/web/.next/server/chunks/ssr/node_modules_next_dist_65e60196._.js +1 -1
  934. package/web/.next/standalone/packages/web/.next/server/chunks/ssr/node_modules_next_dist_891f7b49._.js +6 -0
  935. package/web/.next/standalone/packages/web/.next/server/chunks/ssr/node_modules_next_dist_esm_build_templates_app-page_cd51dad4.js +1 -1
  936. package/web/.next/standalone/packages/web/.next/server/chunks/ssr/node_modules_next_dist_esm_eedfc1fd._.js +1 -1
  937. package/web/.next/standalone/packages/web/.next/server/chunks/ssr/packages_web_src_components_board_WorkspaceKanban_tsx_735b7999._.js +1 -1
  938. package/web/.next/standalone/packages/web/.next/server/chunks/ssr/packages_web_src_components_ui_Tooltip_tsx_6becc8ca._.js +3 -0
  939. package/web/.next/standalone/packages/web/.next/server/chunks/ssr/packages_web_src_features_dashboard_DashboardClient_tsx_81ae42b0._.js +3 -0
  940. package/web/.next/standalone/packages/web/.next/server/chunks/ssr/packages_web_src_lib_cn_ts_d08d265f._.js +3 -0
  941. package/web/.next/standalone/packages/web/.next/server/functions-config-manifest.json +7 -5
  942. package/web/.next/standalone/packages/web/.next/server/middleware-build-manifest.js +4 -4
  943. package/web/.next/standalone/packages/web/.next/server/middleware.js +2 -4
  944. package/web/.next/standalone/packages/web/.next/server/pages/404.html +1 -1
  945. package/web/.next/standalone/packages/web/.next/server/pages/500.html +2 -2
  946. package/web/.next/standalone/packages/web/.next/server/server-reference-manifest.js +1 -1
  947. package/web/.next/standalone/packages/web/.next/server/server-reference-manifest.json +8 -8
  948. package/web/.next/standalone/packages/web/.next/static/{8a_zZln8ezVAo0jAilwbF → E4-NvSai1Ps20r9dtdpps}/_clientMiddlewareManifest.json +0 -4
  949. package/web/.next/standalone/packages/web/.next/static/chunks/006a91a252482204.js +1 -0
  950. package/web/.next/standalone/packages/web/.next/static/chunks/07f3b9a104ce0ff4.js +1 -0
  951. package/web/.next/standalone/packages/web/.next/static/chunks/1004422d31074d62.js +1 -0
  952. package/web/.next/standalone/packages/web/.next/static/chunks/{12d9b4273416fe9b.js → 28eac764d6544827.js} +1 -1
  953. package/web/.next/standalone/packages/web/.next/static/chunks/2e2e8fd2ceca47dc.js +6 -0
  954. package/web/.next/standalone/packages/web/.next/static/chunks/30ababddac1b82dc.js +1 -0
  955. package/web/.next/standalone/packages/web/.next/static/chunks/3349bdab17ed1183.js +1 -0
  956. package/web/.next/standalone/packages/web/.next/static/chunks/3770166bed1577ce.js +4 -0
  957. package/web/.next/standalone/packages/web/.next/static/chunks/4c3afea55dd8bc93.js +1 -0
  958. package/web/.next/standalone/packages/web/.next/static/chunks/57858ac28cbf124d.js +1 -0
  959. package/web/.next/standalone/packages/web/.next/static/chunks/7fd2a83e9e74f215.js +1 -0
  960. package/web/.next/standalone/packages/web/.next/static/chunks/91e9e111a2536f92.js +1 -0
  961. package/web/.next/standalone/packages/web/.next/static/chunks/aabc80195233b4da.js +1 -0
  962. package/web/.next/standalone/packages/web/.next/static/chunks/bf82908a598c6de5.css +3 -0
  963. package/web/.next/standalone/packages/web/.next/static/chunks/d6a81d2f8b98b4be.js +1 -0
  964. package/web/.next/standalone/packages/web/.next/static/chunks/e9d0e95bbaa0f4fb.js +1 -0
  965. package/web/.next/standalone/packages/web/.next/static/chunks/ebaa0c535c4135f1.js +1 -0
  966. package/web/.next/standalone/packages/web/.next/static/chunks/{turbopack-57373a2ee9f56180.js → turbopack-49f4119854e8206e.js} +1 -1
  967. package/web/.next/standalone/packages/web/package.json +2 -1
  968. package/web/.next/standalone/packages/web/src/app/api/agents/route.ts +196 -2
  969. package/web/.next/standalone/packages/web/src/app/api/app-update/route.ts +6 -0
  970. package/web/.next/standalone/packages/web/src/app/api/auth/session/route.ts +38 -3
  971. package/web/.next/standalone/packages/web/src/app/api/boards/comments/route.ts +8 -0
  972. package/web/.next/standalone/packages/web/src/app/api/boards/route.ts +1 -0
  973. package/web/.next/standalone/packages/web/src/app/api/context-files/open/route.ts +8 -0
  974. package/web/.next/standalone/packages/web/src/app/api/github/webhook/route.ts +5 -0
  975. package/web/.next/standalone/packages/web/src/app/api/remote-access/route.ts +115 -0
  976. package/web/.next/standalone/packages/web/src/app/api/sessions/[id]/feed/stream/route.ts +8 -0
  977. package/web/.next/standalone/packages/web/src/app/api/sessions/[id]/interrupt/route.ts +8 -0
  978. package/web/.next/standalone/packages/web/src/app/api/sessions/[id]/preview/dom/route.ts +37 -0
  979. package/web/.next/standalone/packages/web/src/app/api/sessions/[id]/preview/route.test.ts +141 -0
  980. package/web/.next/standalone/packages/web/src/app/api/sessions/[id]/preview/route.ts +90 -0
  981. package/web/.next/standalone/packages/web/src/app/api/sessions/[id]/preview/screenshot/route.ts +43 -0
  982. package/web/.next/standalone/packages/web/src/app/auth/grant/route.ts +3 -28
  983. package/web/.next/standalone/packages/web/src/app/layout.tsx +4 -2
  984. package/web/.next/standalone/packages/web/src/app/page.tsx +32 -3
  985. package/web/.next/standalone/packages/web/src/app/sessions/[id]/page.tsx +36 -3
  986. package/web/.next/standalone/packages/web/src/app/sign-in/[[...sign-in]]/page.tsx +20 -2
  987. package/web/.next/standalone/packages/web/src/app/unlock/page.tsx +29 -7
  988. package/web/.next/standalone/packages/web/src/components/Dashboard.tsx +8 -4
  989. package/web/.next/standalone/packages/web/src/components/board/WorkspaceKanban.tsx +1524 -213
  990. package/web/.next/standalone/packages/web/src/components/layout/AppShell.tsx +30 -14
  991. package/web/.next/standalone/packages/web/src/components/layout/AppUpdateNotice.tsx +345 -0
  992. package/web/.next/standalone/packages/web/src/components/layout/WorkspaceSidebarPanel.tsx +1 -1
  993. package/web/.next/standalone/packages/web/src/components/sessions/ChatPanel.tsx +614 -130
  994. package/web/.next/standalone/packages/web/src/components/sessions/SessionDetail.tsx +33 -6
  995. package/web/.next/standalone/packages/web/src/components/sessions/SessionOverview.tsx +0 -57
  996. package/web/.next/standalone/packages/web/src/components/sessions/SessionPreview.tsx +1143 -0
  997. package/web/.next/standalone/packages/web/src/components/sessions/SessionRuntimeStatusBar.tsx +215 -0
  998. package/web/.next/standalone/packages/web/src/features/dashboard/DashboardClient.tsx +1049 -329
  999. package/web/.next/standalone/packages/web/src/features/sessions/SessionPageClient.tsx +9 -17
  1000. package/web/.next/standalone/packages/web/src/hooks/useAgents.ts +5 -0
  1001. package/web/.next/standalone/packages/web/src/hooks/usePreferences.ts +4 -8
  1002. package/web/.next/standalone/packages/web/src/hooks/useResponsiveSidebarState.ts +46 -0
  1003. package/web/.next/standalone/packages/web/src/hooks/useSessionFeed.ts +57 -3
  1004. package/web/.next/standalone/packages/web/src/lib/auth.test.ts +98 -0
  1005. package/web/.next/standalone/packages/web/src/lib/auth.ts +88 -54
  1006. package/web/.next/standalone/packages/web/src/lib/chatFeed.ts +4 -4
  1007. package/web/.next/standalone/packages/web/src/lib/devPreviewBrowser.ts +608 -0
  1008. package/web/.next/standalone/packages/web/src/lib/edgeAuth.test.ts +14 -25
  1009. package/web/.next/standalone/packages/web/src/lib/edgeAuth.ts +39 -52
  1010. package/web/.next/standalone/packages/web/src/lib/guardedRustProxy.ts +30 -2
  1011. package/web/.next/standalone/packages/web/src/lib/knownAgents.ts +125 -0
  1012. package/web/.next/standalone/packages/web/src/lib/liveEvents.ts +50 -3
  1013. package/web/.next/standalone/packages/web/src/lib/modelAccess.ts +7 -0
  1014. package/web/.next/standalone/packages/web/src/lib/previewSession.test.ts +109 -0
  1015. package/web/.next/standalone/packages/web/src/lib/previewSession.ts +216 -0
  1016. package/web/.next/standalone/packages/web/src/lib/previewTypes.ts +75 -0
  1017. package/web/.next/standalone/packages/web/src/lib/projectConfigSync.ts +13 -2
  1018. package/web/.next/standalone/packages/web/src/lib/proxyRoutes.ts +1 -1
  1019. package/web/.next/standalone/packages/web/src/lib/remoteAccess.test.ts +118 -0
  1020. package/web/.next/standalone/packages/web/src/lib/remoteAccess.ts +245 -0
  1021. package/web/.next/standalone/packages/web/src/lib/remoteAccessManager.ts +513 -0
  1022. package/web/.next/standalone/packages/web/src/lib/remoteAccessRuntime.ts +117 -0
  1023. package/web/.next/standalone/packages/web/src/lib/remoteAuth.test.ts +15 -0
  1024. package/web/.next/standalone/packages/web/src/lib/remoteAuth.ts +8 -65
  1025. package/web/.next/standalone/packages/web/src/lib/runtimeAgentModels/amp.ts +42 -0
  1026. package/web/.next/standalone/packages/web/src/lib/runtimeAgentModels/ccr.ts +47 -0
  1027. package/web/.next/standalone/packages/web/src/lib/runtimeAgentModels/claude.ts +179 -0
  1028. package/web/.next/standalone/packages/web/src/lib/runtimeAgentModels/codex.ts +211 -0
  1029. package/web/.next/standalone/packages/web/src/lib/runtimeAgentModels/copilot.ts +136 -0
  1030. package/web/.next/standalone/packages/web/src/lib/runtimeAgentModels/cursor.ts +39 -0
  1031. package/web/.next/standalone/packages/web/src/lib/runtimeAgentModels/droid.ts +103 -0
  1032. package/web/.next/standalone/packages/web/src/lib/runtimeAgentModels/gemini.ts +65 -0
  1033. package/web/.next/standalone/packages/web/src/lib/runtimeAgentModels/helpers.ts +409 -0
  1034. package/web/.next/standalone/packages/web/src/lib/runtimeAgentModels/index.ts +127 -0
  1035. package/web/.next/standalone/packages/web/src/lib/runtimeAgentModels/opencode.ts +138 -0
  1036. package/web/.next/standalone/packages/web/src/lib/runtimeAgentModels/qwen.ts +50 -0
  1037. package/web/.next/standalone/packages/web/src/lib/runtimeAgentModels/types.ts +78 -0
  1038. package/web/.next/standalone/packages/web/src/lib/runtimeAgentModelsShared.ts +9 -0
  1039. package/web/.next/standalone/packages/web/src/lib/rustBackendProxy.ts +29 -3
  1040. package/web/.next/standalone/packages/web/src/lib/sessionModelCatalog.ts +56 -0
  1041. package/web/.next/standalone/packages/web/src/lib/sessionRuntimeStatus.ts +152 -0
  1042. package/web/.next/standalone/packages/web/src/lib/types.ts +32 -0
  1043. package/web/.next/standalone/packages/web/src/proxy.ts +2 -98
  1044. package/web/.next/static/{8a_zZln8ezVAo0jAilwbF → E4-NvSai1Ps20r9dtdpps}/_clientMiddlewareManifest.json +0 -4
  1045. package/web/.next/static/chunks/006a91a252482204.js +1 -0
  1046. package/web/.next/static/chunks/07f3b9a104ce0ff4.js +1 -0
  1047. package/web/.next/static/chunks/1004422d31074d62.js +1 -0
  1048. package/web/.next/static/chunks/{12d9b4273416fe9b.js → 28eac764d6544827.js} +1 -1
  1049. package/web/.next/static/chunks/2e2e8fd2ceca47dc.js +6 -0
  1050. package/web/.next/static/chunks/30ababddac1b82dc.js +1 -0
  1051. package/web/.next/static/chunks/3349bdab17ed1183.js +1 -0
  1052. package/web/.next/static/chunks/3770166bed1577ce.js +4 -0
  1053. package/web/.next/static/chunks/4c3afea55dd8bc93.js +1 -0
  1054. package/web/.next/static/chunks/57858ac28cbf124d.js +1 -0
  1055. package/web/.next/static/chunks/7fd2a83e9e74f215.js +1 -0
  1056. package/web/.next/static/chunks/91e9e111a2536f92.js +1 -0
  1057. package/web/.next/static/chunks/aabc80195233b4da.js +1 -0
  1058. package/web/.next/static/chunks/bf82908a598c6de5.css +3 -0
  1059. package/web/.next/static/chunks/d6a81d2f8b98b4be.js +1 -0
  1060. package/web/.next/static/chunks/e9d0e95bbaa0f4fb.js +1 -0
  1061. package/web/.next/static/chunks/ebaa0c535c4135f1.js +1 -0
  1062. package/web/.next/static/chunks/{turbopack-57373a2ee9f56180.js → turbopack-49f4119854e8206e.js} +1 -1
  1063. package/web/.next/standalone/packages/web/.next/server/app/index.html +0 -1
  1064. package/web/.next/standalone/packages/web/.next/server/app/index.meta +0 -14
  1065. package/web/.next/standalone/packages/web/.next/server/app/index.rsc +0 -24
  1066. package/web/.next/standalone/packages/web/.next/server/app/index.segments/__PAGE__.segment.rsc +0 -9
  1067. package/web/.next/standalone/packages/web/.next/server/app/index.segments/_full.segment.rsc +0 -24
  1068. package/web/.next/standalone/packages/web/.next/server/app/index.segments/_head.segment.rsc +0 -6
  1069. package/web/.next/standalone/packages/web/.next/server/app/index.segments/_index.segment.rsc +0 -6
  1070. package/web/.next/standalone/packages/web/.next/server/app/index.segments/_tree.segment.rsc +0 -7
  1071. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__0074ebac._.js +0 -3
  1072. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__03a6b3e6._.js +0 -3
  1073. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__049daed6._.js +0 -3
  1074. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__09c3bdaf._.js +0 -7
  1075. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__137c9740._.js +0 -3
  1076. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__14949257._.js +0 -80
  1077. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__15594e11._.js +0 -3
  1078. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__159ecc1b._.js +0 -3
  1079. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__171dd44e._.js +0 -3
  1080. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__177505ca._.js +0 -3
  1081. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__18aa1fa3._.js +0 -3
  1082. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__1c3521a3._.js +0 -3
  1083. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__1c793b78._.js +0 -3
  1084. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__22fbbc7b._.js +0 -3
  1085. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__25bbe81a._.js +0 -3
  1086. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__2d10de49._.js +0 -3
  1087. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__30442998._.js +0 -3
  1088. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__31d22800._.js +0 -3
  1089. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__3d6b30a3._.js +0 -14
  1090. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__3d7ad620._.js +0 -3
  1091. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__44892736._.js +0 -3
  1092. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__495221b1._.js +0 -3
  1093. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__4ff9e8b0._.js +0 -3
  1094. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__54eb1ef0._.js +0 -3
  1095. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__5c375e13._.js +0 -3
  1096. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__6362697f._.js +0 -3
  1097. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__69b36e36._.js +0 -3
  1098. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__6badbf4e._.js +0 -3
  1099. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__6c4cd852._.js +0 -3
  1100. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__6f7b329b._.js +0 -3
  1101. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__70b7af90._.js +0 -3
  1102. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__71077192._.js +0 -3
  1103. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__758687ca._.js +0 -3
  1104. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__7604e43b._.js +0 -3
  1105. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__77b23eae._.js +0 -3
  1106. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__78650ac9._.js +0 -3
  1107. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__789107eb._.js +0 -3
  1108. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__78c062a8._.js +0 -3
  1109. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__78c4bb1e._.js +0 -3
  1110. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__790d1d4b._.js +0 -3
  1111. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__8132442f._.js +0 -3
  1112. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__833a2cd9._.js +0 -3
  1113. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__85d6ae4c._.js +0 -3
  1114. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__8d933120._.js +0 -3
  1115. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__90ac5665._.js +0 -3
  1116. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__92a4f9bf._.js +0 -3
  1117. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__93d550e2._.js +0 -3
  1118. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__96e59c1f._.js +0 -3
  1119. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__9c1d09aa._.js +0 -3
  1120. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__9d98fee2._.js +0 -3
  1121. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__9fcf6265._.js +0 -3
  1122. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__a5b78741._.js +0 -3
  1123. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__a8a4b101._.js +0 -3
  1124. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__a8d11727._.js +0 -3
  1125. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__b2e0e81c._.js +0 -3
  1126. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__bf756716._.js +0 -3
  1127. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__c09452b3._.js +0 -3
  1128. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__c3c6a7bf._.js +0 -3
  1129. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__c43dcff1._.js +0 -3
  1130. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__c923cbdc._.js +0 -3
  1131. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__ce993e7b._.js +0 -3
  1132. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__cfbdd2bf._.js +0 -3
  1133. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__d1d8bfb5._.js +0 -3
  1134. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__d4d1744d._.js +0 -3
  1135. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__d8852803._.js +0 -3
  1136. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__ea1961bd._.js +0 -3
  1137. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__ee8a3221._.js +0 -3
  1138. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__ef8c815b._.js +0 -3
  1139. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__ef918d06._.js +0 -3
  1140. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__f3693403._.js +0 -3
  1141. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__f62cac3a._.js +0 -3
  1142. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__f73117e9._.js +0 -3
  1143. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__f7651519._.js +0 -3
  1144. package/web/.next/standalone/packages/web/.next/server/chunks/[root-of-the-server]__fc6ffe6c._.js +0 -3
  1145. package/web/.next/standalone/packages/web/.next/server/chunks/node_modules_c59ce641._.js +0 -52
  1146. package/web/.next/standalone/packages/web/.next/server/chunks/node_modules_next_3f8eedde._.js +0 -3
  1147. package/web/.next/standalone/packages/web/.next/server/chunks/node_modules_next_9a15df2c._.js +0 -14
  1148. package/web/.next/standalone/packages/web/.next/server/chunks/node_modules_next_dist_2175c4f5._.js +0 -6
  1149. package/web/.next/standalone/packages/web/.next/server/chunks/ssr/[root-of-the-server]__09178ceb._.js +0 -3
  1150. package/web/.next/standalone/packages/web/.next/server/chunks/ssr/[root-of-the-server]__404c1aeb._.js +0 -3
  1151. package/web/.next/standalone/packages/web/.next/server/chunks/ssr/[root-of-the-server]__4c215c94._.js +0 -3
  1152. package/web/.next/standalone/packages/web/.next/server/chunks/ssr/[root-of-the-server]__504277b5._.js +0 -3
  1153. package/web/.next/standalone/packages/web/.next/server/chunks/ssr/[root-of-the-server]__6622b514._.js +0 -4
  1154. package/web/.next/standalone/packages/web/.next/server/chunks/ssr/[root-of-the-server]__869d9ac0._.js +0 -4
  1155. package/web/.next/standalone/packages/web/.next/server/chunks/ssr/[root-of-the-server]__9dc23e5a._.js +0 -3
  1156. package/web/.next/standalone/packages/web/.next/server/chunks/ssr/[root-of-the-server]__b3463b25._.js +0 -3
  1157. package/web/.next/standalone/packages/web/.next/server/chunks/ssr/[root-of-the-server]__d6c32514._.js +0 -3
  1158. package/web/.next/standalone/packages/web/.next/server/chunks/ssr/[root-of-the-server]__dd8d1ff5._.js +0 -3
  1159. package/web/.next/standalone/packages/web/.next/server/chunks/ssr/[root-of-the-server]__e93a8bf2._.js +0 -3
  1160. package/web/.next/standalone/packages/web/.next/server/chunks/ssr/[root-of-the-server]__f3a0805b._.js +0 -26
  1161. package/web/.next/standalone/packages/web/.next/server/chunks/ssr/[root-of-the-server]__f9e4d8f6._.js +0 -3
  1162. package/web/.next/standalone/packages/web/.next/server/chunks/ssr/_3acfb388._.js +0 -3
  1163. package/web/.next/standalone/packages/web/.next/server/chunks/ssr/_54e5c07e._.js +0 -3
  1164. package/web/.next/standalone/packages/web/.next/server/chunks/ssr/_5edc4d99._.js +0 -3
  1165. package/web/.next/standalone/packages/web/.next/server/chunks/ssr/_668c9201._.js +0 -3
  1166. package/web/.next/standalone/packages/web/.next/server/chunks/ssr/node_modules_@clerk_5c577fb4._.js +0 -22
  1167. package/web/.next/standalone/packages/web/.next/server/chunks/ssr/node_modules_@clerk_nextjs_dist_esm_app-router_a719fbda._.js +0 -3
  1168. package/web/.next/standalone/packages/web/.next/server/chunks/ssr/node_modules_f2ebd7a9._.js +0 -3
  1169. package/web/.next/standalone/packages/web/.next/server/chunks/ssr/node_modules_next_06f89723._.js +0 -6
  1170. package/web/.next/standalone/packages/web/.next/server/chunks/ssr/node_modules_next_dist_aa203534._.js +0 -3
  1171. package/web/.next/standalone/packages/web/.next/server/chunks/ssr/packages_web_src_79316445._.js +0 -3
  1172. package/web/.next/standalone/packages/web/.next/server/chunks/ssr/packages_web_src_a078c137._.js +0 -3
  1173. package/web/.next/standalone/packages/web/.next/server/chunks/ssr/packages_web_src_app_page_tsx_cd282e82._.js +0 -3
  1174. package/web/.next/standalone/packages/web/.next/server/chunks/ssr/packages_web_src_app_unlock_UnlockForm_tsx_ce3149a7._.js +0 -3
  1175. package/web/.next/standalone/packages/web/.next/server/chunks/ssr/packages_web_src_components_556f498f._.js +0 -3
  1176. package/web/.next/standalone/packages/web/.next/static/chunks/25438e9094804f85.js +0 -1
  1177. package/web/.next/standalone/packages/web/.next/static/chunks/38c2e6a114505dfb.js +0 -1
  1178. package/web/.next/standalone/packages/web/.next/static/chunks/42170782dc03a5a6.js +0 -1
  1179. package/web/.next/standalone/packages/web/.next/static/chunks/4f46b791ea244c81.js +0 -6
  1180. package/web/.next/standalone/packages/web/.next/static/chunks/524a7c2a8e85ea2f.js +0 -1
  1181. package/web/.next/standalone/packages/web/.next/static/chunks/5672ef74a562c5dd.js +0 -1
  1182. package/web/.next/standalone/packages/web/.next/static/chunks/710591a828e2bb9d.js +0 -1
  1183. package/web/.next/standalone/packages/web/.next/static/chunks/72c822cfe5b6f4f2.js +0 -4
  1184. package/web/.next/standalone/packages/web/.next/static/chunks/870a993d28314a90.js +0 -1
  1185. package/web/.next/standalone/packages/web/.next/static/chunks/8c120e4e5b844646.js +0 -1
  1186. package/web/.next/standalone/packages/web/.next/static/chunks/8ec81b945f12169b.js +0 -1
  1187. package/web/.next/standalone/packages/web/.next/static/chunks/aa158726d4a10331.js +0 -1
  1188. package/web/.next/standalone/packages/web/.next/static/chunks/adf48bd54f32b061.js +0 -1
  1189. package/web/.next/standalone/packages/web/.next/static/chunks/c5caacf383990e7b.js +0 -1
  1190. package/web/.next/standalone/packages/web/.next/static/chunks/d3cd3cf58c908ec9.js +0 -1
  1191. package/web/.next/standalone/packages/web/.next/static/chunks/df9658182f4f7d54.css +0 -3
  1192. package/web/.next/standalone/packages/web/src/app/unlock/UnlockForm.tsx +0 -98
  1193. package/web/.next/standalone/packages/web/src/lib/editorLinks.ts +0 -51
  1194. package/web/.next/standalone/packages/web/src/lib/runtimeAgentModels.ts +0 -788
  1195. package/web/.next/static/chunks/25438e9094804f85.js +0 -1
  1196. package/web/.next/static/chunks/38c2e6a114505dfb.js +0 -1
  1197. package/web/.next/static/chunks/42170782dc03a5a6.js +0 -1
  1198. package/web/.next/static/chunks/4f46b791ea244c81.js +0 -6
  1199. package/web/.next/static/chunks/524a7c2a8e85ea2f.js +0 -1
  1200. package/web/.next/static/chunks/5672ef74a562c5dd.js +0 -1
  1201. package/web/.next/static/chunks/710591a828e2bb9d.js +0 -1
  1202. package/web/.next/static/chunks/72c822cfe5b6f4f2.js +0 -4
  1203. package/web/.next/static/chunks/870a993d28314a90.js +0 -1
  1204. package/web/.next/static/chunks/8c120e4e5b844646.js +0 -1
  1205. package/web/.next/static/chunks/8ec81b945f12169b.js +0 -1
  1206. package/web/.next/static/chunks/aa158726d4a10331.js +0 -1
  1207. package/web/.next/static/chunks/adf48bd54f32b061.js +0 -1
  1208. package/web/.next/static/chunks/c5caacf383990e7b.js +0 -1
  1209. package/web/.next/static/chunks/d3cd3cf58c908ec9.js +0 -1
  1210. package/web/.next/static/chunks/df9658182f4f7d54.css +0 -3
  1211. /package/web/.next/standalone/packages/web/.next/static/{8a_zZln8ezVAo0jAilwbF → E4-NvSai1Ps20r9dtdpps}/_buildManifest.js +0 -0
  1212. /package/web/.next/standalone/packages/web/.next/static/{8a_zZln8ezVAo0jAilwbF → E4-NvSai1Ps20r9dtdpps}/_ssgManifest.js +0 -0
  1213. /package/web/.next/static/{8a_zZln8ezVAo0jAilwbF → E4-NvSai1Ps20r9dtdpps}/_buildManifest.js +0 -0
  1214. /package/web/.next/static/{8a_zZln8ezVAo0jAilwbF → E4-NvSai1Ps20r9dtdpps}/_ssgManifest.js +0 -0
@@ -1,6 +1,7 @@
1
1
  "use client";
2
2
 
3
3
  import dynamic from "next/dynamic";
4
+ import { usePathname, useRouter, useSearchParams } from "next/navigation";
4
5
  import { type FormEvent, memo, useCallback, useEffect, useMemo, useState } from "react";
5
6
  import * as DropdownMenu from "@radix-ui/react-dropdown-menu";
6
7
  import { GitBranchIcon, LockIcon, MarkGithubIcon, RepoIcon } from "@primer/octicons-react";
@@ -16,7 +17,6 @@ import {
16
17
  type AgentReasoningOption,
17
18
  type DashboardRole,
18
19
  type ModelAccessPreferences,
19
- type TrustedHeaderAccessProvider,
20
20
  } from "@conductor-oss/core/types";
21
21
  import type { IconType } from "react-icons";
22
22
  import { SiNotion, SiObsidian } from "react-icons/si";
@@ -48,9 +48,15 @@ import {
48
48
  } from "lucide-react";
49
49
  import type { DashboardSession } from "@/lib/types";
50
50
  import { normalizeAgentName } from "@/lib/agentUtils";
51
+ import {
52
+ getKnownAgent,
53
+ KNOWN_AGENTS,
54
+ KNOWN_AGENT_ORDER,
55
+ } from "@/lib/knownAgents";
51
56
  import { useSessions } from "@/hooks/useSessions";
52
57
  import { useConfig, type ConfigProject } from "@/hooks/useConfig";
53
58
  import { useAgents } from "@/hooks/useAgents";
59
+ import { useResponsiveSidebarState } from "@/hooks/useResponsiveSidebarState";
54
60
  import { AppShell } from "@/components/layout/AppShell";
55
61
  import { TopBar } from "@/components/layout/TopBar";
56
62
  import { AgentTileIcon } from "@/components/AgentTileIcon";
@@ -65,42 +71,17 @@ import {
65
71
  } from "@/lib/runtimeAgentModelsShared";
66
72
  import { WorkspaceOverview } from "@/features/dashboard/components/WorkspaceOverview";
67
73
 
68
- const EXECUTOR_ORDER = [
69
- "codex",
70
- "gemini",
71
- "qwen-code",
72
- "droid",
73
- "claude-code",
74
- "amp",
75
- "opencode",
76
- "github-copilot",
77
- "cursor-cli",
78
- "ccr",
79
- ];
80
-
81
74
  const DEFAULT_AGENT = "claude-code";
75
+ type DashboardWorkspaceView = "chat" | "board";
82
76
 
83
- const EXECUTOR_LABELS: Record<string, string> = {
84
- codex: "Codex",
85
- gemini: "Gemini",
86
- "qwen-code": "Qwen Code",
87
- droid: "Droid",
88
- "claude-code": "Claude Code",
89
- amp: "Amp",
90
- opencode: "Opencode",
91
- "github-copilot": "Copilot",
92
- "cursor-cli": "Cursor Agent",
93
- ccr: "CCR",
94
- };
77
+ function normalizeDashboardQueryValue(value: string | null): string | null {
78
+ const trimmed = value?.trim();
79
+ return trimmed && trimmed.length > 0 ? trimmed : null;
80
+ }
95
81
 
96
- const AGENT_SETUP_URLS: Record<string, string> = {
97
- "claude-code": "https://claude.ai/",
98
- codex: "https://chatgpt.com/codex",
99
- gemini: "https://aistudio.google.com/",
100
- "qwen-code": "https://chat.qwen.ai/",
101
- opencode: "https://opencode.ai/",
102
- "github-copilot": "https://github.com/settings/copilot",
103
- };
82
+ function resolveDashboardWorkspaceView(value: string | null): DashboardWorkspaceView {
83
+ return value === "board" ? "board" : "chat";
84
+ }
104
85
 
105
86
  const SessionDetail = dynamic(
106
87
  () => import("@/components/sessions/SessionDetail").then((mod) => mod.SessionDetail),
@@ -125,8 +106,8 @@ const WorkspaceKanban = dynamic(
125
106
  );
126
107
 
127
108
  function getAgentLabel(value: string): string {
128
- const normalized = normalizeAgentName(value);
129
- if (EXECUTOR_LABELS[normalized]) return EXECUTOR_LABELS[normalized];
109
+ const known = getKnownAgent(value);
110
+ if (known?.label) return known.label;
130
111
  return value
131
112
  .split(/[-_\s]+/g)
132
113
  .filter(Boolean)
@@ -259,6 +240,7 @@ type CreateSessionOptions = {
259
240
  type LinkedBoardTask = {
260
241
  id: string;
261
242
  text: string;
243
+ issueId: string | null;
262
244
  taskRef: string | null;
263
245
  type: string | null;
264
246
  priority: string | null;
@@ -294,9 +276,8 @@ type PreferencesPayload = {
294
276
  onboardingAcknowledged: boolean;
295
277
  codingAgent: string;
296
278
  ide: string;
297
- remoteSshHost: string;
298
- remoteSshUser: string;
299
279
  markdownEditor: string;
280
+ markdownEditorPath: string;
300
281
  modelAccess: ModelAccessPreferences;
301
282
  notifications: {
302
283
  soundEnabled: boolean;
@@ -312,7 +293,7 @@ type AccessIdentitySummary = {
312
293
  };
313
294
 
314
295
  function getLinkedTaskValue(task: LinkedBoardTask): string {
315
- return task.taskRef?.trim() || task.id;
296
+ return task.issueId?.trim() || task.taskRef?.trim() || task.id;
316
297
  }
317
298
 
318
299
  function getLinkedTaskTitle(text: string): string {
@@ -325,7 +306,7 @@ type AccessSettingsPayload = {
325
306
  defaultRole: DashboardRole;
326
307
  trustedHeaders: {
327
308
  enabled: boolean;
328
- provider: TrustedHeaderAccessProvider;
309
+ provider: "cloudflare-access";
329
310
  emailHeader: string;
330
311
  jwtHeader: string;
331
312
  teamDomain: string;
@@ -342,6 +323,31 @@ type AccessSettingsPayload = {
342
323
  current: AccessIdentitySummary;
343
324
  };
344
325
 
326
+ type RemoteAccessPayload = {
327
+ publicUrl: string | null;
328
+ connectUrl: string | null;
329
+ shareable: boolean;
330
+ status: "disabled" | "starting" | "ready" | "error";
331
+ provider: "tailscale" | null;
332
+ recommendedProvider: "tailscale" | null;
333
+ localUrl: string | null;
334
+ managed: boolean;
335
+ installed: boolean;
336
+ connected: boolean;
337
+ canAutoInstall: boolean;
338
+ autoInstallMethod: "brew" | null;
339
+ lastError: string | null;
340
+ startedAt: string | null;
341
+ updatedAt: string | null;
342
+ mode: "cloudflare-access" | "private-network" | "enterprise-only" | "generic-header" | "clerk" | "local-only" | "misconfigured" | "unsafe-public";
343
+ title: string;
344
+ description: string;
345
+ warnings: string[];
346
+ nextSteps: string[];
347
+ };
348
+
349
+ type RemoteAccessAction = "enable" | "rotate" | "disable";
350
+
345
351
  type RepositoryPathHealth = {
346
352
  exists: boolean;
347
353
  isGitRepository: boolean;
@@ -354,6 +360,7 @@ type RepositorySettingsPayload = {
354
360
  repo: string;
355
361
  path: string;
356
362
  agent: string;
363
+ agentPermissions: string;
357
364
  agentModel: string;
358
365
  agentReasoningEffort: string;
359
366
  workspaceMode: string;
@@ -362,6 +369,12 @@ type RepositorySettingsPayload = {
362
369
  defaultWorkingDirectory: string;
363
370
  defaultBranch: string;
364
371
  devServerScript: string;
372
+ devServerCwd: string;
373
+ devServerUrl: string;
374
+ devServerPort: string;
375
+ devServerHost: string;
376
+ devServerPath: string;
377
+ devServerHttps: boolean;
365
378
  setupScript: string;
366
379
  runSetupInParallel: boolean;
367
380
  cleanupScript: string;
@@ -383,6 +396,9 @@ type AgentSetupState = {
383
396
  configured: boolean;
384
397
  homepage: string | null;
385
398
  description: string | null;
399
+ installHint: string | null;
400
+ installUrl: string | null;
401
+ setupUrl: string | null;
386
402
  };
387
403
 
388
404
  type PreferencesDialogMode = "onboarding" | "settings";
@@ -465,23 +481,19 @@ function normalizePreferences(value: unknown, fallbackAgent: string): Preference
465
481
  const ide = typeof payload["ide"] === "string" && payload["ide"].trim().length > 0
466
482
  ? payload["ide"].trim()
467
483
  : "vscode";
468
- const remoteSshHost = typeof payload["remoteSshHost"] === "string" && payload["remoteSshHost"].trim().length > 0
469
- ? payload["remoteSshHost"].trim()
470
- : "";
471
- const remoteSshUser = typeof payload["remoteSshUser"] === "string" && payload["remoteSshUser"].trim().length > 0
472
- ? payload["remoteSshUser"].trim()
473
- : "";
474
484
  const markdownEditor = typeof payload["markdownEditor"] === "string" && payload["markdownEditor"].trim().length > 0
475
485
  ? payload["markdownEditor"].trim()
476
486
  : "obsidian";
487
+ const markdownEditorPath = typeof payload["markdownEditorPath"] === "string"
488
+ ? payload["markdownEditorPath"].trim()
489
+ : "";
477
490
 
478
491
  return {
479
492
  onboardingAcknowledged: payload["onboardingAcknowledged"] === true,
480
493
  codingAgent,
481
494
  ide,
482
- remoteSshHost,
483
- remoteSshUser,
484
495
  markdownEditor,
496
+ markdownEditorPath,
485
497
  modelAccess: normalizeModelAccessPreferences(payload["modelAccess"]),
486
498
  notifications: {
487
499
  soundEnabled: notifications["soundEnabled"] !== false,
@@ -510,6 +522,14 @@ function normalizeMultilineList(value: unknown): string {
510
522
  .join("\n");
511
523
  }
512
524
 
525
+ function normalizeStringArray(value: unknown): string[] {
526
+ if (!Array.isArray(value)) return [];
527
+ return value
528
+ .filter((item): item is string => typeof item === "string")
529
+ .map((item) => item.trim())
530
+ .filter(Boolean);
531
+ }
532
+
513
533
  function normalizeAccessSettings(value: unknown, summary?: unknown): AccessSettingsPayload {
514
534
  const payload = toObject(value);
515
535
  const trustedHeaders = toObject(payload["trustedHeaders"]);
@@ -523,11 +543,11 @@ function normalizeAccessSettings(value: unknown, summary?: unknown): AccessSetti
523
543
  const currentRoleRaw = current["role"];
524
544
 
525
545
  return {
526
- requireAuth: payload["requireAuth"] === true,
546
+ requireAuth: payload["requireAuth"] === true || trustedHeaders["enabled"] === true,
527
547
  defaultRole,
528
548
  trustedHeaders: {
529
549
  enabled: trustedHeaders["enabled"] === true,
530
- provider: trustedHeaders["provider"] === "generic" ? "generic" : "cloudflare-access",
550
+ provider: "cloudflare-access",
531
551
  emailHeader: typeof trustedHeaders["emailHeader"] === "string" && trustedHeaders["emailHeader"].trim().length > 0
532
552
  ? trustedHeaders["emailHeader"].trim()
533
553
  : "Cf-Access-Authenticated-User-Email",
@@ -564,6 +584,108 @@ function normalizeAccessSettings(value: unknown, summary?: unknown): AccessSetti
564
584
  };
565
585
  }
566
586
 
587
+ function normalizeRemoteAccess(value: unknown): RemoteAccessPayload {
588
+ const payload = toObject(value);
589
+ const mode = payload["mode"];
590
+ const status = payload["status"];
591
+ const provider = payload["provider"];
592
+ const autoInstallMethod = payload["autoInstallMethod"];
593
+
594
+ return {
595
+ publicUrl: typeof payload["publicUrl"] === "string" && payload["publicUrl"].trim().length > 0
596
+ ? payload["publicUrl"].trim()
597
+ : null,
598
+ connectUrl: typeof payload["connectUrl"] === "string" && payload["connectUrl"].trim().length > 0
599
+ ? payload["connectUrl"].trim()
600
+ : null,
601
+ shareable: payload["shareable"] === true,
602
+ status:
603
+ status === "starting"
604
+ || status === "ready"
605
+ || status === "error"
606
+ || status === "disabled"
607
+ ? status
608
+ : "disabled",
609
+ provider: provider === "tailscale" ? provider : null,
610
+ recommendedProvider:
611
+ payload["recommendedProvider"] === "tailscale"
612
+ ? payload["recommendedProvider"]
613
+ : null,
614
+ localUrl: typeof payload["localUrl"] === "string" && payload["localUrl"].trim().length > 0
615
+ ? payload["localUrl"].trim()
616
+ : null,
617
+ managed: payload["managed"] === true,
618
+ installed: payload["installed"] === true,
619
+ connected: payload["connected"] === true,
620
+ canAutoInstall: payload["canAutoInstall"] === true,
621
+ autoInstallMethod: autoInstallMethod === "brew" ? "brew" : null,
622
+ lastError: typeof payload["lastError"] === "string" && payload["lastError"].trim().length > 0
623
+ ? payload["lastError"].trim()
624
+ : null,
625
+ startedAt: typeof payload["startedAt"] === "string" && payload["startedAt"].trim().length > 0
626
+ ? payload["startedAt"].trim()
627
+ : null,
628
+ updatedAt: typeof payload["updatedAt"] === "string" && payload["updatedAt"].trim().length > 0
629
+ ? payload["updatedAt"].trim()
630
+ : null,
631
+ mode:
632
+ mode === "cloudflare-access"
633
+ || mode === "private-network"
634
+ || mode === "enterprise-only"
635
+ || mode === "generic-header"
636
+ || mode === "clerk"
637
+ || mode === "local-only"
638
+ || mode === "misconfigured"
639
+ || mode === "unsafe-public"
640
+ ? mode
641
+ : "local-only",
642
+ title: typeof payload["title"] === "string" && payload["title"].trim().length > 0
643
+ ? payload["title"].trim()
644
+ : "Remote access",
645
+ description: typeof payload["description"] === "string" && payload["description"].trim().length > 0
646
+ ? payload["description"].trim()
647
+ : "",
648
+ warnings: normalizeStringArray(payload["warnings"]),
649
+ nextSteps: normalizeStringArray(payload["nextSteps"]),
650
+ };
651
+ }
652
+
653
+ function getRemoteAccessModeLabel(mode: RemoteAccessPayload["mode"]): string {
654
+ switch (mode) {
655
+ case "cloudflare-access":
656
+ return "Cloudflare Access";
657
+ case "private-network":
658
+ return "Private network";
659
+ case "enterprise-only":
660
+ return "Enterprise only";
661
+ case "generic-header":
662
+ return "Legacy mode blocked";
663
+ case "clerk":
664
+ return "Clerk";
665
+ case "misconfigured":
666
+ return "Auth required";
667
+ case "unsafe-public":
668
+ return "Blocked until protected";
669
+ case "local-only":
670
+ default:
671
+ return "Local only";
672
+ }
673
+ }
674
+
675
+ function getRemoteAccessStatusLabel(status: RemoteAccessPayload["status"]): string {
676
+ switch (status) {
677
+ case "starting":
678
+ return "Starting";
679
+ case "ready":
680
+ return "Ready";
681
+ case "error":
682
+ return "Error";
683
+ case "disabled":
684
+ default:
685
+ return "Disabled";
686
+ }
687
+ }
688
+
567
689
  function emptyModelSelection(): ModelSelectionState {
568
690
  return {
569
691
  catalogModel: "",
@@ -734,8 +856,9 @@ function resolveReasoningSelectionValue(selection: ModelSelectionState): string
734
856
 
735
857
  function getAgentModelAccessLabel(agent: string, modelAccess: ModelAccessPreferences): string | null {
736
858
  const catalog = getAgentModelCatalog(agent);
859
+ if (!catalog || catalog.accessOptions.length <= 1) return null;
737
860
  const access = resolveAgentModelAccess(agent, modelAccess);
738
- if (!catalog || !access) return null;
861
+ if (!access) return null;
739
862
 
740
863
  return catalog.accessOptions.find((option) => option.id === access)?.label ?? null;
741
864
  }
@@ -972,13 +1095,31 @@ function AgentModelSelector({
972
1095
  }
973
1096
 
974
1097
  export default function DashboardClient() {
975
- const [selectedProjectId, setSelectedProjectId] = useState<string | null>(null);
976
- const { sessions, error: sessionsError, refresh: refreshSessions } = useSessions(selectedProjectId);
977
- const { projects, error: configError, refresh: refreshConfig } = useConfig();
1098
+ const router = useRouter();
1099
+ const pathname = usePathname();
1100
+ const searchParams = useSearchParams();
1101
+ const selectedProjectId = useMemo(
1102
+ () => normalizeDashboardQueryValue(searchParams.get("project")),
1103
+ [searchParams],
1104
+ );
1105
+ const selectedSessionId = useMemo(
1106
+ () => normalizeDashboardQueryValue(searchParams.get("session")),
1107
+ [searchParams],
1108
+ );
1109
+ const workspaceView = useMemo(
1110
+ () => resolveDashboardWorkspaceView(searchParams.get("view")),
1111
+ [searchParams],
1112
+ );
1113
+ const { sessions, loading: sessionsLoading, error: sessionsError, refresh: refreshSessions } = useSessions(selectedProjectId);
1114
+ const { projects, loading: configLoading, error: configError, refresh: refreshConfig } = useConfig();
978
1115
  const { agents } = useAgents();
979
-
980
- const [selectedSessionId, setSelectedSessionId] = useState<string | null>(null);
981
- const [sidebarOpen, setSidebarOpen] = useState(true);
1116
+ const {
1117
+ mobileSidebarOpen,
1118
+ desktopSidebarOpen,
1119
+ toggleSidebar,
1120
+ closeSidebarOnMobile,
1121
+ syncSidebarForViewport,
1122
+ } = useResponsiveSidebarState();
982
1123
 
983
1124
  const [prompt, setPrompt] = useState("");
984
1125
  const [selectedAgent, setSelectedAgent] = useState("");
@@ -988,7 +1129,6 @@ export default function DashboardClient() {
988
1129
  const [newWorkspaceOpen, setNewWorkspaceOpen] = useState(false);
989
1130
  const [creatingWorkspace, setCreatingWorkspace] = useState(false);
990
1131
  const [newWorkspaceError, setNewWorkspaceError] = useState<string | null>(null);
991
- const [workspaceView, setWorkspaceView] = useState<"chat" | "board">("chat");
992
1132
  const [preferences, setPreferences] = useState<PreferencesPayload | null>(null);
993
1133
  const [preferencesLoading, setPreferencesLoading] = useState(true);
994
1134
  const [preferencesSaving, setPreferencesSaving] = useState(false);
@@ -999,30 +1139,91 @@ export default function DashboardClient() {
999
1139
  const dashboardSessions = sessions as unknown as DashboardSession[];
1000
1140
  const workspaceError = createError ?? configError ?? sessionsError ?? preferencesError;
1001
1141
 
1002
- useEffect(() => {
1003
- if (typeof window === "undefined") return;
1004
- if (window.innerWidth < 1024) {
1005
- setSidebarOpen(false);
1142
+ const navigateDashboard = useCallback((
1143
+ updates: {
1144
+ projectId?: string | null;
1145
+ sessionId?: string | null;
1146
+ workspaceView?: DashboardWorkspaceView | null;
1147
+ tab?: "overview" | "chat" | "diff" | "preview" | null;
1148
+ },
1149
+ mode: "push" | "replace" = "push",
1150
+ ) => {
1151
+ const params = new URLSearchParams(searchParams.toString());
1152
+
1153
+ const updateParam = (key: string, value: string | null | undefined) => {
1154
+ const trimmed = typeof value === "string" ? value.trim() : "";
1155
+ if (trimmed.length > 0) {
1156
+ params.set(key, trimmed);
1157
+ return;
1158
+ }
1159
+ params.delete(key);
1160
+ };
1161
+
1162
+ if ("projectId" in updates) {
1163
+ updateParam("project", updates.projectId);
1164
+ }
1165
+ if ("sessionId" in updates) {
1166
+ updateParam("session", updates.sessionId);
1167
+ }
1168
+ if ("workspaceView" in updates) {
1169
+ if (updates.workspaceView === "board") {
1170
+ params.set("view", "board");
1171
+ } else {
1172
+ params.delete("view");
1173
+ }
1174
+ }
1175
+ if ("tab" in updates) {
1176
+ if (updates.tab && updates.tab !== "chat") {
1177
+ params.set("tab", updates.tab);
1178
+ } else {
1179
+ params.delete("tab");
1180
+ }
1006
1181
  }
1007
- }, []);
1182
+
1183
+ if (!params.has("project")) {
1184
+ params.delete("view");
1185
+ }
1186
+ if (!params.has("session")) {
1187
+ params.delete("tab");
1188
+ }
1189
+
1190
+ const nextQuery = params.toString();
1191
+ const nextUrl = nextQuery.length > 0 ? `${pathname}?${nextQuery}` : pathname;
1192
+ if (mode === "replace") {
1193
+ router.replace(nextUrl, { scroll: false });
1194
+ return;
1195
+ }
1196
+ router.push(nextUrl, { scroll: false });
1197
+ }, [pathname, router, searchParams]);
1008
1198
 
1009
1199
  useEffect(() => {
1200
+ if (configLoading || configError) return;
1201
+
1010
1202
  if (projects.length === 0) {
1011
- if (selectedProjectId !== null) setSelectedProjectId(null);
1203
+ if (selectedProjectId !== null) {
1204
+ navigateDashboard({ projectId: null, workspaceView: null }, "replace");
1205
+ }
1012
1206
  return;
1013
1207
  }
1014
1208
 
1015
1209
  if (selectedProjectId !== null && !projects.some((project) => project.id === selectedProjectId)) {
1016
- setSelectedProjectId(projects[0]?.id ?? null);
1210
+ navigateDashboard(
1211
+ {
1212
+ projectId: selectedSessionId ? null : projects[0]?.id ?? null,
1213
+ workspaceView: selectedSessionId ? null : workspaceView,
1214
+ },
1215
+ "replace",
1216
+ );
1017
1217
  }
1018
- }, [projects, selectedProjectId]);
1218
+ }, [configError, configLoading, navigateDashboard, projects, selectedProjectId, selectedSessionId, workspaceView]);
1019
1219
 
1020
1220
  useEffect(() => {
1221
+ if (sessionsLoading || sessionsError || !selectedSessionId) return;
1021
1222
  if (!selectedSessionId) return;
1022
1223
  if (!dashboardSessions.some((session) => session.id === selectedSessionId)) {
1023
- setSelectedSessionId(null);
1224
+ navigateDashboard({ sessionId: null, tab: null }, "replace");
1024
1225
  }
1025
- }, [dashboardSessions, selectedSessionId]);
1226
+ }, [dashboardSessions, navigateDashboard, selectedSessionId, sessionsError, sessionsLoading]);
1026
1227
 
1027
1228
  const selectedSession = useMemo(
1028
1229
  () => dashboardSessions.find((s) => s.id === selectedSessionId) ?? null,
@@ -1050,6 +1251,9 @@ export default function DashboardClient() {
1050
1251
  : [];
1051
1252
  const opts = new Set<string>();
1052
1253
 
1254
+ for (const known of KNOWN_AGENTS) {
1255
+ opts.add(known.name);
1256
+ }
1053
1257
  for (const agent of safeAgents) {
1054
1258
  if (agent.name) {
1055
1259
  opts.add(agent.name);
@@ -1072,6 +1276,19 @@ export default function DashboardClient() {
1072
1276
 
1073
1277
  const agentStatesByName = useMemo(() => {
1074
1278
  const states: Record<string, AgentSetupState> = {};
1279
+ for (const known of KNOWN_AGENTS) {
1280
+ states[normalizeAgentName(known.name)] = {
1281
+ name: known.name,
1282
+ ready: false,
1283
+ installed: false,
1284
+ configured: false,
1285
+ homepage: known.homepage,
1286
+ description: known.description,
1287
+ installHint: known.installHint ?? null,
1288
+ installUrl: known.installUrl ?? known.homepage ?? null,
1289
+ setupUrl: known.setupUrl ?? known.homepage ?? null,
1290
+ };
1291
+ }
1075
1292
  const safeAgents = Array.isArray(agents)
1076
1293
  ? agents as Array<{
1077
1294
  name?: string;
@@ -1080,18 +1297,36 @@ export default function DashboardClient() {
1080
1297
  configured?: boolean;
1081
1298
  homepage?: string | null;
1082
1299
  description?: string | null;
1300
+ installHint?: string | null;
1301
+ installUrl?: string | null;
1302
+ setupUrl?: string | null;
1083
1303
  }>
1084
1304
  : [];
1085
1305
 
1086
1306
  for (const agent of safeAgents) {
1087
1307
  if (!agent.name) continue;
1308
+ const normalizedName = normalizeAgentName(agent.name);
1309
+ const known = getKnownAgent(agent.name);
1088
1310
  states[normalizeAgentName(agent.name)] = {
1089
- name: agent.name,
1311
+ name: known?.name ?? agent.name,
1090
1312
  ready: agent.ready === true,
1091
1313
  installed: agent.installed !== false,
1092
- configured: agent.configured !== false,
1093
- homepage: typeof agent.homepage === "string" ? agent.homepage : null,
1094
- description: typeof agent.description === "string" ? agent.description : null,
1314
+ configured: agent.configured === true,
1315
+ homepage: typeof agent.homepage === "string"
1316
+ ? agent.homepage
1317
+ : known?.homepage ?? states[normalizedName]?.homepage ?? null,
1318
+ description: typeof agent.description === "string"
1319
+ ? agent.description
1320
+ : known?.description ?? states[normalizedName]?.description ?? null,
1321
+ installHint: typeof agent.installHint === "string"
1322
+ ? agent.installHint
1323
+ : known?.installHint ?? states[normalizedName]?.installHint ?? null,
1324
+ installUrl: typeof agent.installUrl === "string"
1325
+ ? agent.installUrl
1326
+ : known?.installUrl ?? states[normalizedName]?.installUrl ?? null,
1327
+ setupUrl: typeof agent.setupUrl === "string"
1328
+ ? agent.setupUrl
1329
+ : known?.setupUrl ?? states[normalizedName]?.setupUrl ?? null,
1095
1330
  };
1096
1331
  }
1097
1332
 
@@ -1114,7 +1349,16 @@ export default function DashboardClient() {
1114
1349
 
1115
1350
  const openAgentSetup = useCallback((agentName: string) => {
1116
1351
  const normalized = normalizeAgentName(agentName);
1117
- const target = agentStatesByName[normalized]?.homepage || AGENT_SETUP_URLS[normalized];
1352
+ const agentState = agentStatesByName[normalized];
1353
+ const known = getKnownAgent(agentName);
1354
+ const target = agentState?.installed
1355
+ ? agentState?.setupUrl ?? known?.setupUrl ?? agentState?.homepage ?? known?.homepage
1356
+ : agentState?.installUrl
1357
+ ?? known?.installUrl
1358
+ ?? agentState?.setupUrl
1359
+ ?? known?.setupUrl
1360
+ ?? agentState?.homepage
1361
+ ?? known?.homepage;
1118
1362
  if (!target || typeof window === "undefined") return;
1119
1363
  window.open(target, "_blank", "noopener,noreferrer");
1120
1364
  }, [agentStatesByName]);
@@ -1232,22 +1476,6 @@ export default function DashboardClient() {
1232
1476
  }
1233
1477
  }
1234
1478
 
1235
- const toggleSidebar = useCallback(() => setSidebarOpen((prev) => !prev), []);
1236
-
1237
- const closeSidebarOnMobile = useCallback(() => {
1238
- if (typeof window !== "undefined" && window.innerWidth < 1024) {
1239
- setSidebarOpen(false);
1240
- }
1241
- }, []);
1242
-
1243
- const syncSidebarForViewport = useCallback(() => {
1244
- if (typeof window !== "undefined" && window.innerWidth < 1024) {
1245
- setSidebarOpen(false);
1246
- return;
1247
- }
1248
- setSidebarOpen(true);
1249
- }, []);
1250
-
1251
1479
  const openWorkspaceDialog = useCallback(() => {
1252
1480
  setNewWorkspaceError(null);
1253
1481
  setNewWorkspaceOpen(true);
@@ -1318,10 +1546,17 @@ export default function DashboardClient() {
1318
1546
  }
1319
1547
 
1320
1548
  setPrompt("");
1321
- setWorkspaceView("chat");
1322
1549
  syncSidebarForViewport();
1323
1550
  await refreshSessions();
1324
- setSelectedSessionId(data.session.id);
1551
+ navigateDashboard(
1552
+ {
1553
+ projectId,
1554
+ sessionId: data.session.id,
1555
+ workspaceView: "chat",
1556
+ tab: "chat",
1557
+ },
1558
+ "push",
1559
+ );
1325
1560
  } catch (err) {
1326
1561
  setCreateError(err instanceof Error ? err.message : "Failed to create workspace");
1327
1562
  } finally {
@@ -1330,6 +1565,7 @@ export default function DashboardClient() {
1330
1565
  }, [
1331
1566
  agentStatesByName,
1332
1567
  launchModelSelection,
1568
+ navigateDashboard,
1333
1569
  openAgentSetup,
1334
1570
  projects,
1335
1571
  prompt,
@@ -1363,11 +1599,11 @@ export default function DashboardClient() {
1363
1599
  }
1364
1600
 
1365
1601
  if (selectedSessionId === sessionId) {
1366
- setSelectedSessionId(null);
1602
+ navigateDashboard({ sessionId: null, tab: null }, "replace");
1367
1603
  }
1368
1604
 
1369
1605
  await refreshSessions();
1370
- }, [refreshSessions, selectedSessionId]);
1606
+ }, [navigateDashboard, refreshSessions, selectedSessionId]);
1371
1607
 
1372
1608
  const handleCreateWorkspace = useCallback(async (payload: NewWorkspacePayload) => {
1373
1609
  setCreatingWorkspace(true);
@@ -1394,33 +1630,55 @@ export default function DashboardClient() {
1394
1630
  }
1395
1631
 
1396
1632
  await refreshConfig();
1397
- setSelectedProjectId(createdProjectId);
1398
- setSelectedSessionId(null);
1399
1633
  setPrompt("");
1400
1634
  syncSidebarForViewport();
1401
1635
  setNewWorkspaceOpen(false);
1636
+ navigateDashboard(
1637
+ {
1638
+ projectId: createdProjectId,
1639
+ sessionId: null,
1640
+ workspaceView: "chat",
1641
+ tab: null,
1642
+ },
1643
+ "push",
1644
+ );
1402
1645
  } catch (err) {
1403
1646
  setNewWorkspaceError(err instanceof Error ? err.message : "Failed to add workspace");
1404
1647
  } finally {
1405
1648
  setCreatingWorkspace(false);
1406
1649
  }
1407
- }, [refreshConfig, syncSidebarForViewport]);
1650
+ }, [navigateDashboard, refreshConfig, syncSidebarForViewport]);
1408
1651
 
1409
1652
  const onboardingRequired = !preferencesLoading && !!preferences && !preferences.onboardingAcknowledged;
1410
1653
  const resolvedPreferences = preferences ?? normalizePreferences(null, selectedAgent || DEFAULT_AGENT);
1411
1654
  const resolvedCodingAgent = selectedAgent || resolvedPreferences.codingAgent || DEFAULT_AGENT;
1412
1655
 
1413
1656
  const handleSelectProject = useCallback((projectId: string | null) => {
1414
- setSelectedProjectId(projectId);
1415
- setSelectedSessionId(null);
1657
+ navigateDashboard(
1658
+ {
1659
+ projectId,
1660
+ sessionId: null,
1661
+ workspaceView: projectId ? workspaceView : null,
1662
+ tab: null,
1663
+ },
1664
+ "push",
1665
+ );
1416
1666
  setSelectedAgent(preferences?.codingAgent || DEFAULT_AGENT);
1417
1667
  closeSidebarOnMobile();
1418
- }, [closeSidebarOnMobile, preferences?.codingAgent]);
1668
+ }, [closeSidebarOnMobile, navigateDashboard, preferences?.codingAgent, workspaceView]);
1419
1669
 
1420
1670
  const handleSelectSession = useCallback((id: string) => {
1421
- setSelectedSessionId(id);
1671
+ const matchedSession = dashboardSessions.find((session) => session.id === id) ?? null;
1672
+ navigateDashboard(
1673
+ {
1674
+ projectId: matchedSession?.projectId ?? selectedProjectId ?? null,
1675
+ sessionId: id,
1676
+ tab: "chat",
1677
+ },
1678
+ "push",
1679
+ );
1422
1680
  closeSidebarOnMobile();
1423
- }, [closeSidebarOnMobile]);
1681
+ }, [closeSidebarOnMobile, dashboardSessions, navigateDashboard, selectedProjectId]);
1424
1682
 
1425
1683
  const handleOpenPreferences = useCallback(() => {
1426
1684
  setPreferencesDialogOpen(true);
@@ -1502,7 +1760,7 @@ export default function DashboardClient() {
1502
1760
  agentOptions={agentOptions}
1503
1761
  projects={projects}
1504
1762
  selectedProjectId={selectedProjectId}
1505
- onSelectProject={setSelectedProjectId}
1763
+ onSelectProject={handleSelectProject}
1506
1764
  projectLabel={selectedProjectId ?? "All projects"}
1507
1765
  hasProject={projects.length > 0}
1508
1766
  creating={creating}
@@ -1550,7 +1808,7 @@ export default function DashboardClient() {
1550
1808
  <div className="inline-flex w-fit rounded-[6px] border border-[var(--vk-border)] p-1">
1551
1809
  <button
1552
1810
  type="button"
1553
- onClick={() => setWorkspaceView("chat")}
1811
+ onClick={() => navigateDashboard({ projectId: selectedProject.id, workspaceView: "chat" }, "replace")}
1554
1812
  className={`min-h-[32px] rounded-[4px] px-3 text-[13px] ${
1555
1813
  workspaceView === "chat"
1556
1814
  ? "bg-[var(--vk-bg-active)] text-[var(--vk-text-strong)]"
@@ -1561,7 +1819,7 @@ export default function DashboardClient() {
1561
1819
  </button>
1562
1820
  <button
1563
1821
  type="button"
1564
- onClick={() => setWorkspaceView("board")}
1822
+ onClick={() => navigateDashboard({ projectId: selectedProject.id, workspaceView: "board" }, "replace")}
1565
1823
  className={`min-h-[32px] rounded-[4px] px-3 text-[13px] ${
1566
1824
  workspaceView === "board"
1567
1825
  ? "bg-[var(--vk-bg-active)] text-[var(--vk-text-strong)]"
@@ -1579,7 +1837,7 @@ export default function DashboardClient() {
1579
1837
  </div>
1580
1838
  </div>
1581
1839
  );
1582
- }, [selectedProject, workspaceMainPanel, workspaceView]);
1840
+ }, [navigateDashboard, selectedProject, workspaceMainPanel, workspaceView]);
1583
1841
 
1584
1842
  const workspaceContent = useMemo(() => {
1585
1843
  if (selectedSessionId) {
@@ -1622,7 +1880,8 @@ export default function DashboardClient() {
1622
1880
  return (
1623
1881
  <>
1624
1882
  <AppShell
1625
- sidebarOpen={sidebarOpen}
1883
+ mobileSidebarOpen={mobileSidebarOpen}
1884
+ desktopSidebarOpen={desktopSidebarOpen}
1626
1885
  onToggleSidebar={toggleSidebar}
1627
1886
  sidebar={sidebarContent}
1628
1887
  >
@@ -1657,6 +1916,7 @@ export default function DashboardClient() {
1657
1916
  current={resolvedPreferences}
1658
1917
  projectCount={projects.length}
1659
1918
  agentOptions={agentOptions}
1919
+ agentStates={agentStatesByName}
1660
1920
  runtimeModelCatalogs={runtimeModelCatalogs}
1661
1921
  onRepositoriesChanged={refreshConfig}
1662
1922
  onOnboardingComplete={({ needsProject }) => {
@@ -1664,6 +1924,7 @@ export default function DashboardClient() {
1664
1924
  setPendingWorkspaceSetup(true);
1665
1925
  }
1666
1926
  }}
1927
+ onOpenAgentSetup={openAgentSetup}
1667
1928
  onClose={handleClosePreferencesDialog}
1668
1929
  onSave={handleSavePreferences}
1669
1930
  />
@@ -1784,7 +2045,7 @@ function NewWorkspaceDialog({
1784
2045
  opts.push(defaultAgent || DEFAULT_AGENT);
1785
2046
  }
1786
2047
 
1787
- const rankMap = new Map(EXECUTOR_ORDER.map((name, index) => [name, index]));
2048
+ const rankMap = new Map(KNOWN_AGENT_ORDER.map((name, index) => [name, index]));
1788
2049
  return opts.sort((left, right) => {
1789
2050
  const leftRank = rankMap.get(normalizeAgentName(left)) ?? Number.MAX_SAFE_INTEGER;
1790
2051
  const rightRank = rankMap.get(normalizeAgentName(right)) ?? Number.MAX_SAFE_INTEGER;
@@ -2745,7 +3006,7 @@ const CreateWorkspacePanel = memo(function CreateWorkspacePanel({
2745
3006
  onCreate: (options?: CreateSessionOptions) => void;
2746
3007
  }) {
2747
3008
  const orderedAgentOptions = useMemo(() => {
2748
- const rankMap = new Map(EXECUTOR_ORDER.map((name, index) => [name, index]));
3009
+ const rankMap = new Map(KNOWN_AGENT_ORDER.map((name, index) => [name, index]));
2749
3010
  return [...agentOptions].sort((left, right) => {
2750
3011
  const leftRank = rankMap.get(normalizeAgentName(left)) ?? Number.MAX_SAFE_INTEGER;
2751
3012
  const rightRank = rankMap.get(normalizeAgentName(right)) ?? Number.MAX_SAFE_INTEGER;
@@ -3399,9 +3660,11 @@ function SettingsDialog({
3399
3660
  current,
3400
3661
  projectCount,
3401
3662
  agentOptions,
3663
+ agentStates,
3402
3664
  runtimeModelCatalogs,
3403
3665
  onRepositoriesChanged,
3404
3666
  onOnboardingComplete,
3667
+ onOpenAgentSetup,
3405
3668
  onClose,
3406
3669
  onSave,
3407
3670
  }: {
@@ -3412,18 +3675,19 @@ function SettingsDialog({
3412
3675
  current: PreferencesPayload;
3413
3676
  projectCount: number;
3414
3677
  agentOptions: string[];
3678
+ agentStates: Record<string, AgentSetupState>;
3415
3679
  runtimeModelCatalogs: Record<string, RuntimeAgentModelCatalog>;
3416
3680
  onRepositoriesChanged?: () => Promise<void>;
3417
3681
  onOnboardingComplete?: (result: { needsProject: boolean }) => void;
3682
+ onOpenAgentSetup: (agent: string) => void;
3418
3683
  onClose: () => void;
3419
3684
  onSave: (next: PreferencesPayload, options?: { closeDialog?: boolean }) => Promise<boolean>;
3420
3685
  }) {
3421
3686
  const [activeTab, setActiveTab] = useState<SettingsTabId>("preferences");
3422
3687
  const [codingAgent, setCodingAgent] = useState(current.codingAgent);
3423
3688
  const [ide, setIde] = useState(current.ide);
3424
- const [remoteSshHost, setRemoteSshHost] = useState(current.remoteSshHost);
3425
- const [remoteSshUser, setRemoteSshUser] = useState(current.remoteSshUser);
3426
3689
  const [markdownEditor, setMarkdownEditor] = useState(current.markdownEditor);
3690
+ const [markdownEditorPath, setMarkdownEditorPath] = useState<string>(current.markdownEditorPath ?? "");
3427
3691
  const [modelAccess, setModelAccess] = useState<ModelAccessPreferences>(current.modelAccess);
3428
3692
  const [soundEnabled, setSoundEnabled] = useState(current.notifications.soundEnabled);
3429
3693
  const [soundFile, setSoundFile] = useState<string | null>(current.notifications.soundFile);
@@ -3438,23 +3702,36 @@ function SettingsDialog({
3438
3702
  const [repositoryBranchesLoading, setRepositoryBranchesLoading] = useState(false);
3439
3703
  const [repositoryBranchesError, setRepositoryBranchesError] = useState<string | null>(null);
3440
3704
  const [repositoryFolderPickerOpen, setRepositoryFolderPickerOpen] = useState(false);
3705
+ const [notesFolderPickerOpen, setNotesFolderPickerOpen] = useState(false);
3441
3706
  const [accessSettings, setAccessSettings] = useState<AccessSettingsPayload>(() => normalizeAccessSettings(null));
3442
3707
  const [accessLoading, setAccessLoading] = useState(false);
3443
3708
  const [accessSaving, setAccessSaving] = useState(false);
3444
3709
  const [accessError, setAccessError] = useState<string | null>(null);
3710
+ const [remoteAccessSettings, setRemoteAccessSettings] = useState<RemoteAccessPayload>(() => normalizeRemoteAccess(null));
3711
+ const [remoteAccessLoading, setRemoteAccessLoading] = useState(false);
3712
+ const [remoteAccessMutating, setRemoteAccessMutating] = useState<RemoteAccessAction | null>(null);
3713
+ const [remoteAccessError, setRemoteAccessError] = useState<string | null>(null);
3445
3714
 
3446
- const isBusy = creating || repositoriesSaving || accessSaving;
3715
+ const isBusy = creating || repositoriesSaving || accessSaving || remoteAccessMutating !== null;
3447
3716
 
3448
- function hydrateRepositoryDraft(value: RepositorySettingsPayload): RepositorySettingsPayload {
3449
- return {
3450
- ...value,
3451
- pathHealth: {
3452
- exists: value.pathHealth.exists,
3453
- isGitRepository: value.pathHealth.isGitRepository,
3454
- suggestedPath: value.pathHealth.suggestedPath,
3455
- },
3456
- };
3457
- }
3717
+ function hydrateRepositoryDraft(value: RepositorySettingsPayload): RepositorySettingsPayload {
3718
+ return {
3719
+ ...value,
3720
+ agentPermissions: value.agentPermissions === "default" ? "default" : "skip",
3721
+ devServerScript: value.devServerScript ?? "",
3722
+ devServerCwd: value.devServerCwd ?? "",
3723
+ devServerUrl: value.devServerUrl ?? "",
3724
+ devServerPort: value.devServerPort ?? "",
3725
+ devServerHost: value.devServerHost ?? "",
3726
+ devServerPath: value.devServerPath ?? "",
3727
+ devServerHttps: value.devServerHttps === true,
3728
+ pathHealth: {
3729
+ exists: value.pathHealth.exists,
3730
+ isGitRepository: value.pathHealth.isGitRepository,
3731
+ suggestedPath: value.pathHealth.suggestedPath,
3732
+ },
3733
+ };
3734
+ }
3458
3735
 
3459
3736
  function parseMultilineRoleList(value: string): string[] {
3460
3737
  return value
@@ -3559,11 +3836,18 @@ function SettingsDialog({
3559
3836
  repo: repositoryDraft.repo,
3560
3837
  path: repositoryDraft.path,
3561
3838
  agent: repositoryDraft.agent,
3839
+ agentPermissions: repositoryDraft.agentPermissions,
3562
3840
  agentModel: resolveModelSelectionValue(repositoryModelSelection) ?? "",
3563
3841
  agentReasoningEffort: resolveReasoningSelectionValue(repositoryModelSelection) ?? "",
3564
3842
  defaultWorkingDirectory: repositoryDraft.defaultWorkingDirectory,
3565
3843
  defaultBranch: repositoryDraft.defaultBranch,
3566
3844
  devServerScript: repositoryDraft.devServerScript,
3845
+ devServerCwd: repositoryDraft.devServerCwd,
3846
+ devServerUrl: repositoryDraft.devServerUrl,
3847
+ devServerPort: repositoryDraft.devServerPort,
3848
+ devServerHost: repositoryDraft.devServerHost,
3849
+ devServerPath: repositoryDraft.devServerPath,
3850
+ devServerHttps: repositoryDraft.devServerHttps,
3567
3851
  setupScript: repositoryDraft.setupScript,
3568
3852
  runSetupInParallel: repositoryDraft.runSetupInParallel,
3569
3853
  cleanupScript: repositoryDraft.cleanupScript,
@@ -3633,11 +3917,11 @@ function SettingsDialog({
3633
3917
  method: "PUT",
3634
3918
  headers: { "Content-Type": "application/json" },
3635
3919
  body: JSON.stringify({
3636
- requireAuth: accessSettings.requireAuth,
3920
+ requireAuth: accessSettings.requireAuth || accessSettings.trustedHeaders.enabled,
3637
3921
  defaultRole: accessSettings.defaultRole,
3638
3922
  trustedHeaders: {
3639
3923
  enabled: accessSettings.trustedHeaders.enabled,
3640
- provider: accessSettings.trustedHeaders.provider,
3924
+ provider: "cloudflare-access",
3641
3925
  emailHeader: accessSettings.trustedHeaders.emailHeader,
3642
3926
  jwtHeader: accessSettings.trustedHeaders.jwtHeader,
3643
3927
  teamDomain: accessSettings.trustedHeaders.teamDomain,
@@ -3661,6 +3945,9 @@ function SettingsDialog({
3661
3945
  }
3662
3946
 
3663
3947
  setAccessSettings(normalizeAccessSettings(data?.access, data?.current));
3948
+ if (activeTab === "remote_access") {
3949
+ await loadRemoteAccess();
3950
+ }
3664
3951
  return true;
3665
3952
  } catch (err) {
3666
3953
  setAccessError(err instanceof Error ? err.message : "Failed to save organization settings");
@@ -3670,14 +3957,78 @@ function SettingsDialog({
3670
3957
  }
3671
3958
  }
3672
3959
 
3960
+ async function loadRemoteAccess(): Promise<void> {
3961
+ setRemoteAccessLoading(true);
3962
+ setRemoteAccessError(null);
3963
+ try {
3964
+ const res = await fetch("/api/remote-access");
3965
+ const data = (await res.json().catch(() => null)) as
3966
+ | { error?: string; reason?: string }
3967
+ | RemoteAccessPayload
3968
+ | null;
3969
+ if (!res.ok) {
3970
+ const reason = data && typeof data === "object" && "reason" in data && typeof data.reason === "string"
3971
+ ? data.reason
3972
+ : null;
3973
+ const errorMessage = data && typeof data === "object" && "error" in data && typeof data.error === "string"
3974
+ ? data.error
3975
+ : null;
3976
+ throw new Error(reason ?? errorMessage ?? `Failed to load remote access (${res.status})`);
3977
+ }
3978
+
3979
+ setRemoteAccessSettings(normalizeRemoteAccess(data));
3980
+ } catch (err) {
3981
+ setRemoteAccessSettings(normalizeRemoteAccess(null));
3982
+ setRemoteAccessError(err instanceof Error ? err.message : "Failed to load remote access");
3983
+ } finally {
3984
+ setRemoteAccessLoading(false);
3985
+ }
3986
+ }
3987
+
3988
+ async function mutateRemoteAccess(action: RemoteAccessAction): Promise<void> {
3989
+ setRemoteAccessMutating(action);
3990
+ setRemoteAccessError(null);
3991
+ try {
3992
+ const res = await fetch("/api/remote-access", {
3993
+ method: action === "disable" ? "DELETE" : "POST",
3994
+ headers: action === "disable"
3995
+ ? undefined
3996
+ : {
3997
+ "Content-Type": "application/json",
3998
+ },
3999
+ body: action === "disable"
4000
+ ? undefined
4001
+ : JSON.stringify({ action }),
4002
+ });
4003
+ const data = (await res.json().catch(() => null)) as
4004
+ | { error?: string; reason?: string }
4005
+ | RemoteAccessPayload
4006
+ | null;
4007
+ if (!res.ok) {
4008
+ const reason = data && typeof data === "object" && "reason" in data && typeof data.reason === "string"
4009
+ ? data.reason
4010
+ : null;
4011
+ const errorMessage = data && typeof data === "object" && "error" in data && typeof data.error === "string"
4012
+ ? data.error
4013
+ : null;
4014
+ throw new Error(reason ?? errorMessage ?? `Failed to ${action} remote access (${res.status})`);
4015
+ }
4016
+
4017
+ setRemoteAccessSettings(normalizeRemoteAccess(data));
4018
+ } catch (err) {
4019
+ setRemoteAccessError(err instanceof Error ? err.message : `Failed to ${action} remote access`);
4020
+ } finally {
4021
+ setRemoteAccessMutating(null);
4022
+ }
4023
+ }
4024
+
3673
4025
  useEffect(() => {
3674
4026
  if (!open) return;
3675
4027
  setActiveTab(mode === "onboarding" ? "preferences" : "general");
3676
4028
  setCodingAgent(current.codingAgent);
3677
4029
  setIde(current.ide);
3678
- setRemoteSshHost(current.remoteSshHost);
3679
- setRemoteSshUser(current.remoteSshUser);
3680
4030
  setMarkdownEditor(current.markdownEditor);
4031
+ setMarkdownEditorPath(current.markdownEditorPath ?? "");
3681
4032
  setModelAccess(current.modelAccess);
3682
4033
  setSoundEnabled(current.notifications.soundEnabled);
3683
4034
  setSoundFile(current.notifications.soundFile);
@@ -3686,6 +4037,8 @@ function SettingsDialog({
3686
4037
  setRepositoriesError(null);
3687
4038
  setRepositoryModelSelection(emptyModelSelection());
3688
4039
  setAccessError(null);
4040
+ setRemoteAccessSettings(normalizeRemoteAccess(null));
4041
+ setRemoteAccessError(null);
3689
4042
  }, [mode, open]);
3690
4043
 
3691
4044
  useEffect(() => {
@@ -3702,6 +4055,12 @@ function SettingsDialog({
3702
4055
  // eslint-disable-next-line react-hooks/exhaustive-deps
3703
4056
  }, [mode, open]);
3704
4057
 
4058
+ useEffect(() => {
4059
+ if (!open || mode === "onboarding" || activeTab !== "remote_access") return;
4060
+ void loadRemoteAccess();
4061
+ // eslint-disable-next-line react-hooks/exhaustive-deps
4062
+ }, [activeTab, mode, open]);
4063
+
3705
4064
  useEffect(() => {
3706
4065
  if (!open) return;
3707
4066
  if (!selectedRepositoryId) {
@@ -3746,12 +4105,30 @@ function SettingsDialog({
3746
4105
  const isGeneralTab = activeTabItem.id === "general";
3747
4106
  const isRemoteAccessTab = activeTabItem.id === "remote_access";
3748
4107
  const isAgentsTab = activeTabItem.id === "agents";
3749
- const isPreferenceFormTab = isPreferencesTab || isGeneralTab || isRemoteAccessTab || isAgentsTab;
4108
+ const isPreferenceFormTab = isPreferencesTab || isGeneralTab || isAgentsTab;
4109
+ const isPrimarySettingsTab = isPreferenceFormTab || isRemoteAccessTab;
3750
4110
  const isRepositoriesTab = activeTabItem.id === "repositories";
3751
4111
  const isOrganizationTab = activeTabItem.id === "organization";
3752
4112
  const onboardingStepIndex = visibleTabs.findIndex((tab) => tab.id === activeTabItem.id) + 1;
3753
4113
  const onboardingHasRepositoryStep = visibleTabs.some((tab) => tab.id === "repositories");
3754
4114
  const accessCanEdit = accessSettings.current.role === "admin";
4115
+ const remoteAccessModeLabel = getRemoteAccessModeLabel(remoteAccessSettings.mode);
4116
+ const remoteAccessStatusLabel = getRemoteAccessStatusLabel(remoteAccessSettings.status);
4117
+ const remoteAccessMutationPending = remoteAccessMutating !== null;
4118
+ const managedRemoteProvider = remoteAccessSettings.provider ?? remoteAccessSettings.recommendedProvider;
4119
+ const usingPrivateNetworkFlow = managedRemoteProvider === "tailscale";
4120
+ const showManagedTunnelControls = managedRemoteProvider !== null || remoteAccessSettings.managed;
4121
+ const remoteAccessEnableLabel = !remoteAccessSettings.installed && remoteAccessSettings.canAutoInstall
4122
+ ? "Install + Enable"
4123
+ : "Enable Private Link";
4124
+ const remoteAccessCanEnable = !remoteAccessLoading
4125
+ && !remoteAccessMutationPending
4126
+ && usingPrivateNetworkFlow
4127
+ && !(remoteAccessSettings.status === "ready" && remoteAccessSettings.managed);
4128
+ const remoteAccessCanRotate = false;
4129
+ const remoteAccessCanDisable = !remoteAccessLoading
4130
+ && !remoteAccessMutationPending
4131
+ && (remoteAccessSettings.status === "starting" || remoteAccessSettings.status === "ready" || remoteAccessSettings.status === "error");
3755
4132
 
3756
4133
  const orderedAgentOptions = useMemo(() => {
3757
4134
  const opts = new Set(agentOptions);
@@ -3761,7 +4138,7 @@ function SettingsDialog({
3761
4138
  if (opts.size === 0) {
3762
4139
  opts.add(DEFAULT_AGENT);
3763
4140
  }
3764
- const rankMap = new Map(EXECUTOR_ORDER.map((name, index) => [name, index]));
4141
+ const rankMap = new Map(KNOWN_AGENT_ORDER.map((name, index) => [name, index]));
3765
4142
  return [...opts].sort((left, right) => {
3766
4143
  const leftRank = rankMap.get(normalizeAgentName(left)) ?? Number.MAX_SAFE_INTEGER;
3767
4144
  const rightRank = rankMap.get(normalizeAgentName(right)) ?? Number.MAX_SAFE_INTEGER;
@@ -3769,6 +4146,7 @@ function SettingsDialog({
3769
4146
  return getAgentLabel(left).localeCompare(getAgentLabel(right));
3770
4147
  });
3771
4148
  }, [agentOptions, codingAgent]);
4149
+ const selectedCodingAgentState = agentStates[normalizeAgentName(codingAgent)] ?? null;
3772
4150
 
3773
4151
  function handleModelAccessChange(agent: string, nextAccess: string) {
3774
4152
  const catalog = getAgentModelCatalog(agent);
@@ -3792,7 +4170,6 @@ function SettingsDialog({
3792
4170
  && repositoryDraft.defaultBranch.trim().length > 0;
3793
4171
  const canSaveAccess = accessCanEdit && !accessLoading && (
3794
4172
  !accessSettings.trustedHeaders.enabled
3795
- || accessSettings.trustedHeaders.provider === "generic"
3796
4173
  || (
3797
4174
  accessSettings.trustedHeaders.teamDomain.trim().length > 0
3798
4175
  && accessSettings.trustedHeaders.audience.trim().length > 0
@@ -3835,9 +4212,8 @@ function SettingsDialog({
3835
4212
  onboardingAcknowledged: acknowledgeOnboarding ? true : current.onboardingAcknowledged,
3836
4213
  codingAgent: codingAgent.trim(),
3837
4214
  ide: ide.trim(),
3838
- remoteSshHost: remoteSshHost.trim(),
3839
- remoteSshUser: remoteSshUser.trim(),
3840
4215
  markdownEditor: markdownEditor.trim(),
4216
+ markdownEditorPath: (markdownEditorPath ?? "").trim(),
3841
4217
  modelAccess,
3842
4218
  notifications: {
3843
4219
  soundEnabled,
@@ -3851,7 +4227,11 @@ function SettingsDialog({
3851
4227
  options?: { closeDialog?: boolean },
3852
4228
  ): Promise<boolean> {
3853
4229
  if (!canSubmitPreferences || creating) return false;
3854
- return onSave(buildNextPreferences(acknowledgeOnboarding), options);
4230
+ const saved = await onSave(buildNextPreferences(acknowledgeOnboarding), options);
4231
+ if (saved && selectedCodingAgentState && !selectedCodingAgentState.ready) {
4232
+ onOpenAgentSetup(codingAgent);
4233
+ }
4234
+ return saved;
3855
4235
  }
3856
4236
 
3857
4237
  async function handleOnboardingContinue() {
@@ -3884,7 +4264,7 @@ function SettingsDialog({
3884
4264
  <div
3885
4265
  className="fixed inset-0 z-[90] flex items-start justify-center overflow-y-auto bg-black/70 px-3 py-3 sm:items-center"
3886
4266
  onClick={() => {
3887
- if (isBusy || mode === "onboarding" || repositoryFolderPickerOpen) return;
4267
+ if (isBusy || mode === "onboarding" || repositoryFolderPickerOpen || notesFolderPickerOpen) return;
3888
4268
  onClose();
3889
4269
  }}
3890
4270
  role="presentation"
@@ -3951,7 +4331,7 @@ function SettingsDialog({
3951
4331
  </header>
3952
4332
 
3953
4333
  <div className="min-h-0 flex-1 overflow-auto px-4 py-3 sm:px-6 sm:py-4">
3954
- {isPreferenceFormTab ? (
4334
+ {isPrimarySettingsTab ? (
3955
4335
  <div className="space-y-5">
3956
4336
  {isOnboarding && (
3957
4337
  <section className="rounded-[6px] border border-[var(--vk-border)] bg-[rgba(234,122,42,0.08)] px-4 py-3">
@@ -3966,25 +4346,102 @@ function SettingsDialog({
3966
4346
  <>
3967
4347
  <section className="space-y-2">
3968
4348
  <h4 className="text-[15px] font-medium text-[var(--vk-text-strong)]">Choose Your Coding Agent</h4>
3969
- <p className="text-[12px] text-[var(--vk-text-muted)]">Select the default coding agent configuration.</p>
3970
- <div className="grid gap-2">
4349
+ <p className="text-[12px] text-[var(--vk-text-muted)]">
4350
+ Select the default coding agent, review its setup state, and confirm which models Conductor can offer for it.
4351
+ </p>
4352
+ <div className="grid gap-3">
3971
4353
  {orderedAgentOptions.map((agent) => {
3972
4354
  const selected = codingAgent === agent;
4355
+ const agentState = agentStates[normalizeAgentName(agent)] ?? null;
4356
+ const accessLabel = getAgentModelAccessLabel(agent, modelAccess);
4357
+ const availableModels = getSelectableAgentModels(agent, modelAccess, runtimeModelCatalogs);
4358
+ const previewModels = availableModels.slice(0, 3);
4359
+ const additionalModels = availableModels.length - previewModels.length;
4360
+ const statusLabel = !agentState?.installed
4361
+ ? "Not installed"
4362
+ : !agentState.ready
4363
+ ? "Setup required"
4364
+ : "Ready";
3973
4365
  return (
3974
- <button
4366
+ <div
3975
4367
  key={agent}
3976
- type="button"
3977
- onClick={() => setCodingAgent(agent)}
3978
- className={`flex items-center gap-2 rounded-[4px] border px-3 py-2 text-left ${
4368
+ className={`flex flex-col gap-3 rounded-[4px] border px-3 py-3 text-left sm:flex-row sm:items-start ${
3979
4369
  selected
3980
4370
  ? "border-[var(--vk-orange)] bg-[var(--vk-bg-hover)]"
3981
4371
  : "border-[var(--vk-border)] hover:bg-[var(--vk-bg-hover)]"
3982
4372
  }`}
3983
4373
  >
3984
- <AgentTileIcon seed={{ label: agent }} className="h-5 w-5 border-none bg-transparent" />
3985
- <span className="flex-1 text-[13px] text-[var(--vk-text-normal)]">{getAgentLabel(agent)}</span>
3986
- {selected && <Check className="h-3.5 w-3.5 text-[var(--vk-orange)]" />}
3987
- </button>
4374
+ <div className="flex min-w-0 flex-1 items-start gap-3">
4375
+ <AgentTileIcon seed={{ label: agent }} className="mt-0.5 h-5 w-5 border-none bg-transparent" />
4376
+ <div className="min-w-0 flex-1">
4377
+ <div className="flex flex-wrap items-center gap-2">
4378
+ <span className="text-[13px] font-medium text-[var(--vk-text-normal)]">{getAgentLabel(agent)}</span>
4379
+ <span className="inline-flex rounded-full border border-[var(--vk-border)] px-2 py-0.5 text-[11px] text-[var(--vk-text-muted)]">
4380
+ {statusLabel}
4381
+ </span>
4382
+ {accessLabel ? (
4383
+ <span className="inline-flex rounded-full border border-[var(--vk-border)] px-2 py-0.5 text-[11px] text-[var(--vk-text-muted)]">
4384
+ {accessLabel}
4385
+ </span>
4386
+ ) : null}
4387
+ </div>
4388
+ <p className="mt-1 text-[12px] leading-5 text-[var(--vk-text-muted)]">
4389
+ {agentState?.description ?? getKnownAgent(agent)?.description ?? "Agent metadata not available."}
4390
+ </p>
4391
+ <div className="mt-2 flex flex-wrap gap-1.5">
4392
+ {previewModels.map((model) => (
4393
+ <span
4394
+ key={`${agent}-${model.id}`}
4395
+ className="inline-flex rounded-full border border-[var(--vk-border)] bg-[var(--vk-bg-panel)] px-2 py-0.5 text-[11px] text-[var(--vk-text-normal)]"
4396
+ >
4397
+ {model.label}
4398
+ </span>
4399
+ ))}
4400
+ {additionalModels > 0 ? (
4401
+ <span className="inline-flex rounded-full border border-[var(--vk-border)] bg-[var(--vk-bg-panel)] px-2 py-0.5 text-[11px] text-[var(--vk-text-muted)]">
4402
+ +{additionalModels} more
4403
+ </span>
4404
+ ) : null}
4405
+ {previewModels.length === 0 ? (
4406
+ <span className="inline-flex rounded-full border border-[var(--vk-border)] bg-[var(--vk-bg-panel)] px-2 py-0.5 text-[11px] text-[var(--vk-text-muted)]">
4407
+ {supportsAgentModelSelection(agent) ? "Models appear after setup" : "Uses the agent default model"}
4408
+ </span>
4409
+ ) : null}
4410
+ </div>
4411
+ {!agentState?.installed && agentState?.installHint ? (
4412
+ <p className="mt-2 text-[11px] text-[var(--vk-text-muted)]">
4413
+ Install hint: <code className="rounded bg-[var(--vk-bg-main)] px-1.5 py-0.5 text-[11px] text-[var(--vk-text-normal)]">{agentState.installHint}</code>
4414
+ </p>
4415
+ ) : null}
4416
+ </div>
4417
+ </div>
4418
+ <div className="flex shrink-0 items-center gap-2 self-start sm:ml-auto">
4419
+ {!agentState?.ready ? (
4420
+ <button
4421
+ type="button"
4422
+ onClick={() => {
4423
+ setCodingAgent(agent);
4424
+ onOpenAgentSetup(agent);
4425
+ }}
4426
+ className="inline-flex h-8 items-center rounded-[4px] border border-[var(--vk-border)] px-3 text-[12px] text-[var(--vk-orange)] hover:bg-[var(--vk-bg-panel)]"
4427
+ >
4428
+ {agentState?.installed ? "Authenticate" : "Install"}
4429
+ </button>
4430
+ ) : null}
4431
+ <button
4432
+ type="button"
4433
+ onClick={() => setCodingAgent(agent)}
4434
+ className={`inline-flex h-8 items-center rounded-[4px] border px-3 text-[12px] ${
4435
+ selected
4436
+ ? "border-[var(--vk-orange)] bg-[var(--vk-orange)]/12 text-[var(--vk-orange)]"
4437
+ : "border-[var(--vk-border)] text-[var(--vk-text-normal)] hover:bg-[var(--vk-bg-panel)]"
4438
+ }`}
4439
+ >
4440
+ {selected ? "Selected" : "Use this agent"}
4441
+ </button>
4442
+ {selected && <Check className="h-3.5 w-3.5 text-[var(--vk-orange)]" />}
4443
+ </div>
4444
+ </div>
3988
4445
  );
3989
4446
  })}
3990
4447
  </div>
@@ -3999,7 +4456,10 @@ function SettingsDialog({
3999
4456
  </p>
4000
4457
  </div>
4001
4458
  <div className="grid gap-3">
4002
- {orderedAgentOptions.filter((agent) => supportsAgentModelSelection(agent)).map((agent) => {
4459
+ {orderedAgentOptions.filter((agent) => {
4460
+ const catalog = getAgentModelCatalog(agent);
4461
+ return supportsAgentModelSelection(agent) && (catalog?.accessOptions.length ?? 0) > 1;
4462
+ }).map((agent) => {
4003
4463
  const catalog = getAgentModelCatalog(agent);
4004
4464
  if (!catalog) return null;
4005
4465
  const selectedAccess = resolveAgentModelAccess(agent, modelAccess) ?? catalog.defaultAccess;
@@ -4032,181 +4492,349 @@ function SettingsDialog({
4032
4492
 
4033
4493
  {(isPreferencesTab || isGeneralTab) && (
4034
4494
  <>
4495
+ <section className="space-y-2">
4496
+ <h4 className="text-[15px] font-medium text-[var(--vk-text-strong)]">Choose Your Code Editor</h4>
4497
+ <p className="text-[12px] text-[var(--vk-text-muted)]">This editor will be used when opening attempts and files.</p>
4498
+ <div className="grid gap-2 sm:grid-cols-2">
4499
+ {IDE_OPTIONS.map((option) => {
4500
+ const selected = ide === option.id;
4501
+ return (
4502
+ <button
4503
+ key={option.id}
4504
+ type="button"
4505
+ onClick={() => setIde(option.id)}
4506
+ className={`flex items-center gap-2 rounded-[4px] border px-3 py-2 text-left ${
4507
+ selected
4508
+ ? "border-[var(--vk-orange)] bg-[var(--vk-bg-hover)]"
4509
+ : "border-[var(--vk-border)] hover:bg-[var(--vk-bg-hover)]"
4510
+ }`}
4511
+ >
4512
+ <CodeEditorIcon editorId={option.id} label={option.label} />
4513
+ <span className="flex-1 text-[13px] text-[var(--vk-text-normal)]">{option.label}</span>
4514
+ {selected && <Check className="h-3.5 w-3.5 text-[var(--vk-orange)]" />}
4515
+ </button>
4516
+ );
4517
+ })}
4518
+ </div>
4519
+ </section>
4035
4520
 
4036
- <section className="space-y-2">
4037
- <h4 className="text-[15px] font-medium text-[var(--vk-text-strong)]">Choose Your Code Editor</h4>
4038
- <p className="text-[12px] text-[var(--vk-text-muted)]">This editor will be used when opening attempts and files.</p>
4039
- <div className="grid gap-2 sm:grid-cols-2">
4040
- {IDE_OPTIONS.map((option) => {
4041
- const selected = ide === option.id;
4042
- return (
4521
+ <section className="space-y-2">
4522
+ <h4 className="text-[15px] font-medium text-[var(--vk-text-strong)]">Markdown Editor</h4>
4523
+ <p className="text-[12px] text-[var(--vk-text-muted)]">
4524
+ Used as your second-brain markdown source when feeding context into tasks.
4525
+ </p>
4526
+ <div className="grid gap-2 sm:grid-cols-2">
4527
+ {MARKDOWN_EDITOR_OPTIONS.map((option) => {
4528
+ const selected = markdownEditor === option.id;
4529
+ return (
4530
+ <button
4531
+ key={option.id}
4532
+ type="button"
4533
+ onClick={() => setMarkdownEditor(option.id)}
4534
+ className={`flex items-center gap-2 rounded-[4px] border px-3 py-2 text-left ${
4535
+ selected
4536
+ ? "border-[var(--vk-orange)] bg-[var(--vk-bg-hover)]"
4537
+ : "border-[var(--vk-border)] hover:bg-[var(--vk-bg-hover)]"
4538
+ }`}
4539
+ >
4540
+ <MarkdownEditorIcon editorId={option.id} />
4541
+ <span className="flex-1 text-[13px] text-[var(--vk-text-normal)]">{option.label}</span>
4542
+ {selected && <Check className="h-3.5 w-3.5 text-[var(--vk-orange)]" />}
4543
+ </button>
4544
+ );
4545
+ })}
4546
+ </div>
4547
+ {markdownEditor !== "notion" && (
4548
+ <div className="rounded-[4px] border border-[var(--vk-border)] px-3 py-3">
4549
+ <label className="block">
4550
+ <span className="mb-1.5 block text-[12px] font-medium text-[var(--vk-text-normal)]">
4551
+ Notes Root
4552
+ </span>
4553
+ <div className="flex items-center gap-2">
4554
+ <input
4555
+ value={markdownEditorPath ?? ""}
4556
+ readOnly
4557
+ onClick={() => setNotesFolderPickerOpen(true)}
4558
+ placeholder="Select your Obsidian vault, Logseq graph, or notes folder"
4559
+ className="h-9 w-full cursor-pointer rounded-[4px] border border-[var(--vk-border)] bg-transparent px-2 text-[13px] text-[var(--vk-text-normal)] outline-none focus:border-[var(--vk-orange)]"
4560
+ />
4561
+ <button
4562
+ type="button"
4563
+ onClick={() => setNotesFolderPickerOpen(true)}
4564
+ disabled={isBusy}
4565
+ className="inline-flex h-9 items-center rounded-[4px] border border-[var(--vk-border)] px-2 text-[12px] text-[var(--vk-text-normal)] hover:bg-[var(--vk-bg-hover)] disabled:opacity-60"
4566
+ title="Browse folders"
4567
+ >
4568
+ <FolderOpen className="h-4 w-4" />
4569
+ </button>
4570
+ {(markdownEditorPath ?? "").trim().length > 0 && (
4571
+ <button
4572
+ type="button"
4573
+ onClick={() => setMarkdownEditorPath("")}
4574
+ disabled={isBusy}
4575
+ className="inline-flex h-9 items-center rounded-[4px] border border-[var(--vk-border)] px-2 text-[12px] text-[var(--vk-text-normal)] hover:bg-[var(--vk-bg-hover)] disabled:opacity-60"
4576
+ >
4577
+ Clear
4578
+ </button>
4579
+ )}
4580
+ </div>
4581
+ <p className="mt-1 text-[12px] text-[var(--vk-text-muted)]">
4582
+ Context attachments are discovered from this folder first. Leave it blank to fall back to the current workspace.
4583
+ </p>
4584
+ </label>
4585
+ </div>
4586
+ )}
4587
+ </section>
4588
+
4589
+ <section className="space-y-2">
4590
+ <h4 className="text-[15px] font-medium text-[var(--vk-text-strong)]">Notification Sound</h4>
4591
+ <p className="text-[12px] text-[var(--vk-text-muted)]">Pick a sound for notifications, or disable sound.</p>
4592
+ <div className="grid gap-2 sm:grid-cols-2">
4593
+ {NOTIFICATION_SOUND_OPTIONS.map((option) => {
4594
+ const selected = soundEnabled && soundFile === option.id;
4595
+ return (
4596
+ <button
4597
+ key={option.id}
4598
+ type="button"
4599
+ onClick={() => {
4600
+ setSoundEnabled(true);
4601
+ setSoundFile(option.id);
4602
+ }}
4603
+ className={`flex items-center gap-2 rounded-[4px] border px-3 py-2 text-left ${
4604
+ selected
4605
+ ? "border-[var(--vk-orange)] bg-[var(--vk-bg-hover)]"
4606
+ : "border-[var(--vk-border)] hover:bg-[var(--vk-bg-hover)]"
4607
+ }`}
4608
+ >
4609
+ <Volume2 className="h-4 w-4 text-[var(--vk-text-muted)]" />
4610
+ <span className="flex-1 text-[13px] text-[var(--vk-text-normal)]">{option.label}</span>
4611
+ {selected && <Check className="h-3.5 w-3.5 text-[var(--vk-orange)]" />}
4612
+ </button>
4613
+ );
4614
+ })}
4043
4615
  <button
4044
- key={option.id}
4045
4616
  type="button"
4046
- onClick={() => setIde(option.id)}
4617
+ onClick={() => setSoundEnabled(false)}
4047
4618
  className={`flex items-center gap-2 rounded-[4px] border px-3 py-2 text-left ${
4048
- selected
4619
+ !soundEnabled
4049
4620
  ? "border-[var(--vk-orange)] bg-[var(--vk-bg-hover)]"
4050
4621
  : "border-[var(--vk-border)] hover:bg-[var(--vk-bg-hover)]"
4051
4622
  }`}
4052
4623
  >
4053
- <CodeEditorIcon editorId={option.id} label={option.label} />
4054
- <span className="flex-1 text-[13px] text-[var(--vk-text-normal)]">{option.label}</span>
4055
- {selected && <Check className="h-3.5 w-3.5 text-[var(--vk-orange)]" />}
4624
+ <VolumeX className="h-4 w-4 text-[var(--vk-text-muted)]" />
4625
+ <span className="flex-1 text-[13px] text-[var(--vk-text-normal)]">No sound</span>
4626
+ {!soundEnabled && <Check className="h-3.5 w-3.5 text-[var(--vk-orange)]" />}
4056
4627
  </button>
4057
- );
4058
- })}
4059
- </div>
4060
- </section>
4628
+ </div>
4629
+ </section>
4630
+ </>
4631
+ )}
4061
4632
 
4062
- {isPreferencesTab && (
4063
- <section className="space-y-3">
4064
- <div className="space-y-1">
4065
- <h4 className="text-[15px] font-medium text-[var(--vk-text-strong)]">Remote Access</h4>
4066
- <p className="text-[12px] text-[var(--vk-text-muted)]">
4067
- Use your local Remote-SSH editor to jump straight into a remote worktree. This complements
4068
- ngrok or Cloudflare Tunnel for dashboard access; it does not replace the tunnel.
4069
- </p>
4070
- </div>
4633
+ {isRemoteAccessTab && (
4634
+ <div className="space-y-4">
4635
+ <section className="rounded-[6px] border border-[var(--vk-border)] bg-[rgba(234,122,42,0.06)] px-4 py-3">
4636
+ <h4 className="text-[15px] font-medium text-[var(--vk-text-strong)]">Remote Access</h4>
4637
+ <p className="mt-1 text-[12px] leading-5 text-[var(--vk-text-muted)]">
4638
+ Use one complete URL to open this Conductor instance from your phone or any other machine.
4639
+ The URL below is only shown to admin sessions because it can grant real control of the dashboard.
4640
+ </p>
4641
+ </section>
4071
4642
 
4072
- <div className="grid gap-3 sm:grid-cols-2">
4073
- <label className="block">
4074
- <span className="mb-1.5 block text-[12px] font-medium text-[var(--vk-text-normal)]">SSH Host or Alias</span>
4075
- <input
4076
- value={remoteSshHost}
4077
- onChange={(event) => setRemoteSshHost(event.target.value)}
4078
- placeholder="e.g., conductor-dev or 203.0.113.10"
4079
- className="h-9 w-full rounded-[4px] border border-[var(--vk-border)] bg-transparent px-2 text-[14px] text-[var(--vk-text-normal)] outline-none focus:border-[var(--vk-orange)]"
4080
- />
4081
- </label>
4643
+ <section className="space-y-3 rounded-[6px] border border-[var(--vk-border)] px-4 py-4">
4644
+ <div className="flex flex-wrap items-start justify-between gap-3">
4645
+ <div className="space-y-1">
4646
+ <h5 className="text-[18px] leading-[20px] text-[var(--vk-text-strong)]">{remoteAccessSettings.title}</h5>
4647
+ <p className="text-[12px] leading-5 text-[var(--vk-text-muted)]">
4648
+ {remoteAccessSettings.description}
4649
+ </p>
4650
+ </div>
4651
+ <button
4652
+ type="button"
4653
+ onClick={() => void loadRemoteAccess()}
4654
+ disabled={remoteAccessLoading}
4655
+ className="inline-flex h-8 items-center gap-1.5 rounded-[4px] border border-[var(--vk-border)] px-2 text-[12px] text-[var(--vk-text-normal)] hover:bg-[var(--vk-bg-hover)] disabled:cursor-not-allowed disabled:opacity-60"
4656
+ >
4657
+ <RefreshCcw className={`h-3.5 w-3.5${remoteAccessLoading ? " animate-spin" : ""}`} />
4658
+ <span>Refresh</span>
4659
+ </button>
4660
+ </div>
4082
4661
 
4083
- <label className="block">
4084
- <span className="mb-1.5 block text-[12px] font-medium text-[var(--vk-text-normal)]">SSH User (optional)</span>
4085
- <input
4086
- value={remoteSshUser}
4087
- onChange={(event) => setRemoteSshUser(event.target.value)}
4088
- placeholder="e.g., ubuntu"
4089
- className="h-9 w-full rounded-[4px] border border-[var(--vk-border)] bg-transparent px-2 text-[14px] text-[var(--vk-text-normal)] outline-none focus:border-[var(--vk-orange)]"
4090
- />
4091
- </label>
4092
- </div>
4662
+ {remoteAccessLoading ? (
4663
+ <div className="flex items-center gap-2 rounded-[6px] border border-[var(--vk-border)] px-3 py-3 text-[13px] text-[var(--vk-text-muted)]">
4664
+ <Loader2 className="h-4 w-4 animate-spin" />
4665
+ Loading remote access details...
4666
+ </div>
4667
+ ) : remoteAccessError ? (
4668
+ <div className="rounded-[6px] border border-[var(--vk-red)]/35 bg-[var(--vk-red)]/10 px-3 py-3 text-[12px] leading-5 text-[var(--vk-red)]">
4669
+ {remoteAccessError}
4670
+ </div>
4671
+ ) : (
4672
+ <>
4673
+ <div className="grid gap-3 lg:grid-cols-3">
4674
+ <div className="rounded-[6px] border border-[var(--vk-border)] px-4 py-3">
4675
+ <span className="text-[11px] uppercase tracking-[0.12em] text-[var(--vk-text-muted)]">
4676
+ Remote Status
4677
+ </span>
4678
+ <p className="mt-2 text-[14px] text-[var(--vk-text-normal)]">{remoteAccessStatusLabel}</p>
4679
+ </div>
4680
+ <div className="rounded-[6px] border border-[var(--vk-border)] px-4 py-3">
4681
+ <span className="text-[11px] uppercase tracking-[0.12em] text-[var(--vk-text-muted)]">
4682
+ Security Mode
4683
+ </span>
4684
+ <p className="mt-2 text-[14px] text-[var(--vk-text-normal)]">{remoteAccessModeLabel}</p>
4685
+ </div>
4686
+ <div className="rounded-[6px] border border-[var(--vk-border)] px-4 py-3">
4687
+ <span className="text-[11px] uppercase tracking-[0.12em] text-[var(--vk-text-muted)]">
4688
+ Local Target
4689
+ </span>
4690
+ <p className="mt-2 break-all text-[14px] text-[var(--vk-text-normal)]">
4691
+ {remoteAccessSettings.localUrl ?? "Not resolved"}
4692
+ </p>
4693
+ </div>
4694
+ <div className="rounded-[6px] border border-[var(--vk-border)] px-4 py-3">
4695
+ <span className="text-[11px] uppercase tracking-[0.12em] text-[var(--vk-text-muted)]">
4696
+ Remote URL
4697
+ </span>
4698
+ <p className="mt-2 break-all text-[14px] text-[var(--vk-text-normal)]">
4699
+ {remoteAccessSettings.publicUrl ?? "Not resolved"}
4700
+ </p>
4701
+ </div>
4702
+ </div>
4093
4703
 
4094
- <p className="text-[12px] text-[var(--vk-text-muted)]">
4095
- One-click remote open currently supports VS Code and VS Code Insiders. Other editors will still
4096
- save as your preference, but they will not get a remote launch button yet.
4097
- </p>
4098
- </section>
4099
- )}
4704
+ {showManagedTunnelControls ? (
4705
+ <div className="space-y-3 rounded-[6px] border border-[var(--vk-border)] px-4 py-4">
4706
+ <div className="flex flex-wrap items-start justify-between gap-3">
4707
+ <div className="space-y-1">
4708
+ <span className="text-[11px] uppercase tracking-[0.12em] text-[var(--vk-text-muted)]">
4709
+ {usingPrivateNetworkFlow ? "Private Network Link" : "Managed Remote Access"}
4710
+ </span>
4711
+ <p className="text-[13px] leading-5 text-[var(--vk-text-normal)]">
4712
+ {usingPrivateNetworkFlow
4713
+ ? "Start a private Tailscale link inside Conductor. Only authenticated devices on your tailnet can reach this URL."
4714
+ : "Conductor no longer starts public share tunnels. Use a private Tailscale link here, or configure a protected Cloudflare Access URL separately."}
4715
+ </p>
4716
+ </div>
4717
+ <div className="flex flex-wrap gap-2">
4718
+ <button
4719
+ type="button"
4720
+ onClick={() => void mutateRemoteAccess("enable")}
4721
+ disabled={!remoteAccessCanEnable}
4722
+ className="inline-flex h-8 items-center rounded-[4px] border border-[var(--vk-orange)] px-3 text-[12px] text-[var(--vk-orange)] hover:bg-[var(--vk-orange)]/10 disabled:cursor-not-allowed disabled:opacity-50"
4723
+ >
4724
+ {remoteAccessMutating === "enable" ? "Enabling..." : remoteAccessEnableLabel}
4725
+ </button>
4726
+ <button
4727
+ type="button"
4728
+ onClick={() => void mutateRemoteAccess("disable")}
4729
+ disabled={!remoteAccessCanDisable}
4730
+ className="inline-flex h-8 items-center rounded-[4px] border border-[var(--vk-border)] px-3 text-[12px] text-[var(--vk-text-normal)] hover:bg-[var(--vk-bg-hover)] disabled:cursor-not-allowed disabled:opacity-50"
4731
+ >
4732
+ {remoteAccessMutating === "disable" ? "Disabling..." : "Disable"}
4733
+ </button>
4734
+ </div>
4735
+ </div>
4100
4736
 
4101
- <section className="space-y-2">
4102
- <h4 className="text-[15px] font-medium text-[var(--vk-text-strong)]">Markdown Editor</h4>
4103
- <p className="text-[12px] text-[var(--vk-text-muted)]">
4104
- Used as your second-brain markdown source when feeding context into tasks.
4105
- </p>
4106
- <div className="grid gap-2 sm:grid-cols-2">
4107
- {MARKDOWN_EDITOR_OPTIONS.map((option) => {
4108
- const selected = markdownEditor === option.id;
4109
- return (
4110
- <button
4111
- key={option.id}
4112
- type="button"
4113
- onClick={() => setMarkdownEditor(option.id)}
4114
- className={`flex items-center gap-2 rounded-[4px] border px-3 py-2 text-left ${
4115
- selected
4116
- ? "border-[var(--vk-orange)] bg-[var(--vk-bg-hover)]"
4117
- : "border-[var(--vk-border)] hover:bg-[var(--vk-bg-hover)]"
4118
- }`}
4119
- >
4120
- <MarkdownEditorIcon editorId={option.id} />
4121
- <span className="flex-1 text-[13px] text-[var(--vk-text-normal)]">{option.label}</span>
4122
- {selected && <Check className="h-3.5 w-3.5 text-[var(--vk-orange)]" />}
4123
- </button>
4124
- );
4125
- })}
4126
- </div>
4127
- </section>
4737
+ <p className="text-[12px] leading-5 text-[var(--vk-text-muted)]">
4738
+ {usingPrivateNetworkFlow
4739
+ ? remoteAccessSettings.installed
4740
+ ? "Tailscale is available on this machine. Conductor will publish a private HTTPS link inside your tailnet."
4741
+ : remoteAccessSettings.canAutoInstall && remoteAccessSettings.autoInstallMethod === "brew"
4742
+ ? "Tailscale is not installed yet. Conductor can install it automatically with Homebrew, but the machine still needs a Tailscale sign-in."
4743
+ : "Tailscale is not installed on this machine yet. Install and sign in once to enable the private remote link."
4744
+ : "Managed remote access now uses only a private Tailscale link. For an enterprise public URL, configure Cloudflare Access separately and point Conductor at that protected address."}
4745
+ </p>
4746
+ </div>
4747
+ ) : (
4748
+ <div className="rounded-[6px] border border-[var(--vk-border)] px-4 py-4">
4749
+ <span className="text-[11px] uppercase tracking-[0.12em] text-[var(--vk-text-muted)]">
4750
+ Enterprise Policy
4751
+ </span>
4752
+ <p className="mt-2 text-[13px] leading-5 text-[var(--vk-text-normal)]">
4753
+ {remoteAccessSettings.recommendedProvider === "tailscale"
4754
+ ? "Conductor is set up for a private VPN-style link. Install and sign in to Tailscale, then enable the private link from this screen."
4755
+ : "Conductor no longer publishes bearer-style unlock URLs. Configure verified Cloudflare Access and point `CONDUCTOR_PUBLIC_DASHBOARD_URL` at the protected external URL instead."}
4756
+ </p>
4757
+ </div>
4758
+ )}
4128
4759
 
4129
- <section className="space-y-2">
4130
- <h4 className="text-[15px] font-medium text-[var(--vk-text-strong)]">Notification Sound</h4>
4131
- <p className="text-[12px] text-[var(--vk-text-muted)]">Pick a sound for notifications, or disable sound.</p>
4132
- <div className="grid gap-2 sm:grid-cols-2">
4133
- {NOTIFICATION_SOUND_OPTIONS.map((option) => {
4134
- const selected = soundEnabled && soundFile === option.id;
4135
- return (
4136
- <button
4137
- key={option.id}
4138
- type="button"
4139
- onClick={() => {
4140
- setSoundEnabled(true);
4141
- setSoundFile(option.id);
4142
- }}
4143
- className={`flex items-center gap-2 rounded-[4px] border px-3 py-2 text-left ${
4144
- selected
4145
- ? "border-[var(--vk-orange)] bg-[var(--vk-bg-hover)]"
4146
- : "border-[var(--vk-border)] hover:bg-[var(--vk-bg-hover)]"
4147
- }`}
4148
- >
4149
- <Volume2 className="h-4 w-4 text-[var(--vk-text-muted)]" />
4150
- <span className="flex-1 text-[13px] text-[var(--vk-text-normal)]">{option.label}</span>
4151
- {selected && <Check className="h-3.5 w-3.5 text-[var(--vk-orange)]" />}
4152
- </button>
4153
- );
4154
- })}
4155
- <button
4156
- type="button"
4157
- onClick={() => setSoundEnabled(false)}
4158
- className={`flex items-center gap-2 rounded-[4px] border px-3 py-2 text-left ${
4159
- !soundEnabled
4160
- ? "border-[var(--vk-orange)] bg-[var(--vk-bg-hover)]"
4161
- : "border-[var(--vk-border)] hover:bg-[var(--vk-bg-hover)]"
4162
- }`}
4163
- >
4164
- <VolumeX className="h-4 w-4 text-[var(--vk-text-muted)]" />
4165
- <span className="flex-1 text-[13px] text-[var(--vk-text-normal)]">No sound</span>
4166
- {!soundEnabled && <Check className="h-3.5 w-3.5 text-[var(--vk-orange)]" />}
4167
- </button>
4168
- </div>
4169
- </section>
4170
- </>
4171
- )}
4760
+ {remoteAccessSettings.lastError && (
4761
+ <div className="rounded-[6px] border border-[var(--vk-red)]/35 bg-[var(--vk-red)]/10 px-4 py-3">
4762
+ <span className="text-[11px] uppercase tracking-[0.12em] text-[var(--vk-red)]">
4763
+ {usingPrivateNetworkFlow ? "Private Link Error" : "Tunnel Error"}
4764
+ </span>
4765
+ <p className="mt-2 text-[12px] leading-5 text-[var(--vk-red)]">
4766
+ {remoteAccessSettings.lastError}
4767
+ </p>
4768
+ </div>
4769
+ )}
4172
4770
 
4173
- {isRemoteAccessTab && (
4174
- <section className="space-y-3">
4175
- <div className="space-y-1">
4176
- <h4 className="text-[15px] font-medium text-[var(--vk-text-strong)]">Remote Access</h4>
4177
- <p className="text-[12px] text-[var(--vk-text-muted)]">
4178
- Use your local Remote-SSH editor to jump straight into a remote worktree. This complements
4179
- ngrok or Cloudflare Tunnel for dashboard access; it does not replace the tunnel.
4180
- </p>
4181
- </div>
4771
+ {remoteAccessSettings.connectUrl ? (
4772
+ <div className="space-y-2 rounded-[6px] border border-[var(--vk-border)] px-4 py-4">
4773
+ <div className="flex flex-wrap items-start justify-between gap-2">
4774
+ <div className="space-y-1">
4775
+ <span className="text-[11px] uppercase tracking-[0.12em] text-[var(--vk-text-muted)]">
4776
+ {remoteAccessSettings.mode === "private-network"
4777
+ ? "Private Remote URL"
4778
+ : "Protected Remote URL"}
4779
+ </span>
4780
+ <p className="text-[12px] text-[var(--vk-text-muted)]">
4781
+ {remoteAccessSettings.mode === "private-network"
4782
+ ? "Share this URL only with operators who are already authenticated to your private network."
4783
+ : "Share this protected URL. Recipients still need to pass the enterprise identity check before they reach Conductor."}
4784
+ </p>
4785
+ </div>
4786
+ <CopySnippetButton value={remoteAccessSettings.connectUrl} idleLabel="Copy URL" />
4787
+ </div>
4788
+ <code className="block break-all rounded-[4px] border border-[var(--vk-border)] bg-[var(--vk-bg-panel)] px-3 py-3 text-[12px] leading-5 text-[var(--vk-text-normal)]">
4789
+ {remoteAccessSettings.connectUrl}
4790
+ </code>
4791
+ </div>
4792
+ ) : (
4793
+ <div className="rounded-[6px] border border-[var(--vk-border)] px-4 py-3">
4794
+ <p className="text-[13px] text-[var(--vk-text-normal)]">
4795
+ {remoteAccessSettings.mode === "enterprise-only"
4796
+ ? remoteAccessSettings.recommendedProvider === "tailscale"
4797
+ ? remoteAccessSettings.connected
4798
+ ? "A private VPN URL will appear here after you enable the private link."
4799
+ : "A private VPN URL will appear here after Tailscale is installed and signed in."
4800
+ : "A protected enterprise remote URL will appear here after verified Cloudflare Access is configured."
4801
+ : "A protected remote URL is not available yet."}
4802
+ </p>
4803
+ </div>
4804
+ )}
4182
4805
 
4183
- <div className="grid gap-3 sm:grid-cols-2">
4184
- <label className="block">
4185
- <span className="mb-1.5 block text-[12px] font-medium text-[var(--vk-text-normal)]">SSH Host or Alias</span>
4186
- <input
4187
- value={remoteSshHost}
4188
- onChange={(event) => setRemoteSshHost(event.target.value)}
4189
- placeholder="e.g., conductor-dev or 203.0.113.10"
4190
- className="h-9 w-full rounded-[4px] border border-[var(--vk-border)] bg-transparent px-2 text-[14px] text-[var(--vk-text-normal)] outline-none focus:border-[var(--vk-orange)]"
4191
- />
4192
- </label>
4806
+ {remoteAccessSettings.warnings.length > 0 && (
4807
+ <div className="space-y-2 rounded-[6px] border border-[var(--vk-red)]/35 bg-[var(--vk-red)]/10 px-4 py-3">
4808
+ <span className="text-[11px] uppercase tracking-[0.12em] text-[var(--vk-red)]">
4809
+ Security Warnings
4810
+ </span>
4811
+ <div className="space-y-1.5">
4812
+ {remoteAccessSettings.warnings.map((warning) => (
4813
+ <p key={warning} className="text-[12px] leading-5 text-[var(--vk-red)]">
4814
+ {warning}
4815
+ </p>
4816
+ ))}
4817
+ </div>
4818
+ </div>
4819
+ )}
4193
4820
 
4194
- <label className="block">
4195
- <span className="mb-1.5 block text-[12px] font-medium text-[var(--vk-text-normal)]">SSH User (optional)</span>
4196
- <input
4197
- value={remoteSshUser}
4198
- onChange={(event) => setRemoteSshUser(event.target.value)}
4199
- placeholder="e.g., ubuntu"
4200
- className="h-9 w-full rounded-[4px] border border-[var(--vk-border)] bg-transparent px-2 text-[14px] text-[var(--vk-text-normal)] outline-none focus:border-[var(--vk-orange)]"
4201
- />
4202
- </label>
4203
- </div>
4821
+ {remoteAccessSettings.nextSteps.length > 0 && (
4822
+ <div className="space-y-2 rounded-[6px] border border-[var(--vk-border)] px-4 py-3">
4823
+ <span className="text-[11px] uppercase tracking-[0.12em] text-[var(--vk-text-muted)]">Next Steps</span>
4824
+ <div className="space-y-1.5">
4825
+ {remoteAccessSettings.nextSteps.map((step) => (
4826
+ <p key={step} className="text-[12px] leading-5 text-[var(--vk-text-muted)]">
4827
+ {step}
4828
+ </p>
4829
+ ))}
4830
+ </div>
4831
+ </div>
4832
+ )}
4833
+ </>
4834
+ )}
4835
+ </section>
4204
4836
 
4205
- <p className="text-[12px] text-[var(--vk-text-muted)]">
4206
- One-click remote open currently supports VS Code and VS Code Insiders. Other editors will still
4207
- save as your preference, but they will not get a remote launch button yet.
4208
- </p>
4209
- </section>
4837
+ </div>
4210
4838
  )}
4211
4839
  </div>
4212
4840
  ) : isRepositoriesTab ? (
@@ -4357,6 +4985,24 @@ function SettingsDialog({
4357
4985
  </div>
4358
4986
  )}
4359
4987
 
4988
+ <label className="block">
4989
+ <span className="mb-1.5 block text-[12px] font-medium text-[var(--vk-text-normal)]">Agent Permission Default</span>
4990
+ <select
4991
+ value={repositoryDraft.agentPermissions}
4992
+ onChange={(event) => setRepositoryDraft((prev) => prev ? {
4993
+ ...prev,
4994
+ agentPermissions: event.target.value === "default" ? "default" : "skip",
4995
+ } : prev)}
4996
+ className="h-9 w-full rounded-[4px] border border-[var(--vk-border)] bg-[var(--vk-bg-panel)] px-2 text-[13px] text-[var(--vk-text-normal)] outline-none focus:border-[var(--vk-orange)]"
4997
+ >
4998
+ <option value="skip">Auto approve and allow local dev servers</option>
4999
+ <option value="default">Sandboxed default mode</option>
5000
+ </select>
5001
+ <p className="mt-1 text-[12px] text-[var(--vk-text-muted)]">
5002
+ Applies to new sessions for this repository across all agents unless you override the launch mode.
5003
+ </p>
5004
+ </label>
5005
+
4360
5006
  <label className="block">
4361
5007
  <span className="mb-1.5 block text-[12px] font-medium text-[var(--vk-text-normal)]">Repository Path</span>
4362
5008
  <div className="flex items-center gap-2">
@@ -4482,9 +5128,78 @@ function SettingsDialog({
4482
5128
  placeholder="npm run dev"
4483
5129
  className="w-full rounded-[4px] border border-[var(--vk-border)] bg-transparent px-2 py-2 text-[13px] text-[var(--vk-text-normal)] outline-none focus:border-[var(--vk-orange)]"
4484
5130
  />
4485
- <p className="mt-1 text-[12px] text-[var(--vk-text-muted)]">Starts a development server for this repository.</p>
5131
+ <p className="mt-1 text-[12px] text-[var(--vk-text-muted)]">
5132
+ Optional. Leave this blank if you run the local app yourself and only want Conductor to auto-connect the preview.
5133
+ </p>
4486
5134
  </label>
4487
5135
 
5136
+ <div className="grid gap-3 sm:grid-cols-2">
5137
+ <label className="block">
5138
+ <span className="mb-1.5 block text-[12px] font-medium text-[var(--vk-text-normal)]">Dev Server CWD</span>
5139
+ <input
5140
+ value={repositoryDraft.devServerCwd}
5141
+ onChange={(event) => setRepositoryDraft((prev) => prev ? { ...prev, devServerCwd: event.target.value } : prev)}
5142
+ placeholder="e.g., apps/web"
5143
+ className="h-9 w-full rounded-[4px] border border-[var(--vk-border)] bg-transparent px-2 text-[13px] text-[var(--vk-text-normal)] outline-none focus:border-[var(--vk-orange)]"
5144
+ />
5145
+ <p className="mt-1 text-[12px] text-[var(--vk-text-muted)]">Runs the dev server from this subdirectory when set.</p>
5146
+ </label>
5147
+
5148
+ <label className="block">
5149
+ <span className="mb-1.5 block text-[12px] font-medium text-[var(--vk-text-normal)]">Preview URL Override</span>
5150
+ <input
5151
+ value={repositoryDraft.devServerUrl}
5152
+ onChange={(event) => setRepositoryDraft((prev) => prev ? { ...prev, devServerUrl: event.target.value } : prev)}
5153
+ placeholder="e.g., https://preview.example.com"
5154
+ className="h-9 w-full rounded-[4px] border border-[var(--vk-border)] bg-transparent px-2 text-[13px] text-[var(--vk-text-normal)] outline-none focus:border-[var(--vk-orange)]"
5155
+ />
5156
+ <p className="mt-1 text-[12px] text-[var(--vk-text-muted)]">If set, preview connects here first instead of inferring from logs.</p>
5157
+ </label>
5158
+ </div>
5159
+
5160
+ <div className="grid gap-3 sm:grid-cols-4">
5161
+ <label className="block">
5162
+ <span className="mb-1.5 block text-[12px] font-medium text-[var(--vk-text-normal)]">Preview Port</span>
5163
+ <input
5164
+ value={repositoryDraft.devServerPort}
5165
+ onChange={(event) => setRepositoryDraft((prev) => prev ? { ...prev, devServerPort: event.target.value } : prev)}
5166
+ inputMode="numeric"
5167
+ placeholder="3000"
5168
+ className="h-9 w-full rounded-[4px] border border-[var(--vk-border)] bg-transparent px-2 text-[13px] text-[var(--vk-text-normal)] outline-none focus:border-[var(--vk-orange)]"
5169
+ />
5170
+ </label>
5171
+
5172
+ <label className="block">
5173
+ <span className="mb-1.5 block text-[12px] font-medium text-[var(--vk-text-normal)]">Preview Host</span>
5174
+ <input
5175
+ value={repositoryDraft.devServerHost}
5176
+ onChange={(event) => setRepositoryDraft((prev) => prev ? { ...prev, devServerHost: event.target.value } : prev)}
5177
+ placeholder="127.0.0.1"
5178
+ className="h-9 w-full rounded-[4px] border border-[var(--vk-border)] bg-transparent px-2 text-[13px] text-[var(--vk-text-normal)] outline-none focus:border-[var(--vk-orange)]"
5179
+ />
5180
+ </label>
5181
+
5182
+ <label className="block">
5183
+ <span className="mb-1.5 block text-[12px] font-medium text-[var(--vk-text-normal)]">Preview Path</span>
5184
+ <input
5185
+ value={repositoryDraft.devServerPath}
5186
+ onChange={(event) => setRepositoryDraft((prev) => prev ? { ...prev, devServerPath: event.target.value } : prev)}
5187
+ placeholder="/"
5188
+ className="h-9 w-full rounded-[4px] border border-[var(--vk-border)] bg-transparent px-2 text-[13px] text-[var(--vk-text-normal)] outline-none focus:border-[var(--vk-orange)]"
5189
+ />
5190
+ </label>
5191
+
5192
+ <label className="flex items-center gap-2 rounded-[4px] border border-[var(--vk-border)] px-3 py-2 text-[13px] text-[var(--vk-text-normal)]">
5193
+ <input
5194
+ type="checkbox"
5195
+ checked={repositoryDraft.devServerHttps}
5196
+ onChange={(event) => setRepositoryDraft((prev) => prev ? { ...prev, devServerHttps: event.target.checked } : prev)}
5197
+ className="h-4 w-4 rounded border border-[var(--vk-border)] bg-transparent accent-[var(--vk-orange)]"
5198
+ />
5199
+ <span>Use HTTPS</span>
5200
+ </label>
5201
+ </div>
5202
+
4488
5203
  <label className="block">
4489
5204
  <span className="mb-1.5 block text-[12px] font-medium text-[var(--vk-text-normal)]">Setup Script</span>
4490
5205
  <textarea
@@ -4597,8 +5312,7 @@ function SettingsDialog({
4597
5312
  <section className="rounded-[6px] border border-[var(--vk-border)] bg-[rgba(80,80,80,0.18)] px-4 py-3">
4598
5313
  <p className="text-[12px] leading-5 text-[var(--vk-text-muted)]">
4599
5314
  You can review organization security here, but only an admin session can save changes.
4600
- Use the built-in unlock link, a local admin session, or an admin identity from your edge
4601
- auth provider to modify access rules.
5315
+ Use a local admin session or an admin identity from your edge auth provider to modify access rules.
4602
5316
  </p>
4603
5317
  </section>
4604
5318
  )}
@@ -4607,8 +5321,9 @@ function SettingsDialog({
4607
5321
  <div className="space-y-1">
4608
5322
  <h5 className="text-[18px] leading-[20px] text-[var(--vk-text-strong)]">Baseline Access Rules</h5>
4609
5323
  <p className="text-[12px] text-[var(--vk-text-muted)]">
4610
- Require authentication for every dashboard request and decide what authenticated users get
4611
- by default before explicit role bindings are applied.
5324
+ Require authentication for remote dashboard requests and decide what authenticated users get
5325
+ by default before explicit role bindings are applied. Localhost on this machine stays in a
5326
+ local admin recovery mode so setup and break-glass access keep working.
4612
5327
  </p>
4613
5328
  </div>
4614
5329
 
@@ -4620,12 +5335,17 @@ function SettingsDialog({
4620
5335
  ...prev,
4621
5336
  requireAuth: event.target.checked,
4622
5337
  }))}
4623
- disabled={!accessCanEdit || accessSaving}
5338
+ disabled={!accessCanEdit || accessSaving || accessSettings.trustedHeaders.enabled}
4624
5339
  className="mt-0.5 h-4 w-4 rounded border border-[var(--vk-border)] bg-transparent accent-[var(--vk-orange)]"
4625
5340
  />
4626
- <span>Require authentication even on localhost</span>
5341
+ <span>Require authentication for remote dashboard requests</span>
4627
5342
  </label>
4628
5343
 
5344
+ <p className="rounded-[4px] border border-[var(--vk-border)] bg-[var(--vk-bg-panel)] px-3 py-2 text-[12px] leading-5 text-[var(--vk-text-muted)]">
5345
+ Public share-link remote control has been removed. Remote access now requires either the private
5346
+ Tailscale link or an identity-bound provider such as Cloudflare Access or Clerk.
5347
+ </p>
5348
+
4629
5349
  <label className="block">
4630
5350
  <span className="mb-1.5 block text-[12px] font-medium text-[var(--vk-text-normal)]">Default Role</span>
4631
5351
  <select
@@ -4643,6 +5363,7 @@ function SettingsDialog({
4643
5363
  </select>
4644
5364
  <p className="mt-1 text-[12px] text-[var(--vk-text-muted)]">
4645
5365
  This applies after identity verification when no explicit email or domain binding matches.
5366
+ Cloudflare Access enterprise mode forces full authentication automatically.
4646
5367
  </p>
4647
5368
  </label>
4648
5369
  </section>
@@ -4662,6 +5383,7 @@ function SettingsDialog({
4662
5383
  checked={accessSettings.trustedHeaders.enabled}
4663
5384
  onChange={(event) => setAccessSettings((prev) => ({
4664
5385
  ...prev,
5386
+ requireAuth: event.target.checked ? true : prev.requireAuth,
4665
5387
  trustedHeaders: {
4666
5388
  ...prev.trustedHeaders,
4667
5389
  enabled: event.target.checked,
@@ -4676,21 +5398,9 @@ function SettingsDialog({
4676
5398
  <div className="grid gap-3 lg:grid-cols-2">
4677
5399
  <label className="block">
4678
5400
  <span className="mb-1.5 block text-[12px] font-medium text-[var(--vk-text-normal)]">Provider</span>
4679
- <select
4680
- value={accessSettings.trustedHeaders.provider}
4681
- onChange={(event) => setAccessSettings((prev) => ({
4682
- ...prev,
4683
- trustedHeaders: {
4684
- ...prev.trustedHeaders,
4685
- provider: event.target.value as TrustedHeaderAccessProvider,
4686
- },
4687
- }))}
4688
- disabled={!accessCanEdit || accessSaving}
4689
- className="h-9 w-full rounded-[4px] border border-[var(--vk-border)] bg-[var(--vk-bg-panel)] px-2 text-[13px] text-[var(--vk-text-normal)] outline-none focus:border-[var(--vk-orange)] disabled:opacity-60"
4690
- >
4691
- <option value="cloudflare-access">Cloudflare Access (verified JWT)</option>
4692
- <option value="generic">Generic header passthrough (advanced)</option>
4693
- </select>
5401
+ <div className="flex h-9 items-center rounded-[4px] border border-[var(--vk-border)] bg-[var(--vk-bg-panel)] px-2 text-[13px] text-[var(--vk-text-normal)]">
5402
+ Cloudflare Access (verified JWT)
5403
+ </div>
4694
5404
  </label>
4695
5405
 
4696
5406
  <label className="block">
@@ -4760,13 +5470,11 @@ function SettingsDialog({
4760
5470
  </label>
4761
5471
  </div>
4762
5472
 
4763
- {accessSettings.trustedHeaders.provider === "generic" && (
4764
- <p className="rounded-[4px] border border-[var(--vk-red)]/35 bg-[var(--vk-red)]/10 px-3 py-2 text-[12px] leading-5 text-[var(--vk-red)]">
4765
- Generic header passthrough is only safe when your reverse proxy strips user-supplied headers
4766
- and injects identity itself. Conductor blocks this mode by default unless
4767
- `CONDUCTOR_ALLOW_INSECURE_TRUSTED_HEADERS=true` is also set.
4768
- </p>
4769
- )}
5473
+ <p className="rounded-[4px] border border-[var(--vk-border)] bg-[var(--vk-bg-panel)] px-3 py-2 text-[12px] leading-5 text-[var(--vk-text-muted)]">
5474
+ Enterprise remote access requires a Cloudflare Access application that injects a verified JWT
5475
+ and email header. Conductor will not publish a shareable admin URL when that verification layer
5476
+ is missing.
5477
+ </p>
4770
5478
  </section>
4771
5479
 
4772
5480
  <section className="space-y-3 rounded-[6px] border border-[var(--vk-border)] px-4 py-4">
@@ -4976,6 +5684,18 @@ function SettingsDialog({
4976
5684
  void detectRepositoryBranches(selectedPath);
4977
5685
  }}
4978
5686
  />
5687
+ <FolderPickerDialog
5688
+ open={notesFolderPickerOpen}
5689
+ initialPath={markdownEditorPath ?? ""}
5690
+ title="Select Notes Root"
5691
+ description="Choose the local Obsidian vault, Logseq graph, or markdown notes folder used for context attachments."
5692
+ onClose={() => setNotesFolderPickerOpen(false)}
5693
+ onSelect={(selectedPath) => {
5694
+ setNotesFolderPickerOpen(false);
5695
+ if (selectedPath === null) return;
5696
+ setMarkdownEditorPath(selectedPath);
5697
+ }}
5698
+ />
4979
5699
  </>
4980
5700
  );
4981
5701
  }