@shepai/cli 1.179.1-pr536.c975f4d → 1.180.0
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/use-cases/applications/create-application.use-case.d.ts.map +1 -1
- package/dist/packages/core/src/application/use-cases/applications/create-application.use-case.js +7 -4
- package/dist/packages/core/src/application/workflows/application-creation.workflow.d.ts +8 -2
- package/dist/packages/core/src/application/workflows/application-creation.workflow.d.ts.map +1 -1
- package/dist/packages/core/src/application/workflows/application-creation.workflow.js +14 -24
- package/dist/packages/core/src/infrastructure/services/filesystem/node-application-file-system.service.d.ts.map +1 -1
- package/dist/packages/core/src/infrastructure/services/filesystem/node-application-file-system.service.js +7 -1
- package/dist/src/presentation/web/app/actions/update-application.d.ts +5 -0
- package/dist/src/presentation/web/app/actions/update-application.d.ts.map +1 -0
- package/dist/src/presentation/web/app/actions/update-application.js +21 -0
- package/dist/src/presentation/web/components/assistant-ui/thread.js +4 -4
- package/dist/src/presentation/web/components/features/application-page/application-page.d.ts.map +1 -1
- package/dist/src/presentation/web/components/features/application-page/application-page.js +11 -1
- package/dist/src/presentation/web/components/features/chat/ChatTab.d.ts.map +1 -1
- package/dist/src/presentation/web/components/features/chat/ChatTab.js +2 -2
- package/dist/src/presentation/web/components/features/chat/StepTracker.d.ts +15 -2
- package/dist/src/presentation/web/components/features/chat/StepTracker.d.ts.map +1 -1
- package/dist/src/presentation/web/components/features/chat/StepTracker.js +78 -8
- package/dist/src/presentation/web/components/features/chat/useChatRuntime.d.ts +8 -0
- package/dist/src/presentation/web/components/features/chat/useChatRuntime.d.ts.map +1 -1
- package/dist/src/presentation/web/components/features/chat/useChatRuntime.js +108 -17
- package/dist/src/presentation/web/components/features/chat/workflow-placeholder.d.ts +1 -1
- package/dist/src/presentation/web/components/features/chat/workflow-placeholder.d.ts.map +1 -1
- package/dist/src/presentation/web/components/features/chat/workflow-placeholder.js +4 -6
- 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 +2 -2
- package/web/.next/required-server-files.json +2 -2
- package/web/.next/server/app/(dashboard)/@drawer/adopt/page/server-reference-manifest.json +32 -32
- 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 +30 -30
- 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 +33 -33
- 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 +41 -41
- 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 +41 -41
- 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 +31 -31
- 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 +31 -31
- 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 +30 -30
- 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 +33 -33
- 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 +41 -41
- 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 +41 -41
- 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 +30 -30
- 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 +31 -31
- 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 +31 -31
- 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 +7 -7
- 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/application/[id]/page/server-reference-manifest.json +15 -15
- package/web/.next/server/app/application/[id]/page.js.nft.json +1 -1
- package/web/.next/server/app/application/[id]/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/features/page/server-reference-manifest.json +7 -7
- package/web/.next/server/app/features/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/settings/page/server-reference-manifest.json +10 -10
- 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 +15 -15
- 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 +13 -13
- package/web/.next/server/app/tools/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/version/page/server-reference-manifest.json +7 -7
- 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/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/[root-of-the-server]__013a0318._.js +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__013a0318._.js.map +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__17dadd08._.js +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__17dadd08._.js.map +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__1925bef0._.js +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__1a9687c4._.js +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__1a9687c4._.js.map +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__24756fa9._.js +2 -2
- package/web/.next/server/chunks/ssr/[root-of-the-server]__24756fa9._.js.map +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__4ee8be85._.js +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__70986695._.js +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__70986695._.js.map +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__87bc4dac._.js +2 -2
- package/web/.next/server/chunks/ssr/[root-of-the-server]__87bc4dac._.js.map +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__a5ea76a6._.js +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__a5ea76a6._.js.map +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__bb391c45._.js +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__bb391c45._.js.map +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__dd3e834e._.js +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__dd3e834e._.js.map +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__e265da61._.js +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__f3ca7bea._.js +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__f3ca7bea._.js.map +1 -1
- package/web/.next/server/chunks/ssr/_0277d3b5._.js +2 -2
- package/web/.next/server/chunks/ssr/_0277d3b5._.js.map +1 -1
- package/web/.next/server/chunks/ssr/{_936eb52f._.js → _36489f2b._.js} +2 -2
- package/web/.next/server/chunks/ssr/{_936eb52f._.js.map → _36489f2b._.js.map} +1 -1
- 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/{_a3f47267._.js → _63fc4647._.js} +2 -2
- package/web/.next/server/chunks/ssr/{_a3f47267._.js.map → _63fc4647._.js.map} +1 -1
- package/web/.next/server/chunks/ssr/{_cd03c60d._.js → _8caadb9a._.js} +2 -2
- package/web/.next/server/chunks/ssr/{_cd03c60d._.js.map → _8caadb9a._.js.map} +1 -1
- package/web/.next/server/chunks/ssr/_946a7fc6._.js +1 -1
- package/web/.next/server/chunks/ssr/_946a7fc6._.js.map +1 -1
- package/web/.next/server/chunks/ssr/{_f97bd21d._.js → _b8e8b690._.js} +2 -2
- package/web/.next/server/chunks/ssr/{_f97bd21d._.js.map → _b8e8b690._.js.map} +1 -1
- package/web/.next/server/chunks/ssr/{_854ae39b._.js → _d44d091a._.js} +2 -2
- package/web/.next/server/chunks/ssr/{_854ae39b._.js.map → _d44d091a._.js.map} +1 -1
- package/web/.next/server/chunks/ssr/_eff1b518._.js +1 -1
- package/web/.next/server/chunks/ssr/_eff1b518._.js.map +1 -1
- package/web/.next/server/chunks/ssr/_f227429a._.js +1 -1
- package/web/.next/server/chunks/ssr/_f227429a._.js.map +1 -1
- package/web/.next/server/chunks/ssr/_f86fc1bf._.js +1 -1
- package/web/.next/server/chunks/ssr/_f86fc1bf._.js.map +1 -1
- package/web/.next/server/chunks/ssr/_f8c55130._.js +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 +1 -1
- package/web/.next/server/chunks/ssr/f3a1f_components_common_control-center-drawer_repository-drawer-client_tsx_39a00c03._.js.map +1 -1
- package/web/.next/server/chunks/ssr/src_presentation_web_36f2bc45._.js +1 -1
- package/web/.next/server/chunks/ssr/src_presentation_web_36f2bc45._.js.map +1 -1
- package/web/.next/server/chunks/ssr/src_presentation_web_486908de._.js +1 -1
- package/web/.next/server/chunks/ssr/src_presentation_web_486908de._.js.map +1 -1
- package/web/.next/server/chunks/ssr/src_presentation_web_5c3596bc._.js +1 -1
- package/web/.next/server/chunks/ssr/src_presentation_web_5c3596bc._.js.map +1 -1
- package/web/.next/server/chunks/ssr/src_presentation_web_6159fef8._.js +1 -1
- package/web/.next/server/chunks/ssr/src_presentation_web_6159fef8._.js.map +1 -1
- package/web/.next/server/chunks/ssr/src_presentation_web_6326f81e._.js +1 -1
- package/web/.next/server/chunks/ssr/src_presentation_web_6326f81e._.js.map +1 -1
- package/web/.next/server/chunks/ssr/src_presentation_web_6b2fdcd8._.js +1 -1
- package/web/.next/server/chunks/ssr/src_presentation_web_6b2fdcd8._.js.map +1 -1
- package/web/.next/server/chunks/ssr/src_presentation_web_74703c9f._.js +1 -1
- package/web/.next/server/chunks/ssr/src_presentation_web_74703c9f._.js.map +1 -1
- package/web/.next/server/chunks/ssr/src_presentation_web_a8056dac._.js +1 -1
- package/web/.next/server/chunks/ssr/src_presentation_web_a8056dac._.js.map +1 -1
- package/web/.next/server/chunks/ssr/src_presentation_web_ad42cc73._.js +1 -1
- package/web/.next/server/chunks/ssr/src_presentation_web_ad42cc73._.js.map +1 -1
- package/web/.next/server/chunks/ssr/src_presentation_web_app_actions_open-ide_ts_baaca5d5._.js +3 -3
- package/web/.next/server/chunks/ssr/src_presentation_web_b00bfb08._.js +1 -1
- package/web/.next/server/chunks/ssr/src_presentation_web_b00bfb08._.js.map +1 -1
- package/web/.next/server/chunks/ssr/src_presentation_web_components_895e5bfa._.js +1 -1
- package/web/.next/server/chunks/ssr/src_presentation_web_components_895e5bfa._.js.map +1 -1
- package/web/.next/server/chunks/ssr/src_presentation_web_components_common_base-drawer_base-drawer_tsx_97dfbbc8._.js +1 -1
- package/web/.next/server/chunks/ssr/src_presentation_web_components_common_base-drawer_base-drawer_tsx_97dfbbc8._.js.map +1 -1
- package/web/.next/server/chunks/ssr/src_presentation_web_components_features_control-center_7ac3562e._.js +1 -1
- package/web/.next/server/chunks/ssr/src_presentation_web_components_features_control-center_7ac3562e._.js.map +1 -1
- package/web/.next/server/chunks/ssr/src_presentation_web_components_features_skills_8a174cac._.js +1 -1
- package/web/.next/server/chunks/ssr/src_presentation_web_components_features_skills_8a174cac._.js.map +1 -1
- package/web/.next/server/chunks/ssr/src_presentation_web_db9fa0c2._.js +1 -1
- package/web/.next/server/chunks/ssr/src_presentation_web_f1edcf5e._.js +1 -1
- package/web/.next/server/chunks/ssr/src_presentation_web_f1edcf5e._.js.map +1 -1
- package/web/.next/server/chunks/ssr/src_presentation_web_f9436804._.js +1 -1
- package/web/.next/server/chunks/ssr/src_presentation_web_f9436804._.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 +54 -54
- package/web/.next/static/chunks/06b9d6dbf635c370.css +1 -0
- package/web/.next/static/chunks/1bc12075020723ed.js +1 -0
- package/web/.next/static/chunks/1fa1574b87bd2eb1.js +1 -0
- package/web/.next/static/chunks/{d763375b20e7a0d8.js → 26e2ca76ab6c38b4.js} +1 -1
- package/web/.next/static/chunks/{5caab310bd5ce5dc.js → 2fe20598e1b4793a.js} +3 -3
- package/web/.next/static/chunks/{2e1f0b1d26bd7f04.js → 490667b2a9bb58e2.js} +1 -1
- package/web/.next/static/chunks/{bb60b5e4b5e4bc39.js → 7849c6797be7c6ca.js} +2 -2
- package/web/.next/static/chunks/{f3a549aa7a4dc6d7.js → 7bc7028587490fff.js} +1 -1
- package/web/.next/static/chunks/{2374b4d7e456e10f.js → 8746807722de67a8.js} +1 -1
- package/web/.next/static/chunks/{71896d6be547a34c.js → 893a2a76546c66a7.js} +1 -1
- package/web/.next/static/chunks/{a59a4dbe37fde0a8.js → a1098522326428d1.js} +1 -1
- package/web/.next/static/chunks/{fc40fada6a6ed6f8.js → be89c20c257247ad.js} +1 -1
- package/web/.next/static/chunks/{b73ad92c421b72b9.js → c0bd3ffcf94d1845.js} +1 -1
- package/web/.next/static/chunks/{8e8a2db2aa138419.js → dfdcccf73de56960.js} +1 -1
- package/web/.next/static/chunks/{efd03eb92d09c9a1.js → e2f9e224d1fa1faa.js} +1 -1
- package/web/.next/static/chunks/{00aac0dd4073b6e8.js → e7da54dde18e7fb2.js} +2 -2
- package/web/.next/static/chunks/{f679709942c35216.js → f28aef9cf5107c4b.js} +1 -1
- package/web/.next/static/chunks/{40b69c5164b1c108.js → f6d47ff35d612852.js} +3 -3
- package/web/.next/static/chunks/7f7a032daa42a969.js +0 -1
- package/web/.next/static/chunks/c4ccddb6d9fabbd0.css +0 -1
- package/web/.next/static/chunks/c962f6d7c6928b67.js +0 -1
- /package/web/.next/static/{muO23uSysJM1bwu3hwEw- → GQFJf3UCD4D5C4NCn8eXl}/_buildManifest.js +0 -0
- /package/web/.next/static/{muO23uSysJM1bwu3hwEw- → GQFJf3UCD4D5C4NCn8eXl}/_clientMiddlewareManifest.json +0 -0
- /package/web/.next/static/{muO23uSysJM1bwu3hwEw- → GQFJf3UCD4D5C4NCn8eXl}/_ssgManifest.js +0 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"create-application.use-case.d.ts","sourceRoot":"","sources":["../../../../../../../packages/core/src/application/use-cases/applications/create-application.use-case.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAIH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,qCAAqC,CAAC;AAEvE,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,qEAAqE,CAAC;AAClH,OAAO,KAAK,EAAE,iCAAiC,EAAE,MAAM,8EAA8E,CAAC;AACtI,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,kEAAkE,CAAC;AAC/G,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,wCAAwC,CAAC;AACnF,OAAO,KAAK,EAAE,6BAA6B,EAAE,MAAM,qDAAqD,CAAC;AACzG,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,uCAAuC,CAAC;AAChF,OAAO,KAAK,EAAE,0BAA0B,EAAE,MAAM,sEAAsE,CAAC;AAGvH;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,qBAAqB,CAAC,IAAI,EAAE;IAAE,SAAS,EAAE,MAAM,CAAC;IAAC,WAAW,EAAE,MAAM,CAAA;CAAE,GAAG,MAAM,CAe9F;AAED,MAAM,WAAW,sBAAsB;IACrC,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB;;;;;;OAMG;IACH,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAED,MAAM,WAAW,uBAAuB;IACtC,WAAW,EAAE,WAAW,CAAC;IACzB,cAAc,EAAE,MAAM,CAAC;CACxB;AAoDD;;;;;;;;GAQG;AACH,wBAAgB,aAAa,IAAI,MAAM,CAEtC;AAED,qBACa,wBAAwB;IAGjC,OAAO,CAAC,QAAQ,CAAC,OAAO;IAExB,OAAO,CAAC,QAAQ,CAAC,aAAa;IAE9B,OAAO,CAAC,QAAQ,CAAC,aAAa;IAE9B,OAAO,CAAC,QAAQ,CAAC,WAAW;IAE5B,OAAO,CAAC,QAAQ,CAAC,UAAU;IAE3B,OAAO,CAAC,QAAQ,CAAC,WAAW;IAE5B,OAAO,CAAC,QAAQ,CAAC,cAAc;gBAZd,OAAO,EAAE,sBAAsB,EAE/B,aAAa,EAAE,oBAAoB,EAEnC,aAAa,EAAE,iCAAiC,EAEhD,WAAW,EAAE,6BAA6B,EAE1C,UAAU,EAAE,sBAAsB,EAElC,WAAW,EAAE,kBAAkB,EAE/B,cAAc,EAAE,0BAA0B;IAGvD,OAAO,CAAC,KAAK,EAAE,sBAAsB,GAAG,OAAO,CAAC,uBAAuB,CAAC;
|
|
1
|
+
{"version":3,"file":"create-application.use-case.d.ts","sourceRoot":"","sources":["../../../../../../../packages/core/src/application/use-cases/applications/create-application.use-case.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAIH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,qCAAqC,CAAC;AAEvE,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,qEAAqE,CAAC;AAClH,OAAO,KAAK,EAAE,iCAAiC,EAAE,MAAM,8EAA8E,CAAC;AACtI,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,kEAAkE,CAAC;AAC/G,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,wCAAwC,CAAC;AACnF,OAAO,KAAK,EAAE,6BAA6B,EAAE,MAAM,qDAAqD,CAAC;AACzG,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,uCAAuC,CAAC;AAChF,OAAO,KAAK,EAAE,0BAA0B,EAAE,MAAM,sEAAsE,CAAC;AAGvH;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,qBAAqB,CAAC,IAAI,EAAE;IAAE,SAAS,EAAE,MAAM,CAAC;IAAC,WAAW,EAAE,MAAM,CAAA;CAAE,GAAG,MAAM,CAe9F;AAED,MAAM,WAAW,sBAAsB;IACrC,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB;;;;;;OAMG;IACH,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAED,MAAM,WAAW,uBAAuB;IACtC,WAAW,EAAE,WAAW,CAAC;IACzB,cAAc,EAAE,MAAM,CAAC;CACxB;AAoDD;;;;;;;;GAQG;AACH,wBAAgB,aAAa,IAAI,MAAM,CAEtC;AAED,qBACa,wBAAwB;IAGjC,OAAO,CAAC,QAAQ,CAAC,OAAO;IAExB,OAAO,CAAC,QAAQ,CAAC,aAAa;IAE9B,OAAO,CAAC,QAAQ,CAAC,aAAa;IAE9B,OAAO,CAAC,QAAQ,CAAC,WAAW;IAE5B,OAAO,CAAC,QAAQ,CAAC,UAAU;IAE3B,OAAO,CAAC,QAAQ,CAAC,WAAW;IAE5B,OAAO,CAAC,QAAQ,CAAC,cAAc;gBAZd,OAAO,EAAE,sBAAsB,EAE/B,aAAa,EAAE,oBAAoB,EAEnC,aAAa,EAAE,iCAAiC,EAEhD,WAAW,EAAE,6BAA6B,EAE1C,UAAU,EAAE,sBAAsB,EAElC,WAAW,EAAE,kBAAkB,EAE/B,cAAc,EAAE,0BAA0B;IAGvD,OAAO,CAAC,KAAK,EAAE,sBAAsB,GAAG,OAAO,CAAC,uBAAuB,CAAC;IA2G9E;;;;;;OAMG;YACW,gBAAgB;IAqC9B;;;;OAIG;YACW,6BAA6B;CA0B5C"}
|
package/dist/packages/core/src/application/use-cases/applications/create-application.use-case.js
CHANGED
|
@@ -140,10 +140,13 @@ let CreateApplicationUseCase = class CreateApplicationUseCase {
|
|
|
140
140
|
// collide on disk or in the DB; the retry loop below covers the
|
|
141
141
|
// astronomically rare case where two random tags do clash.
|
|
142
142
|
const { slug, projectPath } = await this.allocateUniqueSlugAndScaffold(baseSlug);
|
|
143
|
-
// 3. Generate display name from
|
|
144
|
-
//
|
|
145
|
-
//
|
|
146
|
-
|
|
143
|
+
// 3. Generate the human-readable display name from the BASE slug
|
|
144
|
+
// only — the random hex tag is an internal disambiguator that
|
|
145
|
+
// lives on the `slug` field (and the worktree path), and must
|
|
146
|
+
// NEVER bleed into the user-visible title. Names are allowed to
|
|
147
|
+
// duplicate; uniqueness is enforced on `slug`. Users can rename
|
|
148
|
+
// afterwards via the application page.
|
|
149
|
+
const name = toTitleCase(baseSlug);
|
|
147
150
|
// 4. Create Application record
|
|
148
151
|
const now = new Date();
|
|
149
152
|
const application = {
|
|
@@ -1,11 +1,17 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Application-creation workflow definition.
|
|
3
3
|
*
|
|
4
|
-
* The
|
|
4
|
+
* The eight steps Shep walks every new application through, with the
|
|
5
5
|
* friendly non-technical title/description the user sees in the
|
|
6
6
|
* tracker card AND the focused agent-facing prompt the orchestrator
|
|
7
7
|
* sends for that step.
|
|
8
8
|
*
|
|
9
|
+
* History note: an earlier version had separate `plan` and `content`
|
|
10
|
+
* steps. They produced agent text confirmations with no actual tool
|
|
11
|
+
* work, leaving lonely "title-only" cards in the tracker. Both have
|
|
12
|
+
* been folded into the `components` step which now plans, builds,
|
|
13
|
+
* and writes real content in a single agent turn.
|
|
14
|
+
*
|
|
9
15
|
* Key design notes:
|
|
10
16
|
* - The orchestrator (`RunWorkflowUseCase`) sends each step's
|
|
11
17
|
* `prompt` as a user turn against the SAME interactive session,
|
|
@@ -33,7 +39,7 @@ export interface WorkflowDefinition {
|
|
|
33
39
|
/** Ordered step list. */
|
|
34
40
|
steps: WorkflowStepDefinition[];
|
|
35
41
|
}
|
|
36
|
-
export declare const APPLICATION_CREATION_WORKFLOW_ID = "application-creation-
|
|
42
|
+
export declare const APPLICATION_CREATION_WORKFLOW_ID = "application-creation-v2";
|
|
37
43
|
/**
|
|
38
44
|
* The canonical application-creation workflow. Bumping the `id`
|
|
39
45
|
* suffix ("-v1" → "-v2") triggers a new set of step rows for any
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"application-creation.workflow.d.ts","sourceRoot":"","sources":["../../../../../../packages/core/src/application/workflows/application-creation.workflow.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"application-creation.workflow.d.ts","sourceRoot":"","sources":["../../../../../../packages/core/src/application/workflows/application-creation.workflow.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AAEH,MAAM,WAAW,sBAAsB;IACrC,yDAAyD;IACzD,OAAO,EAAE,MAAM,CAAC;IAChB,8BAA8B;IAC9B,KAAK,EAAE,MAAM,CAAC;IACd,iCAAiC;IACjC,WAAW,EAAE,MAAM,CAAC;IACpB,+DAA+D;IAC/D,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,kBAAkB;IACjC,sEAAsE;IACtE,EAAE,EAAE,MAAM,CAAC;IACX,yBAAyB;IACzB,KAAK,EAAE,sBAAsB,EAAE,CAAC;CACjC;AAED,eAAO,MAAM,gCAAgC,4BAA4B,CAAC;AAE1E;;;;;GAKG;AACH,eAAO,MAAM,6BAA6B,EAAE,kBAyG3C,CAAC"}
|
|
@@ -1,11 +1,17 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Application-creation workflow definition.
|
|
3
3
|
*
|
|
4
|
-
* The
|
|
4
|
+
* The eight steps Shep walks every new application through, with the
|
|
5
5
|
* friendly non-technical title/description the user sees in the
|
|
6
6
|
* tracker card AND the focused agent-facing prompt the orchestrator
|
|
7
7
|
* sends for that step.
|
|
8
8
|
*
|
|
9
|
+
* History note: an earlier version had separate `plan` and `content`
|
|
10
|
+
* steps. They produced agent text confirmations with no actual tool
|
|
11
|
+
* work, leaving lonely "title-only" cards in the tracker. Both have
|
|
12
|
+
* been folded into the `components` step which now plans, builds,
|
|
13
|
+
* and writes real content in a single agent turn.
|
|
14
|
+
*
|
|
9
15
|
* Key design notes:
|
|
10
16
|
* - The orchestrator (`RunWorkflowUseCase`) sends each step's
|
|
11
17
|
* `prompt` as a user turn against the SAME interactive session,
|
|
@@ -17,7 +23,7 @@
|
|
|
17
23
|
* - Titles and descriptions are user-facing. Never put code, paths,
|
|
18
24
|
* or jargon in them — they show in step cards next to avatars.
|
|
19
25
|
*/
|
|
20
|
-
export const APPLICATION_CREATION_WORKFLOW_ID = 'application-creation-
|
|
26
|
+
export const APPLICATION_CREATION_WORKFLOW_ID = 'application-creation-v2';
|
|
21
27
|
/**
|
|
22
28
|
* The canonical application-creation workflow. Bumping the `id`
|
|
23
29
|
* suffix ("-v1" → "-v2") triggers a new set of step rows for any
|
|
@@ -57,34 +63,18 @@ export const APPLICATION_CREATION_WORKFLOW = {
|
|
|
57
63
|
'When done, reply with a short plain-English confirmation (one sentence).',
|
|
58
64
|
].join('\n'),
|
|
59
65
|
},
|
|
60
|
-
{
|
|
61
|
-
stepKey: 'plan',
|
|
62
|
-
title: 'Sketching the app',
|
|
63
|
-
description: 'Planning screens and data',
|
|
64
|
-
prompt: [
|
|
65
|
-
'Plan the app internally: what screens, what components, what data shapes. Do NOT write any code in this step and do NOT share the plan with the user — keep it for yourself so you can build confidently in the next step.',
|
|
66
|
-
'',
|
|
67
|
-
'Reply with a single short plain-English sentence confirming you have a plan.',
|
|
68
|
-
].join('\n'),
|
|
69
|
-
},
|
|
70
66
|
{
|
|
71
67
|
stepKey: 'components',
|
|
72
68
|
title: 'Building the pieces',
|
|
73
|
-
description: '
|
|
69
|
+
description: 'Designing and creating reusable parts',
|
|
74
70
|
prompt: [
|
|
75
|
-
|
|
71
|
+
"Plan the app first — what screens it has, what reusable components those screens need, what data shapes flow between them. Keep the plan in your head; do NOT share it with the user, the next step's output is what they will see.",
|
|
76
72
|
'',
|
|
77
|
-
'
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
{
|
|
81
|
-
stepKey: 'content',
|
|
82
|
-
title: 'Adding realistic content',
|
|
83
|
-
description: 'Writing copy and sample data',
|
|
84
|
-
prompt: [
|
|
85
|
-
'Populate the components with realistic content: real-sounding names, dates, prices, copy. Lorem ipsum is forbidden.',
|
|
73
|
+
'Then build the leaf components bottom-up. Every component is a real `.tsx` file under `src/`. Small reusable pieces first, then larger compositions. Do NOT wire routing or full-page composition here — that is the next step.',
|
|
74
|
+
'',
|
|
75
|
+
'Populate every component with realistic, hand-crafted content the moment you create it: real-sounding names, dates, prices, copy. Lorem ipsum is FORBIDDEN.',
|
|
86
76
|
'',
|
|
87
|
-
'
|
|
77
|
+
'When the components are drafted with their real content, reply with a one-sentence confirmation.',
|
|
88
78
|
].join('\n'),
|
|
89
79
|
},
|
|
90
80
|
{
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"node-application-file-system.service.d.ts","sourceRoot":"","sources":["../../../../../../../packages/core/src/infrastructure/services/filesystem/node-application-file-system.service.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAOH,OAAO,EAGL,KAAK,kBAAkB,EACvB,KAAK,aAAa,EAClB,KAAK,6BAA6B,EAClC,KAAK,oBAAoB,EACzB,KAAK,cAAc,EACnB,KAAK,aAAa,EACnB,MAAM,yFAAyF,CAAC;AAoFjG,qBACa,gCAAiC,YAAW,6BAA6B;;IAC9E,QAAQ,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,CAAC;IAsElD,QAAQ,CAAC,QAAQ,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,CAAC;IAkDzE,cAAc,CAAC,QAAQ,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,oBAAoB,CAAC;IAqCrF,SAAS,CAAC,QAAQ,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAavF,KAAK,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,kBAAkB,GAAG,aAAa;
|
|
1
|
+
{"version":3,"file":"node-application-file-system.service.d.ts","sourceRoot":"","sources":["../../../../../../../packages/core/src/infrastructure/services/filesystem/node-application-file-system.service.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAOH,OAAO,EAGL,KAAK,kBAAkB,EACvB,KAAK,aAAa,EAClB,KAAK,6BAA6B,EAClC,KAAK,oBAAoB,EACzB,KAAK,cAAc,EACnB,KAAK,aAAa,EACnB,MAAM,yFAAyF,CAAC;AAoFjG,qBACa,gCAAiC,YAAW,6BAA6B;;IAC9E,QAAQ,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,CAAC;IAsElD,QAAQ,CAAC,QAAQ,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,CAAC;IAkDzE,cAAc,CAAC,QAAQ,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,oBAAoB,CAAC;IAqCrF,SAAS,CAAC,QAAQ,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAavF,KAAK,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,kBAAkB,GAAG,aAAa;CAqDrE"}
|
|
@@ -249,7 +249,13 @@ let NodeApplicationFileSystemService = class NodeApplicationFileSystemService {
|
|
|
249
249
|
const topSegment = rel.split('/')[0];
|
|
250
250
|
if (ALWAYS_IGNORED_DIRS.has(topSegment))
|
|
251
251
|
return;
|
|
252
|
-
|
|
252
|
+
// `kind` is always assigned in the try/catch below — either
|
|
253
|
+
// 'modified' if the path still exists on disk, or 'deleted'
|
|
254
|
+
// if the stat fails. Initialising it here with a placeholder
|
|
255
|
+
// would be dead code that lint correctly flags as a useless
|
|
256
|
+
// assignment. The `!` on the read below acknowledges that
|
|
257
|
+
// both branches set it before listener() runs.
|
|
258
|
+
let kind;
|
|
253
259
|
let isDirectory = false;
|
|
254
260
|
try {
|
|
255
261
|
const st = fs.statSync(path.join(absRoot, rel));
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import type { UpdateApplicationFields } from '../../../../../packages/core/src/application/use-cases/applications/update-application.use-case.js';
|
|
2
|
+
export declare function updateApplication(id: string, fields: UpdateApplicationFields): Promise<{
|
|
3
|
+
error?: string;
|
|
4
|
+
}>;
|
|
5
|
+
//# sourceMappingURL=update-application.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"update-application.d.ts","sourceRoot":"","sources":["../../../../../../src/presentation/web/app/actions/update-application.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EACV,uBAAuB,EAExB,MAAM,6EAA6E,CAAC;AAErF,wBAAsB,iBAAiB,CACrC,EAAE,EAAE,MAAM,EACV,MAAM,EAAE,uBAAuB,GAC9B,OAAO,CAAC;IAAE,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,CAiB7B"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
'use server';
|
|
2
|
+
import { revalidatePath } from 'next/cache';
|
|
3
|
+
import { resolve } from '../../lib/server-container.js';
|
|
4
|
+
export async function updateApplication(id, fields) {
|
|
5
|
+
if (!id?.trim()) {
|
|
6
|
+
return { error: 'Application ID is required' };
|
|
7
|
+
}
|
|
8
|
+
try {
|
|
9
|
+
const useCase = resolve('UpdateApplicationUseCase');
|
|
10
|
+
await useCase.execute(id, fields);
|
|
11
|
+
// Refresh server components that read the application — the
|
|
12
|
+
// application page itself, and the dashboard graph data.
|
|
13
|
+
revalidatePath(`/application/${id}`);
|
|
14
|
+
revalidatePath('/');
|
|
15
|
+
return {};
|
|
16
|
+
}
|
|
17
|
+
catch (error) {
|
|
18
|
+
const message = error instanceof Error ? error.message : 'Failed to update application';
|
|
19
|
+
return { error: message };
|
|
20
|
+
}
|
|
21
|
+
}
|
|
@@ -61,7 +61,7 @@ const UserMessage = () => {
|
|
|
61
61
|
if (text.startsWith(INTERACTION_PREFIX)) {
|
|
62
62
|
return _jsx(InteractionResponseMessage, { text: text });
|
|
63
63
|
}
|
|
64
|
-
return (_jsxs(MessagePrimitive.Root, { className: "group flex w-full items-start gap-2.5 px-4 py-0.5", children: [_jsx("div", { className: "mt-0.5 flex h-6 w-6 shrink-0 items-center justify-center rounded-full bg-violet-500/15", children: _jsx(User, { className: "h-3.5 w-3.5 text-violet-500" }) }), _jsxs("div", { className: "flex max-w-[85%] min-w-0 flex-col gap-0.5", children: [_jsx("div", { className: "text-foreground mt-px overflow-hidden rounded-2xl rounded-tl-sm border border-violet-500/15 bg-violet-500/8 px-4 py-2 text-sm leading-relaxed break-words shadow-sm backdrop-blur-md", children: _jsx(MessagePrimitive.Content, { components: { Text: UserMessageText } }) }), _jsxs("div", { className: "flex items-center gap-1.5 opacity-0 transition-opacity group-hover:opacity-100", children: [_jsx(MessageMeta, {}), _jsx(ActionBarPrimitive.Root, { className: "flex items-center gap-1", children: _jsx(ActionBarPrimitive.Copy, { asChild: true, children: _jsx(IconButton, { tooltip: "Copy", children: _jsx(Copy, {}) }) }) })] })] })] }));
|
|
64
|
+
return (_jsxs(MessagePrimitive.Root, { className: "group animate-in fade-in-0 slide-in-from-bottom-1 flex w-full items-start gap-2.5 px-4 py-0.5 duration-300 ease-out", children: [_jsx("div", { className: "mt-0.5 flex h-6 w-6 shrink-0 items-center justify-center rounded-full bg-violet-500/15", children: _jsx(User, { className: "h-3.5 w-3.5 text-violet-500" }) }), _jsxs("div", { className: "flex max-w-[85%] min-w-0 flex-col gap-0.5", children: [_jsx("div", { className: "text-foreground mt-px overflow-hidden rounded-2xl rounded-tl-sm border border-violet-500/15 bg-violet-500/8 px-4 py-2 text-sm leading-relaxed break-words shadow-sm backdrop-blur-md", children: _jsx(MessagePrimitive.Content, { components: { Text: UserMessageText } }) }), _jsxs("div", { className: "flex items-center gap-1.5 opacity-0 transition-opacity group-hover:opacity-100", children: [_jsx(MessageMeta, {}), _jsx(ActionBarPrimitive.Root, { className: "flex items-center gap-1", children: _jsx(ActionBarPrimitive.Copy, { asChild: true, children: _jsx(IconButton, { tooltip: "Copy", children: _jsx(Copy, {}) }) }) })] })] })] }));
|
|
65
65
|
};
|
|
66
66
|
/** Compact green bubble showing the user's selections from an AskUserQuestion interaction. */
|
|
67
67
|
function InteractionResponseMessage({ text }) {
|
|
@@ -76,7 +76,7 @@ function InteractionResponseMessage({ text }) {
|
|
|
76
76
|
}, [text]);
|
|
77
77
|
if (!parsed)
|
|
78
78
|
return null;
|
|
79
|
-
return (_jsxs(MessagePrimitive.Root, { className: "group flex w-full items-start gap-2.5 px-4 py-0.5", children: [_jsx("div", { className: "bg-muted flex h-6 w-6 shrink-0 items-center justify-center rounded-full", children: _jsx(Check, { className: "h-3.5 w-3.5 text-emerald-600 dark:text-emerald-400" }) }), _jsxs("div", { className: "flex min-w-0 flex-1 flex-col gap-0.5", children: [_jsx("div", { className: "text-foreground mt-px flex flex-wrap items-center gap-x-4 gap-y-1 rounded-2xl rounded-tl-sm border border-emerald-600/20 bg-emerald-50/50 px-4 py-2 text-sm shadow-sm dark:border-emerald-500/20 dark:bg-emerald-950/20", children: parsed.questions.map((q) => (_jsxs("span", { className: "flex items-center gap-2", children: [_jsx("span", { className: "inline-flex shrink-0 items-center rounded-full bg-emerald-100 px-2 py-0.5 text-[10px] font-semibold tracking-wider text-emerald-700 uppercase dark:bg-emerald-900/50 dark:text-emerald-400", children: q.header }), _jsx("span", { className: "text-muted-foreground text-xs", children: parsed.answers[q.question] || 'No answer' })] }, q.question))) }), _jsxs("div", { className: "flex items-center gap-1.5 opacity-0 transition-opacity group-hover:opacity-100", children: [_jsx(MessageMeta, {}), _jsx(ActionBarPrimitive.Root, { className: "flex items-center gap-1", children: _jsx(ActionBarPrimitive.Copy, { asChild: true, children: _jsx(IconButton, { tooltip: "Copy", children: _jsx(Copy, {}) }) }) })] })] })] }));
|
|
79
|
+
return (_jsxs(MessagePrimitive.Root, { className: "group animate-in fade-in-0 slide-in-from-bottom-1 flex w-full items-start gap-2.5 px-4 py-0.5 duration-300 ease-out", children: [_jsx("div", { className: "bg-muted flex h-6 w-6 shrink-0 items-center justify-center rounded-full", children: _jsx(Check, { className: "h-3.5 w-3.5 text-emerald-600 dark:text-emerald-400" }) }), _jsxs("div", { className: "flex min-w-0 flex-1 flex-col gap-0.5", children: [_jsx("div", { className: "text-foreground mt-px flex flex-wrap items-center gap-x-4 gap-y-1 rounded-2xl rounded-tl-sm border border-emerald-600/20 bg-emerald-50/50 px-4 py-2 text-sm shadow-sm dark:border-emerald-500/20 dark:bg-emerald-950/20", children: parsed.questions.map((q) => (_jsxs("span", { className: "flex items-center gap-2", children: [_jsx("span", { className: "inline-flex shrink-0 items-center rounded-full bg-emerald-100 px-2 py-0.5 text-[10px] font-semibold tracking-wider text-emerald-700 uppercase dark:bg-emerald-900/50 dark:text-emerald-400", children: q.header }), _jsx("span", { className: "text-muted-foreground text-xs", children: parsed.answers[q.question] || 'No answer' })] }, q.question))) }), _jsxs("div", { className: "flex items-center gap-1.5 opacity-0 transition-opacity group-hover:opacity-100", children: [_jsx(MessageMeta, {}), _jsx(ActionBarPrimitive.Root, { className: "flex items-center gap-1", children: _jsx(ActionBarPrimitive.Copy, { asChild: true, children: _jsx(IconButton, { tooltip: "Copy", children: _jsx(Copy, {}) }) }) })] })] })] }));
|
|
80
80
|
}
|
|
81
81
|
function UserMessageText({ text }) {
|
|
82
82
|
return _jsx("span", { className: "whitespace-pre-wrap", children: text });
|
|
@@ -94,9 +94,9 @@ const AssistantMessage = () => {
|
|
|
94
94
|
const rawText = firstPart && 'text' in firstPart ? firstPart.text : '';
|
|
95
95
|
const toolEvent = rawText ? parseToolEvent(rawText) : null;
|
|
96
96
|
if (toolEvent) {
|
|
97
|
-
return (_jsxs(MessagePrimitive.Root, { className: "group flex w-full items-start gap-2.5 px-4 py-0.5", children: [_jsx("div", { className: "text-muted-foreground/40 mt-1 flex h-6 w-6 shrink-0 items-center justify-center", children: _jsx(Bot, { className: "h-3 w-3" }) }), _jsx("div", { className: "flex min-w-0 flex-1 items-center py-0.5", children: _jsx(ToolBubble, { text: rawText }) })] }));
|
|
97
|
+
return (_jsxs(MessagePrimitive.Root, { className: "group animate-in fade-in-0 slide-in-from-bottom-1 flex w-full items-start gap-2.5 px-4 py-0.5 duration-300 ease-out", children: [_jsx("div", { className: "text-muted-foreground/40 mt-1 flex h-6 w-6 shrink-0 items-center justify-center", children: _jsx(Bot, { className: "h-3 w-3" }) }), _jsx("div", { className: "flex min-w-0 flex-1 items-center py-0.5", children: _jsx(ToolBubble, { text: rawText }) })] }));
|
|
98
98
|
}
|
|
99
|
-
return (_jsxs(MessagePrimitive.Root, { className: "group flex w-full items-start gap-2.5 px-4 py-0.5", children: [_jsx("div", { className: "bg-muted flex h-6 w-6 shrink-0 items-center justify-center rounded-full", children: _jsx(Bot, { className: "text-muted-foreground h-3.5 w-3.5" }) }), _jsxs("div", { className: "flex min-w-0 flex-1 flex-col gap-0.5", children: [_jsx("div", { className: "bg-muted/50 text-foreground mt-px overflow-hidden rounded-2xl rounded-tl-sm border border-white/5 px-4 py-2 text-sm leading-relaxed break-words shadow-sm backdrop-blur-md", children: _jsx(MessagePrimitive.Content, { components: { Text: AssistantMessageText } }) }), _jsxs("div", { className: "flex items-center gap-1.5 opacity-0 transition-opacity group-hover:opacity-100", children: [_jsx(MessageMeta, {}), _jsx(ActionBarPrimitive.Root, { className: "flex items-center gap-1", children: _jsx(ActionBarPrimitive.Copy, { asChild: true, children: _jsx(IconButton, { tooltip: "Copy", children: _jsx(Copy, {}) }) }) })] })] })] }));
|
|
99
|
+
return (_jsxs(MessagePrimitive.Root, { className: "group animate-in fade-in-0 slide-in-from-bottom-1 flex w-full items-start gap-2.5 px-4 py-0.5 duration-300 ease-out", children: [_jsx("div", { className: "bg-muted flex h-6 w-6 shrink-0 items-center justify-center rounded-full", children: _jsx(Bot, { className: "text-muted-foreground h-3.5 w-3.5" }) }), _jsxs("div", { className: "flex min-w-0 flex-1 flex-col gap-0.5", children: [_jsx("div", { className: "bg-muted/50 text-foreground mt-px overflow-hidden rounded-2xl rounded-tl-sm border border-white/5 px-4 py-2 text-sm leading-relaxed break-words shadow-sm backdrop-blur-md", children: _jsx(MessagePrimitive.Content, { components: { Text: AssistantMessageText } }) }), _jsxs("div", { className: "flex items-center gap-1.5 opacity-0 transition-opacity group-hover:opacity-100", children: [_jsx(MessageMeta, {}), _jsx(ActionBarPrimitive.Root, { className: "flex items-center gap-1", children: _jsx(ActionBarPrimitive.Copy, { asChild: true, children: _jsx(IconButton, { tooltip: "Copy", children: _jsx(Copy, {}) }) }) })] })] })] }));
|
|
100
100
|
};
|
|
101
101
|
// ── Collapsible code block ───────────────────────────────────────────────
|
|
102
102
|
const CODE_COLLAPSED_HEIGHT = 200; // px
|
package/dist/src/presentation/web/components/features/application-page/application-page.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"application-page.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/features/application-page/application-page.tsx"],"names":[],"mappings":"AAiBA,OAAO,KAAK,EAAE,WAAW,EAAqB,MAAM,sCAAsC,CAAC;AAC3F,OAAO,EAAE,eAAe,EAAE,MAAM,sCAAsC,CAAC;AACvE,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,sFAAsF,CAAC;AA8nBtH;;;;;;GAMG;AACH,MAAM,WAAW,yBAAyB;IACxC,KAAK,EAAE,eAAe,CAAC;IACvB,GAAG,EAAE,MAAM,GAAG,IAAI,CAAC;CACpB;AAED,MAAM,WAAW,oBAAoB;IACnC,WAAW,EAAE,WAAW,CAAC;IACzB;;;;OAIG;IACH,gBAAgB,CAAC,EAAE,SAAS,CAAC;IAC7B;;;;OAIG;IACH,iBAAiB,CAAC,EAAE,yBAAyB,CAAC;CAC/C;AAED,wBAAgB,eAAe,CAAC,EAAE,WAAW,EAAE,gBAAgB,EAAE,EAAE,oBAAoB,
|
|
1
|
+
{"version":3,"file":"application-page.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/features/application-page/application-page.tsx"],"names":[],"mappings":"AAiBA,OAAO,KAAK,EAAE,WAAW,EAAqB,MAAM,sCAAsC,CAAC;AAC3F,OAAO,EAAE,eAAe,EAAE,MAAM,sCAAsC,CAAC;AACvE,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,sFAAsF,CAAC;AA8nBtH;;;;;;GAMG;AACH,MAAM,WAAW,yBAAyB;IACxC,KAAK,EAAE,eAAe,CAAC;IACvB,GAAG,EAAE,MAAM,GAAG,IAAI,CAAC;CACpB;AAED,MAAM,WAAW,oBAAoB;IACnC,WAAW,EAAE,WAAW,CAAC;IACzB;;;;OAIG;IACH,gBAAgB,CAAC,EAAE,SAAS,CAAC;IAC7B;;;;OAIG;IACH,iBAAiB,CAAC,EAAE,yBAAyB,CAAC;CAC/C;AAED,wBAAgB,eAAe,CAAC,EAAE,WAAW,EAAE,gBAAgB,EAAE,EAAE,oBAAoB,2CAgGtF"}
|
|
@@ -313,7 +313,17 @@ export function ApplicationPage({ application, initialChatState }) {
|
|
|
313
313
|
// transition in the deploy hook then auto-switches
|
|
314
314
|
// the right pane to the Web preview, so the user
|
|
315
315
|
// lands on their running app with zero clicks.
|
|
316
|
-
|
|
316
|
+
//
|
|
317
|
+
// Important: the provider's default entry is
|
|
318
|
+
// `{ status: null }` when no dev server has ever run
|
|
319
|
+
// for this application, NOT `'Stopped'`. The previous
|
|
320
|
+
// `=== 'Stopped'` check silently did nothing on the
|
|
321
|
+
// very first completion of a freshly created app,
|
|
322
|
+
// which is exactly when auto-preview matters most.
|
|
323
|
+
// Trigger as long as we're not already Booting/Ready.
|
|
324
|
+
if (deploy.status !== DeploymentState.Ready &&
|
|
325
|
+
deploy.status !== DeploymentState.Booting &&
|
|
326
|
+
!deploy.deployLoading) {
|
|
317
327
|
void deploy.deploy();
|
|
318
328
|
}
|
|
319
329
|
} }), right: _jsx(ViewBody, { activeView: activeView, applicationId: application.id, terminalCwd: application.repositoryPath, deploy: deploy }) })] }));
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ChatTab.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/features/chat/ChatTab.tsx"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,sFAAsF,CAAC;AAUtH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AAG9D,MAAM,WAAW,YAAY;IAC3B,SAAS,EAAE,MAAM,CAAC;IAClB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,qEAAqE;IACrE,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,yEAAyE;IACzE,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB;;;OAGG;IACH,gBAAgB,CAAC,EAAE,SAAS,CAAC;IAC7B;;;;;OAKG;IACH,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB;;;;;OAKG;IACH,kBAAkB,CAAC,EAAE,MAAM,IAAI,CAAC;IAChC;;;;;;;;;;OAUG;IACH,mBAAmB,CAAC,EAAE,eAAe,EAAE,CAAC;CACzC;AAID,wBAAgB,OAAO,CAAC,EACtB,SAAS,EACT,YAAY,EACZ,YAAY,EACZ,YAAY,EACZ,gBAAgB,EAChB,UAAU,EACV,kBAAkB,EAClB,mBAAmB,GACpB,EAAE,YAAY,
|
|
1
|
+
{"version":3,"file":"ChatTab.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/features/chat/ChatTab.tsx"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,sFAAsF,CAAC;AAUtH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AAG9D,MAAM,WAAW,YAAY;IAC3B,SAAS,EAAE,MAAM,CAAC;IAClB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,qEAAqE;IACrE,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,yEAAyE;IACzE,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB;;;OAGG;IACH,gBAAgB,CAAC,EAAE,SAAS,CAAC;IAC7B;;;;;OAKG;IACH,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB;;;;;OAKG;IACH,kBAAkB,CAAC,EAAE,MAAM,IAAI,CAAC;IAChC;;;;;;;;;;OAUG;IACH,mBAAmB,CAAC,EAAE,eAAe,EAAE,CAAC;CACzC;AAID,wBAAgB,OAAO,CAAC,EACtB,SAAS,EACT,YAAY,EACZ,YAAY,EACZ,YAAY,EACZ,gBAAgB,EAChB,UAAU,EACV,kBAAkB,EAClB,mBAAmB,GACpB,EAAE,YAAY,2CAiLd"}
|
|
@@ -89,7 +89,7 @@ export function ChatTab({ featureId, worktreePath, initialAgent, initialModel, i
|
|
|
89
89
|
setOverrideAgent(agent);
|
|
90
90
|
setOverrideModel(model);
|
|
91
91
|
}, className: "w-55" }) }));
|
|
92
|
-
return (_jsxs("div", { className: "flex h-full min-h-0 flex-col", children: [hideHeader ? null : (_jsx(ChatHeader, { sessionInfo: sessionInfo, isAgentActive: status.isRunning, onClear: clearChat, debugMode: debugMode, onDebugToggle: IS_DEV ? setDebugMode : undefined })), _jsx("div", { className: "flex min-h-0 flex-1 flex-col", children: isChatLoading ? (_jsx(ChatSkeleton, {})) : (_jsx(AssistantRuntimeProvider, { runtime: runtime, children: _jsx(Thread, { composer: composer, hideEmpty: showTracker, beforeMessages: showTracker ? (_jsxs(_Fragment, { children: [initialRequestMessage ? (_jsx(InitialRequestBubble, { text: initialRequestMessage.content })) : null, _jsx(StepTracker, { steps: trackerSteps, collapsedSummary: stepProgress.hasPlan === true && stepProgress.allDone === true })] })) : undefined, afterMessages: pendingInteraction ? (_jsx(InteractionBubble, { interaction: pendingInteraction, onSubmit: respondToInteraction })) : undefined }) })) })] }));
|
|
92
|
+
return (_jsxs("div", { className: "flex h-full min-h-0 flex-col", children: [hideHeader ? null : (_jsx(ChatHeader, { sessionInfo: sessionInfo, isAgentActive: status.isRunning, onClear: clearChat, debugMode: debugMode, onDebugToggle: IS_DEV ? setDebugMode : undefined })), _jsx("div", { className: "flex min-h-0 flex-1 flex-col", children: isChatLoading ? (_jsx(ChatSkeleton, {})) : (_jsx(AssistantRuntimeProvider, { runtime: runtime, children: _jsx(Thread, { composer: composer, hideEmpty: showTracker, beforeMessages: showTracker ? (_jsxs(_Fragment, { children: [initialRequestMessage ? (_jsx(InitialRequestBubble, { text: initialRequestMessage.content })) : null, _jsx(StepTracker, { steps: trackerSteps, collapsedSummary: stepProgress.hasPlan === true && stepProgress.allDone === true, activeStepId: stepProgress.activeStepId, liveStatus: stepProgress.liveStatus })] })) : undefined, afterMessages: pendingInteraction ? (_jsx(InteractionBubble, { interaction: pendingInteraction, onSubmit: respondToInteraction })) : undefined }) })) })] }));
|
|
93
93
|
}
|
|
94
94
|
// ── Initial request bubble ──────────────────────────────────────────────────
|
|
95
95
|
//
|
|
@@ -100,7 +100,7 @@ export function ChatTab({ featureId, worktreePath, initialAgent, initialModel, i
|
|
|
100
100
|
// for the original ask that kicked off the workflow. Visuals match
|
|
101
101
|
// the real user bubble in `thread.tsx` so the swap is invisible.
|
|
102
102
|
function InitialRequestBubble({ text }) {
|
|
103
|
-
return (_jsxs("div", { className: "group flex w-full items-start gap-2.5 px-4 py-0.5", children: [_jsx("div", { className: "mt-0.5 flex h-6 w-6 shrink-0 items-center justify-center rounded-full bg-violet-500/15", children: _jsx(User, { className: "h-3.5 w-3.5 text-violet-500" }) }), _jsx("div", { className: "flex max-w-[85%] min-w-0 flex-col gap-0.5", children: _jsx("div", { className: "text-foreground mt-px overflow-hidden rounded-2xl rounded-tl-sm border border-violet-500/15 bg-violet-500/8 px-4 py-2 text-sm leading-relaxed break-words whitespace-pre-wrap shadow-sm backdrop-blur-md", children: text }) })] }));
|
|
103
|
+
return (_jsxs("div", { className: "group animate-in fade-in-0 slide-in-from-top-1 flex w-full items-start gap-2.5 px-4 py-0.5 duration-300 ease-out", children: [_jsx("div", { className: "mt-0.5 flex h-6 w-6 shrink-0 items-center justify-center rounded-full bg-violet-500/15", children: _jsx(User, { className: "h-3.5 w-3.5 text-violet-500" }) }), _jsx("div", { className: "flex max-w-[85%] min-w-0 flex-col gap-0.5", children: _jsx("div", { className: "text-foreground mt-px overflow-hidden rounded-2xl rounded-tl-sm border border-violet-500/15 bg-violet-500/8 px-4 py-2 text-sm leading-relaxed break-words whitespace-pre-wrap shadow-sm backdrop-blur-md", children: text }) })] }));
|
|
104
104
|
}
|
|
105
105
|
// ── Loading skeleton ────────────────────────────────────────────────────────
|
|
106
106
|
function ChatSkeleton() {
|
|
@@ -5,11 +5,24 @@ export interface StepTrackerProps {
|
|
|
5
5
|
/**
|
|
6
6
|
* When true, the tracker renders as a single collapsed "Initial
|
|
7
7
|
* setup complete" summary card. Clicking it expands the full
|
|
8
|
-
*
|
|
8
|
+
* 8-card breakdown inline. Used once the whole workflow has
|
|
9
9
|
* finished — the user is now past setup and typically wants
|
|
10
10
|
* the chat thread to breathe, not a tall tracker block.
|
|
11
11
|
*/
|
|
12
12
|
collapsedSummary?: boolean;
|
|
13
|
+
/**
|
|
14
|
+
* Id of the currently-running workflow step. Used to attach the
|
|
15
|
+
* `liveStatus` indicator to the right card so the agent's in-flight
|
|
16
|
+
* activity surfaces inline next to its spinner instead of as a
|
|
17
|
+
* floating bubble below the tracker.
|
|
18
|
+
*/
|
|
19
|
+
activeStepId?: string | null;
|
|
20
|
+
/**
|
|
21
|
+
* Short live-status string ("Thinking…", "Reading file X", a
|
|
22
|
+
* truncated chunk of the streaming reply). Rendered inline inside
|
|
23
|
+
* the running step card.
|
|
24
|
+
*/
|
|
25
|
+
liveStatus?: string | null;
|
|
13
26
|
}
|
|
14
27
|
/**
|
|
15
28
|
* Vertical list of workflow step cards with a status indicator,
|
|
@@ -19,5 +32,5 @@ export interface StepTrackerProps {
|
|
|
19
32
|
* while this step was active — the same bubble component the
|
|
20
33
|
* regular thread would have used, just grouped by step.
|
|
21
34
|
*/
|
|
22
|
-
export declare function StepTracker({ steps, className, collapsedSummary }: StepTrackerProps): import("react/jsx-runtime").JSX.Element | null;
|
|
35
|
+
export declare function StepTracker({ steps, className, collapsedSummary, activeStepId, liveStatus, }: StepTrackerProps): import("react/jsx-runtime").JSX.Element | null;
|
|
23
36
|
//# sourceMappingURL=StepTracker.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"StepTracker.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/features/chat/StepTracker.tsx"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"StepTracker.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/features/chat/StepTracker.tsx"],"names":[],"mappings":"AAUA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AAiC1D,MAAM,WAAW,gBAAgB;IAC/B,KAAK,EAAE,iBAAiB,EAAE,CAAC;IAC3B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB;;;;;;OAMG;IACH,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B;;;;;OAKG;IACH,YAAY,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B;;;;OAIG;IACH,UAAU,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CAC5B;AAED;;;;;;;GAOG;AACH,wBAAgB,WAAW,CAAC,EAC1B,KAAK,EACL,SAAS,EACT,gBAAgB,EAChB,YAAY,EACZ,UAAU,GACX,EAAE,gBAAgB,kDAwDlB"}
|
|
@@ -1,10 +1,26 @@
|
|
|
1
1
|
'use client';
|
|
2
2
|
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
3
3
|
import { useState } from 'react';
|
|
4
|
+
import { Collapsible } from 'radix-ui';
|
|
4
5
|
import { Check, ChevronDown, ChevronRight, Circle, AlertTriangle } from 'lucide-react';
|
|
6
|
+
import Markdown from 'react-markdown';
|
|
5
7
|
import { cn } from '../../../lib/utils.js';
|
|
6
8
|
import { Spinner } from '../../ui/spinner.js';
|
|
7
|
-
import { ToolBubble } from './tool-bubble/index.js';
|
|
9
|
+
import { ToolBubble, parseToolEvent } from './tool-bubble/index.js';
|
|
10
|
+
const markdownComponents = {
|
|
11
|
+
p: ({ children }) => _jsx("p", { className: "mb-2 leading-relaxed last:mb-0", children: children }),
|
|
12
|
+
strong: ({ children }) => _jsx("strong", { className: "font-semibold", children: children }),
|
|
13
|
+
em: ({ children }) => _jsx("em", { className: "italic", children: children }),
|
|
14
|
+
code: ({ children, className }) => className ? (_jsx("code", { className: `${className} text-[11px]`, children: children })) : (_jsx("code", { className: "bg-background/50 rounded-md px-1.5 py-0.5 font-mono text-[11px]", children: children })),
|
|
15
|
+
pre: ({ children }) => (_jsx("pre", { className: "bg-background/50 my-2 overflow-x-auto rounded-md p-3 font-mono text-[11px] leading-relaxed", children: children })),
|
|
16
|
+
ul: ({ children }) => _jsx("ul", { className: "mb-2 list-disc ps-4 last:mb-0", children: children }),
|
|
17
|
+
ol: ({ children }) => _jsx("ol", { className: "mb-2 list-decimal ps-4 last:mb-0", children: children }),
|
|
18
|
+
li: ({ children }) => _jsx("li", { className: "mb-0.5", children: children }),
|
|
19
|
+
h1: ({ children }) => _jsx("h1", { className: "mb-1 text-sm font-bold", children: children }),
|
|
20
|
+
h2: ({ children }) => _jsx("h2", { className: "mb-1 text-sm font-bold", children: children }),
|
|
21
|
+
h3: ({ children }) => _jsx("h3", { className: "mb-1 text-xs font-semibold", children: children }),
|
|
22
|
+
a: ({ children, href }) => (_jsx("a", { href: href, className: "text-blue-500 underline", target: "_blank", rel: "noopener noreferrer", children: children })),
|
|
23
|
+
};
|
|
8
24
|
/**
|
|
9
25
|
* Vertical list of workflow step cards with a status indicator,
|
|
10
26
|
* friendly title/description, and an expandable body. The expanded
|
|
@@ -13,7 +29,7 @@ import { ToolBubble } from './tool-bubble/index.js';
|
|
|
13
29
|
* while this step was active — the same bubble component the
|
|
14
30
|
* regular thread would have used, just grouped by step.
|
|
15
31
|
*/
|
|
16
|
-
export function StepTracker({ steps, className, collapsedSummary }) {
|
|
32
|
+
export function StepTracker({ steps, className, collapsedSummary, activeStepId, liveStatus, }) {
|
|
17
33
|
const [expandedOverride, setExpandedOverride] = useState(false);
|
|
18
34
|
if (steps.length === 0)
|
|
19
35
|
return null;
|
|
@@ -21,20 +37,74 @@ export function StepTracker({ steps, className, collapsedSummary }) {
|
|
|
21
37
|
const doneCount = steps.filter((s) => s.status === 'done').length;
|
|
22
38
|
return (_jsx("div", { className: cn('p-4', className), children: _jsxs("button", { type: "button", onClick: () => setExpandedOverride(true), className: "hover:bg-muted/40 border-border bg-background flex w-full items-center gap-3 rounded-lg border px-3 py-2.5 text-left transition-colors", children: [_jsx("div", { className: "flex h-6 w-6 shrink-0 items-center justify-center rounded-full bg-emerald-500 text-white", children: _jsx(Check, { className: "h-4 w-4", strokeWidth: 3 }) }), _jsxs("div", { className: "min-w-0 flex-1", children: [_jsx("div", { className: "text-sm font-medium", children: "Initial setup complete" }), _jsxs("div", { className: "text-muted-foreground text-xs", children: [doneCount, " of ", steps.length, " steps finished \u2014 click to review"] })] }), _jsx(ChevronRight, { className: "text-muted-foreground h-4 w-4 shrink-0" })] }) }));
|
|
23
39
|
}
|
|
24
|
-
return (_jsxs("ol", { className: cn('flex flex-col gap-2 p-4', className), children: [collapsedSummary ? (_jsx("li", { children: _jsxs("button", { type: "button", onClick: () => setExpandedOverride(false), className: "text-muted-foreground hover:text-foreground mb-1 inline-flex items-center gap-1 text-[10px] tracking-wide uppercase", children: [_jsx(ChevronDown, { className: "h-3 w-3" }), "Collapse setup"] }) })) : null, steps.map((step) => (
|
|
40
|
+
return (_jsxs("ol", { className: cn('flex flex-col gap-2 p-4', className), children: [collapsedSummary ? (_jsx("li", { children: _jsxs("button", { type: "button", onClick: () => setExpandedOverride(false), className: "text-muted-foreground hover:text-foreground mb-1 inline-flex items-center gap-1 text-[10px] tracking-wide uppercase", children: [_jsx(ChevronDown, { className: "h-3 w-3" }), "Collapse setup"] }) })) : null, steps.map((step, idx) => (
|
|
41
|
+
// Each card fades + slides in on mount, briefly staggered so
|
|
42
|
+
// the tracker assembles itself instead of popping in all at
|
|
43
|
+
// once. Capped at 6 indexes so very long step lists don't
|
|
44
|
+
// turn into a long cascade.
|
|
45
|
+
_jsx(StepCard, { step: step, liveStatus: step.definition.id === activeStepId ? (liveStatus ?? null) : null, mountIndex: idx }, step.definition.id)))] }));
|
|
25
46
|
}
|
|
26
|
-
function
|
|
47
|
+
function classifyMessages(messages) {
|
|
48
|
+
const items = [];
|
|
49
|
+
for (const m of messages) {
|
|
50
|
+
const content = m.content?.trim() ?? '';
|
|
51
|
+
if (!content)
|
|
52
|
+
continue;
|
|
53
|
+
if (parseToolEvent(content)) {
|
|
54
|
+
items.push({ kind: 'tool', message: m });
|
|
55
|
+
}
|
|
56
|
+
else {
|
|
57
|
+
items.push({ kind: 'text', message: m });
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
return items;
|
|
61
|
+
}
|
|
62
|
+
function StepCard({ step, liveStatus, mountIndex }) {
|
|
27
63
|
const [expanded, setExpanded] = useState(false);
|
|
28
64
|
const { status, definition, metadata, toolMessages } = step;
|
|
29
|
-
const summary = readString(metadata, 'summary');
|
|
30
65
|
const details = readStringArray(metadata, 'details');
|
|
31
66
|
const error = readString(metadata, 'error');
|
|
32
|
-
const
|
|
33
|
-
|
|
67
|
+
const items = classifyMessages(toolMessages);
|
|
68
|
+
// Note: the `summary` metadata field is populated by the orchestrator
|
|
69
|
+
// with `definition.title` on every step (see RunWorkflowUseCase), so
|
|
70
|
+
// it is always a duplicate of the card header and is intentionally
|
|
71
|
+
// NOT rendered — otherwise the expanded body would open with a copy
|
|
72
|
+
// of the title right above the real content.
|
|
73
|
+
const hasBody = items.length > 0 || details.length > 0 || !!error;
|
|
74
|
+
return (_jsx(Collapsible.Root, { asChild: true, open: expanded, onOpenChange: setExpanded, children: _jsxs("li", { className: cn(
|
|
75
|
+
// `transition-colors` glides the border + background tint
|
|
76
|
+
// when the status changes (pending → running → done) so the
|
|
77
|
+
// tracker feels alive instead of snapping.
|
|
78
|
+
'rounded-lg border transition-[background-color,border-color] duration-300 ease-out',
|
|
79
|
+
// Mount animation: each card slides + fades in. The
|
|
80
|
+
// staggered animationDelay below makes the whole tracker
|
|
81
|
+
// assemble itself instead of popping in.
|
|
82
|
+
'animate-in fade-in-0 slide-in-from-top-2',
|
|
83
|
+
// Green is reserved for the DONE state (the universal "this
|
|
84
|
+
// finished cleanly" signal). The running card uses Shep's
|
|
85
|
+
// indigo/violet brand accent so the in-progress step is
|
|
86
|
+
// visually distinct from anything that has already completed.
|
|
87
|
+
status === 'running' && 'border-violet-500/40 bg-violet-500/5', status === 'done' && 'border-border bg-background', status === 'pending' && 'border-border/40 bg-muted/20', status === 'failed' && 'border-red-500/40 bg-red-500/5', status === 'interrupted' && 'border-amber-500/40 bg-amber-500/5'), style: { animationDelay: `${Math.min(mountIndex, 6) * 40}ms`, animationDuration: '300ms' }, children: [_jsx(Collapsible.Trigger, { asChild: true, children: _jsxs("button", { type: "button", disabled: !hasBody, className: cn('flex w-full items-center gap-3 px-3 py-1.5 text-left transition-colors duration-200', hasBody && 'hover:bg-muted/40 cursor-pointer', !hasBody && 'cursor-default'), children: [_jsx(StatusIcon, { status: status }), _jsxs("div", { className: "flex min-w-0 flex-1 items-baseline gap-2", children: [_jsx("span", { className: cn('shrink-0 truncate text-sm font-medium transition-colors duration-300', status === 'pending' && 'text-muted-foreground/60'), children: definition.title }), liveStatus && status === 'running' ? (
|
|
88
|
+
// While the step is running, the live status preempts
|
|
89
|
+
// the static description — same slot, more useful
|
|
90
|
+
// information. The only place agent in-flight activity
|
|
91
|
+
// surfaces while the workflow is active. Color matches
|
|
92
|
+
// the card accent (violet) so green stays exclusive to
|
|
93
|
+
// "done". `key={liveStatus}` retriggers the fade-in
|
|
94
|
+
// every time the status text rotates, so consecutive
|
|
95
|
+
// tool calls feel like they tick instead of swap.
|
|
96
|
+
_jsxs("span", { className: "flex min-w-0 items-baseline gap-1.5 text-xs text-violet-700 dark:text-violet-300", children: [_jsx("span", { className: "inline-flex h-1 w-1 shrink-0 translate-y-[-1px] animate-pulse rounded-full bg-violet-500" }), _jsx("span", { className: "animate-in fade-in-0 slide-in-from-left-1 truncate duration-300", children: liveStatus }, liveStatus)] })) : definition.description ? (_jsx("span", { className: cn('min-w-0 truncate text-xs font-normal', status === 'pending' ? 'text-muted-foreground/40' : 'text-muted-foreground/70'), children: definition.description })) : null] }), items.length > 0 ? (_jsx("span", { className: "text-muted-foreground/60 animate-in fade-in-0 zoom-in-95 mr-1 shrink-0 text-[10px] tabular-nums duration-200", children: items.length }, items.length)) : null, hasBody ? (_jsx(ChevronRight, { className: cn('text-muted-foreground h-4 w-4 shrink-0 transition-transform duration-200 ease-out', expanded && 'rotate-90') })) : null] }) }), _jsx(Collapsible.Content, { className: cn('overflow-hidden',
|
|
97
|
+
// The keyframes (defined in globals.css) animate from
|
|
98
|
+
// height: 0 ↔ var(--radix-collapsible-content-height) so
|
|
99
|
+
// the body smoothly slides open and back. Both directions
|
|
100
|
+
// get matching cubic-bezier curves — one ease-out for
|
|
101
|
+
// open, one ease-in for close — so the motion never feels
|
|
102
|
+
// lopsided.
|
|
103
|
+
'data-[state=open]:animate-collapsible-down data-[state=closed]:animate-collapsible-up'), children: _jsxs("div", { className: "border-border/40 space-y-2 border-t px-3 py-2.5 text-xs", children: [error ? (_jsx("p", { className: "rounded bg-red-500/10 p-2 text-red-600 dark:text-red-400", children: error })) : null, details.length > 0 ? (_jsx("ul", { className: "text-muted-foreground list-disc space-y-0.5 ps-4", children: details.map((d) => (_jsx("li", { children: d }, d))) })) : null, items.length > 0 ? (_jsx("div", { className: "-mx-1 flex flex-col gap-1", children: items.map((item, idx) => item.kind === 'tool' ? (_jsx("div", { className: "animate-in fade-in-0 slide-in-from-top-1 duration-200", style: { animationDelay: `${Math.min(idx, 6) * 30}ms` }, children: _jsx(ToolBubble, { text: item.message.content }) }, item.message.id)) : (_jsx("div", { className: "text-foreground animate-in fade-in-0 slide-in-from-top-1 px-1 text-xs leading-relaxed duration-200", style: { animationDelay: `${Math.min(idx, 6) * 30}ms` }, children: _jsx(Markdown, { components: markdownComponents, children: item.message.content }) }, item.message.id))) })) : null] }) })] }) }));
|
|
34
104
|
}
|
|
35
105
|
function StatusIcon({ status }) {
|
|
36
106
|
if (status === 'running') {
|
|
37
|
-
return _jsx(Spinner, { size: "sm", className: "shrink-0 text-
|
|
107
|
+
return _jsx(Spinner, { size: "sm", className: "shrink-0 text-violet-500" });
|
|
38
108
|
}
|
|
39
109
|
if (status === 'done') {
|
|
40
110
|
return (_jsx("div", { className: "flex h-4 w-4 shrink-0 items-center justify-center rounded-full bg-emerald-500 text-white", children: _jsx(Check, { className: "h-3 w-3", strokeWidth: 3 }) }));
|
|
@@ -47,6 +47,14 @@ export interface EnhancedStepProgress {
|
|
|
47
47
|
steps: EnhancedStepState[];
|
|
48
48
|
activeStepId: string | null;
|
|
49
49
|
allDone: boolean;
|
|
50
|
+
/**
|
|
51
|
+
* Short live-status string ("Thinking…", "Reading file X", a chunk
|
|
52
|
+
* of the agent's streaming reply) that the running step card shows
|
|
53
|
+
* inline next to its spinner. NEVER rendered as a flat bubble — the
|
|
54
|
+
* step tracker is the only allowed surface for in-progress activity
|
|
55
|
+
* while a workflow is active.
|
|
56
|
+
*/
|
|
57
|
+
liveStatus: string | null;
|
|
50
58
|
}
|
|
51
59
|
interface SessionInfo {
|
|
52
60
|
pid: number | null;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useChatRuntime.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/features/chat/useChatRuntime.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,kBAAkB,EAAE,YAAY,EAAE,MAAM,sCAAsC,CAAC;AAG7F,4EAA4E;AAC5E,MAAM,WAAW,eAAe;IAC9B,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE;QACT,QAAQ,EAAE,MAAM,CAAC;QACjB,MAAM,EAAE,MAAM,CAAC;QACf,OAAO,EAAE;YAAE,KAAK,EAAE,MAAM,CAAC;YAAC,WAAW,EAAE,MAAM,CAAC;YAAC,OAAO,CAAC,EAAE,MAAM,CAAA;SAAE,EAAE,CAAC;QACpE,WAAW,EAAE,OAAO,CAAC;KACtB,EAAE,CAAC;CACL;AAED,oFAAoF;AACpF,UAAU,SAAS;IACjB,QAAQ,EAAE,kBAAkB,EAAE,CAAC;IAC/B,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,WAAW,EAAE,WAAW,GAAG,IAAI,CAAC;IAChC,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,kBAAkB,CAAC,EAAE,eAAe,GAAG,IAAI,CAAC;IAC5C,QAAQ,CAAC,EAAE,YAAY,GAAG,IAAI,CAAC;CAChC;AAED,mDAAmD;AACnD,MAAM,WAAW,YAAY;IAC3B,UAAU,EAAE,MAAM,CAAC;IACnB,KAAK,EAAE,YAAY,EAAE,CAAC;IACtB,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;CAC9B;AAED,2CAA2C;AAC3C,MAAM,WAAW,iBAAiB;IAChC,UAAU,EAAE;QACV,EAAE,EAAE,MAAM,CAAC;QACX,OAAO,EAAE,MAAM,CAAC;QAChB,KAAK,EAAE,MAAM,CAAC;QACd,WAAW,EAAE,MAAM,CAAC;KACrB,CAAC;IACF,MAAM,EAAE,SAAS,GAAG,SAAS,GAAG,MAAM,GAAG,QAAQ,GAAG,aAAa,CAAC;IAClE,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAAC;IACzC,YAAY,EAAE,kBAAkB,EAAE,CAAC;CACpC;AAED,+DAA+D;AAC/D,MAAM,WAAW,oBAAoB;IACnC,OAAO,EAAE,OAAO,CAAC;IACjB,KAAK,EAAE,iBAAiB,EAAE,CAAC;IAC3B,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,OAAO,EAAE,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"useChatRuntime.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/features/chat/useChatRuntime.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,kBAAkB,EAAE,YAAY,EAAE,MAAM,sCAAsC,CAAC;AAG7F,4EAA4E;AAC5E,MAAM,WAAW,eAAe;IAC9B,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE;QACT,QAAQ,EAAE,MAAM,CAAC;QACjB,MAAM,EAAE,MAAM,CAAC;QACf,OAAO,EAAE;YAAE,KAAK,EAAE,MAAM,CAAC;YAAC,WAAW,EAAE,MAAM,CAAC;YAAC,OAAO,CAAC,EAAE,MAAM,CAAA;SAAE,EAAE,CAAC;QACpE,WAAW,EAAE,OAAO,CAAC;KACtB,EAAE,CAAC;CACL;AAED,oFAAoF;AACpF,UAAU,SAAS;IACjB,QAAQ,EAAE,kBAAkB,EAAE,CAAC;IAC/B,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,WAAW,EAAE,WAAW,GAAG,IAAI,CAAC;IAChC,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,kBAAkB,CAAC,EAAE,eAAe,GAAG,IAAI,CAAC;IAC5C,QAAQ,CAAC,EAAE,YAAY,GAAG,IAAI,CAAC;CAChC;AAED,mDAAmD;AACnD,MAAM,WAAW,YAAY;IAC3B,UAAU,EAAE,MAAM,CAAC;IACnB,KAAK,EAAE,YAAY,EAAE,CAAC;IACtB,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;CAC9B;AAED,2CAA2C;AAC3C,MAAM,WAAW,iBAAiB;IAChC,UAAU,EAAE;QACV,EAAE,EAAE,MAAM,CAAC;QACX,OAAO,EAAE,MAAM,CAAC;QAChB,KAAK,EAAE,MAAM,CAAC;QACd,WAAW,EAAE,MAAM,CAAC;KACrB,CAAC;IACF,MAAM,EAAE,SAAS,GAAG,SAAS,GAAG,MAAM,GAAG,QAAQ,GAAG,aAAa,CAAC;IAClE,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAAC;IACzC,YAAY,EAAE,kBAAkB,EAAE,CAAC;CACpC;AAED,+DAA+D;AAC/D,MAAM,WAAW,oBAAoB;IACnC,OAAO,EAAE,OAAO,CAAC;IACjB,KAAK,EAAE,iBAAiB,EAAE,CAAC;IAC3B,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,OAAO,EAAE,OAAO,CAAC;IACjB;;;;;;OAMG;IACH,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;CAC3B;AA2BD,UAAU,WAAW;IACnB,GAAG,EAAE,MAAM,GAAG,IAAI,CAAC;IACnB,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,SAAS,EAAE,MAAM,CAAC;IAClB,cAAc,EAAE,MAAM,CAAC;IACvB,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,gBAAgB,EAAE,MAAM,GAAG,IAAI,CAAC;IAChC,iBAAiB,EAAE,MAAM,GAAG,IAAI,CAAC;CAClC;AAuCD,MAAM,WAAW,UAAU;IACzB,4EAA4E;IAC5E,SAAS,EAAE,OAAO,CAAC;IACnB,qFAAqF;IACrF,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;CAC3B;AAID,MAAM,WAAW,kBAAkB;IACjC,8EAA8E;IAC9E,gBAAgB,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,MAAM,CAAC;IAC/C,4EAA4E;IAC5E,aAAa,CAAC,EAAE,MAAM,IAAI,CAAC;IAC3B,kEAAkE;IAClE,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,iEAAiE;IACjE,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,6EAA6E;IAC7E,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB;;;;OAIG;IACH,gBAAgB,CAAC,EAAE,SAAS,CAAC;CAC9B;AAED,iEAAiE;AACjE,MAAM,WAAW,UAAU;IACzB,EAAE,EAAE,MAAM,CAAC;IACX,SAAS,EAAE,IAAI,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED;;;GAGG;AACH,wBAAgB,cAAc,CAC5B,SAAS,EAAE,MAAM,EACjB,YAAY,CAAC,EAAE,MAAM,EACrB,OAAO,CAAC,EAAE,kBAAkB;;;;;;;;oCA6pBV,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC;;;EAkEzC"}
|