@ailog/cli 0.1.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 (303) hide show
  1. package/README.md +56 -0
  2. package/dist/bin/cli.js +1912 -0
  3. package/dist/standalone/.env +0 -0
  4. package/dist/standalone/.next/BUILD_ID +1 -0
  5. package/dist/standalone/.next/app-path-routes-manifest.json +10 -0
  6. package/dist/standalone/.next/build-manifest.json +21 -0
  7. package/dist/standalone/.next/package.json +1 -0
  8. package/dist/standalone/.next/prerender-manifest.json +118 -0
  9. package/dist/standalone/.next/required-server-files.json +333 -0
  10. package/dist/standalone/.next/routes-manifest.json +102 -0
  11. package/dist/standalone/.next/server/app/_global-error/page/app-paths-manifest.json +3 -0
  12. package/dist/standalone/.next/server/app/_global-error/page/build-manifest.json +18 -0
  13. package/dist/standalone/.next/server/app/_global-error/page/next-font-manifest.json +6 -0
  14. package/dist/standalone/.next/server/app/_global-error/page/react-loadable-manifest.json +1 -0
  15. package/dist/standalone/.next/server/app/_global-error/page/server-reference-manifest.json +4 -0
  16. package/dist/standalone/.next/server/app/_global-error/page.js +11 -0
  17. package/dist/standalone/.next/server/app/_global-error/page.js.map +5 -0
  18. package/dist/standalone/.next/server/app/_global-error/page.js.nft.json +1 -0
  19. package/dist/standalone/.next/server/app/_global-error/page_client-reference-manifest.js +2 -0
  20. package/dist/standalone/.next/server/app/_global-error.html +2 -0
  21. package/dist/standalone/.next/server/app/_global-error.meta +15 -0
  22. package/dist/standalone/.next/server/app/_global-error.rsc +13 -0
  23. package/dist/standalone/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +5 -0
  24. package/dist/standalone/.next/server/app/_global-error.segments/_full.segment.rsc +13 -0
  25. package/dist/standalone/.next/server/app/_global-error.segments/_head.segment.rsc +8 -0
  26. package/dist/standalone/.next/server/app/_global-error.segments/_index.segment.rsc +4 -0
  27. package/dist/standalone/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -0
  28. package/dist/standalone/.next/server/app/_not-found/page/app-paths-manifest.json +3 -0
  29. package/dist/standalone/.next/server/app/_not-found/page/build-manifest.json +18 -0
  30. package/dist/standalone/.next/server/app/_not-found/page/next-font-manifest.json +12 -0
  31. package/dist/standalone/.next/server/app/_not-found/page/react-loadable-manifest.json +1 -0
  32. package/dist/standalone/.next/server/app/_not-found/page/server-reference-manifest.json +4 -0
  33. package/dist/standalone/.next/server/app/_not-found/page.js +14 -0
  34. package/dist/standalone/.next/server/app/_not-found/page.js.map +5 -0
  35. package/dist/standalone/.next/server/app/_not-found/page.js.nft.json +1 -0
  36. package/dist/standalone/.next/server/app/_not-found/page_client-reference-manifest.js +2 -0
  37. package/dist/standalone/.next/server/app/_not-found.html +1 -0
  38. package/dist/standalone/.next/server/app/_not-found.meta +16 -0
  39. package/dist/standalone/.next/server/app/_not-found.rsc +19 -0
  40. package/dist/standalone/.next/server/app/_not-found.segments/_full.segment.rsc +19 -0
  41. package/dist/standalone/.next/server/app/_not-found.segments/_head.segment.rsc +8 -0
  42. package/dist/standalone/.next/server/app/_not-found.segments/_index.segment.rsc +10 -0
  43. package/dist/standalone/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +5 -0
  44. package/dist/standalone/.next/server/app/_not-found.segments/_not-found.segment.rsc +4 -0
  45. package/dist/standalone/.next/server/app/_not-found.segments/_tree.segment.rsc +2 -0
  46. package/dist/standalone/.next/server/app/api/[[...route]]/route/app-paths-manifest.json +3 -0
  47. package/dist/standalone/.next/server/app/api/[[...route]]/route/build-manifest.json +11 -0
  48. package/dist/standalone/.next/server/app/api/[[...route]]/route/server-reference-manifest.json +4 -0
  49. package/dist/standalone/.next/server/app/api/[[...route]]/route.js +7 -0
  50. package/dist/standalone/.next/server/app/api/[[...route]]/route.js.map +5 -0
  51. package/dist/standalone/.next/server/app/api/[[...route]]/route.js.nft.json +1 -0
  52. package/dist/standalone/.next/server/app/api/[[...route]]/route_client-reference-manifest.js +2 -0
  53. package/dist/standalone/.next/server/app/apps/[appId]/page/app-paths-manifest.json +3 -0
  54. package/dist/standalone/.next/server/app/apps/[appId]/page/build-manifest.json +18 -0
  55. package/dist/standalone/.next/server/app/apps/[appId]/page/next-font-manifest.json +12 -0
  56. package/dist/standalone/.next/server/app/apps/[appId]/page/react-loadable-manifest.json +1 -0
  57. package/dist/standalone/.next/server/app/apps/[appId]/page/server-reference-manifest.json +4 -0
  58. package/dist/standalone/.next/server/app/apps/[appId]/page.js +17 -0
  59. package/dist/standalone/.next/server/app/apps/[appId]/page.js.map +5 -0
  60. package/dist/standalone/.next/server/app/apps/[appId]/page.js.nft.json +1 -0
  61. package/dist/standalone/.next/server/app/apps/[appId]/page_client-reference-manifest.js +2 -0
  62. package/dist/standalone/.next/server/app/apps/[appId]/settings/page/app-paths-manifest.json +3 -0
  63. package/dist/standalone/.next/server/app/apps/[appId]/settings/page/build-manifest.json +18 -0
  64. package/dist/standalone/.next/server/app/apps/[appId]/settings/page/next-font-manifest.json +12 -0
  65. package/dist/standalone/.next/server/app/apps/[appId]/settings/page/react-loadable-manifest.json +1 -0
  66. package/dist/standalone/.next/server/app/apps/[appId]/settings/page/server-reference-manifest.json +4 -0
  67. package/dist/standalone/.next/server/app/apps/[appId]/settings/page.js +17 -0
  68. package/dist/standalone/.next/server/app/apps/[appId]/settings/page.js.map +5 -0
  69. package/dist/standalone/.next/server/app/apps/[appId]/settings/page.js.nft.json +1 -0
  70. package/dist/standalone/.next/server/app/apps/[appId]/settings/page_client-reference-manifest.js +2 -0
  71. package/dist/standalone/.next/server/app/apps/[appId]/threads/[threadId]/page/app-paths-manifest.json +3 -0
  72. package/dist/standalone/.next/server/app/apps/[appId]/threads/[threadId]/page/build-manifest.json +18 -0
  73. package/dist/standalone/.next/server/app/apps/[appId]/threads/[threadId]/page/next-font-manifest.json +12 -0
  74. package/dist/standalone/.next/server/app/apps/[appId]/threads/[threadId]/page/react-loadable-manifest.json +1 -0
  75. package/dist/standalone/.next/server/app/apps/[appId]/threads/[threadId]/page/server-reference-manifest.json +4 -0
  76. package/dist/standalone/.next/server/app/apps/[appId]/threads/[threadId]/page.js +17 -0
  77. package/dist/standalone/.next/server/app/apps/[appId]/threads/[threadId]/page.js.map +5 -0
  78. package/dist/standalone/.next/server/app/apps/[appId]/threads/[threadId]/page.js.nft.json +1 -0
  79. package/dist/standalone/.next/server/app/apps/[appId]/threads/[threadId]/page_client-reference-manifest.js +2 -0
  80. package/dist/standalone/.next/server/app/favicon.ico/route/app-paths-manifest.json +3 -0
  81. package/dist/standalone/.next/server/app/favicon.ico/route/build-manifest.json +11 -0
  82. package/dist/standalone/.next/server/app/favicon.ico/route.js +7 -0
  83. package/dist/standalone/.next/server/app/favicon.ico/route.js.map +5 -0
  84. package/dist/standalone/.next/server/app/favicon.ico/route.js.nft.json +1 -0
  85. package/dist/standalone/.next/server/app/favicon.ico.body +0 -0
  86. package/dist/standalone/.next/server/app/favicon.ico.meta +1 -0
  87. package/dist/standalone/.next/server/app/index.html +1 -0
  88. package/dist/standalone/.next/server/app/index.meta +14 -0
  89. package/dist/standalone/.next/server/app/index.rsc +26 -0
  90. package/dist/standalone/.next/server/app/index.segments/__PAGE__.segment.rsc +9 -0
  91. package/dist/standalone/.next/server/app/index.segments/_full.segment.rsc +26 -0
  92. package/dist/standalone/.next/server/app/index.segments/_head.segment.rsc +8 -0
  93. package/dist/standalone/.next/server/app/index.segments/_index.segment.rsc +10 -0
  94. package/dist/standalone/.next/server/app/index.segments/_tree.segment.rsc +5 -0
  95. package/dist/standalone/.next/server/app/page/app-paths-manifest.json +3 -0
  96. package/dist/standalone/.next/server/app/page/build-manifest.json +18 -0
  97. package/dist/standalone/.next/server/app/page/next-font-manifest.json +12 -0
  98. package/dist/standalone/.next/server/app/page/react-loadable-manifest.json +1 -0
  99. package/dist/standalone/.next/server/app/page/server-reference-manifest.json +4 -0
  100. package/dist/standalone/.next/server/app/page.js +16 -0
  101. package/dist/standalone/.next/server/app/page.js.map +5 -0
  102. package/dist/standalone/.next/server/app/page.js.nft.json +1 -0
  103. package/dist/standalone/.next/server/app/page_client-reference-manifest.js +2 -0
  104. package/dist/standalone/.next/server/app-paths-manifest.json +10 -0
  105. package/dist/standalone/.next/server/chunks/32a5c_next_0375a1f1._.js +17 -0
  106. package/dist/standalone/.next/server/chunks/[root-of-the-server]__5f8f2b74._.js +3 -0
  107. package/dist/standalone/.next/server/chunks/[root-of-the-server]__7970807c._.js +7 -0
  108. package/dist/standalone/.next/server/chunks/[root-of-the-server]__a0f47697._.js +28 -0
  109. package/dist/standalone/.next/server/chunks/[root-of-the-server]__b89b5a39._.js +3 -0
  110. package/dist/standalone/.next/server/chunks/[turbopack]_runtime.js +770 -0
  111. package/dist/standalone/.next/server/chunks/apps_web__next-internal_server_app_api_[[___route]]_route_actions_ad756856.js +3 -0
  112. package/dist/standalone/.next/server/chunks/apps_web__next-internal_server_app_favicon_ico_route_actions_63c3b0d9.js +3 -0
  113. package/dist/standalone/.next/server/chunks/ssr/32a5c_next_dist_c1a879d9._.js +4 -0
  114. package/dist/standalone/.next/server/chunks/ssr/32a5c_next_dist_c1fdfc17._.js +3 -0
  115. package/dist/standalone/.next/server/chunks/ssr/32a5c_next_dist_client_components_9085e245._.js +3 -0
  116. package/dist/standalone/.next/server/chunks/ssr/32a5c_next_dist_client_components_builtin_forbidden_3bc2a141.js +3 -0
  117. package/dist/standalone/.next/server/chunks/ssr/32a5c_next_dist_client_components_builtin_global-error_4bb26d7f.js +3 -0
  118. package/dist/standalone/.next/server/chunks/ssr/32a5c_next_dist_client_components_builtin_unauthorized_5c95c9e3.js +3 -0
  119. package/dist/standalone/.next/server/chunks/ssr/32a5c_next_dist_esm_af731943._.js +6 -0
  120. package/dist/standalone/.next/server/chunks/ssr/32a5c_next_dist_esm_build_templates_app-page_5d311e9f.js +4 -0
  121. package/dist/standalone/.next/server/chunks/ssr/37f04__next-internal_server_app_apps_[appId]_threads_[threadId]_page_actions_0a164142.js +3 -0
  122. package/dist/standalone/.next/server/chunks/ssr/8eb43_sonner_dist_index_mjs_a249e53a._.js +3 -0
  123. package/dist/standalone/.next/server/chunks/ssr/[root-of-the-server]__15021a09._.js +3 -0
  124. package/dist/standalone/.next/server/chunks/ssr/[root-of-the-server]__1764fab0._.js +3 -0
  125. package/dist/standalone/.next/server/chunks/ssr/[root-of-the-server]__1d8f92d3._.js +3 -0
  126. package/dist/standalone/.next/server/chunks/ssr/[root-of-the-server]__277f3037._.js +3 -0
  127. package/dist/standalone/.next/server/chunks/ssr/[root-of-the-server]__379bd934._.js +3 -0
  128. package/dist/standalone/.next/server/chunks/ssr/[root-of-the-server]__42df4b63._.js +3 -0
  129. package/dist/standalone/.next/server/chunks/ssr/[root-of-the-server]__5064350d._.js +3 -0
  130. package/dist/standalone/.next/server/chunks/ssr/[root-of-the-server]__659dbfe7._.js +4 -0
  131. package/dist/standalone/.next/server/chunks/ssr/[root-of-the-server]__80ea63f6._.js +4 -0
  132. package/dist/standalone/.next/server/chunks/ssr/[root-of-the-server]__9f3ff72e._.js +3 -0
  133. package/dist/standalone/.next/server/chunks/ssr/[root-of-the-server]__b6cee269._.js +3 -0
  134. package/dist/standalone/.next/server/chunks/ssr/[root-of-the-server]__e55c02ca._.js +3 -0
  135. package/dist/standalone/.next/server/chunks/ssr/[root-of-the-server]__f7807403._.js +3 -0
  136. package/dist/standalone/.next/server/chunks/ssr/[turbopack]_runtime.js +770 -0
  137. package/dist/standalone/.next/server/chunks/ssr/_1b351fd8._.js +3 -0
  138. package/dist/standalone/.next/server/chunks/ssr/_1db4c18c._.js +4 -0
  139. package/dist/standalone/.next/server/chunks/ssr/_203f0b29._.js +7 -0
  140. package/dist/standalone/.next/server/chunks/ssr/_442031f8._.js +7 -0
  141. package/dist/standalone/.next/server/chunks/ssr/_4b4df737._.js +4 -0
  142. package/dist/standalone/.next/server/chunks/ssr/_5066b883._.js +4 -0
  143. package/dist/standalone/.next/server/chunks/ssr/_82db472c._.js +3 -0
  144. package/dist/standalone/.next/server/chunks/ssr/_877d9b8d._.js +9 -0
  145. package/dist/standalone/.next/server/chunks/ssr/_b00f40b3._.js +3 -0
  146. package/dist/standalone/.next/server/chunks/ssr/_ba4460f0._.js +3 -0
  147. package/dist/standalone/.next/server/chunks/ssr/_d7dc3d79._.js +3 -0
  148. package/dist/standalone/.next/server/chunks/ssr/_d81226f8._.js +4 -0
  149. package/dist/standalone/.next/server/chunks/ssr/_ebd188d6._.js +3 -0
  150. package/dist/standalone/.next/server/chunks/ssr/_fce9eb14._.js +6 -0
  151. package/dist/standalone/.next/server/chunks/ssr/apps_web__next-internal_server_app__global-error_page_actions_e7650f86.js +3 -0
  152. package/dist/standalone/.next/server/chunks/ssr/apps_web__next-internal_server_app__not-found_page_actions_3df07a96.js +3 -0
  153. package/dist/standalone/.next/server/chunks/ssr/apps_web__next-internal_server_app_apps_[appId]_page_actions_3e495976.js +3 -0
  154. package/dist/standalone/.next/server/chunks/ssr/apps_web__next-internal_server_app_apps_[appId]_settings_page_actions_e98061b7.js +3 -0
  155. package/dist/standalone/.next/server/chunks/ssr/apps_web__next-internal_server_app_page_actions_a0623280.js +3 -0
  156. package/dist/standalone/.next/server/chunks/ssr/apps_web_app_apps_[appId]_layout_tsx_4c06ec7f._.js +3 -0
  157. package/dist/standalone/.next/server/chunks/ssr/apps_web_app_apps_[appId]_page_tsx_15e4fa55._.js +3 -0
  158. package/dist/standalone/.next/server/chunks/ssr/apps_web_app_apps_[appId]_settings_page_tsx_c072e295._.js +3 -0
  159. package/dist/standalone/.next/server/chunks/ssr/apps_web_app_apps_[appId]_threads_[threadId]_page_tsx_7dd7d764._.js +3 -0
  160. package/dist/standalone/.next/server/chunks/ssr/apps_web_app_e92ffe16._.js +3 -0
  161. package/dist/standalone/.next/server/chunks/ssr/apps_web_app_page_tsx_66bf978b._.js +3 -0
  162. package/dist/standalone/.next/server/chunks/ssr/apps_web_components_ui_15d0ea42._.js +3 -0
  163. package/dist/standalone/.next/server/chunks/ssr/apps_web_components_ui_1626551a._.js +3 -0
  164. package/dist/standalone/.next/server/chunks/ssr/apps_web_components_ui_c8132c43._.js +9 -0
  165. package/dist/standalone/.next/server/chunks/ssr/apps_web_components_ui_card_tsx_2c0359d4._.js +3 -0
  166. package/dist/standalone/.next/server/chunks/ssr/node_modules__bun_4bd60410._.js +6 -0
  167. package/dist/standalone/.next/server/chunks/ssr/node_modules__bun_930fb349._.js +3 -0
  168. package/dist/standalone/.next/server/functions-config-manifest.json +4 -0
  169. package/dist/standalone/.next/server/middleware-build-manifest.js +22 -0
  170. package/dist/standalone/.next/server/middleware-manifest.json +6 -0
  171. package/dist/standalone/.next/server/next-font-manifest.js +1 -0
  172. package/dist/standalone/.next/server/next-font-manifest.json +32 -0
  173. package/dist/standalone/.next/server/pages/404.html +1 -0
  174. package/dist/standalone/.next/server/pages/500.html +2 -0
  175. package/dist/standalone/.next/server/pages-manifest.json +4 -0
  176. package/dist/standalone/.next/server/server-reference-manifest.js +1 -0
  177. package/dist/standalone/.next/server/server-reference-manifest.json +5 -0
  178. package/dist/standalone/.next/static/9y8i31xPiG_Qcw_BXVNIB/_buildManifest.js +11 -0
  179. package/dist/standalone/.next/static/9y8i31xPiG_Qcw_BXVNIB/_clientMiddlewareManifest.json +1 -0
  180. package/dist/standalone/.next/static/9y8i31xPiG_Qcw_BXVNIB/_ssgManifest.js +1 -0
  181. package/dist/standalone/.next/static/chunks/001d990e82d317e7.js +1 -0
  182. package/dist/standalone/.next/static/chunks/0a3222f50a8ba36d.js +1 -0
  183. package/dist/standalone/.next/static/chunks/0d93d2e4091cb1d5.js +1 -0
  184. package/dist/standalone/.next/static/chunks/15389c2c0efe0c58.js +7 -0
  185. package/dist/standalone/.next/static/chunks/26aa014f0977bc3a.js +4 -0
  186. package/dist/standalone/.next/static/chunks/3468e573c929d9d3.js +1 -0
  187. package/dist/standalone/.next/static/chunks/3815bbfffdbb534d.js +1 -0
  188. package/dist/standalone/.next/static/chunks/3c1f17874396f056.js +1 -0
  189. package/dist/standalone/.next/static/chunks/46a444f4110b5209.js +7 -0
  190. package/dist/standalone/.next/static/chunks/540b3a38f32c78d0.js +1 -0
  191. package/dist/standalone/.next/static/chunks/5966736c7dbc65d2.js +1 -0
  192. package/dist/standalone/.next/static/chunks/6a4ccd90d00f8188.js +2 -0
  193. package/dist/standalone/.next/static/chunks/6b7a6f475b2cb221.js +1 -0
  194. package/dist/standalone/.next/static/chunks/6de1dc14b2653311.js +2 -0
  195. package/dist/standalone/.next/static/chunks/8eae4355671b488f.js +1 -0
  196. package/dist/standalone/.next/static/chunks/a6dad97d9634a72d.js +1 -0
  197. package/dist/standalone/.next/static/chunks/ab703521ea4f2141.js +1 -0
  198. package/dist/standalone/.next/static/chunks/b7ea835c5478b248.js +1 -0
  199. package/dist/standalone/.next/static/chunks/b8bc41a0b408222e.js +5 -0
  200. package/dist/standalone/.next/static/chunks/e4876b96721a69ca.css +4 -0
  201. package/dist/standalone/.next/static/chunks/f8e57df1af00077e.js +5 -0
  202. package/dist/standalone/.next/static/chunks/f9feac1b69b1185e.js +1 -0
  203. package/dist/standalone/.next/static/chunks/turbopack-e09224df42d3769a.js +3 -0
  204. package/dist/standalone/.next/static/media/13bf9871fe164e7f-s.f2220059.woff2 +0 -0
  205. package/dist/standalone/.next/static/media/3fe682a82f50d426-s.23358719.woff2 +0 -0
  206. package/dist/standalone/.next/static/media/4fa387ec64143e14-s.c1fdd6c2.woff2 +0 -0
  207. package/dist/standalone/.next/static/media/70bc3e132a0a741e-s.p.15008bfb.woff2 +0 -0
  208. package/dist/standalone/.next/static/media/7178b3e590c64307-s.b97b3418.woff2 +0 -0
  209. package/dist/standalone/.next/static/media/71b036adf157cdcf-s.bd5f4d11.woff2 +0 -0
  210. package/dist/standalone/.next/static/media/797e433ab948586e-s.p.dbea232f.woff2 +0 -0
  211. package/dist/standalone/.next/static/media/89b21bb081cb7469-s.51c18f09.woff2 +0 -0
  212. package/dist/standalone/.next/static/media/8a480f0b521d4e75-s.8e0177b5.woff2 +0 -0
  213. package/dist/standalone/.next/static/media/bbc41e54d2fcbd21-s.799d8ef8.woff2 +0 -0
  214. package/dist/standalone/.next/static/media/caa3a2e1cccd8315-s.p.853070df.woff2 +0 -0
  215. package/dist/standalone/.next/static/media/cc545e633e20c56d-s.f6f1950f.woff2 +0 -0
  216. package/dist/standalone/.next/static/media/favicon.0b3bf435.ico +0 -0
  217. package/dist/standalone/app/apps/[appId]/layout.tsx +3 -0
  218. package/dist/standalone/app/apps/[appId]/page.tsx +238 -0
  219. package/dist/standalone/app/apps/[appId]/settings/page.tsx +224 -0
  220. package/dist/standalone/app/apps/[appId]/threads/[threadId]/page.tsx +283 -0
  221. package/dist/standalone/components/apps-table.tsx +274 -0
  222. package/dist/standalone/components.json +24 -0
  223. package/dist/standalone/dist/standalone/app/apps/[appId]/layout.tsx +3 -0
  224. package/dist/standalone/dist/standalone/app/apps/[appId]/page.tsx +238 -0
  225. package/dist/standalone/dist/standalone/app/apps/[appId]/settings/page.tsx +224 -0
  226. package/dist/standalone/dist/standalone/app/apps/[appId]/threads/[threadId]/page.tsx +283 -0
  227. package/dist/standalone/dist/standalone/components/apps-table.tsx +274 -0
  228. package/dist/standalone/dist/standalone/components.json +24 -0
  229. package/dist/standalone/dist/standalone/dist/standalone/app/apps/[appId]/layout.tsx +3 -0
  230. package/dist/standalone/dist/standalone/dist/standalone/app/apps/[appId]/page.tsx +238 -0
  231. package/dist/standalone/dist/standalone/dist/standalone/app/apps/[appId]/settings/page.tsx +224 -0
  232. package/dist/standalone/dist/standalone/dist/standalone/app/apps/[appId]/threads/[threadId]/page.tsx +283 -0
  233. package/dist/standalone/dist/standalone/dist/standalone/components/apps-table.tsx +274 -0
  234. package/dist/standalone/dist/standalone/dist/standalone/components.json +24 -0
  235. package/dist/standalone/dist/standalone/dist/standalone/dist/standalone/app/apps/[appId]/layout.tsx +3 -0
  236. package/dist/standalone/dist/standalone/dist/standalone/dist/standalone/app/apps/[appId]/page.tsx +238 -0
  237. package/dist/standalone/dist/standalone/dist/standalone/dist/standalone/app/apps/[appId]/settings/page.tsx +224 -0
  238. package/dist/standalone/dist/standalone/dist/standalone/dist/standalone/app/apps/[appId]/threads/[threadId]/page.tsx +283 -0
  239. package/dist/standalone/dist/standalone/dist/standalone/dist/standalone/components/apps-table.tsx +274 -0
  240. package/dist/standalone/dist/standalone/dist/standalone/dist/standalone/components.json +24 -0
  241. package/dist/standalone/dist/standalone/dist/standalone/dist/standalone/dist/standalone/app/apps/[appId]/layout.tsx +3 -0
  242. package/dist/standalone/dist/standalone/dist/standalone/dist/standalone/dist/standalone/app/apps/[appId]/page.tsx +238 -0
  243. package/dist/standalone/dist/standalone/dist/standalone/dist/standalone/dist/standalone/app/apps/[appId]/settings/page.tsx +224 -0
  244. package/dist/standalone/dist/standalone/dist/standalone/dist/standalone/dist/standalone/app/apps/[appId]/threads/[threadId]/page.tsx +283 -0
  245. package/dist/standalone/dist/standalone/dist/standalone/dist/standalone/dist/standalone/components/apps-table.tsx +274 -0
  246. package/dist/standalone/dist/standalone/dist/standalone/dist/standalone/dist/standalone/components.json +24 -0
  247. package/dist/standalone/dist/standalone/dist/standalone/dist/standalone/dist/standalone/dist/standalone/app/apps/[appId]/layout.tsx +3 -0
  248. package/dist/standalone/dist/standalone/dist/standalone/dist/standalone/dist/standalone/dist/standalone/app/apps/[appId]/page.tsx +238 -0
  249. package/dist/standalone/dist/standalone/dist/standalone/dist/standalone/dist/standalone/dist/standalone/app/apps/[appId]/settings/page.tsx +224 -0
  250. package/dist/standalone/dist/standalone/dist/standalone/dist/standalone/dist/standalone/dist/standalone/app/apps/[appId]/threads/[threadId]/page.tsx +283 -0
  251. package/dist/standalone/dist/standalone/dist/standalone/dist/standalone/dist/standalone/dist/standalone/components/apps-table.tsx +274 -0
  252. package/dist/standalone/dist/standalone/dist/standalone/dist/standalone/dist/standalone/dist/standalone/components.json +24 -0
  253. package/dist/standalone/dist/standalone/dist/standalone/dist/standalone/dist/standalone/dist/standalone/dist/standalone/app/apps/[appId]/layout.tsx +3 -0
  254. package/dist/standalone/dist/standalone/dist/standalone/dist/standalone/dist/standalone/dist/standalone/dist/standalone/app/apps/[appId]/page.tsx +238 -0
  255. package/dist/standalone/dist/standalone/dist/standalone/dist/standalone/dist/standalone/dist/standalone/dist/standalone/app/apps/[appId]/settings/page.tsx +224 -0
  256. package/dist/standalone/dist/standalone/dist/standalone/dist/standalone/dist/standalone/dist/standalone/dist/standalone/app/apps/[appId]/threads/[threadId]/page.tsx +283 -0
  257. package/dist/standalone/dist/standalone/dist/standalone/dist/standalone/dist/standalone/dist/standalone/dist/standalone/components/apps-table.tsx +274 -0
  258. package/dist/standalone/dist/standalone/dist/standalone/dist/standalone/dist/standalone/dist/standalone/dist/standalone/components.json +24 -0
  259. package/dist/standalone/dist/standalone/dist/standalone/dist/standalone/dist/standalone/dist/standalone/dist/standalone/dist/standalone/app/apps/[appId]/layout.tsx +3 -0
  260. package/dist/standalone/dist/standalone/dist/standalone/dist/standalone/dist/standalone/dist/standalone/dist/standalone/dist/standalone/app/apps/[appId]/page.tsx +238 -0
  261. package/dist/standalone/dist/standalone/dist/standalone/dist/standalone/dist/standalone/dist/standalone/dist/standalone/dist/standalone/app/apps/[appId]/settings/page.tsx +224 -0
  262. package/dist/standalone/dist/standalone/dist/standalone/dist/standalone/dist/standalone/dist/standalone/dist/standalone/dist/standalone/app/apps/[appId]/threads/[threadId]/page.tsx +283 -0
  263. package/dist/standalone/dist/standalone/dist/standalone/dist/standalone/dist/standalone/dist/standalone/dist/standalone/dist/standalone/components/apps-table.tsx +274 -0
  264. package/dist/standalone/dist/standalone/dist/standalone/dist/standalone/dist/standalone/dist/standalone/dist/standalone/dist/standalone/components.json +24 -0
  265. package/dist/standalone/dist/standalone/dist/standalone/dist/standalone/dist/standalone/dist/standalone/dist/standalone/dist/standalone/dist/standalone/app/apps/[appId]/layout.tsx +3 -0
  266. package/dist/standalone/dist/standalone/dist/standalone/dist/standalone/dist/standalone/dist/standalone/dist/standalone/dist/standalone/dist/standalone/app/apps/[appId]/page.tsx +238 -0
  267. package/dist/standalone/dist/standalone/dist/standalone/dist/standalone/dist/standalone/dist/standalone/dist/standalone/dist/standalone/dist/standalone/app/apps/[appId]/settings/page.tsx +224 -0
  268. package/dist/standalone/dist/standalone/dist/standalone/dist/standalone/dist/standalone/dist/standalone/dist/standalone/dist/standalone/dist/standalone/app/apps/[appId]/threads/[threadId]/page.tsx +283 -0
  269. package/dist/standalone/dist/standalone/dist/standalone/dist/standalone/dist/standalone/dist/standalone/dist/standalone/dist/standalone/dist/standalone/components/apps-table.tsx +274 -0
  270. package/dist/standalone/dist/standalone/dist/standalone/dist/standalone/dist/standalone/dist/standalone/dist/standalone/dist/standalone/dist/standalone/components.json +24 -0
  271. package/dist/standalone/dist/standalone/dist/standalone/dist/standalone/dist/standalone/dist/standalone/dist/standalone/dist/standalone/dist/standalone/dist/standalone/app/apps/[appId]/layout.tsx +3 -0
  272. package/dist/standalone/dist/standalone/dist/standalone/dist/standalone/dist/standalone/dist/standalone/dist/standalone/dist/standalone/dist/standalone/dist/standalone/app/apps/[appId]/page.tsx +238 -0
  273. package/dist/standalone/dist/standalone/dist/standalone/dist/standalone/dist/standalone/dist/standalone/dist/standalone/dist/standalone/dist/standalone/dist/standalone/app/apps/[appId]/settings/page.tsx +224 -0
  274. package/dist/standalone/dist/standalone/dist/standalone/dist/standalone/dist/standalone/dist/standalone/dist/standalone/dist/standalone/dist/standalone/dist/standalone/app/apps/[appId]/threads/[threadId]/page.tsx +283 -0
  275. package/dist/standalone/dist/standalone/dist/standalone/dist/standalone/dist/standalone/dist/standalone/dist/standalone/dist/standalone/dist/standalone/dist/standalone/components/apps-table.tsx +274 -0
  276. package/dist/standalone/dist/standalone/dist/standalone/dist/standalone/dist/standalone/dist/standalone/dist/standalone/dist/standalone/dist/standalone/dist/standalone/components.json +24 -0
  277. package/dist/standalone/dist/standalone/dist/standalone/dist/standalone/dist/standalone/dist/standalone/dist/standalone/dist/standalone/dist/standalone/dist/standalone/package.json +65 -0
  278. package/dist/standalone/dist/standalone/dist/standalone/dist/standalone/dist/standalone/dist/standalone/dist/standalone/dist/standalone/dist/standalone/dist/standalone/tsconfig.json +34 -0
  279. package/dist/standalone/dist/standalone/dist/standalone/dist/standalone/dist/standalone/dist/standalone/dist/standalone/dist/standalone/dist/standalone/package.json +65 -0
  280. package/dist/standalone/dist/standalone/dist/standalone/dist/standalone/dist/standalone/dist/standalone/dist/standalone/dist/standalone/dist/standalone/tsconfig.json +34 -0
  281. package/dist/standalone/dist/standalone/dist/standalone/dist/standalone/dist/standalone/dist/standalone/dist/standalone/dist/standalone/package.json +65 -0
  282. package/dist/standalone/dist/standalone/dist/standalone/dist/standalone/dist/standalone/dist/standalone/dist/standalone/dist/standalone/tsconfig.json +34 -0
  283. package/dist/standalone/dist/standalone/dist/standalone/dist/standalone/dist/standalone/dist/standalone/dist/standalone/package.json +65 -0
  284. package/dist/standalone/dist/standalone/dist/standalone/dist/standalone/dist/standalone/dist/standalone/dist/standalone/tsconfig.json +34 -0
  285. package/dist/standalone/dist/standalone/dist/standalone/dist/standalone/dist/standalone/dist/standalone/package.json +65 -0
  286. package/dist/standalone/dist/standalone/dist/standalone/dist/standalone/dist/standalone/dist/standalone/tsconfig.json +34 -0
  287. package/dist/standalone/dist/standalone/dist/standalone/dist/standalone/dist/standalone/package.json +65 -0
  288. package/dist/standalone/dist/standalone/dist/standalone/dist/standalone/dist/standalone/tsconfig.json +34 -0
  289. package/dist/standalone/dist/standalone/dist/standalone/dist/standalone/package.json +65 -0
  290. package/dist/standalone/dist/standalone/dist/standalone/dist/standalone/tsconfig.json +34 -0
  291. package/dist/standalone/dist/standalone/dist/standalone/package.json +65 -0
  292. package/dist/standalone/dist/standalone/dist/standalone/tsconfig.json +34 -0
  293. package/dist/standalone/dist/standalone/package.json +65 -0
  294. package/dist/standalone/dist/standalone/tsconfig.json +34 -0
  295. package/dist/standalone/package.json +65 -0
  296. package/dist/standalone/public/file.svg +1 -0
  297. package/dist/standalone/public/globe.svg +1 -0
  298. package/dist/standalone/public/next.svg +1 -0
  299. package/dist/standalone/public/vercel.svg +1 -0
  300. package/dist/standalone/public/window.svg +1 -0
  301. package/dist/standalone/server.js +44 -0
  302. package/dist/standalone/tsconfig.json +34 -0
  303. package/package.json +65 -0
@@ -0,0 +1,283 @@
1
+ 'use client'
2
+
3
+ import { useCallback, useEffect, useMemo, useRef, useState } from 'react'
4
+ import { useParams } from 'next/navigation'
5
+ import { Card, CardContent, CardHeader } from '@/components/ui/card'
6
+ import { Button } from '@/components/ui/button'
7
+ import { Skeleton } from '@/components/ui/skeleton'
8
+ import { ChatView } from '@/components/chat-view'
9
+ import { ScrollArea } from '@/components/ui/scroll-area'
10
+ import { RequestDetailPanel } from '@/components/request-detail-panel'
11
+ import { GenerationDetailPanel } from '@/components/generation-detail-panel'
12
+ import { GenerationTimeline } from '@/components/generation-timeline'
13
+ import { useKeydown } from '@/hooks/use-keydown'
14
+ import { rpcClient } from '@/lib/rpc-client'
15
+ import type { Thread, Generation } from '@/lib/api'
16
+
17
+ export default function ThreadDetailPage() {
18
+ const params = useParams()
19
+ const appId = params.appId as string
20
+ const threadId = params.threadId as string
21
+
22
+ const [thread, setThread] = useState<Thread | null>(null)
23
+ const [generations, setGenerations] = useState<Generation[]>([])
24
+ const [isLoading, setIsLoading] = useState(true)
25
+ const [selectedRequestId, setSelectedRequestId] = useState<string | null>(
26
+ null,
27
+ )
28
+ const [selectedGenerationId, setSelectedGenerationId] = useState<
29
+ string | null
30
+ >(null)
31
+ const [viewMode, setViewMode] = useState<'details' | 'timeline'>('details')
32
+
33
+ // Keyboard navigation for generations
34
+ const handleKeyDown = useCallback(
35
+ (e: KeyboardEvent) => {
36
+ if (generations.length === 0) return
37
+
38
+ const currentIndex = generations.findIndex(
39
+ (g) => g.generationId === selectedGenerationId,
40
+ )
41
+
42
+ if (e.key === 'ArrowUp') {
43
+ e.preventDefault()
44
+ if (currentIndex === -1) {
45
+ setSelectedGenerationId(generations[0].generationId)
46
+ setSelectedRequestId(null)
47
+ } else if (currentIndex < generations.length - 1) {
48
+ setSelectedGenerationId(generations[currentIndex + 1].generationId)
49
+ setSelectedRequestId(null)
50
+ }
51
+ } else if (e.key === 'ArrowDown') {
52
+ e.preventDefault()
53
+ if (currentIndex > 0) {
54
+ setSelectedGenerationId(generations[currentIndex - 1].generationId)
55
+ setSelectedRequestId(null)
56
+ } else if (currentIndex === -1 && generations.length > 0) {
57
+ setSelectedGenerationId(
58
+ generations[generations.length - 1].generationId,
59
+ )
60
+ setSelectedRequestId(null)
61
+ }
62
+ }
63
+ },
64
+ [generations, selectedGenerationId],
65
+ )
66
+
67
+ useKeydown(handleKeyDown)
68
+
69
+ const leftContainerRef = useRef<HTMLDivElement>(null)
70
+
71
+ // Scroll to selected generation (within ScrollArea only, not main page)
72
+ useEffect(() => {
73
+ if (!selectedGenerationId || !leftContainerRef.current) return
74
+
75
+ const viewport = leftContainerRef.current.querySelector(
76
+ '[data-slot="scroll-area-viewport"]',
77
+ )
78
+ const element = leftContainerRef.current.querySelector(
79
+ `[data-generation-id="${selectedGenerationId}"]`,
80
+ )
81
+
82
+ if (viewport && element) {
83
+ const viewportRect = viewport.getBoundingClientRect()
84
+ const elementRect = element.getBoundingClientRect()
85
+ const scrollTop = viewport.scrollTop
86
+
87
+ const elementTop = elementRect.top - viewportRect.top + scrollTop
88
+ const elementBottom = elementTop + elementRect.height
89
+ const viewportHeight = viewportRect.height
90
+
91
+ if (elementTop < scrollTop) {
92
+ viewport.scrollTo({ top: elementTop, behavior: 'smooth' })
93
+ } else if (elementBottom > scrollTop + viewportHeight) {
94
+ viewport.scrollTo({
95
+ top: elementBottom - viewportHeight,
96
+ behavior: 'smooth',
97
+ })
98
+ }
99
+ }
100
+ }, [selectedGenerationId])
101
+
102
+ useEffect(() => {
103
+ async function fetchData() {
104
+ try {
105
+ // Fetch thread and all generations for this thread
106
+ const [threadRes, generationsRes] = await Promise.all([
107
+ rpcClient.api.admin.apps[':appId'].threads[':threadId'].$get({
108
+ param: { appId, threadId },
109
+ }),
110
+ rpcClient.api.admin.apps[':appId'].generations.$get({
111
+ param: { appId },
112
+ query: { threadId },
113
+ }),
114
+ ])
115
+
116
+ if (threadRes.ok) {
117
+ const threadData = await threadRes.json()
118
+ setThread(threadData as Thread)
119
+ }
120
+
121
+ if (generationsRes.ok) {
122
+ const generationsData = await generationsRes.json()
123
+ setGenerations(generationsData.generations as Generation[])
124
+ }
125
+ } catch (error) {
126
+ console.error('Failed to fetch data:', error)
127
+ } finally {
128
+ setIsLoading(false)
129
+ }
130
+ }
131
+ fetchData()
132
+ }, [appId, threadId])
133
+
134
+ // Derive requests from generations by grouping unique requestIds
135
+ const requests = useMemo(() => {
136
+ const requestMap = new Map<
137
+ string,
138
+ { requestId: string; createdAt: string }
139
+ >()
140
+ for (const gen of generations) {
141
+ if (!requestMap.has(gen.requestId)) {
142
+ requestMap.set(gen.requestId, {
143
+ requestId: gen.requestId,
144
+ createdAt: gen.createdAt,
145
+ })
146
+ } else {
147
+ // Use the earliest createdAt for the request
148
+ const existing = requestMap.get(gen.requestId)!
149
+ if (gen.createdAt < existing.createdAt) {
150
+ existing.createdAt = gen.createdAt
151
+ }
152
+ }
153
+ }
154
+ return Array.from(requestMap.values())
155
+ }, [generations])
156
+
157
+ return (
158
+ <div className="space-y-4">
159
+ {/* Thread Info / Timeline */}
160
+ <Card className="py-2">
161
+ <CardHeader className="px-3 py-2">
162
+ <div className="flex items-center justify-between">
163
+ <div className="flex gap-1">
164
+ <Button
165
+ variant={viewMode === 'details' ? 'secondary' : 'ghost'}
166
+ size="sm"
167
+ className="h-6 px-2 text-xs"
168
+ onClick={() => setViewMode('details')}
169
+ >
170
+ Details
171
+ </Button>
172
+ <Button
173
+ variant={viewMode === 'timeline' ? 'secondary' : 'ghost'}
174
+ size="sm"
175
+ className="h-6 px-2 text-xs"
176
+ onClick={() => setViewMode('timeline')}
177
+ disabled={generations.length === 0}
178
+ >
179
+ Timeline
180
+ </Button>
181
+ </div>
182
+ {isLoading ? (
183
+ <Skeleton className="h-4 w-24" />
184
+ ) : (
185
+ <span className="text-muted-foreground text-xs">
186
+ {thread?.title || '(Untitled)'}
187
+ </span>
188
+ )}
189
+ </div>
190
+ </CardHeader>
191
+ <CardContent className="px-3 pt-0 pb-2">
192
+ {viewMode === 'details' ? (
193
+ isLoading ? (
194
+ <div className="flex gap-6">
195
+ <Skeleton className="h-3 w-24" />
196
+ <Skeleton className="h-3 w-24" />
197
+ </div>
198
+ ) : (
199
+ <div className="flex flex-wrap gap-x-6 gap-y-1 text-xs">
200
+ <div>
201
+ <span className="text-muted-foreground">Thread ID: </span>
202
+ <span className="font-mono">{thread?.threadId}</span>
203
+ </div>
204
+ {thread?.tenantId && (
205
+ <div>
206
+ <span className="text-muted-foreground">Tenant ID: </span>
207
+ <span>{thread.tenantId}</span>
208
+ </div>
209
+ )}
210
+ <div>
211
+ <span className="text-muted-foreground">User: </span>
212
+ <span className="font-mono">{thread?.userId}</span>
213
+ </div>
214
+ </div>
215
+ )
216
+ ) : (
217
+ <GenerationTimeline
218
+ generations={generations}
219
+ selectedGenerationId={selectedGenerationId}
220
+ onSelectGeneration={(generationId) => {
221
+ setSelectedGenerationId(generationId)
222
+ setSelectedRequestId(null)
223
+ }}
224
+ />
225
+ )}
226
+ </CardContent>
227
+ </Card>
228
+
229
+ {/* Split View: Chat + Details */}
230
+ <div className="grid min-w-0 grid-cols-[minmax(0,1fr)_minmax(0,2fr)] gap-3">
231
+ <ScrollArea
232
+ className="h-[calc(100vh-220px)] [&_[data-slot=scroll-area-viewport]>div]:!block"
233
+ ref={leftContainerRef}
234
+ >
235
+ {/* Left: Chat View */}
236
+ <ChatView
237
+ requests={requests}
238
+ generations={generations}
239
+ isLoading={isLoading}
240
+ selectedRequestId={selectedRequestId}
241
+ selectedGenerationId={selectedGenerationId}
242
+ onSelectRequest={(requestId) => {
243
+ setSelectedRequestId(requestId)
244
+ setSelectedGenerationId(null)
245
+ }}
246
+ onSelectGeneration={(generationId) => {
247
+ setSelectedGenerationId(generationId)
248
+ setSelectedRequestId(null)
249
+ }}
250
+ />
251
+ </ScrollArea>
252
+
253
+ <ScrollArea className="h-[calc(100vh-220px)] border [&_[data-slot=scroll-area-viewport]>div]:!block">
254
+ {/* Right: Details Panel */}
255
+ <div className="w-full min-w-0 overflow-hidden p-4">
256
+ {selectedGenerationId ? (
257
+ <GenerationDetailPanel
258
+ generation={
259
+ generations.find(
260
+ (g) => g.generationId === selectedGenerationId,
261
+ ) || null
262
+ }
263
+ />
264
+ ) : (
265
+ <RequestDetailPanel
266
+ request={
267
+ requests.find((r) => r.requestId === selectedRequestId) ||
268
+ null
269
+ }
270
+ generations={generations}
271
+ selectedGenerationId={selectedGenerationId}
272
+ onSelectGeneration={(generationId) => {
273
+ setSelectedGenerationId(generationId)
274
+ setSelectedRequestId(null)
275
+ }}
276
+ />
277
+ )}
278
+ </div>
279
+ </ScrollArea>
280
+ </div>
281
+ </div>
282
+ )
283
+ }
@@ -0,0 +1,274 @@
1
+ 'use client'
2
+
3
+ import { useState } from 'react'
4
+ import { useRouter } from 'next/navigation'
5
+ import Link from 'next/link'
6
+ import {
7
+ Table,
8
+ TableBody,
9
+ TableCell,
10
+ TableHead,
11
+ TableHeader,
12
+ TableRow,
13
+ } from '@/components/ui/table'
14
+ import {
15
+ DropdownMenu,
16
+ DropdownMenuContent,
17
+ DropdownMenuItem,
18
+ DropdownMenuTrigger,
19
+ } from '@/components/ui/dropdown-menu'
20
+ import {
21
+ AlertDialog,
22
+ AlertDialogAction,
23
+ AlertDialogCancel,
24
+ AlertDialogContent,
25
+ AlertDialogDescription,
26
+ AlertDialogFooter,
27
+ AlertDialogHeader,
28
+ AlertDialogTitle,
29
+ } from '@/components/ui/alert-dialog'
30
+ import { Button } from '@/components/ui/button'
31
+ import { Skeleton } from '@/components/ui/skeleton'
32
+ import {
33
+ Tooltip,
34
+ TooltipContent,
35
+ TooltipTrigger,
36
+ } from '@/components/ui/tooltip'
37
+ import { HugeiconsIcon } from '@hugeicons/react'
38
+ import {
39
+ MoreHorizontalCircle01Icon,
40
+ EyeIcon,
41
+ Delete02Icon,
42
+ Copy01Icon,
43
+ } from '@hugeicons/core-free-icons'
44
+ import { rpcClient } from '@/lib/rpc-client'
45
+ import { toast } from 'sonner'
46
+ import type { App } from '@/lib/api'
47
+
48
+ interface AppsTableProps {
49
+ apps: App[]
50
+ isLoading: boolean
51
+ onDelete: () => void
52
+ }
53
+
54
+ function formatDate(dateString: string) {
55
+ return new Date(dateString).toLocaleDateString('en-US', {
56
+ year: 'numeric',
57
+ month: 'short',
58
+ day: 'numeric',
59
+ hour: '2-digit',
60
+ minute: '2-digit',
61
+ })
62
+ }
63
+
64
+ function copyToClipboard(text: string) {
65
+ navigator.clipboard.writeText(text)
66
+ toast.success('Copied to clipboard')
67
+ }
68
+
69
+ function truncateId(id: string, maxLength = 12) {
70
+ return id.length > maxLength ? `${id.substring(0, maxLength)}...` : id
71
+ }
72
+
73
+ export function AppsTable({ apps, isLoading, onDelete }: AppsTableProps) {
74
+ const router = useRouter()
75
+ const [deleteDialogOpen, setDeleteDialogOpen] = useState(false)
76
+ const [appToDelete, setAppToDelete] = useState<App | null>(null)
77
+ const [isDeleting, setIsDeleting] = useState(false)
78
+
79
+ const handleDelete = async () => {
80
+ if (!appToDelete) return
81
+
82
+ setIsDeleting(true)
83
+ try {
84
+ const res = await rpcClient.api.admin.apps[':appId'].$delete({
85
+ param: { appId: appToDelete.appId },
86
+ })
87
+
88
+ if (!res.ok) {
89
+ throw new Error('Failed to delete app')
90
+ }
91
+
92
+ toast.success('App deleted successfully')
93
+ setDeleteDialogOpen(false)
94
+ setAppToDelete(null)
95
+ onDelete()
96
+ } catch (error) {
97
+ toast.error('Failed to delete app')
98
+ console.error(error)
99
+ } finally {
100
+ setIsDeleting(false)
101
+ }
102
+ }
103
+
104
+ if (isLoading) {
105
+ return (
106
+ <div className="rounded-md border">
107
+ <Table>
108
+ <TableHeader>
109
+ <TableRow>
110
+ <TableHead>App ID</TableHead>
111
+ <TableHead>Name</TableHead>
112
+ <TableHead>Created</TableHead>
113
+ <TableHead>Updated</TableHead>
114
+ <TableHead className="w-[70px]"></TableHead>
115
+ </TableRow>
116
+ </TableHeader>
117
+ <TableBody>
118
+ {[...Array(3)].map((_, i) => (
119
+ <TableRow key={i}>
120
+ <TableCell>
121
+ <Skeleton className="h-5 w-48" />
122
+ </TableCell>
123
+ <TableCell>
124
+ <Skeleton className="h-5 w-32" />
125
+ </TableCell>
126
+ <TableCell>
127
+ <Skeleton className="h-5 w-36" />
128
+ </TableCell>
129
+ <TableCell>
130
+ <Skeleton className="h-5 w-36" />
131
+ </TableCell>
132
+ <TableCell>
133
+ <Skeleton className="h-8 w-8" />
134
+ </TableCell>
135
+ </TableRow>
136
+ ))}
137
+ </TableBody>
138
+ </Table>
139
+ </div>
140
+ )
141
+ }
142
+
143
+ if (apps.length === 0) {
144
+ return (
145
+ <div className="rounded-md border p-8 text-center">
146
+ <p className="text-muted-foreground">
147
+ No apps yet. Create your first app to get started.
148
+ </p>
149
+ </div>
150
+ )
151
+ }
152
+
153
+ return (
154
+ <>
155
+ <div className="rounded-md border">
156
+ <Table>
157
+ <TableHeader>
158
+ <TableRow>
159
+ <TableHead>App ID</TableHead>
160
+ <TableHead>Name</TableHead>
161
+ <TableHead>Created</TableHead>
162
+ <TableHead>Updated</TableHead>
163
+ <TableHead className="w-[70px]"></TableHead>
164
+ </TableRow>
165
+ </TableHeader>
166
+ <TableBody>
167
+ {apps.map((app) => (
168
+ <TableRow
169
+ key={app.appId}
170
+ className="cursor-pointer"
171
+ onClick={() => router.push(`/apps/${app.appId}`)}
172
+ >
173
+ <TableCell>
174
+ <div className="flex items-center gap-2">
175
+ {app.appId.length > 12 ? (
176
+ <Tooltip>
177
+ <TooltipTrigger asChild>
178
+ <code className="text-muted-foreground cursor-default font-mono text-sm">
179
+ {truncateId(app.appId)}
180
+ </code>
181
+ </TooltipTrigger>
182
+ <TooltipContent>{app.appId}</TooltipContent>
183
+ </Tooltip>
184
+ ) : (
185
+ <code className="text-muted-foreground font-mono text-sm">
186
+ {app.appId}
187
+ </code>
188
+ )}
189
+ <Button
190
+ variant="ghost"
191
+ size="icon"
192
+ className="h-6 w-6"
193
+ onClick={(e) => {
194
+ e.stopPropagation()
195
+ copyToClipboard(app.appId)
196
+ }}
197
+ >
198
+ <HugeiconsIcon icon={Copy01Icon} className="h-3 w-3" />
199
+ </Button>
200
+ </div>
201
+ </TableCell>
202
+ <TableCell className="font-medium">{app.name}</TableCell>
203
+ <TableCell className="text-muted-foreground">
204
+ {formatDate(app.createdAt)}
205
+ </TableCell>
206
+ <TableCell className="text-muted-foreground">
207
+ {formatDate(app.updatedAt)}
208
+ </TableCell>
209
+ <TableCell className="p-0" onClick={(e) => e.stopPropagation()}>
210
+ <DropdownMenu>
211
+ <DropdownMenuTrigger asChild>
212
+ <button className="hover:bg-muted/50 flex h-full w-full items-center justify-center p-4">
213
+ <HugeiconsIcon
214
+ icon={MoreHorizontalCircle01Icon}
215
+ className="h-4 w-4"
216
+ />
217
+ </button>
218
+ </DropdownMenuTrigger>
219
+ <DropdownMenuContent align="end">
220
+ <DropdownMenuItem asChild>
221
+ <Link href={`/apps/${app.appId}`}>
222
+ <HugeiconsIcon
223
+ icon={EyeIcon}
224
+ className="mr-2 h-4 w-4"
225
+ />
226
+ View
227
+ </Link>
228
+ </DropdownMenuItem>
229
+ <DropdownMenuItem
230
+ className="text-destructive focus:text-destructive"
231
+ onClick={() => {
232
+ setAppToDelete(app)
233
+ setDeleteDialogOpen(true)
234
+ }}
235
+ >
236
+ <HugeiconsIcon
237
+ icon={Delete02Icon}
238
+ className="mr-2 h-4 w-4"
239
+ />
240
+ Delete
241
+ </DropdownMenuItem>
242
+ </DropdownMenuContent>
243
+ </DropdownMenu>
244
+ </TableCell>
245
+ </TableRow>
246
+ ))}
247
+ </TableBody>
248
+ </Table>
249
+ </div>
250
+
251
+ <AlertDialog open={deleteDialogOpen} onOpenChange={setDeleteDialogOpen}>
252
+ <AlertDialogContent>
253
+ <AlertDialogHeader>
254
+ <AlertDialogTitle>Delete App</AlertDialogTitle>
255
+ <AlertDialogDescription>
256
+ Are you sure you want to delete &quot;{appToDelete?.name}&quot;?
257
+ This action cannot be undone and will delete all associated data.
258
+ </AlertDialogDescription>
259
+ </AlertDialogHeader>
260
+ <AlertDialogFooter>
261
+ <AlertDialogCancel>Cancel</AlertDialogCancel>
262
+ <AlertDialogAction
263
+ onClick={handleDelete}
264
+ className="bg-destructive text-destructive-foreground hover:bg-destructive/90"
265
+ disabled={isDeleting}
266
+ >
267
+ {isDeleting ? 'Deleting...' : 'Delete'}
268
+ </AlertDialogAction>
269
+ </AlertDialogFooter>
270
+ </AlertDialogContent>
271
+ </AlertDialog>
272
+ </>
273
+ )
274
+ }
@@ -0,0 +1,24 @@
1
+ {
2
+ "$schema": "https://ui.shadcn.com/schema.json",
3
+ "style": "radix-lyra",
4
+ "rsc": true,
5
+ "tsx": true,
6
+ "tailwind": {
7
+ "config": "",
8
+ "css": "app/globals.css",
9
+ "baseColor": "neutral",
10
+ "cssVariables": true,
11
+ "prefix": ""
12
+ },
13
+ "iconLibrary": "hugeicons",
14
+ "aliases": {
15
+ "components": "@/components",
16
+ "utils": "@/lib/utils",
17
+ "ui": "@/components/ui",
18
+ "lib": "@/lib",
19
+ "hooks": "@/hooks"
20
+ },
21
+ "menuColor": "default",
22
+ "menuAccent": "subtle",
23
+ "registries": {}
24
+ }
@@ -0,0 +1,3 @@
1
+ export default function AppLayout({ children }: { children: React.ReactNode }) {
2
+ return <>{children}</>
3
+ }