@shepai/cli 1.164.0 → 1.164.1

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 (205) hide show
  1. package/dist/packages/core/src/application/ports/output/agents/interactive-agent-executor.interface.d.ts +3 -1
  2. package/dist/packages/core/src/application/ports/output/agents/interactive-agent-executor.interface.d.ts.map +1 -1
  3. package/dist/packages/core/src/application/ports/output/repositories/interactive-session-repository.interface.d.ts +19 -0
  4. package/dist/packages/core/src/application/ports/output/repositories/interactive-session-repository.interface.d.ts.map +1 -1
  5. package/dist/packages/core/src/application/ports/output/services/interactive-session-service.interface.d.ts +7 -1
  6. package/dist/packages/core/src/application/ports/output/services/interactive-session-service.interface.d.ts.map +1 -1
  7. package/dist/packages/core/src/application/use-cases/interactive/send-interactive-message.use-case.d.ts +2 -0
  8. package/dist/packages/core/src/application/use-cases/interactive/send-interactive-message.use-case.d.ts.map +1 -1
  9. package/dist/packages/core/src/application/use-cases/interactive/send-interactive-message.use-case.js +1 -1
  10. package/dist/packages/core/src/infrastructure/persistence/sqlite/migrations/051-add-session-usage-tracking.d.ts +18 -0
  11. package/dist/packages/core/src/infrastructure/persistence/sqlite/migrations/051-add-session-usage-tracking.d.ts.map +1 -0
  12. package/dist/packages/core/src/infrastructure/persistence/sqlite/migrations/051-add-session-usage-tracking.js +32 -0
  13. package/dist/packages/core/src/infrastructure/repositories/sqlite-interactive-session.repository.d.ts +12 -0
  14. package/dist/packages/core/src/infrastructure/repositories/sqlite-interactive-session.repository.d.ts.map +1 -1
  15. package/dist/packages/core/src/infrastructure/repositories/sqlite-interactive-session.repository.js +31 -0
  16. package/dist/packages/core/src/infrastructure/services/agents/common/executors/claude-code-interactive-executor.service.d.ts +38 -7
  17. package/dist/packages/core/src/infrastructure/services/agents/common/executors/claude-code-interactive-executor.service.d.ts.map +1 -1
  18. package/dist/packages/core/src/infrastructure/services/agents/common/executors/claude-code-interactive-executor.service.js +152 -45
  19. package/dist/packages/core/src/infrastructure/services/interactive/interactive-session.service.d.ts +17 -1
  20. package/dist/packages/core/src/infrastructure/services/interactive/interactive-session.service.d.ts.map +1 -1
  21. package/dist/packages/core/src/infrastructure/services/interactive/interactive-session.service.js +131 -47
  22. package/dist/src/presentation/web/app/api/interactive/chat/[featureId]/messages/route.d.ts.map +1 -1
  23. package/dist/src/presentation/web/app/api/interactive/chat/[featureId]/messages/route.js +3 -1
  24. package/dist/src/presentation/web/components/assistant-ui/thread.js +8 -1
  25. package/dist/src/presentation/web/components/features/chat/ChatTab.d.ts.map +1 -1
  26. package/dist/src/presentation/web/components/features/chat/ChatTab.js +13 -7
  27. package/dist/src/presentation/web/components/features/chat/useChatRuntime.d.ts +16 -0
  28. package/dist/src/presentation/web/components/features/chat/useChatRuntime.d.ts.map +1 -1
  29. package/dist/src/presentation/web/components/features/chat/useChatRuntime.js +98 -7
  30. package/dist/src/presentation/web/components/features/settings/AgentModelPicker/index.d.ts.map +1 -1
  31. package/dist/src/presentation/web/components/features/settings/AgentModelPicker/index.js +1 -1
  32. package/dist/tsconfig.build.tsbuildinfo +1 -1
  33. package/package.json +2 -2
  34. package/web/.next/BUILD_ID +1 -1
  35. package/web/.next/build-manifest.json +2 -2
  36. package/web/.next/fallback-build-manifest.json +2 -2
  37. package/web/.next/prerender-manifest.json +3 -3
  38. package/web/.next/required-server-files.js +2 -2
  39. package/web/.next/required-server-files.json +2 -2
  40. package/web/.next/server/app/(dashboard)/@drawer/adopt/page/server-reference-manifest.json +29 -29
  41. package/web/.next/server/app/(dashboard)/@drawer/adopt/page.js.nft.json +1 -1
  42. package/web/.next/server/app/(dashboard)/@drawer/adopt/page_client-reference-manifest.js +1 -1
  43. package/web/.next/server/app/(dashboard)/@drawer/chat/page/server-reference-manifest.json +27 -27
  44. package/web/.next/server/app/(dashboard)/@drawer/chat/page.js.nft.json +1 -1
  45. package/web/.next/server/app/(dashboard)/@drawer/chat/page_client-reference-manifest.js +1 -1
  46. package/web/.next/server/app/(dashboard)/@drawer/create/page/server-reference-manifest.json +30 -30
  47. package/web/.next/server/app/(dashboard)/@drawer/create/page.js.nft.json +1 -1
  48. package/web/.next/server/app/(dashboard)/@drawer/create/page_client-reference-manifest.js +1 -1
  49. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/[tab]/page/server-reference-manifest.json +37 -37
  50. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/[tab]/page.js.nft.json +1 -1
  51. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/[tab]/page_client-reference-manifest.js +1 -1
  52. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page/server-reference-manifest.json +37 -37
  53. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page.js.nft.json +1 -1
  54. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page_client-reference-manifest.js +1 -1
  55. package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/[tab]/page/server-reference-manifest.json +28 -28
  56. package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/[tab]/page.js.nft.json +1 -1
  57. package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/[tab]/page_client-reference-manifest.js +1 -1
  58. package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page/server-reference-manifest.json +28 -28
  59. package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page.js.nft.json +1 -1
  60. package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page_client-reference-manifest.js +1 -1
  61. package/web/.next/server/app/(dashboard)/chat/page/server-reference-manifest.json +27 -27
  62. package/web/.next/server/app/(dashboard)/chat/page.js.nft.json +1 -1
  63. package/web/.next/server/app/(dashboard)/chat/page_client-reference-manifest.js +1 -1
  64. package/web/.next/server/app/(dashboard)/create/page/server-reference-manifest.json +30 -30
  65. package/web/.next/server/app/(dashboard)/create/page.js.nft.json +1 -1
  66. package/web/.next/server/app/(dashboard)/create/page_client-reference-manifest.js +1 -1
  67. package/web/.next/server/app/(dashboard)/feature/[featureId]/[tab]/page/server-reference-manifest.json +37 -37
  68. package/web/.next/server/app/(dashboard)/feature/[featureId]/[tab]/page.js.nft.json +1 -1
  69. package/web/.next/server/app/(dashboard)/feature/[featureId]/[tab]/page_client-reference-manifest.js +1 -1
  70. package/web/.next/server/app/(dashboard)/feature/[featureId]/page/server-reference-manifest.json +37 -37
  71. package/web/.next/server/app/(dashboard)/feature/[featureId]/page.js.nft.json +1 -1
  72. package/web/.next/server/app/(dashboard)/feature/[featureId]/page_client-reference-manifest.js +1 -1
  73. package/web/.next/server/app/(dashboard)/page/server-reference-manifest.json +27 -27
  74. package/web/.next/server/app/(dashboard)/page.js.nft.json +1 -1
  75. package/web/.next/server/app/(dashboard)/page_client-reference-manifest.js +1 -1
  76. package/web/.next/server/app/(dashboard)/repository/[repositoryId]/[tab]/page/server-reference-manifest.json +28 -28
  77. package/web/.next/server/app/(dashboard)/repository/[repositoryId]/[tab]/page.js.nft.json +1 -1
  78. package/web/.next/server/app/(dashboard)/repository/[repositoryId]/[tab]/page_client-reference-manifest.js +1 -1
  79. package/web/.next/server/app/(dashboard)/repository/[repositoryId]/page/server-reference-manifest.json +28 -28
  80. package/web/.next/server/app/(dashboard)/repository/[repositoryId]/page.js.nft.json +1 -1
  81. package/web/.next/server/app/(dashboard)/repository/[repositoryId]/page_client-reference-manifest.js +1 -1
  82. package/web/.next/server/app/_global-error.html +2 -2
  83. package/web/.next/server/app/_global-error.rsc +1 -1
  84. package/web/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +1 -1
  85. package/web/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  86. package/web/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  87. package/web/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  88. package/web/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  89. package/web/.next/server/app/_not-found/page/server-reference-manifest.json +6 -6
  90. package/web/.next/server/app/_not-found/page.js.nft.json +1 -1
  91. package/web/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  92. package/web/.next/server/app/settings/page/server-reference-manifest.json +9 -9
  93. package/web/.next/server/app/settings/page.js.nft.json +1 -1
  94. package/web/.next/server/app/settings/page_client-reference-manifest.js +1 -1
  95. package/web/.next/server/app/skills/page/server-reference-manifest.json +11 -11
  96. package/web/.next/server/app/skills/page.js.nft.json +1 -1
  97. package/web/.next/server/app/skills/page_client-reference-manifest.js +1 -1
  98. package/web/.next/server/app/tools/page/server-reference-manifest.json +11 -11
  99. package/web/.next/server/app/tools/page.js.nft.json +1 -1
  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 +6 -6
  102. package/web/.next/server/app/version/page.js.nft.json +1 -1
  103. package/web/.next/server/app/version/page_client-reference-manifest.js +1 -1
  104. package/web/.next/server/chunks/[root-of-the-server]__2b71641f._.js +1 -1
  105. package/web/.next/server/chunks/[root-of-the-server]__2b71641f._.js.map +1 -1
  106. package/web/.next/server/chunks/[root-of-the-server]__a402b567._.js +1 -1
  107. package/web/.next/server/chunks/ssr/744ca_web_components_common_control-center-drawer_create-drawer-client_tsx_5e26fc0a._.js +1 -1
  108. package/web/.next/server/chunks/ssr/744ca_web_components_common_control-center-drawer_create-drawer-client_tsx_5e26fc0a._.js.map +1 -1
  109. package/web/.next/server/chunks/ssr/744ca_web_components_common_control-center-drawer_feature-drawer-client_tsx_e9755fc8._.js +2 -2
  110. package/web/.next/server/chunks/ssr/744ca_web_components_common_control-center-drawer_feature-drawer-client_tsx_e9755fc8._.js.map +1 -1
  111. package/web/.next/server/chunks/ssr/[root-of-the-server]__1abe77bb._.js +2 -2
  112. package/web/.next/server/chunks/ssr/[root-of-the-server]__1abe77bb._.js.map +1 -1
  113. package/web/.next/server/chunks/ssr/[root-of-the-server]__1f389e5d._.js +1 -1
  114. package/web/.next/server/chunks/ssr/[root-of-the-server]__1f389e5d._.js.map +1 -1
  115. package/web/.next/server/chunks/ssr/[root-of-the-server]__357d99f9._.js +1 -1
  116. package/web/.next/server/chunks/ssr/[root-of-the-server]__563e4faf._.js +1 -1
  117. package/web/.next/server/chunks/ssr/[root-of-the-server]__563e4faf._.js.map +1 -1
  118. package/web/.next/server/chunks/ssr/[root-of-the-server]__7562afc6._.js +2 -2
  119. package/web/.next/server/chunks/ssr/[root-of-the-server]__7562afc6._.js.map +1 -1
  120. package/web/.next/server/chunks/ssr/[root-of-the-server]__821a11c1._.js +1 -1
  121. package/web/.next/server/chunks/ssr/[root-of-the-server]__821a11c1._.js.map +1 -1
  122. package/web/.next/server/chunks/ssr/[root-of-the-server]__86ff0bc5._.js +2 -2
  123. package/web/.next/server/chunks/ssr/[root-of-the-server]__86ff0bc5._.js.map +1 -1
  124. package/web/.next/server/chunks/ssr/[root-of-the-server]__8b0aac03._.js +1 -1
  125. package/web/.next/server/chunks/ssr/[root-of-the-server]__98740ee4._.js +1 -1
  126. package/web/.next/server/chunks/ssr/[root-of-the-server]__98740ee4._.js.map +1 -1
  127. package/web/.next/server/chunks/ssr/[root-of-the-server]__b7b96453._.js +1 -1
  128. package/web/.next/server/chunks/ssr/[root-of-the-server]__b7b96453._.js.map +1 -1
  129. package/web/.next/server/chunks/ssr/[root-of-the-server]__ba9f9e11._.js +1 -1
  130. package/web/.next/server/chunks/ssr/[root-of-the-server]__ba9f9e11._.js.map +1 -1
  131. package/web/.next/server/chunks/ssr/[root-of-the-server]__e0be67c7._.js +1 -1
  132. package/web/.next/server/chunks/ssr/[root-of-the-server]__e0be67c7._.js.map +1 -1
  133. package/web/.next/server/chunks/ssr/{_8b57edb8._.js → _0020fddd._.js} +2 -2
  134. package/web/.next/server/chunks/ssr/_0020fddd._.js.map +1 -0
  135. package/web/.next/server/chunks/ssr/_02e01240._.js +1 -1
  136. package/web/.next/server/chunks/ssr/_02e01240._.js.map +1 -1
  137. package/web/.next/server/chunks/ssr/_05c23ad9._.js +1 -1
  138. package/web/.next/server/chunks/ssr/_05c23ad9._.js.map +1 -1
  139. package/web/.next/server/chunks/ssr/_0727935d._.js +1 -1
  140. package/web/.next/server/chunks/ssr/_0727935d._.js.map +1 -1
  141. package/web/.next/server/chunks/ssr/_16eb4fec._.js +1 -1
  142. package/web/.next/server/chunks/ssr/_16eb4fec._.js.map +1 -1
  143. package/web/.next/server/chunks/ssr/_18886033._.js +1 -1
  144. package/web/.next/server/chunks/ssr/_18886033._.js.map +1 -1
  145. package/web/.next/server/chunks/ssr/_22e00a14._.js +1 -1
  146. package/web/.next/server/chunks/ssr/_22e00a14._.js.map +1 -1
  147. package/web/.next/server/chunks/ssr/{_c9f903f2._.js → _3694ac1d._.js} +2 -2
  148. package/web/.next/server/chunks/ssr/{_c9f903f2._.js.map → _3694ac1d._.js.map} +1 -1
  149. package/web/.next/server/chunks/ssr/{_2f8f89fb._.js → _423abf07._.js} +2 -2
  150. package/web/.next/server/chunks/ssr/{_2f8f89fb._.js.map → _423abf07._.js.map} +1 -1
  151. package/web/.next/server/chunks/ssr/_56b9d60f._.js +1 -1
  152. package/web/.next/server/chunks/ssr/_56b9d60f._.js.map +1 -1
  153. package/web/.next/server/chunks/ssr/_9215e9ec._.js +1 -1
  154. package/web/.next/server/chunks/ssr/_9215e9ec._.js.map +1 -1
  155. package/web/.next/server/chunks/ssr/{_52403a07._.js → _97d6bed3._.js} +2 -2
  156. package/web/.next/server/chunks/ssr/{_52403a07._.js.map → _97d6bed3._.js.map} +1 -1
  157. package/web/.next/server/chunks/ssr/_a5a5901d._.js +1 -1
  158. package/web/.next/server/chunks/ssr/_a5a5901d._.js.map +1 -1
  159. package/web/.next/server/chunks/ssr/_ad09f271._.js +1 -1
  160. package/web/.next/server/chunks/ssr/_ad09f271._.js.map +1 -1
  161. package/web/.next/server/chunks/ssr/_c3f595c6._.js +1 -1
  162. package/web/.next/server/chunks/ssr/_c3f595c6._.js.map +1 -1
  163. package/web/.next/server/chunks/ssr/_ea9e1556._.js +1 -1
  164. package/web/.next/server/chunks/ssr/_ea9e1556._.js.map +1 -1
  165. package/web/.next/server/chunks/ssr/_f1ba9be6._.js +2 -2
  166. package/web/.next/server/chunks/ssr/_f1ba9be6._.js.map +1 -1
  167. package/web/.next/server/chunks/ssr/_f33cd07e._.js +2 -2
  168. package/web/.next/server/chunks/ssr/_f33cd07e._.js.map +1 -1
  169. package/web/.next/server/chunks/ssr/_f8b45233._.js +1 -1
  170. package/web/.next/server/chunks/ssr/_f8b45233._.js.map +1 -1
  171. package/web/.next/server/chunks/ssr/b1a17_presentation_web_components_features_settings_settings-page-client_tsx_6ed9d5f8._.js +1 -1
  172. package/web/.next/server/chunks/ssr/b1a17_presentation_web_components_features_settings_settings-page-client_tsx_6ed9d5f8._.js.map +1 -1
  173. package/web/.next/server/chunks/ssr/f3a1f_components_common_control-center-drawer_repository-drawer-client_tsx_39a00c03._.js +1 -1
  174. package/web/.next/server/chunks/ssr/f3a1f_components_common_control-center-drawer_repository-drawer-client_tsx_39a00c03._.js.map +1 -1
  175. package/web/.next/server/chunks/ssr/src_presentation_web_app_actions_open-ide_ts_baaca5d5._.js +1 -1
  176. package/web/.next/server/chunks/ssr/src_presentation_web_components_895e5bfa._.js +1 -1
  177. package/web/.next/server/chunks/ssr/src_presentation_web_components_895e5bfa._.js.map +1 -1
  178. package/web/.next/server/chunks/ssr/src_presentation_web_components_features_control-center_7ac3562e._.js +1 -1
  179. package/web/.next/server/chunks/ssr/src_presentation_web_components_features_control-center_7ac3562e._.js.map +1 -1
  180. package/web/.next/server/pages/500.html +2 -2
  181. package/web/.next/server/server-reference-manifest.js +1 -1
  182. package/web/.next/server/server-reference-manifest.json +47 -47
  183. package/web/.next/static/chunks/{29f0d874b1fde3d6.js → 16eea21868510afd.js} +2 -2
  184. package/web/.next/static/chunks/2afb3ff30c02d222.js +1 -0
  185. package/web/.next/static/chunks/{dc21cf85bfa262a7.js → 2bf4ef44d86ffc3b.js} +2 -2
  186. package/web/.next/static/chunks/{cf75fade434602c6.js → 57ab723edeb11139.js} +2 -2
  187. package/web/.next/static/chunks/{25e894a1de46b5fb.js → 648c64fc71830213.js} +1 -1
  188. package/web/.next/static/chunks/{ce87ded6cc38b4de.js → 6590ee22b55e119c.js} +1 -1
  189. package/web/.next/static/chunks/{ce0316338f7e01e6.js → 87aab386fe53c79a.js} +1 -1
  190. package/web/.next/static/chunks/{498e45f8e05a5491.js → 89846d73600950d1.js} +1 -1
  191. package/web/.next/static/chunks/{cf000ba1a3f11439.js → 9ddf7523e76e17a5.js} +1 -1
  192. package/web/.next/static/chunks/{2609c8fc6f14cb26.js → 9f8caef46056054a.js} +1 -1
  193. package/web/.next/static/chunks/abffc5c232738d87.js +1 -0
  194. package/web/.next/static/chunks/{d9e4d90ef254da84.js → ba1873d442ce6a95.js} +1 -1
  195. package/web/.next/static/chunks/{ecfd93d61bf4d933.js → d45bab7ae6805b07.js} +1 -1
  196. package/web/.next/static/chunks/{56955fa252a9f3ed.js → dbd876611e25a77a.js} +2 -2
  197. package/web/.next/static/chunks/{a8243f8d06bdcef0.js → dedf6ca63c5468fa.js} +2 -2
  198. package/web/.next/static/chunks/eeadf13c0ea6cbe0.css +1 -0
  199. package/web/.next/server/chunks/ssr/_8b57edb8._.js.map +0 -1
  200. package/web/.next/static/chunks/400e93efac983a76.css +0 -1
  201. package/web/.next/static/chunks/7f491899a2fe2fd7.js +0 -1
  202. package/web/.next/static/chunks/e6398f94cffe9bc2.js +0 -1
  203. /package/web/.next/static/{rav6zzO3q2NtCKwg9XZXP → xUxHXKly7tXyWCOO7vL7O}/_buildManifest.js +0 -0
  204. /package/web/.next/static/{rav6zzO3q2NtCKwg9XZXP → xUxHXKly7tXyWCOO7vL7O}/_clientMiddlewareManifest.json +0 -0
  205. /package/web/.next/static/{rav6zzO3q2NtCKwg9XZXP → xUxHXKly7tXyWCOO7vL7O}/_ssgManifest.js +0 -0
@@ -13,11 +13,11 @@ async function fetchChatState(featureId) {
13
13
  }
14
14
  return res.json();
15
15
  }
16
- async function postMessage(featureId, content, worktreePath) {
16
+ async function postMessage(featureId, content, worktreePath, model, agentType) {
17
17
  const res = await fetch(`/api/interactive/chat/${featureId}/messages`, {
18
18
  method: 'POST',
19
19
  headers: { 'Content-Type': 'application/json' },
20
- body: JSON.stringify({ content, worktreePath }),
20
+ body: JSON.stringify({ content, worktreePath, model, agentType }),
21
21
  });
22
22
  if (!res.ok)
23
23
  throw new Error(`Failed to send message: ${res.status}`);
@@ -43,6 +43,24 @@ function chatQueryKey(featureId) {
43
43
  */
44
44
  export function useChatRuntime(featureId, worktreePath, options) {
45
45
  const queryClient = useQueryClient();
46
+ // Keep a ref to the latest model/agent so the mutation closure always
47
+ // reads the current value without depending on stale captures.
48
+ const modelRef = useRef(options?.model);
49
+ const agentTypeRef = useRef(options?.agentType);
50
+ modelRef.current = options?.model;
51
+ agentTypeRef.current = options?.agentType;
52
+ // ── Debug events (dev mode only) ────────────────────────────────────────
53
+ const debugModeRef = useRef(options?.debugMode ?? false);
54
+ debugModeRef.current = options?.debugMode ?? false;
55
+ const [debugEvents, setDebugEvents] = useState([]);
56
+ const pushDebug = useCallback((label, detail) => {
57
+ if (!debugModeRef.current)
58
+ return;
59
+ setDebugEvents((prev) => [
60
+ ...prev,
61
+ { id: `dbg-${Date.now()}-${Math.random()}`, timestamp: new Date(), label, detail },
62
+ ]);
63
+ }, []);
46
64
  // ── TanStack Query: fetch messages from backend ─────────────────────────
47
65
  const { data: chatState, isLoading: isChatLoading } = useQuery({
48
66
  queryKey: chatQueryKey(featureId),
@@ -57,6 +75,18 @@ export function useChatRuntime(featureId, worktreePath, options) {
57
75
  }, [chatState?.turnStatus, featureId]);
58
76
  const messages = useMemo(() => chatState?.messages ?? [], [chatState?.messages]);
59
77
  const sessionStatus = chatState?.sessionStatus ?? null;
78
+ // Track session status changes for debug
79
+ const prevSessionStatusRef = useRef(null);
80
+ useEffect(() => {
81
+ if (sessionStatus && sessionStatus !== prevSessionStatusRef.current) {
82
+ const info = chatState?.sessionInfo;
83
+ const detail = info
84
+ ? `model=${info.model ?? '?'}, sid=${info.sessionId?.slice(0, 8) ?? '?'}`
85
+ : undefined;
86
+ pushDebug(`session_${sessionStatus}`, detail);
87
+ }
88
+ prevSessionStatusRef.current = sessionStatus;
89
+ }, [sessionStatus, chatState?.sessionInfo, pushDebug]);
60
90
  const backendStreamingText = chatState?.streamingText ?? null;
61
91
  // Cache last known sessionInfo so PID stays visible after process exits
62
92
  const lastSessionInfoRef = useRef(null);
@@ -106,8 +136,17 @@ export function useChatRuntime(featureId, worktreePath, options) {
106
136
  // Ignore
107
137
  }
108
138
  });
109
- es.addEventListener('activity', () => {
139
+ es.addEventListener('activity', (event) => {
110
140
  cancelAwaiting();
141
+ try {
142
+ const data = JSON.parse(event.data);
143
+ if (data.activity) {
144
+ pushDebug(`[${data.activity.kind}] ${data.activity.label}`, data.activity.detail);
145
+ }
146
+ }
147
+ catch {
148
+ // Ignore
149
+ }
111
150
  // Tool events are already persisted to DB — just refetch to show them
112
151
  void queryClient.invalidateQueries({ queryKey: chatQueryKey(featureId) });
113
152
  });
@@ -117,6 +156,7 @@ export function useChatRuntime(featureId, worktreePath, options) {
117
156
  if (data.log) {
118
157
  cancelAwaiting();
119
158
  setStatusLog(data.log);
159
+ pushDebug('log', data.log);
120
160
  }
121
161
  }
122
162
  catch {
@@ -126,6 +166,7 @@ export function useChatRuntime(featureId, worktreePath, options) {
126
166
  es.addEventListener('done', () => {
127
167
  setStatusLog(null);
128
168
  cancelAwaiting();
169
+ pushDebug('turn_done');
129
170
  // Refetch first, THEN clear local streaming state so there's no gap
130
171
  void queryClient.invalidateQueries({ queryKey: chatQueryKey(featureId) }).then(() => {
131
172
  setStreamingText('');
@@ -138,11 +179,12 @@ export function useChatRuntime(featureId, worktreePath, options) {
138
179
  es.close();
139
180
  eventSourceRef.current = null;
140
181
  };
141
- }, [featureId, queryClient, cancelAwaiting]);
182
+ }, [featureId, queryClient, cancelAwaiting, pushDebug]);
142
183
  // ── Mutation: send user message ─────────────────────────────────────────
143
184
  const sendMutation = useMutation({
144
- mutationFn: (content) => postMessage(featureId, content, worktreePath ?? ''),
185
+ mutationFn: (content) => postMessage(featureId, content, worktreePath ?? '', modelRef.current, agentTypeRef.current),
145
186
  onMutate: async (content) => {
187
+ pushDebug('send_message', `model=${modelRef.current ?? 'default'}, agent=${agentTypeRef.current ?? 'default'}, len=${content.length}`);
146
188
  startAwaiting();
147
189
  // Cancel in-flight refetches so our optimistic update isn't overwritten
148
190
  await queryClient.cancelQueries({ queryKey: chatQueryKey(featureId) });
@@ -184,7 +226,47 @@ export function useChatRuntime(featureId, worktreePath, options) {
184
226
  // ── Build thread messages for assistant-ui ─────────────────────────────
185
227
  const activeStreamText = streamingText ?? backendStreamingText ?? '';
186
228
  const threadMessages = useMemo(() => {
187
- const result = messages.map(toThreadMessage);
229
+ const chatMessages = messages.map(toThreadMessage);
230
+ // Merge debug bubbles into the timeline by timestamp
231
+ let result;
232
+ if (options?.debugMode && debugEvents.length > 0) {
233
+ const debugMessages = debugEvents.map((evt) => ({
234
+ id: evt.id,
235
+ role: 'assistant',
236
+ content: [
237
+ {
238
+ type: 'text',
239
+ text: evt.detail ? `🔧 **${evt.label}** — ${evt.detail}` : `🔧 **${evt.label}**`,
240
+ },
241
+ ],
242
+ createdAt: evt.timestamp,
243
+ }));
244
+ // Merge both arrays (both already sorted by time) into one sorted list
245
+ result = [];
246
+ let ci = 0;
247
+ let di = 0;
248
+ while (ci < chatMessages.length && di < debugMessages.length) {
249
+ const chatTime = chatMessages[ci].createdAt
250
+ ? new Date(chatMessages[ci].createdAt).getTime()
251
+ : 0;
252
+ const dbgTime = debugMessages[di].createdAt
253
+ ? new Date(debugMessages[di].createdAt).getTime()
254
+ : 0;
255
+ if (chatTime <= dbgTime) {
256
+ result.push(chatMessages[ci++]);
257
+ }
258
+ else {
259
+ result.push(debugMessages[di++]);
260
+ }
261
+ }
262
+ while (ci < chatMessages.length)
263
+ result.push(chatMessages[ci++]);
264
+ while (di < debugMessages.length)
265
+ result.push(debugMessages[di++]);
266
+ }
267
+ else {
268
+ result = chatMessages;
269
+ }
188
270
  // Streaming text as the last message — may include a live activity suffix
189
271
  if (activeStreamText.trim()) {
190
272
  const parts = [{ type: 'text', text: activeStreamText }];
@@ -217,7 +299,15 @@ export function useChatRuntime(featureId, worktreePath, options) {
217
299
  });
218
300
  }
219
301
  return result;
220
- }, [messages, activeStreamText, awaitingResponse, sessionStatus, statusLog]);
302
+ }, [
303
+ messages,
304
+ activeStreamText,
305
+ awaitingResponse,
306
+ sessionStatus,
307
+ statusLog,
308
+ options?.debugMode,
309
+ debugEvents,
310
+ ]);
221
311
  // ── Status info for typing indicator ──────────────────────────────────
222
312
  const status = useMemo(() => {
223
313
  if (!isRunning)
@@ -242,6 +332,7 @@ export function useChatRuntime(featureId, worktreePath, options) {
242
332
  if (!res.ok)
243
333
  throw new Error(`Failed to clear chat: ${res.status}`);
244
334
  setStreamingText('');
335
+ setDebugEvents([]);
245
336
  setStatusLog(null);
246
337
  cancelAwaiting();
247
338
  void queryClient.invalidateQueries({ queryKey: chatQueryKey(featureId) });
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../../../../src/presentation/web/components/features/settings/AgentModelPicker/index.tsx"],"names":[],"mappings":"AAaA,MAAM,WAAW,qBAAqB;IACpC,gBAAgB,EAAE,MAAM,CAAC;IACzB,YAAY,EAAE,MAAM,CAAC;IACrB,kBAAkB,CAAC,EAAE,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IAChE,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,0EAA0E;IAC1E,IAAI,EAAE,UAAU,GAAG,UAAU,CAAC;CAC/B;AAED,wBAAgB,gBAAgB,CAAC,EAC/B,gBAAgB,EAChB,YAAY,EACZ,kBAAkB,EAClB,QAAQ,EACR,SAAS,EACT,IAAI,GACL,EAAE,qBAAqB,2CAoNvB"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../../../../src/presentation/web/components/features/settings/AgentModelPicker/index.tsx"],"names":[],"mappings":"AAaA,MAAM,WAAW,qBAAqB;IACpC,gBAAgB,EAAE,MAAM,CAAC;IACzB,YAAY,EAAE,MAAM,CAAC;IACrB,kBAAkB,CAAC,EAAE,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IAChE,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,0EAA0E;IAC1E,IAAI,EAAE,UAAU,GAAG,UAAU,CAAC;CAC/B;AAED,wBAAgB,gBAAgB,CAAC,EAC/B,gBAAgB,EAChB,YAAY,EACZ,kBAAkB,EAClB,QAAQ,EACR,SAAS,EACT,IAAI,GACL,EAAE,qBAAqB,2CAqNvB"}
@@ -84,7 +84,7 @@ export function AgentModelPicker({ initialAgentType, initialModel, onAgentModelC
84
84
  const agentLabel = groups.find((g) => g.agentType === agentType)?.label ?? agentType;
85
85
  const modelName = model ? getModelMeta(model).displayName || model : null;
86
86
  const activeGroup = drillAgent ? groups.find((g) => g.agentType === drillAgent) : null;
87
- return (_jsxs("div", { className: cn('flex flex-col gap-1', className), children: [_jsxs(Popover, { open: open, onOpenChange: setOpen, children: [_jsx(PopoverTrigger, { asChild: true, children: _jsx(Button, { variant: "outline", role: "combobox", "aria-expanded": open, disabled: isDisabled, className: "w-auto cursor-pointer justify-start font-normal hover:border-violet-300 hover:bg-violet-50/50 dark:hover:border-violet-700 dark:hover:bg-violet-950/30", children: _jsxs("span", { className: "flex items-center gap-2 truncate", children: [_jsx(AgentIcon, { className: "h-4 w-4 shrink-0" }), loading ? ('Loading…') : (_jsxs("span", { className: "flex items-center gap-1", children: [_jsx("span", { className: "text-muted-foreground text-xs", children: agentLabel }), modelName ? (_jsxs(_Fragment, { children: [_jsx("span", { className: "text-muted-foreground/50 text-xs", children: "\u00B7" }), _jsx("span", { className: "text-xs font-medium", children: modelName })] })) : null] }))] }) }) }), _jsx(PopoverContent, { className: "w-(--radix-popover-trigger-width) overflow-hidden p-0", align: "start", children: _jsxs("div", { className: "flex transition-transform duration-200 ease-in-out", style: { transform: `translateX(${level === 1 ? '-50%' : '0%'})`, width: '200%' }, children: [_jsxs("div", { className: "w-1/2 shrink-0", children: [_jsx("div", { className: "text-muted-foreground border-b px-3 py-2 text-xs font-medium", children: "Select agent" }), groups.map((group) => {
87
+ return (_jsxs("div", { className: cn('flex flex-col gap-1', className), children: [_jsxs(Popover, { open: open, onOpenChange: setOpen, children: [_jsx(PopoverTrigger, { asChild: true, children: _jsx(Button, { type: "button", variant: "outline", role: "combobox", "aria-expanded": open, disabled: isDisabled, className: "w-auto cursor-pointer justify-start font-normal hover:border-violet-300 hover:bg-violet-50/50 dark:hover:border-violet-700 dark:hover:bg-violet-950/30", children: _jsxs("span", { className: "flex items-center gap-2 truncate", children: [_jsx(AgentIcon, { className: "h-4 w-4 shrink-0" }), loading ? ('Loading…') : (_jsxs("span", { className: "flex items-center gap-1", children: [_jsx("span", { className: "text-muted-foreground text-xs", children: agentLabel }), modelName ? (_jsxs(_Fragment, { children: [_jsx("span", { className: "text-muted-foreground/50 text-xs", children: "\u00B7" }), _jsx("span", { className: "text-xs font-medium", children: modelName })] })) : null] }))] }) }) }), _jsx(PopoverContent, { className: "z-[70] w-(--radix-popover-trigger-width) overflow-hidden p-0", align: "start", children: _jsxs("div", { className: "flex transition-transform duration-200 ease-in-out", style: { transform: `translateX(${level === 1 ? '-50%' : '0%'})`, width: '200%' }, children: [_jsxs("div", { className: "w-1/2 shrink-0", children: [_jsx("div", { className: "text-muted-foreground border-b px-3 py-2 text-xs font-medium", children: "Select agent" }), groups.map((group) => {
88
88
  const GroupIcon = getAgentTypeIcon(group.agentType);
89
89
  const isActive = agentType === group.agentType;
90
90
  const hasModels = group.models.length > 0;