@shepai/cli 1.152.0 → 1.153.0-pr477.9c7fcd0
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/application/ports/output/repositories/interactive-session-repository.interface.d.ts +5 -0
- package/dist/packages/core/src/application/ports/output/repositories/interactive-session-repository.interface.d.ts.map +1 -1
- package/dist/packages/core/src/application/ports/output/services/git-pr-service.interface.d.ts +37 -0
- package/dist/packages/core/src/application/ports/output/services/git-pr-service.interface.d.ts.map +1 -1
- package/dist/packages/core/src/application/ports/output/services/interactive-session-service.interface.d.ts +5 -0
- package/dist/packages/core/src/application/ports/output/services/interactive-session-service.interface.d.ts.map +1 -1
- package/dist/packages/core/src/application/use-cases/repositories/get-repository-commits.use-case.d.ts +18 -0
- package/dist/packages/core/src/application/use-cases/repositories/get-repository-commits.use-case.d.ts.map +1 -0
- package/dist/packages/core/src/application/use-cases/repositories/get-repository-commits.use-case.js +40 -0
- package/dist/packages/core/src/infrastructure/di/container.d.ts.map +1 -1
- package/dist/packages/core/src/infrastructure/di/container.js +5 -0
- package/dist/packages/core/src/infrastructure/repositories/sqlite-interactive-session.repository.d.ts +1 -0
- package/dist/packages/core/src/infrastructure/repositories/sqlite-interactive-session.repository.d.ts.map +1 -1
- package/dist/packages/core/src/infrastructure/repositories/sqlite-interactive-session.repository.js +15 -0
- package/dist/packages/core/src/infrastructure/services/agents/common/executors/claude-code-interactive-executor.service.d.ts.map +1 -1
- package/dist/packages/core/src/infrastructure/services/agents/common/executors/claude-code-interactive-executor.service.js +8 -0
- package/dist/packages/core/src/infrastructure/services/git/git-pr.service.d.ts +3 -1
- package/dist/packages/core/src/infrastructure/services/git/git-pr.service.d.ts.map +1 -1
- package/dist/packages/core/src/infrastructure/services/git/git-pr.service.js +40 -0
- package/dist/packages/core/src/infrastructure/services/interactive/interactive-session.service.d.ts +1 -0
- package/dist/packages/core/src/infrastructure/services/interactive/interactive-session.service.d.ts.map +1 -1
- package/dist/packages/core/src/infrastructure/services/interactive/interactive-session.service.js +51 -5
- package/dist/src/presentation/web/app/actions/get-repository-commits.d.ts +13 -0
- package/dist/src/presentation/web/app/actions/get-repository-commits.d.ts.map +1 -0
- package/dist/src/presentation/web/app/actions/get-repository-commits.js +16 -0
- package/dist/src/presentation/web/app/api/interactive/chat/turn-statuses/route.d.ts +4 -5
- package/dist/src/presentation/web/app/api/interactive/chat/turn-statuses/route.d.ts.map +1 -1
- package/dist/src/presentation/web/app/api/interactive/chat/turn-statuses/route.js +5 -13
- package/dist/src/presentation/web/components/common/commit-history-tree/commit-history-tree.d.ts +14 -0
- package/dist/src/presentation/web/components/common/commit-history-tree/commit-history-tree.d.ts.map +1 -0
- package/dist/src/presentation/web/components/common/commit-history-tree/commit-history-tree.js +120 -0
- package/dist/src/presentation/web/components/common/commit-history-tree/commit-history-tree.stories.d.ts +12 -0
- package/dist/src/presentation/web/components/common/commit-history-tree/commit-history-tree.stories.d.ts.map +1 -0
- package/dist/src/presentation/web/components/common/commit-history-tree/commit-history-tree.stories.js +140 -0
- package/dist/src/presentation/web/components/common/commit-history-tree/use-commit-history.d.ts +16 -0
- package/dist/src/presentation/web/components/common/commit-history-tree/use-commit-history.d.ts.map +1 -0
- package/dist/src/presentation/web/components/common/commit-history-tree/use-commit-history.js +33 -0
- package/dist/src/presentation/web/components/common/control-center-drawer/repository-drawer-client.d.ts +1 -1
- package/dist/src/presentation/web/components/common/control-center-drawer/repository-drawer-client.d.ts.map +1 -1
- package/dist/src/presentation/web/components/common/control-center-drawer/repository-drawer-client.js +11 -1
- package/dist/src/presentation/web/components/common/floating-action-button/floating-action-button.d.ts +8 -2
- package/dist/src/presentation/web/components/common/floating-action-button/floating-action-button.d.ts.map +1 -1
- package/dist/src/presentation/web/components/common/floating-action-button/floating-action-button.js +10 -7
- package/dist/src/presentation/web/components/common/repository-node/repository-node.d.ts.map +1 -1
- package/dist/src/presentation/web/components/common/repository-node/repository-node.js +2 -3
- package/dist/src/presentation/web/components/features/chat/ChatSheet.d.ts.map +1 -1
- package/dist/src/presentation/web/components/features/chat/ChatSheet.js +43 -30
- 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 +66 -3
- package/dist/src/presentation/web/components/features/features-canvas/canvas-toolbar.d.ts +1 -6
- package/dist/src/presentation/web/components/features/features-canvas/canvas-toolbar.d.ts.map +1 -1
- package/dist/src/presentation/web/components/features/features-canvas/canvas-toolbar.js +5 -6
- package/dist/src/presentation/web/components/features/features-canvas/features-canvas.js +1 -1
- package/dist/src/presentation/web/components/layouts/app-shell/app-shell.d.ts.map +1 -1
- package/dist/src/presentation/web/components/layouts/app-shell/app-shell.js +9 -5
- package/dist/src/presentation/web/hooks/turn-statuses-provider.d.ts +4 -8
- package/dist/src/presentation/web/hooks/turn-statuses-provider.d.ts.map +1 -1
- package/dist/src/presentation/web/hooks/turn-statuses-provider.js +4 -4
- package/dist/src/presentation/web/hooks/use-turn-statuses.d.ts +4 -5
- package/dist/src/presentation/web/hooks/use-turn-statuses.d.ts.map +1 -1
- package/dist/src/presentation/web/hooks/use-turn-statuses.js +7 -12
- 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/adopt/page/server-reference-manifest.json +28 -28
- package/web/.next/server/app/(dashboard)/@drawer/adopt/page.js.nft.json +1 -1
- package/web/.next/server/app/(dashboard)/@drawer/adopt/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/(dashboard)/@drawer/chat/page/server-reference-manifest.json +26 -26
- package/web/.next/server/app/(dashboard)/@drawer/chat/page.js.nft.json +1 -1
- package/web/.next/server/app/(dashboard)/@drawer/chat/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/(dashboard)/@drawer/create/page/server-reference-manifest.json +29 -29
- 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 +36 -36
- 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 +36 -36
- 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]/[tab]/page/server-reference-manifest.json +67 -52
- package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/[tab]/page.js +1 -1
- package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/[tab]/page.js.nft.json +1 -1
- package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/[tab]/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page/server-reference-manifest.json +67 -52
- 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)/chat/page/server-reference-manifest.json +26 -26
- package/web/.next/server/app/(dashboard)/chat/page.js.nft.json +1 -1
- package/web/.next/server/app/(dashboard)/chat/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/(dashboard)/create/page/server-reference-manifest.json +29 -29
- 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 +36 -36
- 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 +36 -36
- 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 +26 -26
- 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]/[tab]/page/server-reference-manifest.json +67 -52
- package/web/.next/server/app/(dashboard)/repository/[repositoryId]/[tab]/page.js +1 -1
- package/web/.next/server/app/(dashboard)/repository/[repositoryId]/[tab]/page.js.nft.json +1 -1
- package/web/.next/server/app/(dashboard)/repository/[repositoryId]/[tab]/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/(dashboard)/repository/[repositoryId]/page/server-reference-manifest.json +67 -52
- 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.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 +5 -5
- 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/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/api/interactive/chat/[featureId]/messages/route.js.nft.json +1 -1
- package/web/.next/server/app/api/sessions/route.js.nft.json +1 -1
- package/web/.next/server/app/api/sessions-batch/route.js.nft.json +1 -1
- package/web/.next/server/app/settings/page/server-reference-manifest.json +8 -8
- 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 +10 -10
- 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 +10 -10
- 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 +5 -5
- 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/[root-of-the-server]__a402b567._.js +1 -1
- package/web/.next/server/chunks/[root-of-the-server]__ab4951b1._.js +1 -1
- package/web/.next/server/chunks/[root-of-the-server]__ab4951b1._.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/744ca_web_components_common_control-center-drawer_feature-drawer-client_tsx_e9755fc8._.js +2 -2
- package/web/.next/server/chunks/ssr/744ca_web_components_common_control-center-drawer_feature-drawer-client_tsx_e9755fc8._.js.map +1 -1
- package/web/.next/server/chunks/ssr/7f428_lucide-react_dist_esm_icons_refresh-cw_2796b1f0.js +3 -0
- package/web/.next/server/chunks/ssr/7f428_lucide-react_dist_esm_icons_refresh-cw_2796b1f0.js.map +1 -0
- package/web/.next/server/chunks/ssr/[root-of-the-server]__17ed7ed1._.js +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__17ed7ed1._.js.map +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__28d0d265._.js +2 -2
- package/web/.next/server/chunks/ssr/[root-of-the-server]__357d99f9._.js +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__42bf1807._.js +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__42bf1807._.js.map +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__56b70465._.js +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__56b70465._.js.map +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__88f7e8e6._.js +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__88f7e8e6._.js.map +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__8b0aac03._.js +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__c30f1f82._.js +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__c30f1f82._.js.map +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__ce859680._.js +3 -0
- package/web/.next/server/chunks/ssr/[root-of-the-server]__ce859680._.js.map +1 -0
- package/web/.next/server/chunks/ssr/[root-of-the-server]__f80bfc75._.js +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__f80bfc75._.js.map +1 -1
- package/web/.next/server/chunks/ssr/_05c23ad9._.js +1 -1
- package/web/.next/server/chunks/ssr/_05c23ad9._.js.map +1 -1
- package/web/.next/server/chunks/ssr/_16eb4fec._.js +1 -1
- package/web/.next/server/chunks/ssr/_16eb4fec._.js.map +1 -1
- package/web/.next/server/chunks/ssr/{_5fce01a7._.js → _29ca8860._.js} +2 -2
- package/web/.next/server/chunks/ssr/{_5fce01a7._.js.map → _29ca8860._.js.map} +1 -1
- package/web/.next/server/chunks/ssr/_3a0b989f._.js +2 -2
- package/web/.next/server/chunks/ssr/_3a0b989f._.js.map +1 -1
- package/web/.next/server/chunks/ssr/{_d8bedf13._.js → _48066275._.js} +2 -2
- package/web/.next/server/chunks/ssr/_48066275._.js.map +1 -0
- package/web/.next/server/chunks/ssr/{_d86175ae._.js → _4b41246e._.js} +2 -2
- package/web/.next/server/chunks/ssr/_4b41246e._.js.map +1 -0
- package/web/.next/server/chunks/ssr/_56b9d60f._.js +1 -1
- package/web/.next/server/chunks/ssr/_56b9d60f._.js.map +1 -1
- package/web/.next/server/chunks/ssr/{_8219712a._.js → _5eb64260._.js} +2 -2
- package/web/.next/server/chunks/ssr/_5eb64260._.js.map +1 -0
- package/web/.next/server/chunks/ssr/{_5f69c13f._.js → _6438bf2d._.js} +2 -2
- package/web/.next/server/chunks/ssr/_6438bf2d._.js.map +1 -0
- package/web/.next/server/chunks/ssr/_7c5b97c6._.js +1 -1
- package/web/.next/server/chunks/ssr/_7c5b97c6._.js.map +1 -1
- package/web/.next/server/chunks/ssr/_82c57f10._.js +1 -1
- package/web/.next/server/chunks/ssr/_82c57f10._.js.map +1 -1
- package/web/.next/server/chunks/ssr/{_cb5a021e._.js → _87761ee1._.js} +2 -2
- package/web/.next/server/chunks/ssr/_87761ee1._.js.map +1 -0
- package/web/.next/server/chunks/ssr/_9495d50b._.js +1 -1
- package/web/.next/server/chunks/ssr/_9495d50b._.js.map +1 -1
- package/web/.next/server/chunks/ssr/_a0e3f7e4._.js +1 -1
- package/web/.next/server/chunks/ssr/_a0e3f7e4._.js.map +1 -1
- package/web/.next/server/chunks/ssr/{_cf1c5b73._.js → _a3aa1eb6._.js} +2 -2
- package/web/.next/server/chunks/ssr/_a3aa1eb6._.js.map +1 -0
- package/web/.next/server/chunks/ssr/_ac4a3873._.js +1 -1
- package/web/.next/server/chunks/ssr/_ac4a3873._.js.map +1 -1
- package/web/.next/server/chunks/ssr/_c93c0cc6._.js +3 -0
- package/web/.next/server/chunks/ssr/_c93c0cc6._.js.map +1 -0
- package/web/.next/server/chunks/ssr/_ca0aa7f0._.js +1 -1
- package/web/.next/server/chunks/ssr/_ca0aa7f0._.js.map +1 -1
- package/web/.next/server/chunks/ssr/{_e9a73a63._.js → _e55a0378._.js} +2 -2
- package/web/.next/server/chunks/ssr/_e55a0378._.js.map +1 -0
- package/web/.next/server/chunks/ssr/_fa7efce3._.js +2 -2
- package/web/.next/server/chunks/ssr/_fa7efce3._.js.map +1 -1
- 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/f3a1f_components_common_control-center-drawer_repository-drawer-client_tsx_39a00c03._.js +3 -0
- package/web/.next/server/chunks/ssr/f3a1f_components_common_control-center-drawer_repository-drawer-client_tsx_39a00c03._.js.map +1 -0
- package/web/.next/server/chunks/ssr/src_presentation_web_324a47da._.js +3 -0
- package/web/.next/server/chunks/ssr/src_presentation_web_324a47da._.js.map +1 -0
- package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_skills_page_actions_cdc632e3.js +1 -1
- package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_skills_page_actions_cdc632e3.js.map +1 -1
- package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_tools_page_actions_39ca0924.js +1 -1
- package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_tools_page_actions_39ca0924.js.map +1 -1
- package/web/.next/server/chunks/ssr/src_presentation_web_app_actions_open-ide_ts_baaca5d5._.js +1 -1
- package/web/.next/server/chunks/ssr/src_presentation_web_components_357e3eb0._.js +1 -1
- package/web/.next/server/chunks/ssr/src_presentation_web_components_357e3eb0._.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/pages/500.html +2 -2
- package/web/.next/server/server-reference-manifest.js +1 -1
- package/web/.next/server/server-reference-manifest.json +185 -149
- package/web/.next/static/chunks/0b347558818d2628.js +1 -0
- package/web/.next/static/chunks/{cd54b758f58061d0.js → 1406c2860e7fac9c.js} +1 -1
- package/web/.next/static/chunks/36208713ad011740.js +1 -0
- package/web/.next/static/chunks/3f21588c6956d5b4.css +1 -0
- package/web/.next/static/chunks/471bebfd8d0f0acd.js +1 -0
- package/web/.next/static/chunks/{277a7f64d4ec189d.js → 5a585a2f6bcff4a9.js} +1 -1
- package/web/.next/static/chunks/{1b4429259bbf3064.js → 65ece264fa8f6fe1.js} +2 -2
- package/web/.next/static/chunks/{f9a80d3854a8d453.js → 929ed61442b5e9f7.js} +1 -1
- package/web/.next/static/chunks/{80c4c8b3a5c8e0b6.js → a4ffe2d157f11ad3.js} +1 -1
- package/web/.next/static/chunks/{bdd340ad42a34b41.js → aaf8507271e6f018.js} +1 -1
- package/web/.next/static/chunks/b27aae090cd67337.js +7 -0
- package/web/.next/static/chunks/{ef1c9f43aafff65f.js → b2c3da92e5d7864b.js} +2 -2
- package/web/.next/static/chunks/bb831852c32a9e59.js +1 -0
- package/web/.next/static/chunks/{a2257ffb1349f838.js → d13a4b544b737cbc.js} +1 -1
- package/web/.next/static/chunks/eef9a6b627e39d41.js +1 -0
- package/web/.next/static/chunks/{f33efe6a12242a8a.js → fa08611a63bb5369.js} +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__563f2f7a._.js +0 -3
- package/web/.next/server/chunks/ssr/[root-of-the-server]__563f2f7a._.js.map +0 -1
- package/web/.next/server/chunks/ssr/_5f69c13f._.js.map +0 -1
- package/web/.next/server/chunks/ssr/_8219712a._.js.map +0 -1
- package/web/.next/server/chunks/ssr/_cb5a021e._.js.map +0 -1
- package/web/.next/server/chunks/ssr/_cf1c5b73._.js.map +0 -1
- package/web/.next/server/chunks/ssr/_cfbd1d7e._.js +0 -3
- package/web/.next/server/chunks/ssr/_cfbd1d7e._.js.map +0 -1
- package/web/.next/server/chunks/ssr/_d86175ae._.js.map +0 -1
- package/web/.next/server/chunks/ssr/_d8bedf13._.js.map +0 -1
- package/web/.next/server/chunks/ssr/_e9a73a63._.js.map +0 -1
- package/web/.next/server/chunks/ssr/_f78b4b9d._.js +0 -3
- package/web/.next/server/chunks/ssr/_f78b4b9d._.js.map +0 -1
- package/web/.next/static/chunks/22c459f1877b1e4f.js +0 -1
- package/web/.next/static/chunks/4908997348bd55f8.js +0 -1
- package/web/.next/static/chunks/6bf775818e4ad42e.js +0 -1
- package/web/.next/static/chunks/76858a51f2fbe99a.js +0 -7
- package/web/.next/static/chunks/8ba1c07ef18b15a9.js +0 -1
- package/web/.next/static/chunks/a919a9df4ab12a5c.css +0 -1
- package/web/.next/static/chunks/ee20803fb301d59e.js +0 -1
- /package/web/.next/static/{lPbWG8a1RwBDDcvRngp58 → -_iF1islqFSzVifHA2Zlt}/_buildManifest.js +0 -0
- /package/web/.next/static/{lPbWG8a1RwBDDcvRngp58 → -_iF1islqFSzVifHA2Zlt}/_clientMiddlewareManifest.json +0 -0
- /package/web/.next/static/{lPbWG8a1RwBDDcvRngp58 → -_iF1islqFSzVifHA2Zlt}/_ssgManifest.js +0 -0
|
@@ -19,9 +19,14 @@ function loadPersistedState() {
|
|
|
19
19
|
if (!raw)
|
|
20
20
|
return { pos: null, size: null };
|
|
21
21
|
const parsed = JSON.parse(raw);
|
|
22
|
+
let size = parsed.size ?? null;
|
|
23
|
+
// Clamp persisted size to minimums — prevents invisible panel from bad state
|
|
24
|
+
if (size && (size.w < MIN_W || size.h < MIN_H)) {
|
|
25
|
+
size = { w: Math.max(MIN_W, size.w), h: Math.max(MIN_H, size.h) };
|
|
26
|
+
}
|
|
22
27
|
return {
|
|
23
28
|
pos: parsed.pos ?? null,
|
|
24
|
-
size
|
|
29
|
+
size,
|
|
25
30
|
};
|
|
26
31
|
}
|
|
27
32
|
catch {
|
|
@@ -119,13 +124,24 @@ export function GlobalChatPopup() {
|
|
|
119
124
|
const timer = setTimeout(() => persistState(pos, size), 300);
|
|
120
125
|
return () => clearTimeout(timer);
|
|
121
126
|
}, [pos, size]);
|
|
127
|
+
/** Clamp position so the header (top 48px) stays within viewport. */
|
|
128
|
+
const clampPos = useCallback((x, y, w) => {
|
|
129
|
+
const vw = window.innerWidth;
|
|
130
|
+
const vh = window.innerHeight;
|
|
131
|
+
const HEADER_H = 48;
|
|
132
|
+
return {
|
|
133
|
+
// Keep at least 100px of width visible horizontally
|
|
134
|
+
x: Math.max(-w + 100, Math.min(x, vw - 100)),
|
|
135
|
+
// Keep header on screen: top >= 0, top <= viewport - header height
|
|
136
|
+
y: Math.max(0, Math.min(y, vh - HEADER_H)),
|
|
137
|
+
};
|
|
138
|
+
}, []);
|
|
122
139
|
// ── Drag handling ──────────────────────────────────────────────────────
|
|
123
140
|
const onDragStart = useCallback((e) => {
|
|
124
141
|
e.preventDefault();
|
|
125
142
|
const panel = panelRef.current;
|
|
126
143
|
if (!panel)
|
|
127
144
|
return;
|
|
128
|
-
// If no custom position yet, compute from current DOM position
|
|
129
145
|
const rect = panel.getBoundingClientRect();
|
|
130
146
|
const currentX = pos?.x ?? rect.left;
|
|
131
147
|
const currentY = pos?.y ?? rect.top;
|
|
@@ -135,15 +151,13 @@ export function GlobalChatPopup() {
|
|
|
135
151
|
startPosX: currentX,
|
|
136
152
|
startPosY: currentY,
|
|
137
153
|
};
|
|
154
|
+
const panelW = size?.w ?? rect.width;
|
|
138
155
|
const onMove = (ev) => {
|
|
139
156
|
if (!dragRef.current)
|
|
140
157
|
return;
|
|
141
158
|
const dx = ev.clientX - dragRef.current.startX;
|
|
142
159
|
const dy = ev.clientY - dragRef.current.startY;
|
|
143
|
-
setPos(
|
|
144
|
-
x: dragRef.current.startPosX + dx,
|
|
145
|
-
y: dragRef.current.startPosY + dy,
|
|
146
|
-
});
|
|
160
|
+
setPos(clampPos(dragRef.current.startPosX + dx, dragRef.current.startPosY + dy, panelW));
|
|
147
161
|
};
|
|
148
162
|
const onUp = () => {
|
|
149
163
|
dragRef.current = null;
|
|
@@ -152,7 +166,7 @@ export function GlobalChatPopup() {
|
|
|
152
166
|
};
|
|
153
167
|
document.addEventListener('mousemove', onMove);
|
|
154
168
|
document.addEventListener('mouseup', onUp);
|
|
155
|
-
}, [pos, setPos]);
|
|
169
|
+
}, [pos, size, setPos, clampPos]);
|
|
156
170
|
// ── Resize handling (from top-right corner) ────────────────────────────
|
|
157
171
|
const onResizeStart = useCallback((e) => {
|
|
158
172
|
e.preventDefault();
|
|
@@ -161,29 +175,27 @@ export function GlobalChatPopup() {
|
|
|
161
175
|
if (!panel)
|
|
162
176
|
return;
|
|
163
177
|
const rect = panel.getBoundingClientRect();
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
};
|
|
170
|
-
//
|
|
178
|
+
const startW = size?.w ?? rect.width;
|
|
179
|
+
const startH = size?.h ?? rect.height;
|
|
180
|
+
const startX = e.clientX;
|
|
181
|
+
const startY = e.clientY;
|
|
182
|
+
const startPosY = pos?.y ?? rect.top;
|
|
183
|
+
resizeRef.current = { startX, startY, startW, startH };
|
|
184
|
+
// Capture position if not set yet
|
|
171
185
|
if (!pos) {
|
|
172
186
|
setPos({ x: rect.left, y: rect.top });
|
|
173
187
|
}
|
|
174
188
|
const onMove = (ev) => {
|
|
175
189
|
if (!resizeRef.current)
|
|
176
190
|
return;
|
|
177
|
-
const dx = ev.clientX -
|
|
178
|
-
const dy = ev.clientY -
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
setPos((prev) => (prev ? { ...prev, y: (prev.y ?? 0) + dy } : prev));
|
|
186
|
-
}
|
|
191
|
+
const dx = ev.clientX - startX;
|
|
192
|
+
const dy = ev.clientY - startY;
|
|
193
|
+
const newW = Math.max(MIN_W, startW + dx);
|
|
194
|
+
const newH = Math.max(MIN_H, startH - dy);
|
|
195
|
+
// Top edge moves with height change, clamped to viewport
|
|
196
|
+
const newY = Math.max(0, startPosY + dy);
|
|
197
|
+
setSize({ w: newW, h: newH });
|
|
198
|
+
setPos((prev) => clampPos(prev?.x ?? rect.left, newY, newW));
|
|
187
199
|
};
|
|
188
200
|
const onUp = () => {
|
|
189
201
|
resizeRef.current = null;
|
|
@@ -192,7 +204,7 @@ export function GlobalChatPopup() {
|
|
|
192
204
|
};
|
|
193
205
|
document.addEventListener('mousemove', onMove);
|
|
194
206
|
document.addEventListener('mouseup', onUp);
|
|
195
|
-
}, [size, pos, setPos, setSize]);
|
|
207
|
+
}, [size, pos, setPos, setSize, clampPos]);
|
|
196
208
|
// Reset position/size on close for clean reopen
|
|
197
209
|
const handleClose = useCallback(() => {
|
|
198
210
|
setIsOpen(false);
|
|
@@ -214,8 +226,8 @@ export function GlobalChatPopup() {
|
|
|
214
226
|
height: size?.h ?? `${DEFAULT_H_VH}vh`,
|
|
215
227
|
};
|
|
216
228
|
return (_jsxs(_Fragment, { children: [hasOpened ? (_jsxs("div", { ref: panelRef, className: cn(isMaximized
|
|
217
|
-
? 'bg-background
|
|
218
|
-
: cn(!pos && '
|
|
229
|
+
? 'bg-background fixed inset-0 z-[60] flex flex-col overflow-hidden dark:bg-neutral-900'
|
|
230
|
+
: cn(!pos && 'fixed right-8 bottom-24', 'z-[60] flex flex-col overflow-hidden rounded-lg', 'border-border/60 border dark:border-white/10', 'bg-background dark:bg-neutral-900', 'shadow-[0_8px_40px_-8px_rgba(0,0,0,0.2)] dark:shadow-[0_8px_40px_-8px_rgba(0,0,0,0.6)]'), 'transition-opacity duration-300 ease-out', isOpen ? 'pointer-events-auto opacity-100' : 'pointer-events-none opacity-0'), style: panelStyle, children: [!isMaximized ? (_jsx("div", { className: "h-[2px] shrink-0 bg-gradient-to-r from-transparent via-violet-500/50 to-transparent" })) : null, !isMaximized ? (_jsx("div", { onMouseDown: onResizeStart, className: "absolute top-0 right-0 z-10 h-4 w-4 cursor-ne-resize" })) : null, _jsxs("div", { onMouseDown: isMaximized ? undefined : onDragStart, className: cn('relative flex h-11 shrink-0 items-center gap-2.5 border-b border-black/[0.06] px-3.5 dark:border-white/[0.06]', !isMaximized && 'cursor-grab active:cursor-grabbing'), children: [_jsx("div", { className: "from-foreground/[0.02] to-foreground/[0.02] pointer-events-none absolute inset-0 bg-gradient-to-r via-transparent" }), !isMaximized ? (_jsx(GripVertical, { className: "text-foreground/15 relative h-3.5 w-3.5 shrink-0" })) : null, _jsx("div", { className: "relative flex h-5 w-5 items-center justify-center", children: _jsx(Bot, { className: "text-foreground/50 h-4 w-4" }) }), _jsxs("div", { className: "relative flex items-baseline gap-2", children: [_jsx("span", { className: "text-foreground/90 text-base font-bold tracking-tight", children: "Shep" }), _jsx("span", { className: "text-foreground/30 text-xs font-medium tracking-widest uppercase", children: "global" })] }), _jsxs("div", { className: "relative ml-auto flex items-center gap-0.5", children: [_jsx("button", { type: "button", onClick: toggleMaximize, className: "text-foreground/30 hover:text-foreground/60 rounded-md p-1 transition-colors", title: isMaximized ? 'Restore (⌘⇧M)' : 'Maximize (⌘⇧M)', children: isMaximized ? (_jsx(Minimize2, { className: "h-3.5 w-3.5" })) : (_jsx(Maximize2, { className: "h-3.5 w-3.5" })) }), _jsx("button", { type: "button", onClick: handleClose, className: "text-foreground/30 hover:text-foreground/60 rounded-md p-1 transition-colors", title: "Close (\u2318\u21E7K)", children: _jsx(X, { className: "h-3.5 w-3.5" }) })] })] }), _jsx("div", { className: "flex min-h-0 flex-1 flex-col overflow-hidden", children: _jsx(ChatTab, { featureId: "global" }) }), !isMaximized ? (_jsx("div", { onMouseDown: (e) => {
|
|
219
231
|
e.preventDefault();
|
|
220
232
|
e.stopPropagation();
|
|
221
233
|
const panel = panelRef.current;
|
|
@@ -229,9 +241,10 @@ export function GlobalChatPopup() {
|
|
|
229
241
|
if (!pos)
|
|
230
242
|
setPos({ x: rect.left, y: rect.top });
|
|
231
243
|
const onMove = (ev) => {
|
|
244
|
+
const maxH = window.innerHeight - (pos?.y ?? rect.top);
|
|
232
245
|
setSize({
|
|
233
246
|
w: Math.max(MIN_W, startW + (ev.clientX - startX)),
|
|
234
|
-
h: Math.max(MIN_H, startH + (ev.clientY - startY)),
|
|
247
|
+
h: Math.max(MIN_H, Math.min(startH + (ev.clientY - startY), maxH)),
|
|
235
248
|
});
|
|
236
249
|
};
|
|
237
250
|
const onUp = () => {
|
|
@@ -240,7 +253,7 @@ export function GlobalChatPopup() {
|
|
|
240
253
|
};
|
|
241
254
|
document.addEventListener('mousemove', onMove);
|
|
242
255
|
document.addEventListener('mouseup', onUp);
|
|
243
|
-
}, className: "absolute right-0 bottom-0 z-10 h-4 w-4 cursor-se-resize" })) : null] })) : null, _jsxs("div", { className: cn('group/fab
|
|
256
|
+
}, className: "absolute right-0 bottom-0 z-10 h-4 w-4 cursor-se-resize" })) : null] })) : null, _jsxs("div", { className: cn('group/fab fixed right-8 bottom-6 z-30', isMaximized && 'hidden'), children: [_jsxs(Button, { size: "icon", onClick: toggle, className: cn('relative h-14 w-14 rounded-full shadow-lg', 'transition-all duration-200 hover:scale-105 hover:shadow-xl active:scale-95', isOpen
|
|
244
257
|
? 'bg-violet-600 text-white hover:bg-violet-500'
|
|
245
|
-
: 'bg-violet-500 text-white hover:bg-violet-400 dark:bg-violet-500 dark:hover:bg-violet-400'), children: [_jsx(MessageSquare, { className: cn('absolute h-7 w-7 stroke-[2.5] transition-all duration-200', isOpen ? 'scale-0 rotate-90 opacity-0' : 'scale-100 rotate-0 opacity-100') }), _jsx(X, { className: cn('absolute h-6 w-6 stroke-[2.5] transition-all duration-200', isOpen ? 'scale-100 rotate-0 opacity-100' : 'scale-0 -rotate-90 opacity-0') }), !isOpen && _jsx(ChatDotIndicator, { status: globalChatTurnStatus, className: "top-0 right-0" })] }), _jsx("div", { className: "pointer-events-none
|
|
258
|
+
: 'bg-violet-500 text-white hover:bg-violet-400 dark:bg-violet-500 dark:hover:bg-violet-400'), children: [_jsx(MessageSquare, { className: cn('absolute h-7 w-7 stroke-[2.5] transition-all duration-200', isOpen ? 'scale-0 rotate-90 opacity-0' : 'scale-100 rotate-0 opacity-100') }), _jsx(X, { className: cn('absolute h-6 w-6 stroke-[2.5] transition-all duration-200', isOpen ? 'scale-100 rotate-0 opacity-100' : 'scale-0 -rotate-90 opacity-0') }), !isOpen && _jsx(ChatDotIndicator, { status: globalChatTurnStatus, className: "top-0 right-0" })] }), _jsx("div", { className: "pointer-events-none absolute bottom-[calc(100%+8px)] left-1/2 -translate-x-1/2 translate-y-1 opacity-0 transition-all duration-200 group-hover/fab:translate-y-0 group-hover/fab:opacity-100", children: _jsxs("div", { className: "bg-foreground rounded-lg px-3 py-1.5 text-center shadow-lg", children: [_jsx("p", { className: "text-background text-xs font-medium whitespace-nowrap", children: "Shep Chat" }), _jsxs("p", { className: "text-background/50 mt-0.5 flex items-center justify-center gap-1 text-[10px]", children: [_jsx("kbd", { className: "bg-background/15 rounded px-1 py-px font-mono", children: "\u2318" }), _jsx("kbd", { className: "bg-background/15 rounded px-1 py-px font-mono", children: "\u21E7" }), _jsx("kbd", { className: "bg-background/15 rounded px-1 py-px font-mono", children: "K" })] })] }) })] })] }));
|
|
246
259
|
}
|
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":"
|
|
1
|
+
{"version":3,"file":"control-center-inner.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/features/control-center/control-center-inner.tsx"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,IAAI,EAAY,MAAM,eAAe,CAAC;AAIpD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,uCAAuC,CAAC;AA8B5E,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,2CAwczF"}
|
package/dist/src/presentation/web/components/features/control-center/control-center-inner.js
CHANGED
|
@@ -1,16 +1,20 @@
|
|
|
1
1
|
'use client';
|
|
2
|
-
import { jsx as _jsx } from "react/jsx-runtime";
|
|
2
|
+
import { jsx as _jsx, Fragment as _Fragment, jsxs as _jsxs } from "react/jsx-runtime";
|
|
3
3
|
import { useCallback, useEffect, useMemo, useRef, useState } from 'react';
|
|
4
4
|
import { useRouter, usePathname } from 'next/navigation';
|
|
5
|
+
import { Sparkles, FolderPlus, Github, GitBranch } from 'lucide-react';
|
|
5
6
|
import { useReactFlow } from '@xyflow/react';
|
|
6
7
|
import { FeaturesCanvas } from '../../features/features-canvas/index.js';
|
|
7
8
|
import { CanvasToolbar } from '../../features/features-canvas/canvas-toolbar.js';
|
|
9
|
+
import { FloatingActionButton, } from '../../common/floating-action-button/index.js';
|
|
8
10
|
import { useSidebarFeaturesContext, mapNodeStateToSidebarStatus, } from '../../../hooks/sidebar-features-context.js';
|
|
11
|
+
import { useFeatureFlags } from '../../../hooks/feature-flags-context.js';
|
|
9
12
|
import { useSelectedFeatureId } from '../../../hooks/use-selected-feature-id.js';
|
|
10
13
|
import { useSelectedRepository } from '../../../hooks/use-selected-repository.js';
|
|
11
14
|
import { useSoundAction } from '../../../hooks/use-sound-action.js';
|
|
12
15
|
import { useDrawerCloseGuard } from '../../../hooks/drawer-close-guard.js';
|
|
13
16
|
import { useViewportPersistence } from '../../../hooks/use-viewport-persistence.js';
|
|
17
|
+
import { useSidebar } from '../../ui/sidebar.js';
|
|
14
18
|
import { ControlCenterEmptyState } from './control-center-empty-state.js';
|
|
15
19
|
import { useControlCenterState } from './use-control-center-state.js';
|
|
16
20
|
const AUTO_FOCUS_OPTIONS = {
|
|
@@ -291,6 +295,65 @@ export function ControlCenterInner({ initialNodes, initialEdges }) {
|
|
|
291
295
|
const handlePickFolder = useCallback(() => {
|
|
292
296
|
window.dispatchEvent(new CustomEvent('shep:pick-folder'));
|
|
293
297
|
}, []);
|
|
294
|
-
const
|
|
295
|
-
|
|
298
|
+
const featureFlags = useFeatureFlags();
|
|
299
|
+
// (+) FAB actions — only visible on control center
|
|
300
|
+
const fabActions = useMemo(() => {
|
|
301
|
+
const actions = [
|
|
302
|
+
{
|
|
303
|
+
id: 'new-feature',
|
|
304
|
+
label: 'New Feature',
|
|
305
|
+
icon: _jsx(Sparkles, { className: "h-4 w-4" }),
|
|
306
|
+
onClick: () => {
|
|
307
|
+
clickSound.play();
|
|
308
|
+
guardedNavigate(() => router.push('/create'));
|
|
309
|
+
},
|
|
310
|
+
},
|
|
311
|
+
{
|
|
312
|
+
id: 'add-local-repo',
|
|
313
|
+
label: 'Local Folder',
|
|
314
|
+
icon: _jsx(FolderPlus, { className: "h-4 w-4" }),
|
|
315
|
+
onClick: handlePickFolder,
|
|
316
|
+
},
|
|
317
|
+
];
|
|
318
|
+
if (featureFlags.adoptBranch) {
|
|
319
|
+
actions.push({
|
|
320
|
+
id: 'adopt-branch',
|
|
321
|
+
label: 'Adopt Branch',
|
|
322
|
+
icon: _jsx(GitBranch, { className: "h-4 w-4" }),
|
|
323
|
+
onClick: () => {
|
|
324
|
+
guardedNavigate(() => router.push('/adopt'));
|
|
325
|
+
},
|
|
326
|
+
});
|
|
327
|
+
}
|
|
328
|
+
if (featureFlags.githubImport) {
|
|
329
|
+
actions.push({
|
|
330
|
+
id: 'add-github-repo',
|
|
331
|
+
label: 'From GitHub',
|
|
332
|
+
icon: _jsx(Github, { className: "h-4 w-4" }),
|
|
333
|
+
onClick: () => {
|
|
334
|
+
window.dispatchEvent(new CustomEvent('shep:open-github-import'));
|
|
335
|
+
},
|
|
336
|
+
});
|
|
337
|
+
}
|
|
338
|
+
return actions;
|
|
339
|
+
}, [
|
|
340
|
+
clickSound,
|
|
341
|
+
guardedNavigate,
|
|
342
|
+
router,
|
|
343
|
+
handlePickFolder,
|
|
344
|
+
featureFlags.adoptBranch,
|
|
345
|
+
featureFlags.githubImport,
|
|
346
|
+
]);
|
|
347
|
+
const canvasToolbar = (_jsx(CanvasToolbar, { showArchived: showArchived, onToggleArchived: () => setShowArchived(!showArchived), onResetViewport: resetViewport }));
|
|
348
|
+
return (_jsxs(_Fragment, { children: [_jsx(FeaturesCanvas, { nodes: showCanvas ? displayNodes : [], edges: showCanvas ? edges : [], selectedFeatureId: selectedFeatureId, selectedRepository: selectedRepository, defaultViewport: defaultViewport, onNodesChange: onNodesChange, onConnect: handleConnect, onAddFeature: handleAddFeature, onNodeClick: handleNodeClick, onPaneClick: handleClearDrawers, onMoveEnd: handleMoveEnd, toolbar: canvasToolbar, emptyState: _jsx(ControlCenterEmptyState, { onRepositorySelect: addRepoAndFocus }) }), showCanvas ? _jsx(CreateFab, { actions: fabActions }) : null] }));
|
|
349
|
+
}
|
|
350
|
+
/** (+) FAB that tracks sidebar width via CSS var + transition. */
|
|
351
|
+
function CreateFab({ actions }) {
|
|
352
|
+
const { state } = useSidebar();
|
|
353
|
+
// Sidebar expanded = var(--sidebar-width) = 16rem, collapsed = var(--sidebar-width-icon) = 3rem
|
|
354
|
+
// Position just outside the sidebar edge with 16px gap
|
|
355
|
+
const left = state === 'expanded'
|
|
356
|
+
? 'calc(var(--sidebar-width) + 32px)'
|
|
357
|
+
: 'calc(var(--sidebar-width-icon) + 32px)';
|
|
358
|
+
return (_jsx(FloatingActionButton, { actions: actions, className: "!fixed bottom-6", style: { left, transition: 'left 200ms ease-in-out' } }));
|
|
296
359
|
}
|
|
@@ -2,12 +2,7 @@ import type { Viewport } from '@xyflow/react';
|
|
|
2
2
|
export interface CanvasToolbarProps {
|
|
3
3
|
showArchived: boolean;
|
|
4
4
|
onToggleArchived: () => void;
|
|
5
|
-
onAddFeature: () => void;
|
|
6
|
-
onAddRepository: () => void;
|
|
7
|
-
addingRepo?: boolean;
|
|
8
5
|
onResetViewport?: () => Viewport;
|
|
9
|
-
/** Extra action buttons (adopt branch, github import, etc.) */
|
|
10
|
-
extraActions?: React.ReactNode;
|
|
11
6
|
}
|
|
12
|
-
export declare function CanvasToolbar({ showArchived, onToggleArchived,
|
|
7
|
+
export declare function CanvasToolbar({ showArchived, onToggleArchived, onResetViewport, }: CanvasToolbarProps): import("react/jsx-runtime").JSX.Element;
|
|
13
8
|
//# sourceMappingURL=canvas-toolbar.d.ts.map
|
package/dist/src/presentation/web/components/features/features-canvas/canvas-toolbar.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"canvas-toolbar.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/features/features-canvas/canvas-toolbar.tsx"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;
|
|
1
|
+
{"version":3,"file":"canvas-toolbar.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/features/features-canvas/canvas-toolbar.tsx"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AAI9C,MAAM,WAAW,kBAAkB;IACjC,YAAY,EAAE,OAAO,CAAC;IACtB,gBAAgB,EAAE,MAAM,IAAI,CAAC;IAC7B,eAAe,CAAC,EAAE,MAAM,QAAQ,CAAC;CAClC;AAED,wBAAgB,aAAa,CAAC,EAC5B,YAAY,EACZ,gBAAgB,EAChB,eAAe,GAChB,EAAE,kBAAkB,2CAqDpB"}
|
|
@@ -2,10 +2,9 @@
|
|
|
2
2
|
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
3
3
|
import { useCallback } from 'react';
|
|
4
4
|
import { useReactFlow } from '@xyflow/react';
|
|
5
|
-
import {
|
|
5
|
+
import { Eye, EyeOff, ZoomIn, ZoomOut, Maximize, RotateCcw } from 'lucide-react';
|
|
6
6
|
import { cn } from '../../../lib/utils.js';
|
|
7
|
-
|
|
8
|
-
export function CanvasToolbar({ showArchived, onToggleArchived, onAddFeature, onAddRepository, addingRepo, onResetViewport, extraActions, }) {
|
|
7
|
+
export function CanvasToolbar({ showArchived, onToggleArchived, onResetViewport, }) {
|
|
9
8
|
const { zoomIn, zoomOut, fitView, setViewport } = useReactFlow();
|
|
10
9
|
const handleZoomIn = useCallback(() => {
|
|
11
10
|
zoomIn({ duration: 200 });
|
|
@@ -22,9 +21,9 @@ export function CanvasToolbar({ showArchived, onToggleArchived, onAddFeature, on
|
|
|
22
21
|
setViewport(viewport, { duration: 400 });
|
|
23
22
|
}
|
|
24
23
|
}, [onResetViewport, setViewport]);
|
|
25
|
-
return (_jsxs("div", { className: "bg-background flex items-center gap-1 rounded-xl border px-2 py-1.5 shadow-md dark:bg-neutral-900", children: [_jsx(ToolbarButton, { onClick:
|
|
24
|
+
return (_jsxs("div", { className: "bg-background flex items-center gap-1 rounded-xl border px-2 py-1.5 shadow-md dark:bg-neutral-900", children: [_jsx(ToolbarButton, { onClick: onToggleArchived, title: showArchived ? 'Hide archived' : 'Show archived', active: showArchived, label: showArchived ? 'Hide Archived' : 'Show Archived', children: showArchived ? _jsx(Eye, { className: "h-4 w-4" }) : _jsx(EyeOff, { className: "h-4 w-4" }) }), _jsx("div", { className: "bg-border mx-1 h-5 w-px" }), _jsx(ToolbarButton, { onClick: handleZoomOut, title: "Zoom out", children: _jsx(ZoomOut, { className: "h-4 w-4" }) }), _jsx(ToolbarButton, { onClick: handleZoomIn, title: "Zoom in", children: _jsx(ZoomIn, { className: "h-4 w-4" }) }), _jsx(ToolbarButton, { onClick: handleFitView, title: "Fit view", children: _jsx(Maximize, { className: "h-4 w-4" }) }), onResetViewport ? (_jsx(ToolbarButton, { onClick: handleReset, title: "Reset view", children: _jsx(RotateCcw, { className: "h-4 w-4" }) })) : null] }));
|
|
26
25
|
}
|
|
27
26
|
// ── Internal button ──────────────────────────────────────────────────────
|
|
28
|
-
function ToolbarButton({ children, onClick, title, label, active,
|
|
29
|
-
return (_jsxs("button", { type: "button", onClick: onClick, title: title,
|
|
27
|
+
function ToolbarButton({ children, onClick, title, label, active, }) {
|
|
28
|
+
return (_jsxs("button", { type: "button", onClick: onClick, title: title, className: cn('inline-flex items-center gap-1.5 rounded-lg px-2 py-1.5 text-xs font-medium transition-colors', 'hover:bg-accent hover:text-accent-foreground', active ? 'text-primary bg-primary/10' : 'text-muted-foreground'), children: [children, label ? _jsx("span", { children: label }) : null] }));
|
|
30
29
|
}
|
|
@@ -69,5 +69,5 @@ export function FeaturesCanvas({ nodes, edges, selectedFeatureId, selectedReposi
|
|
|
69
69
|
}, [isEmpty]);
|
|
70
70
|
const fallbackEmptyState = isEmpty && !emptyState ? (_jsx(EmptyState, { title: "No features yet", description: "Get started by creating your first feature.", action: _jsxs(Button, { onClick: onAddFeature, children: [_jsx(Plus, { className: "mr-2 h-4 w-4" }), "New Feature"] }) })) : null;
|
|
71
71
|
const overlayContent = emptyState ?? fallbackEmptyState;
|
|
72
|
-
return (_jsxs("div", { "data-testid": isEmpty ? 'features-canvas-empty' : 'features-canvas', "data-no-drawer-close": true, className: "dark:bg-background pointer-events-auto relative h-full w-full bg-[#f6f7f8]", children: [_jsxs(ReactFlow, { nodes: enrichedNodes, edges: edges, nodeTypes: nodeTypes, edgeTypes: edgeTypes, onConnect: onConnect, onNodesChange: onNodesChange, onNodeClick: onNodeClick, onPaneClick: onPaneClick, onMoveStart: onCanvasDrag, onMoveEnd: onMoveEnd, defaultViewport: defaultViewport ?? FALLBACK_VIEWPORT, nodesDraggable: false, nodesConnectable: false, elementsSelectable: false, proOptions: { hideAttribution: true }, className: "[&_.react-flow__pane]:!cursor-default", children: [_jsx(Background, { variant: BackgroundVariant.Dots, gap: 24, size: 1, color: "#b8bcc4", className: "dark:[&_circle]:!fill-white/[0.1]" }), !isEmpty && toolbar ? (_jsx(Panel, { position: "
|
|
72
|
+
return (_jsxs("div", { "data-testid": isEmpty ? 'features-canvas-empty' : 'features-canvas', "data-no-drawer-close": true, className: "dark:bg-background pointer-events-auto relative h-full w-full bg-[#f6f7f8]", children: [_jsxs(ReactFlow, { nodes: enrichedNodes, edges: edges, nodeTypes: nodeTypes, edgeTypes: edgeTypes, onConnect: onConnect, onNodesChange: onNodesChange, onNodeClick: onNodeClick, onPaneClick: onPaneClick, onMoveStart: onCanvasDrag, onMoveEnd: onMoveEnd, defaultViewport: defaultViewport ?? FALLBACK_VIEWPORT, nodesDraggable: false, nodesConnectable: false, elementsSelectable: false, proOptions: { hideAttribution: true }, className: "[&_.react-flow__pane]:!cursor-default", children: [_jsx(Background, { variant: BackgroundVariant.Dots, gap: 24, size: 1, color: "#b8bcc4", className: "dark:[&_circle]:!fill-white/[0.1]" }), !isEmpty && toolbar ? (_jsx(Panel, { position: "top-right", className: "!mt-3 !mr-3", children: toolbar })) : null] }), showOverlay && overlayContent ? (_jsx("div", { className: cn('pointer-events-none absolute inset-0 z-10 flex items-center justify-center transition-opacity duration-300', overlayExiting ? 'opacity-0' : 'animate-in fade-in opacity-100 duration-200'), children: _jsx("div", { className: "pointer-events-auto h-full w-full", children: overlayContent }) })) : null] }));
|
|
73
73
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"app-shell.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/layouts/app-shell/app-shell.tsx"],"names":[],"mappings":"AAEA,OAAO,
|
|
1
|
+
{"version":3,"file":"app-shell.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/layouts/app-shell/app-shell.tsx"],"names":[],"mappings":"AAEA,OAAO,EAAoC,KAAK,SAAS,EAAE,MAAM,OAAO,CAAC;AAmBzE,UAAU,aAAa;IACrB,QAAQ,EAAE,SAAS,CAAC;IACpB,6CAA6C;IAC7C,WAAW,CAAC,EAAE,OAAO,CAAC;CACvB;AAiHD,wBAAgB,QAAQ,CAAC,EAAE,QAAQ,EAAE,WAAW,EAAE,EAAE,aAAa,2CAYhE"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
'use client';
|
|
2
2
|
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
3
|
-
import { useCallback, useEffect,
|
|
3
|
+
import { useCallback, useEffect, useState } from 'react';
|
|
4
4
|
import { useRouter } from 'next/navigation';
|
|
5
5
|
import { SidebarProvider, SidebarInset } from '../../ui/sidebar.js';
|
|
6
6
|
import { AppSidebar } from '../../layouts/app-sidebar/index.js';
|
|
@@ -57,6 +57,12 @@ function AppShellInner({ children, sidebarOpen }) {
|
|
|
57
57
|
window.addEventListener('shep:pick-folder', handler);
|
|
58
58
|
return () => window.removeEventListener('shep:pick-folder', handler);
|
|
59
59
|
}, [handleAddRepository]);
|
|
60
|
+
// Listen for GitHub import event from (+) FAB
|
|
61
|
+
useEffect(() => {
|
|
62
|
+
const handler = () => setGithubDialogOpen(true);
|
|
63
|
+
window.addEventListener('shep:open-github-import', handler);
|
|
64
|
+
return () => window.removeEventListener('shep:open-github-import', handler);
|
|
65
|
+
}, []);
|
|
60
66
|
const handleReactPickerSelect = useCallback((path) => {
|
|
61
67
|
if (path) {
|
|
62
68
|
window.dispatchEvent(new CustomEvent('shep:add-repository', { detail: { path } }));
|
|
@@ -73,11 +79,9 @@ function AppShellInner({ children, sidebarOpen }) {
|
|
|
73
79
|
setShowReactPicker(false);
|
|
74
80
|
}, onSelect: handleReactPickerSelect })] }));
|
|
75
81
|
}
|
|
76
|
-
/** Wraps children with TurnStatusesProvider
|
|
82
|
+
/** Wraps children with TurnStatusesProvider (polls all active statuses from backend). */
|
|
77
83
|
function TurnStatusesBridge({ children }) {
|
|
78
|
-
|
|
79
|
-
const scopeIds = useMemo(() => ['global', ...features.map((f) => f.featureId)], [features]);
|
|
80
|
-
return _jsx(TurnStatusesProvider, { scopeIds: scopeIds, children: children });
|
|
84
|
+
return _jsx(TurnStatusesProvider, { children: children });
|
|
81
85
|
}
|
|
82
86
|
export function AppShell({ children, sidebarOpen }) {
|
|
83
87
|
return (_jsx(AgentEventsProvider, { children: _jsx(DrawerCloseGuardProvider, { children: _jsx(SidebarFeaturesProvider, { children: _jsx(TurnStatusesBridge, { children: _jsx(AppShellInner, { sidebarOpen: sidebarOpen, children: children }) }) }) }) }));
|
|
@@ -1,19 +1,15 @@
|
|
|
1
1
|
import { type ReactNode } from 'react';
|
|
2
2
|
import { type TurnStatus } from './use-turn-statuses.js';
|
|
3
|
-
interface TurnStatusesProviderProps {
|
|
4
|
-
/** All scope IDs to poll turn statuses for */
|
|
5
|
-
scopeIds: string[];
|
|
6
|
-
children: ReactNode;
|
|
7
|
-
}
|
|
8
3
|
/**
|
|
9
|
-
* Polls turn statuses
|
|
4
|
+
* Polls ALL active turn statuses in a single API call (no IDs needed).
|
|
10
5
|
* Children use `useTurnStatus(scopeId)` to read individual statuses.
|
|
11
6
|
*/
|
|
12
|
-
export declare function TurnStatusesProvider({
|
|
7
|
+
export declare function TurnStatusesProvider({ children }: {
|
|
8
|
+
children: ReactNode;
|
|
9
|
+
}): import("react/jsx-runtime").JSX.Element;
|
|
13
10
|
/**
|
|
14
11
|
* Get the turn status for a specific scope ID.
|
|
15
12
|
* Must be used within a TurnStatusesProvider.
|
|
16
13
|
*/
|
|
17
14
|
export declare function useTurnStatus(scopeId: string): TurnStatus;
|
|
18
|
-
export {};
|
|
19
15
|
//# sourceMappingURL=turn-statuses-provider.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"turn-statuses-provider.d.ts","sourceRoot":"","sources":["../../../../../src/presentation/web/hooks/turn-statuses-provider.tsx"],"names":[],"mappings":"AAEA,OAAO,EAAsC,KAAK,SAAS,EAAE,MAAM,OAAO,CAAC;AAC3E,OAAO,
|
|
1
|
+
{"version":3,"file":"turn-statuses-provider.d.ts","sourceRoot":"","sources":["../../../../../src/presentation/web/hooks/turn-statuses-provider.tsx"],"names":[],"mappings":"AAEA,OAAO,EAAsC,KAAK,SAAS,EAAE,MAAM,OAAO,CAAC;AAC3E,OAAO,EAAsB,KAAK,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAW1E;;;GAGG;AACH,wBAAgB,oBAAoB,CAAC,EAAE,QAAQ,EAAE,EAAE;IAAE,QAAQ,EAAE,SAAS,CAAA;CAAE,2CAWzE;AAED;;;GAGG;AACH,wBAAgB,aAAa,CAAC,OAAO,EAAE,MAAM,GAAG,UAAU,CAGzD"}
|
|
@@ -1,16 +1,16 @@
|
|
|
1
1
|
'use client';
|
|
2
2
|
import { jsx as _jsx } from "react/jsx-runtime";
|
|
3
3
|
import { createContext, useContext, useMemo } from 'react';
|
|
4
|
-
import {
|
|
4
|
+
import { useAllTurnStatuses } from './use-turn-statuses.js';
|
|
5
5
|
const TurnStatusesContext = createContext({
|
|
6
6
|
getStatus: () => 'idle',
|
|
7
7
|
});
|
|
8
8
|
/**
|
|
9
|
-
* Polls turn statuses
|
|
9
|
+
* Polls ALL active turn statuses in a single API call (no IDs needed).
|
|
10
10
|
* Children use `useTurnStatus(scopeId)` to read individual statuses.
|
|
11
11
|
*/
|
|
12
|
-
export function TurnStatusesProvider({
|
|
13
|
-
const statuses =
|
|
12
|
+
export function TurnStatusesProvider({ children }) {
|
|
13
|
+
const statuses = useAllTurnStatuses();
|
|
14
14
|
const value = useMemo(() => ({
|
|
15
15
|
getStatus: (scopeId) => statuses[scopeId] ?? 'idle',
|
|
16
16
|
}), [statuses]);
|
|
@@ -1,11 +1,10 @@
|
|
|
1
1
|
export type TurnStatus = 'idle' | 'processing' | 'unread';
|
|
2
2
|
/**
|
|
3
|
-
* Polls turn statuses
|
|
4
|
-
*
|
|
5
|
-
*
|
|
6
|
-
* Polls every 3 seconds to keep indicators responsive.
|
|
3
|
+
* Polls ALL active turn statuses from the backend.
|
|
4
|
+
* No IDs needed — the backend returns every non-idle session status.
|
|
5
|
+
* Returns a map of scopeId → TurnStatus.
|
|
7
6
|
*/
|
|
8
|
-
export declare function
|
|
7
|
+
export declare function useAllTurnStatuses(): Record<string, TurnStatus>;
|
|
9
8
|
/**
|
|
10
9
|
* Marks a feature's chat as read (clears 'unread' → 'idle').
|
|
11
10
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"use-turn-statuses.d.ts","sourceRoot":"","sources":["../../../../../src/presentation/web/hooks/use-turn-statuses.ts"],"names":[],"mappings":"AAIA,MAAM,MAAM,UAAU,GAAG,MAAM,GAAG,YAAY,GAAG,QAAQ,CAAC;AAE1D
|
|
1
|
+
{"version":3,"file":"use-turn-statuses.d.ts","sourceRoot":"","sources":["../../../../../src/presentation/web/hooks/use-turn-statuses.ts"],"names":[],"mappings":"AAIA,MAAM,MAAM,UAAU,GAAG,MAAM,GAAG,YAAY,GAAG,QAAQ,CAAC;AAE1D;;;;GAIG;AACH,wBAAgB,kBAAkB,IAAI,MAAM,CAAC,MAAM,EAAE,UAAU,CAAC,CAY/D;AAED;;GAEG;AACH,wBAAsB,YAAY,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAEnE"}
|
|
@@ -1,25 +1,20 @@
|
|
|
1
1
|
'use client';
|
|
2
2
|
import { useQuery } from '@tanstack/react-query';
|
|
3
3
|
/**
|
|
4
|
-
* Polls turn statuses
|
|
5
|
-
*
|
|
6
|
-
*
|
|
7
|
-
* Polls every 3 seconds to keep indicators responsive.
|
|
4
|
+
* Polls ALL active turn statuses from the backend.
|
|
5
|
+
* No IDs needed — the backend returns every non-idle session status.
|
|
6
|
+
* Returns a map of scopeId → TurnStatus.
|
|
8
7
|
*/
|
|
9
|
-
export function
|
|
10
|
-
const sortedIds = [...featureIds].sort().join(',');
|
|
8
|
+
export function useAllTurnStatuses() {
|
|
11
9
|
const { data } = useQuery({
|
|
12
|
-
queryKey: ['turn-statuses'
|
|
10
|
+
queryKey: ['turn-statuses'],
|
|
13
11
|
queryFn: async () => {
|
|
14
|
-
|
|
15
|
-
return {};
|
|
16
|
-
const res = await fetch(`/api/interactive/chat/turn-statuses?featureIds=${sortedIds}`);
|
|
12
|
+
const res = await fetch('/api/interactive/chat/turn-statuses');
|
|
17
13
|
if (!res.ok)
|
|
18
14
|
return {};
|
|
19
15
|
return res.json();
|
|
20
16
|
},
|
|
21
|
-
refetchInterval:
|
|
22
|
-
enabled: featureIds.length > 0,
|
|
17
|
+
refetchInterval: 5_000,
|
|
23
18
|
});
|
|
24
19
|
return data ?? {};
|
|
25
20
|
}
|