@shepai/cli 1.92.1 → 1.92.2-pr278.ee19983
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/src/presentation/web/app/actions/check-agent-tool.d.ts +9 -0
- package/dist/src/presentation/web/app/actions/check-agent-tool.d.ts.map +1 -0
- package/dist/src/presentation/web/app/actions/check-agent-tool.js +28 -0
- package/dist/src/presentation/web/components/common/feature-list-item/feature-list-item.stories.d.ts +2 -0
- package/dist/src/presentation/web/components/common/feature-list-item/feature-list-item.stories.d.ts.map +1 -1
- package/dist/src/presentation/web/components/common/feature-list-item/feature-list-item.stories.js +16 -0
- package/dist/src/presentation/web/components/common/feature-status-badges/feature-status-badges.stories.js +6 -6
- package/dist/src/presentation/web/components/common/feature-status-config.d.ts +1 -1
- package/dist/src/presentation/web/components/common/feature-status-config.d.ts.map +1 -1
- package/dist/src/presentation/web/components/common/feature-status-config.js +20 -2
- package/dist/src/presentation/web/components/features/control-center/control-center-empty-state.d.ts.map +1 -1
- package/dist/src/presentation/web/components/features/control-center/control-center-empty-state.js +18 -3
- package/dist/src/presentation/web/components/features/control-center/welcome-agent-setup.d.ts +6 -0
- package/dist/src/presentation/web/components/features/control-center/welcome-agent-setup.d.ts.map +1 -0
- package/dist/src/presentation/web/components/features/control-center/welcome-agent-setup.js +169 -0
- package/dist/src/presentation/web/components/features/control-center/welcome-agent-setup.stories.d.ts +7 -0
- package/dist/src/presentation/web/components/features/control-center/welcome-agent-setup.stories.d.ts.map +1 -0
- package/dist/src/presentation/web/components/features/control-center/welcome-agent-setup.stories.js +20 -0
- package/dist/src/presentation/web/components/layouts/app-shell/app-shell.js +1 -1
- package/dist/src/presentation/web/hooks/sidebar-features-context.d.ts +1 -1
- package/dist/src/presentation/web/hooks/sidebar-features-context.js +4 -4
- package/dist/src/presentation/web/lib/layout-with-dagre.d.ts.map +1 -1
- package/dist/src/presentation/web/lib/layout-with-dagre.js +78 -55
- package/dist/tsconfig.build.tsbuildinfo +1 -1
- package/package.json +1 -1
- package/web/.next/BUILD_ID +1 -1
- package/web/.next/build-manifest.json +2 -2
- package/web/.next/fallback-build-manifest.json +2 -2
- package/web/.next/prerender-manifest.json +3 -3
- package/web/.next/required-server-files.js +3 -3
- package/web/.next/required-server-files.json +3 -3
- package/web/.next/server/app/(dashboard)/@drawer/create/page/server-reference-manifest.json +77 -62
- package/web/.next/server/app/(dashboard)/@drawer/create/page.js +2 -2
- 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/server-reference-manifest.json +87 -42
- package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/[tab]/page.js +2 -2
- 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/server-reference-manifest.json +87 -42
- package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page.js +2 -2
- 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/server-reference-manifest.json +73 -28
- package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page.js +2 -2
- 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/server-reference-manifest.json +77 -62
- package/web/.next/server/app/(dashboard)/create/page.js +2 -2
- 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/server-reference-manifest.json +87 -42
- package/web/.next/server/app/(dashboard)/feature/[featureId]/[tab]/page.js +2 -2
- 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/server-reference-manifest.json +87 -42
- package/web/.next/server/app/(dashboard)/feature/[featureId]/page.js +2 -2
- 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/server-reference-manifest.json +73 -28
- package/web/.next/server/app/(dashboard)/page.js +2 -2
- 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/server-reference-manifest.json +73 -28
- package/web/.next/server/app/(dashboard)/repository/[repositoryId]/page.js +2 -2
- 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.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/server-reference-manifest.json +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.nft.json +1 -1
- package/web/.next/server/app/settings/page/server-reference-manifest.json +5 -5
- 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/server-reference-manifest.json +6 -6
- 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/server-reference-manifest.json +6 -6
- 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/server-reference-manifest.json +1 -1
- 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/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/7f428_lucide-react_dist_esm_icons_2b65878f._.js +3 -0
- package/web/.next/server/chunks/ssr/7f428_lucide-react_dist_esm_icons_2b65878f._.js.map +1 -0
- package/web/.next/server/chunks/ssr/7f428_lucide-react_dist_esm_icons_6ba7eb21._.js +3 -0
- package/web/.next/server/chunks/ssr/7f428_lucide-react_dist_esm_icons_6ba7eb21._.js.map +1 -0
- package/web/.next/server/chunks/ssr/8ba4b_server_app_(dashboard)_@drawer_repository_[repositoryId]_page_actions_002ab1c0.js +3 -0
- package/web/.next/server/chunks/ssr/8ba4b_server_app_(dashboard)_@drawer_repository_[repositoryId]_page_actions_002ab1c0.js.map +1 -0
- package/web/.next/server/chunks/ssr/8ba4b_server_app_(dashboard)_repository_[repositoryId]_page_actions_1bab40be.js +3 -0
- package/web/.next/server/chunks/ssr/8ba4b_server_app_(dashboard)_repository_[repositoryId]_page_actions_1bab40be.js.map +1 -0
- package/web/.next/server/chunks/ssr/[root-of-the-server]__11033878._.js +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__11033878._.js.map +1 -1
- package/web/.next/server/chunks/ssr/{[root-of-the-server]__17143953._.js → [root-of-the-server]__22751bba._.js} +2 -2
- package/web/.next/server/chunks/ssr/{[root-of-the-server]__9de266fa._.js.map → [root-of-the-server]__22751bba._.js.map} +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__24dd0927._.js +4 -0
- package/web/.next/server/chunks/ssr/[root-of-the-server]__24dd0927._.js.map +1 -0
- package/web/.next/server/chunks/ssr/{[root-of-the-server]__45aad79d._.js → [root-of-the-server]__31fc8960._.js} +2 -2
- package/web/.next/server/chunks/ssr/{[root-of-the-server]__5cc4752a._.js.map → [root-of-the-server]__31fc8960._.js.map} +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__357d99f9._.js +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__5d87af2e._.js +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__7b49fcb3._.js +3 -0
- package/web/.next/server/chunks/ssr/[root-of-the-server]__7b49fcb3._.js.map +1 -0
- package/web/.next/server/chunks/ssr/[root-of-the-server]__845a9d2a._.js +3 -0
- package/web/.next/server/chunks/ssr/[root-of-the-server]__845a9d2a._.js.map +1 -0
- package/web/.next/server/chunks/ssr/[root-of-the-server]__89e8a5cc._.js +2 -2
- package/web/.next/server/chunks/ssr/{[root-of-the-server]__5cc4752a._.js → [root-of-the-server]__9497d008._.js} +2 -2
- package/web/.next/server/chunks/ssr/{[root-of-the-server]__45aad79d._.js.map → [root-of-the-server]__9497d008._.js.map} +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__aad040c0._.js +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__aad040c0._.js.map +1 -1
- package/web/.next/server/chunks/ssr/{[root-of-the-server]__9de266fa._.js → [root-of-the-server]__fb487740._.js} +2 -2
- package/web/.next/server/chunks/ssr/{[root-of-the-server]__17143953._.js.map → [root-of-the-server]__fb487740._.js.map} +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__fdc75809._.js +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__fdc75809._.js.map +1 -1
- package/web/.next/server/chunks/ssr/_135edb9c._.js +1 -1
- package/web/.next/server/chunks/ssr/_135edb9c._.js.map +1 -1
- package/web/.next/server/chunks/ssr/_27d8284c._.js +3 -0
- package/web/.next/server/chunks/ssr/_27d8284c._.js.map +1 -0
- package/web/.next/server/chunks/ssr/_5e112f82._.js +3 -0
- package/web/.next/server/chunks/ssr/_5e112f82._.js.map +1 -0
- package/web/.next/server/chunks/ssr/{_f02f4210._.js → _7b21ec40._.js} +2 -2
- package/web/.next/server/chunks/ssr/_7b21ec40._.js.map +1 -0
- package/web/.next/server/chunks/ssr/_8dacd1e7._.js +1 -1
- package/web/.next/server/chunks/ssr/_8dacd1e7._.js.map +1 -1
- package/web/.next/server/chunks/ssr/_cc77a143._.js +1 -1
- package/web/.next/server/chunks/ssr/_cc77a143._.js.map +1 -1
- package/web/.next/server/chunks/ssr/{_3533fed7._.js → _e8b48c1f._.js} +2 -2
- package/web/.next/server/chunks/ssr/_e8b48c1f._.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/src_presentation_web_3a8fc63d._.js +5 -0
- package/web/.next/server/chunks/ssr/src_presentation_web_3a8fc63d._.js.map +1 -0
- package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_(dashboard)_page_actions_1695630c.js +3 -0
- package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_(dashboard)_page_actions_1695630c.js.map +1 -0
- 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_app_(dashboard)_get-graph-data_ts_b018483e._.js +1 -1
- package/web/.next/server/chunks/ssr/src_presentation_web_app_(dashboard)_get-graph-data_ts_b018483e._.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_bf50c527._.js.map +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_de814675._.js.map +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_features_tools_tools-page-client_tsx_3d0aa70c._.js +1 -1
- package/web/.next/server/chunks/ssr/src_presentation_web_components_features_tools_tools-page-client_tsx_3d0aa70c._.js.map +1 -1
- package/web/.next/server/chunks/ssr/src_presentation_web_f16e6874._.js +5 -0
- package/web/.next/server/chunks/ssr/src_presentation_web_f16e6874._.js.map +1 -0
- 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 +411 -242
- package/web/.next/static/chunks/22df66703eb5f3da.js +1 -0
- package/web/.next/static/chunks/{bea7a5f44d99512f.js → 2cae690a6e6d0e72.js} +1 -1
- package/web/.next/static/chunks/{2d02a8deb3cfb404.js → 34d3d111db7690d8.js} +1 -1
- package/web/.next/static/chunks/3f3372acc5e80c45.js +1 -0
- package/web/.next/static/chunks/{5b3dd4146a57ce02.js → 4da377f74674081d.js} +1 -1
- package/web/.next/static/chunks/{2ddedc7a1d0d0a35.js → 5f0035a26f2c4011.js} +1 -1
- package/web/.next/static/chunks/6166463c2782ca01.js +1 -0
- package/web/.next/static/chunks/61c4d617e4b83d4b.css +1 -0
- package/web/.next/static/chunks/8bd300e88a189928.js +1 -0
- package/web/.next/static/chunks/926187ca93fe781a.js +1 -0
- package/web/.next/static/chunks/{e1adbd3c092ccc3c.js → 99c6d0f90a29e17a.js} +2 -2
- package/web/.next/static/chunks/acf2e05520520b66.js +1 -0
- package/web/.next/static/chunks/b272ac93b52dceeb.js +1 -0
- package/web/.next/static/chunks/c198094e39d8c479.js +11 -0
- package/web/.next/static/chunks/c76adccb47c1ccd2.css +1 -0
- package/web/.next/server/chunks/ssr/7f428_lucide-react_dist_esm_icons_81a06555._.js +0 -3
- package/web/.next/server/chunks/ssr/7f428_lucide-react_dist_esm_icons_81a06555._.js.map +0 -1
- package/web/.next/server/chunks/ssr/7f428_lucide-react_dist_esm_icons_rocket_1575cd4d.js +0 -3
- package/web/.next/server/chunks/ssr/7f428_lucide-react_dist_esm_icons_rocket_1575cd4d.js.map +0 -1
- package/web/.next/server/chunks/ssr/8ba4b_server_app_(dashboard)_@drawer_repository_[repositoryId]_page_actions_da7eef33.js +0 -3
- package/web/.next/server/chunks/ssr/8ba4b_server_app_(dashboard)_@drawer_repository_[repositoryId]_page_actions_da7eef33.js.map +0 -1
- package/web/.next/server/chunks/ssr/8ba4b_server_app_(dashboard)_repository_[repositoryId]_page_actions_0a9251aa.js +0 -3
- package/web/.next/server/chunks/ssr/8ba4b_server_app_(dashboard)_repository_[repositoryId]_page_actions_0a9251aa.js.map +0 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__4be9a9bb._.js +0 -4
- package/web/.next/server/chunks/ssr/[root-of-the-server]__4be9a9bb._.js.map +0 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__9dc40036._.js +0 -3
- package/web/.next/server/chunks/ssr/[root-of-the-server]__9dc40036._.js.map +0 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__e630cc47._.js +0 -3
- package/web/.next/server/chunks/ssr/[root-of-the-server]__e630cc47._.js.map +0 -1
- package/web/.next/server/chunks/ssr/_21c75883._.js +0 -3
- package/web/.next/server/chunks/ssr/_21c75883._.js.map +0 -1
- package/web/.next/server/chunks/ssr/_3533fed7._.js.map +0 -1
- package/web/.next/server/chunks/ssr/_a5c23e45._.js +0 -3
- package/web/.next/server/chunks/ssr/_a5c23e45._.js.map +0 -1
- package/web/.next/server/chunks/ssr/_f02f4210._.js.map +0 -1
- package/web/.next/server/chunks/ssr/_f50485a5._.js +0 -3
- package/web/.next/server/chunks/ssr/_f50485a5._.js.map +0 -1
- package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_(dashboard)_page_actions_021a05f2.js +0 -3
- package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_(dashboard)_page_actions_021a05f2.js.map +0 -1
- package/web/.next/server/chunks/ssr/src_presentation_web_c4348b8a._.js +0 -5
- package/web/.next/server/chunks/ssr/src_presentation_web_c4348b8a._.js.map +0 -1
- package/web/.next/server/chunks/ssr/src_presentation_web_e4510d10._.js +0 -5
- package/web/.next/server/chunks/ssr/src_presentation_web_e4510d10._.js.map +0 -1
- package/web/.next/static/chunks/1a2af08680037549.js +0 -1
- package/web/.next/static/chunks/30a344bb33a015e4.js +0 -1
- package/web/.next/static/chunks/4f94860011f9fb20.css +0 -2
- package/web/.next/static/chunks/8a174308ba4bd69d.js +0 -1
- package/web/.next/static/chunks/d7f984a3e8043cb0.js +0 -1
- package/web/.next/static/chunks/d9247a52ae260218.js +0 -1
- package/web/.next/static/chunks/dac26a484f476f36.js +0 -1
- package/web/.next/static/chunks/dd04e12ee5ccb0ad.js +0 -1
- package/web/.next/static/chunks/f54b972c149092b5.js +0 -11
- /package/web/.next/static/{UOxWj8CnreBdyLxAYAGYQ → wmnBSet3smW0EP_P18pPA}/_buildManifest.js +0 -0
- /package/web/.next/static/{UOxWj8CnreBdyLxAYAGYQ → wmnBSet3smW0EP_P18pPA}/_clientMiddlewareManifest.json +0 -0
- /package/web/.next/static/{UOxWj8CnreBdyLxAYAGYQ → wmnBSet3smW0EP_P18pPA}/_ssgManifest.js +0 -0
|
@@ -75,9 +75,15 @@ export function layoutWithDagre(nodes, edges, opts = {}) {
|
|
|
75
75
|
const size = getNodeSize(node, nodeSize);
|
|
76
76
|
centerMap.set(node.id, { cx: dagreNode.x, cy: dagreNode.y, w: size.width, h: size.height });
|
|
77
77
|
}
|
|
78
|
-
//
|
|
79
|
-
//
|
|
80
|
-
//
|
|
78
|
+
// ── Proper tree layout for the secondary axis ──
|
|
79
|
+
// Dagre gives us correct primary-axis (rank/X) positions but its secondary-
|
|
80
|
+
// axis (Y) positioning doesn't respect our tree structure well. Replace it
|
|
81
|
+
// with a bottom-up tree layout:
|
|
82
|
+
// 1. Compute subtree heights (leaves → roots)
|
|
83
|
+
// 2. Position children centered on parent (roots → leaves)
|
|
84
|
+
// This guarantees: no overlaps, parents centered on children, and straight
|
|
85
|
+
// lines for 1-to-1 connections at every depth.
|
|
86
|
+
// Build parent→children map from edges
|
|
81
87
|
const childrenOf = new Map();
|
|
82
88
|
for (const edge of edges) {
|
|
83
89
|
if (!centerMap.has(edge.source) || !centerMap.has(edge.target))
|
|
@@ -86,63 +92,80 @@ export function layoutWithDagre(nodes, edges, opts = {}) {
|
|
|
86
92
|
childrenOf.set(edge.source, []);
|
|
87
93
|
childrenOf.get(edge.source).push(edge.target);
|
|
88
94
|
}
|
|
89
|
-
|
|
90
|
-
if (childIds.length <= 1)
|
|
91
|
-
continue;
|
|
92
|
-
const parent = centerMap.get(parentId);
|
|
93
|
-
const parentCenter = isHorizontal ? parent.cy : parent.cx;
|
|
94
|
-
// Sort children by their current secondary-axis position
|
|
95
|
-
const sorted = childIds
|
|
96
|
-
.filter((id) => centerMap.has(id))
|
|
97
|
-
.sort((a, b) => {
|
|
98
|
-
const pa = centerMap.get(a);
|
|
99
|
-
const pb = centerMap.get(b);
|
|
100
|
-
return isHorizontal ? pa.cy - pb.cy : pa.cx - pb.cx;
|
|
101
|
-
});
|
|
102
|
-
// Compute the current center of the children group
|
|
103
|
-
const first = centerMap.get(sorted[0]);
|
|
104
|
-
const last = centerMap.get(sorted[sorted.length - 1]);
|
|
105
|
-
const groupCenter = isHorizontal ? (first.cy + last.cy) / 2 : (first.cx + last.cx) / 2;
|
|
106
|
-
// Shift all children so the group center aligns with the parent center
|
|
107
|
-
const shift = parentCenter - groupCenter;
|
|
108
|
-
if (Math.abs(shift) > 1) {
|
|
109
|
-
for (const childId of sorted) {
|
|
110
|
-
const c = centerMap.get(childId);
|
|
111
|
-
if (isHorizontal) {
|
|
112
|
-
c.cy += shift;
|
|
113
|
-
}
|
|
114
|
-
else {
|
|
115
|
-
c.cx += shift;
|
|
116
|
-
}
|
|
117
|
-
}
|
|
118
|
-
}
|
|
119
|
-
}
|
|
120
|
-
// Enforce input-order within each sibling group so that the caller's
|
|
121
|
-
// sort (e.g. by createdAt) is respected on the secondary axis.
|
|
95
|
+
// Sort children by input order (preserves caller's ordering, e.g. createdAt)
|
|
122
96
|
const inputIndex = new Map();
|
|
123
97
|
for (let i = 0; i < graphNodes.length; i++) {
|
|
124
98
|
inputIndex.set(graphNodes[i].id, i);
|
|
125
99
|
}
|
|
126
|
-
for (const [,
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
.
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
100
|
+
for (const [, kids] of childrenOf) {
|
|
101
|
+
kids.sort((a, b) => (inputIndex.get(a) ?? 0) - (inputIndex.get(b) ?? 0));
|
|
102
|
+
}
|
|
103
|
+
// Find tree roots (nodes that are parents but not children)
|
|
104
|
+
const childSet = new Set();
|
|
105
|
+
for (const ids of childrenOf.values()) {
|
|
106
|
+
for (const id of ids)
|
|
107
|
+
childSet.add(id);
|
|
108
|
+
}
|
|
109
|
+
// Include leaf nodes that have no children and are not in childrenOf keys
|
|
110
|
+
const allConnected = new Set(centerMap.keys());
|
|
111
|
+
const roots = [...allConnected].filter((id) => !childSet.has(id));
|
|
112
|
+
// Bottom-up: compute the total secondary-axis span each subtree needs
|
|
113
|
+
const subtreeSpan = new Map();
|
|
114
|
+
function computeSpan(nodeId) {
|
|
115
|
+
if (subtreeSpan.has(nodeId))
|
|
116
|
+
return subtreeSpan.get(nodeId);
|
|
117
|
+
const c = centerMap.get(nodeId);
|
|
118
|
+
const nodeSpan = isHorizontal ? c.h : c.w;
|
|
119
|
+
const kids = childrenOf.get(nodeId);
|
|
120
|
+
if (!kids || kids.length === 0) {
|
|
121
|
+
subtreeSpan.set(nodeId, nodeSpan);
|
|
122
|
+
return nodeSpan;
|
|
145
123
|
}
|
|
124
|
+
let childrenTotalSpan = 0;
|
|
125
|
+
for (const kid of kids) {
|
|
126
|
+
childrenTotalSpan += computeSpan(kid);
|
|
127
|
+
}
|
|
128
|
+
childrenTotalSpan += (kids.length - 1) * nodesep;
|
|
129
|
+
const span = Math.max(nodeSpan, childrenTotalSpan);
|
|
130
|
+
subtreeSpan.set(nodeId, span);
|
|
131
|
+
return span;
|
|
132
|
+
}
|
|
133
|
+
for (const root of roots)
|
|
134
|
+
computeSpan(root);
|
|
135
|
+
// Top-down: position each node on the secondary axis, centering parent
|
|
136
|
+
// on its children block. For 1-to-1 edges the child gets the same
|
|
137
|
+
// secondary-axis value as its parent (straight line).
|
|
138
|
+
function positionTree(nodeId, centerPos) {
|
|
139
|
+
const c = centerMap.get(nodeId);
|
|
140
|
+
if (isHorizontal) {
|
|
141
|
+
c.cy = centerPos;
|
|
142
|
+
}
|
|
143
|
+
else {
|
|
144
|
+
c.cx = centerPos;
|
|
145
|
+
}
|
|
146
|
+
const kids = childrenOf.get(nodeId);
|
|
147
|
+
if (!kids || kids.length === 0)
|
|
148
|
+
return;
|
|
149
|
+
// Total span occupied by children
|
|
150
|
+
let childrenTotalSpan = 0;
|
|
151
|
+
for (const kid of kids) {
|
|
152
|
+
childrenTotalSpan += subtreeSpan.get(kid) ?? 0;
|
|
153
|
+
}
|
|
154
|
+
childrenTotalSpan += (kids.length - 1) * nodesep;
|
|
155
|
+
// Start from the top of the centered children block
|
|
156
|
+
let cursor = centerPos - childrenTotalSpan / 2;
|
|
157
|
+
for (const kid of kids) {
|
|
158
|
+
const kidSpan = subtreeSpan.get(kid) ?? 0;
|
|
159
|
+
positionTree(kid, cursor + kidSpan / 2);
|
|
160
|
+
cursor += kidSpan + nodesep;
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
// Position each root tree. Stack root trees vertically with nodesep gap.
|
|
164
|
+
let rootCursor = 0;
|
|
165
|
+
for (const root of roots) {
|
|
166
|
+
const span = subtreeSpan.get(root) ?? 0;
|
|
167
|
+
positionTree(root, rootCursor + span / 2);
|
|
168
|
+
rootCursor += span + nodesep;
|
|
146
169
|
}
|
|
147
170
|
// Build result array converting center-coords to React Flow top-left
|
|
148
171
|
const result = [];
|