@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
@@ -366,8 +366,17 @@ export function useChatRuntime(featureId, worktreePath, options) {
366
366
  // Cancel in-flight refetches so our optimistic update isn't overwritten
367
367
  await queryClient.cancelQueries({ queryKey: chatQueryKey(featureId) });
368
368
  const previous = queryClient.getQueryData(chatQueryKey(featureId));
369
- // Optimistically add user message
369
+ // Optimistically add user message. CRITICAL: spread `old` first
370
+ // and only override `messages` (and clear `streamingText`). The
371
+ // earlier version rebuilt the object field-by-field and silently
372
+ // dropped `workflow` + `turnStatus`, which made `hasPlan` flip
373
+ // to false for one render, briefly expanding the workflow step
374
+ // tracker (it lost its `collapsedSummary` flag when allDone
375
+ // turned undefined) before the next refetch reinstated it. The
376
+ // user saw a flicker of the full step list every time they typed
377
+ // a follow-up message after the workflow finished.
370
378
  queryClient.setQueryData(chatQueryKey(featureId), (old) => ({
379
+ ...(old ?? { sessionStatus: 'booting', sessionInfo: null }),
371
380
  messages: [
372
381
  ...(old?.messages ?? []),
373
382
  {
@@ -379,9 +388,7 @@ export function useChatRuntime(featureId, worktreePath, options) {
379
388
  updatedAt: new Date(),
380
389
  },
381
390
  ],
382
- sessionStatus: old?.sessionStatus ?? 'booting',
383
391
  streamingText: null,
384
- sessionInfo: old?.sessionInfo ?? null,
385
392
  }));
386
393
  return { previous };
387
394
  },
@@ -423,14 +430,28 @@ export function useChatRuntime(featureId, worktreePath, options) {
423
430
  const stepProgress = useMemo(() => {
424
431
  const workflow = chatState?.workflow ?? null;
425
432
  if (!workflow || workflow.steps.length === 0) {
426
- return { hasPlan: false, steps: [], activeStepId: null, allDone: false };
433
+ return {
434
+ hasPlan: false,
435
+ steps: [],
436
+ activeStepId: null,
437
+ allDone: false,
438
+ liveStatus: null,
439
+ };
427
440
  }
428
- // Group messages by their persisted stepId.
441
+ // Group messages by their persisted stepId. Only assistant messages
442
+ // are surfaced in the tracker — the orchestrator persists each step's
443
+ // prompt as a `user`-role row with the step's id (RunWorkflowUseCase
444
+ // step 2+) and that row is an internal orchestration detail, not
445
+ // something the user typed or the agent produced. Including it would
446
+ // inflate every step's badge count by 1 and dump the raw prompt into
447
+ // the expanded body.
429
448
  const byStep = new Map();
430
449
  for (const m of messages) {
431
450
  const sid = m.stepId;
432
451
  if (!sid)
433
452
  continue;
453
+ if (m.role !== InteractiveMessageRole.assistant)
454
+ continue;
434
455
  const list = byStep.get(sid) ?? [];
435
456
  list.push(m);
436
457
  byStep.set(sid, list);
@@ -447,13 +468,47 @@ export function useChatRuntime(featureId, worktreePath, options) {
447
468
  toolMessages: byStep.get(s.id) ?? [],
448
469
  }));
449
470
  const allDone = steps.length > 0 && steps.every((s) => s.status === 'done');
471
+ // Live status string for the running step card. Order of fallback
472
+ // mirrors the old flat-thread streaming bubble: tool / status log
473
+ // first (most informative — "Reading file X"), then a short prefix
474
+ // of the streaming reply text, then the generic "Thinking…" while
475
+ // we wait for the first chunk. Truncated to one line so it fits
476
+ // inline next to the spinner.
477
+ const trimmedStream = backendStreamingText?.trim() ?? '';
478
+ const trimmedLocal = streamingText?.trim() ?? '';
479
+ const streamPreview = (trimmedLocal || trimmedStream).split('\n')[0]?.slice(0, 80) ?? '';
480
+ let liveStatus = null;
481
+ if (allDone) {
482
+ liveStatus = null;
483
+ }
484
+ else if (statusLog) {
485
+ liveStatus = statusLog;
486
+ }
487
+ else if (streamPreview) {
488
+ liveStatus = streamPreview;
489
+ }
490
+ else if (backendTurnStatus === 'processing' ||
491
+ awaitingResponse ||
492
+ sessionStatus === 'booting') {
493
+ liveStatus = sessionStatus === 'booting' ? 'Waking up…' : 'Thinking…';
494
+ }
450
495
  return {
451
496
  hasPlan: true,
452
497
  steps,
453
498
  activeStepId: workflow.currentStepId,
454
499
  allDone,
500
+ liveStatus,
455
501
  };
456
- }, [chatState?.workflow, messages]);
502
+ }, [
503
+ chatState?.workflow,
504
+ messages,
505
+ statusLog,
506
+ streamingText,
507
+ backendStreamingText,
508
+ backendTurnStatus,
509
+ awaitingResponse,
510
+ sessionStatus,
511
+ ]);
457
512
  // ── Initial request — the VERY first stepless user message.
458
513
  // The application-creation flow persists it via the
459
514
  // orchestrator's first `sendMessage.execute` BEFORE
@@ -470,18 +525,40 @@ export function useChatRuntime(featureId, worktreePath, options) {
470
525
  }, [stepProgress.hasPlan, messages]);
471
526
  const threadMessages = useMemo(() => {
472
527
  const hasPlan = stepProgress.hasPlan;
473
- // When the workflow is active: ONLY show messages that have no
474
- // stepId those are out-of-band conversations (typed by the
475
- // user into the composer after the workflow finishes, or
476
- // ambient assistant replies). Every workflow-driven message
477
- // lives inside the tracker card of its owning step, so we
478
- // never want it rendered as a flat bubble above the tracker.
528
+ // When a workflow is active and STILL RUNNING: hide stepless
529
+ // assistant messages from the flat thread. These exist because of
530
+ // a small race window in the orchestrator the agent can start
531
+ // streaming and persist a chunk before `setActiveStep` is called,
532
+ // leaving an assistant row with no stepId that would otherwise
533
+ // render as a stray bubble below the tracker. While the workflow
534
+ // is running, the running step's own card is the only legal
535
+ // surface for in-progress agent output.
479
536
  //
480
- // ALSO filter out `initialRequestMessage` the host page
481
- // renders it manually above the tracker, so letting it appear
482
- // again in the flat thread would duplicate it.
537
+ // Once the workflow is DONE (`allDone`), the orchestrator has
538
+ // called its final `clearActiveStep`. From this point on, every
539
+ // new assistant message is a legitimate follow-up reply to a
540
+ // user-typed prompt, and MUST be visible in the flat thread —
541
+ // otherwise the chat appears to ignore the user. The previous
542
+ // version of this filter dropped them too and that's what looked
543
+ // like "agent is ignoring me" after the build completed.
544
+ //
545
+ // The user's very first message (`initialRequestMessage`) is
546
+ // always filtered out — the host page pins it above the tracker
547
+ // via `<InitialRequestBubble>` so leaving it in the flat thread
548
+ // would duplicate it.
549
+ const workflowRunning = hasPlan && !stepProgress.allDone;
483
550
  const sourceMessages = hasPlan
484
- ? messages.filter((m) => !m.stepId && m.id !== initialRequestMessage?.id)
551
+ ? messages.filter((m) => {
552
+ if (m.id === initialRequestMessage?.id)
553
+ return false;
554
+ if (m.stepId)
555
+ return false; // step-tagged messages live inside their card
556
+ if (workflowRunning && m.role === InteractiveMessageRole.assistant) {
557
+ // Race-window leftover — see comment above.
558
+ return false;
559
+ }
560
+ return true;
561
+ })
485
562
  : messages;
486
563
  const chatMessages = sourceMessages.map(toThreadMessage);
487
564
  // Merge debug bubbles into the timeline by timestamp
@@ -573,6 +650,7 @@ export function useChatRuntime(featureId, worktreePath, options) {
573
650
  options?.debugMode,
574
651
  debugEvents,
575
652
  stepProgress.hasPlan,
653
+ stepProgress.allDone,
576
654
  ]);
577
655
  // ── Status info for typing indicator ──────────────────────────────────
578
656
  const status = useMemo(() => {
@@ -639,10 +717,23 @@ export function useChatRuntime(featureId, worktreePath, options) {
639
717
  void queryClient.invalidateQueries({ queryKey: chatQueryKey(featureId) });
640
718
  }, [featureId, queryClient]);
641
719
  // ── Build assistant-ui runtime ──────────────────────────────────────────
720
+ // While a workflow is RUNNING, assistant-ui's `isRunning=true` would
721
+ // auto-inject an empty assistant placeholder bubble at the bottom of
722
+ // the thread (its built-in "thinking" indicator). The step tracker
723
+ // already conveys progress via the running step's spinner + live
724
+ // status, so that placeholder would just float as a hollow bubble.
725
+ // Force `isRunning=false` for the duration of the workflow so
726
+ // assistant-ui keeps its hands off the viewport.
727
+ //
728
+ // Once the workflow is DONE, hand control back to assistant-ui so
729
+ // its thinking indicator works normally for follow-up replies the
730
+ // user types into the composer after the build is finished.
731
+ const workflowInFlight = stepProgress.hasPlan && !stepProgress.allDone;
732
+ const runtimeIsRunning = workflowInFlight ? false : isRunning;
642
733
  const runtime = useExternalStoreRuntime({
643
734
  messages: threadMessages,
644
735
  convertMessage: useCallback((msg) => msg, []),
645
- isRunning,
736
+ isRunning: runtimeIsRunning,
646
737
  onNew,
647
738
  onCancel: useCallback(async () => {
648
739
  setStreamingText('');
@@ -2,7 +2,7 @@
2
2
  * Client-side mirror of the application-creation workflow's
3
3
  * user-facing step titles + descriptions. Used to render a
4
4
  * placeholder tracker BEFORE the backend orchestrator has written
5
- * the real `workflow_steps` rows — the user sees all 9 pending
5
+ * the real `workflow_steps` rows — the user sees all 8 pending
6
6
  * cards the instant they land on the application page, instead
7
7
  * of a blank area that suddenly pops into existence a few
8
8
  * hundred milliseconds later.
@@ -1 +1 @@
1
- {"version":3,"file":"workflow-placeholder.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/features/chat/workflow-placeholder.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,MAAM,WAAW,eAAe;IAC9B,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,eAAO,MAAM,sCAAsC,EAAE,eAAe,EA2BnE,CAAC"}
1
+ {"version":3,"file":"workflow-placeholder.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/features/chat/workflow-placeholder.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,MAAM,WAAW,eAAe;IAC9B,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,eAAO,MAAM,sCAAsC,EAAE,eAAe,EAyBnE,CAAC"}
@@ -2,7 +2,7 @@
2
2
  * Client-side mirror of the application-creation workflow's
3
3
  * user-facing step titles + descriptions. Used to render a
4
4
  * placeholder tracker BEFORE the backend orchestrator has written
5
- * the real `workflow_steps` rows — the user sees all 9 pending
5
+ * the real `workflow_steps` rows — the user sees all 8 pending
6
6
  * cards the instant they land on the application page, instead
7
7
  * of a blank area that suddenly pops into existence a few
8
8
  * hundred milliseconds later.
@@ -23,12 +23,10 @@ export const APPLICATION_CREATION_PLACEHOLDER_STEPS = [
23
23
  title: 'Installing design tools',
24
24
  description: 'Adding Tailwind and essentials',
25
25
  },
26
- { stepKey: 'plan', title: 'Sketching the app', description: 'Planning screens and data' },
27
- { stepKey: 'components', title: 'Building the pieces', description: 'Creating reusable parts' },
28
26
  {
29
- stepKey: 'content',
30
- title: 'Adding realistic content',
31
- description: 'Writing copy and sample data',
27
+ stepKey: 'components',
28
+ title: 'Building the pieces',
29
+ description: 'Designing and creating reusable parts',
32
30
  },
33
31
  { stepKey: 'wire', title: 'Connecting everything', description: 'Wiring navigation and forms' },
34
32
  {