@shepai/cli 1.122.1-pr361.35a9abd → 1.122.1-pr373.cb974c2

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 (374) hide show
  1. package/dist/packages/core/src/infrastructure/services/agents/feature-agent/feature-agent-graph.d.ts.map +1 -1
  2. package/dist/packages/core/src/infrastructure/services/agents/feature-agent/feature-agent-graph.js +4 -21
  3. package/dist/packages/core/src/infrastructure/services/agents/feature-agent/nodes/validate.node.d.ts +1 -7
  4. package/dist/packages/core/src/infrastructure/services/agents/feature-agent/nodes/validate.node.d.ts.map +1 -1
  5. package/dist/packages/core/src/infrastructure/services/agents/feature-agent/nodes/validate.node.js +2 -24
  6. package/dist/src/presentation/web/app/actions/execute-query.d.ts +7 -0
  7. package/dist/src/presentation/web/app/actions/execute-query.d.ts.map +1 -0
  8. package/dist/src/presentation/web/app/actions/execute-query.js +55 -0
  9. package/dist/src/presentation/web/app/actions/get-table-rows.d.ts +10 -0
  10. package/dist/src/presentation/web/app/actions/get-table-rows.d.ts.map +1 -0
  11. package/dist/src/presentation/web/app/actions/get-table-rows.js +55 -0
  12. package/dist/src/presentation/web/app/actions/get-table-schema.d.ts +13 -0
  13. package/dist/src/presentation/web/app/actions/get-table-schema.d.ts.map +1 -0
  14. package/dist/src/presentation/web/app/actions/get-table-schema.js +27 -0
  15. package/dist/src/presentation/web/app/actions/list-tables.d.ts +10 -0
  16. package/dist/src/presentation/web/app/actions/list-tables.d.ts.map +1 -0
  17. package/dist/src/presentation/web/app/actions/list-tables.js +19 -0
  18. package/dist/src/presentation/web/app/database/page.d.ts +4 -0
  19. package/dist/src/presentation/web/app/database/page.d.ts.map +1 -0
  20. package/dist/src/presentation/web/app/database/page.js +15 -0
  21. package/dist/src/presentation/web/components/features/control-center/control-center-inner.d.ts.map +1 -1
  22. package/dist/src/presentation/web/components/features/control-center/control-center-inner.js +11 -53
  23. package/dist/src/presentation/web/components/features/database/cell-value-dialog.d.ts +8 -0
  24. package/dist/src/presentation/web/components/features/database/cell-value-dialog.d.ts.map +1 -0
  25. package/dist/src/presentation/web/components/features/database/cell-value-dialog.js +7 -0
  26. package/dist/src/presentation/web/components/features/database/cell-value-dialog.stories.d.ts +10 -0
  27. package/dist/src/presentation/web/components/features/database/cell-value-dialog.stories.d.ts.map +1 -0
  28. package/dist/src/presentation/web/components/features/database/cell-value-dialog.stories.js +48 -0
  29. package/dist/src/presentation/web/components/features/database/database-page-client.d.ts +13 -0
  30. package/dist/src/presentation/web/components/features/database/database-page-client.d.ts.map +1 -0
  31. package/dist/src/presentation/web/components/features/database/database-page-client.js +74 -0
  32. package/dist/src/presentation/web/components/features/database/database-page-client.stories.d.ts +9 -0
  33. package/dist/src/presentation/web/components/features/database/database-page-client.stories.d.ts.map +1 -0
  34. package/dist/src/presentation/web/components/features/database/database-page-client.stories.js +78 -0
  35. package/dist/src/presentation/web/components/features/database/query-runner.d.ts +9 -0
  36. package/dist/src/presentation/web/components/features/database/query-runner.d.ts.map +1 -0
  37. package/dist/src/presentation/web/components/features/database/query-runner.js +53 -0
  38. package/dist/src/presentation/web/components/features/database/query-runner.stories.d.ts +9 -0
  39. package/dist/src/presentation/web/components/features/database/query-runner.stories.d.ts.map +1 -0
  40. package/dist/src/presentation/web/components/features/database/query-runner.stories.js +55 -0
  41. package/dist/src/presentation/web/components/features/database/row-browser.d.ts +11 -0
  42. package/dist/src/presentation/web/components/features/database/row-browser.d.ts.map +1 -0
  43. package/dist/src/presentation/web/components/features/database/row-browser.js +42 -0
  44. package/dist/src/presentation/web/components/features/database/row-browser.stories.d.ts +14 -0
  45. package/dist/src/presentation/web/components/features/database/row-browser.stories.d.ts.map +1 -0
  46. package/dist/src/presentation/web/components/features/database/row-browser.stories.js +120 -0
  47. package/dist/src/presentation/web/components/features/database/schema-viewer.d.ts +7 -0
  48. package/dist/src/presentation/web/components/features/database/schema-viewer.d.ts.map +1 -0
  49. package/dist/src/presentation/web/components/features/database/schema-viewer.js +14 -0
  50. package/dist/src/presentation/web/components/features/database/schema-viewer.stories.d.ts +11 -0
  51. package/dist/src/presentation/web/components/features/database/schema-viewer.stories.d.ts.map +1 -0
  52. package/dist/src/presentation/web/components/features/database/schema-viewer.stories.js +67 -0
  53. package/dist/src/presentation/web/components/features/database/table-list.d.ts +8 -0
  54. package/dist/src/presentation/web/components/features/database/table-list.d.ts.map +1 -0
  55. package/dist/src/presentation/web/components/features/database/table-list.js +19 -0
  56. package/dist/src/presentation/web/components/features/database/table-list.stories.d.ts +10 -0
  57. package/dist/src/presentation/web/components/features/database/table-list.stories.d.ts.map +1 -0
  58. package/dist/src/presentation/web/components/features/database/table-list.stories.js +66 -0
  59. package/dist/src/presentation/web/components/layouts/app-sidebar/app-sidebar.d.ts.map +1 -1
  60. package/dist/src/presentation/web/components/layouts/app-sidebar/app-sidebar.js +2 -2
  61. package/dist/src/presentation/web/components/ui/table.d.ts +11 -0
  62. package/dist/src/presentation/web/components/ui/table.d.ts.map +1 -0
  63. package/dist/src/presentation/web/components/ui/table.js +28 -0
  64. package/dist/src/presentation/web/hooks/use-viewport-persistence.d.ts +0 -2
  65. package/dist/src/presentation/web/hooks/use-viewport-persistence.d.ts.map +1 -1
  66. package/dist/src/presentation/web/hooks/use-viewport-persistence.js +6 -19
  67. package/dist/src/presentation/web/lib/layout-with-dagre.d.ts.map +1 -1
  68. package/dist/src/presentation/web/lib/layout-with-dagre.js +2 -11
  69. package/dist/src/presentation/web/lib/server-container.d.ts +1 -2
  70. package/dist/src/presentation/web/lib/server-container.d.ts.map +1 -1
  71. package/dist/src/presentation/web/lib/server-db.d.ts +16 -0
  72. package/dist/src/presentation/web/lib/server-db.d.ts.map +1 -0
  73. package/dist/src/presentation/web/lib/server-db.js +10 -0
  74. package/dist/src/presentation/web/lib/sql-validation.d.ts +7 -0
  75. package/dist/src/presentation/web/lib/sql-validation.d.ts.map +1 -0
  76. package/dist/src/presentation/web/lib/sql-validation.js +17 -0
  77. package/dist/tsconfig.build.tsbuildinfo +1 -1
  78. package/package.json +1 -1
  79. package/web/.next/BUILD_ID +1 -1
  80. package/web/.next/app-path-routes-manifest.json +1 -0
  81. package/web/.next/build-manifest.json +6 -6
  82. package/web/.next/fallback-build-manifest.json +2 -2
  83. package/web/.next/prerender-manifest.json +3 -3
  84. package/web/.next/required-server-files.js +1 -1
  85. package/web/.next/required-server-files.json +1 -1
  86. package/web/.next/routes-manifest.json +6 -0
  87. package/web/.next/server/app/(dashboard)/@drawer/create/page/build-manifest.json +4 -4
  88. package/web/.next/server/app/(dashboard)/@drawer/create/page/server-reference-manifest.json +22 -22
  89. package/web/.next/server/app/(dashboard)/@drawer/create/page.js +1 -1
  90. package/web/.next/server/app/(dashboard)/@drawer/create/page.js.nft.json +1 -1
  91. package/web/.next/server/app/(dashboard)/@drawer/create/page_client-reference-manifest.js +1 -1
  92. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/[tab]/page/build-manifest.json +4 -4
  93. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/[tab]/page/server-reference-manifest.json +28 -28
  94. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/[tab]/page.js +1 -1
  95. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/[tab]/page.js.nft.json +1 -1
  96. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/[tab]/page_client-reference-manifest.js +1 -1
  97. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page/build-manifest.json +4 -4
  98. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page/server-reference-manifest.json +28 -28
  99. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page.js +1 -1
  100. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page.js.nft.json +1 -1
  101. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page_client-reference-manifest.js +1 -1
  102. package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page/build-manifest.json +4 -4
  103. package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page/server-reference-manifest.json +20 -20
  104. package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page.js +1 -1
  105. package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page.js.nft.json +1 -1
  106. package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page_client-reference-manifest.js +1 -1
  107. package/web/.next/server/app/(dashboard)/create/page/build-manifest.json +4 -4
  108. package/web/.next/server/app/(dashboard)/create/page/server-reference-manifest.json +22 -22
  109. package/web/.next/server/app/(dashboard)/create/page.js +1 -1
  110. package/web/.next/server/app/(dashboard)/create/page.js.nft.json +1 -1
  111. package/web/.next/server/app/(dashboard)/create/page_client-reference-manifest.js +1 -1
  112. package/web/.next/server/app/(dashboard)/feature/[featureId]/[tab]/page/build-manifest.json +4 -4
  113. package/web/.next/server/app/(dashboard)/feature/[featureId]/[tab]/page/server-reference-manifest.json +28 -28
  114. package/web/.next/server/app/(dashboard)/feature/[featureId]/[tab]/page.js +1 -1
  115. package/web/.next/server/app/(dashboard)/feature/[featureId]/[tab]/page.js.nft.json +1 -1
  116. package/web/.next/server/app/(dashboard)/feature/[featureId]/[tab]/page_client-reference-manifest.js +1 -1
  117. package/web/.next/server/app/(dashboard)/feature/[featureId]/page/build-manifest.json +4 -4
  118. package/web/.next/server/app/(dashboard)/feature/[featureId]/page/server-reference-manifest.json +28 -28
  119. package/web/.next/server/app/(dashboard)/feature/[featureId]/page.js +1 -1
  120. package/web/.next/server/app/(dashboard)/feature/[featureId]/page.js.nft.json +1 -1
  121. package/web/.next/server/app/(dashboard)/feature/[featureId]/page_client-reference-manifest.js +1 -1
  122. package/web/.next/server/app/(dashboard)/page/build-manifest.json +4 -4
  123. package/web/.next/server/app/(dashboard)/page/server-reference-manifest.json +20 -20
  124. package/web/.next/server/app/(dashboard)/page.js +1 -1
  125. package/web/.next/server/app/(dashboard)/page.js.nft.json +1 -1
  126. package/web/.next/server/app/(dashboard)/page_client-reference-manifest.js +1 -1
  127. package/web/.next/server/app/(dashboard)/repository/[repositoryId]/page/build-manifest.json +4 -4
  128. package/web/.next/server/app/(dashboard)/repository/[repositoryId]/page/server-reference-manifest.json +20 -20
  129. package/web/.next/server/app/(dashboard)/repository/[repositoryId]/page.js +1 -1
  130. package/web/.next/server/app/(dashboard)/repository/[repositoryId]/page.js.nft.json +1 -1
  131. package/web/.next/server/app/(dashboard)/repository/[repositoryId]/page_client-reference-manifest.js +1 -1
  132. package/web/.next/server/app/_global-error/page/build-manifest.json +4 -4
  133. package/web/.next/server/app/_global-error.html +2 -2
  134. package/web/.next/server/app/_global-error.rsc +1 -1
  135. package/web/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +1 -1
  136. package/web/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  137. package/web/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  138. package/web/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  139. package/web/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  140. package/web/.next/server/app/_not-found/page/build-manifest.json +4 -4
  141. package/web/.next/server/app/_not-found/page/server-reference-manifest.json +1 -1
  142. package/web/.next/server/app/_not-found/page.js +1 -1
  143. package/web/.next/server/app/_not-found/page.js.nft.json +1 -1
  144. package/web/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  145. package/web/.next/server/app/api/attachments/preview/route.js +1 -1
  146. package/web/.next/server/app/api/attachments/preview/route.js.nft.json +1 -1
  147. package/web/.next/server/app/api/evidence/route.js +1 -1
  148. package/web/.next/server/app/api/evidence/route.js.nft.json +1 -1
  149. package/web/.next/server/app/api/graph-data/route.js.nft.json +1 -1
  150. package/web/.next/server/app/database/page/app-paths-manifest.json +3 -0
  151. package/web/.next/server/app/database/page/build-manifest.json +18 -0
  152. package/web/.next/server/app/database/page/next-font-manifest.json +6 -0
  153. package/web/.next/server/app/database/page/react-loadable-manifest.json +1 -0
  154. package/web/.next/server/app/database/page/server-reference-manifest.json +80 -0
  155. package/web/.next/server/app/database/page.js +16 -0
  156. package/web/.next/server/app/database/page.js.map +5 -0
  157. package/web/.next/server/app/database/page.js.nft.json +1 -0
  158. package/web/.next/server/app/database/page_client-reference-manifest.js +2 -0
  159. package/web/.next/server/app/settings/page/build-manifest.json +4 -4
  160. package/web/.next/server/app/settings/page/server-reference-manifest.json +6 -6
  161. package/web/.next/server/app/settings/page.js +1 -1
  162. package/web/.next/server/app/settings/page.js.nft.json +1 -1
  163. package/web/.next/server/app/settings/page_client-reference-manifest.js +1 -1
  164. package/web/.next/server/app/skills/page/build-manifest.json +4 -4
  165. package/web/.next/server/app/skills/page/server-reference-manifest.json +6 -6
  166. package/web/.next/server/app/skills/page.js +1 -1
  167. package/web/.next/server/app/skills/page.js.nft.json +1 -1
  168. package/web/.next/server/app/skills/page_client-reference-manifest.js +1 -1
  169. package/web/.next/server/app/tools/page/build-manifest.json +4 -4
  170. package/web/.next/server/app/tools/page/server-reference-manifest.json +6 -6
  171. package/web/.next/server/app/tools/page.js +1 -1
  172. package/web/.next/server/app/tools/page.js.nft.json +1 -1
  173. package/web/.next/server/app/tools/page_client-reference-manifest.js +1 -1
  174. package/web/.next/server/app/version/page/build-manifest.json +4 -4
  175. package/web/.next/server/app/version/page/server-reference-manifest.json +1 -1
  176. package/web/.next/server/app/version/page.js +2 -2
  177. package/web/.next/server/app/version/page.js.nft.json +1 -1
  178. package/web/.next/server/app/version/page_client-reference-manifest.js +1 -1
  179. package/web/.next/server/app-paths-manifest.json +1 -0
  180. package/web/.next/server/chunks/403f9_next_dist_esm_build_templates_app-route_370c43b1.js +1 -1
  181. package/web/.next/server/chunks/403f9_next_dist_esm_build_templates_app-route_370c43b1.js.map +1 -1
  182. package/web/.next/server/chunks/[root-of-the-server]__0866d2b5._.js.map +1 -1
  183. package/web/.next/server/chunks/[root-of-the-server]__42b7ab55._.js.map +1 -1
  184. package/web/.next/server/chunks/{[root-of-the-server]__53013576._.js → [root-of-the-server]__7d63f9a4._.js} +2 -2
  185. package/web/.next/server/chunks/[root-of-the-server]__9191749c._.js.map +1 -1
  186. package/web/.next/server/chunks/[root-of-the-server]__9a136c79._.js.map +1 -1
  187. package/web/.next/server/chunks/{[root-of-the-server]__92078db6._.js → [root-of-the-server]__a1c7c02a._.js} +2 -2
  188. package/web/.next/server/chunks/[root-of-the-server]__a402b567._.js +1 -1
  189. package/web/.next/server/chunks/[root-of-the-server]__a402b567._.js.map +1 -1
  190. package/web/.next/server/chunks/[root-of-the-server]__a5879003._.js.map +1 -1
  191. package/web/.next/server/chunks/[root-of-the-server]__b2f9a412._.js.map +1 -1
  192. package/web/.next/server/chunks/[root-of-the-server]__b4102cc7._.js.map +1 -1
  193. package/web/.next/server/chunks/[root-of-the-server]__cd67a84c._.js.map +1 -1
  194. package/web/.next/server/chunks/[root-of-the-server]__d2c18946._.js.map +1 -1
  195. package/web/.next/server/chunks/[root-of-the-server]__d8037e14._.js.map +1 -1
  196. package/web/.next/server/chunks/[root-of-the-server]__d9d410a8._.js.map +1 -1
  197. package/web/.next/server/chunks/[root-of-the-server]__e247a485._.js.map +1 -1
  198. package/web/.next/server/chunks/ssr/744ca_web_components_common_control-center-drawer_create-drawer-client_tsx_5e26fc0a._.js +1 -1
  199. package/web/.next/server/chunks/ssr/744ca_web_components_common_control-center-drawer_create-drawer-client_tsx_5e26fc0a._.js.map +1 -1
  200. package/web/.next/server/chunks/ssr/8ba4b_server_app_(dashboard)_@drawer_repository_[repositoryId]_page_actions_f30d0343.js +1 -1
  201. package/web/.next/server/chunks/ssr/8ba4b_server_app_(dashboard)_@drawer_repository_[repositoryId]_page_actions_f30d0343.js.map +1 -1
  202. package/web/.next/server/chunks/ssr/8ba4b_server_app_(dashboard)_repository_[repositoryId]_page_actions_9f1775bb.js +1 -1
  203. package/web/.next/server/chunks/ssr/8ba4b_server_app_(dashboard)_repository_[repositoryId]_page_actions_9f1775bb.js.map +1 -1
  204. package/web/.next/server/chunks/ssr/{[root-of-the-server]__06fef644._.js → [root-of-the-server]__07a39ff2._.js} +2 -2
  205. package/web/.next/server/chunks/ssr/[root-of-the-server]__07a39ff2._.js.map +1 -0
  206. package/web/.next/server/chunks/ssr/[root-of-the-server]__11033878._.js +4 -0
  207. package/web/.next/server/chunks/ssr/{[root-of-the-server]__6b17a22d._.js.map → [root-of-the-server]__11033878._.js.map} +1 -1
  208. package/web/.next/server/chunks/ssr/[root-of-the-server]__1a0bbce4._.js +3 -0
  209. package/web/.next/server/chunks/ssr/[root-of-the-server]__1a0bbce4._.js.map +1 -0
  210. package/web/.next/server/chunks/ssr/[root-of-the-server]__2698e9f4._.js +1 -1
  211. package/web/.next/server/chunks/ssr/[root-of-the-server]__2698e9f4._.js.map +1 -1
  212. package/web/.next/server/chunks/ssr/[root-of-the-server]__33cee851._.js +3 -0
  213. package/web/.next/server/chunks/ssr/[root-of-the-server]__33cee851._.js.map +1 -0
  214. package/web/.next/server/chunks/ssr/[root-of-the-server]__4bb4b155._.js +4 -0
  215. package/web/.next/server/chunks/ssr/[root-of-the-server]__4bb4b155._.js.map +1 -0
  216. package/web/.next/server/chunks/ssr/[root-of-the-server]__590dfc34._.js +4 -0
  217. package/web/.next/server/chunks/ssr/[root-of-the-server]__590dfc34._.js.map +1 -0
  218. package/web/.next/server/chunks/ssr/[root-of-the-server]__6bb00d90._.js +2 -2
  219. package/web/.next/server/chunks/ssr/[root-of-the-server]__6bb00d90._.js.map +1 -1
  220. package/web/.next/server/chunks/ssr/[root-of-the-server]__743e777a._.js +4 -0
  221. package/web/.next/server/chunks/ssr/[root-of-the-server]__743e777a._.js.map +1 -0
  222. package/web/.next/server/chunks/ssr/[root-of-the-server]__7a939e4e._.js +4 -0
  223. package/web/.next/server/chunks/ssr/{[root-of-the-server]__a022445f._.js.map → [root-of-the-server]__7a939e4e._.js.map} +1 -1
  224. package/web/.next/server/chunks/ssr/[root-of-the-server]__8e3bf5d7._.js +1 -1
  225. package/web/.next/server/chunks/ssr/[root-of-the-server]__8e3bf5d7._.js.map +1 -1
  226. package/web/.next/server/chunks/ssr/[root-of-the-server]__930c8634._.js +3 -0
  227. package/web/.next/server/chunks/ssr/[root-of-the-server]__930c8634._.js.map +1 -0
  228. package/web/.next/server/chunks/ssr/[root-of-the-server]__b724df9e._.js.map +1 -1
  229. package/web/.next/server/chunks/ssr/[root-of-the-server]__c07f9f79._.js +1 -1
  230. package/web/.next/server/chunks/ssr/[root-of-the-server]__c07f9f79._.js.map +1 -1
  231. package/web/.next/server/chunks/ssr/[root-of-the-server]__c605a375._.js +1 -1
  232. package/web/.next/server/chunks/ssr/[root-of-the-server]__c605a375._.js.map +1 -1
  233. package/web/.next/server/chunks/ssr/[root-of-the-server]__fdc75809._.js +4 -0
  234. package/web/.next/server/chunks/ssr/{[root-of-the-server]__804c006d._.js.map → [root-of-the-server]__fdc75809._.js.map} +1 -1
  235. package/web/.next/server/chunks/ssr/_05ca281a._.js +3 -0
  236. package/web/.next/server/chunks/ssr/_05ca281a._.js.map +1 -0
  237. package/web/.next/server/chunks/ssr/_061c1da2._.js +3 -0
  238. package/web/.next/server/chunks/ssr/_061c1da2._.js.map +1 -0
  239. package/web/.next/server/chunks/ssr/_0e6034fc._.js +3 -0
  240. package/web/.next/server/chunks/ssr/_0e6034fc._.js.map +1 -0
  241. package/web/.next/server/chunks/ssr/_150e66ba._.js +3 -0
  242. package/web/.next/server/chunks/ssr/_150e66ba._.js.map +1 -0
  243. package/web/.next/server/chunks/ssr/_2f6f48b8._.js +1 -1
  244. package/web/.next/server/chunks/ssr/_2f6f48b8._.js.map +1 -1
  245. package/web/.next/server/chunks/ssr/_34ba40e0._.js +3 -0
  246. package/web/.next/server/chunks/ssr/_34ba40e0._.js.map +1 -0
  247. package/web/.next/server/chunks/ssr/_5b809cd2._.js +4 -0
  248. package/web/.next/server/chunks/ssr/_5b809cd2._.js.map +1 -0
  249. package/web/.next/server/chunks/ssr/{_30c9af21._.js → _5d618f84._.js} +2 -2
  250. package/web/.next/server/chunks/ssr/{_30c9af21._.js.map → _5d618f84._.js.map} +1 -1
  251. package/web/.next/server/chunks/ssr/_6552e0aa._.js +3 -0
  252. package/web/.next/server/chunks/ssr/_6552e0aa._.js.map +1 -0
  253. package/web/.next/server/chunks/ssr/_81f88d15._.js +7 -0
  254. package/web/.next/server/chunks/ssr/_81f88d15._.js.map +1 -0
  255. package/web/.next/server/chunks/ssr/_93d2a00c._.js +3 -0
  256. package/web/.next/server/chunks/ssr/_93d2a00c._.js.map +1 -0
  257. package/web/.next/server/chunks/ssr/_ad5819d0._.js +3 -0
  258. package/web/.next/server/chunks/ssr/_ad5819d0._.js.map +1 -0
  259. package/web/.next/server/chunks/ssr/{_f1a649e3._.js → _d506bca5._.js} +2 -2
  260. package/web/.next/server/chunks/ssr/{_f1a649e3._.js.map → _d506bca5._.js.map} +1 -1
  261. package/web/.next/server/chunks/ssr/_e1854141._.js +3 -0
  262. package/web/.next/server/chunks/ssr/_e1854141._.js.map +1 -0
  263. package/web/.next/server/chunks/ssr/_f9959908._.js +3 -0
  264. package/web/.next/server/chunks/ssr/_f9959908._.js.map +1 -0
  265. package/web/.next/server/chunks/ssr/b1a17_presentation_web_components_features_database_database-page-client_tsx_b853607a._.js +3 -0
  266. package/web/.next/server/chunks/ssr/b1a17_presentation_web_components_features_database_database-page-client_tsx_b853607a._.js.map +1 -0
  267. package/web/.next/server/chunks/ssr/b1a17_presentation_web_components_features_settings_settings-page-client_tsx_6ed9d5f8._.js +1 -1
  268. package/web/.next/server/chunks/ssr/b1a17_presentation_web_components_features_settings_settings-page-client_tsx_6ed9d5f8._.js.map +1 -1
  269. package/web/.next/server/chunks/ssr/node_modules__pnpm_026172d1._.js +3 -0
  270. package/web/.next/server/chunks/ssr/node_modules__pnpm_026172d1._.js.map +1 -0
  271. package/web/.next/server/chunks/ssr/node_modules__pnpm_8b0ea744._.js +3 -0
  272. package/web/.next/server/chunks/ssr/node_modules__pnpm_8b0ea744._.js.map +1 -0
  273. package/web/.next/server/chunks/ssr/src_presentation_web_5f039db1._.js +2 -2
  274. package/web/.next/server/chunks/ssr/src_presentation_web_5f039db1._.js.map +1 -1
  275. package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_(dashboard)_page_actions_2a52b697.js +1 -1
  276. package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_(dashboard)_page_actions_2a52b697.js.map +1 -1
  277. package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_skills_page_actions_1fa8042e.js +1 -1
  278. package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_skills_page_actions_1fa8042e.js.map +1 -1
  279. package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_tools_page_actions_24684200.js +1 -1
  280. package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_tools_page_actions_24684200.js.map +1 -1
  281. package/web/.next/server/chunks/ssr/src_presentation_web_c4337169._.js +2 -2
  282. package/web/.next/server/chunks/ssr/src_presentation_web_c4337169._.js.map +1 -1
  283. package/web/.next/server/chunks/ssr/src_presentation_web_ca99d62d._.js +1 -1
  284. package/web/.next/server/chunks/ssr/src_presentation_web_ca99d62d._.js.map +1 -1
  285. package/web/.next/server/chunks/ssr/src_presentation_web_components_bf50c527._.js +1 -1
  286. package/web/.next/server/chunks/ssr/src_presentation_web_components_de814675._.js +1 -1
  287. package/web/.next/server/chunks/ssr/src_presentation_web_components_e599bb8c._.js +1 -1
  288. package/web/.next/server/chunks/ssr/src_presentation_web_components_e599bb8c._.js.map +1 -1
  289. package/web/.next/server/chunks/ssr/src_presentation_web_components_features_control-center_7ac3562e._.js +1 -1
  290. package/web/.next/server/chunks/ssr/src_presentation_web_components_features_control-center_7ac3562e._.js.map +1 -1
  291. package/web/.next/server/chunks/ssr/src_presentation_web_components_ui_scroll-area_tsx_53ae5be7._.js +3 -0
  292. package/web/.next/server/chunks/ssr/src_presentation_web_components_ui_scroll-area_tsx_53ae5be7._.js.map +1 -0
  293. package/web/.next/server/middleware-build-manifest.js +4 -4
  294. package/web/.next/server/pages/500.html +2 -2
  295. package/web/.next/server/server-reference-manifest.js +1 -1
  296. package/web/.next/server/server-reference-manifest.json +101 -34
  297. package/web/.next/static/chunks/0b8f2e223e1b82f4.js +1 -0
  298. package/web/.next/static/chunks/0e57fc72bf0bc5ba.js +1 -0
  299. package/web/.next/static/chunks/22a1d0eb174f3da9.js +1 -0
  300. package/web/.next/static/chunks/401118947e7159e0.js +1 -0
  301. package/web/.next/static/chunks/40b6bcf1a2de4a0f.js +1 -0
  302. package/web/.next/static/chunks/471c323a18da4918.js +1 -0
  303. package/web/.next/static/chunks/495b4bee62b00caa.js +1 -0
  304. package/web/.next/static/chunks/5aab343372a98721.js +1 -0
  305. package/web/.next/static/chunks/70e04b1108d151c3.js +11 -0
  306. package/web/.next/static/chunks/{0cd4694791225f54.js → 899529af3e08bf94.js} +2 -2
  307. package/web/.next/static/chunks/96fc208419afac9e.js +1 -0
  308. package/web/.next/static/chunks/b3914c0aae76742b.css +1 -0
  309. package/web/.next/static/chunks/b4160eaf4deda4e7.js +1 -0
  310. package/web/.next/static/chunks/b65702b701417ae2.js +1 -0
  311. package/web/.next/static/chunks/c2c0d4e71c36199f.js +1 -0
  312. package/web/.next/static/chunks/c7e793951b20a67f.js +1 -0
  313. package/web/.next/static/chunks/cb440c7f33e135f4.js +1 -0
  314. package/web/.next/static/chunks/{1b819d33e9d131dc.js → cb46d75dfac954a5.js} +2 -2
  315. package/web/.next/static/chunks/dd702ceaee4a5c0d.js +1 -0
  316. package/web/.next/static/chunks/e6b8baa05827f641.js +1 -0
  317. package/web/.next/static/chunks/{turbopack-426d9bc2450816ba.js → turbopack-b1685b5f87ad1d60.js} +1 -1
  318. package/web/.next/server/chunks/ssr/7f428_lucide-react_dist_esm_icons_d0119342._.js +0 -3
  319. package/web/.next/server/chunks/ssr/7f428_lucide-react_dist_esm_icons_d0119342._.js.map +0 -1
  320. package/web/.next/server/chunks/ssr/[root-of-the-server]__06fef644._.js.map +0 -1
  321. package/web/.next/server/chunks/ssr/[root-of-the-server]__545792ab._.js +0 -3
  322. package/web/.next/server/chunks/ssr/[root-of-the-server]__545792ab._.js.map +0 -1
  323. package/web/.next/server/chunks/ssr/[root-of-the-server]__6b17a22d._.js +0 -4
  324. package/web/.next/server/chunks/ssr/[root-of-the-server]__804c006d._.js +0 -4
  325. package/web/.next/server/chunks/ssr/[root-of-the-server]__8c553503._.js +0 -4
  326. package/web/.next/server/chunks/ssr/[root-of-the-server]__8c553503._.js.map +0 -1
  327. package/web/.next/server/chunks/ssr/[root-of-the-server]__9f155c0e._.js +0 -3
  328. package/web/.next/server/chunks/ssr/[root-of-the-server]__9f155c0e._.js.map +0 -1
  329. package/web/.next/server/chunks/ssr/[root-of-the-server]__a022445f._.js +0 -4
  330. package/web/.next/server/chunks/ssr/[root-of-the-server]__a7de2711._.js +0 -4
  331. package/web/.next/server/chunks/ssr/[root-of-the-server]__a7de2711._.js.map +0 -1
  332. package/web/.next/server/chunks/ssr/_0dc2cfd3._.js +0 -3
  333. package/web/.next/server/chunks/ssr/_0dc2cfd3._.js.map +0 -1
  334. package/web/.next/server/chunks/ssr/_0e506641._.js +0 -7
  335. package/web/.next/server/chunks/ssr/_0e506641._.js.map +0 -1
  336. package/web/.next/server/chunks/ssr/_132dd4b8._.js +0 -3
  337. package/web/.next/server/chunks/ssr/_132dd4b8._.js.map +0 -1
  338. package/web/.next/server/chunks/ssr/_135edb9c._.js +0 -3
  339. package/web/.next/server/chunks/ssr/_135edb9c._.js.map +0 -1
  340. package/web/.next/server/chunks/ssr/_1bb131c4._.js +0 -3
  341. package/web/.next/server/chunks/ssr/_1bb131c4._.js.map +0 -1
  342. package/web/.next/server/chunks/ssr/_32c5c20d._.js +0 -3
  343. package/web/.next/server/chunks/ssr/_32c5c20d._.js.map +0 -1
  344. package/web/.next/server/chunks/ssr/_6d26a08f._.js +0 -3
  345. package/web/.next/server/chunks/ssr/_6d26a08f._.js.map +0 -1
  346. package/web/.next/server/chunks/ssr/_75f4ccb3._.js +0 -3
  347. package/web/.next/server/chunks/ssr/_75f4ccb3._.js.map +0 -1
  348. package/web/.next/server/chunks/ssr/_b5fc318a._.js +0 -3
  349. package/web/.next/server/chunks/ssr/_b5fc318a._.js.map +0 -1
  350. package/web/.next/server/chunks/ssr/_cc77a143._.js +0 -3
  351. package/web/.next/server/chunks/ssr/_cc77a143._.js.map +0 -1
  352. package/web/.next/server/chunks/ssr/node_modules__pnpm_b59e4b16._.js +0 -3
  353. package/web/.next/server/chunks/ssr/node_modules__pnpm_b59e4b16._.js.map +0 -1
  354. package/web/.next/static/chunks/0d2af96e64960ef5.css +0 -1
  355. package/web/.next/static/chunks/1a71a1628a38996f.js +0 -1
  356. package/web/.next/static/chunks/303a1217006489b9.js +0 -1
  357. package/web/.next/static/chunks/4562ee849ea13c3a.js +0 -1
  358. package/web/.next/static/chunks/56a5153f06d64eca.js +0 -1
  359. package/web/.next/static/chunks/717af1bcb9dadef9.js +0 -11
  360. package/web/.next/static/chunks/82f917cc65ec7d42.js +0 -1
  361. package/web/.next/static/chunks/845d8e58a91014e6.js +0 -1
  362. package/web/.next/static/chunks/84a181ff3270fd9f.js +0 -1
  363. package/web/.next/static/chunks/96eeeb28e06de78c.js +0 -1
  364. package/web/.next/static/chunks/a8704e79171c33bf.js +0 -1
  365. package/web/.next/static/chunks/ab24252e992d6b8c.js +0 -1
  366. package/web/.next/static/chunks/c7bd0ef3d9b78f56.js +0 -1
  367. package/web/.next/static/chunks/d0cdb752198e0ce2.js +0 -1
  368. package/web/.next/static/chunks/e2ef95d904c360f3.js +0 -1
  369. package/web/.next/static/chunks/ed3a602003bcb31b.js +0 -1
  370. /package/web/.next/server/chunks/{[root-of-the-server]__53013576._.js.map → [root-of-the-server]__7d63f9a4._.js.map} +0 -0
  371. /package/web/.next/server/chunks/{[root-of-the-server]__92078db6._.js.map → [root-of-the-server]__a1c7c02a._.js.map} +0 -0
  372. /package/web/.next/static/{HLY1lOE_eWQBTqZqPvvsU → 4xrMEp5YYiIKE3f9RD6L-}/_buildManifest.js +0 -0
  373. /package/web/.next/static/{HLY1lOE_eWQBTqZqPvvsU → 4xrMEp5YYiIKE3f9RD6L-}/_clientMiddlewareManifest.json +0 -0
  374. /package/web/.next/static/{HLY1lOE_eWQBTqZqPvvsU → 4xrMEp5YYiIKE3f9RD6L-}/_ssgManifest.js +0 -0
@@ -1 +1 @@
1
- {"version":3,"file":"feature-agent-graph.d.ts","sourceRoot":"","sources":["../../../../../../../../packages/core/src/infrastructure/services/agents/feature-agent/feature-agent-graph.ts"],"names":[],"mappings":"AAAA,OAAO,EAA0B,KAAK,mBAAmB,EAAE,MAAM,sBAAsB,CAAC;AACxF,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,+DAA+D,CAAC;AAOpG,OAAO,EAAmB,KAAK,aAAa,EAAE,MAAM,6BAA6B,CAAC;AAclF,OAAO,EAAE,sBAAsB,EAAE,KAAK,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAE5E;;;GAGG;AACH,MAAM,WAAW,qBAAqB;IACpC,QAAQ,EAAE,cAAc,CAAC;IACzB,aAAa,CAAC,EAAE,IAAI,CAAC,aAAa,EAAE,UAAU,CAAC,CAAC;CACjD;AAwID;;;;;;;;;;;;GAYG;AACH,wBAAgB,uBAAuB,CACrC,cAAc,EAAE,qBAAqB,GAAG,cAAc,EACtD,YAAY,CAAC,EAAE,mBAAmB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;qBAgFnC"}
1
+ {"version":3,"file":"feature-agent-graph.d.ts","sourceRoot":"","sources":["../../../../../../../../packages/core/src/infrastructure/services/agents/feature-agent/feature-agent-graph.ts"],"names":[],"mappings":"AAAA,OAAO,EAA0B,KAAK,mBAAmB,EAAE,MAAM,sBAAsB,CAAC;AACxF,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,+DAA+D,CAAC;AAOpG,OAAO,EAAmB,KAAK,aAAa,EAAE,MAAM,6BAA6B,CAAC;AASlF,OAAO,EAAE,sBAAsB,EAAE,KAAK,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAE5E;;;GAGG;AACH,MAAM,WAAW,qBAAqB;IACpC,QAAQ,EAAE,cAAc,CAAC;IACzB,aAAa,CAAC,EAAE,IAAI,CAAC,aAAa,EAAE,UAAU,CAAC,CAAC;CACjD;AA0HD;;;;;;;;;;;;GAYG;AACH,wBAAgB,uBAAuB,CACrC,cAAc,EAAE,qBAAqB,GAAG,cAAc,EACtD,YAAY,CAAC,EAAE,mBAAmB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;qBAwEnC"}
@@ -11,7 +11,7 @@ import { createRepairNode } from './nodes/repair.node.js';
11
11
  import { validateSpecAnalyze, validateSpecRequirements } from './nodes/schemas/spec.schema.js';
12
12
  import { validateResearch } from './nodes/schemas/research.schema.js';
13
13
  import { validatePlan, validateTasks } from './nodes/schemas/plan.schema.js';
14
- import { readSpecFile, safeYamlLoad, createNodeLogger, getCompletedPhases, } from './nodes/node-helpers.js';
14
+ import { readSpecFile, safeYamlLoad, createNodeLogger } from './nodes/node-helpers.js';
15
15
  // Re-export state types for consumers
16
16
  export { FeatureAgentAnnotation } from './state.js';
17
17
  /**
@@ -54,18 +54,6 @@ function createPlanTasksValidator() {
54
54
  const log = createNodeLogger('validate:plan+tasks');
55
55
  return async (state) => {
56
56
  log.activate();
57
- // Skip validation when the successor phase (implement) is already completed.
58
- // This proves validation already passed and the pipeline progressed beyond it.
59
- // Same logic as createValidateNode's successorPhase guard.
60
- if (getCompletedPhases(state.specDir).includes('implement')) {
61
- log.info("Successor phase 'implement' already completed, skipping validation");
62
- return {
63
- lastValidationTarget: 'plan.yaml+tasks.yaml',
64
- lastValidationErrors: [],
65
- validationRetries: 0,
66
- messages: ["[validate:plan+tasks] SKIP (successor 'implement' already completed)"],
67
- };
68
- }
69
57
  log.info('Validating plan.yaml and tasks.yaml');
70
58
  const allErrors = [];
71
59
  // Validate plan.yaml
@@ -157,14 +145,9 @@ export function createFeatureAgentGraph(depsOrExecutor, checkpointer) {
157
145
  .addNode('plan', createPlanNode(executor))
158
146
  .addNode('implement', createImplementNode(executor))
159
147
  // --- Validate nodes ---
160
- // Each validate node receives its SUCCESSOR phase name (the phase that runs
161
- // after validation passes). On resume, validation is skipped only when the
162
- // successor is already completed — proving this validation already passed.
163
- // Using the successor (not the producer) avoids skipping validation when the
164
- // producer ran successfully but validation itself failed.
165
- .addNode('validate_spec_analyze', createValidateNode('spec.yaml', validateSpecAnalyze, 'requirements'))
166
- .addNode('validate_spec_requirements', createValidateNode('spec.yaml', validateSpecRequirements, 'research'))
167
- .addNode('validate_research', createValidateNode('research.yaml', validateResearch, 'plan'))
148
+ .addNode('validate_spec_analyze', createValidateNode('spec.yaml', validateSpecAnalyze))
149
+ .addNode('validate_spec_requirements', createValidateNode('spec.yaml', validateSpecRequirements))
150
+ .addNode('validate_research', createValidateNode('research.yaml', validateResearch))
168
151
  .addNode('validate_plan_tasks', createPlanTasksValidator())
169
152
  // --- Repair nodes ---
170
153
  .addNode('repair_spec_analyze', createRepairNode('spec.yaml', executor))
@@ -6,13 +6,7 @@ type SchemaValidator = (data: unknown) => ValidationResult;
6
6
  *
7
7
  * On success: resets validationRetries to 0, clears errors.
8
8
  * On failure: increments validationRetries, sets errors for repair node.
9
- *
10
- * @param successorPhase - The phase that runs AFTER this validation passes.
11
- * If provided, skip validation when the successor is already completed — this
12
- * proves the validation already passed in a prior run and the pipeline progressed
13
- * beyond it. Checking the successor (not the producer) avoids skipping validation
14
- * when the producer ran but validation itself failed.
15
9
  */
16
- export declare function createValidateNode(filename: string, schema: SchemaValidator, successorPhase?: string): (state: FeatureAgentState) => Promise<Partial<FeatureAgentState>>;
10
+ export declare function createValidateNode(filename: string, schema: SchemaValidator): (state: FeatureAgentState) => Promise<Partial<FeatureAgentState>>;
17
11
  export {};
18
12
  //# sourceMappingURL=validate.node.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"validate.node.d.ts","sourceRoot":"","sources":["../../../../../../../../../packages/core/src/infrastructure/services/agents/feature-agent/nodes/validate.node.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AACrD,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAQhE,KAAK,eAAe,GAAG,CAAC,IAAI,EAAE,OAAO,KAAK,gBAAgB,CAAC;AAE3D;;;;;;;;;;;GAWG;AACH,wBAAgB,kBAAkB,CAChC,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,eAAe,EACvB,cAAc,CAAC,EAAE,MAAM,GACtB,CAAC,KAAK,EAAE,iBAAiB,KAAK,OAAO,CAAC,OAAO,CAAC,iBAAiB,CAAC,CAAC,CAyEnE"}
1
+ {"version":3,"file":"validate.node.d.ts","sourceRoot":"","sources":["../../../../../../../../../packages/core/src/infrastructure/services/agents/feature-agent/nodes/validate.node.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AACrD,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAGhE,KAAK,eAAe,GAAG,CAAC,IAAI,EAAE,OAAO,KAAK,gBAAgB,CAAC;AAE3D;;;;;GAKG;AACH,wBAAgB,kBAAkB,CAChC,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,eAAe,GACtB,CAAC,KAAK,EAAE,iBAAiB,KAAK,OAAO,CAAC,OAAO,CAAC,iBAAiB,CAAC,CAAC,CAuDnE"}
@@ -1,36 +1,14 @@
1
- import { readSpecFile, safeYamlLoad, createNodeLogger, getCompletedPhases, } from './node-helpers.js';
1
+ import { readSpecFile, safeYamlLoad, createNodeLogger } from './node-helpers.js';
2
2
  /**
3
3
  * Factory that creates a validate node for a specific YAML file.
4
4
  *
5
5
  * On success: resets validationRetries to 0, clears errors.
6
6
  * On failure: increments validationRetries, sets errors for repair node.
7
- *
8
- * @param successorPhase - The phase that runs AFTER this validation passes.
9
- * If provided, skip validation when the successor is already completed — this
10
- * proves the validation already passed in a prior run and the pipeline progressed
11
- * beyond it. Checking the successor (not the producer) avoids skipping validation
12
- * when the producer ran but validation itself failed.
13
7
  */
14
- export function createValidateNode(filename, schema, successorPhase) {
8
+ export function createValidateNode(filename, schema) {
15
9
  const log = createNodeLogger(`validate:${filename}`);
16
10
  return async (state) => {
17
11
  log.activate();
18
- // Skip validation when the successor phase is already completed.
19
- // This means: the validation already passed in a prior run AND the next phase
20
- // ran successfully. On resume, LangGraph replays nodes from the last checkpoint.
21
- // The producer node skips (via getCompletedPhases), but if we only checked the
22
- // producer we'd also skip validation when it previously FAILED (since
23
- // markPhaseComplete runs before validation). Checking the successor is safe:
24
- // if the successor completed, this validation must have passed to get there.
25
- if (successorPhase && getCompletedPhases(state.specDir).includes(successorPhase)) {
26
- log.info(`Successor phase '${successorPhase}' already completed, skipping validation`);
27
- return {
28
- lastValidationTarget: filename,
29
- lastValidationErrors: [],
30
- validationRetries: 0,
31
- messages: [`[validate:${filename}] SKIP (successor '${successorPhase}' already completed)`],
32
- };
33
- }
34
12
  log.info(`Validating ${filename}`);
35
13
  const content = readSpecFile(state.specDir, filename);
36
14
  if (!content) {
@@ -0,0 +1,7 @@
1
+ export interface ExecuteQueryResult {
2
+ columns?: string[];
3
+ rows?: Record<string, unknown>[];
4
+ error?: string;
5
+ }
6
+ export declare function executeQuery(sql: string): Promise<ExecuteQueryResult>;
7
+ //# sourceMappingURL=execute-query.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"execute-query.d.ts","sourceRoot":"","sources":["../../../../../../src/presentation/web/app/actions/execute-query.ts"],"names":[],"mappings":"AAIA,MAAM,WAAW,kBAAkB;IACjC,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;IACnB,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,CAAC;IACjC,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAiCD,wBAAsB,YAAY,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,kBAAkB,CAAC,CAgC3E"}
@@ -0,0 +1,55 @@
1
+ 'use server';
2
+ import { getDb } from '../../lib/server-db.js';
3
+ /**
4
+ * Regex pattern to detect write/destructive SQL statements.
5
+ * Strips SQL comments and checks for disallowed keywords.
6
+ */
7
+ const WRITE_KEYWORDS_PATTERN = /^\s*(INSERT|UPDATE|DELETE|DROP|ALTER|CREATE|ATTACH|DETACH|REINDEX|VACUUM)\b/i;
8
+ /**
9
+ * Catches CTEs that lead to write operations: WITH ... INSERT/UPDATE/DELETE
10
+ */
11
+ const CTE_WRITE_PATTERN = /^\s*WITH\b[\s\S]*?\b(INSERT|UPDATE|DELETE)\b/i;
12
+ function stripSqlComments(sql) {
13
+ return sql
14
+ .replace(/--[^\n]*/g, '') // single-line comments
15
+ .replace(/\/\*[\s\S]*?\*\//g, '') // multi-line comments
16
+ .trim();
17
+ }
18
+ function isWriteQuery(sql) {
19
+ const normalized = stripSqlComments(sql);
20
+ return WRITE_KEYWORDS_PATTERN.test(normalized) || CTE_WRITE_PATTERN.test(normalized);
21
+ }
22
+ function formatCellValue(value) {
23
+ if (value instanceof Uint8Array) {
24
+ return `(${value.length} bytes)`;
25
+ }
26
+ return value;
27
+ }
28
+ export async function executeQuery(sql) {
29
+ const trimmed = sql.trim();
30
+ if (!trimmed) {
31
+ return { error: 'Query cannot be empty' };
32
+ }
33
+ if (isWriteQuery(trimmed)) {
34
+ return {
35
+ error: 'Write operations are not allowed. Only SELECT and PRAGMA queries are permitted.',
36
+ };
37
+ }
38
+ try {
39
+ const db = getDb();
40
+ const rows = db.prepare(trimmed).all();
41
+ const columns = rows.length > 0 ? Object.keys(rows[0]) : [];
42
+ const formattedRows = rows.map((row) => {
43
+ const formatted = {};
44
+ for (const [key, value] of Object.entries(row)) {
45
+ formatted[key] = formatCellValue(value);
46
+ }
47
+ return formatted;
48
+ });
49
+ return { columns, rows: formattedRows };
50
+ }
51
+ catch (error) {
52
+ const message = error instanceof Error ? error.message : 'Query execution failed';
53
+ return { error: message };
54
+ }
55
+ }
@@ -0,0 +1,10 @@
1
+ export interface GetTableRowsResult {
2
+ columns?: string[];
3
+ rows?: Record<string, unknown>[];
4
+ totalRows?: number;
5
+ page?: number;
6
+ pageSize?: number;
7
+ error?: string;
8
+ }
9
+ export declare function getTableRows(tableName: string, page?: number): Promise<GetTableRowsResult>;
10
+ //# sourceMappingURL=get-table-rows.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"get-table-rows.d.ts","sourceRoot":"","sources":["../../../../../../src/presentation/web/app/actions/get-table-rows.ts"],"names":[],"mappings":"AAMA,MAAM,WAAW,kBAAkB;IACjC,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;IACnB,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,CAAC;IACjC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AASD,wBAAsB,YAAY,CAAC,SAAS,EAAE,MAAM,EAAE,IAAI,SAAI,GAAG,OAAO,CAAC,kBAAkB,CAAC,CAsD3F"}
@@ -0,0 +1,55 @@
1
+ 'use server';
2
+ import { getDb } from '../../lib/server-db.js';
3
+ const PAGE_SIZE = 50;
4
+ function formatCellValue(value) {
5
+ if (value instanceof Uint8Array) {
6
+ return `(${value.length} bytes)`;
7
+ }
8
+ return value;
9
+ }
10
+ export async function getTableRows(tableName, page = 0) {
11
+ try {
12
+ const db = getDb();
13
+ // Validate table name against sqlite_master (prevents SQL injection)
14
+ const tableExists = db
15
+ .prepare(`SELECT name FROM sqlite_master WHERE type = 'table' AND name = ?`)
16
+ .get(tableName);
17
+ if (!tableExists) {
18
+ return { error: `Table "${tableName}" not found` };
19
+ }
20
+ const countRow = db.prepare(`SELECT COUNT(*) as count FROM "${tableName}"`).get();
21
+ const totalRows = countRow.count;
22
+ const offset = page * PAGE_SIZE;
23
+ const rows = db
24
+ .prepare(`SELECT * FROM "${tableName}" LIMIT ? OFFSET ?`)
25
+ .all(PAGE_SIZE, offset);
26
+ // Get column names from first row or from pragma if empty
27
+ let columns;
28
+ if (rows.length > 0) {
29
+ columns = Object.keys(rows[0]);
30
+ }
31
+ else {
32
+ const pragmaResult = db.prepare(`PRAGMA table_info("${tableName}")`).all();
33
+ columns = pragmaResult.map((c) => c.name);
34
+ }
35
+ // Format BLOB values
36
+ const formattedRows = rows.map((row) => {
37
+ const formatted = {};
38
+ for (const [key, value] of Object.entries(row)) {
39
+ formatted[key] = formatCellValue(value);
40
+ }
41
+ return formatted;
42
+ });
43
+ return {
44
+ columns,
45
+ rows: formattedRows,
46
+ totalRows,
47
+ page,
48
+ pageSize: PAGE_SIZE,
49
+ };
50
+ }
51
+ catch (error) {
52
+ const message = error instanceof Error ? error.message : 'Failed to fetch table rows';
53
+ return { error: message };
54
+ }
55
+ }
@@ -0,0 +1,13 @@
1
+ export interface ColumnInfo {
2
+ name: string;
3
+ type: string;
4
+ notnull: boolean;
5
+ defaultValue: string | null;
6
+ primaryKey: boolean;
7
+ }
8
+ export interface GetTableSchemaResult {
9
+ columns?: ColumnInfo[];
10
+ error?: string;
11
+ }
12
+ export declare function getTableSchema(tableName: string): Promise<GetTableSchemaResult>;
13
+ //# sourceMappingURL=get-table-schema.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"get-table-schema.d.ts","sourceRoot":"","sources":["../../../../../../src/presentation/web/app/actions/get-table-schema.ts"],"names":[],"mappings":"AAIA,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,OAAO,CAAC;IACjB,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,UAAU,EAAE,OAAO,CAAC;CACrB;AAED,MAAM,WAAW,oBAAoB;IACnC,OAAO,CAAC,EAAE,UAAU,EAAE,CAAC;IACvB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,wBAAsB,cAAc,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,oBAAoB,CAAC,CAmCrF"}
@@ -0,0 +1,27 @@
1
+ 'use server';
2
+ import { getDb } from '../../lib/server-db.js';
3
+ export async function getTableSchema(tableName) {
4
+ try {
5
+ const db = getDb();
6
+ // Validate table name against sqlite_master
7
+ const tableExists = db
8
+ .prepare(`SELECT name FROM sqlite_master WHERE type = 'table' AND name = ?`)
9
+ .get(tableName);
10
+ if (!tableExists) {
11
+ return { error: `Table "${tableName}" not found` };
12
+ }
13
+ const pragmaResult = db.prepare(`PRAGMA table_info("${tableName}")`).all();
14
+ const columns = pragmaResult.map((col) => ({
15
+ name: col.name,
16
+ type: col.type || 'TEXT',
17
+ notnull: col.notnull === 1,
18
+ defaultValue: col.dflt_value,
19
+ primaryKey: col.pk > 0,
20
+ }));
21
+ return { columns };
22
+ }
23
+ catch (error) {
24
+ const message = error instanceof Error ? error.message : 'Failed to fetch table schema';
25
+ return { error: message };
26
+ }
27
+ }
@@ -0,0 +1,10 @@
1
+ export interface TableInfo {
2
+ name: string;
3
+ rowCount: number;
4
+ }
5
+ export interface ListTablesResult {
6
+ tables?: TableInfo[];
7
+ error?: string;
8
+ }
9
+ export declare function listTables(): Promise<ListTablesResult>;
10
+ //# sourceMappingURL=list-tables.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"list-tables.d.ts","sourceRoot":"","sources":["../../../../../../src/presentation/web/app/actions/list-tables.ts"],"names":[],"mappings":"AAIA,MAAM,WAAW,SAAS;IACxB,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,gBAAgB;IAC/B,MAAM,CAAC,EAAE,SAAS,EAAE,CAAC;IACrB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,wBAAsB,UAAU,IAAI,OAAO,CAAC,gBAAgB,CAAC,CAsB5D"}
@@ -0,0 +1,19 @@
1
+ 'use server';
2
+ import { getDb } from '../../lib/server-db.js';
3
+ export async function listTables() {
4
+ try {
5
+ const db = getDb();
6
+ const tables = db
7
+ .prepare(`SELECT name FROM sqlite_master WHERE type = 'table' AND name NOT LIKE 'sqlite_%' ORDER BY name`)
8
+ .all();
9
+ const result = tables.map((t) => {
10
+ const row = db.prepare(`SELECT COUNT(*) as count FROM "${t.name}"`).get();
11
+ return { name: t.name, rowCount: row.count };
12
+ });
13
+ return { tables: result };
14
+ }
15
+ catch (error) {
16
+ const message = error instanceof Error ? error.message : 'Failed to list tables';
17
+ return { error: message };
18
+ }
19
+ }
@@ -0,0 +1,4 @@
1
+ /** Skip static pre-rendering since we need runtime database connection. */
2
+ export declare const dynamic = "force-dynamic";
3
+ export default function DatabasePage(): Promise<import("react/jsx-runtime").JSX.Element>;
4
+ //# sourceMappingURL=page.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"page.d.ts","sourceRoot":"","sources":["../../../../../../src/presentation/web/app/database/page.tsx"],"names":[],"mappings":"AAMA,2EAA2E;AAC3E,eAAO,MAAM,OAAO,kBAAkB,CAAC;AAEvC,wBAA8B,YAAY,qDAsBzC"}
@@ -0,0 +1,15 @@
1
+ import { jsxs as _jsxs, jsx as _jsx } from "react/jsx-runtime";
2
+ import { listTables } from '../actions/list-tables.js';
3
+ import { getTableRows } from '../actions/get-table-rows.js';
4
+ import { getTableSchema } from '../actions/get-table-schema.js';
5
+ import { executeQuery } from '../actions/execute-query.js';
6
+ import { DatabasePageClient } from '../../components/features/database/database-page-client.js';
7
+ /** Skip static pre-rendering since we need runtime database connection. */
8
+ export const dynamic = 'force-dynamic';
9
+ export default async function DatabasePage() {
10
+ const { tables, error } = await listTables();
11
+ if (error || !tables) {
12
+ return (_jsx("div", { className: "flex h-full flex-col p-6", children: _jsxs("p", { className: "text-destructive text-sm", children: ["Failed to load database: ", error] }) }));
13
+ }
14
+ return (_jsx("div", { className: "flex h-full flex-col overflow-hidden px-6 pb-6", children: _jsx(DatabasePageClient, { initialTables: tables, fetchRows: getTableRows, fetchSchema: getTableSchema, runQuery: executeQuery, className: "min-h-0 flex-1" }) }));
15
+ }
@@ -1 +1 @@
1
- {"version":3,"file":"control-center-inner.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/features/control-center/control-center-inner.tsx"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,IAAI,EAAY,MAAM,eAAe,CAAC;AAGpD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,uCAAuC,CAAC;AAuB5E,UAAU,uBAAuB;IAC/B,YAAY,EAAE,cAAc,EAAE,CAAC;IAC/B,YAAY,EAAE,IAAI,EAAE,CAAC;CACtB;AAED,wBAAgB,kBAAkB,CAAC,EAAE,YAAY,EAAE,YAAY,EAAE,EAAE,uBAAuB,2CAyXzF"}
1
+ {"version":3,"file":"control-center-inner.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/features/control-center/control-center-inner.tsx"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,IAAI,EAAY,MAAM,eAAe,CAAC;AAGpD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,uCAAuC,CAAC;AAuB5E,UAAU,uBAAuB;IAC/B,YAAY,EAAE,cAAc,EAAE,CAAC;IAC/B,YAAY,EAAE,IAAI,EAAE,CAAC;CACtB;AAED,wBAAgB,kBAAkB,CAAC,EAAE,YAAY,EAAE,YAAY,EAAE,EAAE,uBAAuB,2CA2UzF"}
@@ -8,7 +8,7 @@ import { useSidebarFeaturesContext, mapNodeStateToSidebarStatus, } from '../../.
8
8
  import { useSelectedFeatureId } from '../../../hooks/use-selected-feature-id.js';
9
9
  import { useSoundAction } from '../../../hooks/use-sound-action.js';
10
10
  import { useDrawerCloseGuard } from '../../../hooks/drawer-close-guard.js';
11
- import { useViewportPersistence, DEFAULT_VIEWPORT } from '../../../hooks/use-viewport-persistence.js';
11
+ import { useViewportPersistence } from '../../../hooks/use-viewport-persistence.js';
12
12
  import { ControlCenterEmptyState } from './control-center-empty-state.js';
13
13
  import { useControlCenterState } from './use-control-center-state.js';
14
14
  const AUTO_FOCUS_OPTIONS = {
@@ -23,7 +23,7 @@ export function ControlCenterInner({ initialNodes, initialEdges }) {
23
23
  const selectedFeatureId = useSelectedFeatureId();
24
24
  const clickSound = useSoundAction('click');
25
25
  const { guardedNavigate } = useDrawerCloseGuard();
26
- const { fitView, setViewport } = useReactFlow();
26
+ const { fitView } = useReactFlow();
27
27
  const drawerTimerRef = useRef(null);
28
28
  const { defaultViewport, onMoveEnd: handleViewportChange, resetViewport, } = useViewportPersistence();
29
29
  const { nodes, edges, onNodesChange, handleConnect, handleAddRepository, handleDeleteFeature, handleRetryFeature, handleStartFeature, handleStopFeature, handleDeleteRepository, createFeatureNode, setCallbacks, } = useControlCenterState(initialNodes, initialEdges);
@@ -119,27 +119,20 @@ export function ControlCenterInner({ initialNodes, initialEdges }) {
119
119
  guardedNavigate(() => router.push('/'));
120
120
  }
121
121
  }, [router, pathname, guardedNavigate]);
122
- // ── Deferred fitView mechanism ──────────────────────────────────────
123
- // Instead of calling fitView from event handlers (which races with the
124
- // showCanvas latch and React render cycles), we set a ref flag and let
125
- // a useEffect consume it once showCanvas is true and nodes are rendered.
126
- const pendingFitViewRef = useRef(false);
127
- const pendingDrawerRepoRef = useRef(null);
128
122
  // Listen for global "add repository" events from the top bar button
129
123
  useEffect(() => {
130
124
  const handler = (e) => {
131
125
  const path = e.detail.path;
132
126
  const { wasEmpty, repoPath } = handleAddRepository(path);
133
- // Always center the viewport on the new repo, ignoring any stored
134
- // pan/zoom position. This guarantees the repo is visible after adding
135
- // — even if the user previously panned far away or deleted everything.
136
- resetViewport();
137
- // Immediately snap the in-memory viewport so the user never sees
138
- // the old far-away position (defaultViewport only applies on mount).
139
- setViewport(DEFAULT_VIEWPORT);
140
- pendingFitViewRef.current = true;
141
127
  if (wasEmpty) {
142
- pendingDrawerRepoRef.current = repoPath;
128
+ // Wait for next render so the repo node exists in the DOM, then auto-focus
129
+ setTimeout(() => {
130
+ fitView(AUTO_FOCUS_OPTIONS);
131
+ // Open the create-feature drawer after the fitView animation completes
132
+ drawerTimerRef.current = setTimeout(() => {
133
+ guardedNavigate(() => router.push(`/create?repo=${encodeURIComponent(repoPath)}`));
134
+ }, AUTO_FOCUS_DRAWER_DELAY_MS);
135
+ }, 0);
143
136
  }
144
137
  };
145
138
  window.addEventListener('shep:add-repository', handler);
@@ -149,7 +142,7 @@ export function ControlCenterInner({ initialNodes, initialEdges }) {
149
142
  clearTimeout(drawerTimerRef.current);
150
143
  }
151
144
  };
152
- }, [handleAddRepository, resetViewport, setViewport]);
145
+ }, [handleAddRepository, fitView, guardedNavigate, router]);
153
146
  // Listen for create events from the create drawer (with real feature ID from server)
154
147
  useEffect(() => {
155
148
  const handler = (e) => {
@@ -215,21 +208,6 @@ export function ControlCenterInner({ initialNodes, initialEdges }) {
215
208
  handleRepositoryClick,
216
209
  handleDeleteRepository,
217
210
  ]);
218
- // Auto-center whenever the canvas transitions from empty to having nodes.
219
- // This covers both initial page load AND re-adding repos after deleting
220
- // everything — the view always centers so the repo is visible, ignoring
221
- // any previously stored pan/zoom position.
222
- const hadNodesRef = useRef(nodes.length > 0);
223
- useEffect(() => {
224
- const hasNodes = nodes.length > 0;
225
- if (hasNodes && !hadNodesRef.current) {
226
- // Went from empty → has nodes — request a deferred fitView
227
- resetViewport();
228
- setViewport(DEFAULT_VIEWPORT);
229
- pendingFitViewRef.current = true;
230
- }
231
- hadNodesRef.current = hasNodes;
232
- }, [nodes.length, resetViewport, setViewport]);
233
211
  const handleMoveEnd = useCallback((_event, viewport) => {
234
212
  handleViewportChange(viewport);
235
213
  }, [handleViewportChange]);
@@ -260,26 +238,6 @@ export function ControlCenterInner({ initialNodes, initialEdges }) {
260
238
  clearTimeout(latchTimerRef.current);
261
239
  };
262
240
  }, [hasRepositories, showCanvas]);
263
- // ── Consume the pending fitView flag ──────────────────────────────────
264
- // This effect runs after React renders with showCanvas=true and nodes
265
- // available, guaranteeing ReactFlow has the nodes in the DOM before
266
- // fitView calculates bounds. Using requestAnimationFrame ensures the
267
- // browser has flushed layout so ReactFlow can measure node dimensions.
268
- useEffect(() => {
269
- if (!pendingFitViewRef.current || !showCanvas || nodes.length === 0)
270
- return;
271
- pendingFitViewRef.current = false;
272
- const drawerRepo = pendingDrawerRepoRef.current;
273
- pendingDrawerRepoRef.current = null;
274
- requestAnimationFrame(() => {
275
- fitView(AUTO_FOCUS_OPTIONS);
276
- if (drawerRepo) {
277
- drawerTimerRef.current = setTimeout(() => {
278
- guardedNavigate(() => router.push(`/create?repo=${encodeURIComponent(drawerRepo)}`));
279
- }, AUTO_FOCUS_DRAWER_DELAY_MS);
280
- }
281
- });
282
- }, [showCanvas, nodes.length, fitView, guardedNavigate, router]);
283
241
  // Pulse the "+" button when there's a single repo with no features and the
284
242
  // create-feature drawer is not open — draws attention to the next action.
285
243
  const isCreateDrawerOpen = pathname.startsWith('/create');
@@ -0,0 +1,8 @@
1
+ export interface CellValueDialogProps {
2
+ open: boolean;
3
+ onOpenChange: (open: boolean) => void;
4
+ columnName: string;
5
+ value: string;
6
+ }
7
+ export declare function CellValueDialog({ open, onOpenChange, columnName, value }: CellValueDialogProps): import("react/jsx-runtime").JSX.Element;
8
+ //# sourceMappingURL=cell-value-dialog.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cell-value-dialog.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/features/database/cell-value-dialog.tsx"],"names":[],"mappings":"AAKA,MAAM,WAAW,oBAAoB;IACnC,IAAI,EAAE,OAAO,CAAC;IACd,YAAY,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,IAAI,CAAC;IACtC,UAAU,EAAE,MAAM,CAAC;IACnB,KAAK,EAAE,MAAM,CAAC;CACf;AAED,wBAAgB,eAAe,CAAC,EAAE,IAAI,EAAE,YAAY,EAAE,UAAU,EAAE,KAAK,EAAE,EAAE,oBAAoB,2CAe9F"}
@@ -0,0 +1,7 @@
1
+ 'use client';
2
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
+ import { Dialog, DialogContent, DialogHeader, DialogTitle } from '../../ui/dialog.js';
4
+ import { ScrollArea } from '../../ui/scroll-area.js';
5
+ export function CellValueDialog({ open, onOpenChange, columnName, value }) {
6
+ return (_jsx(Dialog, { open: open, onOpenChange: onOpenChange, children: _jsxs(DialogContent, { className: "max-w-2xl", children: [_jsx(DialogHeader, { children: _jsx(DialogTitle, { children: columnName }) }), _jsx(ScrollArea, { className: "max-h-[60vh]", children: _jsx("pre", { className: "text-sm break-all whitespace-pre-wrap", "data-testid": "cell-value-content", children: value }) })] }) }));
7
+ }
@@ -0,0 +1,10 @@
1
+ import type { Meta, StoryObj } from '@storybook/react';
2
+ import { CellValueDialog } from './cell-value-dialog.js';
3
+ declare const meta: Meta<typeof CellValueDialog>;
4
+ export default meta;
5
+ type Story = StoryObj<typeof meta>;
6
+ export declare const ShortText: Story;
7
+ export declare const LongText: Story;
8
+ export declare const BlobValue: Story;
9
+ export declare const JsonValue: Story;
10
+ //# sourceMappingURL=cell-value-dialog.stories.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cell-value-dialog.stories.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/features/database/cell-value-dialog.stories.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAEvD,OAAO,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AAEtD,QAAA,MAAM,IAAI,EAAE,IAAI,CAAC,OAAO,eAAe,CAYtC,CAAC;AAEF,eAAe,IAAI,CAAC;AACpB,KAAK,KAAK,GAAG,QAAQ,CAAC,OAAO,IAAI,CAAC,CAAC;AAMnC,eAAO,MAAM,SAAS,EAAE,KAIvB,CAAC;AAEF,eAAO,MAAM,QAAQ,EAAE,KAMtB,CAAC;AAEF,eAAO,MAAM,SAAS,EAAE,KAKvB,CAAC;AAEF,eAAO,MAAM,SAAS,EAAE,KAevB,CAAC"}
@@ -0,0 +1,48 @@
1
+ import { fn } from '@storybook/test';
2
+ import { CellValueDialog } from './cell-value-dialog.js';
3
+ const meta = {
4
+ title: 'Features/Database/CellValueDialog',
5
+ component: CellValueDialog,
6
+ tags: ['autodocs'],
7
+ parameters: {
8
+ layout: 'centered',
9
+ },
10
+ args: {
11
+ open: true,
12
+ onOpenChange: fn(),
13
+ columnName: 'description',
14
+ },
15
+ };
16
+ export default meta;
17
+ /* ---------------------------------------------------------------------------
18
+ * Stories
19
+ * ------------------------------------------------------------------------- */
20
+ export const ShortText = {
21
+ args: {
22
+ value: 'A simple short text value.',
23
+ },
24
+ };
25
+ export const LongText = {
26
+ args: {
27
+ columnName: 'content',
28
+ value: 'Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Curabitur pretium tincidunt lacus. Nulla gravida orci a odio. Nullam varius, turpis et commodo pharetra, est eros bibendum elit, nec luctus magna felis sollicitudin mauris.',
29
+ },
30
+ };
31
+ export const BlobValue = {
32
+ args: {
33
+ columnName: 'data',
34
+ value: '(2048 bytes)',
35
+ },
36
+ };
37
+ export const JsonValue = {
38
+ args: {
39
+ columnName: 'metadata',
40
+ value: JSON.stringify({
41
+ id: 'feat-12345',
42
+ name: 'database-management-ui',
43
+ status: 'in_progress',
44
+ config: { maxRetries: 3, timeout: 30000 },
45
+ tags: ['web', 'database', 'ui'],
46
+ }, null, 2),
47
+ },
48
+ };
@@ -0,0 +1,13 @@
1
+ import type { TableInfo } from '../../../app/actions/list-tables.js';
2
+ import type { GetTableSchemaResult } from '../../../app/actions/get-table-schema.js';
3
+ import type { GetTableRowsResult } from '../../../app/actions/get-table-rows.js';
4
+ import type { ExecuteQueryResult } from '../../../app/actions/execute-query.js';
5
+ export interface DatabasePageClientProps {
6
+ initialTables: TableInfo[];
7
+ fetchRows: (tableName: string, page: number) => Promise<GetTableRowsResult>;
8
+ fetchSchema: (tableName: string) => Promise<GetTableSchemaResult>;
9
+ runQuery: (sql: string) => Promise<ExecuteQueryResult>;
10
+ className?: string;
11
+ }
12
+ export declare function DatabasePageClient({ initialTables, fetchRows: fetchRowsAction, fetchSchema: fetchSchemaAction, runQuery, className, }: DatabasePageClientProps): import("react/jsx-runtime").JSX.Element;
13
+ //# sourceMappingURL=database-page-client.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"database-page-client.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/features/database/database-page-client.tsx"],"names":[],"mappings":"AASA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,2BAA2B,CAAC;AAC3D,OAAO,KAAK,EAAc,oBAAoB,EAAE,MAAM,gCAAgC,CAAC;AACvF,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,8BAA8B,CAAC;AACvE,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,6BAA6B,CAAC;AAItE,MAAM,WAAW,uBAAuB;IACtC,aAAa,EAAE,SAAS,EAAE,CAAC;IAC3B,SAAS,EAAE,CAAC,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC,kBAAkB,CAAC,CAAC;IAC5E,WAAW,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,OAAO,CAAC,oBAAoB,CAAC,CAAC;IAClE,QAAQ,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,OAAO,CAAC,kBAAkB,CAAC,CAAC;IACvD,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,wBAAgB,kBAAkB,CAAC,EACjC,aAAa,EACb,SAAS,EAAE,eAAe,EAC1B,WAAW,EAAE,iBAAiB,EAC9B,QAAQ,EACR,SAAS,GACV,EAAE,uBAAuB,2CA6LzB"}