@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.
- package/dist/packages/core/src/infrastructure/services/agents/feature-agent/feature-agent-graph.d.ts.map +1 -1
- package/dist/packages/core/src/infrastructure/services/agents/feature-agent/feature-agent-graph.js +4 -21
- package/dist/packages/core/src/infrastructure/services/agents/feature-agent/nodes/validate.node.d.ts +1 -7
- package/dist/packages/core/src/infrastructure/services/agents/feature-agent/nodes/validate.node.d.ts.map +1 -1
- package/dist/packages/core/src/infrastructure/services/agents/feature-agent/nodes/validate.node.js +2 -24
- package/dist/src/presentation/web/app/actions/execute-query.d.ts +7 -0
- package/dist/src/presentation/web/app/actions/execute-query.d.ts.map +1 -0
- package/dist/src/presentation/web/app/actions/execute-query.js +55 -0
- package/dist/src/presentation/web/app/actions/get-table-rows.d.ts +10 -0
- package/dist/src/presentation/web/app/actions/get-table-rows.d.ts.map +1 -0
- package/dist/src/presentation/web/app/actions/get-table-rows.js +55 -0
- package/dist/src/presentation/web/app/actions/get-table-schema.d.ts +13 -0
- package/dist/src/presentation/web/app/actions/get-table-schema.d.ts.map +1 -0
- package/dist/src/presentation/web/app/actions/get-table-schema.js +27 -0
- package/dist/src/presentation/web/app/actions/list-tables.d.ts +10 -0
- package/dist/src/presentation/web/app/actions/list-tables.d.ts.map +1 -0
- package/dist/src/presentation/web/app/actions/list-tables.js +19 -0
- package/dist/src/presentation/web/app/database/page.d.ts +4 -0
- package/dist/src/presentation/web/app/database/page.d.ts.map +1 -0
- package/dist/src/presentation/web/app/database/page.js +15 -0
- package/dist/src/presentation/web/components/features/control-center/control-center-inner.d.ts.map +1 -1
- package/dist/src/presentation/web/components/features/control-center/control-center-inner.js +11 -53
- package/dist/src/presentation/web/components/features/database/cell-value-dialog.d.ts +8 -0
- package/dist/src/presentation/web/components/features/database/cell-value-dialog.d.ts.map +1 -0
- package/dist/src/presentation/web/components/features/database/cell-value-dialog.js +7 -0
- package/dist/src/presentation/web/components/features/database/cell-value-dialog.stories.d.ts +10 -0
- package/dist/src/presentation/web/components/features/database/cell-value-dialog.stories.d.ts.map +1 -0
- package/dist/src/presentation/web/components/features/database/cell-value-dialog.stories.js +48 -0
- package/dist/src/presentation/web/components/features/database/database-page-client.d.ts +13 -0
- package/dist/src/presentation/web/components/features/database/database-page-client.d.ts.map +1 -0
- package/dist/src/presentation/web/components/features/database/database-page-client.js +74 -0
- package/dist/src/presentation/web/components/features/database/database-page-client.stories.d.ts +9 -0
- package/dist/src/presentation/web/components/features/database/database-page-client.stories.d.ts.map +1 -0
- package/dist/src/presentation/web/components/features/database/database-page-client.stories.js +78 -0
- package/dist/src/presentation/web/components/features/database/query-runner.d.ts +9 -0
- package/dist/src/presentation/web/components/features/database/query-runner.d.ts.map +1 -0
- package/dist/src/presentation/web/components/features/database/query-runner.js +53 -0
- package/dist/src/presentation/web/components/features/database/query-runner.stories.d.ts +9 -0
- package/dist/src/presentation/web/components/features/database/query-runner.stories.d.ts.map +1 -0
- package/dist/src/presentation/web/components/features/database/query-runner.stories.js +55 -0
- package/dist/src/presentation/web/components/features/database/row-browser.d.ts +11 -0
- package/dist/src/presentation/web/components/features/database/row-browser.d.ts.map +1 -0
- package/dist/src/presentation/web/components/features/database/row-browser.js +42 -0
- package/dist/src/presentation/web/components/features/database/row-browser.stories.d.ts +14 -0
- package/dist/src/presentation/web/components/features/database/row-browser.stories.d.ts.map +1 -0
- package/dist/src/presentation/web/components/features/database/row-browser.stories.js +120 -0
- package/dist/src/presentation/web/components/features/database/schema-viewer.d.ts +7 -0
- package/dist/src/presentation/web/components/features/database/schema-viewer.d.ts.map +1 -0
- package/dist/src/presentation/web/components/features/database/schema-viewer.js +14 -0
- package/dist/src/presentation/web/components/features/database/schema-viewer.stories.d.ts +11 -0
- package/dist/src/presentation/web/components/features/database/schema-viewer.stories.d.ts.map +1 -0
- package/dist/src/presentation/web/components/features/database/schema-viewer.stories.js +67 -0
- package/dist/src/presentation/web/components/features/database/table-list.d.ts +8 -0
- package/dist/src/presentation/web/components/features/database/table-list.d.ts.map +1 -0
- package/dist/src/presentation/web/components/features/database/table-list.js +19 -0
- package/dist/src/presentation/web/components/features/database/table-list.stories.d.ts +10 -0
- package/dist/src/presentation/web/components/features/database/table-list.stories.d.ts.map +1 -0
- package/dist/src/presentation/web/components/features/database/table-list.stories.js +66 -0
- package/dist/src/presentation/web/components/layouts/app-sidebar/app-sidebar.d.ts.map +1 -1
- package/dist/src/presentation/web/components/layouts/app-sidebar/app-sidebar.js +2 -2
- package/dist/src/presentation/web/components/ui/table.d.ts +11 -0
- package/dist/src/presentation/web/components/ui/table.d.ts.map +1 -0
- package/dist/src/presentation/web/components/ui/table.js +28 -0
- package/dist/src/presentation/web/hooks/use-viewport-persistence.d.ts +0 -2
- package/dist/src/presentation/web/hooks/use-viewport-persistence.d.ts.map +1 -1
- package/dist/src/presentation/web/hooks/use-viewport-persistence.js +6 -19
- package/dist/src/presentation/web/lib/layout-with-dagre.d.ts.map +1 -1
- package/dist/src/presentation/web/lib/layout-with-dagre.js +2 -11
- package/dist/src/presentation/web/lib/server-container.d.ts +1 -2
- package/dist/src/presentation/web/lib/server-container.d.ts.map +1 -1
- package/dist/src/presentation/web/lib/server-db.d.ts +16 -0
- package/dist/src/presentation/web/lib/server-db.d.ts.map +1 -0
- package/dist/src/presentation/web/lib/server-db.js +10 -0
- package/dist/src/presentation/web/lib/sql-validation.d.ts +7 -0
- package/dist/src/presentation/web/lib/sql-validation.d.ts.map +1 -0
- package/dist/src/presentation/web/lib/sql-validation.js +17 -0
- package/dist/tsconfig.build.tsbuildinfo +1 -1
- package/package.json +1 -1
- package/web/.next/BUILD_ID +1 -1
- package/web/.next/app-path-routes-manifest.json +1 -0
- package/web/.next/build-manifest.json +6 -6
- package/web/.next/fallback-build-manifest.json +2 -2
- package/web/.next/prerender-manifest.json +3 -3
- package/web/.next/required-server-files.js +1 -1
- package/web/.next/required-server-files.json +1 -1
- package/web/.next/routes-manifest.json +6 -0
- package/web/.next/server/app/(dashboard)/@drawer/create/page/build-manifest.json +4 -4
- package/web/.next/server/app/(dashboard)/@drawer/create/page/server-reference-manifest.json +22 -22
- package/web/.next/server/app/(dashboard)/@drawer/create/page.js +1 -1
- package/web/.next/server/app/(dashboard)/@drawer/create/page.js.nft.json +1 -1
- package/web/.next/server/app/(dashboard)/@drawer/create/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/[tab]/page/build-manifest.json +4 -4
- package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/[tab]/page/server-reference-manifest.json +28 -28
- package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/[tab]/page.js +1 -1
- package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/[tab]/page.js.nft.json +1 -1
- package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/[tab]/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page/build-manifest.json +4 -4
- package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page/server-reference-manifest.json +28 -28
- package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page.js +1 -1
- package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page.js.nft.json +1 -1
- package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page/build-manifest.json +4 -4
- package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page/server-reference-manifest.json +20 -20
- package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page.js +1 -1
- package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page.js.nft.json +1 -1
- package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/(dashboard)/create/page/build-manifest.json +4 -4
- package/web/.next/server/app/(dashboard)/create/page/server-reference-manifest.json +22 -22
- package/web/.next/server/app/(dashboard)/create/page.js +1 -1
- package/web/.next/server/app/(dashboard)/create/page.js.nft.json +1 -1
- package/web/.next/server/app/(dashboard)/create/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/(dashboard)/feature/[featureId]/[tab]/page/build-manifest.json +4 -4
- package/web/.next/server/app/(dashboard)/feature/[featureId]/[tab]/page/server-reference-manifest.json +28 -28
- package/web/.next/server/app/(dashboard)/feature/[featureId]/[tab]/page.js +1 -1
- package/web/.next/server/app/(dashboard)/feature/[featureId]/[tab]/page.js.nft.json +1 -1
- package/web/.next/server/app/(dashboard)/feature/[featureId]/[tab]/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/(dashboard)/feature/[featureId]/page/build-manifest.json +4 -4
- package/web/.next/server/app/(dashboard)/feature/[featureId]/page/server-reference-manifest.json +28 -28
- package/web/.next/server/app/(dashboard)/feature/[featureId]/page.js +1 -1
- package/web/.next/server/app/(dashboard)/feature/[featureId]/page.js.nft.json +1 -1
- package/web/.next/server/app/(dashboard)/feature/[featureId]/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/(dashboard)/page/build-manifest.json +4 -4
- package/web/.next/server/app/(dashboard)/page/server-reference-manifest.json +20 -20
- package/web/.next/server/app/(dashboard)/page.js +1 -1
- package/web/.next/server/app/(dashboard)/page.js.nft.json +1 -1
- package/web/.next/server/app/(dashboard)/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/(dashboard)/repository/[repositoryId]/page/build-manifest.json +4 -4
- package/web/.next/server/app/(dashboard)/repository/[repositoryId]/page/server-reference-manifest.json +20 -20
- package/web/.next/server/app/(dashboard)/repository/[repositoryId]/page.js +1 -1
- package/web/.next/server/app/(dashboard)/repository/[repositoryId]/page.js.nft.json +1 -1
- package/web/.next/server/app/(dashboard)/repository/[repositoryId]/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/_global-error/page/build-manifest.json +4 -4
- package/web/.next/server/app/_global-error.html +2 -2
- package/web/.next/server/app/_global-error.rsc +1 -1
- package/web/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +1 -1
- package/web/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
- package/web/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
- package/web/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
- package/web/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
- package/web/.next/server/app/_not-found/page/build-manifest.json +4 -4
- package/web/.next/server/app/_not-found/page/server-reference-manifest.json +1 -1
- package/web/.next/server/app/_not-found/page.js +1 -1
- package/web/.next/server/app/_not-found/page.js.nft.json +1 -1
- package/web/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/api/attachments/preview/route.js +1 -1
- package/web/.next/server/app/api/attachments/preview/route.js.nft.json +1 -1
- package/web/.next/server/app/api/evidence/route.js +1 -1
- package/web/.next/server/app/api/evidence/route.js.nft.json +1 -1
- package/web/.next/server/app/api/graph-data/route.js.nft.json +1 -1
- package/web/.next/server/app/database/page/app-paths-manifest.json +3 -0
- package/web/.next/server/app/database/page/build-manifest.json +18 -0
- package/web/.next/server/app/database/page/next-font-manifest.json +6 -0
- package/web/.next/server/app/database/page/react-loadable-manifest.json +1 -0
- package/web/.next/server/app/database/page/server-reference-manifest.json +80 -0
- package/web/.next/server/app/database/page.js +16 -0
- package/web/.next/server/app/database/page.js.map +5 -0
- package/web/.next/server/app/database/page.js.nft.json +1 -0
- package/web/.next/server/app/database/page_client-reference-manifest.js +2 -0
- package/web/.next/server/app/settings/page/build-manifest.json +4 -4
- package/web/.next/server/app/settings/page/server-reference-manifest.json +6 -6
- package/web/.next/server/app/settings/page.js +1 -1
- package/web/.next/server/app/settings/page.js.nft.json +1 -1
- package/web/.next/server/app/settings/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/skills/page/build-manifest.json +4 -4
- package/web/.next/server/app/skills/page/server-reference-manifest.json +6 -6
- package/web/.next/server/app/skills/page.js +1 -1
- package/web/.next/server/app/skills/page.js.nft.json +1 -1
- package/web/.next/server/app/skills/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/tools/page/build-manifest.json +4 -4
- package/web/.next/server/app/tools/page/server-reference-manifest.json +6 -6
- package/web/.next/server/app/tools/page.js +1 -1
- package/web/.next/server/app/tools/page.js.nft.json +1 -1
- package/web/.next/server/app/tools/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/version/page/build-manifest.json +4 -4
- package/web/.next/server/app/version/page/server-reference-manifest.json +1 -1
- package/web/.next/server/app/version/page.js +2 -2
- package/web/.next/server/app/version/page.js.nft.json +1 -1
- package/web/.next/server/app/version/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app-paths-manifest.json +1 -0
- package/web/.next/server/chunks/403f9_next_dist_esm_build_templates_app-route_370c43b1.js +1 -1
- package/web/.next/server/chunks/403f9_next_dist_esm_build_templates_app-route_370c43b1.js.map +1 -1
- package/web/.next/server/chunks/[root-of-the-server]__0866d2b5._.js.map +1 -1
- package/web/.next/server/chunks/[root-of-the-server]__42b7ab55._.js.map +1 -1
- package/web/.next/server/chunks/{[root-of-the-server]__53013576._.js → [root-of-the-server]__7d63f9a4._.js} +2 -2
- package/web/.next/server/chunks/[root-of-the-server]__9191749c._.js.map +1 -1
- package/web/.next/server/chunks/[root-of-the-server]__9a136c79._.js.map +1 -1
- package/web/.next/server/chunks/{[root-of-the-server]__92078db6._.js → [root-of-the-server]__a1c7c02a._.js} +2 -2
- package/web/.next/server/chunks/[root-of-the-server]__a402b567._.js +1 -1
- package/web/.next/server/chunks/[root-of-the-server]__a402b567._.js.map +1 -1
- package/web/.next/server/chunks/[root-of-the-server]__a5879003._.js.map +1 -1
- package/web/.next/server/chunks/[root-of-the-server]__b2f9a412._.js.map +1 -1
- package/web/.next/server/chunks/[root-of-the-server]__b4102cc7._.js.map +1 -1
- package/web/.next/server/chunks/[root-of-the-server]__cd67a84c._.js.map +1 -1
- package/web/.next/server/chunks/[root-of-the-server]__d2c18946._.js.map +1 -1
- package/web/.next/server/chunks/[root-of-the-server]__d8037e14._.js.map +1 -1
- package/web/.next/server/chunks/[root-of-the-server]__d9d410a8._.js.map +1 -1
- package/web/.next/server/chunks/[root-of-the-server]__e247a485._.js.map +1 -1
- package/web/.next/server/chunks/ssr/744ca_web_components_common_control-center-drawer_create-drawer-client_tsx_5e26fc0a._.js +1 -1
- package/web/.next/server/chunks/ssr/744ca_web_components_common_control-center-drawer_create-drawer-client_tsx_5e26fc0a._.js.map +1 -1
- package/web/.next/server/chunks/ssr/8ba4b_server_app_(dashboard)_@drawer_repository_[repositoryId]_page_actions_f30d0343.js +1 -1
- package/web/.next/server/chunks/ssr/8ba4b_server_app_(dashboard)_@drawer_repository_[repositoryId]_page_actions_f30d0343.js.map +1 -1
- package/web/.next/server/chunks/ssr/8ba4b_server_app_(dashboard)_repository_[repositoryId]_page_actions_9f1775bb.js +1 -1
- package/web/.next/server/chunks/ssr/8ba4b_server_app_(dashboard)_repository_[repositoryId]_page_actions_9f1775bb.js.map +1 -1
- package/web/.next/server/chunks/ssr/{[root-of-the-server]__06fef644._.js → [root-of-the-server]__07a39ff2._.js} +2 -2
- package/web/.next/server/chunks/ssr/[root-of-the-server]__07a39ff2._.js.map +1 -0
- package/web/.next/server/chunks/ssr/[root-of-the-server]__11033878._.js +4 -0
- package/web/.next/server/chunks/ssr/{[root-of-the-server]__6b17a22d._.js.map → [root-of-the-server]__11033878._.js.map} +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__1a0bbce4._.js +3 -0
- package/web/.next/server/chunks/ssr/[root-of-the-server]__1a0bbce4._.js.map +1 -0
- package/web/.next/server/chunks/ssr/[root-of-the-server]__2698e9f4._.js +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__2698e9f4._.js.map +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__33cee851._.js +3 -0
- package/web/.next/server/chunks/ssr/[root-of-the-server]__33cee851._.js.map +1 -0
- package/web/.next/server/chunks/ssr/[root-of-the-server]__4bb4b155._.js +4 -0
- package/web/.next/server/chunks/ssr/[root-of-the-server]__4bb4b155._.js.map +1 -0
- package/web/.next/server/chunks/ssr/[root-of-the-server]__590dfc34._.js +4 -0
- package/web/.next/server/chunks/ssr/[root-of-the-server]__590dfc34._.js.map +1 -0
- package/web/.next/server/chunks/ssr/[root-of-the-server]__6bb00d90._.js +2 -2
- package/web/.next/server/chunks/ssr/[root-of-the-server]__6bb00d90._.js.map +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__743e777a._.js +4 -0
- package/web/.next/server/chunks/ssr/[root-of-the-server]__743e777a._.js.map +1 -0
- package/web/.next/server/chunks/ssr/[root-of-the-server]__7a939e4e._.js +4 -0
- package/web/.next/server/chunks/ssr/{[root-of-the-server]__a022445f._.js.map → [root-of-the-server]__7a939e4e._.js.map} +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__8e3bf5d7._.js +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__8e3bf5d7._.js.map +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__930c8634._.js +3 -0
- package/web/.next/server/chunks/ssr/[root-of-the-server]__930c8634._.js.map +1 -0
- package/web/.next/server/chunks/ssr/[root-of-the-server]__b724df9e._.js.map +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__c07f9f79._.js +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__c07f9f79._.js.map +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__c605a375._.js +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__c605a375._.js.map +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__fdc75809._.js +4 -0
- package/web/.next/server/chunks/ssr/{[root-of-the-server]__804c006d._.js.map → [root-of-the-server]__fdc75809._.js.map} +1 -1
- package/web/.next/server/chunks/ssr/_05ca281a._.js +3 -0
- package/web/.next/server/chunks/ssr/_05ca281a._.js.map +1 -0
- package/web/.next/server/chunks/ssr/_061c1da2._.js +3 -0
- package/web/.next/server/chunks/ssr/_061c1da2._.js.map +1 -0
- package/web/.next/server/chunks/ssr/_0e6034fc._.js +3 -0
- package/web/.next/server/chunks/ssr/_0e6034fc._.js.map +1 -0
- package/web/.next/server/chunks/ssr/_150e66ba._.js +3 -0
- package/web/.next/server/chunks/ssr/_150e66ba._.js.map +1 -0
- package/web/.next/server/chunks/ssr/_2f6f48b8._.js +1 -1
- package/web/.next/server/chunks/ssr/_2f6f48b8._.js.map +1 -1
- package/web/.next/server/chunks/ssr/_34ba40e0._.js +3 -0
- package/web/.next/server/chunks/ssr/_34ba40e0._.js.map +1 -0
- package/web/.next/server/chunks/ssr/_5b809cd2._.js +4 -0
- package/web/.next/server/chunks/ssr/_5b809cd2._.js.map +1 -0
- package/web/.next/server/chunks/ssr/{_30c9af21._.js → _5d618f84._.js} +2 -2
- package/web/.next/server/chunks/ssr/{_30c9af21._.js.map → _5d618f84._.js.map} +1 -1
- package/web/.next/server/chunks/ssr/_6552e0aa._.js +3 -0
- package/web/.next/server/chunks/ssr/_6552e0aa._.js.map +1 -0
- package/web/.next/server/chunks/ssr/_81f88d15._.js +7 -0
- package/web/.next/server/chunks/ssr/_81f88d15._.js.map +1 -0
- package/web/.next/server/chunks/ssr/_93d2a00c._.js +3 -0
- package/web/.next/server/chunks/ssr/_93d2a00c._.js.map +1 -0
- package/web/.next/server/chunks/ssr/_ad5819d0._.js +3 -0
- package/web/.next/server/chunks/ssr/_ad5819d0._.js.map +1 -0
- package/web/.next/server/chunks/ssr/{_f1a649e3._.js → _d506bca5._.js} +2 -2
- package/web/.next/server/chunks/ssr/{_f1a649e3._.js.map → _d506bca5._.js.map} +1 -1
- package/web/.next/server/chunks/ssr/_e1854141._.js +3 -0
- package/web/.next/server/chunks/ssr/_e1854141._.js.map +1 -0
- package/web/.next/server/chunks/ssr/_f9959908._.js +3 -0
- package/web/.next/server/chunks/ssr/_f9959908._.js.map +1 -0
- package/web/.next/server/chunks/ssr/b1a17_presentation_web_components_features_database_database-page-client_tsx_b853607a._.js +3 -0
- package/web/.next/server/chunks/ssr/b1a17_presentation_web_components_features_database_database-page-client_tsx_b853607a._.js.map +1 -0
- package/web/.next/server/chunks/ssr/b1a17_presentation_web_components_features_settings_settings-page-client_tsx_6ed9d5f8._.js +1 -1
- package/web/.next/server/chunks/ssr/b1a17_presentation_web_components_features_settings_settings-page-client_tsx_6ed9d5f8._.js.map +1 -1
- package/web/.next/server/chunks/ssr/node_modules__pnpm_026172d1._.js +3 -0
- package/web/.next/server/chunks/ssr/node_modules__pnpm_026172d1._.js.map +1 -0
- package/web/.next/server/chunks/ssr/node_modules__pnpm_8b0ea744._.js +3 -0
- package/web/.next/server/chunks/ssr/node_modules__pnpm_8b0ea744._.js.map +1 -0
- package/web/.next/server/chunks/ssr/src_presentation_web_5f039db1._.js +2 -2
- package/web/.next/server/chunks/ssr/src_presentation_web_5f039db1._.js.map +1 -1
- package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_(dashboard)_page_actions_2a52b697.js +1 -1
- package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_(dashboard)_page_actions_2a52b697.js.map +1 -1
- package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_skills_page_actions_1fa8042e.js +1 -1
- package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_skills_page_actions_1fa8042e.js.map +1 -1
- package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_tools_page_actions_24684200.js +1 -1
- package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_tools_page_actions_24684200.js.map +1 -1
- package/web/.next/server/chunks/ssr/src_presentation_web_c4337169._.js +2 -2
- package/web/.next/server/chunks/ssr/src_presentation_web_c4337169._.js.map +1 -1
- package/web/.next/server/chunks/ssr/src_presentation_web_ca99d62d._.js +1 -1
- package/web/.next/server/chunks/ssr/src_presentation_web_ca99d62d._.js.map +1 -1
- package/web/.next/server/chunks/ssr/src_presentation_web_components_bf50c527._.js +1 -1
- package/web/.next/server/chunks/ssr/src_presentation_web_components_de814675._.js +1 -1
- package/web/.next/server/chunks/ssr/src_presentation_web_components_e599bb8c._.js +1 -1
- package/web/.next/server/chunks/ssr/src_presentation_web_components_e599bb8c._.js.map +1 -1
- package/web/.next/server/chunks/ssr/src_presentation_web_components_features_control-center_7ac3562e._.js +1 -1
- package/web/.next/server/chunks/ssr/src_presentation_web_components_features_control-center_7ac3562e._.js.map +1 -1
- package/web/.next/server/chunks/ssr/src_presentation_web_components_ui_scroll-area_tsx_53ae5be7._.js +3 -0
- package/web/.next/server/chunks/ssr/src_presentation_web_components_ui_scroll-area_tsx_53ae5be7._.js.map +1 -0
- package/web/.next/server/middleware-build-manifest.js +4 -4
- package/web/.next/server/pages/500.html +2 -2
- package/web/.next/server/server-reference-manifest.js +1 -1
- package/web/.next/server/server-reference-manifest.json +101 -34
- package/web/.next/static/chunks/0b8f2e223e1b82f4.js +1 -0
- package/web/.next/static/chunks/0e57fc72bf0bc5ba.js +1 -0
- package/web/.next/static/chunks/22a1d0eb174f3da9.js +1 -0
- package/web/.next/static/chunks/401118947e7159e0.js +1 -0
- package/web/.next/static/chunks/40b6bcf1a2de4a0f.js +1 -0
- package/web/.next/static/chunks/471c323a18da4918.js +1 -0
- package/web/.next/static/chunks/495b4bee62b00caa.js +1 -0
- package/web/.next/static/chunks/5aab343372a98721.js +1 -0
- package/web/.next/static/chunks/70e04b1108d151c3.js +11 -0
- package/web/.next/static/chunks/{0cd4694791225f54.js → 899529af3e08bf94.js} +2 -2
- package/web/.next/static/chunks/96fc208419afac9e.js +1 -0
- package/web/.next/static/chunks/b3914c0aae76742b.css +1 -0
- package/web/.next/static/chunks/b4160eaf4deda4e7.js +1 -0
- package/web/.next/static/chunks/b65702b701417ae2.js +1 -0
- package/web/.next/static/chunks/c2c0d4e71c36199f.js +1 -0
- package/web/.next/static/chunks/c7e793951b20a67f.js +1 -0
- package/web/.next/static/chunks/cb440c7f33e135f4.js +1 -0
- package/web/.next/static/chunks/{1b819d33e9d131dc.js → cb46d75dfac954a5.js} +2 -2
- package/web/.next/static/chunks/dd702ceaee4a5c0d.js +1 -0
- package/web/.next/static/chunks/e6b8baa05827f641.js +1 -0
- package/web/.next/static/chunks/{turbopack-426d9bc2450816ba.js → turbopack-b1685b5f87ad1d60.js} +1 -1
- package/web/.next/server/chunks/ssr/7f428_lucide-react_dist_esm_icons_d0119342._.js +0 -3
- package/web/.next/server/chunks/ssr/7f428_lucide-react_dist_esm_icons_d0119342._.js.map +0 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__06fef644._.js.map +0 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__545792ab._.js +0 -3
- package/web/.next/server/chunks/ssr/[root-of-the-server]__545792ab._.js.map +0 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__6b17a22d._.js +0 -4
- package/web/.next/server/chunks/ssr/[root-of-the-server]__804c006d._.js +0 -4
- package/web/.next/server/chunks/ssr/[root-of-the-server]__8c553503._.js +0 -4
- package/web/.next/server/chunks/ssr/[root-of-the-server]__8c553503._.js.map +0 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__9f155c0e._.js +0 -3
- package/web/.next/server/chunks/ssr/[root-of-the-server]__9f155c0e._.js.map +0 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__a022445f._.js +0 -4
- package/web/.next/server/chunks/ssr/[root-of-the-server]__a7de2711._.js +0 -4
- package/web/.next/server/chunks/ssr/[root-of-the-server]__a7de2711._.js.map +0 -1
- package/web/.next/server/chunks/ssr/_0dc2cfd3._.js +0 -3
- package/web/.next/server/chunks/ssr/_0dc2cfd3._.js.map +0 -1
- package/web/.next/server/chunks/ssr/_0e506641._.js +0 -7
- package/web/.next/server/chunks/ssr/_0e506641._.js.map +0 -1
- package/web/.next/server/chunks/ssr/_132dd4b8._.js +0 -3
- package/web/.next/server/chunks/ssr/_132dd4b8._.js.map +0 -1
- package/web/.next/server/chunks/ssr/_135edb9c._.js +0 -3
- package/web/.next/server/chunks/ssr/_135edb9c._.js.map +0 -1
- package/web/.next/server/chunks/ssr/_1bb131c4._.js +0 -3
- package/web/.next/server/chunks/ssr/_1bb131c4._.js.map +0 -1
- package/web/.next/server/chunks/ssr/_32c5c20d._.js +0 -3
- package/web/.next/server/chunks/ssr/_32c5c20d._.js.map +0 -1
- package/web/.next/server/chunks/ssr/_6d26a08f._.js +0 -3
- package/web/.next/server/chunks/ssr/_6d26a08f._.js.map +0 -1
- package/web/.next/server/chunks/ssr/_75f4ccb3._.js +0 -3
- package/web/.next/server/chunks/ssr/_75f4ccb3._.js.map +0 -1
- package/web/.next/server/chunks/ssr/_b5fc318a._.js +0 -3
- package/web/.next/server/chunks/ssr/_b5fc318a._.js.map +0 -1
- package/web/.next/server/chunks/ssr/_cc77a143._.js +0 -3
- package/web/.next/server/chunks/ssr/_cc77a143._.js.map +0 -1
- package/web/.next/server/chunks/ssr/node_modules__pnpm_b59e4b16._.js +0 -3
- package/web/.next/server/chunks/ssr/node_modules__pnpm_b59e4b16._.js.map +0 -1
- package/web/.next/static/chunks/0d2af96e64960ef5.css +0 -1
- package/web/.next/static/chunks/1a71a1628a38996f.js +0 -1
- package/web/.next/static/chunks/303a1217006489b9.js +0 -1
- package/web/.next/static/chunks/4562ee849ea13c3a.js +0 -1
- package/web/.next/static/chunks/56a5153f06d64eca.js +0 -1
- package/web/.next/static/chunks/717af1bcb9dadef9.js +0 -11
- package/web/.next/static/chunks/82f917cc65ec7d42.js +0 -1
- package/web/.next/static/chunks/845d8e58a91014e6.js +0 -1
- package/web/.next/static/chunks/84a181ff3270fd9f.js +0 -1
- package/web/.next/static/chunks/96eeeb28e06de78c.js +0 -1
- package/web/.next/static/chunks/a8704e79171c33bf.js +0 -1
- package/web/.next/static/chunks/ab24252e992d6b8c.js +0 -1
- package/web/.next/static/chunks/c7bd0ef3d9b78f56.js +0 -1
- package/web/.next/static/chunks/d0cdb752198e0ce2.js +0 -1
- package/web/.next/static/chunks/e2ef95d904c360f3.js +0 -1
- package/web/.next/static/chunks/ed3a602003bcb31b.js +0 -1
- /package/web/.next/server/chunks/{[root-of-the-server]__53013576._.js.map → [root-of-the-server]__7d63f9a4._.js.map} +0 -0
- /package/web/.next/server/chunks/{[root-of-the-server]__92078db6._.js.map → [root-of-the-server]__a1c7c02a._.js.map} +0 -0
- /package/web/.next/static/{HLY1lOE_eWQBTqZqPvvsU → 4xrMEp5YYiIKE3f9RD6L-}/_buildManifest.js +0 -0
- /package/web/.next/static/{HLY1lOE_eWQBTqZqPvvsU → 4xrMEp5YYiIKE3f9RD6L-}/_clientMiddlewareManifest.json +0 -0
- /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;
|
|
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"}
|
package/dist/packages/core/src/infrastructure/services/agents/feature-agent/feature-agent-graph.js
CHANGED
|
@@ -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
|
|
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
|
-
|
|
161
|
-
|
|
162
|
-
|
|
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))
|
package/dist/packages/core/src/infrastructure/services/agents/feature-agent/nodes/validate.node.d.ts
CHANGED
|
@@ -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
|
|
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;
|
|
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"}
|
package/dist/packages/core/src/infrastructure/services/agents/feature-agent/nodes/validate.node.js
CHANGED
|
@@ -1,36 +1,14 @@
|
|
|
1
|
-
import { readSpecFile, safeYamlLoad, createNodeLogger
|
|
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
|
|
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 @@
|
|
|
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 @@
|
|
|
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
|
+
}
|
package/dist/src/presentation/web/components/features/control-center/control-center-inner.d.ts.map
CHANGED
|
@@ -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,
|
|
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"}
|
package/dist/src/presentation/web/components/features/control-center/control-center-inner.js
CHANGED
|
@@ -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
|
|
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
|
|
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
|
-
|
|
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,
|
|
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
|
package/dist/src/presentation/web/components/features/database/cell-value-dialog.stories.d.ts.map
ADDED
|
@@ -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"}
|