@shepai/cli 1.72.9-pr220.ce0911d → 1.72.9-pr220.f17b60a
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/build-feature-node-data.d.ts.map +1 -1
- package/dist/src/presentation/web/app/build-feature-node-data.js +2 -26
- package/dist/src/presentation/web/app/build-graph-nodes.d.ts.map +1 -1
- package/dist/src/presentation/web/app/build-graph-nodes.js +2 -26
- package/dist/src/presentation/web/components/common/control-center-drawer/create-drawer-client.d.ts.map +1 -1
- package/dist/src/presentation/web/components/common/control-center-drawer/create-drawer-client.js +0 -2
- package/dist/src/presentation/web/components/common/control-center-drawer/drawer-view.d.ts +2 -0
- package/dist/src/presentation/web/components/common/control-center-drawer/drawer-view.d.ts.map +1 -1
- package/dist/src/presentation/web/components/common/control-center-drawer/drawer-view.js +11 -11
- package/dist/src/presentation/web/components/common/control-center-drawer/feature-drawer-client.d.ts.map +1 -1
- package/dist/src/presentation/web/components/common/control-center-drawer/feature-drawer-client.js +17 -31
- package/dist/src/presentation/web/components/common/control-center-drawer/index.d.ts +0 -1
- package/dist/src/presentation/web/components/common/control-center-drawer/index.d.ts.map +1 -1
- package/dist/src/presentation/web/components/common/control-center-drawer/index.js +0 -1
- package/dist/src/presentation/web/components/common/feature-node/derive-feature-state.d.ts +25 -0
- package/dist/src/presentation/web/components/common/feature-node/derive-feature-state.d.ts.map +1 -1
- package/dist/src/presentation/web/components/common/feature-node/derive-feature-state.js +45 -2
- package/dist/src/presentation/web/components/common/index.d.ts +1 -1
- package/dist/src/presentation/web/components/common/index.d.ts.map +1 -1
- package/dist/src/presentation/web/components/common/index.js +1 -1
- package/dist/src/presentation/web/components/features/control-center/use-control-center-state.d.ts.map +1 -1
- package/dist/src/presentation/web/components/features/control-center/use-control-center-state.js +20 -30
- package/dist/src/presentation/web/components/features/features-canvas/features-canvas.d.ts.map +1 -1
- package/dist/src/presentation/web/components/features/features-canvas/features-canvas.js +2 -13
- package/dist/src/presentation/web/hooks/use-agent-events.d.ts.map +1 -1
- package/dist/src/presentation/web/hooks/use-agent-events.js +6 -3
- 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/cache/.previewinfo +1 -1
- package/web/.next/cache/.rscinfo +1 -1
- package/web/.next/cache/.tsbuildinfo +1 -1
- package/web/.next/cache/config.json +3 -3
- package/web/.next/fallback-build-manifest.json +2 -2
- package/web/.next/prerender-manifest.json +3 -3
- package/web/.next/server/app/(dashboard)/@drawer/create/page/server-reference-manifest.json +15 -15
- 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]/page/server-reference-manifest.json +18 -18
- 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 +13 -13
- 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 +15 -15
- 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]/page/server-reference-manifest.json +18 -18
- 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 +13 -13
- 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 +13 -13
- 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_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_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/8ba4b_server_app_(dashboard)_@drawer_repository_[repositoryId]_page_actions_816618e2.js +1 -1
- package/web/.next/server/chunks/ssr/8ba4b_server_app_(dashboard)_@drawer_repository_[repositoryId]_page_actions_816618e2.js.map +1 -1
- package/web/.next/server/chunks/ssr/8ba4b_server_app_(dashboard)_repository_[repositoryId]_page_actions_ba2e050f.js +1 -1
- package/web/.next/server/chunks/ssr/8ba4b_server_app_(dashboard)_repository_[repositoryId]_page_actions_ba2e050f.js.map +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__17a611f0._.js +2 -2
- package/web/.next/server/chunks/ssr/[root-of-the-server]__17a611f0._.js.map +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__2018e25f._.js +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__2018e25f._.js.map +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__45dbf93d._.js +2 -2
- package/web/.next/server/chunks/ssr/[root-of-the-server]__45dbf93d._.js.map +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__6258349c._.js +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__6258349c._.js.map +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__6b17a22d._.js +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__6b17a22d._.js.map +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__6cbc1149._.js +2 -2
- package/web/.next/server/chunks/ssr/[root-of-the-server]__804c006d._.js +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__804c006d._.js.map +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__94a6d275._.js +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__94a6d275._.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/_0e9d6bf7._.js +1 -1
- package/web/.next/server/chunks/ssr/_0e9d6bf7._.js.map +1 -1
- package/web/.next/server/chunks/ssr/_250a63ae._.js +1 -1
- package/web/.next/server/chunks/ssr/_250a63ae._.js.map +1 -1
- package/web/.next/server/chunks/ssr/_61351ed3._.js +1 -1
- package/web/.next/server/chunks/ssr/_61351ed3._.js.map +1 -1
- package/web/.next/server/chunks/ssr/_8400c8bb._.js +1 -1
- package/web/.next/server/chunks/ssr/_8400c8bb._.js.map +1 -1
- package/web/.next/server/chunks/ssr/{_1fae710b._.js → _8e87c87b._.js} +2 -2
- package/web/.next/server/chunks/ssr/{_1fae710b._.js.map → _8e87c87b._.js.map} +1 -1
- package/web/.next/server/chunks/ssr/_9f940437._.js +1 -1
- package/web/.next/server/chunks/ssr/_9f940437._.js.map +1 -1
- package/web/.next/server/chunks/ssr/src_presentation_web_2b91e4ec._.js +1 -1
- package/web/.next/server/chunks/ssr/src_presentation_web_2b91e4ec._.js.map +1 -1
- package/web/.next/server/chunks/ssr/src_presentation_web_5bcc1537._.js +1 -1
- package/web/.next/server/chunks/ssr/src_presentation_web_5bcc1537._.js.map +1 -1
- package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_(dashboard)_page_actions_5955c012.js +1 -1
- package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_(dashboard)_page_actions_5955c012.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_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_d5b0cb86._.js +2 -2
- package/web/.next/server/chunks/ssr/src_presentation_web_d5b0cb86._.js.map +1 -1
- package/web/.next/server/chunks/ssr/src_presentation_web_e626b63c._.js +2 -2
- package/web/.next/server/chunks/ssr/src_presentation_web_e626b63c._.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 +21 -21
- package/web/.next/standalone/src/presentation/web/.next/BUILD_ID +1 -1
- package/web/.next/standalone/src/presentation/web/.next/build-manifest.json +2 -2
- package/web/.next/standalone/src/presentation/web/.next/prerender-manifest.json +3 -3
- package/web/.next/standalone/src/presentation/web/.next/server/app/(dashboard)/@drawer/create/page/server-reference-manifest.json +15 -15
- package/web/.next/standalone/src/presentation/web/.next/server/app/(dashboard)/@drawer/create/page.js.nft.json +1 -1
- package/web/.next/standalone/src/presentation/web/.next/server/app/(dashboard)/@drawer/create/page_client-reference-manifest.js +1 -1
- package/web/.next/standalone/src/presentation/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page/server-reference-manifest.json +18 -18
- package/web/.next/standalone/src/presentation/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page.js.nft.json +1 -1
- package/web/.next/standalone/src/presentation/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page_client-reference-manifest.js +1 -1
- package/web/.next/standalone/src/presentation/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page/server-reference-manifest.json +13 -13
- package/web/.next/standalone/src/presentation/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page.js.nft.json +1 -1
- package/web/.next/standalone/src/presentation/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page_client-reference-manifest.js +1 -1
- package/web/.next/standalone/src/presentation/web/.next/server/app/(dashboard)/create/page/server-reference-manifest.json +15 -15
- package/web/.next/standalone/src/presentation/web/.next/server/app/(dashboard)/create/page.js.nft.json +1 -1
- package/web/.next/standalone/src/presentation/web/.next/server/app/(dashboard)/create/page_client-reference-manifest.js +1 -1
- package/web/.next/standalone/src/presentation/web/.next/server/app/(dashboard)/feature/[featureId]/page/server-reference-manifest.json +18 -18
- package/web/.next/standalone/src/presentation/web/.next/server/app/(dashboard)/feature/[featureId]/page.js.nft.json +1 -1
- package/web/.next/standalone/src/presentation/web/.next/server/app/(dashboard)/feature/[featureId]/page_client-reference-manifest.js +1 -1
- package/web/.next/standalone/src/presentation/web/.next/server/app/(dashboard)/page/server-reference-manifest.json +13 -13
- package/web/.next/standalone/src/presentation/web/.next/server/app/(dashboard)/page.js.nft.json +1 -1
- package/web/.next/standalone/src/presentation/web/.next/server/app/(dashboard)/page_client-reference-manifest.js +1 -1
- package/web/.next/standalone/src/presentation/web/.next/server/app/(dashboard)/repository/[repositoryId]/page/server-reference-manifest.json +13 -13
- package/web/.next/standalone/src/presentation/web/.next/server/app/(dashboard)/repository/[repositoryId]/page.js.nft.json +1 -1
- package/web/.next/standalone/src/presentation/web/.next/server/app/(dashboard)/repository/[repositoryId]/page_client-reference-manifest.js +1 -1
- package/web/.next/standalone/src/presentation/web/.next/server/app/_global-error.html +2 -2
- package/web/.next/standalone/src/presentation/web/.next/server/app/_global-error.rsc +1 -1
- package/web/.next/standalone/src/presentation/web/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +1 -1
- package/web/.next/standalone/src/presentation/web/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
- package/web/.next/standalone/src/presentation/web/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
- package/web/.next/standalone/src/presentation/web/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
- package/web/.next/standalone/src/presentation/web/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
- package/web/.next/standalone/src/presentation/web/.next/server/app/_not-found/page/server-reference-manifest.json +1 -1
- package/web/.next/standalone/src/presentation/web/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
- package/web/.next/standalone/src/presentation/web/.next/server/app/skills/page/server-reference-manifest.json +6 -6
- package/web/.next/standalone/src/presentation/web/.next/server/app/skills/page.js.nft.json +1 -1
- package/web/.next/standalone/src/presentation/web/.next/server/app/skills/page_client-reference-manifest.js +1 -1
- package/web/.next/standalone/src/presentation/web/.next/server/app/tools/page/server-reference-manifest.json +6 -6
- package/web/.next/standalone/src/presentation/web/.next/server/app/tools/page.js.nft.json +1 -1
- package/web/.next/standalone/src/presentation/web/.next/server/app/tools/page_client-reference-manifest.js +1 -1
- package/web/.next/standalone/src/presentation/web/.next/server/app/version/page/server-reference-manifest.json +1 -1
- package/web/.next/standalone/src/presentation/web/.next/server/app/version/page_client-reference-manifest.js +1 -1
- package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/744ca_web_components_common_control-center-drawer_create-drawer-client_tsx_5e26fc0a._.js +1 -1
- package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/8ba4b_server_app_(dashboard)_@drawer_repository_[repositoryId]_page_actions_816618e2.js +1 -1
- package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/8ba4b_server_app_(dashboard)_repository_[repositoryId]_page_actions_ba2e050f.js +1 -1
- package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/[root-of-the-server]__17a611f0._.js +2 -2
- package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/[root-of-the-server]__2018e25f._.js +1 -1
- package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/[root-of-the-server]__45dbf93d._.js +2 -2
- package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/[root-of-the-server]__6258349c._.js +1 -1
- package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/[root-of-the-server]__6b17a22d._.js +1 -1
- package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/[root-of-the-server]__6cbc1149._.js +2 -2
- package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/[root-of-the-server]__804c006d._.js +1 -1
- package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/[root-of-the-server]__94a6d275._.js +1 -1
- package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/[root-of-the-server]__aad040c0._.js +1 -1
- package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/_0e9d6bf7._.js +1 -1
- package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/_250a63ae._.js +1 -1
- package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/_61351ed3._.js +1 -1
- package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/_8400c8bb._.js +1 -1
- package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/{_1fae710b._.js → _8e87c87b._.js} +2 -2
- package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/_9f940437._.js +1 -1
- package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/src_presentation_web_2b91e4ec._.js +1 -1
- package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/src_presentation_web_5bcc1537._.js +1 -1
- package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_(dashboard)_page_actions_5955c012.js +1 -1
- package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/src_presentation_web_ca99d62d._.js +1 -1
- package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/src_presentation_web_components_features_control-center_7ac3562e._.js +1 -1
- package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/src_presentation_web_d5b0cb86._.js +2 -2
- package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/src_presentation_web_e626b63c._.js +2 -2
- package/web/.next/standalone/src/presentation/web/.next/server/pages/500.html +2 -2
- package/web/.next/standalone/src/presentation/web/.next/server/server-reference-manifest.js +1 -1
- package/web/.next/standalone/src/presentation/web/.next/server/server-reference-manifest.json +21 -21
- package/web/.next/standalone/src/presentation/web/app/build-feature-node-data.ts +3 -30
- package/web/.next/standalone/src/presentation/web/app/build-graph-nodes.ts +3 -30
- package/web/.next/standalone/src/presentation/web/components/common/control-center-drawer/create-drawer-client.tsx +0 -2
- package/web/.next/standalone/src/presentation/web/components/common/control-center-drawer/drawer-view.ts +12 -13
- package/web/.next/standalone/src/presentation/web/components/common/control-center-drawer/feature-drawer-client.tsx +21 -41
- package/web/.next/standalone/src/presentation/web/components/common/control-center-drawer/index.ts +0 -1
- package/web/.next/standalone/src/presentation/web/components/common/feature-node/derive-feature-state.ts +63 -2
- package/web/.next/standalone/src/presentation/web/components/common/index.ts +1 -6
- package/web/.next/standalone/src/presentation/web/components/features/control-center/use-control-center-state.ts +37 -43
- package/web/.next/standalone/src/presentation/web/components/features/features-canvas/features-canvas.tsx +1 -18
- package/web/.next/standalone/src/presentation/web/hooks/use-agent-events.ts +7 -3
- package/web/.next/static/chunks/0ffccd7be73305c8.css +2 -0
- package/web/.next/static/chunks/76827713cb2b7333.js +1 -0
- package/web/.next/static/chunks/{ce35cf93d71d1c1e.js → 792aac476adb5875.js} +1 -1
- package/web/.next/static/chunks/{f3d1b4bf5f83a7bb.js → 7c8adcfd920a8f74.js} +1 -1
- package/web/.next/static/chunks/{28ab1bfc2f001573.js → 83463b63971f5723.js} +1 -1
- package/web/.next/static/chunks/{145335ccbec019cd.js → 98ca891a5c156aa5.js} +3 -3
- package/web/.next/static/chunks/{cd256f1719637fae.js → 9b1770f05f1d95e5.js} +1 -1
- package/web/.next/static/chunks/{d8b549dcd668b553.js → a7f52757dff0cea0.js} +1 -1
- package/web/.next/static/chunks/b6becf0de992842a.js +1 -0
- package/web/.next/static/chunks/{5c1f5a37231b6108.js → d5e95c4482029a39.js} +1 -1
- package/web/.next/trace +1 -1
- package/web/.next/trace-build +1 -1
- package/dist/src/presentation/web/components/common/control-center-drawer/control-center-drawer.d.ts +0 -12
- package/dist/src/presentation/web/components/common/control-center-drawer/control-center-drawer.d.ts.map +0 -1
- package/dist/src/presentation/web/components/common/control-center-drawer/control-center-drawer.js +0 -337
- package/dist/src/presentation/web/components/common/control-center-drawer/control-center-drawer.stories.d.ts +0 -33
- package/dist/src/presentation/web/components/common/control-center-drawer/control-center-drawer.stories.d.ts.map +0 -1
- package/dist/src/presentation/web/components/common/control-center-drawer/control-center-drawer.stories.js +0 -214
- package/web/.next/standalone/src/presentation/web/components/common/control-center-drawer/control-center-drawer.stories.tsx +0 -293
- package/web/.next/standalone/src/presentation/web/components/common/control-center-drawer/control-center-drawer.tsx +0 -745
- package/web/.next/static/chunks/02f29f2542ce0260.js +0 -1
- package/web/.next/static/chunks/87bd8e61a05cb052.css +0 -2
- package/web/.next/static/chunks/da76b4d6b8a4cdb0.js +0 -1
- /package/web/.next/static/{DSNQz6BAG_GWooVc5rWTS → eg0FTlsA4z_7CXbFfMgAr}/_buildManifest.js +0 -0
- /package/web/.next/static/{DSNQz6BAG_GWooVc5rWTS → eg0FTlsA4z_7CXbFfMgAr}/_clientMiddlewareManifest.json +0 -0
- /package/web/.next/static/{DSNQz6BAG_GWooVc5rWTS → eg0FTlsA4z_7CXbFfMgAr}/_ssgManifest.js +0 -0
|
@@ -27,6 +27,17 @@ export type DrawerView =
|
|
|
27
27
|
/** Repository node actions */
|
|
28
28
|
| { type: 'repository'; data: RepositoryNodeData };
|
|
29
29
|
|
|
30
|
+
/** Derives the feature-specific view type from node lifecycle + state. */
|
|
31
|
+
export function deriveFeatureViewType(
|
|
32
|
+
node: FeatureNodeData
|
|
33
|
+
): 'feature' | 'prd-review' | 'tech-review' | 'merge-review' {
|
|
34
|
+
if (node.lifecycle === 'requirements' && node.state === 'action-required') return 'prd-review';
|
|
35
|
+
if (node.lifecycle === 'implementation' && node.state === 'action-required') return 'tech-review';
|
|
36
|
+
if (node.lifecycle === 'review' && (node.state === 'action-required' || node.state === 'error'))
|
|
37
|
+
return 'merge-review';
|
|
38
|
+
return 'feature';
|
|
39
|
+
}
|
|
40
|
+
|
|
30
41
|
/**
|
|
31
42
|
* Derives the active DrawerView from control-center state.
|
|
32
43
|
* Priority: feature-create > selected-node (prd/tech/merge/feature) > repository
|
|
@@ -59,19 +70,7 @@ export function computeDrawerView({
|
|
|
59
70
|
}
|
|
60
71
|
|
|
61
72
|
if (selectedNode) {
|
|
62
|
-
|
|
63
|
-
return { type: 'prd-review', node: selectedNode };
|
|
64
|
-
}
|
|
65
|
-
if (selectedNode.lifecycle === 'implementation' && selectedNode.state === 'action-required') {
|
|
66
|
-
return { type: 'tech-review', node: selectedNode };
|
|
67
|
-
}
|
|
68
|
-
if (
|
|
69
|
-
selectedNode.lifecycle === 'review' &&
|
|
70
|
-
(selectedNode.state === 'action-required' || selectedNode.state === 'error')
|
|
71
|
-
) {
|
|
72
|
-
return { type: 'merge-review', node: selectedNode };
|
|
73
|
-
}
|
|
74
|
-
return { type: 'feature', node: selectedNode };
|
|
73
|
+
return { type: deriveFeatureViewType(selectedNode), node: selectedNode };
|
|
75
74
|
}
|
|
76
75
|
|
|
77
76
|
if (selectedRepoNode) {
|
|
@@ -8,7 +8,7 @@ import type {
|
|
|
8
8
|
PrdApprovalPayload,
|
|
9
9
|
QuestionSelectionChange,
|
|
10
10
|
} from '@shepai/core/domain/generated/output';
|
|
11
|
-
import { PrStatus
|
|
11
|
+
import { PrStatus } from '@shepai/core/domain/generated/output';
|
|
12
12
|
import { approveFeature } from '@/app/actions/approve-feature';
|
|
13
13
|
import { rejectFeature } from '@/app/actions/reject-feature';
|
|
14
14
|
import { getFeatureArtifact } from '@/app/actions/get-feature-artifact';
|
|
@@ -53,10 +53,8 @@ import { useFeatureActions } from '@/components/common/feature-drawer/use-featur
|
|
|
53
53
|
import type { PrdQuestionnaireData } from '@/components/common/prd-questionnaire';
|
|
54
54
|
import type { TechDecisionsReviewData } from '@/components/common/tech-decisions-review';
|
|
55
55
|
import type { MergeReviewData } from '@/components/common/merge-review';
|
|
56
|
-
import {
|
|
57
|
-
|
|
58
|
-
mapPhaseNameToLifecycle,
|
|
59
|
-
} from '@/components/common/feature-node/derive-feature-state';
|
|
56
|
+
import { resolveSseEventUpdates } from '@/components/common/feature-node/derive-feature-state';
|
|
57
|
+
import { deriveFeatureViewType } from './drawer-view';
|
|
60
58
|
import type { DrawerView } from './drawer-view';
|
|
61
59
|
|
|
62
60
|
export interface FeatureDrawerClientProps {
|
|
@@ -94,34 +92,15 @@ export function FeatureDrawerClient({ view: initialView }: FeatureDrawerClientPr
|
|
|
94
92
|
const newEvents = events.slice(processedCountRef.current);
|
|
95
93
|
processedCountRef.current = events.length;
|
|
96
94
|
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
// a phase-timing PhaseCompleted (e.g. phaseName='research') can regress the lifecycle
|
|
100
|
-
// that WaitingApproval already set correctly (e.g. to 'implementation' for plan gate).
|
|
101
|
-
const waitingApprovalInBatch = newEvents.some(
|
|
102
|
-
(e) =>
|
|
103
|
-
e.featureId === featureNode.featureId &&
|
|
104
|
-
e.eventType === NotificationEventType.WaitingApproval
|
|
105
|
-
);
|
|
106
|
-
|
|
107
|
-
for (const event of newEvents) {
|
|
108
|
-
if (event.featureId !== featureNode.featureId) continue;
|
|
109
|
-
|
|
110
|
-
const isSuppressedPhaseCompleted =
|
|
111
|
-
event.eventType === NotificationEventType.PhaseCompleted && waitingApprovalInBatch;
|
|
112
|
-
const newState = isSuppressedPhaseCompleted
|
|
113
|
-
? undefined
|
|
114
|
-
: mapEventTypeToState(event.eventType);
|
|
115
|
-
const newLifecycle = isSuppressedPhaseCompleted
|
|
116
|
-
? undefined
|
|
117
|
-
: mapPhaseNameToLifecycle(event.phaseName);
|
|
95
|
+
for (const update of resolveSseEventUpdates(newEvents)) {
|
|
96
|
+
if (update.featureId !== featureNode.featureId) continue;
|
|
118
97
|
|
|
119
98
|
// Trigger a server refresh to get the latest drawer view,
|
|
120
99
|
// but skip when the user has unsaved changes or a rejection is in-flight
|
|
121
100
|
// to avoid the refresh interfering with the reject handler's navigation.
|
|
122
101
|
if (!isDirtyRef.current && !isRejectingRef.current) router.refresh();
|
|
123
102
|
|
|
124
|
-
if (
|
|
103
|
+
if (update.state !== undefined || update.lifecycle !== undefined) {
|
|
125
104
|
// Optimistically update the node data AND re-derive the view type so the
|
|
126
105
|
// drawer switches immediately (e.g. prd-review → feature when agent resumes)
|
|
127
106
|
// without waiting for the router.refresh() round-trip.
|
|
@@ -135,10 +114,10 @@ export function FeatureDrawerClient({ view: initialView }: FeatureDrawerClientPr
|
|
|
135
114
|
return prev;
|
|
136
115
|
const updatedNode = {
|
|
137
116
|
...prev.node,
|
|
138
|
-
...(
|
|
139
|
-
...(
|
|
117
|
+
...(update.state !== undefined && { state: update.state }),
|
|
118
|
+
...(update.lifecycle !== undefined && { lifecycle: update.lifecycle }),
|
|
140
119
|
};
|
|
141
|
-
return { ...prev, type:
|
|
120
|
+
return { ...prev, type: deriveFeatureViewType(updatedNode), node: updatedNode };
|
|
142
121
|
});
|
|
143
122
|
}
|
|
144
123
|
}
|
|
@@ -387,6 +366,12 @@ export function FeatureDrawerClient({ view: initialView }: FeatureDrawerClientPr
|
|
|
387
366
|
}
|
|
388
367
|
setChatInput('');
|
|
389
368
|
toast.success(`${label} approved — agent resuming`);
|
|
369
|
+
// Optimistically update canvas node before SSE arrives (~500ms delay)
|
|
370
|
+
window.dispatchEvent(
|
|
371
|
+
new CustomEvent('shep:feature-approved', {
|
|
372
|
+
detail: { featureId: reviewNode.featureId },
|
|
373
|
+
})
|
|
374
|
+
);
|
|
390
375
|
onClose();
|
|
391
376
|
},
|
|
392
377
|
[reviewNode, onClose]
|
|
@@ -414,6 +399,12 @@ export function FeatureDrawerClient({ view: initialView }: FeatureDrawerClientPr
|
|
|
414
399
|
}
|
|
415
400
|
setChatInput('');
|
|
416
401
|
toast.success('Requirements approved — agent resuming');
|
|
402
|
+
// Optimistically update canvas node before SSE arrives (~500ms delay)
|
|
403
|
+
window.dispatchEvent(
|
|
404
|
+
new CustomEvent('shep:feature-approved', {
|
|
405
|
+
detail: { featureId: view.node.featureId },
|
|
406
|
+
})
|
|
407
|
+
);
|
|
417
408
|
setPrdSelections({});
|
|
418
409
|
onClose();
|
|
419
410
|
},
|
|
@@ -784,14 +775,3 @@ function DetailRow({ label, value }: { label: string; value: string }) {
|
|
|
784
775
|
</div>
|
|
785
776
|
);
|
|
786
777
|
}
|
|
787
|
-
|
|
788
|
-
/** Mirrors computeDrawerView logic — derives view type from live node data. */
|
|
789
|
-
function deriveViewType(
|
|
790
|
-
node: FeatureNodeData
|
|
791
|
-
): 'feature' | 'prd-review' | 'tech-review' | 'merge-review' {
|
|
792
|
-
if (node.lifecycle === 'requirements' && node.state === 'action-required') return 'prd-review';
|
|
793
|
-
if (node.lifecycle === 'implementation' && node.state === 'action-required') return 'tech-review';
|
|
794
|
-
if (node.lifecycle === 'review' && (node.state === 'action-required' || node.state === 'error'))
|
|
795
|
-
return 'merge-review';
|
|
796
|
-
return 'feature';
|
|
797
|
-
}
|
|
@@ -41,7 +41,7 @@ export function deriveNodeState(feature: Feature, agentRun?: AgentRun | null): F
|
|
|
41
41
|
case AgentRunStatus.cancelled:
|
|
42
42
|
return 'blocked';
|
|
43
43
|
case AgentRunStatus.completed:
|
|
44
|
-
return
|
|
44
|
+
return 'done';
|
|
45
45
|
case AgentRunStatus.running:
|
|
46
46
|
case AgentRunStatus.pending:
|
|
47
47
|
return 'running';
|
|
@@ -112,7 +112,17 @@ export function mapEventTypeToState(eventType: NotificationEventType): FeatureNo
|
|
|
112
112
|
}
|
|
113
113
|
}
|
|
114
114
|
|
|
115
|
-
/**
|
|
115
|
+
/** Map domain SdlcLifecycle enum values to UI FeatureLifecyclePhase. */
|
|
116
|
+
export const sdlcLifecycleMap: Record<string, FeatureLifecyclePhase> = {
|
|
117
|
+
Requirements: 'requirements',
|
|
118
|
+
Research: 'research',
|
|
119
|
+
Implementation: 'implementation',
|
|
120
|
+
Review: 'review',
|
|
121
|
+
'Deploy & QA': 'deploy',
|
|
122
|
+
Maintain: 'maintain',
|
|
123
|
+
};
|
|
124
|
+
|
|
125
|
+
/** Map agent graph node names (from agent_run.result or SSE phaseName) to UI lifecycle phases. */
|
|
116
126
|
const phaseNameToLifecycle: Record<string, FeatureLifecyclePhase> = {
|
|
117
127
|
analyze: 'requirements',
|
|
118
128
|
requirements: 'requirements',
|
|
@@ -124,6 +134,57 @@ const phaseNameToLifecycle: Record<string, FeatureLifecyclePhase> = {
|
|
|
124
134
|
blocked: 'requirements',
|
|
125
135
|
};
|
|
126
136
|
|
|
137
|
+
/**
|
|
138
|
+
* Derives the UI lifecycle phase from a Feature + AgentRun.
|
|
139
|
+
* Shared by build-feature-node-data.ts and build-graph-nodes.ts.
|
|
140
|
+
*/
|
|
141
|
+
export function deriveLifecycle(feature: Feature, run: AgentRun | null): FeatureLifecyclePhase {
|
|
142
|
+
if (run?.status === 'completed') return 'maintain';
|
|
143
|
+
const agentNode = run?.result?.startsWith('node:') ? run.result.slice(5) : undefined;
|
|
144
|
+
return (
|
|
145
|
+
(agentNode ? phaseNameToLifecycle[agentNode] : undefined) ??
|
|
146
|
+
sdlcLifecycleMap[feature.lifecycle] ??
|
|
147
|
+
'requirements'
|
|
148
|
+
);
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
export interface SseEventUpdate {
|
|
152
|
+
featureId: string;
|
|
153
|
+
state: FeatureNodeState | undefined;
|
|
154
|
+
lifecycle: FeatureLifecyclePhase | undefined;
|
|
155
|
+
eventType: NotificationEventType;
|
|
156
|
+
phaseName?: string;
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
/**
|
|
160
|
+
* Resolves state/lifecycle updates from a batch of SSE events, applying
|
|
161
|
+
* the WaitingApproval batch-suppression rule: when WaitingApproval and
|
|
162
|
+
* PhaseCompleted arrive in the same batch for a feature, PhaseCompleted
|
|
163
|
+
* is fully suppressed to prevent lifecycle regression.
|
|
164
|
+
*/
|
|
165
|
+
export function resolveSseEventUpdates(
|
|
166
|
+
events: readonly { featureId: string; eventType: NotificationEventType; phaseName?: string }[]
|
|
167
|
+
): SseEventUpdate[] {
|
|
168
|
+
const waitingApprovalFeatures = new Set(
|
|
169
|
+
events
|
|
170
|
+
.filter((e) => e.eventType === NotificationEventType.WaitingApproval)
|
|
171
|
+
.map((e) => e.featureId)
|
|
172
|
+
);
|
|
173
|
+
|
|
174
|
+
return events.map((event) => {
|
|
175
|
+
const isSuppressed =
|
|
176
|
+
event.eventType === NotificationEventType.PhaseCompleted &&
|
|
177
|
+
waitingApprovalFeatures.has(event.featureId);
|
|
178
|
+
return {
|
|
179
|
+
featureId: event.featureId,
|
|
180
|
+
state: isSuppressed ? undefined : mapEventTypeToState(event.eventType),
|
|
181
|
+
lifecycle: isSuppressed ? undefined : mapPhaseNameToLifecycle(event.phaseName),
|
|
182
|
+
eventType: event.eventType,
|
|
183
|
+
phaseName: event.phaseName,
|
|
184
|
+
};
|
|
185
|
+
});
|
|
186
|
+
}
|
|
187
|
+
|
|
127
188
|
export function mapPhaseNameToLifecycle(
|
|
128
189
|
phaseName: string | undefined
|
|
129
190
|
): FeatureLifecyclePhase | undefined {
|
|
@@ -1,9 +1,4 @@
|
|
|
1
|
-
export {
|
|
2
|
-
ControlCenterDrawer,
|
|
3
|
-
type ControlCenterDrawerProps,
|
|
4
|
-
computeDrawerView,
|
|
5
|
-
type DrawerView,
|
|
6
|
-
} from './control-center-drawer';
|
|
1
|
+
export { computeDrawerView, type DrawerView } from './control-center-drawer';
|
|
7
2
|
export { AddRepositoryButton } from './add-repository-button';
|
|
8
3
|
export { ElapsedTime, formatElapsed } from './elapsed-time';
|
|
9
4
|
export { EmptyState, type EmptyStateProps } from './empty-state';
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
'use client';
|
|
2
2
|
|
|
3
|
-
import { useCallback, useEffect, useRef } from 'react';
|
|
3
|
+
import { useCallback, useEffect, useMemo, useRef } from 'react';
|
|
4
4
|
import { useRouter } from 'next/navigation';
|
|
5
5
|
import { toast } from 'sonner';
|
|
6
6
|
import type { Connection, Edge, NodeChange } from '@xyflow/react';
|
|
@@ -20,9 +20,8 @@ import { useAgentEventsContext } from '@/hooks/agent-events-provider';
|
|
|
20
20
|
import { useSoundAction } from '@/hooks/use-sound-action';
|
|
21
21
|
import {
|
|
22
22
|
mapEventTypeToState,
|
|
23
|
-
|
|
23
|
+
resolveSseEventUpdates,
|
|
24
24
|
} from '@/components/common/feature-node/derive-feature-state';
|
|
25
|
-
import { NotificationEventType } from '@shepai/core/domain/generated/output';
|
|
26
25
|
import { useGraphState, type GraphCallbacks } from '@/hooks/use-graph-state';
|
|
27
26
|
import type { FeatureEntry } from '@/lib/derive-graph';
|
|
28
27
|
|
|
@@ -79,18 +78,26 @@ export function useControlCenterState(
|
|
|
79
78
|
|
|
80
79
|
// Sync server props into domain Maps when initialNodes/initialEdges change.
|
|
81
80
|
// Keyed by a stable string so we don't re-reconcile on every render.
|
|
82
|
-
const initialNodeKey =
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
81
|
+
const initialNodeKey = useMemo(
|
|
82
|
+
() =>
|
|
83
|
+
initialNodes
|
|
84
|
+
.map((n) => n.id)
|
|
85
|
+
.sort()
|
|
86
|
+
.join(','),
|
|
87
|
+
[initialNodes]
|
|
88
|
+
);
|
|
89
|
+
const initialDataKey = useMemo(
|
|
90
|
+
() =>
|
|
91
|
+
initialNodes
|
|
92
|
+
.filter((n) => n.type === 'featureNode')
|
|
93
|
+
.map((n) => {
|
|
94
|
+
const d = n.data as FeatureNodeData;
|
|
95
|
+
return `${n.id}:${d.state}:${d.lifecycle}`;
|
|
96
|
+
})
|
|
97
|
+
.sort()
|
|
98
|
+
.join(','),
|
|
99
|
+
[initialNodes]
|
|
100
|
+
);
|
|
94
101
|
|
|
95
102
|
const prevReconcileKey = useRef('');
|
|
96
103
|
|
|
@@ -145,39 +152,26 @@ export function useControlCenterState(
|
|
|
145
152
|
const newEvents = events.slice(processedEventCountRef.current);
|
|
146
153
|
processedEventCountRef.current = events.length;
|
|
147
154
|
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
// it to update both state and lifecycle as a fallback for any missed AgentStarted event.
|
|
154
|
-
const waitingApprovalFeatures = new Set(
|
|
155
|
-
newEvents
|
|
156
|
-
.filter((e) => e.eventType === NotificationEventType.WaitingApproval)
|
|
157
|
-
.map((e) => e.featureId)
|
|
158
|
-
);
|
|
159
|
-
|
|
160
|
-
for (const event of newEvents) {
|
|
161
|
-
const isSuppressedPhaseCompleted =
|
|
162
|
-
event.eventType === NotificationEventType.PhaseCompleted &&
|
|
163
|
-
waitingApprovalFeatures.has(event.featureId);
|
|
164
|
-
const newState = isSuppressedPhaseCompleted
|
|
165
|
-
? undefined
|
|
166
|
-
: mapEventTypeToState(event.eventType);
|
|
167
|
-
const newLifecycle = isSuppressedPhaseCompleted
|
|
168
|
-
? undefined
|
|
169
|
-
: mapPhaseNameToLifecycle(event.phaseName);
|
|
170
|
-
|
|
171
|
-
const nodeId = `feat-${event.featureId}`;
|
|
172
|
-
if (newState !== undefined || newLifecycle !== undefined) {
|
|
173
|
-
updateFeature(nodeId, {
|
|
174
|
-
...(newState !== undefined && { state: newState }),
|
|
175
|
-
...(newLifecycle !== undefined && { lifecycle: newLifecycle }),
|
|
155
|
+
for (const { featureId, state, lifecycle } of resolveSseEventUpdates(newEvents)) {
|
|
156
|
+
if (state !== undefined || lifecycle !== undefined) {
|
|
157
|
+
updateFeature(`feat-${featureId}`, {
|
|
158
|
+
...(state !== undefined && { state }),
|
|
159
|
+
...(lifecycle !== undefined && { lifecycle }),
|
|
176
160
|
});
|
|
177
161
|
}
|
|
178
162
|
}
|
|
179
163
|
}, [events, updateFeature]);
|
|
180
164
|
|
|
165
|
+
// Listen for optimistic approval events from the drawer (fires before SSE arrives)
|
|
166
|
+
useEffect(() => {
|
|
167
|
+
const handler = (e: Event) => {
|
|
168
|
+
const { featureId } = (e as CustomEvent<{ featureId: string }>).detail;
|
|
169
|
+
updateFeature(`feat-${featureId}`, { state: 'running' });
|
|
170
|
+
};
|
|
171
|
+
window.addEventListener('shep:feature-approved', handler);
|
|
172
|
+
return () => window.removeEventListener('shep:feature-approved', handler);
|
|
173
|
+
}, [updateFeature]);
|
|
174
|
+
|
|
181
175
|
// Separate effect: fetch metadata (name + description) when SSE reports it changed
|
|
182
176
|
const metadataFetchedRef = useRef<Set<string>>(new Set());
|
|
183
177
|
const processedMetadataCountRef = useRef(0);
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
'use client';
|
|
2
2
|
|
|
3
|
-
import { useMemo
|
|
3
|
+
import { useMemo } from 'react';
|
|
4
4
|
import { ReactFlow, Background, Controls } from '@xyflow/react';
|
|
5
5
|
import type { Connection, Edge, NodeChange } from '@xyflow/react';
|
|
6
6
|
import { Plus } from 'lucide-react';
|
|
@@ -56,22 +56,6 @@ export function FeaturesCanvas({
|
|
|
56
56
|
[]
|
|
57
57
|
);
|
|
58
58
|
|
|
59
|
-
// Prevent a feature from having more than one source repository
|
|
60
|
-
const isValidConnection = useCallback(
|
|
61
|
-
(connection: Edge | Connection) => {
|
|
62
|
-
const sourceNode = nodes.find((n) => n.id === connection.source);
|
|
63
|
-
if (sourceNode?.type !== 'repositoryNode') return true;
|
|
64
|
-
|
|
65
|
-
const targetAlreadyHasRepo = edges.some((e) => {
|
|
66
|
-
const edgeSourceNode = nodes.find((n) => n.id === e.source);
|
|
67
|
-
return edgeSourceNode?.type === 'repositoryNode' && e.target === connection.target;
|
|
68
|
-
});
|
|
69
|
-
|
|
70
|
-
return !targetAlreadyHasRepo;
|
|
71
|
-
},
|
|
72
|
-
[nodes, edges]
|
|
73
|
-
);
|
|
74
|
-
|
|
75
59
|
// Callbacks and showHandles are already injected into node.data by deriveGraph.
|
|
76
60
|
// Only selectedFeatureId highlighting needs to be applied here.
|
|
77
61
|
const enrichedNodes = useMemo(
|
|
@@ -122,7 +106,6 @@ export function FeaturesCanvas({
|
|
|
122
106
|
edges={edges}
|
|
123
107
|
nodeTypes={nodeTypes}
|
|
124
108
|
edgeTypes={edgeTypes}
|
|
125
|
-
isValidConnection={isValidConnection}
|
|
126
109
|
onConnect={onConnect}
|
|
127
110
|
onNodesChange={onNodesChange}
|
|
128
111
|
onNodeClick={onNodeClick}
|
|
@@ -103,9 +103,13 @@ export function useAgentEvents(options?: UseAgentEventsOptions): UseAgentEventsR
|
|
|
103
103
|
if (sw.state === 'activated') {
|
|
104
104
|
subscribeToWorker(sw);
|
|
105
105
|
} else {
|
|
106
|
-
|
|
107
|
-
if (sw.state === 'activated')
|
|
108
|
-
|
|
106
|
+
const onStateChange = () => {
|
|
107
|
+
if (sw.state === 'activated') {
|
|
108
|
+
sw.removeEventListener('statechange', onStateChange);
|
|
109
|
+
subscribeToWorker(sw);
|
|
110
|
+
}
|
|
111
|
+
};
|
|
112
|
+
sw.addEventListener('statechange', onStateChange);
|
|
109
113
|
}
|
|
110
114
|
})
|
|
111
115
|
.catch(() => {
|