@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.
Files changed (218) hide show
  1. package/dist/packages/core/src/application/use-cases/applications/create-application.use-case.d.ts.map +1 -1
  2. package/dist/packages/core/src/application/use-cases/applications/create-application.use-case.js +7 -4
  3. package/dist/packages/core/src/application/workflows/application-creation.workflow.d.ts +8 -2
  4. package/dist/packages/core/src/application/workflows/application-creation.workflow.d.ts.map +1 -1
  5. package/dist/packages/core/src/application/workflows/application-creation.workflow.js +14 -24
  6. package/dist/packages/core/src/infrastructure/services/filesystem/node-application-file-system.service.d.ts.map +1 -1
  7. package/dist/packages/core/src/infrastructure/services/filesystem/node-application-file-system.service.js +7 -1
  8. package/dist/src/presentation/web/app/actions/update-application.d.ts +5 -0
  9. package/dist/src/presentation/web/app/actions/update-application.d.ts.map +1 -0
  10. package/dist/src/presentation/web/app/actions/update-application.js +21 -0
  11. package/dist/src/presentation/web/components/assistant-ui/thread.js +4 -4
  12. package/dist/src/presentation/web/components/features/application-page/application-page.d.ts.map +1 -1
  13. package/dist/src/presentation/web/components/features/application-page/application-page.js +11 -1
  14. package/dist/src/presentation/web/components/features/chat/ChatTab.d.ts.map +1 -1
  15. package/dist/src/presentation/web/components/features/chat/ChatTab.js +2 -2
  16. package/dist/src/presentation/web/components/features/chat/StepTracker.d.ts +15 -2
  17. package/dist/src/presentation/web/components/features/chat/StepTracker.d.ts.map +1 -1
  18. package/dist/src/presentation/web/components/features/chat/StepTracker.js +78 -8
  19. package/dist/src/presentation/web/components/features/chat/useChatRuntime.d.ts +8 -0
  20. package/dist/src/presentation/web/components/features/chat/useChatRuntime.d.ts.map +1 -1
  21. package/dist/src/presentation/web/components/features/chat/useChatRuntime.js +108 -17
  22. package/dist/src/presentation/web/components/features/chat/workflow-placeholder.d.ts +1 -1
  23. package/dist/src/presentation/web/components/features/chat/workflow-placeholder.d.ts.map +1 -1
  24. package/dist/src/presentation/web/components/features/chat/workflow-placeholder.js +4 -6
  25. package/dist/tsconfig.build.tsbuildinfo +1 -1
  26. package/package.json +1 -1
  27. package/web/.next/BUILD_ID +1 -1
  28. package/web/.next/build-manifest.json +2 -2
  29. package/web/.next/fallback-build-manifest.json +2 -2
  30. package/web/.next/prerender-manifest.json +3 -3
  31. package/web/.next/required-server-files.js +2 -2
  32. package/web/.next/required-server-files.json +2 -2
  33. package/web/.next/server/app/(dashboard)/@drawer/adopt/page/server-reference-manifest.json +32 -32
  34. package/web/.next/server/app/(dashboard)/@drawer/adopt/page.js.nft.json +1 -1
  35. package/web/.next/server/app/(dashboard)/@drawer/adopt/page_client-reference-manifest.js +1 -1
  36. package/web/.next/server/app/(dashboard)/@drawer/chat/page/server-reference-manifest.json +30 -30
  37. package/web/.next/server/app/(dashboard)/@drawer/chat/page.js.nft.json +1 -1
  38. package/web/.next/server/app/(dashboard)/@drawer/chat/page_client-reference-manifest.js +1 -1
  39. package/web/.next/server/app/(dashboard)/@drawer/create/page/server-reference-manifest.json +33 -33
  40. package/web/.next/server/app/(dashboard)/@drawer/create/page.js.nft.json +1 -1
  41. package/web/.next/server/app/(dashboard)/@drawer/create/page_client-reference-manifest.js +1 -1
  42. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/[tab]/page/server-reference-manifest.json +41 -41
  43. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/[tab]/page.js.nft.json +1 -1
  44. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/[tab]/page_client-reference-manifest.js +1 -1
  45. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page/server-reference-manifest.json +41 -41
  46. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page.js.nft.json +1 -1
  47. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page_client-reference-manifest.js +1 -1
  48. package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/[tab]/page/server-reference-manifest.json +31 -31
  49. package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/[tab]/page.js.nft.json +1 -1
  50. package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/[tab]/page_client-reference-manifest.js +1 -1
  51. package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page/server-reference-manifest.json +31 -31
  52. package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page.js.nft.json +1 -1
  53. package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page_client-reference-manifest.js +1 -1
  54. package/web/.next/server/app/(dashboard)/chat/page/server-reference-manifest.json +30 -30
  55. package/web/.next/server/app/(dashboard)/chat/page.js.nft.json +1 -1
  56. package/web/.next/server/app/(dashboard)/chat/page_client-reference-manifest.js +1 -1
  57. package/web/.next/server/app/(dashboard)/create/page/server-reference-manifest.json +33 -33
  58. package/web/.next/server/app/(dashboard)/create/page.js.nft.json +1 -1
  59. package/web/.next/server/app/(dashboard)/create/page_client-reference-manifest.js +1 -1
  60. package/web/.next/server/app/(dashboard)/feature/[featureId]/[tab]/page/server-reference-manifest.json +41 -41
  61. package/web/.next/server/app/(dashboard)/feature/[featureId]/[tab]/page.js.nft.json +1 -1
  62. package/web/.next/server/app/(dashboard)/feature/[featureId]/[tab]/page_client-reference-manifest.js +1 -1
  63. package/web/.next/server/app/(dashboard)/feature/[featureId]/page/server-reference-manifest.json +41 -41
  64. package/web/.next/server/app/(dashboard)/feature/[featureId]/page.js.nft.json +1 -1
  65. package/web/.next/server/app/(dashboard)/feature/[featureId]/page_client-reference-manifest.js +1 -1
  66. package/web/.next/server/app/(dashboard)/page/server-reference-manifest.json +30 -30
  67. package/web/.next/server/app/(dashboard)/page.js.nft.json +1 -1
  68. package/web/.next/server/app/(dashboard)/page_client-reference-manifest.js +1 -1
  69. package/web/.next/server/app/(dashboard)/repository/[repositoryId]/[tab]/page/server-reference-manifest.json +31 -31
  70. package/web/.next/server/app/(dashboard)/repository/[repositoryId]/[tab]/page.js.nft.json +1 -1
  71. package/web/.next/server/app/(dashboard)/repository/[repositoryId]/[tab]/page_client-reference-manifest.js +1 -1
  72. package/web/.next/server/app/(dashboard)/repository/[repositoryId]/page/server-reference-manifest.json +31 -31
  73. package/web/.next/server/app/(dashboard)/repository/[repositoryId]/page.js.nft.json +1 -1
  74. package/web/.next/server/app/(dashboard)/repository/[repositoryId]/page_client-reference-manifest.js +1 -1
  75. package/web/.next/server/app/_global-error.html +2 -2
  76. package/web/.next/server/app/_global-error.rsc +1 -1
  77. package/web/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +1 -1
  78. package/web/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  79. package/web/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  80. package/web/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  81. package/web/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  82. package/web/.next/server/app/_not-found/page/server-reference-manifest.json +7 -7
  83. package/web/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  84. package/web/.next/server/app/api/attachments/preview/route.js.nft.json +1 -1
  85. package/web/.next/server/app/api/evidence/route.js.nft.json +1 -1
  86. package/web/.next/server/app/api/graph-data/route.js.nft.json +1 -1
  87. package/web/.next/server/app/api/interactive/chat/[featureId]/messages/route.js.nft.json +1 -1
  88. package/web/.next/server/app/application/[id]/page/server-reference-manifest.json +15 -15
  89. package/web/.next/server/app/application/[id]/page.js.nft.json +1 -1
  90. package/web/.next/server/app/application/[id]/page_client-reference-manifest.js +1 -1
  91. package/web/.next/server/app/features/page/server-reference-manifest.json +7 -7
  92. package/web/.next/server/app/features/page_client-reference-manifest.js +1 -1
  93. package/web/.next/server/app/settings/page/server-reference-manifest.json +10 -10
  94. package/web/.next/server/app/settings/page.js.nft.json +1 -1
  95. package/web/.next/server/app/settings/page_client-reference-manifest.js +1 -1
  96. package/web/.next/server/app/skills/page/server-reference-manifest.json +15 -15
  97. package/web/.next/server/app/skills/page.js.nft.json +1 -1
  98. package/web/.next/server/app/skills/page_client-reference-manifest.js +1 -1
  99. package/web/.next/server/app/tools/page/server-reference-manifest.json +13 -13
  100. package/web/.next/server/app/tools/page_client-reference-manifest.js +1 -1
  101. package/web/.next/server/app/version/page/server-reference-manifest.json +7 -7
  102. package/web/.next/server/app/version/page_client-reference-manifest.js +1 -1
  103. package/web/.next/server/chunks/[root-of-the-server]__a402b567._.js +1 -1
  104. package/web/.next/server/chunks/ssr/744ca_web_components_common_control-center-drawer_create-drawer-client_tsx_5e26fc0a._.js +1 -1
  105. package/web/.next/server/chunks/ssr/744ca_web_components_common_control-center-drawer_create-drawer-client_tsx_5e26fc0a._.js.map +1 -1
  106. package/web/.next/server/chunks/ssr/744ca_web_components_common_control-center-drawer_feature-drawer-client_tsx_e9755fc8._.js +2 -2
  107. package/web/.next/server/chunks/ssr/744ca_web_components_common_control-center-drawer_feature-drawer-client_tsx_e9755fc8._.js.map +1 -1
  108. package/web/.next/server/chunks/ssr/[root-of-the-server]__013a0318._.js +1 -1
  109. package/web/.next/server/chunks/ssr/[root-of-the-server]__013a0318._.js.map +1 -1
  110. package/web/.next/server/chunks/ssr/[root-of-the-server]__17dadd08._.js +1 -1
  111. package/web/.next/server/chunks/ssr/[root-of-the-server]__17dadd08._.js.map +1 -1
  112. package/web/.next/server/chunks/ssr/[root-of-the-server]__1925bef0._.js +1 -1
  113. package/web/.next/server/chunks/ssr/[root-of-the-server]__1a9687c4._.js +1 -1
  114. package/web/.next/server/chunks/ssr/[root-of-the-server]__1a9687c4._.js.map +1 -1
  115. package/web/.next/server/chunks/ssr/[root-of-the-server]__24756fa9._.js +2 -2
  116. package/web/.next/server/chunks/ssr/[root-of-the-server]__24756fa9._.js.map +1 -1
  117. package/web/.next/server/chunks/ssr/[root-of-the-server]__4ee8be85._.js +1 -1
  118. package/web/.next/server/chunks/ssr/[root-of-the-server]__70986695._.js +1 -1
  119. package/web/.next/server/chunks/ssr/[root-of-the-server]__70986695._.js.map +1 -1
  120. package/web/.next/server/chunks/ssr/[root-of-the-server]__87bc4dac._.js +2 -2
  121. package/web/.next/server/chunks/ssr/[root-of-the-server]__87bc4dac._.js.map +1 -1
  122. package/web/.next/server/chunks/ssr/[root-of-the-server]__a5ea76a6._.js +1 -1
  123. package/web/.next/server/chunks/ssr/[root-of-the-server]__a5ea76a6._.js.map +1 -1
  124. package/web/.next/server/chunks/ssr/[root-of-the-server]__bb391c45._.js +1 -1
  125. package/web/.next/server/chunks/ssr/[root-of-the-server]__bb391c45._.js.map +1 -1
  126. package/web/.next/server/chunks/ssr/[root-of-the-server]__dd3e834e._.js +1 -1
  127. package/web/.next/server/chunks/ssr/[root-of-the-server]__dd3e834e._.js.map +1 -1
  128. package/web/.next/server/chunks/ssr/[root-of-the-server]__e265da61._.js +1 -1
  129. package/web/.next/server/chunks/ssr/[root-of-the-server]__f3ca7bea._.js +1 -1
  130. package/web/.next/server/chunks/ssr/[root-of-the-server]__f3ca7bea._.js.map +1 -1
  131. package/web/.next/server/chunks/ssr/_0277d3b5._.js +2 -2
  132. package/web/.next/server/chunks/ssr/_0277d3b5._.js.map +1 -1
  133. package/web/.next/server/chunks/ssr/{_936eb52f._.js → _36489f2b._.js} +2 -2
  134. package/web/.next/server/chunks/ssr/{_936eb52f._.js.map → _36489f2b._.js.map} +1 -1
  135. package/web/.next/server/chunks/ssr/_56b9d60f._.js +1 -1
  136. package/web/.next/server/chunks/ssr/_56b9d60f._.js.map +1 -1
  137. package/web/.next/server/chunks/ssr/{_a3f47267._.js → _63fc4647._.js} +2 -2
  138. package/web/.next/server/chunks/ssr/{_a3f47267._.js.map → _63fc4647._.js.map} +1 -1
  139. package/web/.next/server/chunks/ssr/{_cd03c60d._.js → _8caadb9a._.js} +2 -2
  140. package/web/.next/server/chunks/ssr/{_cd03c60d._.js.map → _8caadb9a._.js.map} +1 -1
  141. package/web/.next/server/chunks/ssr/_946a7fc6._.js +1 -1
  142. package/web/.next/server/chunks/ssr/_946a7fc6._.js.map +1 -1
  143. package/web/.next/server/chunks/ssr/{_f97bd21d._.js → _b8e8b690._.js} +2 -2
  144. package/web/.next/server/chunks/ssr/{_f97bd21d._.js.map → _b8e8b690._.js.map} +1 -1
  145. package/web/.next/server/chunks/ssr/{_854ae39b._.js → _d44d091a._.js} +2 -2
  146. package/web/.next/server/chunks/ssr/{_854ae39b._.js.map → _d44d091a._.js.map} +1 -1
  147. package/web/.next/server/chunks/ssr/_eff1b518._.js +1 -1
  148. package/web/.next/server/chunks/ssr/_eff1b518._.js.map +1 -1
  149. package/web/.next/server/chunks/ssr/_f227429a._.js +1 -1
  150. package/web/.next/server/chunks/ssr/_f227429a._.js.map +1 -1
  151. package/web/.next/server/chunks/ssr/_f86fc1bf._.js +1 -1
  152. package/web/.next/server/chunks/ssr/_f86fc1bf._.js.map +1 -1
  153. package/web/.next/server/chunks/ssr/_f8c55130._.js +1 -1
  154. package/web/.next/server/chunks/ssr/b1a17_presentation_web_components_features_settings_settings-page-client_tsx_6ed9d5f8._.js +1 -1
  155. package/web/.next/server/chunks/ssr/b1a17_presentation_web_components_features_settings_settings-page-client_tsx_6ed9d5f8._.js.map +1 -1
  156. package/web/.next/server/chunks/ssr/f3a1f_components_common_control-center-drawer_repository-drawer-client_tsx_39a00c03._.js +1 -1
  157. package/web/.next/server/chunks/ssr/f3a1f_components_common_control-center-drawer_repository-drawer-client_tsx_39a00c03._.js.map +1 -1
  158. package/web/.next/server/chunks/ssr/src_presentation_web_36f2bc45._.js +1 -1
  159. package/web/.next/server/chunks/ssr/src_presentation_web_36f2bc45._.js.map +1 -1
  160. package/web/.next/server/chunks/ssr/src_presentation_web_486908de._.js +1 -1
  161. package/web/.next/server/chunks/ssr/src_presentation_web_486908de._.js.map +1 -1
  162. package/web/.next/server/chunks/ssr/src_presentation_web_5c3596bc._.js +1 -1
  163. package/web/.next/server/chunks/ssr/src_presentation_web_5c3596bc._.js.map +1 -1
  164. package/web/.next/server/chunks/ssr/src_presentation_web_6159fef8._.js +1 -1
  165. package/web/.next/server/chunks/ssr/src_presentation_web_6159fef8._.js.map +1 -1
  166. package/web/.next/server/chunks/ssr/src_presentation_web_6326f81e._.js +1 -1
  167. package/web/.next/server/chunks/ssr/src_presentation_web_6326f81e._.js.map +1 -1
  168. package/web/.next/server/chunks/ssr/src_presentation_web_6b2fdcd8._.js +1 -1
  169. package/web/.next/server/chunks/ssr/src_presentation_web_6b2fdcd8._.js.map +1 -1
  170. package/web/.next/server/chunks/ssr/src_presentation_web_74703c9f._.js +1 -1
  171. package/web/.next/server/chunks/ssr/src_presentation_web_74703c9f._.js.map +1 -1
  172. package/web/.next/server/chunks/ssr/src_presentation_web_a8056dac._.js +1 -1
  173. package/web/.next/server/chunks/ssr/src_presentation_web_a8056dac._.js.map +1 -1
  174. package/web/.next/server/chunks/ssr/src_presentation_web_ad42cc73._.js +1 -1
  175. package/web/.next/server/chunks/ssr/src_presentation_web_ad42cc73._.js.map +1 -1
  176. package/web/.next/server/chunks/ssr/src_presentation_web_app_actions_open-ide_ts_baaca5d5._.js +3 -3
  177. package/web/.next/server/chunks/ssr/src_presentation_web_b00bfb08._.js +1 -1
  178. package/web/.next/server/chunks/ssr/src_presentation_web_b00bfb08._.js.map +1 -1
  179. package/web/.next/server/chunks/ssr/src_presentation_web_components_895e5bfa._.js +1 -1
  180. package/web/.next/server/chunks/ssr/src_presentation_web_components_895e5bfa._.js.map +1 -1
  181. package/web/.next/server/chunks/ssr/src_presentation_web_components_common_base-drawer_base-drawer_tsx_97dfbbc8._.js +1 -1
  182. package/web/.next/server/chunks/ssr/src_presentation_web_components_common_base-drawer_base-drawer_tsx_97dfbbc8._.js.map +1 -1
  183. package/web/.next/server/chunks/ssr/src_presentation_web_components_features_control-center_7ac3562e._.js +1 -1
  184. package/web/.next/server/chunks/ssr/src_presentation_web_components_features_control-center_7ac3562e._.js.map +1 -1
  185. package/web/.next/server/chunks/ssr/src_presentation_web_components_features_skills_8a174cac._.js +1 -1
  186. package/web/.next/server/chunks/ssr/src_presentation_web_components_features_skills_8a174cac._.js.map +1 -1
  187. package/web/.next/server/chunks/ssr/src_presentation_web_db9fa0c2._.js +1 -1
  188. package/web/.next/server/chunks/ssr/src_presentation_web_f1edcf5e._.js +1 -1
  189. package/web/.next/server/chunks/ssr/src_presentation_web_f1edcf5e._.js.map +1 -1
  190. package/web/.next/server/chunks/ssr/src_presentation_web_f9436804._.js +1 -1
  191. package/web/.next/server/chunks/ssr/src_presentation_web_f9436804._.js.map +1 -1
  192. package/web/.next/server/pages/500.html +2 -2
  193. package/web/.next/server/server-reference-manifest.js +1 -1
  194. package/web/.next/server/server-reference-manifest.json +54 -54
  195. package/web/.next/static/chunks/06b9d6dbf635c370.css +1 -0
  196. package/web/.next/static/chunks/1bc12075020723ed.js +1 -0
  197. package/web/.next/static/chunks/1fa1574b87bd2eb1.js +1 -0
  198. package/web/.next/static/chunks/{d763375b20e7a0d8.js → 26e2ca76ab6c38b4.js} +1 -1
  199. package/web/.next/static/chunks/{5caab310bd5ce5dc.js → 2fe20598e1b4793a.js} +3 -3
  200. package/web/.next/static/chunks/{2e1f0b1d26bd7f04.js → 490667b2a9bb58e2.js} +1 -1
  201. package/web/.next/static/chunks/{bb60b5e4b5e4bc39.js → 7849c6797be7c6ca.js} +2 -2
  202. package/web/.next/static/chunks/{f3a549aa7a4dc6d7.js → 7bc7028587490fff.js} +1 -1
  203. package/web/.next/static/chunks/{2374b4d7e456e10f.js → 8746807722de67a8.js} +1 -1
  204. package/web/.next/static/chunks/{71896d6be547a34c.js → 893a2a76546c66a7.js} +1 -1
  205. package/web/.next/static/chunks/{a59a4dbe37fde0a8.js → a1098522326428d1.js} +1 -1
  206. package/web/.next/static/chunks/{fc40fada6a6ed6f8.js → be89c20c257247ad.js} +1 -1
  207. package/web/.next/static/chunks/{b73ad92c421b72b9.js → c0bd3ffcf94d1845.js} +1 -1
  208. package/web/.next/static/chunks/{8e8a2db2aa138419.js → dfdcccf73de56960.js} +1 -1
  209. package/web/.next/static/chunks/{efd03eb92d09c9a1.js → e2f9e224d1fa1faa.js} +1 -1
  210. package/web/.next/static/chunks/{00aac0dd4073b6e8.js → e7da54dde18e7fb2.js} +2 -2
  211. package/web/.next/static/chunks/{f679709942c35216.js → f28aef9cf5107c4b.js} +1 -1
  212. package/web/.next/static/chunks/{40b69c5164b1c108.js → f6d47ff35d612852.js} +3 -3
  213. package/web/.next/static/chunks/7f7a032daa42a969.js +0 -1
  214. package/web/.next/static/chunks/c4ccddb6d9fabbd0.css +0 -1
  215. package/web/.next/static/chunks/c962f6d7c6928b67.js +0 -1
  216. /package/web/.next/static/{muO23uSysJM1bwu3hwEw- → GQFJf3UCD4D5C4NCn8eXl}/_buildManifest.js +0 -0
  217. /package/web/.next/static/{muO23uSysJM1bwu3hwEw- → GQFJf3UCD4D5C4NCn8eXl}/_clientMiddlewareManifest.json +0 -0
  218. /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;IAwG9E;;;;;;OAMG;YACW,gBAAgB;IAqC9B;;;;OAIG;YACW,6BAA6B;CA0B5C"}
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"}
@@ -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 slug (title-case). The random tag is
144
- // visible in the title that's intentional so users can disambiguate
145
- // multiple apps spawned from the same description at a glance.
146
- const name = toTitleCase(slug);
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 nine steps Shep walks every new application through, with 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-v1";
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;;;;;;;;;;;;;;;;;;GAkBG;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,kBAyH3C,CAAC"}
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 nine steps Shep walks every new application through, with 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-v1';
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: 'Creating reusable parts',
69
+ description: 'Designing and creating reusable parts',
74
70
  prompt: [
75
- 'Build the leaf components first — every one is a real `.tsx` file under `src/`. Work bottom-up: small reusable pieces before whole pages. Do not wire routing or full-page composition in this step.',
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
- 'When you have the core components drafted, reply with a one-sentence confirmation.',
78
- ].join('\n'),
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
- 'Reply with a one-sentence confirmation when the content is in.',
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;CA+CrE"}
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
- let kind = 'modified';
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
@@ -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,2CAoFtF"}
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
- if (deploy.status === DeploymentState.Stopped) {
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,2CA+Kd"}
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
- * 9-card breakdown inline. Used once the whole workflow has
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":"AAMA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AAG1D,MAAM,WAAW,gBAAgB;IAC/B,KAAK,EAAE,iBAAiB,EAAE,CAAC;IAC3B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB;;;;;;OAMG;IACH,gBAAgB,CAAC,EAAE,OAAO,CAAC;CAC5B;AAED;;;;;;;GAOG;AACH,wBAAgB,WAAW,CAAC,EAAE,KAAK,EAAE,SAAS,EAAE,gBAAgB,EAAE,EAAE,gBAAgB,kDA+CnF"}
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) => (_jsx(StepCard, { step: step }, step.definition.id)))] }));
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 StepCard({ step }) {
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 hasBody = !!summary || details.length > 0 || toolMessages.length > 0 || !!error;
33
- return (_jsxs("li", { className: cn('rounded-lg border transition-colors', status === 'running' && 'border-emerald-500/40 bg-emerald-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'), children: [_jsxs("button", { type: "button", onClick: () => hasBody && setExpanded((v) => !v), disabled: !hasBody, className: cn('flex w-full items-center gap-3 px-3 py-2.5 text-left', hasBody && 'hover:bg-muted/40 cursor-pointer', !hasBody && 'cursor-default'), children: [_jsx(StatusIcon, { status: status }), _jsxs("div", { className: "min-w-0 flex-1", children: [_jsx("div", { className: cn('truncate text-sm font-medium', status === 'pending' && 'text-muted-foreground/60'), children: definition.title }), definition.description ? (_jsx("div", { className: cn('truncate text-xs', status === 'pending' ? 'text-muted-foreground/40' : 'text-muted-foreground'), children: definition.description })) : null] }), toolMessages.length > 0 ? (_jsx("span", { className: "text-muted-foreground/60 mr-1 shrink-0 text-[10px] tabular-nums", children: toolMessages.length })) : null, hasBody ? (expanded ? (_jsx(ChevronDown, { className: "text-muted-foreground h-4 w-4 shrink-0" })) : (_jsx(ChevronRight, { className: "text-muted-foreground h-4 w-4 shrink-0" }))) : null] }), expanded && hasBody ? (_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, summary ? _jsx("p", { className: "text-foreground", children: summary }) : 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, toolMessages.length > 0 ? (_jsx("div", { className: "-mx-1 flex flex-col gap-1", children: toolMessages.map((m) => (_jsx(ToolBubble, { text: m.content }, m.id))) })) : null] })) : null] }));
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-emerald-500" });
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":"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"}
1
+ {"version":3,"file":"useChatRuntime.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/features/chat/useChatRuntime.ts"],"names":[],"mappings":"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"}