@shepai/cli 1.129.3 → 1.129.4-pr412.cbe0d37

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 (332) hide show
  1. package/apis/json-schema/FeatureFlags.yaml +5 -0
  2. package/dist/packages/core/src/application/ports/output/agents/phase-timing-repository.interface.d.ts +1 -1
  3. package/dist/packages/core/src/application/ports/output/agents/phase-timing-repository.interface.d.ts.map +1 -1
  4. package/dist/packages/core/src/domain/factories/settings-defaults.factory.d.ts.map +1 -1
  5. package/dist/packages/core/src/domain/factories/settings-defaults.factory.js +1 -0
  6. package/dist/packages/core/src/domain/generated/output.d.ts +4 -0
  7. package/dist/packages/core/src/domain/generated/output.d.ts.map +1 -1
  8. package/dist/packages/core/src/infrastructure/persistence/sqlite/legacy-migrations.d.ts +2 -2
  9. package/dist/packages/core/src/infrastructure/persistence/sqlite/legacy-migrations.d.ts.map +1 -1
  10. package/dist/packages/core/src/infrastructure/persistence/sqlite/legacy-migrations.js +13 -2
  11. package/dist/packages/core/src/infrastructure/persistence/sqlite/mappers/settings.mapper.d.ts +1 -0
  12. package/dist/packages/core/src/infrastructure/persistence/sqlite/mappers/settings.mapper.d.ts.map +1 -1
  13. package/dist/packages/core/src/infrastructure/persistence/sqlite/mappers/settings.mapper.js +2 -0
  14. package/dist/packages/core/src/infrastructure/persistence/sqlite/migrations.d.ts +3 -3
  15. package/dist/packages/core/src/infrastructure/persistence/sqlite/migrations.js +4 -4
  16. package/dist/packages/core/src/infrastructure/repositories/sqlite-settings.repository.d.ts.map +1 -1
  17. package/dist/packages/core/src/infrastructure/repositories/sqlite-settings.repository.js +3 -0
  18. package/dist/packages/core/src/infrastructure/services/agents/feature-agent/nodes/evidence.node.d.ts.map +1 -1
  19. package/dist/packages/core/src/infrastructure/services/agents/feature-agent/nodes/evidence.node.js +21 -5
  20. package/dist/packages/core/src/infrastructure/services/agents/feature-agent/nodes/fast-implement.node.d.ts.map +1 -1
  21. package/dist/packages/core/src/infrastructure/services/agents/feature-agent/nodes/fast-implement.node.js +20 -4
  22. package/dist/packages/core/src/infrastructure/services/agents/feature-agent/nodes/implement.node.d.ts.map +1 -1
  23. package/dist/packages/core/src/infrastructure/services/agents/feature-agent/nodes/implement.node.js +71 -10
  24. package/dist/packages/core/src/infrastructure/services/agents/feature-agent/nodes/merge/merge.node.d.ts.map +1 -1
  25. package/dist/packages/core/src/infrastructure/services/agents/feature-agent/nodes/merge/merge.node.js +2 -1
  26. package/dist/packages/core/src/infrastructure/services/agents/feature-agent/phase-timing-context.d.ts +8 -0
  27. package/dist/packages/core/src/infrastructure/services/agents/feature-agent/phase-timing-context.d.ts.map +1 -1
  28. package/dist/packages/core/src/infrastructure/services/agents/feature-agent/phase-timing-context.js +16 -0
  29. package/dist/src/presentation/web/app/actions/get-feature-phase-timings.d.ts +1 -0
  30. package/dist/src/presentation/web/app/actions/get-feature-phase-timings.d.ts.map +1 -1
  31. package/dist/src/presentation/web/app/actions/get-feature-phase-timings.js +1 -0
  32. package/dist/src/presentation/web/app/api/directory/list/route.d.ts +3 -0
  33. package/dist/src/presentation/web/app/api/directory/list/route.d.ts.map +1 -0
  34. package/dist/src/presentation/web/app/api/directory/list/route.js +76 -0
  35. package/dist/src/presentation/web/app/layout.d.ts +1 -0
  36. package/dist/src/presentation/web/app/layout.d.ts.map +1 -1
  37. package/dist/src/presentation/web/app/layout.js +1 -0
  38. package/dist/src/presentation/web/components/common/add-repository-button/add-repository-button.d.ts.map +1 -1
  39. package/dist/src/presentation/web/components/common/add-repository-button/add-repository-button.js +23 -2
  40. package/dist/src/presentation/web/components/common/control-center-drawer/feature-drawer-client.d.ts.map +1 -1
  41. package/dist/src/presentation/web/components/common/control-center-drawer/feature-drawer-client.js +20 -4
  42. package/dist/src/presentation/web/components/common/control-center-drawer/use-artifact-fetch.d.ts +2 -1
  43. package/dist/src/presentation/web/components/common/control-center-drawer/use-artifact-fetch.d.ts.map +1 -1
  44. package/dist/src/presentation/web/components/common/control-center-drawer/use-artifact-fetch.js +3 -2
  45. package/dist/src/presentation/web/components/common/feature-create-drawer/feature-create-drawer.d.ts.map +1 -1
  46. package/dist/src/presentation/web/components/common/feature-create-drawer/feature-create-drawer.js +50 -19
  47. package/dist/src/presentation/web/components/common/feature-drawer-tabs/activity-tab.d.ts.map +1 -1
  48. package/dist/src/presentation/web/components/common/feature-drawer-tabs/activity-tab.js +17 -4
  49. package/dist/src/presentation/web/components/common/feature-drawer-tabs/feature-drawer-tabs.d.ts.map +1 -1
  50. package/dist/src/presentation/web/components/common/feature-drawer-tabs/feature-drawer-tabs.js +2 -2
  51. package/dist/src/presentation/web/components/common/index.d.ts +1 -0
  52. package/dist/src/presentation/web/components/common/index.d.ts.map +1 -1
  53. package/dist/src/presentation/web/components/common/index.js +1 -0
  54. package/dist/src/presentation/web/components/common/react-file-manager-dialog/index.d.ts +3 -0
  55. package/dist/src/presentation/web/components/common/react-file-manager-dialog/index.d.ts.map +1 -0
  56. package/dist/src/presentation/web/components/common/react-file-manager-dialog/index.js +1 -0
  57. package/dist/src/presentation/web/components/common/react-file-manager-dialog/react-file-manager-dialog-config.d.ts +17 -0
  58. package/dist/src/presentation/web/components/common/react-file-manager-dialog/react-file-manager-dialog-config.d.ts.map +1 -0
  59. package/dist/src/presentation/web/components/common/react-file-manager-dialog/react-file-manager-dialog-config.js +1 -0
  60. package/dist/src/presentation/web/components/common/react-file-manager-dialog/react-file-manager-dialog.d.ts +3 -0
  61. package/dist/src/presentation/web/components/common/react-file-manager-dialog/react-file-manager-dialog.d.ts.map +1 -0
  62. package/dist/src/presentation/web/components/common/react-file-manager-dialog/react-file-manager-dialog.js +116 -0
  63. package/dist/src/presentation/web/components/common/react-file-manager-dialog/react-file-manager-dialog.stories.d.ts +9 -0
  64. package/dist/src/presentation/web/components/common/react-file-manager-dialog/react-file-manager-dialog.stories.d.ts.map +1 -0
  65. package/dist/src/presentation/web/components/common/react-file-manager-dialog/react-file-manager-dialog.stories.js +27 -0
  66. package/dist/src/presentation/web/components/features/control-center/control-center-empty-state.d.ts.map +1 -1
  67. package/dist/src/presentation/web/components/features/control-center/control-center-empty-state.js +22 -1
  68. package/dist/src/presentation/web/components/features/settings/feature-flags-settings-section.d.ts.map +1 -1
  69. package/dist/src/presentation/web/components/features/settings/feature-flags-settings-section.js +3 -0
  70. package/dist/src/presentation/web/components/features/settings/feature-flags-settings-section.stories.d.ts.map +1 -1
  71. package/dist/src/presentation/web/components/features/settings/feature-flags-settings-section.stories.js +3 -0
  72. package/dist/src/presentation/web/components/features/settings/settings-page-client.d.ts.map +1 -1
  73. package/dist/src/presentation/web/components/features/settings/settings-page-client.js +5 -0
  74. package/dist/src/presentation/web/components/features/settings/settings-page-client.stories.d.ts.map +1 -1
  75. package/dist/src/presentation/web/components/features/settings/settings-page-client.stories.js +1 -0
  76. package/dist/src/presentation/web/components/layouts/app-shell/app-shell.d.ts.map +1 -1
  77. package/dist/src/presentation/web/components/layouts/app-shell/app-shell.js +21 -2
  78. package/dist/src/presentation/web/components/layouts/app-sidebar/app-sidebar.stories.d.ts.map +1 -1
  79. package/dist/src/presentation/web/components/layouts/app-sidebar/app-sidebar.stories.js +1 -0
  80. package/dist/src/presentation/web/hooks/feature-flags-context.d.ts.map +1 -1
  81. package/dist/src/presentation/web/hooks/feature-flags-context.js +1 -0
  82. package/dist/src/presentation/web/lib/feature-flags.d.ts +2 -0
  83. package/dist/src/presentation/web/lib/feature-flags.d.ts.map +1 -1
  84. package/dist/src/presentation/web/lib/feature-flags.js +5 -0
  85. package/dist/tsconfig.build.tsbuildinfo +1 -1
  86. package/package.json +2 -1
  87. package/web/.next/BUILD_ID +1 -1
  88. package/web/.next/app-path-routes-manifest.json +1 -0
  89. package/web/.next/build-manifest.json +6 -6
  90. package/web/.next/fallback-build-manifest.json +2 -2
  91. package/web/.next/prerender-manifest.json +3 -3
  92. package/web/.next/required-server-files.js +3 -3
  93. package/web/.next/required-server-files.json +3 -3
  94. package/web/.next/routes-manifest.json +6 -0
  95. package/web/.next/server/app/(dashboard)/@drawer/adopt/page/build-manifest.json +4 -4
  96. package/web/.next/server/app/(dashboard)/@drawer/adopt/page/react-loadable-manifest.json +8 -1
  97. package/web/.next/server/app/(dashboard)/@drawer/adopt/page/server-reference-manifest.json +24 -24
  98. package/web/.next/server/app/(dashboard)/@drawer/adopt/page.js +1 -1
  99. package/web/.next/server/app/(dashboard)/@drawer/adopt/page.js.nft.json +1 -1
  100. package/web/.next/server/app/(dashboard)/@drawer/adopt/page_client-reference-manifest.js +1 -1
  101. package/web/.next/server/app/(dashboard)/@drawer/create/page/build-manifest.json +4 -4
  102. package/web/.next/server/app/(dashboard)/@drawer/create/page/react-loadable-manifest.json +8 -1
  103. package/web/.next/server/app/(dashboard)/@drawer/create/page/server-reference-manifest.json +24 -24
  104. package/web/.next/server/app/(dashboard)/@drawer/create/page.js +1 -1
  105. package/web/.next/server/app/(dashboard)/@drawer/create/page.js.nft.json +1 -1
  106. package/web/.next/server/app/(dashboard)/@drawer/create/page_client-reference-manifest.js +1 -1
  107. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/[tab]/page/build-manifest.json +4 -4
  108. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/[tab]/page/react-loadable-manifest.json +8 -1
  109. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/[tab]/page/server-reference-manifest.json +30 -30
  110. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/[tab]/page.js +1 -1
  111. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/[tab]/page.js.nft.json +1 -1
  112. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/[tab]/page_client-reference-manifest.js +1 -1
  113. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page/build-manifest.json +4 -4
  114. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page/react-loadable-manifest.json +8 -1
  115. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page/server-reference-manifest.json +30 -30
  116. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page.js +1 -1
  117. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page.js.nft.json +1 -1
  118. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page_client-reference-manifest.js +1 -1
  119. package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page/build-manifest.json +4 -4
  120. package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page/react-loadable-manifest.json +8 -1
  121. package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page/server-reference-manifest.json +22 -22
  122. package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page.js +1 -1
  123. package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page.js.nft.json +1 -1
  124. package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page_client-reference-manifest.js +1 -1
  125. package/web/.next/server/app/(dashboard)/create/page/build-manifest.json +4 -4
  126. package/web/.next/server/app/(dashboard)/create/page/react-loadable-manifest.json +8 -1
  127. package/web/.next/server/app/(dashboard)/create/page/server-reference-manifest.json +24 -24
  128. package/web/.next/server/app/(dashboard)/create/page.js +1 -1
  129. package/web/.next/server/app/(dashboard)/create/page.js.nft.json +1 -1
  130. package/web/.next/server/app/(dashboard)/create/page_client-reference-manifest.js +1 -1
  131. package/web/.next/server/app/(dashboard)/feature/[featureId]/[tab]/page/build-manifest.json +4 -4
  132. package/web/.next/server/app/(dashboard)/feature/[featureId]/[tab]/page/react-loadable-manifest.json +8 -1
  133. package/web/.next/server/app/(dashboard)/feature/[featureId]/[tab]/page/server-reference-manifest.json +30 -30
  134. package/web/.next/server/app/(dashboard)/feature/[featureId]/[tab]/page.js +1 -1
  135. package/web/.next/server/app/(dashboard)/feature/[featureId]/[tab]/page.js.nft.json +1 -1
  136. package/web/.next/server/app/(dashboard)/feature/[featureId]/[tab]/page_client-reference-manifest.js +1 -1
  137. package/web/.next/server/app/(dashboard)/feature/[featureId]/page/build-manifest.json +4 -4
  138. package/web/.next/server/app/(dashboard)/feature/[featureId]/page/react-loadable-manifest.json +8 -1
  139. package/web/.next/server/app/(dashboard)/feature/[featureId]/page/server-reference-manifest.json +30 -30
  140. package/web/.next/server/app/(dashboard)/feature/[featureId]/page.js +1 -1
  141. package/web/.next/server/app/(dashboard)/feature/[featureId]/page.js.nft.json +1 -1
  142. package/web/.next/server/app/(dashboard)/feature/[featureId]/page_client-reference-manifest.js +1 -1
  143. package/web/.next/server/app/(dashboard)/page/build-manifest.json +4 -4
  144. package/web/.next/server/app/(dashboard)/page/react-loadable-manifest.json +8 -1
  145. package/web/.next/server/app/(dashboard)/page/server-reference-manifest.json +22 -22
  146. package/web/.next/server/app/(dashboard)/page.js +1 -1
  147. package/web/.next/server/app/(dashboard)/page.js.nft.json +1 -1
  148. package/web/.next/server/app/(dashboard)/page_client-reference-manifest.js +1 -1
  149. package/web/.next/server/app/(dashboard)/repository/[repositoryId]/page/build-manifest.json +4 -4
  150. package/web/.next/server/app/(dashboard)/repository/[repositoryId]/page/react-loadable-manifest.json +8 -1
  151. package/web/.next/server/app/(dashboard)/repository/[repositoryId]/page/server-reference-manifest.json +22 -22
  152. package/web/.next/server/app/(dashboard)/repository/[repositoryId]/page.js +1 -1
  153. package/web/.next/server/app/(dashboard)/repository/[repositoryId]/page.js.nft.json +1 -1
  154. package/web/.next/server/app/(dashboard)/repository/[repositoryId]/page_client-reference-manifest.js +1 -1
  155. package/web/.next/server/app/_global-error/page/build-manifest.json +4 -4
  156. package/web/.next/server/app/_global-error.html +2 -2
  157. package/web/.next/server/app/_global-error.rsc +1 -1
  158. package/web/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +1 -1
  159. package/web/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  160. package/web/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  161. package/web/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  162. package/web/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  163. package/web/.next/server/app/_not-found/page/build-manifest.json +4 -4
  164. package/web/.next/server/app/_not-found/page/react-loadable-manifest.json +8 -1
  165. package/web/.next/server/app/_not-found/page/server-reference-manifest.json +3 -3
  166. package/web/.next/server/app/_not-found/page.js.nft.json +1 -1
  167. package/web/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  168. package/web/.next/server/app/api/attachments/preview/route.js +1 -1
  169. package/web/.next/server/app/api/attachments/preview/route.js.nft.json +1 -1
  170. package/web/.next/server/app/api/directory/list/route/app-paths-manifest.json +3 -0
  171. package/web/.next/server/app/api/directory/list/route/build-manifest.json +11 -0
  172. package/web/.next/server/app/api/directory/list/route/server-reference-manifest.json +4 -0
  173. package/web/.next/server/app/api/directory/list/route.js +7 -0
  174. package/web/.next/server/app/api/directory/list/route.js.map +5 -0
  175. package/web/.next/server/app/api/directory/list/route.js.nft.json +1 -0
  176. package/web/.next/server/app/api/directory/list/route_client-reference-manifest.js +2 -0
  177. package/web/.next/server/app/api/evidence/route.js +1 -1
  178. package/web/.next/server/app/api/evidence/route.js.nft.json +1 -1
  179. package/web/.next/server/app/api/feature-logs/route.js +1 -1
  180. package/web/.next/server/app/api/feature-logs/route.js.nft.json +1 -1
  181. package/web/.next/server/app/api/graph-data/route.js +1 -1
  182. package/web/.next/server/app/api/graph-data/route.js.nft.json +1 -1
  183. package/web/.next/server/app/settings/page/build-manifest.json +4 -4
  184. package/web/.next/server/app/settings/page/react-loadable-manifest.json +8 -1
  185. package/web/.next/server/app/settings/page/server-reference-manifest.json +8 -8
  186. package/web/.next/server/app/settings/page.js +1 -1
  187. package/web/.next/server/app/settings/page.js.nft.json +1 -1
  188. package/web/.next/server/app/settings/page_client-reference-manifest.js +1 -1
  189. package/web/.next/server/app/skills/page/build-manifest.json +4 -4
  190. package/web/.next/server/app/skills/page/react-loadable-manifest.json +8 -1
  191. package/web/.next/server/app/skills/page/server-reference-manifest.json +8 -8
  192. package/web/.next/server/app/skills/page.js +1 -1
  193. package/web/.next/server/app/skills/page.js.nft.json +1 -1
  194. package/web/.next/server/app/skills/page_client-reference-manifest.js +1 -1
  195. package/web/.next/server/app/tools/page/build-manifest.json +4 -4
  196. package/web/.next/server/app/tools/page/react-loadable-manifest.json +8 -1
  197. package/web/.next/server/app/tools/page/server-reference-manifest.json +8 -8
  198. package/web/.next/server/app/tools/page.js +1 -1
  199. package/web/.next/server/app/tools/page.js.nft.json +1 -1
  200. package/web/.next/server/app/tools/page_client-reference-manifest.js +1 -1
  201. package/web/.next/server/app/version/page/build-manifest.json +4 -4
  202. package/web/.next/server/app/version/page/react-loadable-manifest.json +8 -1
  203. package/web/.next/server/app/version/page/server-reference-manifest.json +3 -3
  204. package/web/.next/server/app/version/page.js.nft.json +1 -1
  205. package/web/.next/server/app/version/page_client-reference-manifest.js +1 -1
  206. package/web/.next/server/app-paths-manifest.json +1 -0
  207. package/web/.next/server/chunks/744ca_web__next-internal_server_app_api_directory_list_route_actions_9e35153e.js +3 -0
  208. package/web/.next/server/chunks/744ca_web__next-internal_server_app_api_directory_list_route_actions_9e35153e.js.map +1 -0
  209. package/web/.next/server/chunks/{[root-of-the-server]__53013576._.js → [root-of-the-server]__25f23d5d._.js} +2 -2
  210. package/web/.next/server/chunks/{[root-of-the-server]__92078db6._.js → [root-of-the-server]__26565141._.js} +2 -2
  211. package/web/.next/server/chunks/{[root-of-the-server]__d8037e14._.js → [root-of-the-server]__2b1074db._.js} +2 -2
  212. package/web/.next/server/chunks/[root-of-the-server]__a402b567._.js +1 -1
  213. package/web/.next/server/chunks/[root-of-the-server]__cd67a84c._.js.map +1 -1
  214. package/web/.next/server/chunks/{[root-of-the-server]__bc532286._.js → [root-of-the-server]__d1dc8fcd._.js} +2 -2
  215. package/web/.next/server/chunks/[root-of-the-server]__d1dc8fcd._.js.map +1 -0
  216. package/web/.next/server/chunks/[root-of-the-server]__fc6fd958._.js +3 -0
  217. package/web/.next/server/chunks/[root-of-the-server]__fc6fd958._.js.map +1 -0
  218. package/web/.next/server/chunks/ssr/744ca_web__next-internal_server_app_(dashboard)_@drawer_adopt_page_actions_4e741df2.js +1 -1
  219. package/web/.next/server/chunks/ssr/744ca_web__next-internal_server_app_(dashboard)_@drawer_adopt_page_actions_4e741df2.js.map +1 -1
  220. package/web/.next/server/chunks/ssr/744ca_web_components_common_control-center-drawer_create-drawer-client_tsx_5e26fc0a._.js +1 -1
  221. package/web/.next/server/chunks/ssr/744ca_web_components_common_control-center-drawer_create-drawer-client_tsx_5e26fc0a._.js.map +1 -1
  222. package/web/.next/server/chunks/ssr/8ba4b_server_app_(dashboard)_@drawer_repository_[repositoryId]_page_actions_026fdffa.js +1 -1
  223. package/web/.next/server/chunks/ssr/8ba4b_server_app_(dashboard)_@drawer_repository_[repositoryId]_page_actions_026fdffa.js.map +1 -1
  224. package/web/.next/server/chunks/ssr/8ba4b_server_app_(dashboard)_repository_[repositoryId]_page_actions_8b91e197.js +1 -1
  225. package/web/.next/server/chunks/ssr/8ba4b_server_app_(dashboard)_repository_[repositoryId]_page_actions_8b91e197.js.map +1 -1
  226. package/web/.next/server/chunks/ssr/[root-of-the-server]__357d99f9._.js +1 -1
  227. package/web/.next/server/chunks/ssr/[root-of-the-server]__43f51aa6._.js +1 -1
  228. package/web/.next/server/chunks/ssr/[root-of-the-server]__43f51aa6._.js.map +1 -1
  229. package/web/.next/server/chunks/ssr/{[root-of-the-server]__60684242._.js → [root-of-the-server]__5142820f._.js} +3 -3
  230. package/web/.next/server/chunks/ssr/[root-of-the-server]__5142820f._.js.map +1 -0
  231. package/web/.next/server/chunks/ssr/{[root-of-the-server]__a21eef5a._.js → [root-of-the-server]__57018345._.js} +2 -2
  232. package/web/.next/server/chunks/ssr/[root-of-the-server]__57018345._.js.map +1 -0
  233. package/web/.next/server/chunks/ssr/[root-of-the-server]__6bb00d90._.js +2 -2
  234. package/web/.next/server/chunks/ssr/[root-of-the-server]__6bb00d90._.js.map +1 -1
  235. package/web/.next/server/chunks/ssr/[root-of-the-server]__755cfe02._.js +1 -1
  236. package/web/.next/server/chunks/ssr/[root-of-the-server]__755cfe02._.js.map +1 -1
  237. package/web/.next/server/chunks/ssr/[root-of-the-server]__7894f27f._.js +3 -0
  238. package/web/.next/server/chunks/ssr/[root-of-the-server]__7894f27f._.js.map +1 -0
  239. package/web/.next/server/chunks/ssr/[root-of-the-server]__815546bd._.js +1 -1
  240. package/web/.next/server/chunks/ssr/[root-of-the-server]__815546bd._.js.map +1 -1
  241. package/web/.next/server/chunks/ssr/{[root-of-the-server]__62cdea24._.js → [root-of-the-server]__84f72684._.js} +3 -3
  242. package/web/.next/server/chunks/ssr/[root-of-the-server]__99ab2519._.js +1 -1
  243. package/web/.next/server/chunks/ssr/[root-of-the-server]__a628fb91._.js +1 -1
  244. package/web/.next/server/chunks/ssr/[root-of-the-server]__a628fb91._.js.map +1 -1
  245. package/web/.next/server/chunks/ssr/[root-of-the-server]__bfba58e6._.js +1 -1
  246. package/web/.next/server/chunks/ssr/[root-of-the-server]__bfba58e6._.js.map +1 -1
  247. package/web/.next/server/chunks/ssr/[root-of-the-server]__c3ab8422._.js +1 -1
  248. package/web/.next/server/chunks/ssr/[root-of-the-server]__c3ab8422._.js.map +1 -1
  249. package/web/.next/server/chunks/ssr/_0020fddd._.js +1 -1
  250. package/web/.next/server/chunks/ssr/_0020fddd._.js.map +1 -1
  251. package/web/.next/server/chunks/ssr/_02ec1aea._.js +1 -1
  252. package/web/.next/server/chunks/ssr/_02ec1aea._.js.map +1 -1
  253. package/web/.next/server/chunks/ssr/_1b7dae9a._.js +3 -0
  254. package/web/.next/server/chunks/ssr/_1b7dae9a._.js.map +1 -0
  255. package/web/.next/server/chunks/ssr/{_324f08fa._.js → _56c5e92e._.js} +2 -2
  256. package/web/.next/server/chunks/ssr/{_324f08fa._.js.map → _56c5e92e._.js.map} +1 -1
  257. package/web/.next/server/chunks/ssr/_7dca1882._.js +1 -1
  258. package/web/.next/server/chunks/ssr/_7dca1882._.js.map +1 -1
  259. package/web/.next/server/chunks/ssr/_a37f5f18._.js +1 -1
  260. package/web/.next/server/chunks/ssr/_a37f5f18._.js.map +1 -1
  261. package/web/.next/server/chunks/ssr/_a9f57758._.js +1 -1
  262. package/web/.next/server/chunks/ssr/_b032a7ac._.js +3 -0
  263. package/web/.next/server/chunks/ssr/{_8302fcae._.js.map → _b032a7ac._.js.map} +1 -1
  264. package/web/.next/server/chunks/ssr/_d4b20e29._.js.map +1 -1
  265. package/web/.next/server/chunks/ssr/_d8575088._.js +1 -1
  266. package/web/.next/server/chunks/ssr/_d8575088._.js.map +1 -1
  267. package/web/.next/server/chunks/ssr/_f39a1adb._.js +1 -1
  268. package/web/.next/server/chunks/ssr/_f39a1adb._.js.map +1 -1
  269. package/web/.next/server/chunks/ssr/b1a17_presentation_web_components_features_settings_settings-page-client_tsx_6ed9d5f8._.js +1 -1
  270. package/web/.next/server/chunks/ssr/b1a17_presentation_web_components_features_settings_settings-page-client_tsx_6ed9d5f8._.js.map +1 -1
  271. package/web/.next/server/chunks/ssr/{src_presentation_web_79c5e358._.js → src_presentation_web_0a31df6d._.js} +2 -2
  272. package/web/.next/server/chunks/ssr/{src_presentation_web_79c5e358._.js.map → src_presentation_web_0a31df6d._.js.map} +1 -1
  273. package/web/.next/server/chunks/ssr/src_presentation_web_8e7fe0d1._.js +2 -2
  274. package/web/.next/server/chunks/ssr/src_presentation_web_8e7fe0d1._.js.map +1 -1
  275. package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_(dashboard)_page_actions_ca051134.js +1 -1
  276. package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_(dashboard)_page_actions_ca051134.js.map +1 -1
  277. package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_skills_page_actions_1b176e3c.js +1 -1
  278. package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_skills_page_actions_1b176e3c.js.map +1 -1
  279. package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_tools_page_actions_bd9f0dda.js +1 -1
  280. package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_tools_page_actions_bd9f0dda.js.map +1 -1
  281. package/web/.next/server/chunks/ssr/src_presentation_web_b9023017._.js +2 -2
  282. package/web/.next/server/chunks/ssr/src_presentation_web_b9023017._.js.map +1 -1
  283. package/web/.next/server/chunks/ssr/src_presentation_web_components_e599bb8c._.js +1 -1
  284. package/web/.next/server/chunks/ssr/src_presentation_web_components_e599bb8c._.js.map +1 -1
  285. package/web/.next/server/chunks/ssr/src_presentation_web_components_features_control-center_7ac3562e._.js +1 -1
  286. package/web/.next/server/chunks/ssr/src_presentation_web_components_features_control-center_7ac3562e._.js.map +1 -1
  287. package/web/.next/server/middleware-build-manifest.js +4 -4
  288. package/web/.next/server/pages/500.html +2 -2
  289. package/web/.next/server/server-reference-manifest.js +1 -1
  290. package/web/.next/server/server-reference-manifest.json +38 -38
  291. package/web/.next/static/chunks/{d34a91958ca566fa.js → 0b7fe2ac4f078f54.js} +1 -1
  292. package/web/.next/static/chunks/0ea15b83aeca7b1a.css +1 -0
  293. package/web/.next/static/chunks/{a4d0f5c8adbd573e.js → 10b5069084213d7b.js} +1 -1
  294. package/web/.next/static/chunks/{75424b9eb679261a.js → 467005fc66090d82.js} +1 -1
  295. package/web/.next/static/chunks/4cec255f2754e5ec.js +1 -0
  296. package/web/.next/static/chunks/{d2b3baac392d5097.js → 56986cf0d5665b33.js} +1 -1
  297. package/web/.next/static/chunks/{97778646dde1a546.js → 5d102c2368573ad4.js} +1 -1
  298. package/web/.next/static/chunks/{21a98ed37526a704.js → 5e0f0eb56caca7b0.js} +1 -1
  299. package/web/.next/static/chunks/6d7b999c99d6d175.js +9 -0
  300. package/web/.next/static/chunks/{d1238d67f4b7fa61.js → 768922d1350524f7.js} +1 -1
  301. package/web/.next/static/chunks/791fa3135b12cc5c.js +1 -0
  302. package/web/.next/static/chunks/7d78b55397522ad9.js +1 -0
  303. package/web/.next/static/chunks/8180973e9cd6a99e.css +1 -0
  304. package/web/.next/static/chunks/83fc7ea32e18c9a5.js +1 -0
  305. package/web/.next/static/chunks/{ef48a6beeb40b304.js → a449ec16975164ef.js} +1 -1
  306. package/web/.next/static/chunks/c7e793951b20a67f.js +1 -0
  307. package/web/.next/static/chunks/{a36ddda5a860c371.js → c8ae9f83f18eec9e.js} +1 -1
  308. package/web/.next/static/chunks/{140810c2538c85aa.js → d67b9a7e0395aadc.js} +1 -1
  309. package/web/.next/static/chunks/fc31060238e90093.js +2 -0
  310. package/web/.next/static/chunks/{turbopack-080e470ea902d0ba.js → turbopack-c2d183e05f30c7dc.js} +1 -1
  311. package/web/.next/server/chunks/[root-of-the-server]__bc532286._.js.map +0 -1
  312. package/web/.next/server/chunks/ssr/[root-of-the-server]__0e842eba._.js +0 -3
  313. package/web/.next/server/chunks/ssr/[root-of-the-server]__0e842eba._.js.map +0 -1
  314. package/web/.next/server/chunks/ssr/[root-of-the-server]__60684242._.js.map +0 -1
  315. package/web/.next/server/chunks/ssr/[root-of-the-server]__a21eef5a._.js.map +0 -1
  316. package/web/.next/server/chunks/ssr/_8302fcae._.js +0 -3
  317. package/web/.next/server/chunks/ssr/_b4b8a636._.js +0 -3
  318. package/web/.next/server/chunks/ssr/_b4b8a636._.js.map +0 -1
  319. package/web/.next/static/chunks/4d40135dc75a7412.js +0 -1
  320. package/web/.next/static/chunks/84a181ff3270fd9f.js +0 -1
  321. package/web/.next/static/chunks/89aac43287d73b02.js +0 -1
  322. package/web/.next/static/chunks/d0fb8a76a89bd016.js +0 -1
  323. package/web/.next/static/chunks/da484d44874006a2.css +0 -1
  324. package/web/.next/static/chunks/dc314fb7519088cf.js +0 -2
  325. package/web/.next/static/chunks/f259386f4875e70c.js +0 -1
  326. /package/web/.next/server/chunks/{[root-of-the-server]__53013576._.js.map → [root-of-the-server]__25f23d5d._.js.map} +0 -0
  327. /package/web/.next/server/chunks/{[root-of-the-server]__92078db6._.js.map → [root-of-the-server]__26565141._.js.map} +0 -0
  328. /package/web/.next/server/chunks/{[root-of-the-server]__d8037e14._.js.map → [root-of-the-server]__2b1074db._.js.map} +0 -0
  329. /package/web/.next/server/chunks/ssr/{[root-of-the-server]__62cdea24._.js.map → [root-of-the-server]__84f72684._.js.map} +0 -0
  330. /package/web/.next/static/{8qbj3kELZ61JA30sTIVee → jD-F2qPl8fvHfH8oc0hVX}/_buildManifest.js +0 -0
  331. /package/web/.next/static/{8qbj3kELZ61JA30sTIVee → jD-F2qPl8fvHfH8oc0hVX}/_clientMiddlewareManifest.json +0 -0
  332. /package/web/.next/static/{8qbj3kELZ61JA30sTIVee → jD-F2qPl8fvHfH8oc0hVX}/_ssgManifest.js +0 -0
@@ -16,7 +16,7 @@ import { interrupt, isGraphBubbleUp } from '@langchain/langgraph';
16
16
  import { SdlcLifecycle, PrStatus } from '../../../../../../domain/generated/output.js';
17
17
  import { createNodeLogger, shouldInterrupt, retryExecute, buildExecutorOptions, } from '../node-helpers.js';
18
18
  import { reportNodeStart } from '../../heartbeat.js';
19
- import { recordPhaseStart, recordPhaseEnd, recordApprovalWaitStart, } from '../../phase-timing-context.js';
19
+ import { recordPhaseStart, recordPhaseEnd, recordApprovalWaitStart, updatePhasePrompt, } from '../../phase-timing-context.js';
20
20
  import { updateNodeLifecycle } from '../../lifecycle-context.js';
21
21
  import { buildCommitPushPrPrompt } from '../prompts/merge-prompts.js';
22
22
  import { parseCommitHash, parsePrUrl } from './merge-output-parser.js';
@@ -104,6 +104,7 @@ export function createMergeNode(deps) {
104
104
  const effectiveState = remoteAvailable ? state : { ...state, push: false, openPr: false };
105
105
  log.info('Agent call 1: commit + push + PR');
106
106
  const commitPushPrPrompt = buildCommitPushPrPrompt(effectiveState, branch, baseBranch, repoUrl);
107
+ await updatePhasePrompt(mergeTimingId, commitPushPrPrompt);
107
108
  const commitResult = await retryExecute(executor, commitPushPrPrompt, options, {
108
109
  logger: log,
109
110
  });
@@ -46,6 +46,8 @@ export interface PhaseEndMetadata {
46
46
  durationApiMs?: number;
47
47
  exitCode?: string;
48
48
  errorMessage?: string;
49
+ /** Prompt can be recorded at end time when it's built after recordPhaseStart */
50
+ prompt?: string;
49
51
  }
50
52
  /**
51
53
  * Record the end of a phase. Updates the timing record with completedAt, durationMs,
@@ -61,6 +63,12 @@ export declare function recordPhaseEnd(timingId: string | null, durationMs: numb
61
63
  * e.g., from use cases like StopAgentRunUseCase or ResumeFeatureUseCase).
62
64
  */
63
65
  export declare function recordLifecycleEvent(phase: string, explicitRunId?: string, explicitRepo?: IPhaseTimingRepository): Promise<void>;
66
+ /**
67
+ * Update a phase timing record with the prompt text.
68
+ * Useful when the prompt is built after recordPhaseStart (e.g. merge node).
69
+ * No-op if timingId is null or context is not set.
70
+ */
71
+ export declare function updatePhasePrompt(timingId: string | null, prompt: string): Promise<void>;
64
72
  /**
65
73
  * Record the start of an approval wait. Sets waitingApprovalAt on the timing record.
66
74
  * No-op if timingId is null or context is not set.
@@ -1 +1 @@
1
- {"version":3,"file":"phase-timing-context.d.ts","sourceRoot":"","sources":["../../../../../../../../packages/core/src/infrastructure/services/agents/feature-agent/phase-timing-context.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAGH,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,wEAAwE,CAAC;AAMrH;;GAEG;AACH,wBAAgB,eAAe,IAAI,MAAM,GAAG,IAAI,CAE/C;AAED;;GAEG;AACH,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,MAAM,EAAE,UAAU,EAAE,sBAAsB,GAAG,IAAI,CAG7F;AAED;;GAEG;AACH,wBAAgB,uBAAuB,IAAI,IAAI,CAI9C;AA+BD,sDAAsD;AACtD,MAAM,WAAW,kBAAkB;IACjC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED;;;;;;GAMG;AACH,wBAAsB,gBAAgB,CACpC,KAAK,EAAE,MAAM,EACb,QAAQ,CAAC,EAAE,kBAAkB,GAC5B,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAyBxB;AAED,qDAAqD;AACrD,MAAM,WAAW,gBAAgB;IAC/B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,wBAAwB,CAAC,EAAE,MAAM,CAAC;IAClC,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAC9B,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED;;;;GAIG;AACH,wBAAsB,cAAc,CAClC,QAAQ,EAAE,MAAM,GAAG,IAAI,EACvB,UAAU,EAAE,MAAM,EAClB,QAAQ,CAAC,EAAE,gBAAgB,GAC1B,OAAO,CAAC,IAAI,CAAC,CAwBf;AAED;;;;;;GAMG;AACH,wBAAsB,oBAAoB,CACxC,KAAK,EAAE,MAAM,EACb,aAAa,CAAC,EAAE,MAAM,EACtB,YAAY,CAAC,EAAE,sBAAsB,GACpC,OAAO,CAAC,IAAI,CAAC,CAoBf;AAED;;;GAGG;AACH,wBAAsB,uBAAuB,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAUpF"}
1
+ {"version":3,"file":"phase-timing-context.d.ts","sourceRoot":"","sources":["../../../../../../../../packages/core/src/infrastructure/services/agents/feature-agent/phase-timing-context.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAGH,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,wEAAwE,CAAC;AAMrH;;GAEG;AACH,wBAAgB,eAAe,IAAI,MAAM,GAAG,IAAI,CAE/C;AAED;;GAEG;AACH,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,MAAM,EAAE,UAAU,EAAE,sBAAsB,GAAG,IAAI,CAG7F;AAED;;GAEG;AACH,wBAAgB,uBAAuB,IAAI,IAAI,CAI9C;AA+BD,sDAAsD;AACtD,MAAM,WAAW,kBAAkB;IACjC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED;;;;;;GAMG;AACH,wBAAsB,gBAAgB,CACpC,KAAK,EAAE,MAAM,EACb,QAAQ,CAAC,EAAE,kBAAkB,GAC5B,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAyBxB;AAED,qDAAqD;AACrD,MAAM,WAAW,gBAAgB;IAC/B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,wBAAwB,CAAC,EAAE,MAAM,CAAC;IAClC,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAC9B,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,gFAAgF;IAChF,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED;;;;GAIG;AACH,wBAAsB,cAAc,CAClC,QAAQ,EAAE,MAAM,GAAG,IAAI,EACvB,UAAU,EAAE,MAAM,EAClB,QAAQ,CAAC,EAAE,gBAAgB,GAC1B,OAAO,CAAC,IAAI,CAAC,CAyBf;AAED;;;;;;GAMG;AACH,wBAAsB,oBAAoB,CACxC,KAAK,EAAE,MAAM,EACb,aAAa,CAAC,EAAE,MAAM,EACtB,YAAY,CAAC,EAAE,sBAAsB,GACpC,OAAO,CAAC,IAAI,CAAC,CAoBf;AAED;;;;GAIG;AACH,wBAAsB,iBAAiB,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAQ9F;AAED;;;GAGG;AACH,wBAAsB,uBAAuB,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAUpF"}
@@ -114,6 +114,7 @@ export async function recordPhaseEnd(timingId, durationMs, metadata) {
114
114
  ...(metadata?.durationApiMs != null && { durationApiMs: BigInt(metadata.durationApiMs) }),
115
115
  ...(metadata?.exitCode != null && { exitCode: metadata.exitCode }),
116
116
  ...(metadata?.errorMessage != null && { errorMessage: metadata.errorMessage }),
117
+ ...(metadata?.prompt != null && { prompt: metadata.prompt }),
117
118
  });
118
119
  }
119
120
  catch {
@@ -149,6 +150,21 @@ export async function recordLifecycleEvent(phase, explicitRunId, explicitRepo) {
149
150
  // Swallow — lifecycle event recording is non-fatal
150
151
  }
151
152
  }
153
+ /**
154
+ * Update a phase timing record with the prompt text.
155
+ * Useful when the prompt is built after recordPhaseStart (e.g. merge node).
156
+ * No-op if timingId is null or context is not set.
157
+ */
158
+ export async function updatePhasePrompt(timingId, prompt) {
159
+ if (!timingId || !contextRepository)
160
+ return;
161
+ try {
162
+ await contextRepository.update(timingId, { prompt });
163
+ }
164
+ catch {
165
+ // Swallow — prompt update failure is non-fatal
166
+ }
167
+ }
152
168
  /**
153
169
  * Record the start of an approval wait. Sets waitingApprovalAt on the timing record.
154
170
  * No-op if timingId is null or context is not set.
@@ -15,6 +15,7 @@ export interface PhaseTimingData {
15
15
  durationApiMs?: number;
16
16
  exitCode?: string;
17
17
  errorMessage?: string;
18
+ prompt?: string;
18
19
  }
19
20
  export interface RejectionFeedbackData {
20
21
  iteration: number;
@@ -1 +1 @@
1
- {"version":3,"file":"get-feature-phase-timings.d.ts","sourceRoot":"","sources":["../../../../../../src/presentation/web/app/actions/get-feature-phase-timings.ts"],"names":[],"mappings":"AAMA,MAAM,WAAW,eAAe;IAC9B,UAAU,EAAE,MAAM,CAAC;IACnB,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,wBAAwB,CAAC,EAAE,MAAM,CAAC;IAClC,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAC9B,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,qBAAqB;IACpC,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,WAAW,CAAC,EAAE,MAAM,EAAE,CAAC;CACxB;AAED,KAAK,qBAAqB,GACtB;IAAE,OAAO,EAAE,eAAe,EAAE,CAAC;IAAC,iBAAiB,EAAE,qBAAqB,EAAE,CAAA;CAAE,GAC1E;IAAE,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC;AAEtB,wBAAsB,sBAAsB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,qBAAqB,CAAC,CAsC9F"}
1
+ {"version":3,"file":"get-feature-phase-timings.d.ts","sourceRoot":"","sources":["../../../../../../src/presentation/web/app/actions/get-feature-phase-timings.ts"],"names":[],"mappings":"AAMA,MAAM,WAAW,eAAe;IAC9B,UAAU,EAAE,MAAM,CAAC;IACnB,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,wBAAwB,CAAC,EAAE,MAAM,CAAC;IAClC,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAC9B,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,qBAAqB;IACpC,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,WAAW,CAAC,EAAE,MAAM,EAAE,CAAC;CACxB;AAED,KAAK,qBAAqB,GACtB;IAAE,OAAO,EAAE,eAAe,EAAE,CAAC;IAAC,iBAAiB,EAAE,qBAAqB,EAAE,CAAA;CAAE,GAC1E;IAAE,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC;AAEtB,wBAAsB,sBAAsB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,qBAAqB,CAAC,CAuC9F"}
@@ -24,6 +24,7 @@ export async function getFeaturePhaseTimings(featureId) {
24
24
  durationApiMs: t.durationApiMs != null ? Number(t.durationApiMs) : undefined,
25
25
  exitCode: t.exitCode ?? undefined,
26
26
  errorMessage: t.errorMessage ?? undefined,
27
+ prompt: t.prompt ?? undefined,
27
28
  }));
28
29
  // Read rejection feedback from spec.yaml
29
30
  const rejectionFeedback = await readRejectionFeedback(featureId);
@@ -0,0 +1,3 @@
1
+ import { NextResponse } from 'next/server';
2
+ export declare function GET(request: Request): Promise<NextResponse>;
3
+ //# sourceMappingURL=route.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"route.d.ts","sourceRoot":"","sources":["../../../../../../../../src/presentation/web/app/api/directory/list/route.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAY3C,wBAAsB,GAAG,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,YAAY,CAAC,CA6EjE"}
@@ -0,0 +1,76 @@
1
+ import { NextResponse } from 'next/server';
2
+ import { readdir, stat } from 'node:fs/promises';
3
+ import { homedir } from 'node:os';
4
+ import path from 'node:path';
5
+ export async function GET(request) {
6
+ const url = new URL(request.url);
7
+ const rawPath = url.searchParams.get('path') ?? homedir();
8
+ const showHidden = url.searchParams.get('showHidden') === 'true';
9
+ if (!path.isAbsolute(rawPath)) {
10
+ return NextResponse.json({ error: 'Path must be absolute' }, { status: 400 });
11
+ }
12
+ const resolvedPath = path.resolve(rawPath);
13
+ try {
14
+ const dirStat = await stat(resolvedPath);
15
+ if (!dirStat.isDirectory()) {
16
+ return NextResponse.json({ error: 'Path is not a directory' }, { status: 400 });
17
+ }
18
+ }
19
+ catch (error) {
20
+ if (isErrnoException(error) && error.code === 'ENOENT') {
21
+ return NextResponse.json({ error: 'Directory not found' }, { status: 404 });
22
+ }
23
+ const message = error instanceof Error ? error.message : 'Failed to access path';
24
+ return NextResponse.json({ error: message }, { status: 500 });
25
+ }
26
+ try {
27
+ const dirents = await readdir(resolvedPath, { withFileTypes: true });
28
+ const entries = [];
29
+ const entryPromises = dirents.map(async (dirent) => {
30
+ if (!showHidden && dirent.name.startsWith('.')) {
31
+ return null;
32
+ }
33
+ const entryPath = path.join(resolvedPath, dirent.name);
34
+ try {
35
+ if (dirent.isDirectory()) {
36
+ const entryStat = await stat(entryPath);
37
+ return {
38
+ name: dirent.name,
39
+ path: entryPath,
40
+ isDirectory: true,
41
+ updatedAt: entryStat.mtime.toISOString(),
42
+ };
43
+ }
44
+ if (dirent.isSymbolicLink()) {
45
+ const entryStat = await stat(entryPath);
46
+ if (entryStat.isDirectory()) {
47
+ return {
48
+ name: dirent.name,
49
+ path: entryPath,
50
+ isDirectory: true,
51
+ updatedAt: entryStat.mtime.toISOString(),
52
+ };
53
+ }
54
+ }
55
+ }
56
+ catch {
57
+ // Skip inaccessible entries (permission denied, broken symlinks)
58
+ }
59
+ return null;
60
+ });
61
+ const results = await Promise.all(entryPromises);
62
+ for (const result of results) {
63
+ if (result !== null) {
64
+ entries.push(result);
65
+ }
66
+ }
67
+ return NextResponse.json({ entries, currentPath: resolvedPath });
68
+ }
69
+ catch (error) {
70
+ const message = error instanceof Error ? error.message : 'Failed to read directory';
71
+ return NextResponse.json({ error: message }, { status: 500 });
72
+ }
73
+ }
74
+ function isErrnoException(error) {
75
+ return error instanceof Error && 'code' in error;
76
+ }
@@ -1,5 +1,6 @@
1
1
  import type { Metadata } from 'next';
2
2
  import '@xyflow/react/dist/base.css';
3
+ import '@cubone/react-file-manager/dist/style.css';
3
4
  import './globals.css';
4
5
  /** Force dynamic rendering for all pages since they depend on client-side context. */
5
6
  export declare const dynamic = "force-dynamic";
@@ -1 +1 @@
1
- {"version":3,"file":"layout.d.ts","sourceRoot":"","sources":["../../../../../src/presentation/web/app/layout.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,MAAM,CAAC;AACrC,OAAO,6BAA6B,CAAC;AACrC,OAAO,eAAe,CAAC;AAMvB,sFAAsF;AACtF,eAAO,MAAM,OAAO,kBAAkB,CAAC;AAEvC,eAAO,MAAM,QAAQ,EAAE,QAkBtB,CAAC;AAEF,MAAM,CAAC,OAAO,UAAU,UAAU,CAAC,EACjC,QAAQ,GACT,EAAE,QAAQ,CAAC;IACV,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAC;CAC3B,CAAC,2CA4BD"}
1
+ {"version":3,"file":"layout.d.ts","sourceRoot":"","sources":["../../../../../src/presentation/web/app/layout.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,MAAM,CAAC;AACrC,OAAO,6BAA6B,CAAC;AACrC,OAAO,2CAA2C,CAAC;AACnD,OAAO,eAAe,CAAC;AAMvB,sFAAsF;AACtF,eAAO,MAAM,OAAO,kBAAkB,CAAC;AAEvC,eAAO,MAAM,QAAQ,EAAE,QAkBtB,CAAC;AAEF,MAAM,CAAC,OAAO,UAAU,UAAU,CAAC,EACjC,QAAQ,GACT,EAAE,QAAQ,CAAC;IACV,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAC;CAC3B,CAAC,2CA4BD"}
@@ -1,5 +1,6 @@
1
1
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
2
  import '@xyflow/react/dist/base.css';
3
+ import '@cubone/react-file-manager/dist/style.css';
3
4
  import './globals.css';
4
5
  import { AppShell } from '../components/layouts/app-shell/index.js';
5
6
  import { Toaster } from '../components/ui/sonner.js';
@@ -1 +1 @@
1
- {"version":3,"file":"add-repository-button.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/common/add-repository-button/add-repository-button.tsx"],"names":[],"mappings":"AAUA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,sCAAsC,CAAC;AAEvE,MAAM,WAAW,wBAAwB;IACvC,QAAQ,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IAClC,cAAc,CAAC,EAAE,CAAC,UAAU,EAAE,UAAU,KAAK,IAAI,CAAC;CACnD;AAED,wBAAgB,mBAAmB,CAAC,EAAE,QAAQ,EAAE,cAAc,EAAE,EAAE,wBAAwB,2CA2FzF"}
1
+ {"version":3,"file":"add-repository-button.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/common/add-repository-button/add-repository-button.tsx"],"names":[],"mappings":"AAWA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,sCAAsC,CAAC;AAEvE,MAAM,WAAW,wBAAwB;IACvC,QAAQ,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IAClC,cAAc,CAAC,EAAE,CAAC,UAAU,EAAE,UAAU,KAAK,IAAI,CAAC;CACnD;AAED,wBAAgB,mBAAmB,CAAC,EAAE,QAAQ,EAAE,cAAc,EAAE,EAAE,wBAAwB,2CAsHzF"}
@@ -6,17 +6,24 @@ import { Button } from '../../ui/button.js';
6
6
  import { Tooltip, TooltipContent, TooltipProvider, TooltipTrigger } from '../../ui/tooltip.js';
7
7
  import { Popover, PopoverContent, PopoverTrigger } from '../../ui/popover.js';
8
8
  import { GitHubImportDialog } from '../../common/github-import-dialog/index.js';
9
- import { pickFolder } from './pick-folder.js';
10
9
  import { useFeatureFlags } from '../../../hooks/feature-flags-context.js';
10
+ import { ReactFileManagerDialog } from '../../common/react-file-manager-dialog/index.js';
11
+ import { pickFolder } from './pick-folder.js';
11
12
  export function AddRepositoryButton({ onSelect, onGitHubImport }) {
12
13
  const featureFlags = useFeatureFlags();
13
14
  const [loading, setLoading] = useState(false);
14
15
  const [popoverOpen, setPopoverOpen] = useState(false);
15
16
  const [githubDialogOpen, setGithubDialogOpen] = useState(false);
17
+ const [showReactPicker, setShowReactPicker] = useState(false);
18
+ const { reactFileManager: useReactFileManager } = featureFlags;
16
19
  async function handleLocalFolder() {
17
20
  setPopoverOpen(false);
18
21
  if (loading)
19
22
  return;
23
+ if (useReactFileManager) {
24
+ setShowReactPicker(true);
25
+ return;
26
+ }
20
27
  setLoading(true);
21
28
  try {
22
29
  const path = await pickFolder();
@@ -24,6 +31,10 @@ export function AddRepositoryButton({ onSelect, onGitHubImport }) {
24
31
  onSelect?.(path);
25
32
  }
26
33
  }
34
+ catch {
35
+ // Native picker failed — fall back to React file manager
36
+ setShowReactPicker(true);
37
+ }
27
38
  finally {
28
39
  setLoading(false);
29
40
  }
@@ -38,5 +49,15 @@ export function AddRepositoryButton({ onSelect, onGitHubImport }) {
38
49
  onSelect?.(repository.path);
39
50
  }
40
51
  }
41
- return (_jsxs(_Fragment, { children: [_jsxs(Popover, { open: popoverOpen, onOpenChange: setPopoverOpen, children: [_jsx(TooltipProvider, { children: _jsxs(Tooltip, { children: [_jsx(TooltipTrigger, { asChild: true, children: _jsx(PopoverTrigger, { asChild: true, children: _jsx(Button, { variant: "ghost", size: "icon", "aria-label": "Add Repository", "data-testid": "add-repository-button", disabled: loading, children: loading ? (_jsx(Loader2, { className: "h-5 w-5 animate-spin" })) : (_jsx(Plus, { className: "h-5 w-5" })) }) }) }), _jsx(TooltipContent, { children: "Add Repository" })] }) }), _jsxs(PopoverContent, { className: "w-48 p-1", align: "start", children: [_jsxs("button", { type: "button", className: "hover:bg-accent flex w-full items-center gap-2 rounded-sm px-2 py-1.5 text-sm", onClick: handleLocalFolder, "data-testid": "add-repo-local-folder", children: [_jsx(FolderPlus, { className: "h-4 w-4" }), "Local folder"] }), featureFlags.githubImport ? (_jsxs("button", { type: "button", className: "hover:bg-accent flex w-full items-center gap-2 rounded-sm px-2 py-1.5 text-sm", onClick: handleFromGitHub, "data-testid": "add-repo-from-github", children: [_jsx(Github, { className: "h-4 w-4" }), "From GitHub"] })) : null] })] }), featureFlags.githubImport ? (_jsx(GitHubImportDialog, { open: githubDialogOpen, onOpenChange: setGithubDialogOpen, onImportComplete: handleImportComplete })) : null] }));
52
+ function handleReactPickerSelect(path) {
53
+ if (path) {
54
+ onSelect?.(path);
55
+ }
56
+ setShowReactPicker(false);
57
+ }
58
+ return (_jsxs(_Fragment, { children: [_jsxs(Popover, { open: popoverOpen, onOpenChange: setPopoverOpen, children: [_jsx(TooltipProvider, { children: _jsxs(Tooltip, { children: [_jsx(TooltipTrigger, { asChild: true, children: _jsx(PopoverTrigger, { asChild: true, children: _jsx(Button, { variant: "ghost", size: "icon", "aria-label": "Add Repository", "data-testid": "add-repository-button", disabled: loading, children: loading ? (_jsx(Loader2, { className: "h-5 w-5 animate-spin" })) : (_jsx(Plus, { className: "h-5 w-5" })) }) }) }), _jsx(TooltipContent, { children: "Add Repository" })] }) }), _jsxs(PopoverContent, { className: "w-48 p-1", align: "start", children: [_jsxs("button", { type: "button", className: "hover:bg-accent flex w-full items-center gap-2 rounded-sm px-2 py-1.5 text-sm", onClick: handleLocalFolder, "data-testid": "add-repo-local-folder", children: [_jsx(FolderPlus, { className: "h-4 w-4" }), "Local folder"] }), featureFlags.githubImport ? (_jsxs("button", { type: "button", className: "hover:bg-accent flex w-full items-center gap-2 rounded-sm px-2 py-1.5 text-sm", onClick: handleFromGitHub, "data-testid": "add-repo-from-github", children: [_jsx(Github, { className: "h-4 w-4" }), "From GitHub"] })) : null] })] }), featureFlags.githubImport ? (_jsx(GitHubImportDialog, { open: githubDialogOpen, onOpenChange: setGithubDialogOpen, onImportComplete: handleImportComplete })) : null, _jsx(ReactFileManagerDialog, { open: showReactPicker, onOpenChange: (open) => {
59
+ if (!open) {
60
+ setShowReactPicker(false);
61
+ }
62
+ }, onSelect: handleReactPickerSelect })] }));
42
63
  }
@@ -1 +1 @@
1
- {"version":3,"file":"feature-drawer-client.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/common/control-center-drawer/feature-drawer-client.tsx"],"names":[],"mappings":"AAuCA,OAAO,KAAK,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAI/D,MAAM,WAAW,wBAAwB;IACvC,IAAI,EAAE,UAAU,CAAC;IACjB,8FAA8F;IAC9F,MAAM,CAAC,EAAE,aAAa,CAAC;CACxB;AAED,wBAAgB,mBAAmB,CAAC,EAAE,IAAI,EAAE,WAAW,EAAE,MAAM,EAAE,EAAE,wBAAwB,2CAskB1F"}
1
+ {"version":3,"file":"feature-drawer-client.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/common/control-center-drawer/feature-drawer-client.tsx"],"names":[],"mappings":"AAuCA,OAAO,KAAK,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAI/D,MAAM,WAAW,wBAAwB;IACvC,IAAI,EAAE,UAAU,CAAC;IACjB,8FAA8F;IAC9F,MAAM,CAAC,EAAE,aAAa,CAAC;CACxB;AAED,wBAAgB,mBAAmB,CAAC,EAAE,IAAI,EAAE,WAAW,EAAE,MAAM,EAAE,EAAE,wBAAwB,2CA8lB1F"}
@@ -113,6 +113,22 @@ export function FeatureDrawerClient({ view: initialView, urlTab }) {
113
113
  useEffect(() => {
114
114
  setChatInput('');
115
115
  }, [initialTab]);
116
+ // ── Artifact refresh key ─────────────────────────────────────────────
117
+ // Increments whenever state or lifecycle changes (via SSE or background sync),
118
+ // forcing useArtifactFetch to re-fetch even when the featureId stays the same.
119
+ // This fixes race conditions where the first fetch fires too early (e.g. merge
120
+ // data requested before the PR is created) and subsequent state updates don't
121
+ // trigger a re-fetch because the featureId dep hasn't changed.
122
+ const artifactRefreshKeyRef = useRef(0);
123
+ const prevStateRef = useRef(featureNode?.state);
124
+ const prevLifecycleRef = useRef(featureNode?.lifecycle);
125
+ if (featureNode?.state !== prevStateRef.current ||
126
+ featureNode?.lifecycle !== prevLifecycleRef.current) {
127
+ prevStateRef.current = featureNode?.state;
128
+ prevLifecycleRef.current = featureNode?.lifecycle;
129
+ artifactRefreshKeyRef.current += 1;
130
+ }
131
+ const artifactRefreshKey = artifactRefreshKeyRef.current;
116
132
  // ── Data fetching ─────────────────────────────────────────────────────
117
133
  const prdFeatureId = featureNode?.lifecycle === 'requirements' && featureNode?.state === 'action-required'
118
134
  ? featureNode.featureId
@@ -137,7 +153,7 @@ export function FeatureDrawerClient({ view: initialView, urlTab }) {
137
153
  setPrdSelections({});
138
154
  setPrdDefaultSelections({});
139
155
  setPrdData(null);
140
- }, 'Failed to load questionnaire');
156
+ }, 'Failed to load questionnaire', artifactRefreshKey);
141
157
  const techFeatureId = featureNode?.lifecycle === 'implementation' && featureNode?.state === 'action-required'
142
158
  ? featureNode.featureId
143
159
  : null;
@@ -148,11 +164,11 @@ export function FeatureDrawerClient({ view: initialView, urlTab }) {
148
164
  }
149
165
  if (result.techDecisions)
150
166
  setTechData(result.techDecisions);
151
- }, () => setTechData(null), 'Failed to load tech decisions');
167
+ }, () => setTechData(null), 'Failed to load tech decisions', artifactRefreshKey);
152
168
  const isLoadingTechProduct = useArtifactFetch(techFeatureId, getFeatureArtifact, (result) => {
153
169
  if (result.productDecisions)
154
170
  setTechProductData(result.productDecisions);
155
- }, () => setTechProductData(undefined));
171
+ }, () => setTechProductData(undefined), undefined, artifactRefreshKey);
156
172
  const mergeFeatureId = featureNode?.lifecycle === 'review' &&
157
173
  (featureNode?.state === 'action-required' || featureNode?.state === 'error')
158
174
  ? featureNode.featureId
@@ -163,7 +179,7 @@ export function FeatureDrawerClient({ view: initialView, urlTab }) {
163
179
  return;
164
180
  }
165
181
  setMergeData(result);
166
- }, () => setMergeData(null), 'Failed to load merge review data');
182
+ }, () => setMergeData(null), 'Failed to load merge review data', artifactRefreshKey);
167
183
  // ── Close guard ──────────────────────────────────────────────────────
168
184
  const isChatDirty = chatInput.trim().length > 0;
169
185
  const isPrdDirty = featureNode?.lifecycle === 'requirements' &&
@@ -7,7 +7,8 @@
7
7
  * @param onSuccess - Called with the fetch result when successful and not cancelled.
8
8
  * @param onReset - Called immediately when featureId changes (before fetching).
9
9
  * @param errorMessage - Optional toast message shown on fetch failure.
10
+ * @param refreshKey - Optional key that forces a re-fetch when it changes (even if featureId is the same).
10
11
  * @returns Whether the fetch is currently in progress.
11
12
  */
12
- export declare function useArtifactFetch<TResult>(featureId: string | null, fetcher: (id: string) => Promise<TResult>, onSuccess: (result: TResult) => void, onReset: () => void, errorMessage?: string): boolean;
13
+ export declare function useArtifactFetch<TResult>(featureId: string | null, fetcher: (id: string) => Promise<TResult>, onSuccess: (result: TResult) => void, onReset: () => void, errorMessage?: string, refreshKey?: number): boolean;
13
14
  //# sourceMappingURL=use-artifact-fetch.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"use-artifact-fetch.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/common/control-center-drawer/use-artifact-fetch.ts"],"names":[],"mappings":"AAKA;;;;;;;;;;GAUG;AACH,wBAAgB,gBAAgB,CAAC,OAAO,EACtC,SAAS,EAAE,MAAM,GAAG,IAAI,EACxB,OAAO,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,OAAO,CAAC,OAAO,CAAC,EACzC,SAAS,EAAE,CAAC,MAAM,EAAE,OAAO,KAAK,IAAI,EACpC,OAAO,EAAE,MAAM,IAAI,EACnB,YAAY,CAAC,EAAE,MAAM,GACpB,OAAO,CAiCT"}
1
+ {"version":3,"file":"use-artifact-fetch.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/common/control-center-drawer/use-artifact-fetch.ts"],"names":[],"mappings":"AAKA;;;;;;;;;;;GAWG;AACH,wBAAgB,gBAAgB,CAAC,OAAO,EACtC,SAAS,EAAE,MAAM,GAAG,IAAI,EACxB,OAAO,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,OAAO,CAAC,OAAO,CAAC,EACzC,SAAS,EAAE,CAAC,MAAM,EAAE,OAAO,KAAK,IAAI,EACpC,OAAO,EAAE,MAAM,IAAI,EACnB,YAAY,CAAC,EAAE,MAAM,EACrB,UAAU,CAAC,EAAE,MAAM,GAClB,OAAO,CAiCT"}
@@ -10,9 +10,10 @@ import { toast } from 'sonner';
10
10
  * @param onSuccess - Called with the fetch result when successful and not cancelled.
11
11
  * @param onReset - Called immediately when featureId changes (before fetching).
12
12
  * @param errorMessage - Optional toast message shown on fetch failure.
13
+ * @param refreshKey - Optional key that forces a re-fetch when it changes (even if featureId is the same).
13
14
  * @returns Whether the fetch is currently in progress.
14
15
  */
15
- export function useArtifactFetch(featureId, fetcher, onSuccess, onReset, errorMessage) {
16
+ export function useArtifactFetch(featureId, fetcher, onSuccess, onReset, errorMessage, refreshKey) {
16
17
  const [isLoading, setIsLoading] = useState(false);
17
18
  // Use refs to avoid stale callbacks in the effect without triggering re-runs.
18
19
  const onSuccessRef = useRef(onSuccess);
@@ -41,6 +42,6 @@ export function useArtifactFetch(featureId, fetcher, onSuccess, onReset, errorMe
41
42
  return () => {
42
43
  cancelled = true;
43
44
  };
44
- }, [featureId, fetcher, errorMessage]);
45
+ }, [featureId, fetcher, errorMessage, refreshKey]);
45
46
  return isLoading;
46
47
  }
@@ -1 +1 @@
1
- {"version":3,"file":"feature-create-drawer.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/common/feature-create-drawer/feature-create-drawer.tsx"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"feature-create-drawer.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/common/feature-create-drawer/feature-create-drawer.tsx"],"names":[],"mappings":"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"}
@@ -19,6 +19,8 @@ import { AttachmentChip } from '../../common/attachment-chip/index.js';
19
19
  import { AgentModelPicker } from '../../features/settings/AgentModelPicker/index.js';
20
20
  import { Separator } from '../../ui/separator.js';
21
21
  import { pickFolder } from '../../common/add-repository-button/pick-folder.js';
22
+ import { ReactFileManagerDialog } from '../../common/react-file-manager-dialog/index.js';
23
+ import { useFeatureFlags } from '../../../hooks/feature-flags-context.js';
22
24
  import { addRepository } from '../../../app/actions/add-repository.js';
23
25
  import { pickFiles } from './pick-files.js';
24
26
  const MAX_FILE_SIZE = 10 * 1024 * 1024; // 10 MB
@@ -492,7 +494,9 @@ export function RepositoryCombobox({ repositories, value, onChange, onAddReposit
492
494
  const [query, setQuery] = useState('');
493
495
  const [isAdding, setIsAdding] = useState(false);
494
496
  const [addError, setAddError] = useState(null);
497
+ const [showReactPicker, setShowReactPicker] = useState(false);
495
498
  const inputRef = useRef(null);
499
+ const { reactFileManager: useReactFileManager } = useFeatureFlags();
496
500
  const selectedRepo = repositories.find((r) => r.path === value);
497
501
  const filtered = query.trim()
498
502
  ? repositories.filter((r) => r.name.toLowerCase().includes(query.toLowerCase()) ||
@@ -503,9 +507,32 @@ export function RepositoryCombobox({ repositories, value, onChange, onAddReposit
503
507
  setOpen(false);
504
508
  setQuery('');
505
509
  }, [onChange]);
510
+ const addRepoFromPath = useCallback(async (folderPath) => {
511
+ const result = await addRepository({ path: folderPath });
512
+ if (result.error) {
513
+ setAddError(result.error);
514
+ setIsAdding(false);
515
+ return;
516
+ }
517
+ if (result.repository) {
518
+ const newRepo = {
519
+ id: result.repository.id,
520
+ name: result.repository.name,
521
+ path: result.repository.path,
522
+ };
523
+ onAddRepository?.(newRepo);
524
+ onChange(newRepo.path);
525
+ setOpen(false);
526
+ setQuery('');
527
+ }
528
+ }, [onAddRepository, onChange]);
506
529
  const handleAddRepository = useCallback(async () => {
507
530
  if (isAdding)
508
531
  return;
532
+ if (useReactFileManager) {
533
+ setShowReactPicker(true);
534
+ return;
535
+ }
509
536
  setIsAdding(true);
510
537
  setAddError(null);
511
538
  try {
@@ -514,23 +541,24 @@ export function RepositoryCombobox({ repositories, value, onChange, onAddReposit
514
541
  setIsAdding(false);
515
542
  return;
516
543
  }
517
- const result = await addRepository({ path: folderPath });
518
- if (result.error) {
519
- setAddError(result.error);
520
- setIsAdding(false);
521
- return;
522
- }
523
- if (result.repository) {
524
- const newRepo = {
525
- id: result.repository.id,
526
- name: result.repository.name,
527
- path: result.repository.path,
528
- };
529
- onAddRepository?.(newRepo);
530
- onChange(newRepo.path);
531
- setOpen(false);
532
- setQuery('');
533
- }
544
+ await addRepoFromPath(folderPath);
545
+ }
546
+ catch {
547
+ // Native picker failed — fall back to React file manager
548
+ setShowReactPicker(true);
549
+ }
550
+ finally {
551
+ setIsAdding(false);
552
+ }
553
+ }, [isAdding, useReactFileManager, addRepoFromPath]);
554
+ const handleReactPickerSelect = useCallback(async (path) => {
555
+ setShowReactPicker(false);
556
+ if (!path)
557
+ return;
558
+ setIsAdding(true);
559
+ setAddError(null);
560
+ try {
561
+ await addRepoFromPath(path);
534
562
  }
535
563
  catch (err) {
536
564
  setAddError(err instanceof Error ? err.message : 'Failed to add repository');
@@ -538,7 +566,7 @@ export function RepositoryCombobox({ repositories, value, onChange, onAddReposit
538
566
  finally {
539
567
  setIsAdding(false);
540
568
  }
541
- }, [isAdding, onAddRepository, onChange]);
569
+ }, [addRepoFromPath]);
542
570
  useEffect(() => {
543
571
  if (open) {
544
572
  setTimeout(() => inputRef.current?.focus(), 0);
@@ -547,5 +575,8 @@ export function RepositoryCombobox({ repositories, value, onChange, onAddReposit
547
575
  setQuery('');
548
576
  }
549
577
  }, [open]);
550
- return (_jsxs(Popover, { open: open, onOpenChange: setOpen, children: [_jsx(PopoverTrigger, { asChild: true, children: _jsxs("button", { type: "button", role: "combobox", "aria-expanded": open, "aria-label": "Repository", disabled: disabled, "data-testid": "repository-combobox", className: cn('border-input bg-background ring-offset-background focus:ring-ring flex h-9 w-full items-center justify-between rounded-md border px-3 py-2 text-sm focus:ring-2 focus:ring-offset-2 focus:outline-none disabled:cursor-not-allowed disabled:opacity-50', !selectedRepo && 'text-muted-foreground'), children: [_jsx("span", { className: "truncate", children: selectedRepo ? selectedRepo.name : 'Select repository...' }), _jsx(ChevronsUpDown, { className: "ml-2 h-4 w-4 shrink-0 opacity-50" })] }) }), _jsx(PopoverContent, { className: "w-80 p-0", align: "start", "data-testid": "repository-combobox-content", children: _jsxs("div", { className: "flex flex-col", children: [_jsx("div", { className: "border-b p-2", children: _jsx(Input, { ref: inputRef, placeholder: "Search repositories...", value: query, onChange: (e) => setQuery(e.target.value), className: "h-8 border-0 p-0 text-sm shadow-none focus-visible:ring-0", "data-testid": "repository-search" }) }), _jsx("div", { className: "max-h-48 overflow-y-auto py-1", role: "listbox", "aria-label": "Repositories", children: filtered.length === 0 ? (_jsx("p", { className: "text-muted-foreground px-3 py-2 text-sm", "data-testid": "repository-empty", children: "No repositories found." })) : (filtered.map((r) => (_jsxs("button", { type: "button", role: "option", "aria-selected": value === r.path, onClick: () => handleSelect(r.path), className: cn('hover:bg-accent hover:text-accent-foreground flex w-full items-center gap-2 px-3 py-2 text-sm', value === r.path && 'bg-accent/50'), "data-testid": `repository-option-${r.id}`, children: [_jsx(CheckIcon, { className: cn('h-4 w-4 shrink-0', value !== r.path && 'invisible') }), _jsxs("span", { className: "flex flex-col items-start truncate", children: [_jsx("span", { className: "truncate", children: r.name }), _jsx("span", { className: "text-muted-foreground truncate text-xs", children: r.path })] })] }, r.id)))) }), _jsx(Separator, {}), _jsxs("button", { type: "button", onClick: handleAddRepository, disabled: isAdding, className: "hover:bg-accent hover:text-accent-foreground flex w-full items-center gap-2 px-3 py-2 text-sm", "data-testid": "add-repository-item", children: [isAdding ? (_jsx(Loader2, { className: "h-4 w-4 shrink-0 animate-spin" })) : (_jsx(FolderPlus, { className: "h-4 w-4 shrink-0" })), _jsx("span", { children: "Add new repository..." })] }), addError ? (_jsx("p", { className: "px-3 pb-2 text-xs text-red-500", "data-testid": "add-repository-error", children: addError })) : null] }) })] }));
578
+ return (_jsxs(_Fragment, { children: [_jsxs(Popover, { open: open, onOpenChange: setOpen, children: [_jsx(PopoverTrigger, { asChild: true, children: _jsxs("button", { type: "button", role: "combobox", "aria-expanded": open, "aria-label": "Repository", disabled: disabled, "data-testid": "repository-combobox", className: cn('border-input bg-background ring-offset-background focus:ring-ring flex h-9 w-full items-center justify-between rounded-md border px-3 py-2 text-sm focus:ring-2 focus:ring-offset-2 focus:outline-none disabled:cursor-not-allowed disabled:opacity-50', !selectedRepo && 'text-muted-foreground'), children: [_jsx("span", { className: "truncate", children: selectedRepo ? selectedRepo.name : 'Select repository...' }), _jsx(ChevronsUpDown, { className: "ml-2 h-4 w-4 shrink-0 opacity-50" })] }) }), _jsx(PopoverContent, { className: "w-80 p-0", align: "start", "data-testid": "repository-combobox-content", children: _jsxs("div", { className: "flex flex-col", children: [_jsx("div", { className: "border-b p-2", children: _jsx(Input, { ref: inputRef, placeholder: "Search repositories...", value: query, onChange: (e) => setQuery(e.target.value), className: "h-8 border-0 p-0 text-sm shadow-none focus-visible:ring-0", "data-testid": "repository-search" }) }), _jsx("div", { className: "max-h-48 overflow-y-auto py-1", role: "listbox", "aria-label": "Repositories", children: filtered.length === 0 ? (_jsx("p", { className: "text-muted-foreground px-3 py-2 text-sm", "data-testid": "repository-empty", children: "No repositories found." })) : (filtered.map((r) => (_jsxs("button", { type: "button", role: "option", "aria-selected": value === r.path, onClick: () => handleSelect(r.path), className: cn('hover:bg-accent hover:text-accent-foreground flex w-full items-center gap-2 px-3 py-2 text-sm', value === r.path && 'bg-accent/50'), "data-testid": `repository-option-${r.id}`, children: [_jsx(CheckIcon, { className: cn('h-4 w-4 shrink-0', value !== r.path && 'invisible') }), _jsxs("span", { className: "flex flex-col items-start truncate", children: [_jsx("span", { className: "truncate", children: r.name }), _jsx("span", { className: "text-muted-foreground truncate text-xs", children: r.path })] })] }, r.id)))) }), _jsx(Separator, {}), _jsxs("button", { type: "button", onClick: handleAddRepository, disabled: isAdding, className: "hover:bg-accent hover:text-accent-foreground flex w-full items-center gap-2 px-3 py-2 text-sm", "data-testid": "add-repository-item", children: [isAdding ? (_jsx(Loader2, { className: "h-4 w-4 shrink-0 animate-spin" })) : (_jsx(FolderPlus, { className: "h-4 w-4 shrink-0" })), _jsx("span", { children: "Add new repository..." })] }), addError ? (_jsx("p", { className: "px-3 pb-2 text-xs text-red-500", "data-testid": "add-repository-error", children: addError })) : null] }) })] }), _jsx(ReactFileManagerDialog, { open: showReactPicker, onOpenChange: (isOpen) => {
579
+ if (!isOpen)
580
+ setShowReactPicker(false);
581
+ }, onSelect: handleReactPickerSelect })] }));
551
582
  }
@@ -1 +1 @@
1
- {"version":3,"file":"activity-tab.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/common/feature-drawer-tabs/activity-tab.tsx"],"names":[],"mappings":"AAoBA,OAAO,KAAK,EACV,eAAe,EACf,qBAAqB,EACtB,MAAM,yCAAyC,CAAC;AAmEjD,MAAM,WAAW,gBAAgB;IAC/B,OAAO,EAAE,eAAe,EAAE,GAAG,IAAI,CAAC;IAClC,OAAO,EAAE,OAAO,CAAC;IACjB,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,iBAAiB,CAAC,EAAE,qBAAqB,EAAE,CAAC;CAC7C;AAmED;;;;;;;GAOG;AACH,MAAM,WAAW,iBAAiB;IAChC,+BAA+B;IAC/B,MAAM,EAAE,MAAM,CAAC;IACf,0CAA0C;IAC1C,OAAO,EAAE,eAAe,EAAE,CAAC;IAC3B,mEAAmE;IACnE,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,8DAA8D;IAC9D,oBAAoB,CAAC,EAAE,MAAM,EAAE,CAAC;CACjC;AAED;;;;;;;;;GASG;AACH,wBAAgB,sBAAsB,CACpC,OAAO,EAAE,eAAe,EAAE,EAC1B,QAAQ,CAAC,EAAE,qBAAqB,EAAE,GACjC,iBAAiB,EAAE,CAgErB;AA6BD,wBAAgB,WAAW,CAAC,EAAE,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,iBAAiB,EAAE,EAAE,gBAAgB,2CAqE3F"}
1
+ {"version":3,"file":"activity-tab.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/common/feature-drawer-tabs/activity-tab.tsx"],"names":[],"mappings":"AAsBA,OAAO,KAAK,EACV,eAAe,EACf,qBAAqB,EACtB,MAAM,yCAAyC,CAAC;AAmEjD,MAAM,WAAW,gBAAgB;IAC/B,OAAO,EAAE,eAAe,EAAE,GAAG,IAAI,CAAC;IAClC,OAAO,EAAE,OAAO,CAAC;IACjB,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,iBAAiB,CAAC,EAAE,qBAAqB,EAAE,CAAC;CAC7C;AAuED;;;;;;;GAOG;AACH,MAAM,WAAW,iBAAiB;IAChC,+BAA+B;IAC/B,MAAM,EAAE,MAAM,CAAC;IACf,0CAA0C;IAC1C,OAAO,EAAE,eAAe,EAAE,CAAC;IAC3B,mEAAmE;IACnE,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,8DAA8D;IAC9D,oBAAoB,CAAC,EAAE,MAAM,EAAE,CAAC;CACjC;AAED;;;;;;;;;GASG;AACH,wBAAgB,sBAAsB,CACpC,OAAO,EAAE,eAAe,EAAE,EAC1B,QAAQ,CAAC,EAAE,qBAAqB,EAAE,GACjC,iBAAiB,EAAE,CAgErB;AA6BD,wBAAgB,WAAW,CAAC,EAAE,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,iBAAiB,EAAE,EAAE,gBAAgB,2CAqE3F"}
@@ -1,7 +1,7 @@
1
1
  'use client';
2
2
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
- import { useState, useEffect, useRef } from 'react';
4
- import { Loader2, AlertCircle, Clock, Zap, DollarSign, Play, RotateCcw, CheckCircle2, XCircle, Square, Ban, MessageSquare, Timer, ArrowDownToLine, ArrowUpFromLine, } from 'lucide-react';
3
+ import { useState, useEffect, useRef, useCallback } from 'react';
4
+ import { Loader2, AlertCircle, Clock, Zap, DollarSign, Play, RotateCcw, CheckCircle2, XCircle, Square, Ban, MessageSquare, Timer, ArrowDownToLine, ArrowUpFromLine, Copy, Check, } from 'lucide-react';
5
5
  import { InlineAttachments } from '../../common/inline-attachments/index.js';
6
6
  import { formatDuration } from '../../../lib/format-duration.js';
7
7
  /**
@@ -72,6 +72,10 @@ const NODE_TO_PHASE = {
72
72
  research: 'Researching',
73
73
  plan: 'Planning',
74
74
  implement: 'Implementing',
75
+ 'fast-implement': 'Fast Implement',
76
+ evidence: 'Evidence',
77
+ validate: 'Validating',
78
+ repair: 'Repairing',
75
79
  merge: 'Merging',
76
80
  };
77
81
  const LIFECYCLE_EVENTS = {
@@ -305,11 +309,20 @@ function NodeTimingRow({ timing, maxDurationMs, now, }) {
305
309
  const totalTokens = timing.inputTokens != null || timing.outputTokens != null
306
310
  ? (timing.inputTokens ?? 0) + (timing.outputTokens ?? 0)
307
311
  : null;
308
- return (_jsxs("div", { className: `relative flex flex-col gap-0.5 px-3 py-1.5 ${isSubPhase ? 'ml-4' : ''}`, children: [_jsxs("div", { "data-testid": `timing-bar-${timing.phase}`, className: "flex items-center gap-2", children: [_jsx("div", { className: "relative z-10 flex h-5 w-5 shrink-0 items-center justify-center", children: _jsx("div", { className: `rounded-full ${isRunning ? 'h-3 w-3 animate-pulse' : 'h-2.5 w-2.5'} ${isRunning
312
+ const [copied, setCopied] = useState(false);
313
+ const handleCopyPrompt = useCallback(() => {
314
+ if (!timing.prompt)
315
+ return;
316
+ navigator.clipboard.writeText(timing.prompt).then(() => {
317
+ setCopied(true);
318
+ setTimeout(() => setCopied(false), 1500);
319
+ });
320
+ }, [timing.prompt]);
321
+ return (_jsxs("div", { className: `group/phase relative flex flex-col gap-0.5 px-3 py-1.5 ${isSubPhase ? 'ml-4' : ''}`, children: [_jsxs("div", { "data-testid": `timing-bar-${timing.phase}`, className: "flex items-center gap-2", children: [_jsx("div", { className: "relative z-10 flex h-5 w-5 shrink-0 items-center justify-center", children: _jsx("div", { className: `rounded-full ${isRunning ? 'h-3 w-3 animate-pulse' : 'h-2.5 w-2.5'} ${isRunning
309
322
  ? 'bg-blue-500'
310
323
  : timing.completedAt
311
324
  ? 'bg-emerald-500'
312
- : 'bg-muted-foreground/30'}` }) }), _jsx("span", { className: `w-28 shrink-0 truncate text-sm font-medium ${isSubPhase ? 'text-muted-foreground' : 'text-foreground/80'}`, children: label }), _jsx("div", { className: `bg-muted relative min-w-0 flex-1 overflow-hidden rounded-full ${isSubPhase ? 'h-1.5' : 'h-2'}`, children: isRunning ? (_jsx("div", { className: "absolute inset-0 rounded-full bg-blue-500/30", style: {
325
+ : 'bg-muted-foreground/30'}` }) }), _jsx("span", { className: `w-28 shrink-0 truncate text-sm font-medium ${isSubPhase ? 'text-muted-foreground' : 'text-foreground/80'}`, children: label }), timing.prompt ? (_jsx("button", { type: "button", onClick: handleCopyPrompt, className: "text-muted-foreground/50 hover:text-foreground/70 -ml-1 shrink-0 opacity-0 transition-opacity group-hover/phase:opacity-100", title: "Copy prompt to clipboard", children: copied ? (_jsx(Check, { className: "h-3.5 w-3.5 text-emerald-500" })) : (_jsx(Copy, { className: "h-3.5 w-3.5" })) })) : null, _jsx("div", { className: `bg-muted relative min-w-0 flex-1 overflow-hidden rounded-full ${isSubPhase ? 'h-1.5' : 'h-2'}`, children: isRunning ? (_jsx("div", { className: "absolute inset-0 rounded-full bg-blue-500/30", style: {
313
326
  backgroundImage: 'linear-gradient(90deg, transparent 0%, rgb(59 130 246) 50%, transparent 100%)',
314
327
  backgroundSize: '200% 100%',
315
328
  animation: 'shimmer 1.5s ease-in-out infinite',
@@ -1 +1 @@
1
- {"version":3,"file":"feature-drawer-tabs.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/common/feature-drawer-tabs/feature-drawer-tabs.tsx"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,sCAAsC,CAAC;AAS9E,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,kCAAkC,CAAC;AACxE,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,uCAAuC,CAAC;AAClF,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,2CAA2C,CAAC;AACzF,OAAO,KAAK,EAAE,2BAA2B,EAAE,MAAM,+CAA+C,CAAC;AACjG,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,kCAAkC,CAAC;AAMxE,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,uCAAuC,CAAC;AAQ9E,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,uDAAuD,CAAC;AAkD3F,MAAM,WAAW,sBAAsB;IACrC,WAAW,EAAE,eAAe,CAAC;IAC7B,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,CAAC,EAAE,aAAa,CAAC;IAC3B,gFAAgF;IAChF,MAAM,CAAC,EAAE,aAAa,CAAC;IACvB,mFAAmF;IACnF,SAAS,CAAC,EAAE,SAAS,iBAAiB,EAAE,CAAC;IAGzC,OAAO,CAAC,EAAE,oBAAoB,GAAG,IAAI,CAAC;IACtC,aAAa,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACvC,WAAW,CAAC,EAAE,CAAC,UAAU,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,KAAK,IAAI,CAAC;IAC7D,YAAY,CAAC,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,IAAI,CAAC;IAC1C,WAAW,CAAC,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,WAAW,EAAE,gBAAgB,EAAE,KAAK,IAAI,CAAC;IAC1E,YAAY,CAAC,EAAE,OAAO,CAAC;IAGvB,QAAQ,CAAC,EAAE,uBAAuB,GAAG,IAAI,CAAC;IAC1C,aAAa,CAAC,EAAE,MAAM,IAAI,CAAC;IAC3B,YAAY,CAAC,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,WAAW,EAAE,gBAAgB,EAAE,KAAK,IAAI,CAAC;IAC3E,aAAa,CAAC,EAAE,OAAO,CAAC;IAGxB,WAAW,CAAC,EAAE,2BAA2B,GAAG,IAAI,CAAC;IAGjD,SAAS,CAAC,EAAE,eAAe,GAAG,IAAI,CAAC;IACnC,cAAc,CAAC,EAAE,MAAM,IAAI,CAAC;IAC5B,aAAa,CAAC,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,WAAW,EAAE,gBAAgB,EAAE,KAAK,IAAI,CAAC;IAC5E,cAAc,CAAC,EAAE,OAAO,CAAC;IAGzB,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,iBAAiB,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;CAC7C;AAwBD,wBAAgB,iBAAiB,CAAC,EAChC,WAAW,EACX,SAAS,EACT,UAAU,EACV,MAAM,EACN,OAAO,EACP,aAAa,EACb,WAAW,EACX,YAAY,EACZ,WAAW,EACX,YAAY,EACZ,QAAQ,EACR,aAAa,EACb,YAAY,EACZ,aAAa,EACb,WAAW,EACX,SAAS,EACT,cAAc,EACd,aAAa,EACb,cAAc,EACd,WAAW,EACX,SAAS,EACT,iBAAiB,EACjB,SAAS,GACV,EAAE,sBAAsB,2CA8UxB"}
1
+ {"version":3,"file":"feature-drawer-tabs.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/common/feature-drawer-tabs/feature-drawer-tabs.tsx"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,sCAAsC,CAAC;AAS9E,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,kCAAkC,CAAC;AACxE,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,uCAAuC,CAAC;AAClF,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,2CAA2C,CAAC;AACzF,OAAO,KAAK,EAAE,2BAA2B,EAAE,MAAM,+CAA+C,CAAC;AACjG,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,kCAAkC,CAAC;AAMxE,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,uCAAuC,CAAC;AAQ9E,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,uDAAuD,CAAC;AAkD3F,MAAM,WAAW,sBAAsB;IACrC,WAAW,EAAE,eAAe,CAAC;IAC7B,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,CAAC,EAAE,aAAa,CAAC;IAC3B,gFAAgF;IAChF,MAAM,CAAC,EAAE,aAAa,CAAC;IACvB,mFAAmF;IACnF,SAAS,CAAC,EAAE,SAAS,iBAAiB,EAAE,CAAC;IAGzC,OAAO,CAAC,EAAE,oBAAoB,GAAG,IAAI,CAAC;IACtC,aAAa,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACvC,WAAW,CAAC,EAAE,CAAC,UAAU,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,KAAK,IAAI,CAAC;IAC7D,YAAY,CAAC,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,IAAI,CAAC;IAC1C,WAAW,CAAC,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,WAAW,EAAE,gBAAgB,EAAE,KAAK,IAAI,CAAC;IAC1E,YAAY,CAAC,EAAE,OAAO,CAAC;IAGvB,QAAQ,CAAC,EAAE,uBAAuB,GAAG,IAAI,CAAC;IAC1C,aAAa,CAAC,EAAE,MAAM,IAAI,CAAC;IAC3B,YAAY,CAAC,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,WAAW,EAAE,gBAAgB,EAAE,KAAK,IAAI,CAAC;IAC3E,aAAa,CAAC,EAAE,OAAO,CAAC;IAGxB,WAAW,CAAC,EAAE,2BAA2B,GAAG,IAAI,CAAC;IAGjD,SAAS,CAAC,EAAE,eAAe,GAAG,IAAI,CAAC;IACnC,cAAc,CAAC,EAAE,MAAM,IAAI,CAAC;IAC5B,aAAa,CAAC,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,WAAW,EAAE,gBAAgB,EAAE,KAAK,IAAI,CAAC;IAC5E,cAAc,CAAC,EAAE,OAAO,CAAC;IAGzB,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,iBAAiB,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;CAC7C;AAwBD,wBAAgB,iBAAiB,CAAC,EAChC,WAAW,EACX,SAAS,EACT,UAAU,EACV,MAAM,EACN,OAAO,EACP,aAAa,EACb,WAAW,EACX,YAAY,EACZ,WAAW,EACX,YAAY,EACZ,QAAQ,EACR,aAAa,EACb,YAAY,EACZ,aAAa,EACb,WAAW,EACX,SAAS,EACT,cAAc,EACd,aAAa,EACb,cAAc,EACd,WAAW,EACX,SAAS,EACT,iBAAiB,EACjB,SAAS,GACV,EAAE,sBAAsB,2CAqVxB"}