tower-studio 0.1.2 → 0.1.3

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 (641) hide show
  1. package/bin/tower.mjs +5 -15
  2. package/next.config.ts +1 -8
  3. package/package.json +10 -11
  4. package/prisma/dev.db +0 -0
  5. package/public/vs/_commonjsHelpers-CT9FvmAN.js +1 -0
  6. package/public/vs/abap-D-t0cyap.js +1 -0
  7. package/public/vs/apex-CcIm7xu6.js +1 -0
  8. package/public/vs/assets/css.worker-HnVq6Ewq.js +93 -0
  9. package/public/vs/assets/editor.worker-Be8ye1pW.js +26 -0
  10. package/public/vs/assets/html.worker-B51mlPHg.js +470 -0
  11. package/public/vs/assets/json.worker-DKiEKt88.js +58 -0
  12. package/public/vs/assets/ts.worker-CMbG-7ft.js +67731 -0
  13. package/public/vs/azcli-BA0tQDCg.js +1 -0
  14. package/public/vs/basic-languages/monaco.contribution.js +1 -0
  15. package/public/vs/bat-C397hTD6.js +1 -0
  16. package/public/vs/bicep-DF5aW17k.js +2 -0
  17. package/public/vs/cameligo-plsz8qhj.js +1 -0
  18. package/public/vs/clojure-Y2auQMzK.js +1 -0
  19. package/public/vs/coffee-Bu45yuWE.js +1 -0
  20. package/public/vs/cpp-CkKPQIni.js +1 -0
  21. package/public/vs/csharp-CX28MZyh.js +1 -0
  22. package/public/vs/csp-D8uWnyxW.js +1 -0
  23. package/public/vs/css-CaeNmE3S.js +3 -0
  24. package/public/vs/cssMode-CjiAH6dQ.js +1 -0
  25. package/public/vs/cypher-DVThT8BS.js +1 -0
  26. package/public/vs/dart-CmGfCvrO.js +1 -0
  27. package/public/vs/dockerfile-CZqqYdch.js +1 -0
  28. package/public/vs/ecl-30fUercY.js +1 -0
  29. package/public/vs/editor/editor.main.css +1 -0
  30. package/public/vs/editor/editor.main.js +5 -0
  31. package/public/vs/editor.api-CalNCsUg.js +903 -0
  32. package/public/vs/elixir-xjPaIfzF.js +1 -0
  33. package/public/vs/flow9-DqtmStfK.js +1 -0
  34. package/public/vs/freemarker2-Cz_sV6Md.js +3 -0
  35. package/public/vs/fsharp-BOMdg4U1.js +1 -0
  36. package/public/vs/go-D_hbi-Jt.js +1 -0
  37. package/public/vs/graphql-CKUU4kLG.js +1 -0
  38. package/public/vs/handlebars-OwglfO-1.js +1 -0
  39. package/public/vs/hcl-DTaboeZW.js +1 -0
  40. package/public/vs/html-Pa1xEWsY.js +1 -0
  41. package/public/vs/htmlMode-Bz67EXwp.js +1 -0
  42. package/public/vs/ini-CsNwO04R.js +1 -0
  43. package/public/vs/java-CI4ZMsH9.js +1 -0
  44. package/public/vs/javascript-PczUCGdz.js +1 -0
  45. package/public/vs/jsonMode-DULH5oaX.js +7 -0
  46. package/public/vs/julia-BwzEvaQw.js +1 -0
  47. package/public/vs/kotlin-IUYPiTV8.js +1 -0
  48. package/public/vs/language/css/monaco.contribution.js +1 -0
  49. package/public/vs/language/html/monaco.contribution.js +1 -0
  50. package/public/vs/language/json/monaco.contribution.js +1 -0
  51. package/public/vs/language/typescript/monaco.contribution.js +1 -0
  52. package/public/vs/less-C0eDYdqa.js +2 -0
  53. package/public/vs/lexon-iON-Kj97.js +1 -0
  54. package/public/vs/liquid-DqKjdPGy.js +1 -0
  55. package/public/vs/loader.js +1368 -0
  56. package/public/vs/lspLanguageFeatures-kM9O9rjY.js +4 -0
  57. package/public/vs/lua-DtygF91M.js +1 -0
  58. package/public/vs/m3-CsR4AuFi.js +1 -0
  59. package/public/vs/markdown-C_rD0bIw.js +1 -0
  60. package/public/vs/mdx-DEWtB1K5.js +1 -0
  61. package/public/vs/mips-CiYP61RB.js +1 -0
  62. package/public/vs/monaco.contribution-D2OdxNBt.js +1 -0
  63. package/public/vs/monaco.contribution-DO3azKX8.js +1 -0
  64. package/public/vs/monaco.contribution-EcChJV6a.js +1 -0
  65. package/public/vs/monaco.contribution-qLAYrEOP.js +1 -0
  66. package/public/vs/msdax-C38-sJlp.js +1 -0
  67. package/public/vs/mysql-CdtbpvbG.js +1 -0
  68. package/public/vs/nls.messages-loader.js +1 -0
  69. package/public/vs/nls.messages.cs.js.js +17 -0
  70. package/public/vs/nls.messages.de.js.js +17 -0
  71. package/public/vs/nls.messages.es.js.js +17 -0
  72. package/public/vs/nls.messages.fr.js.js +15 -0
  73. package/public/vs/nls.messages.it.js.js +15 -0
  74. package/public/vs/nls.messages.ja.js.js +17 -0
  75. package/public/vs/nls.messages.js.js +10 -0
  76. package/public/vs/nls.messages.ko.js.js +25 -0
  77. package/public/vs/nls.messages.pl.js.js +17 -0
  78. package/public/vs/nls.messages.pt-br.js.js +6 -0
  79. package/public/vs/nls.messages.ru.js.js +17 -0
  80. package/public/vs/nls.messages.tr.js.js +15 -0
  81. package/public/vs/nls.messages.zh-cn.js.js +17 -0
  82. package/public/vs/nls.messages.zh-tw.js.js +15 -0
  83. package/public/vs/objective-c-CntZFaHX.js +1 -0
  84. package/public/vs/pascal-r6kuqfl_.js +1 -0
  85. package/public/vs/pascaligo-BiXoTmXh.js +1 -0
  86. package/public/vs/perl-DABw_TcH.js +1 -0
  87. package/public/vs/pgsql-me_jFXeX.js +1 -0
  88. package/public/vs/php-D_kh-9LK.js +1 -0
  89. package/public/vs/pla-VfZjczW0.js +1 -0
  90. package/public/vs/postiats-BBSzz8Pk.js +1 -0
  91. package/public/vs/powerquery-Dt-g_2cc.js +1 -0
  92. package/public/vs/powershell-B-7ap1zc.js +1 -0
  93. package/public/vs/protobuf-BmtuEB1A.js +2 -0
  94. package/public/vs/pug-BRpRNeEb.js +1 -0
  95. package/public/vs/python-Cr0UkIbn.js +1 -0
  96. package/public/vs/qsharp-BzsFaUU9.js +1 -0
  97. package/public/vs/r-f8dDdrp4.js +1 -0
  98. package/public/vs/razor-BYAHOTkz.js +1 -0
  99. package/public/vs/redis-fvZQY4PI.js +1 -0
  100. package/public/vs/redshift-45Et0LQi.js +1 -0
  101. package/public/vs/restructuredtext-C7UUFKFD.js +1 -0
  102. package/public/vs/ruby-CZO8zYTz.js +1 -0
  103. package/public/vs/rust-Bfetafyc.js +1 -0
  104. package/public/vs/sb-3GYllVck.js +1 -0
  105. package/public/vs/scala-foMgrKo1.js +1 -0
  106. package/public/vs/scheme-CHdMtr7p.js +1 -0
  107. package/public/vs/scss-C1cmLt9V.js +3 -0
  108. package/public/vs/shell-ClXCKCEW.js +1 -0
  109. package/public/vs/solidity-MZ6ExpPy.js +1 -0
  110. package/public/vs/sophia-DWkuSsPQ.js +1 -0
  111. package/public/vs/sparql-AUGFYSyk.js +1 -0
  112. package/public/vs/sql-32GpJSV2.js +1 -0
  113. package/public/vs/st-CuDFIVZ_.js +1 -0
  114. package/public/vs/swift-n-2HociN.js +3 -0
  115. package/public/vs/systemverilog-Ch4vA8Yt.js +1 -0
  116. package/public/vs/tcl-D74tq1nH.js +1 -0
  117. package/public/vs/tsMode-CZz1Umrk.js +11 -0
  118. package/public/vs/twig-C6taOxMV.js +1 -0
  119. package/public/vs/typescript-DfOrAzoV.js +1 -0
  120. package/public/vs/typespec-D-PIh9Xw.js +1 -0
  121. package/public/vs/vb-Dyb2648j.js +1 -0
  122. package/public/vs/wgsl-BhLXMOR0.js +298 -0
  123. package/public/vs/workers-DcJshg-q.js +1 -0
  124. package/public/vs/xml-CdsdnY8S.js +1 -0
  125. package/public/vs/yaml-DYGvmE88.js +1 -0
  126. package/src/actions/__tests__/agent-actions-username.test.ts +30 -0
  127. package/src/actions/__tests__/asset-actions.test.ts +251 -0
  128. package/src/actions/__tests__/assistant-actions.test.ts +20 -0
  129. package/src/actions/__tests__/cli-profile-actions.test.ts +243 -0
  130. package/src/actions/__tests__/label-actions.test.ts +187 -0
  131. package/src/actions/__tests__/note-actions.test.ts +237 -0
  132. package/src/actions/__tests__/onboarding-actions.test.ts +265 -0
  133. package/src/actions/__tests__/project-actions.test.ts +179 -0
  134. package/src/actions/__tests__/prompt-actions.test.ts +213 -0
  135. package/src/actions/__tests__/report-actions.test.ts +246 -0
  136. package/src/actions/__tests__/search-code-actions.test.ts +308 -0
  137. package/src/actions/__tests__/task-actions-overview.test.ts +58 -0
  138. package/src/actions/__tests__/task-actions-pin.test.ts +79 -0
  139. package/src/actions/__tests__/workspace-actions.test.ts +256 -0
  140. package/src/components/layout/__tests__/top-bar-username.test.tsx +24 -0
  141. package/src/components/onboarding/__tests__/onboarding-wizard.test.tsx +185 -0
  142. package/src/hooks/__tests__/sse-event-reducer.test.ts +263 -0
  143. package/src/hooks/__tests__/use-assistant-chat.test.ts +34 -0
  144. package/src/hooks/__tests__/use-image-upload.test.ts +443 -0
  145. package/src/lib/__tests__/assistant-message-converter.test.ts +162 -0
  146. package/src/lib/__tests__/assistant-sessions.test.ts +253 -0
  147. package/src/lib/__tests__/build-multimodal-prompt.test.ts +173 -0
  148. package/src/lib/__tests__/config-reader.test.ts +75 -0
  149. package/src/lib/__tests__/diff-parser.test.ts +212 -0
  150. package/src/lib/__tests__/execution-summary.test.ts +237 -0
  151. package/src/lib/__tests__/file-serve.test.ts +178 -0
  152. package/src/lib/__tests__/file-utils.test.ts +177 -0
  153. package/src/lib/__tests__/internal-api-guard.test.ts +151 -0
  154. package/src/lib/__tests__/logger.test.ts +181 -0
  155. package/src/lib/__tests__/platform.test.ts +566 -0
  156. package/src/lib/__tests__/reveal-route-security.test.ts +65 -0
  157. package/src/lib/__tests__/schemas.test.ts +377 -0
  158. package/src/lib/__tests__/terminal-link-provider.test.ts +160 -0
  159. package/src/lib/__tests__/upload-route-security.test.ts +120 -0
  160. package/src/lib/ai/__tests__/capability-resolver.test.ts +71 -0
  161. package/src/lib/ai/__tests__/claude-cli-adapter.test.ts +103 -0
  162. package/src/lib/ai/__tests__/provider-registry.test.ts +74 -0
  163. package/src/lib/pty/__tests__/ws-server-assistant.test.ts +7 -0
  164. package/.next/standalone/tower/.claude/rules/process-lifecycle.md +0 -31
  165. package/.next/standalone/tower/.claude/rules/security.md +0 -29
  166. package/.next/standalone/tower/.claude/rules/ui.md +0 -105
  167. package/.next/standalone/tower/AGENTS.md +0 -325
  168. package/.next/standalone/tower/CHANGELOG.md +0 -63
  169. package/.next/standalone/tower/CLAUDE.md +0 -33
  170. package/.next/standalone/tower/LICENSE +0 -21
  171. package/.next/standalone/tower/README.md +0 -214
  172. package/.next/standalone/tower/README.zh.md +0 -212
  173. package/.next/standalone/tower/bin/tower.mjs +0 -180
  174. package/.next/standalone/tower/docs/README.md +0 -51
  175. package/.next/standalone/tower/docs/ai/README.md +0 -91
  176. package/.next/standalone/tower/docs/ai/cli-abstraction-design.md +0 -398
  177. package/.next/standalone/tower/docs/ai/cli-abstraction-plan.md +0 -1345
  178. package/.next/standalone/tower/docs/assets-notes/README.md +0 -41
  179. package/.next/standalone/tower/docs/assistant/README.md +0 -48
  180. package/.next/standalone/tower/docs/board/README.md +0 -36
  181. package/.next/standalone/tower/docs/diagrams/tower-ai-architecture-en.html +0 -259
  182. package/.next/standalone/tower/docs/diagrams/tower-ai-architecture.html +0 -259
  183. package/.next/standalone/tower/docs/diagrams/tower-data-model-en.html +0 -344
  184. package/.next/standalone/tower/docs/diagrams/tower-data-model.html +0 -344
  185. package/.next/standalone/tower/docs/diagrams/tower-module-map-en.html +0 -176
  186. package/.next/standalone/tower/docs/diagrams/tower-module-map.html +0 -176
  187. package/.next/standalone/tower/docs/diagrams/tower-system-architecture-en.html +0 -336
  188. package/.next/standalone/tower/docs/diagrams/tower-system-architecture.html +0 -336
  189. package/.next/standalone/tower/docs/diagrams/tower-task-lifecycle-en.html +0 -251
  190. package/.next/standalone/tower/docs/diagrams/tower-task-lifecycle.html +0 -251
  191. package/.next/standalone/tower/docs/en/guide/architecture.md +0 -79
  192. package/.next/standalone/tower/docs/en/guide/diagrams.md +0 -24
  193. package/.next/standalone/tower/docs/en/guide/getting-started.md +0 -80
  194. package/.next/standalone/tower/docs/en/guide/introduction.md +0 -84
  195. package/.next/standalone/tower/docs/en/index.md +0 -36
  196. package/.next/standalone/tower/docs/en/modules/ai.md +0 -110
  197. package/.next/standalone/tower/docs/en/modules/assets-notes.md +0 -56
  198. package/.next/standalone/tower/docs/en/modules/assistant.md +0 -63
  199. package/.next/standalone/tower/docs/en/modules/board.md +0 -44
  200. package/.next/standalone/tower/docs/en/modules/git.md +0 -55
  201. package/.next/standalone/tower/docs/en/modules/i18n.md +0 -35
  202. package/.next/standalone/tower/docs/en/modules/mcp.md +0 -62
  203. package/.next/standalone/tower/docs/en/modules/missions.md +0 -47
  204. package/.next/standalone/tower/docs/en/modules/project.md +0 -57
  205. package/.next/standalone/tower/docs/en/modules/search.md +0 -49
  206. package/.next/standalone/tower/docs/en/modules/settings.md +0 -63
  207. package/.next/standalone/tower/docs/en/modules/task.md +0 -82
  208. package/.next/standalone/tower/docs/en/modules/terminal.md +0 -73
  209. package/.next/standalone/tower/docs/en/modules/workspace.md +0 -61
  210. package/.next/standalone/tower/docs/git/README.md +0 -42
  211. package/.next/standalone/tower/docs/guide/architecture.md +0 -29
  212. package/.next/standalone/tower/docs/guide/diagrams.md +0 -24
  213. package/.next/standalone/tower/docs/guide/getting-started.md +0 -80
  214. package/.next/standalone/tower/docs/guide/introduction.md +0 -84
  215. package/.next/standalone/tower/docs/i18n/README.md +0 -23
  216. package/.next/standalone/tower/docs/index.md +0 -36
  217. package/.next/standalone/tower/docs/mcp/README.md +0 -50
  218. package/.next/standalone/tower/docs/missions/README.md +0 -40
  219. package/.next/standalone/tower/docs/modules/ai.md +0 -104
  220. package/.next/standalone/tower/docs/modules/assets-notes.md +0 -68
  221. package/.next/standalone/tower/docs/modules/assistant.md +0 -74
  222. package/.next/standalone/tower/docs/modules/board.md +0 -56
  223. package/.next/standalone/tower/docs/modules/git.md +0 -61
  224. package/.next/standalone/tower/docs/modules/i18n.md +0 -38
  225. package/.next/standalone/tower/docs/modules/mcp.md +0 -68
  226. package/.next/standalone/tower/docs/modules/missions.md +0 -54
  227. package/.next/standalone/tower/docs/modules/project.md +0 -65
  228. package/.next/standalone/tower/docs/modules/search.md +0 -57
  229. package/.next/standalone/tower/docs/modules/settings.md +0 -72
  230. package/.next/standalone/tower/docs/modules/task.md +0 -82
  231. package/.next/standalone/tower/docs/modules/terminal.md +0 -70
  232. package/.next/standalone/tower/docs/modules/workspace.md +0 -68
  233. package/.next/standalone/tower/docs/package.json +0 -11
  234. package/.next/standalone/tower/docs/pnpm-lock.yaml +0 -1620
  235. package/.next/standalone/tower/docs/postcss.config.mjs +0 -2
  236. package/.next/standalone/tower/docs/project/README.md +0 -45
  237. package/.next/standalone/tower/docs/public/banner.png +0 -0
  238. package/.next/standalone/tower/docs/public/diagrams/tower-ai-architecture-en.html +0 -259
  239. package/.next/standalone/tower/docs/public/diagrams/tower-ai-architecture.html +0 -259
  240. package/.next/standalone/tower/docs/public/diagrams/tower-data-model-en.html +0 -344
  241. package/.next/standalone/tower/docs/public/diagrams/tower-data-model.html +0 -344
  242. package/.next/standalone/tower/docs/public/diagrams/tower-module-map-en.html +0 -176
  243. package/.next/standalone/tower/docs/public/diagrams/tower-module-map.html +0 -176
  244. package/.next/standalone/tower/docs/public/diagrams/tower-system-architecture-en.html +0 -336
  245. package/.next/standalone/tower/docs/public/diagrams/tower-system-architecture.html +0 -336
  246. package/.next/standalone/tower/docs/public/diagrams/tower-task-lifecycle-en.html +0 -251
  247. package/.next/standalone/tower/docs/public/diagrams/tower-task-lifecycle.html +0 -251
  248. package/.next/standalone/tower/docs/search/README.md +0 -37
  249. package/.next/standalone/tower/docs/settings/README.md +0 -43
  250. package/.next/standalone/tower/docs/task/README.md +0 -67
  251. package/.next/standalone/tower/docs/terminal/README.md +0 -58
  252. package/.next/standalone/tower/docs/workspace/README.md +0 -50
  253. package/.next/standalone/tower/docs/zh/guide/architecture.md +0 -29
  254. package/.next/standalone/tower/docs/zh/guide/diagrams.md +0 -24
  255. package/.next/standalone/tower/docs/zh/guide/getting-started.md +0 -80
  256. package/.next/standalone/tower/docs/zh/guide/introduction.md +0 -66
  257. package/.next/standalone/tower/docs/zh/index.md +0 -23
  258. package/.next/standalone/tower/docs/zh/modules/ai.md +0 -104
  259. package/.next/standalone/tower/docs/zh/modules/assets-notes.md +0 -68
  260. package/.next/standalone/tower/docs/zh/modules/assistant.md +0 -74
  261. package/.next/standalone/tower/docs/zh/modules/board.md +0 -56
  262. package/.next/standalone/tower/docs/zh/modules/git.md +0 -61
  263. package/.next/standalone/tower/docs/zh/modules/i18n.md +0 -38
  264. package/.next/standalone/tower/docs/zh/modules/mcp.md +0 -68
  265. package/.next/standalone/tower/docs/zh/modules/missions.md +0 -54
  266. package/.next/standalone/tower/docs/zh/modules/project.md +0 -65
  267. package/.next/standalone/tower/docs/zh/modules/search.md +0 -57
  268. package/.next/standalone/tower/docs/zh/modules/settings.md +0 -72
  269. package/.next/standalone/tower/docs/zh/modules/task.md +0 -82
  270. package/.next/standalone/tower/docs/zh/modules/terminal.md +0 -70
  271. package/.next/standalone/tower/docs/zh/modules/workspace.md +0 -68
  272. package/.next/standalone/tower/eslint.config.mjs +0 -18
  273. package/.next/standalone/tower/next.config.ts +0 -15
  274. package/.next/standalone/tower/package.json +0 -117
  275. package/.next/standalone/tower/playwright.config.ts +0 -28
  276. package/.next/standalone/tower/pnpm-lock.yaml +0 -10524
  277. package/.next/standalone/tower/pnpm-workspace.yaml +0 -6
  278. package/.next/standalone/tower/prisma/init-fts.ts +0 -23
  279. package/.next/standalone/tower/prisma/schema.prisma +0 -290
  280. package/.next/standalone/tower/prompts/backend-developer.md +0 -20
  281. package/.next/standalone/tower/prompts/code-reviewer.md +0 -19
  282. package/.next/standalone/tower/prompts/frontend-developer.md +0 -20
  283. package/.next/standalone/tower/prompts/product-manager.md +0 -16
  284. package/.next/standalone/tower/public/banner.jpg +0 -0
  285. package/.next/standalone/tower/public/logo.png +0 -0
  286. package/.next/standalone/tower/scripts/copy-monaco.js +0 -27
  287. package/.next/standalone/tower/scripts/init-db.ts +0 -74
  288. package/.next/standalone/tower/scripts/migrate-data.ts +0 -102
  289. package/.next/standalone/tower/server.js +0 -38
  290. package/.next/standalone/tower/src/app/favicon.ico +0 -0
  291. package/.next/standalone/tower/src/mcp/db.ts +0 -11
  292. package/.next/standalone/tower/src/mcp/index.ts +0 -15
  293. package/.next/standalone/tower/src/mcp/server.ts +0 -52
  294. package/.next/standalone/tower/src/mcp/tools/knowledge-tools.ts +0 -100
  295. package/.next/standalone/tower/src/mcp/tools/label-tools.ts +0 -70
  296. package/.next/standalone/tower/src/mcp/tools/note-asset-tools.ts +0 -271
  297. package/.next/standalone/tower/src/mcp/tools/project-tools.ts +0 -79
  298. package/.next/standalone/tower/src/mcp/tools/report-tools.ts +0 -214
  299. package/.next/standalone/tower/src/mcp/tools/search-tools.ts +0 -32
  300. package/.next/standalone/tower/src/mcp/tools/task-tools.ts +0 -250
  301. package/.next/standalone/tower/src/mcp/tools/terminal-tools.ts +0 -154
  302. package/.next/standalone/tower/src/mcp/tools/workspace-tools.ts +0 -73
  303. package/.next/standalone/tower/tests/e2e/chat-flow.spec.ts +0 -249
  304. package/.next/standalone/tower/tests/e2e/notes-assets.spec.ts +0 -287
  305. package/.next/standalone/tower/tests/e2e/search.spec.ts +0 -186
  306. package/.next/standalone/tower/tests/e2e/settings-flow.spec.ts +0 -250
  307. package/.next/standalone/tower/tests/e2e/settings.spec.ts +0 -261
  308. package/.next/standalone/tower/tests/e2e/smoke.spec.ts +0 -317
  309. package/.next/standalone/tower/tests/e2e/task-flow.spec.ts +0 -287
  310. package/.next/standalone/tower/tests/e2e/workbench.spec.ts +0 -307
  311. package/.next/standalone/tower/tests/setup.ts +0 -15
  312. package/.next/standalone/tower/tests/unit/actions/agent-actions.test.ts +0 -157
  313. package/.next/standalone/tower/tests/unit/actions/config-actions.test.ts +0 -170
  314. package/.next/standalone/tower/tests/unit/actions/file-actions.test.ts +0 -283
  315. package/.next/standalone/tower/tests/unit/actions/git-actions.test.ts +0 -34
  316. package/.next/standalone/tower/tests/unit/actions/preview-actions.test.ts +0 -177
  317. package/.next/standalone/tower/tests/unit/actions/search-actions.test.ts +0 -358
  318. package/.next/standalone/tower/tests/unit/actions/task-actions.test.ts +0 -173
  319. package/.next/standalone/tower/tests/unit/api/diff-route.test.ts +0 -9
  320. package/.next/standalone/tower/tests/unit/api/file-serving.test.ts +0 -88
  321. package/.next/standalone/tower/tests/unit/api/merge-route.test.ts +0 -9
  322. package/.next/standalone/tower/tests/unit/api/stream-persist-result.test.ts +0 -7
  323. package/.next/standalone/tower/tests/unit/api/stream-send-back.test.ts +0 -7
  324. package/.next/standalone/tower/tests/unit/components/asset-item.test.tsx +0 -105
  325. package/.next/standalone/tower/tests/unit/components/asset-list.test.tsx +0 -51
  326. package/.next/standalone/tower/tests/unit/components/assets/asset-upload.test.tsx +0 -70
  327. package/.next/standalone/tower/tests/unit/components/board-stats.test.tsx +0 -32
  328. package/.next/standalone/tower/tests/unit/components/category-filter.test.tsx +0 -58
  329. package/.next/standalone/tower/tests/unit/components/cli-adapter-tester.test.tsx +0 -160
  330. package/.next/standalone/tower/tests/unit/components/create-task-dialog.test.tsx +0 -162
  331. package/.next/standalone/tower/tests/unit/components/file-tree.test.tsx +0 -172
  332. package/.next/standalone/tower/tests/unit/components/note-card.test.tsx +0 -71
  333. package/.next/standalone/tower/tests/unit/components/note-editor.test.tsx +0 -39
  334. package/.next/standalone/tower/tests/unit/components/prompts-config.test.tsx +0 -200
  335. package/.next/standalone/tower/tests/unit/components/search-dialog.test.tsx +0 -223
  336. package/.next/standalone/tower/tests/unit/components/system-config.test.tsx +0 -32
  337. package/.next/standalone/tower/tests/unit/hooks/hook-registration.test.ts +0 -89
  338. package/.next/standalone/tower/tests/unit/hooks/stop-hook.test.ts +0 -108
  339. package/.next/standalone/tower/tests/unit/lib/asset-actions.test.ts +0 -257
  340. package/.next/standalone/tower/tests/unit/lib/file-utils.test.ts +0 -102
  341. package/.next/standalone/tower/tests/unit/lib/fs-security.test.ts +0 -34
  342. package/.next/standalone/tower/tests/unit/lib/fts.test.ts +0 -214
  343. package/.next/standalone/tower/tests/unit/lib/git-url.test.ts +0 -258
  344. package/.next/standalone/tower/tests/unit/lib/instrumentation.test.ts +0 -86
  345. package/.next/standalone/tower/tests/unit/lib/local-path-to-api-url.test.ts +0 -40
  346. package/.next/standalone/tower/tests/unit/lib/mime-magic.test.ts +0 -95
  347. package/.next/standalone/tower/tests/unit/lib/note-actions.test.ts +0 -296
  348. package/.next/standalone/tower/tests/unit/lib/preview-process-manager.test.ts +0 -107
  349. package/.next/standalone/tower/tests/unit/lib/process-manager.test.ts +0 -10
  350. package/.next/standalone/tower/tests/unit/lib/pty-session.test.ts +0 -171
  351. package/.next/standalone/tower/tests/unit/lib/search.test.ts +0 -289
  352. package/.next/standalone/tower/tests/unit/lib/session-store.test.ts +0 -111
  353. package/.next/standalone/tower/tests/unit/lib/utils.test.ts +0 -33
  354. package/.next/standalone/tower/tests/unit/lib/worktree.test.ts +0 -190
  355. package/.next/standalone/tower/tests/unit/mcp/identify-project.test.ts +0 -217
  356. package/.next/standalone/tower/tests/unit/mcp/manage-assets.test.ts +0 -199
  357. package/.next/standalone/tower/tests/unit/mcp/manage-notes.test.ts +0 -304
  358. package/.next/standalone/tower/tests/unit/mcp/search-tools.test.ts +0 -186
  359. package/.next/standalone/tower/tests/unit/missions-merge.test.ts +0 -43
  360. package/.next/standalone/tower/tower-studio-0.1.1.tgz +0 -0
  361. package/.next/standalone/tower/tsconfig.json +0 -34
  362. package/.next/standalone/tower/vitest.config.ts +0 -17
  363. package/.next/static/a6HR9cTK7s4aKfE5dWzjz/_buildManifest.js +0 -11
  364. package/.next/static/a6HR9cTK7s4aKfE5dWzjz/_clientMiddlewareManifest.js +0 -1
  365. package/.next/static/a6HR9cTK7s4aKfE5dWzjz/_ssgManifest.js +0 -1
  366. package/.next/static/chunks/00z-g3x93ngvn.js +0 -1
  367. package/.next/static/chunks/024pdsc27tjdd.js +0 -5
  368. package/.next/static/chunks/02dd83gbiv778.js +0 -1
  369. package/.next/static/chunks/03e.4ymu.j5wl.js +0 -1
  370. package/.next/static/chunks/03~yq9q893hmn.js +0 -1
  371. package/.next/static/chunks/05-b9qqm3av9~.js +0 -1
  372. package/.next/static/chunks/05~v02mkan5z..js +0 -1
  373. package/.next/static/chunks/0abtpeymj-58i.js +0 -1
  374. package/.next/static/chunks/0b6us7uq72u-d.js +0 -1
  375. package/.next/static/chunks/0drgc-oztq6o-.css +0 -1
  376. package/.next/static/chunks/0eaa2lmymh2fx.js +0 -1
  377. package/.next/static/chunks/0gb82g.6g90mn.js +0 -1
  378. package/.next/static/chunks/0gnm22yv~f54b.js +0 -1
  379. package/.next/static/chunks/0j9qriqni_r1..js +0 -2
  380. package/.next/static/chunks/0k.u8sxy~e469.js +0 -4
  381. package/.next/static/chunks/0lnhjf2a~jaco.js +0 -83
  382. package/.next/static/chunks/0lvd52mjiit6s.js +0 -1
  383. package/.next/static/chunks/0mq0uqbbbb1~2.js +0 -1
  384. package/.next/static/chunks/0neevhl_o1ozu.css +0 -2
  385. package/.next/static/chunks/0omj~p3uxkic-.js +0 -1
  386. package/.next/static/chunks/0t-gr6j-c65qb.js +0 -1
  387. package/.next/static/chunks/0t16ai99uv4j3.js +0 -1
  388. package/.next/static/chunks/0tcl81ybuob5i.js +0 -1
  389. package/.next/static/chunks/0uqimvsni_op~.js +0 -1
  390. package/.next/static/chunks/0wt3kws~_yr8z.js +0 -1
  391. package/.next/static/chunks/0xzdu87n_for1.js +0 -5
  392. package/.next/static/chunks/0y0tdl.rl6v1u.js +0 -1
  393. package/.next/static/chunks/0z2bzovqhl2f5.js +0 -1
  394. package/.next/static/chunks/0z4y0x1ifgy.e.js +0 -1
  395. package/.next/static/chunks/0z7bwntvfhxzi.js +0 -12
  396. package/.next/static/chunks/102ijqpvi0z-d.js +0 -1
  397. package/.next/static/chunks/10n23t.1hpb-1.js +0 -1
  398. package/.next/static/chunks/11_e3-j5gzbj4.js +0 -1
  399. package/.next/static/chunks/14.ims4y7osot.js +0 -1
  400. package/.next/static/chunks/14xzmrt5ly6gq.js +0 -31
  401. package/.next/static/chunks/151wr~6x8aclx.js +0 -1
  402. package/.next/static/chunks/169po6_~f3-d5.js +0 -1
  403. package/.next/static/chunks/16w-ap~msrwpj.js +0 -1
  404. package/.next/static/chunks/176n7f13ve~a9.js +0 -1
  405. package/.next/static/chunks/17oc2l.ekcs8b.css +0 -1
  406. package/.next/static/chunks/turbopack-0wjmrsi.z32s0.js +0 -1
  407. package/.next/static/media/4fa387ec64143e14-s.0q3udbd2bu5yp.woff2 +0 -0
  408. package/.next/static/media/7178b3e590c64307-s.11.cyxs5p-0z~.woff2 +0 -0
  409. package/.next/static/media/797e433ab948586e-s.p.0.q-h669a_dqa.woff2 +0 -0
  410. package/.next/static/media/8a480f0b521d4e75-s.06d3mdzz5bre_.woff2 +0 -0
  411. package/.next/static/media/apple-icon.16aocl-s-v2qz.png +0 -0
  412. package/.next/static/media/bbc41e54d2fcbd21-s.0gw~uztddq1df.woff2 +0 -0
  413. package/.next/static/media/caa3a2e1cccd8315-s.p.16t1db8_9y2o~.woff2 +0 -0
  414. package/.next/static/media/favicon.0y2d6j9cou~8p.ico +0 -0
  415. package/.next/static/media/icon0.0a6mkq6meyird.svg +0 -1
  416. package/.next/static/media/icon1.04ux133882seb.png +0 -0
  417. /package/{.next/standalone/tower/components.json → components.json} +0 -0
  418. /package/{.next/standalone/tower/postcss.config.mjs → postcss.config.mjs} +0 -0
  419. /package/{.next/standalone/tower/prisma → prisma}/prisma/dev.db +0 -0
  420. /package/{.next/standalone/tower/prisma → prisma}/seed.ts +0 -0
  421. /package/{.next/standalone/tower/docs/public → public}/banner.jpg +0 -0
  422. /package/{.next/standalone/tower/docs/public → public}/logo.png +0 -0
  423. /package/{.next/standalone/tower/public → public}/web-app-manifest-192x192.png +0 -0
  424. /package/{.next/standalone/tower/public → public}/web-app-manifest-512x512.png +0 -0
  425. /package/{.next/standalone/tower/scripts → scripts}/init-tower.ts +0 -0
  426. /package/{.next/standalone/tower/scripts → scripts}/post-tool-hook.js +0 -0
  427. /package/{.next/standalone/tower/scripts → scripts}/session-start-hook.js +0 -0
  428. /package/{.next/standalone/tower/scripts → scripts}/stop-hook.js +0 -0
  429. /package/{.next/standalone/tower/skills → skills}/tower/SKILL.md +0 -0
  430. /package/{.next/standalone/tower/src → src}/actions/agent-actions.ts +0 -0
  431. /package/{.next/standalone/tower/src → src}/actions/agent-config-actions.ts +0 -0
  432. /package/{.next/standalone/tower/src → src}/actions/ai-config-actions.ts +0 -0
  433. /package/{.next/standalone/tower/src → src}/actions/asset-actions.ts +0 -0
  434. /package/{.next/standalone/tower/src → src}/actions/assistant-actions.ts +0 -0
  435. /package/{.next/standalone/tower/src → src}/actions/cli-profile-actions.ts +0 -0
  436. /package/{.next/standalone/tower/src → src}/actions/config-actions.ts +0 -0
  437. /package/{.next/standalone/tower/src → src}/actions/file-actions.ts +0 -0
  438. /package/{.next/standalone/tower/src → src}/actions/git-actions.ts +0 -0
  439. /package/{.next/standalone/tower/src → src}/actions/label-actions.ts +0 -0
  440. /package/{.next/standalone/tower/src → src}/actions/note-actions.ts +0 -0
  441. /package/{.next/standalone/tower/src → src}/actions/onboarding-actions.ts +0 -0
  442. /package/{.next/standalone/tower/src → src}/actions/preview-actions.ts +0 -0
  443. /package/{.next/standalone/tower/src → src}/actions/project-actions.ts +0 -0
  444. /package/{.next/standalone/tower/src → src}/actions/prompt-actions.ts +0 -0
  445. /package/{.next/standalone/tower/src → src}/actions/report-actions.ts +0 -0
  446. /package/{.next/standalone/tower/src → src}/actions/search-actions.ts +0 -0
  447. /package/{.next/standalone/tower/src → src}/actions/search-code-actions.ts +0 -0
  448. /package/{.next/standalone/tower/src → src}/actions/task-actions.ts +0 -0
  449. /package/{.next/standalone/tower/src → src}/actions/workspace-actions.ts +0 -0
  450. /package/{.next/standalone/tower/src → src}/app/api/adapters/test/route.ts +0 -0
  451. /package/{.next/standalone/tower/src → src}/app/api/browse-fs/route.ts +0 -0
  452. /package/{.next/standalone/tower/src → src}/app/api/files/assets/[projectId]/[filename]/route.ts +0 -0
  453. /package/{.next/standalone/tower/src → src}/app/api/git/route.ts +0 -0
  454. /package/{.next/standalone/tower/src → src}/app/api/internal/assets/[projectId]/[filename]/route.ts +0 -0
  455. /package/{.next/standalone/tower/src → src}/app/api/internal/assets/reveal/route.ts +0 -0
  456. /package/{.next/standalone/tower/src → src}/app/api/internal/assistant/chat/route.ts +0 -0
  457. /package/{.next/standalone/tower/src → src}/app/api/internal/assistant/images/route.ts +0 -0
  458. /package/{.next/standalone/tower/src → src}/app/api/internal/assistant/route.ts +0 -0
  459. /package/{.next/standalone/tower/src → src}/app/api/internal/assistant/sessions/route.ts +0 -0
  460. /package/{.next/standalone/tower/src → src}/app/api/internal/cache/[...segments]/route.ts +0 -0
  461. /package/{.next/standalone/tower/src → src}/app/api/internal/hooks/install/route.ts +0 -0
  462. /package/{.next/standalone/tower/src → src}/app/api/internal/hooks/session/route.ts +0 -0
  463. /package/{.next/standalone/tower/src → src}/app/api/internal/hooks/stop/route.ts +0 -0
  464. /package/{.next/standalone/tower/src → src}/app/api/internal/hooks/upload/route.ts +0 -0
  465. /package/{.next/standalone/tower/src → src}/app/api/internal/notifications/pending/route.ts +0 -0
  466. /package/{.next/standalone/tower/src → src}/app/api/internal/terminal/[taskId]/buffer/route.ts +0 -0
  467. /package/{.next/standalone/tower/src → src}/app/api/internal/terminal/[taskId]/input/route.ts +0 -0
  468. /package/{.next/standalone/tower/src → src}/app/api/internal/terminal/[taskId]/start/route.ts +0 -0
  469. /package/{.next/standalone/tower/src → src}/app/api/tasks/[taskId]/diff/route.ts +0 -0
  470. /package/{.next/standalone/tower/src → src}/app/api/tasks/[taskId]/merge/route.ts +0 -0
  471. /package/{.next/standalone/tower/src → src}/app/apple-icon.png +0 -0
  472. /package/{.next/standalone/tower/docs/public → src/app}/favicon.ico +0 -0
  473. /package/{.next/standalone/tower/src → src}/app/globals.css +0 -0
  474. /package/{.next/standalone/tower/src → src}/app/icon0.svg +0 -0
  475. /package/{.next/standalone/tower/src → src}/app/icon1.png +0 -0
  476. /package/{.next/standalone/tower/src → src}/app/layout.tsx +0 -0
  477. /package/{.next/standalone/tower/src → src}/app/manifest.json +0 -0
  478. /package/{.next/standalone/tower/src → src}/app/missions/missions-client.tsx +0 -0
  479. /package/{.next/standalone/tower/src → src}/app/missions/page.tsx +0 -0
  480. /package/{.next/standalone/tower/src → src}/app/onboarding/page.tsx +0 -0
  481. /package/{.next/standalone/tower/src → src}/app/page.tsx +0 -0
  482. /package/{.next/standalone/tower/src → src}/app/settings/page.tsx +0 -0
  483. /package/{.next/standalone/tower/src → src}/app/workspaces/[workspaceId]/archive/archive-page-client.tsx +0 -0
  484. /package/{.next/standalone/tower/src → src}/app/workspaces/[workspaceId]/archive/page.tsx +0 -0
  485. /package/{.next/standalone/tower/src → src}/app/workspaces/[workspaceId]/assets/assets-page-client.tsx +0 -0
  486. /package/{.next/standalone/tower/src → src}/app/workspaces/[workspaceId]/assets/page.tsx +0 -0
  487. /package/{.next/standalone/tower/src → src}/app/workspaces/[workspaceId]/board-page-client.tsx +0 -0
  488. /package/{.next/standalone/tower/src → src}/app/workspaces/[workspaceId]/notes/notes-page-client.tsx +0 -0
  489. /package/{.next/standalone/tower/src → src}/app/workspaces/[workspaceId]/notes/page.tsx +0 -0
  490. /package/{.next/standalone/tower/src → src}/app/workspaces/[workspaceId]/page.tsx +0 -0
  491. /package/{.next/standalone/tower/src → src}/app/workspaces/[workspaceId]/projects/[projectId]/page.tsx +0 -0
  492. /package/{.next/standalone/tower/src → src}/app/workspaces/[workspaceId]/tasks/[taskId]/page.tsx +0 -0
  493. /package/{.next/standalone/tower/src → src}/app/workspaces/[workspaceId]/tasks/[taskId]/task-page-client.tsx +0 -0
  494. /package/{.next/standalone/tower/src → src}/app/workspaces/page.tsx +0 -0
  495. /package/{.next/standalone/tower/src → src}/components/assets/asset-item.tsx +0 -0
  496. /package/{.next/standalone/tower/src → src}/components/assets/asset-list.tsx +0 -0
  497. /package/{.next/standalone/tower/src → src}/components/assets/asset-upload.tsx +0 -0
  498. /package/{.next/standalone/tower/src → src}/components/assets/image-lightbox.tsx +0 -0
  499. /package/{.next/standalone/tower/src → src}/components/assets/text-preview-dialog.tsx +0 -0
  500. /package/{.next/standalone/tower/src → src}/components/assistant/assistant-chat-bubble.tsx +0 -0
  501. /package/{.next/standalone/tower/src → src}/components/assistant/assistant-chat.tsx +0 -0
  502. /package/{.next/standalone/tower/src → src}/components/assistant/assistant-panel.tsx +0 -0
  503. /package/{.next/standalone/tower/src → src}/components/assistant/assistant-provider.tsx +0 -0
  504. /package/{.next/standalone/tower/src → src}/components/assistant/image-preview-modal.tsx +0 -0
  505. /package/{.next/standalone/tower/src → src}/components/assistant/image-thumbnail-strip.tsx +0 -0
  506. /package/{.next/standalone/tower/src → src}/components/board/board-column.tsx +0 -0
  507. /package/{.next/standalone/tower/src → src}/components/board/board-filters.tsx +0 -0
  508. /package/{.next/standalone/tower/src → src}/components/board/board-stats.tsx +0 -0
  509. /package/{.next/standalone/tower/src → src}/components/board/column-tasks-dialog.tsx +0 -0
  510. /package/{.next/standalone/tower/src → src}/components/board/create-task-dialog.tsx +0 -0
  511. /package/{.next/standalone/tower/src → src}/components/board/kanban-board.tsx +0 -0
  512. /package/{.next/standalone/tower/src → src}/components/board/project-tabs.tsx +0 -0
  513. /package/{.next/standalone/tower/src → src}/components/board/task-card-context-menu.tsx +0 -0
  514. /package/{.next/standalone/tower/src → src}/components/board/task-card.tsx +0 -0
  515. /package/{.next/standalone/tower/src → src}/components/layout/app-sidebar.tsx +0 -0
  516. /package/{.next/standalone/tower/src → src}/components/layout/folder-browser-dialog.tsx +0 -0
  517. /package/{.next/standalone/tower/src → src}/components/layout/layout-client.tsx +0 -0
  518. /package/{.next/standalone/tower/src → src}/components/layout/search-dialog.tsx +0 -0
  519. /package/{.next/standalone/tower/src → src}/components/layout/sub-page-nav.tsx +0 -0
  520. /package/{.next/standalone/tower/src → src}/components/layout/top-bar.tsx +0 -0
  521. /package/{.next/standalone/tower/src → src}/components/missions/grid-layout-presets.ts +0 -0
  522. /package/{.next/standalone/tower/src → src}/components/missions/grid-preset-picker.tsx +0 -0
  523. /package/{.next/standalone/tower/src → src}/components/missions/merge-missions.ts +0 -0
  524. /package/{.next/standalone/tower/src → src}/components/missions/mission-card.tsx +0 -0
  525. /package/{.next/standalone/tower/src → src}/components/missions/task-picker-dialog.tsx +0 -0
  526. /package/{.next/standalone/tower/src → src}/components/notes/category-filter.tsx +0 -0
  527. /package/{.next/standalone/tower/src → src}/components/notes/note-card.tsx +0 -0
  528. /package/{.next/standalone/tower/src → src}/components/notes/note-editor.tsx +0 -0
  529. /package/{.next/standalone/tower/src → src}/components/notes/note-list.tsx +0 -0
  530. /package/{.next/standalone/tower/src → src}/components/notifications/notification-permission-banner.tsx +0 -0
  531. /package/{.next/standalone/tower/src → src}/components/notifications/use-notification-listener.ts +0 -0
  532. /package/{.next/standalone/tower/src → src}/components/onboarding/guided-tour.tsx +0 -0
  533. /package/{.next/standalone/tower/src → src}/components/onboarding/onboarding-wizard.tsx +0 -0
  534. /package/{.next/standalone/tower/src → src}/components/onboarding/wizard-step-cli.tsx +0 -0
  535. /package/{.next/standalone/tower/src → src}/components/onboarding/wizard-step-username.tsx +0 -0
  536. /package/{.next/standalone/tower/src → src}/components/project/create-project-dialog.tsx +0 -0
  537. /package/{.next/standalone/tower/src → src}/components/project/import-project-dialog.tsx +0 -0
  538. /package/{.next/standalone/tower/src → src}/components/providers/theme-provider.tsx +0 -0
  539. /package/{.next/standalone/tower/src → src}/components/repository/create-branch-dialog.tsx +0 -0
  540. /package/{.next/standalone/tower/src → src}/components/repository/git-changes-panel.tsx +0 -0
  541. /package/{.next/standalone/tower/src → src}/components/repository/git-log-panel.tsx +0 -0
  542. /package/{.next/standalone/tower/src → src}/components/repository/git-stash-panel.tsx +0 -0
  543. /package/{.next/standalone/tower/src → src}/components/repository/repo-sidebar.tsx +0 -0
  544. /package/{.next/standalone/tower/src → src}/components/settings/cli-adapter-tester.tsx +0 -0
  545. /package/{.next/standalone/tower/src → src}/components/settings/settings-page.tsx +0 -0
  546. /package/{.next/standalone/tower/src → src}/components/task/code-editor.tsx +0 -0
  547. /package/{.next/standalone/tower/src → src}/components/task/code-search.tsx +0 -0
  548. /package/{.next/standalone/tower/src → src}/components/task/diff-editor.tsx +0 -0
  549. /package/{.next/standalone/tower/src → src}/components/task/editor-git-panel.tsx +0 -0
  550. /package/{.next/standalone/tower/src → src}/components/task/editor-tabs.tsx +0 -0
  551. /package/{.next/standalone/tower/src → src}/components/task/execution-timeline.tsx +0 -0
  552. /package/{.next/standalone/tower/src → src}/components/task/file-tree-context-menu.tsx +0 -0
  553. /package/{.next/standalone/tower/src → src}/components/task/file-tree-node.tsx +0 -0
  554. /package/{.next/standalone/tower/src → src}/components/task/file-tree.tsx +0 -0
  555. /package/{.next/standalone/tower/src → src}/components/task/preview-panel.tsx +0 -0
  556. /package/{.next/standalone/tower/src → src}/components/task/task-detail-panel.tsx +0 -0
  557. /package/{.next/standalone/tower/src → src}/components/task/task-diff-view.tsx +0 -0
  558. /package/{.next/standalone/tower/src → src}/components/task/task-file-changes.tsx +0 -0
  559. /package/{.next/standalone/tower/src → src}/components/task/task-merge-confirm-dialog.tsx +0 -0
  560. /package/{.next/standalone/tower/src → src}/components/task/task-metadata.tsx +0 -0
  561. /package/{.next/standalone/tower/src → src}/components/task/task-notes-panel.tsx +0 -0
  562. /package/{.next/standalone/tower/src → src}/components/task/task-overview-drawer.tsx +0 -0
  563. /package/{.next/standalone/tower/src → src}/components/task/task-terminal.tsx +0 -0
  564. /package/{.next/standalone/tower/src → src}/components/task/terminal-portal.tsx +0 -0
  565. /package/{.next/standalone/tower/src → src}/components/task/types.ts +0 -0
  566. /package/{.next/standalone/tower/src → src}/components/ui/avatar.tsx +0 -0
  567. /package/{.next/standalone/tower/src → src}/components/ui/badge.tsx +0 -0
  568. /package/{.next/standalone/tower/src → src}/components/ui/button.tsx +0 -0
  569. /package/{.next/standalone/tower/src → src}/components/ui/card.tsx +0 -0
  570. /package/{.next/standalone/tower/src → src}/components/ui/command.tsx +0 -0
  571. /package/{.next/standalone/tower/src → src}/components/ui/dialog.tsx +0 -0
  572. /package/{.next/standalone/tower/src → src}/components/ui/dropdown-menu.tsx +0 -0
  573. /package/{.next/standalone/tower/src → src}/components/ui/empty-state.tsx +0 -0
  574. /package/{.next/standalone/tower/src → src}/components/ui/error-boundary.tsx +0 -0
  575. /package/{.next/standalone/tower/src → src}/components/ui/input-group.tsx +0 -0
  576. /package/{.next/standalone/tower/src → src}/components/ui/input.tsx +0 -0
  577. /package/{.next/standalone/tower/src → src}/components/ui/label.tsx +0 -0
  578. /package/{.next/standalone/tower/src → src}/components/ui/popover.tsx +0 -0
  579. /package/{.next/standalone/tower/src → src}/components/ui/scroll-area.tsx +0 -0
  580. /package/{.next/standalone/tower/src → src}/components/ui/segmented-control.tsx +0 -0
  581. /package/{.next/standalone/tower/src → src}/components/ui/select.tsx +0 -0
  582. /package/{.next/standalone/tower/src → src}/components/ui/separator.tsx +0 -0
  583. /package/{.next/standalone/tower/src → src}/components/ui/sheet.tsx +0 -0
  584. /package/{.next/standalone/tower/src → src}/components/ui/sonner.tsx +0 -0
  585. /package/{.next/standalone/tower/src → src}/components/ui/switch.tsx +0 -0
  586. /package/{.next/standalone/tower/src → src}/components/ui/tabs.tsx +0 -0
  587. /package/{.next/standalone/tower/src → src}/components/ui/textarea.tsx +0 -0
  588. /package/{.next/standalone/tower/src → src}/components/ui/toast.tsx +0 -0
  589. /package/{.next/standalone/tower/src → src}/components/ui/tooltip.tsx +0 -0
  590. /package/{.next/standalone/tower/src → src}/hooks/sse-event-reducer.ts +0 -0
  591. /package/{.next/standalone/tower/src → src}/hooks/use-assistant-chat.ts +0 -0
  592. /package/{.next/standalone/tower/src → src}/hooks/use-image-upload.ts +0 -0
  593. /package/{.next/standalone/tower/src → src}/instrumentation.ts +0 -0
  594. /package/{.next/standalone/tower/src → src}/lib/ai/adapters/cli/claude-cli-adapter.ts +0 -0
  595. /package/{.next/standalone/tower/src → src}/lib/ai/capability-resolver.ts +0 -0
  596. /package/{.next/standalone/tower/src → src}/lib/ai/provider-registry.ts +0 -0
  597. /package/{.next/standalone/tower/src → src}/lib/ai/providers/claude.ts +0 -0
  598. /package/{.next/standalone/tower/src → src}/lib/ai/providers/index.ts +0 -0
  599. /package/{.next/standalone/tower/src → src}/lib/ai/types.ts +0 -0
  600. /package/{.next/standalone/tower/src → src}/lib/assistant-constants.ts +0 -0
  601. /package/{.next/standalone/tower/src → src}/lib/assistant-message-converter.ts +0 -0
  602. /package/{.next/standalone/tower/src → src}/lib/assistant-sessions.ts +0 -0
  603. /package/{.next/standalone/tower/src → src}/lib/build-multimodal-prompt.ts +0 -0
  604. /package/{.next/standalone/tower/src → src}/lib/claude-session.ts +0 -0
  605. /package/{.next/standalone/tower/src → src}/lib/cli-test.ts +0 -0
  606. /package/{.next/standalone/tower/src → src}/lib/config-defaults.ts +0 -0
  607. /package/{.next/standalone/tower/src → src}/lib/config-reader.ts +0 -0
  608. /package/{.next/standalone/tower/src → src}/lib/constants.ts +0 -0
  609. /package/{.next/standalone/tower/src → src}/lib/db.ts +0 -0
  610. /package/{.next/standalone/tower/src → src}/lib/diff-parser.ts +0 -0
  611. /package/{.next/standalone/tower/src → src}/lib/execution-summary.ts +0 -0
  612. /package/{.next/standalone/tower/src → src}/lib/file-serve-client.ts +0 -0
  613. /package/{.next/standalone/tower/src → src}/lib/file-serve.ts +0 -0
  614. /package/{.next/standalone/tower/src → src}/lib/file-utils.ts +0 -0
  615. /package/{.next/standalone/tower/src → src}/lib/fs-security.ts +0 -0
  616. /package/{.next/standalone/tower/src → src}/lib/fts.ts +0 -0
  617. /package/{.next/standalone/tower/src → src}/lib/git-api.ts +0 -0
  618. /package/{.next/standalone/tower/src → src}/lib/git-url.ts +0 -0
  619. /package/{.next/standalone/tower/src → src}/lib/i18n/en.ts +0 -0
  620. /package/{.next/standalone/tower/src → src}/lib/i18n/types.ts +0 -0
  621. /package/{.next/standalone/tower/src → src}/lib/i18n/zh.ts +0 -0
  622. /package/{.next/standalone/tower/src → src}/lib/i18n.tsx +0 -0
  623. /package/{.next/standalone/tower/src → src}/lib/init-tower.ts +0 -0
  624. /package/{.next/standalone/tower/src → src}/lib/instrumentation-tasks.ts +0 -0
  625. /package/{.next/standalone/tower/src → src}/lib/internal-api-guard.ts +0 -0
  626. /package/{.next/standalone/tower/src → src}/lib/logger.ts +0 -0
  627. /package/{.next/standalone/tower/src → src}/lib/mime-magic.ts +0 -0
  628. /package/{.next/standalone/tower/src → src}/lib/platform.ts +0 -0
  629. /package/{.next/standalone/tower/src → src}/lib/preview-process.ts +0 -0
  630. /package/{.next/standalone/tower/src → src}/lib/pty/pty-session.ts +0 -0
  631. /package/{.next/standalone/tower/src → src}/lib/pty/session-store.ts +0 -0
  632. /package/{.next/standalone/tower/src → src}/lib/pty/ws-server.ts +0 -0
  633. /package/{.next/standalone/tower/src → src}/lib/schemas.ts +0 -0
  634. /package/{.next/standalone/tower/src → src}/lib/search.ts +0 -0
  635. /package/{.next/standalone/tower/src → src}/lib/terminal-link-provider.ts +0 -0
  636. /package/{.next/standalone/tower/src → src}/lib/tower-dir.ts +0 -0
  637. /package/{.next/standalone/tower/src → src}/lib/utils.ts +0 -0
  638. /package/{.next/standalone/tower/src → src}/lib/worktree.ts +0 -0
  639. /package/{.next/standalone/tower/src → src}/stores/board-store.ts +0 -0
  640. /package/{.next/standalone/tower/src → src}/stores/task-execution-store.ts +0 -0
  641. /package/{.next/standalone/tower/src → src}/types/index.ts +0 -0
@@ -1,177 +0,0 @@
1
- // @vitest-environment node
2
- import { describe, it, expect, vi, beforeEach } from "vitest";
3
-
4
- // Mock node:child_process
5
- vi.mock("node:child_process", () => ({
6
- spawn: vi.fn(),
7
- execFileSync: vi.fn(),
8
- }));
9
-
10
- // Mock preview-process-manager
11
- vi.mock("@/lib/preview-process", () => ({
12
- registerPreviewProcess: vi.fn(),
13
- killPreviewProcess: vi.fn(),
14
- isPreviewRunning: vi.fn(),
15
- }));
16
-
17
- // Mock config-reader
18
- vi.mock("@/lib/config-reader", () => ({
19
- readConfigValue: vi.fn(),
20
- }));
21
-
22
- // Mock next/cache (required for "use server" actions)
23
- vi.mock("next/cache", () => ({
24
- revalidatePath: vi.fn(),
25
- }));
26
-
27
- import { spawn, execFileSync } from "node:child_process";
28
- import {
29
- registerPreviewProcess,
30
- killPreviewProcess,
31
- isPreviewRunning,
32
- } from "@/lib/preview-process";
33
- import { readConfigValue } from "@/lib/config-reader";
34
- import { startPreview, stopPreview, openInTerminal } from "@/actions/preview-actions";
35
-
36
- import type { ChildProcess } from "node:child_process";
37
-
38
- const mockedSpawn = vi.mocked(spawn);
39
- const mockedExecFileSync = vi.mocked(execFileSync);
40
- const mockedRegisterPreviewProcess = vi.mocked(registerPreviewProcess);
41
- const mockedKillPreviewProcess = vi.mocked(killPreviewProcess);
42
- const mockedIsPreviewRunning = vi.mocked(isPreviewRunning);
43
- const mockedReadConfigValue = vi.mocked(readConfigValue);
44
-
45
- function makeFakeChild(): ChildProcess {
46
- return {
47
- killed: false,
48
- kill: vi.fn(),
49
- pid: 12345,
50
- } as unknown as ChildProcess;
51
- }
52
-
53
- beforeEach(() => {
54
- vi.clearAllMocks();
55
- mockedReadConfigValue.mockResolvedValue("Terminal");
56
- mockedIsPreviewRunning.mockReturnValue(false);
57
- mockedKillPreviewProcess.mockReturnValue(false);
58
- });
59
-
60
- describe("startPreview", () => {
61
- it("spawns process with correct args and returns { started: true }", async () => {
62
- const fakeChild = makeFakeChild();
63
- mockedSpawn.mockReturnValue(fakeChild);
64
-
65
- const result = await startPreview("task-1", "pnpm dev", "/some/path");
66
-
67
- expect(mockedSpawn).toHaveBeenCalledWith("pnpm", ["dev"], {
68
- cwd: "/some/path",
69
- shell: false,
70
- detached: false,
71
- stdio: "ignore",
72
- });
73
- expect(mockedRegisterPreviewProcess).toHaveBeenCalledWith("task-1", fakeChild);
74
- expect(result).toEqual({ started: true });
75
- });
76
-
77
- it("handles single-word command (no args)", async () => {
78
- const fakeChild = makeFakeChild();
79
- mockedSpawn.mockReturnValue(fakeChild);
80
-
81
- await startPreview("task-1", "npm", "/some/path");
82
-
83
- expect(mockedSpawn).toHaveBeenCalledWith("npm", [], expect.any(Object));
84
- });
85
-
86
- it("handles multi-word command correctly", async () => {
87
- const fakeChild = makeFakeChild();
88
- mockedSpawn.mockReturnValue(fakeChild);
89
-
90
- await startPreview("task-1", "node server.js --port 3000", "/some/path");
91
-
92
- expect(mockedSpawn).toHaveBeenCalledWith(
93
- "node",
94
- ["server.js", "--port", "3000"],
95
- expect.any(Object)
96
- );
97
- });
98
-
99
- it("kills existing process first when already running", async () => {
100
- mockedIsPreviewRunning.mockReturnValue(true);
101
- const fakeChild = makeFakeChild();
102
- mockedSpawn.mockReturnValue(fakeChild);
103
-
104
- await startPreview("task-1", "pnpm dev", "/some/path");
105
-
106
- expect(mockedKillPreviewProcess).toHaveBeenCalledWith("task-1");
107
- expect(mockedSpawn).toHaveBeenCalled();
108
- });
109
-
110
- it("does NOT kill process when not already running", async () => {
111
- mockedIsPreviewRunning.mockReturnValue(false);
112
- const fakeChild = makeFakeChild();
113
- mockedSpawn.mockReturnValue(fakeChild);
114
-
115
- await startPreview("task-1", "pnpm dev", "/some/path");
116
-
117
- expect(mockedKillPreviewProcess).not.toHaveBeenCalled();
118
- });
119
-
120
- it("returns { started: false, error } when spawn throws", async () => {
121
- mockedSpawn.mockImplementation(() => {
122
- throw new Error("ENOENT");
123
- });
124
-
125
- const result = await startPreview("task-1", "pnpm dev", "/some/path");
126
-
127
- expect(result.started).toBe(false);
128
- expect(result.error).toContain("ENOENT");
129
- });
130
- });
131
-
132
- describe("stopPreview", () => {
133
- it("calls killPreviewProcess with the correct taskId", async () => {
134
- await stopPreview("task-1");
135
- expect(mockedKillPreviewProcess).toHaveBeenCalledWith("task-1");
136
- });
137
-
138
- it("returns undefined (void)", async () => {
139
- const result = await stopPreview("task-1");
140
- expect(result).toBeUndefined();
141
- });
142
- });
143
-
144
- describe("openInTerminal", () => {
145
- it("calls execFileSync with open, -a, terminal app, and path", async () => {
146
- mockedReadConfigValue.mockResolvedValue("Terminal");
147
-
148
- await openInTerminal("/some/worktree/path");
149
-
150
- expect(mockedExecFileSync).toHaveBeenCalledWith("open", [
151
- "-a",
152
- "Terminal",
153
- "/some/worktree/path",
154
- ]);
155
- });
156
-
157
- it("reads terminal app from readConfigValue", async () => {
158
- mockedReadConfigValue.mockResolvedValue("iTerm");
159
-
160
- await openInTerminal("/some/path");
161
-
162
- expect(mockedReadConfigValue).toHaveBeenCalledWith("terminal.app", "Terminal");
163
- expect(mockedExecFileSync).toHaveBeenCalledWith("open", ["-a", "iTerm", "/some/path"]);
164
- });
165
-
166
- it("uses default Terminal app when readConfigValue returns Terminal", async () => {
167
- mockedReadConfigValue.mockResolvedValue("Terminal");
168
-
169
- await openInTerminal("/another/path");
170
-
171
- expect(mockedExecFileSync).toHaveBeenCalledWith("open", [
172
- "-a",
173
- "Terminal",
174
- "/another/path",
175
- ]);
176
- });
177
- });
@@ -1,358 +0,0 @@
1
- // @vitest-environment node
2
- import { describe, it, expect, beforeAll, afterAll, afterEach } from "vitest";
3
- import { PrismaClient } from "@prisma/client";
4
- import { syncNoteToFts } from "@/lib/fts";
5
- import type { SearchCategory, SearchResult } from "@/lib/search";
6
-
7
- const testDb = new PrismaClient({
8
- datasources: {
9
- db: { url: process.env.DATABASE_URL ?? "file:./prisma/dev.db" },
10
- },
11
- });
12
-
13
- let testWorkspaceId: string;
14
- let testProjectId: string;
15
-
16
- let globalSearchFn: (query: string, category?: SearchCategory) => Promise<SearchResult[]>;
17
-
18
- beforeAll(async () => {
19
- await testDb.$connect();
20
-
21
- // Ensure FTS5 table exists
22
- await testDb.$executeRawUnsafe(`
23
- CREATE VIRTUAL TABLE IF NOT EXISTS notes_fts
24
- USING fts5(
25
- note_id UNINDEXED,
26
- title,
27
- content,
28
- tokenize='trigram case_sensitive 0'
29
- )
30
- `);
31
-
32
- // Create test workspace and project
33
- const workspace = await testDb.workspace.create({
34
- data: { name: "Search Actions Test WS" },
35
- });
36
- testWorkspaceId = workspace.id;
37
-
38
- const project = await testDb.project.create({
39
- data: {
40
- name: "Search Actions Test Proj",
41
- workspaceId: testWorkspaceId,
42
- },
43
- });
44
- testProjectId = project.id;
45
-
46
- // Dynamic import: search-actions.ts uses "use server" directive
47
- const mod = await import("@/actions/search-actions");
48
- globalSearchFn = mod.globalSearch;
49
- });
50
-
51
- afterAll(async () => {
52
- // Delete test workspace (cascade to projects and notes)
53
- await testDb.workspace.delete({ where: { id: testWorkspaceId } });
54
- await testDb.$disconnect();
55
- });
56
-
57
- afterEach(async () => {
58
- // Clean up notes + FTS entries
59
- const notes = await testDb.projectNote.findMany({
60
- where: { projectId: testProjectId },
61
- });
62
- for (const note of notes) {
63
- await testDb.$executeRawUnsafe("DELETE FROM notes_fts WHERE note_id = ?", note.id);
64
- }
65
- await testDb.projectNote.deleteMany({ where: { projectId: testProjectId } });
66
-
67
- // Clean up assets
68
- await testDb.projectAsset.deleteMany({ where: { projectId: testProjectId } });
69
-
70
- // Clean up tasks
71
- await testDb.task.deleteMany({ where: { projectId: testProjectId } });
72
- });
73
-
74
- describe("globalSearch - note category", () => {
75
- it("returns empty array for empty query", async () => {
76
- const results = await globalSearchFn("", "note");
77
- expect(results).toEqual([]);
78
- });
79
-
80
- it("returns notes with matching title via FTS5", async () => {
81
- const note = await testDb.projectNote.create({
82
- data: {
83
- title: "API Configuration Guide",
84
- content: "This note covers API setup details",
85
- projectId: testProjectId,
86
- },
87
- });
88
- await syncNoteToFts(testDb, { id: note.id, title: note.title, content: note.content });
89
-
90
- const results = await globalSearchFn("API", "note");
91
- expect(results.length).toBeGreaterThan(0);
92
- const found = results.find((r) => r.id === note.id);
93
- expect(found).toBeDefined();
94
- expect(found?.type).toBe("note");
95
- });
96
-
97
- it("returns notes with matching content via FTS5", async () => {
98
- const note = await testDb.projectNote.create({
99
- data: {
100
- title: "General Notes",
101
- content: "Contains important config settings",
102
- projectId: testProjectId,
103
- },
104
- });
105
- await syncNoteToFts(testDb, { id: note.id, title: note.title, content: note.content });
106
-
107
- const results = await globalSearchFn("config", "note");
108
- expect(results.length).toBeGreaterThan(0);
109
- const found = results.find((r) => r.id === note.id);
110
- expect(found).toBeDefined();
111
- });
112
-
113
- it("uses LIKE fallback for short query (< 3 chars)", async () => {
114
- const note = await testDb.projectNote.create({
115
- data: {
116
- title: "AB Test Note",
117
- content: "some content",
118
- projectId: testProjectId,
119
- },
120
- });
121
- // Note NOT synced to FTS — LIKE fallback queries the ProjectNote table directly
122
-
123
- const results = await globalSearchFn("ab", "note");
124
- expect(results.length).toBeGreaterThan(0);
125
- const found = results.find((r) => r.id === note.id);
126
- expect(found).toBeDefined();
127
- });
128
-
129
- it("does not throw on malformed FTS5 query (unmatched quote) — falls back to LIKE", async () => {
130
- const note = await testDb.projectNote.create({
131
- data: {
132
- title: "unmatched quote test note",
133
- content: "this has unmatched content",
134
- projectId: testProjectId,
135
- },
136
- });
137
- // Note NOT synced to FTS — LIKE fallback should still find it
138
-
139
- // '"unmatched' has an unmatched double quote — would crash FTS5 MATCH
140
- await expect(globalSearchFn('"unmatched', "note")).resolves.not.toThrow();
141
- const results = await globalSearchFn('"unmatched', "note");
142
- // LIKE fallback should find the note with "unmatched" in title/content
143
- expect(Array.isArray(results)).toBe(true);
144
- });
145
-
146
- it("note search result has navigateTo matching /workspaces/{wsId}?projectId={pId}", async () => {
147
- const note = await testDb.projectNote.create({
148
- data: {
149
- title: "Navigation Test Note",
150
- content: "navigation content",
151
- projectId: testProjectId,
152
- },
153
- });
154
- await syncNoteToFts(testDb, { id: note.id, title: note.title, content: note.content });
155
-
156
- const results = await globalSearchFn("Navigation", "note");
157
- expect(results.length).toBeGreaterThan(0);
158
- const found = results.find((r) => r.id === note.id);
159
- expect(found?.navigateTo).toMatch(
160
- new RegExp(`/workspaces/${testWorkspaceId}/notes\\?projectId=${testProjectId}`)
161
- );
162
- });
163
- });
164
-
165
- describe("globalSearch - note category - snippet", () => {
166
- it("note result has snippet with first 80 chars of content", async () => {
167
- const longContent = "A".repeat(120);
168
- const note = await testDb.projectNote.create({
169
- data: {
170
- title: "Snippet Test Note",
171
- content: longContent,
172
- projectId: testProjectId,
173
- },
174
- });
175
- await syncNoteToFts(testDb, { id: note.id, title: note.title, content: note.content });
176
-
177
- const results = await globalSearchFn("Snippet Test", "note");
178
- const found = results.find((r) => r.id === note.id);
179
- expect(found).toBeDefined();
180
- expect(found?.snippet).toBe("A".repeat(80));
181
- });
182
-
183
- it("note result with empty content has undefined snippet", async () => {
184
- const note = await testDb.projectNote.create({
185
- data: {
186
- title: "Empty Content Snippet Note",
187
- content: "",
188
- projectId: testProjectId,
189
- },
190
- });
191
- // Sync to FTS so the note is found by title match
192
- await syncNoteToFts(testDb, { id: note.id, title: note.title, content: note.content });
193
- const results = await globalSearchFn("Empty Content Snippet", "note");
194
- const found = results.find((r) => r.id === note.id);
195
- expect(found).toBeDefined();
196
- expect(found?.snippet).toBeUndefined();
197
- });
198
- });
199
-
200
- describe("globalSearch - asset category - snippet", () => {
201
- it("asset result has snippet equal to description", async () => {
202
- await testDb.projectAsset.create({
203
- data: {
204
- filename: "snippet-test.pdf",
205
- path: "/data/assets/snippet-test.pdf",
206
- size: 4096,
207
- mimeType: "application/pdf",
208
- description: "This is a detailed description of the test PDF file",
209
- projectId: testProjectId,
210
- },
211
- });
212
-
213
- const results = await globalSearchFn("snippet-test", "asset");
214
- const found = results.find((r) => r.title === "snippet-test.pdf");
215
- expect(found).toBeDefined();
216
- expect(found?.snippet).toBe("This is a detailed description of the test PDF file");
217
- });
218
-
219
- it("asset result with empty description has undefined snippet", async () => {
220
- await testDb.projectAsset.create({
221
- data: {
222
- filename: "no-desc-asset.txt",
223
- path: "/data/assets/no-desc-asset.txt",
224
- size: 128,
225
- mimeType: "text/plain",
226
- description: "",
227
- projectId: testProjectId,
228
- },
229
- });
230
-
231
- const results = await globalSearchFn("no-desc-asset", "asset");
232
- const found = results.find((r) => r.title === "no-desc-asset.txt");
233
- expect(found).toBeDefined();
234
- expect(found?.snippet).toBeUndefined();
235
- });
236
- });
237
-
238
- describe("globalSearch - asset category", () => {
239
- it("returns assets with matching filename", async () => {
240
- await testDb.projectAsset.create({
241
- data: {
242
- filename: "readme.md",
243
- path: "/data/assets/readme.md",
244
- size: 1024,
245
- mimeType: "text/markdown",
246
- description: "project documentation",
247
- projectId: testProjectId,
248
- },
249
- });
250
-
251
- const results = await globalSearchFn("readme", "asset");
252
- expect(results.length).toBeGreaterThan(0);
253
- const found = results.find((r) => r.title === "readme.md");
254
- expect(found).toBeDefined();
255
- expect(found?.type).toBe("asset");
256
- });
257
-
258
- it("returns assets with matching description", async () => {
259
- await testDb.projectAsset.create({
260
- data: {
261
- filename: "config.yaml",
262
- path: "/data/assets/config.yaml",
263
- size: 512,
264
- mimeType: "text/yaml",
265
- description: "deployment configuration file",
266
- projectId: testProjectId,
267
- },
268
- });
269
-
270
- const results = await globalSearchFn("deployment", "asset");
271
- expect(results.length).toBeGreaterThan(0);
272
- const found = results.find((r) => r.title === "config.yaml");
273
- expect(found).toBeDefined();
274
- });
275
-
276
- it("asset search result has navigateTo matching /workspaces/{wsId}?projectId={pId}", async () => {
277
- await testDb.projectAsset.create({
278
- data: {
279
- filename: "nav-asset.png",
280
- path: "/data/assets/nav-asset.png",
281
- size: 2048,
282
- mimeType: "image/png",
283
- description: "navigation test asset",
284
- projectId: testProjectId,
285
- },
286
- });
287
-
288
- const results = await globalSearchFn("nav-asset", "asset");
289
- expect(results.length).toBeGreaterThan(0);
290
- const found = results.find((r) => r.title === "nav-asset.png");
291
- expect(found?.navigateTo).toMatch(
292
- new RegExp(`/workspaces/${testWorkspaceId}/assets\\?projectId=${testProjectId}`)
293
- );
294
- });
295
- });
296
-
297
- describe("globalSearch - all category", () => {
298
- it("returns results from multiple types", async () => {
299
- // Create a task with "testall" in title
300
- await testDb.task.create({
301
- data: {
302
- title: "testall task item",
303
- projectId: testProjectId,
304
- },
305
- });
306
-
307
- // Create a note with "testall" in title and sync to FTS
308
- const note = await testDb.projectNote.create({
309
- data: {
310
- title: "testall note item",
311
- content: "testall content",
312
- projectId: testProjectId,
313
- },
314
- });
315
- await syncNoteToFts(testDb, { id: note.id, title: note.title, content: note.content });
316
-
317
- // Create an asset with "testall" in filename
318
- await testDb.projectAsset.create({
319
- data: {
320
- filename: "testall-file.txt",
321
- path: "/data/assets/testall-file.txt",
322
- size: 256,
323
- mimeType: "text/plain",
324
- description: "",
325
- projectId: testProjectId,
326
- },
327
- });
328
-
329
- const results = await globalSearchFn("testall", "all");
330
- expect(results.length).toBeGreaterThan(0);
331
-
332
- // Should have results from multiple types
333
- const types = new Set(results.map((r) => r.type));
334
- expect(types.size).toBeGreaterThan(1);
335
- });
336
-
337
- it("each result has type discriminant in valid set", async () => {
338
- const note = await testDb.projectNote.create({
339
- data: {
340
- title: "multitype-search-note",
341
- content: "multitype content",
342
- projectId: testProjectId,
343
- },
344
- });
345
- await syncNoteToFts(testDb, { id: note.id, title: note.title, content: note.content });
346
-
347
- const results = await globalSearchFn("multitype", "all");
348
- const validTypes = new Set(["task", "project", "repository", "note", "asset"]);
349
- for (const r of results) {
350
- expect(validTypes.has(r.type)).toBe(true);
351
- }
352
- });
353
-
354
- it("returns empty array when nothing matches (not an error)", async () => {
355
- const results = await globalSearchFn("xxx_no_match_zzz_12345", "all");
356
- expect(results).toEqual([]);
357
- });
358
- });
@@ -1,173 +0,0 @@
1
- // @vitest-environment node
2
- import { describe, it, expect, beforeAll, afterAll, afterEach, vi } from "vitest";
3
- import { PrismaClient } from "@prisma/client";
4
- import { removeWorktree } from "@/lib/worktree";
5
-
6
- // Mock next/cache to avoid "static generation store missing" error in test environment
7
- vi.mock("next/cache", () => ({
8
- revalidatePath: vi.fn(),
9
- revalidateTag: vi.fn(),
10
- }));
11
-
12
- // Mock worktree module to avoid real git operations in tests
13
- vi.mock("@/lib/worktree", () => ({
14
- removeWorktree: vi.fn(),
15
- createWorktree: vi.fn(),
16
- }));
17
-
18
- const testDb = new PrismaClient({
19
- datasources: {
20
- db: { url: process.env.DATABASE_URL ?? "file:./prisma/dev.db" },
21
- },
22
- });
23
-
24
- let createTaskFn: (data: {
25
- title: string;
26
- description?: string;
27
- projectId: string;
28
- priority?: string;
29
- status?: string;
30
- labelIds?: string[];
31
- baseBranch?: string;
32
- }) => Promise<any>;
33
- let updateTaskFn: (
34
- taskId: string,
35
- data: { title?: string; description?: string; priority?: string; labelIds?: string[]; baseBranch?: string }
36
- ) => Promise<any>;
37
- let updateTaskStatusFn: (taskId: string, status: string) => Promise<any>;
38
-
39
- const mockedRemoveWorktree = vi.mocked(removeWorktree);
40
-
41
- let workspaceId: string;
42
- let projectId: string;
43
-
44
- beforeAll(async () => {
45
- await testDb.$connect();
46
-
47
- // Dynamic import: task-actions.ts uses "use server" directive
48
- const mod = await import("@/actions/task-actions");
49
- createTaskFn = mod.createTask as any;
50
- updateTaskFn = mod.updateTask as any;
51
- updateTaskStatusFn = mod.updateTaskStatus as any;
52
-
53
- // Create workspace and project for tests
54
- const workspace = await testDb.workspace.create({
55
- data: { name: "Test Workspace for task-actions" },
56
- });
57
- workspaceId = workspace.id;
58
-
59
- const project = await testDb.project.create({
60
- data: { name: "Test Project for task-actions", workspaceId },
61
- });
62
- projectId = project.id;
63
- });
64
-
65
- afterAll(async () => {
66
- // Clean up test workspace (cascades to projects and tasks)
67
- await testDb.workspace.deleteMany({
68
- where: { name: "Test Workspace for task-actions" },
69
- });
70
- await testDb.$disconnect();
71
- });
72
-
73
- afterEach(async () => {
74
- // Clean up tasks after each test
75
- await testDb.task.deleteMany({ where: { projectId } });
76
- });
77
-
78
- describe("createTask with baseBranch", () => {
79
- it("persists baseBranch when provided", async () => {
80
- const task = await createTaskFn({
81
- title: "Test task with base branch",
82
- projectId,
83
- baseBranch: "main",
84
- });
85
-
86
- const found = await testDb.task.findUnique({ where: { id: task.id } });
87
- expect(found).not.toBeNull();
88
- expect(found!.baseBranch).toBe("main");
89
- });
90
-
91
- it("results in null baseBranch when not provided", async () => {
92
- const task = await createTaskFn({
93
- title: "Test task without base branch",
94
- projectId,
95
- });
96
-
97
- const found = await testDb.task.findUnique({ where: { id: task.id } });
98
- expect(found).not.toBeNull();
99
- expect(found!.baseBranch).toBeNull();
100
- });
101
- });
102
-
103
- describe("updateTask with baseBranch", () => {
104
- it("updates baseBranch field when provided", async () => {
105
- const task = await createTaskFn({
106
- title: "Task to update baseBranch",
107
- projectId,
108
- });
109
-
110
- await updateTaskFn(task.id, { baseBranch: "develop" });
111
-
112
- const found = await testDb.task.findUnique({ where: { id: task.id } });
113
- expect(found).not.toBeNull();
114
- expect(found!.baseBranch).toBe("develop");
115
- });
116
- });
117
-
118
- describe("updateTaskStatus CANCELLED cleanup", () => {
119
- afterEach(() => {
120
- mockedRemoveWorktree.mockReset();
121
- });
122
-
123
- it("calls removeWorktree when cancelling a task in a GIT project with localPath", async () => {
124
- // Create a GIT project with localPath
125
- const gitProject = await testDb.project.create({
126
- data: {
127
- name: "Git Project for cancel test",
128
- workspaceId,
129
- localPath: "/tmp/test-repo",
130
- gitUrl: "https://github.com/test/repo",
131
- },
132
- });
133
- const task = await createTaskFn({ title: "Task to cancel", projectId: gitProject.id });
134
-
135
- await updateTaskStatusFn(task.id, "CANCELLED");
136
-
137
- expect(mockedRemoveWorktree).toHaveBeenCalledWith("/tmp/test-repo", task.id);
138
-
139
- // Cleanup
140
- await testDb.task.deleteMany({ where: { projectId: gitProject.id } });
141
- await testDb.project.delete({ where: { id: gitProject.id } });
142
- });
143
-
144
- it("does not call removeWorktree when cancelling a task in a NORMAL project", async () => {
145
- // projectId is a NORMAL project (no localPath)
146
- const task = await createTaskFn({ title: "Normal project task", projectId });
147
-
148
- mockedRemoveWorktree.mockClear();
149
- await updateTaskStatusFn(task.id, "CANCELLED");
150
-
151
- expect(mockedRemoveWorktree).not.toHaveBeenCalled();
152
- });
153
-
154
- it("does not throw when removeWorktree fails", async () => {
155
- const gitProject = await testDb.project.create({
156
- data: {
157
- name: "Git Project for cleanup fail test",
158
- workspaceId,
159
- localPath: "/tmp/test-repo-2",
160
- gitUrl: "https://github.com/test/repo2",
161
- },
162
- });
163
- const task = await createTaskFn({ title: "Task cleanup fail", projectId: gitProject.id });
164
- mockedRemoveWorktree.mockRejectedValueOnce(new Error("git error"));
165
-
166
- // Should not throw (D-05)
167
- await expect(updateTaskStatusFn(task.id, "CANCELLED")).resolves.toBeDefined();
168
-
169
- // Cleanup
170
- await testDb.task.deleteMany({ where: { projectId: gitProject.id } });
171
- await testDb.project.delete({ where: { id: gitProject.id } });
172
- });
173
- });