@shepai/cli 1.117.0 → 1.118.0-pr372.0212cc6

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 (405) hide show
  1. package/apis/json-schema/EnvironmentConfig.yaml +5 -0
  2. package/apis/json-schema/PhaseTiming.yaml +22 -1
  3. package/apis/json-schema/TerminalType.yaml +10 -0
  4. package/apis/json-schema/WorkflowConfig.yaml +10 -0
  5. package/dist/packages/core/src/application/ports/output/agents/agent-session-repository.interface.d.ts +2 -0
  6. package/dist/packages/core/src/application/ports/output/agents/agent-session-repository.interface.d.ts.map +1 -1
  7. package/dist/packages/core/src/application/ports/output/agents/phase-timing-repository.interface.d.ts +3 -3
  8. package/dist/packages/core/src/application/ports/output/agents/phase-timing-repository.interface.d.ts.map +1 -1
  9. package/dist/packages/core/src/application/ports/output/services/git-pr-service.interface.d.ts +2 -1
  10. package/dist/packages/core/src/application/ports/output/services/git-pr-service.interface.d.ts.map +1 -1
  11. package/dist/packages/core/src/domain/factories/settings-defaults.factory.d.ts.map +1 -1
  12. package/dist/packages/core/src/domain/factories/settings-defaults.factory.js +8 -1
  13. package/dist/packages/core/src/domain/generated/output.d.ts +48 -1
  14. package/dist/packages/core/src/domain/generated/output.d.ts.map +1 -1
  15. package/dist/packages/core/src/domain/generated/output.js +8 -0
  16. package/dist/packages/core/src/infrastructure/persistence/sqlite/mappers/settings.mapper.d.ts +2 -0
  17. package/dist/packages/core/src/infrastructure/persistence/sqlite/mappers/settings.mapper.d.ts.map +1 -1
  18. package/dist/packages/core/src/infrastructure/persistence/sqlite/mappers/settings.mapper.js +4 -0
  19. package/dist/packages/core/src/infrastructure/persistence/sqlite/migrations/036-add-terminal-preference.d.ts +11 -0
  20. package/dist/packages/core/src/infrastructure/persistence/sqlite/migrations/036-add-terminal-preference.d.ts.map +1 -0
  21. package/dist/packages/core/src/infrastructure/persistence/sqlite/migrations/036-add-terminal-preference.js +13 -0
  22. package/dist/packages/core/src/infrastructure/persistence/sqlite/migrations/037-add-ci-watch-enabled.d.ts +11 -0
  23. package/dist/packages/core/src/infrastructure/persistence/sqlite/migrations/037-add-ci-watch-enabled.d.ts.map +1 -0
  24. package/dist/packages/core/src/infrastructure/persistence/sqlite/migrations/037-add-ci-watch-enabled.js +15 -0
  25. package/dist/packages/core/src/infrastructure/persistence/sqlite/migrations/038-add-phase-execution-metadata.d.ts +11 -0
  26. package/dist/packages/core/src/infrastructure/persistence/sqlite/migrations/038-add-phase-execution-metadata.d.ts.map +1 -0
  27. package/dist/packages/core/src/infrastructure/persistence/sqlite/migrations/038-add-phase-execution-metadata.js +27 -0
  28. package/dist/packages/core/src/infrastructure/persistence/sqlite/migrations.js +1 -1
  29. package/dist/packages/core/src/infrastructure/repositories/sqlite-phase-timing.repository.d.ts +1 -1
  30. package/dist/packages/core/src/infrastructure/repositories/sqlite-phase-timing.repository.d.ts.map +1 -1
  31. package/dist/packages/core/src/infrastructure/repositories/sqlite-phase-timing.repository.js +32 -0
  32. package/dist/packages/core/src/infrastructure/repositories/sqlite-settings.repository.d.ts.map +1 -1
  33. package/dist/packages/core/src/infrastructure/repositories/sqlite-settings.repository.js +3 -2
  34. package/dist/packages/core/src/infrastructure/services/agents/common/executors/dev-executor.service.d.ts.map +1 -1
  35. package/dist/packages/core/src/infrastructure/services/agents/common/executors/dev-executor.service.js +8 -1
  36. package/dist/packages/core/src/infrastructure/services/agents/feature-agent/nodes/merge/ci-watch-fix-loop.d.ts.map +1 -1
  37. package/dist/packages/core/src/infrastructure/services/agents/feature-agent/nodes/merge/ci-watch-fix-loop.js +3 -2
  38. package/dist/packages/core/src/infrastructure/services/agents/feature-agent/nodes/merge/merge.node.d.ts.map +1 -1
  39. package/dist/packages/core/src/infrastructure/services/agents/feature-agent/nodes/merge/merge.node.js +29 -7
  40. package/dist/packages/core/src/infrastructure/services/agents/feature-agent/nodes/node-helpers.d.ts.map +1 -1
  41. package/dist/packages/core/src/infrastructure/services/agents/feature-agent/nodes/node-helpers.js +19 -8
  42. package/dist/packages/core/src/infrastructure/services/agents/feature-agent/nodes/prompts/merge-prompts.d.ts +5 -10
  43. package/dist/packages/core/src/infrastructure/services/agents/feature-agent/nodes/prompts/merge-prompts.d.ts.map +1 -1
  44. package/dist/packages/core/src/infrastructure/services/agents/feature-agent/nodes/prompts/merge-prompts.js +5 -73
  45. package/dist/packages/core/src/infrastructure/services/agents/feature-agent/phase-timing-context.d.ts +17 -3
  46. package/dist/packages/core/src/infrastructure/services/agents/feature-agent/phase-timing-context.d.ts.map +1 -1
  47. package/dist/packages/core/src/infrastructure/services/agents/feature-agent/phase-timing-context.js +11 -3
  48. package/dist/packages/core/src/infrastructure/services/agents/sessions/claude-code-session.repository.d.ts +7 -0
  49. package/dist/packages/core/src/infrastructure/services/agents/sessions/claude-code-session.repository.d.ts.map +1 -1
  50. package/dist/packages/core/src/infrastructure/services/agents/sessions/claude-code-session.repository.js +35 -11
  51. package/dist/packages/core/src/infrastructure/services/git/git-pr.service.d.ts +1 -1
  52. package/dist/packages/core/src/infrastructure/services/git/git-pr.service.d.ts.map +1 -1
  53. package/dist/packages/core/src/infrastructure/services/git/git-pr.service.js +12 -3
  54. package/dist/packages/core/src/infrastructure/services/tool-installer/tool-metadata.d.ts +5 -0
  55. package/dist/packages/core/src/infrastructure/services/tool-installer/tool-metadata.d.ts.map +1 -1
  56. package/dist/packages/core/src/infrastructure/services/tool-installer/tool-metadata.js +7 -0
  57. package/dist/packages/core/src/infrastructure/services/tool-installer/tools/system-terminal.json +24 -0
  58. package/dist/src/presentation/web/app/(dashboard)/@drawer/create/page.d.ts +1 -0
  59. package/dist/src/presentation/web/app/(dashboard)/@drawer/create/page.d.ts.map +1 -1
  60. package/dist/src/presentation/web/app/(dashboard)/@drawer/create/page.js +2 -2
  61. package/dist/src/presentation/web/app/(dashboard)/@drawer/feature/[featureId]/[tab]/page.d.ts.map +1 -1
  62. package/dist/src/presentation/web/app/(dashboard)/@drawer/feature/[featureId]/[tab]/page.js +1 -0
  63. package/dist/src/presentation/web/app/(dashboard)/@drawer/feature/[featureId]/page.d.ts.map +1 -1
  64. package/dist/src/presentation/web/app/(dashboard)/@drawer/feature/[featureId]/page.js +1 -0
  65. package/dist/src/presentation/web/app/(dashboard)/get-graph-data.d.ts.map +1 -1
  66. package/dist/src/presentation/web/app/(dashboard)/get-graph-data.js +1 -0
  67. package/dist/src/presentation/web/app/actions/get-available-terminals.d.ts +12 -0
  68. package/dist/src/presentation/web/app/actions/get-available-terminals.d.ts.map +1 -0
  69. package/dist/src/presentation/web/app/actions/get-available-terminals.js +53 -0
  70. package/dist/src/presentation/web/app/actions/get-feature-phase-timings.d.ts +2 -0
  71. package/dist/src/presentation/web/app/actions/get-feature-phase-timings.d.ts.map +1 -1
  72. package/dist/src/presentation/web/app/actions/get-feature-phase-timings.js +2 -0
  73. package/dist/src/presentation/web/app/actions/get-merge-review-data.d.ts.map +1 -1
  74. package/dist/src/presentation/web/app/actions/get-merge-review-data.js +49 -13
  75. package/dist/src/presentation/web/app/actions/get-workflow-defaults.d.ts +1 -0
  76. package/dist/src/presentation/web/app/actions/get-workflow-defaults.d.ts.map +1 -1
  77. package/dist/src/presentation/web/app/actions/get-workflow-defaults.js +1 -0
  78. package/dist/src/presentation/web/app/actions/open-shell.d.ts.map +1 -1
  79. package/dist/src/presentation/web/app/actions/open-shell.js +47 -3
  80. package/dist/src/presentation/web/app/api/sessions/route.d.ts +24 -0
  81. package/dist/src/presentation/web/app/api/sessions/route.d.ts.map +1 -0
  82. package/dist/src/presentation/web/app/api/sessions/route.js +230 -0
  83. package/dist/src/presentation/web/app/build-feature-node-data.d.ts +2 -0
  84. package/dist/src/presentation/web/app/build-feature-node-data.d.ts.map +1 -1
  85. package/dist/src/presentation/web/app/build-feature-node-data.js +1 -0
  86. package/dist/src/presentation/web/app/build-graph-nodes.d.ts +2 -0
  87. package/dist/src/presentation/web/app/build-graph-nodes.d.ts.map +1 -1
  88. package/dist/src/presentation/web/app/build-graph-nodes.js +11 -0
  89. package/dist/src/presentation/web/app/settings/page.d.ts.map +1 -1
  90. package/dist/src/presentation/web/app/settings/page.js +6 -2
  91. package/dist/src/presentation/web/components/common/control-center-drawer/create-drawer-client.d.ts +2 -1
  92. package/dist/src/presentation/web/components/common/control-center-drawer/create-drawer-client.d.ts.map +1 -1
  93. package/dist/src/presentation/web/components/common/control-center-drawer/create-drawer-client.js +2 -2
  94. package/dist/src/presentation/web/components/common/feature-create-drawer/feature-create-drawer.d.ts +4 -1
  95. package/dist/src/presentation/web/components/common/feature-create-drawer/feature-create-drawer.d.ts.map +1 -1
  96. package/dist/src/presentation/web/components/common/feature-create-drawer/feature-create-drawer.js +16 -3
  97. package/dist/src/presentation/web/components/common/feature-create-drawer/feature-create-drawer.stories.d.ts.map +1 -1
  98. package/dist/src/presentation/web/components/common/feature-create-drawer/feature-create-drawer.stories.js +1 -0
  99. package/dist/src/presentation/web/components/common/feature-drawer-tabs/activity-tab.d.ts.map +1 -1
  100. package/dist/src/presentation/web/components/common/feature-drawer-tabs/activity-tab.js +36 -10
  101. package/dist/src/presentation/web/components/common/feature-drawer-tabs/feature-drawer-tabs.d.ts.map +1 -1
  102. package/dist/src/presentation/web/components/common/feature-drawer-tabs/feature-drawer-tabs.js +7 -2
  103. package/dist/src/presentation/web/components/common/feature-drawer-tabs/overview-tab.js +2 -1
  104. package/dist/src/presentation/web/components/common/feature-node/feature-node-state-config.d.ts +4 -0
  105. package/dist/src/presentation/web/components/common/feature-node/feature-node-state-config.d.ts.map +1 -1
  106. package/dist/src/presentation/web/components/common/feature-node/feature-node.d.ts.map +1 -1
  107. package/dist/src/presentation/web/components/common/feature-node/feature-node.js +2 -1
  108. package/dist/src/presentation/web/components/common/feature-node/feature-sessions-dropdown.d.ts +21 -0
  109. package/dist/src/presentation/web/components/common/feature-node/feature-sessions-dropdown.d.ts.map +1 -0
  110. package/dist/src/presentation/web/components/common/feature-node/feature-sessions-dropdown.js +138 -0
  111. package/dist/src/presentation/web/components/common/feature-node/feature-sessions-dropdown.stories.d.ts +9 -0
  112. package/dist/src/presentation/web/components/common/feature-node/feature-sessions-dropdown.stories.d.ts.map +1 -0
  113. package/dist/src/presentation/web/components/common/feature-node/feature-sessions-dropdown.stories.js +77 -0
  114. package/dist/src/presentation/web/components/common/merge-review/merge-review-config.d.ts +3 -3
  115. package/dist/src/presentation/web/components/common/merge-review/merge-review-config.d.ts.map +1 -1
  116. package/dist/src/presentation/web/components/common/merge-review/merge-review.d.ts +1 -1
  117. package/dist/src/presentation/web/components/common/merge-review/merge-review.d.ts.map +1 -1
  118. package/dist/src/presentation/web/components/common/merge-review/merge-review.js +14 -20
  119. package/dist/src/presentation/web/components/common/merge-review/merge-review.stories.d.ts +6 -0
  120. package/dist/src/presentation/web/components/common/merge-review/merge-review.stories.d.ts.map +1 -1
  121. package/dist/src/presentation/web/components/common/merge-review/merge-review.stories.js +74 -0
  122. package/dist/src/presentation/web/components/common/repository-node/repository-node.d.ts.map +1 -1
  123. package/dist/src/presentation/web/components/common/repository-node/repository-node.js +35 -2
  124. package/dist/src/presentation/web/components/features/settings/environment-settings-section.d.ts +3 -1
  125. package/dist/src/presentation/web/components/features/settings/environment-settings-section.d.ts.map +1 -1
  126. package/dist/src/presentation/web/components/features/settings/environment-settings-section.js +32 -5
  127. package/dist/src/presentation/web/components/features/settings/environment-settings-section.stories.d.ts +2 -0
  128. package/dist/src/presentation/web/components/features/settings/environment-settings-section.stories.d.ts.map +1 -1
  129. package/dist/src/presentation/web/components/features/settings/environment-settings-section.stories.js +34 -1
  130. package/dist/src/presentation/web/components/features/settings/settings-page-client.d.ts +3 -1
  131. package/dist/src/presentation/web/components/features/settings/settings-page-client.d.ts.map +1 -1
  132. package/dist/src/presentation/web/components/features/settings/settings-page-client.js +61 -14
  133. package/dist/src/presentation/web/components/features/settings/workflow-settings-section.d.ts.map +1 -1
  134. package/dist/src/presentation/web/components/features/settings/workflow-settings-section.js +6 -1
  135. package/dist/src/presentation/web/components/features/settings/workflow-settings-section.stories.d.ts.map +1 -1
  136. package/dist/src/presentation/web/components/features/settings/workflow-settings-section.stories.js +3 -0
  137. package/dist/tsconfig.build.tsbuildinfo +1 -1
  138. package/package.json +1 -1
  139. package/web/.next/BUILD_ID +1 -1
  140. package/web/.next/app-path-routes-manifest.json +1 -0
  141. package/web/.next/build-manifest.json +2 -2
  142. package/web/.next/fallback-build-manifest.json +2 -2
  143. package/web/.next/prerender-manifest.json +3 -3
  144. package/web/.next/required-server-files.js +3 -3
  145. package/web/.next/required-server-files.json +3 -3
  146. package/web/.next/routes-manifest.json +6 -0
  147. package/web/.next/server/app/(dashboard)/@drawer/create/page/server-reference-manifest.json +21 -21
  148. package/web/.next/server/app/(dashboard)/@drawer/create/page.js +3 -3
  149. package/web/.next/server/app/(dashboard)/@drawer/create/page.js.nft.json +1 -1
  150. package/web/.next/server/app/(dashboard)/@drawer/create/page_client-reference-manifest.js +1 -1
  151. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/[tab]/page/server-reference-manifest.json +27 -27
  152. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/[tab]/page.js +4 -4
  153. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/[tab]/page.js.nft.json +1 -1
  154. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/[tab]/page_client-reference-manifest.js +1 -1
  155. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page/server-reference-manifest.json +27 -27
  156. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page.js +4 -4
  157. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page.js.nft.json +1 -1
  158. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page_client-reference-manifest.js +1 -1
  159. package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page/server-reference-manifest.json +19 -19
  160. package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page.js +3 -3
  161. package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page.js.nft.json +1 -1
  162. package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page_client-reference-manifest.js +1 -1
  163. package/web/.next/server/app/(dashboard)/create/page/server-reference-manifest.json +21 -21
  164. package/web/.next/server/app/(dashboard)/create/page.js +3 -3
  165. package/web/.next/server/app/(dashboard)/create/page.js.nft.json +1 -1
  166. package/web/.next/server/app/(dashboard)/create/page_client-reference-manifest.js +1 -1
  167. package/web/.next/server/app/(dashboard)/feature/[featureId]/[tab]/page/server-reference-manifest.json +27 -27
  168. package/web/.next/server/app/(dashboard)/feature/[featureId]/[tab]/page.js +4 -4
  169. package/web/.next/server/app/(dashboard)/feature/[featureId]/[tab]/page.js.nft.json +1 -1
  170. package/web/.next/server/app/(dashboard)/feature/[featureId]/[tab]/page_client-reference-manifest.js +1 -1
  171. package/web/.next/server/app/(dashboard)/feature/[featureId]/page/server-reference-manifest.json +27 -27
  172. package/web/.next/server/app/(dashboard)/feature/[featureId]/page.js +4 -4
  173. package/web/.next/server/app/(dashboard)/feature/[featureId]/page.js.nft.json +1 -1
  174. package/web/.next/server/app/(dashboard)/feature/[featureId]/page_client-reference-manifest.js +1 -1
  175. package/web/.next/server/app/(dashboard)/page/server-reference-manifest.json +19 -19
  176. package/web/.next/server/app/(dashboard)/page.js +3 -3
  177. package/web/.next/server/app/(dashboard)/page.js.nft.json +1 -1
  178. package/web/.next/server/app/(dashboard)/page_client-reference-manifest.js +1 -1
  179. package/web/.next/server/app/(dashboard)/repository/[repositoryId]/page/server-reference-manifest.json +19 -19
  180. package/web/.next/server/app/(dashboard)/repository/[repositoryId]/page.js +3 -3
  181. package/web/.next/server/app/(dashboard)/repository/[repositoryId]/page.js.nft.json +1 -1
  182. package/web/.next/server/app/(dashboard)/repository/[repositoryId]/page_client-reference-manifest.js +1 -1
  183. package/web/.next/server/app/_global-error/page.js +1 -1
  184. package/web/.next/server/app/_global-error/page.js.nft.json +1 -1
  185. package/web/.next/server/app/_global-error.html +2 -2
  186. package/web/.next/server/app/_global-error.rsc +1 -1
  187. package/web/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +1 -1
  188. package/web/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  189. package/web/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  190. package/web/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  191. package/web/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  192. package/web/.next/server/app/_not-found/page/server-reference-manifest.json +1 -1
  193. package/web/.next/server/app/_not-found/page.js +2 -2
  194. package/web/.next/server/app/_not-found/page.js.nft.json +1 -1
  195. package/web/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  196. package/web/.next/server/app/api/attachments/preview/route.js +1 -1
  197. package/web/.next/server/app/api/attachments/preview/route.js.nft.json +1 -1
  198. package/web/.next/server/app/api/evidence/route.js +1 -1
  199. package/web/.next/server/app/api/evidence/route.js.nft.json +1 -1
  200. package/web/.next/server/app/api/graph-data/route.js +1 -1
  201. package/web/.next/server/app/api/graph-data/route.js.nft.json +1 -1
  202. package/web/.next/server/app/api/sessions/route/app-paths-manifest.json +3 -0
  203. package/web/.next/server/app/api/sessions/route/build-manifest.json +11 -0
  204. package/web/.next/server/app/api/sessions/route/server-reference-manifest.json +4 -0
  205. package/web/.next/server/app/api/sessions/route.js +7 -0
  206. package/web/.next/server/app/api/sessions/route.js.map +5 -0
  207. package/web/.next/server/app/api/sessions/route.js.nft.json +1 -0
  208. package/web/.next/server/app/api/sessions/route_client-reference-manifest.js +2 -0
  209. package/web/.next/server/app/settings/page/server-reference-manifest.json +25 -10
  210. package/web/.next/server/app/settings/page.js +3 -3
  211. package/web/.next/server/app/settings/page.js.nft.json +1 -1
  212. package/web/.next/server/app/settings/page_client-reference-manifest.js +1 -1
  213. package/web/.next/server/app/skills/page/server-reference-manifest.json +6 -6
  214. package/web/.next/server/app/skills/page.js +2 -2
  215. package/web/.next/server/app/skills/page.js.nft.json +1 -1
  216. package/web/.next/server/app/skills/page_client-reference-manifest.js +1 -1
  217. package/web/.next/server/app/tools/page/server-reference-manifest.json +6 -6
  218. package/web/.next/server/app/tools/page.js +2 -2
  219. package/web/.next/server/app/tools/page.js.nft.json +1 -1
  220. package/web/.next/server/app/tools/page_client-reference-manifest.js +1 -1
  221. package/web/.next/server/app/version/page/server-reference-manifest.json +1 -1
  222. package/web/.next/server/app/version/page.js +3 -3
  223. package/web/.next/server/app/version/page.js.nft.json +1 -1
  224. package/web/.next/server/app/version/page_client-reference-manifest.js +1 -1
  225. package/web/.next/server/app-paths-manifest.json +1 -0
  226. package/web/.next/server/chunks/403f9_next_dist_esm_build_templates_app-route_370c43b1.js +1 -1
  227. package/web/.next/server/chunks/403f9_next_dist_esm_build_templates_app-route_370c43b1.js.map +1 -1
  228. package/web/.next/server/chunks/[root-of-the-server]__0fe7788d._.js +3 -0
  229. package/web/.next/server/chunks/[root-of-the-server]__0fe7788d._.js.map +1 -0
  230. package/web/.next/server/chunks/[root-of-the-server]__42b7ab55._.js +3 -0
  231. package/web/.next/server/chunks/[root-of-the-server]__42b7ab55._.js.map +1 -0
  232. package/web/.next/server/chunks/{[root-of-the-server]__7d63f9a4._.js → [root-of-the-server]__53013576._.js} +2 -2
  233. package/web/.next/server/chunks/{[root-of-the-server]__a1c7c02a._.js → [root-of-the-server]__92078db6._.js} +2 -2
  234. package/web/.next/server/chunks/[root-of-the-server]__a402b567._.js +1 -1
  235. package/web/.next/server/chunks/[root-of-the-server]__cd67a84c._.js +1 -1
  236. package/web/.next/server/chunks/[root-of-the-server]__cd67a84c._.js.map +1 -1
  237. package/web/.next/server/chunks/b1a17_presentation_web__next-internal_server_app_api_sessions_route_actions_c041a889.js +3 -0
  238. package/web/.next/server/chunks/b1a17_presentation_web__next-internal_server_app_api_sessions_route_actions_c041a889.js.map +1 -0
  239. package/web/.next/server/chunks/ssr/744ca_web_components_common_control-center-drawer_create-drawer-client_tsx_5e26fc0a._.js +1 -1
  240. package/web/.next/server/chunks/ssr/744ca_web_components_common_control-center-drawer_create-drawer-client_tsx_5e26fc0a._.js.map +1 -1
  241. package/web/.next/server/chunks/ssr/8ba4b_server_app_(dashboard)_@drawer_repository_[repositoryId]_page_actions_ed372306.js +1 -1
  242. package/web/.next/server/chunks/ssr/8ba4b_server_app_(dashboard)_@drawer_repository_[repositoryId]_page_actions_ed372306.js.map +1 -1
  243. package/web/.next/server/chunks/ssr/8ba4b_server_app_(dashboard)_repository_[repositoryId]_page_actions_32e26434.js +1 -1
  244. package/web/.next/server/chunks/ssr/8ba4b_server_app_(dashboard)_repository_[repositoryId]_page_actions_32e26434.js.map +1 -1
  245. package/web/.next/server/chunks/ssr/{[root-of-the-server]__07a39ff2._.js → [root-of-the-server]__06fef644._.js} +2 -2
  246. package/web/.next/server/chunks/ssr/{[root-of-the-server]__07a39ff2._.js.map → [root-of-the-server]__06fef644._.js.map} +1 -1
  247. package/web/.next/server/chunks/ssr/{[root-of-the-server]__4af0afe0._.js → [root-of-the-server]__2dddfea9._.js} +2 -2
  248. package/web/.next/server/chunks/ssr/{[root-of-the-server]__4af0afe0._.js.map → [root-of-the-server]__2dddfea9._.js.map} +1 -1
  249. package/web/.next/server/chunks/ssr/[root-of-the-server]__3b14e5a0._.js +3 -0
  250. package/web/.next/server/chunks/ssr/[root-of-the-server]__3b14e5a0._.js.map +1 -0
  251. package/web/.next/server/chunks/ssr/{[root-of-the-server]__9bc1434f._.js → [root-of-the-server]__4c7486cb._.js} +2 -2
  252. package/web/.next/server/chunks/ssr/{[root-of-the-server]__9bc1434f._.js.map → [root-of-the-server]__4c7486cb._.js.map} +1 -1
  253. package/web/.next/server/chunks/ssr/[root-of-the-server]__545792ab._.js +3 -0
  254. package/web/.next/server/chunks/ssr/[root-of-the-server]__545792ab._.js.map +1 -0
  255. package/web/.next/server/chunks/ssr/[root-of-the-server]__684a868c._.js +1 -1
  256. package/web/.next/server/chunks/ssr/[root-of-the-server]__684a868c._.js.map +1 -1
  257. package/web/.next/server/chunks/ssr/[root-of-the-server]__6b17a22d._.js +4 -0
  258. package/web/.next/server/chunks/ssr/{[root-of-the-server]__11033878._.js.map → [root-of-the-server]__6b17a22d._.js.map} +1 -1
  259. package/web/.next/server/chunks/ssr/[root-of-the-server]__6bb00d90._.js +4 -0
  260. package/web/.next/server/chunks/ssr/[root-of-the-server]__6bb00d90._.js.map +1 -0
  261. package/web/.next/server/chunks/ssr/[root-of-the-server]__6eb2a2b0._.js +1 -1
  262. package/web/.next/server/chunks/ssr/[root-of-the-server]__6eb2a2b0._.js.map +1 -1
  263. package/web/.next/server/chunks/ssr/[root-of-the-server]__804c006d._.js +4 -0
  264. package/web/.next/server/chunks/ssr/{[root-of-the-server]__fdc75809._.js.map → [root-of-the-server]__804c006d._.js.map} +1 -1
  265. package/web/.next/server/chunks/ssr/[root-of-the-server]__8b59c03e._.js +3 -0
  266. package/web/.next/server/chunks/ssr/[root-of-the-server]__8b59c03e._.js.map +1 -0
  267. package/web/.next/server/chunks/ssr/[root-of-the-server]__8c553503._.js +4 -0
  268. package/web/.next/server/chunks/ssr/[root-of-the-server]__8c553503._.js.map +1 -0
  269. package/web/.next/server/chunks/ssr/[root-of-the-server]__994ad9fe._.js +3 -0
  270. package/web/.next/server/chunks/ssr/[root-of-the-server]__994ad9fe._.js.map +1 -0
  271. package/web/.next/server/chunks/ssr/[root-of-the-server]__9f155c0e._.js +3 -0
  272. package/web/.next/server/chunks/ssr/[root-of-the-server]__9f155c0e._.js.map +1 -0
  273. package/web/.next/server/chunks/ssr/[root-of-the-server]__a022445f._.js +4 -0
  274. package/web/.next/server/chunks/ssr/[root-of-the-server]__a022445f._.js.map +1 -0
  275. package/web/.next/server/chunks/ssr/[root-of-the-server]__a7de2711._.js +4 -0
  276. package/web/.next/server/chunks/ssr/[root-of-the-server]__a7de2711._.js.map +1 -0
  277. package/web/.next/server/chunks/ssr/[root-of-the-server]__b724df9e._.js +3 -0
  278. package/web/.next/server/chunks/ssr/[root-of-the-server]__b724df9e._.js.map +1 -0
  279. package/web/.next/server/chunks/ssr/[root-of-the-server]__c16bf5de._.js +1 -1
  280. package/web/.next/server/chunks/ssr/[root-of-the-server]__c16bf5de._.js.map +1 -1
  281. package/web/.next/server/chunks/ssr/[root-of-the-server]__c9777776._.js +1 -1
  282. package/web/.next/server/chunks/ssr/[root-of-the-server]__c9777776._.js.map +1 -1
  283. package/web/.next/server/chunks/ssr/[root-of-the-server]__c9c1cfee._.js +3 -0
  284. package/web/.next/server/chunks/ssr/[root-of-the-server]__c9c1cfee._.js.map +1 -0
  285. package/web/.next/server/chunks/ssr/_135edb9c._.js +1 -1
  286. package/web/.next/server/chunks/ssr/_135edb9c._.js.map +1 -1
  287. package/web/.next/server/chunks/ssr/_1bb131c4._.js +1 -1
  288. package/web/.next/server/chunks/ssr/_1bb131c4._.js.map +1 -1
  289. package/web/.next/server/chunks/ssr/_1bb79fe8._.js +3 -0
  290. package/web/.next/server/chunks/ssr/_1bb79fe8._.js.map +1 -0
  291. package/web/.next/server/chunks/ssr/{_8dacd1e7._.js → _2f6f48b8._.js} +2 -2
  292. package/web/.next/server/chunks/ssr/{_8dacd1e7._.js.map → _2f6f48b8._.js.map} +1 -1
  293. package/web/.next/server/chunks/ssr/_438add33._.js +3 -0
  294. package/web/.next/server/chunks/ssr/_438add33._.js.map +1 -0
  295. package/web/.next/server/chunks/ssr/_75f4ccb3._.js +3 -0
  296. package/web/.next/server/chunks/ssr/_75f4ccb3._.js.map +1 -0
  297. package/web/.next/server/chunks/ssr/_7fb8340e._.js +3 -0
  298. package/web/.next/server/chunks/ssr/_7fb8340e._.js.map +1 -0
  299. package/web/.next/server/chunks/ssr/_ab069e13._.js +3 -0
  300. package/web/.next/server/chunks/ssr/_ab069e13._.js.map +1 -0
  301. package/web/.next/server/chunks/ssr/{_d6a1ec27._.js → _bb3e8d5b._.js} +2 -2
  302. package/web/.next/server/chunks/ssr/_bb3e8d5b._.js.map +1 -0
  303. package/web/.next/server/chunks/ssr/_cc77a143._.js +1 -1
  304. package/web/.next/server/chunks/ssr/_cc77a143._.js.map +1 -1
  305. package/web/.next/server/chunks/ssr/_f605354c._.js +9 -0
  306. package/web/.next/server/chunks/ssr/_f605354c._.js.map +1 -0
  307. package/web/.next/server/chunks/ssr/b1a17_presentation_web_components_features_settings_settings-page-client_tsx_6ed9d5f8._.js +1 -1
  308. package/web/.next/server/chunks/ssr/b1a17_presentation_web_components_features_settings_settings-page-client_tsx_6ed9d5f8._.js.map +1 -1
  309. package/web/.next/server/chunks/ssr/node_modules__pnpm_b59e4b16._.js +3 -0
  310. package/web/.next/server/chunks/ssr/node_modules__pnpm_b59e4b16._.js.map +1 -0
  311. package/web/.next/server/chunks/ssr/src_presentation_web_0835b28e._.js +2 -2
  312. package/web/.next/server/chunks/ssr/src_presentation_web_0835b28e._.js.map +1 -1
  313. package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_(dashboard)_page_actions_e99d78dd.js +1 -1
  314. package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_(dashboard)_page_actions_e99d78dd.js.map +1 -1
  315. package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_skills_page_actions_1fa8042e.js +1 -1
  316. package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_skills_page_actions_1fa8042e.js.map +1 -1
  317. package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_tools_page_actions_24684200.js +1 -1
  318. package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_tools_page_actions_24684200.js.map +1 -1
  319. package/web/.next/server/chunks/ssr/src_presentation_web_ca99d62d._.js +1 -1
  320. package/web/.next/server/chunks/ssr/src_presentation_web_ca99d62d._.js.map +1 -1
  321. package/web/.next/server/chunks/ssr/src_presentation_web_components_bdcfba35._.js +3 -0
  322. package/web/.next/server/chunks/ssr/src_presentation_web_components_bdcfba35._.js.map +1 -0
  323. package/web/.next/server/chunks/ssr/src_presentation_web_components_bf50c527._.js +1 -1
  324. package/web/.next/server/chunks/ssr/src_presentation_web_components_bf50c527._.js.map +1 -1
  325. package/web/.next/server/chunks/ssr/src_presentation_web_components_de814675._.js +1 -1
  326. package/web/.next/server/chunks/ssr/src_presentation_web_components_de814675._.js.map +1 -1
  327. package/web/.next/server/chunks/ssr/src_presentation_web_components_features_control-center_7ac3562e._.js +1 -1
  328. package/web/.next/server/chunks/ssr/src_presentation_web_components_features_control-center_7ac3562e._.js.map +1 -1
  329. package/web/.next/server/chunks/ssr/src_presentation_web_e8034a29._.js +2 -2
  330. package/web/.next/server/chunks/ssr/src_presentation_web_e8034a29._.js.map +1 -1
  331. package/web/.next/server/pages/500.html +2 -2
  332. package/web/.next/server/server-reference-manifest.js +1 -1
  333. package/web/.next/server/server-reference-manifest.json +52 -37
  334. package/web/.next/static/chunks/{498777301470975b.js → 232fae94396bd277.js} +1 -1
  335. package/web/.next/static/chunks/38b7fa587c27b9f2.js +1 -0
  336. package/web/.next/static/chunks/424bfa8457630f6e.js +2 -0
  337. package/web/.next/static/chunks/4562ee849ea13c3a.js +1 -0
  338. package/web/.next/static/chunks/{425894e5bf370bd2.js → 64d0980ec9943126.js} +2 -2
  339. package/web/.next/static/chunks/{c76f6d06b1b69b57.js → 7c950a929cfc18b5.js} +1 -1
  340. package/web/.next/static/chunks/{34b275db4ad6fb5d.js → 7c96e680a84ba93e.js} +1 -1
  341. package/web/.next/static/chunks/845d8e58a91014e6.js +1 -0
  342. package/web/.next/static/chunks/{2251df6427162751.js → 8b6436c1c90deb9a.js} +1 -1
  343. package/web/.next/static/chunks/9c534872d5483f5b.js +1 -0
  344. package/web/.next/static/chunks/cc7fd13543b950b3.js +11 -0
  345. package/web/.next/static/chunks/cca0f5112a9260d8.js +1 -0
  346. package/web/.next/static/chunks/d2739454715e5ef2.css +1 -0
  347. package/web/.next/static/chunks/{fcde0cbb2976b933.js → e2ef95d904c360f3.js} +1 -1
  348. package/web/.next/static/chunks/fc32f99270fad49d.js +1 -0
  349. package/web/.next/server/chunks/[root-of-the-server]__7d5492a0._.js +0 -3
  350. package/web/.next/server/chunks/[root-of-the-server]__7d5492a0._.js.map +0 -1
  351. package/web/.next/server/chunks/ssr/7f428_lucide-react_dist_esm_icons_rocket_1575cd4d.js +0 -3
  352. package/web/.next/server/chunks/ssr/7f428_lucide-react_dist_esm_icons_rocket_1575cd4d.js.map +0 -1
  353. package/web/.next/server/chunks/ssr/[root-of-the-server]__11033878._.js +0 -4
  354. package/web/.next/server/chunks/ssr/[root-of-the-server]__172d9576._.js +0 -3
  355. package/web/.next/server/chunks/ssr/[root-of-the-server]__172d9576._.js.map +0 -1
  356. package/web/.next/server/chunks/ssr/[root-of-the-server]__24dd0927._.js +0 -4
  357. package/web/.next/server/chunks/ssr/[root-of-the-server]__24dd0927._.js.map +0 -1
  358. package/web/.next/server/chunks/ssr/[root-of-the-server]__2a5592d5._.js +0 -3
  359. package/web/.next/server/chunks/ssr/[root-of-the-server]__2a5592d5._.js.map +0 -1
  360. package/web/.next/server/chunks/ssr/[root-of-the-server]__5d87af2e._.js +0 -4
  361. package/web/.next/server/chunks/ssr/[root-of-the-server]__5d87af2e._.js.map +0 -1
  362. package/web/.next/server/chunks/ssr/[root-of-the-server]__6367aea0._.js +0 -3
  363. package/web/.next/server/chunks/ssr/[root-of-the-server]__6367aea0._.js.map +0 -1
  364. package/web/.next/server/chunks/ssr/[root-of-the-server]__89e8a5cc._.js +0 -4
  365. package/web/.next/server/chunks/ssr/[root-of-the-server]__89e8a5cc._.js.map +0 -1
  366. package/web/.next/server/chunks/ssr/[root-of-the-server]__a93289b0._.js +0 -3
  367. package/web/.next/server/chunks/ssr/[root-of-the-server]__a93289b0._.js.map +0 -1
  368. package/web/.next/server/chunks/ssr/[root-of-the-server]__aad040c0._.js +0 -4
  369. package/web/.next/server/chunks/ssr/[root-of-the-server]__aad040c0._.js.map +0 -1
  370. package/web/.next/server/chunks/ssr/[root-of-the-server]__ac0304e7._.js +0 -3
  371. package/web/.next/server/chunks/ssr/[root-of-the-server]__ac0304e7._.js.map +0 -1
  372. package/web/.next/server/chunks/ssr/[root-of-the-server]__b1e68e34._.js +0 -3
  373. package/web/.next/server/chunks/ssr/[root-of-the-server]__b1e68e34._.js.map +0 -1
  374. package/web/.next/server/chunks/ssr/[root-of-the-server]__fdc75809._.js +0 -4
  375. package/web/.next/server/chunks/ssr/_125679ad._.js +0 -3
  376. package/web/.next/server/chunks/ssr/_125679ad._.js.map +0 -1
  377. package/web/.next/server/chunks/ssr/_250a63ae._.js +0 -3
  378. package/web/.next/server/chunks/ssr/_250a63ae._.js.map +0 -1
  379. package/web/.next/server/chunks/ssr/_273d4632._.js +0 -3
  380. package/web/.next/server/chunks/ssr/_273d4632._.js.map +0 -1
  381. package/web/.next/server/chunks/ssr/_922aa39f._.js +0 -3
  382. package/web/.next/server/chunks/ssr/_922aa39f._.js.map +0 -1
  383. package/web/.next/server/chunks/ssr/_a68d7e1c._.js +0 -9
  384. package/web/.next/server/chunks/ssr/_a68d7e1c._.js.map +0 -1
  385. package/web/.next/server/chunks/ssr/_a8d14ab2._.js +0 -3
  386. package/web/.next/server/chunks/ssr/_a8d14ab2._.js.map +0 -1
  387. package/web/.next/server/chunks/ssr/_d6a1ec27._.js.map +0 -1
  388. package/web/.next/server/chunks/ssr/_f5316e67._.js +0 -3
  389. package/web/.next/server/chunks/ssr/_f5316e67._.js.map +0 -1
  390. package/web/.next/server/chunks/ssr/src_presentation_web_components_a5e6c910._.js +0 -3
  391. package/web/.next/server/chunks/ssr/src_presentation_web_components_a5e6c910._.js.map +0 -1
  392. package/web/.next/static/chunks/2c98935265aa3622.js +0 -2
  393. package/web/.next/static/chunks/3a806cf059241bc9.js +0 -1
  394. package/web/.next/static/chunks/50f06bb71bace452.js +0 -1
  395. package/web/.next/static/chunks/55c131b6fc504375.js +0 -1
  396. package/web/.next/static/chunks/5fe03deadb83628b.js +0 -1
  397. package/web/.next/static/chunks/62a8173911f8f130.css +0 -1
  398. package/web/.next/static/chunks/b1f3c0e8e9872ef8.js +0 -1
  399. package/web/.next/static/chunks/b855de1b1e5458f6.js +0 -11
  400. package/web/.next/static/chunks/e2caffa0bb759c6c.js +0 -1
  401. /package/web/.next/server/chunks/{[root-of-the-server]__7d63f9a4._.js.map → [root-of-the-server]__53013576._.js.map} +0 -0
  402. /package/web/.next/server/chunks/{[root-of-the-server]__a1c7c02a._.js.map → [root-of-the-server]__92078db6._.js.map} +0 -0
  403. /package/web/.next/static/{bAT4Gm6M7U0lGmNAN3mTn → zBcClBvU2AkDXuIG0MLgY}/_buildManifest.js +0 -0
  404. /package/web/.next/static/{bAT4Gm6M7U0lGmNAN3mTn → zBcClBvU2AkDXuIG0MLgY}/_clientMiddlewareManifest.json +0 -0
  405. /package/web/.next/static/{bAT4Gm6M7U0lGmNAN3mTn → zBcClBvU2AkDXuIG0MLgY}/_ssgManifest.js +0 -0
@@ -1 +1 @@
1
- {"version":3,"file":"sqlite-phase-timing.repository.d.ts","sourceRoot":"","sources":["../../../../../../packages/core/src/infrastructure/repositories/sqlite-phase-timing.repository.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,QAAQ,MAAM,gBAAgB,CAAC;AAE3C,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,4EAA4E,CAAC;AACzH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,kCAAkC,CAAC;AAmDpE;;GAEG;AACH,qBACa,2BAA4B,YAAW,sBAAsB;IAC5D,OAAO,CAAC,QAAQ,CAAC,EAAE;gBAAF,EAAE,EAAE,QAAQ,CAAC,QAAQ;IAE5C,IAAI,CAAC,WAAW,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC;IAkB7C,MAAM,CACV,EAAE,EAAE,MAAM,EACV,OAAO,EAAE,OAAO,CAAC,IAAI,CAAC,WAAW,EAAE,aAAa,GAAG,YAAY,CAAC,CAAC,GAChE,OAAO,CAAC,IAAI,CAAC;IAyBV,kBAAkB,CACtB,EAAE,EAAE,MAAM,EACV,OAAO,EAAE,OAAO,CAAC,IAAI,CAAC,WAAW,EAAE,mBAAmB,GAAG,gBAAgB,CAAC,CAAC,GAC1E,OAAO,CAAC,IAAI,CAAC;IA2BV,WAAW,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC;IASvD,eAAe,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC;CAWjE"}
1
+ {"version":3,"file":"sqlite-phase-timing.repository.d.ts","sourceRoot":"","sources":["../../../../../../packages/core/src/infrastructure/repositories/sqlite-phase-timing.repository.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,QAAQ,MAAM,gBAAgB,CAAC;AAE3C,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,4EAA4E,CAAC;AACzH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,kCAAkC,CAAC;AAwEpE;;GAEG;AACH,qBACa,2BAA4B,YAAW,sBAAsB;IAC5D,OAAO,CAAC,QAAQ,CAAC,EAAE;gBAAF,EAAE,EAAE,QAAQ,CAAC,QAAQ;IAE5C,IAAI,CAAC,WAAW,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC;IAoB7C,MAAM,CACV,EAAE,EAAE,MAAM,EACV,OAAO,EAAE,OAAO,CACd,IAAI,CACF,WAAW,EACX,aAAa,GAAG,YAAY,GAAG,aAAa,GAAG,cAAc,GAAG,UAAU,GAAG,cAAc,CAC5F,CACF,GACA,OAAO,CAAC,IAAI,CAAC;IA6CV,kBAAkB,CACtB,EAAE,EAAE,MAAM,EACV,OAAO,EAAE,OAAO,CAAC,IAAI,CAAC,WAAW,EAAE,mBAAmB,GAAG,gBAAgB,CAAC,CAAC,GAC1E,OAAO,CAAC,IAAI,CAAC;IA2BV,WAAW,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC;IASvD,eAAe,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC;CAWjE"}
@@ -24,6 +24,13 @@ function toDatabase(timing) {
24
24
  duration_ms: timing.durationMs != null ? Number(timing.durationMs) : null,
25
25
  waiting_approval_at: timing.waitingApprovalAt instanceof Date ? timing.waitingApprovalAt.getTime() : null,
26
26
  approval_wait_ms: timing.approvalWaitMs != null ? Number(timing.approvalWaitMs) : null,
27
+ prompt: timing.prompt ?? null,
28
+ model_id: timing.modelId ?? null,
29
+ agent_type: timing.agentType ?? null,
30
+ input_tokens: timing.inputTokens != null ? Number(timing.inputTokens) : null,
31
+ output_tokens: timing.outputTokens != null ? Number(timing.outputTokens) : null,
32
+ exit_code: timing.exitCode ?? null,
33
+ error_message: timing.errorMessage ?? null,
27
34
  created_at: timing.createdAt instanceof Date ? timing.createdAt.getTime() : timing.createdAt,
28
35
  updated_at: timing.updatedAt instanceof Date ? timing.updatedAt.getTime() : timing.updatedAt,
29
36
  };
@@ -42,6 +49,13 @@ function fromDatabase(row) {
42
49
  waitingApprovalAt: new Date(row.waiting_approval_at),
43
50
  }),
44
51
  ...(row.approval_wait_ms !== null && { approvalWaitMs: BigInt(row.approval_wait_ms) }),
52
+ ...(row.prompt !== null && { prompt: row.prompt }),
53
+ ...(row.model_id !== null && { modelId: row.model_id }),
54
+ ...(row.agent_type !== null && { agentType: row.agent_type }),
55
+ ...(row.input_tokens !== null && { inputTokens: BigInt(row.input_tokens) }),
56
+ ...(row.output_tokens !== null && { outputTokens: BigInt(row.output_tokens) }),
57
+ ...(row.exit_code !== null && { exitCode: row.exit_code }),
58
+ ...(row.error_message !== null && { errorMessage: row.error_message }),
45
59
  };
46
60
  }
47
61
  /**
@@ -58,10 +72,12 @@ let SQLitePhaseTimingRepository = class SQLitePhaseTimingRepository {
58
72
  INSERT INTO phase_timings (
59
73
  id, agent_run_id, phase, started_at, completed_at, duration_ms,
60
74
  waiting_approval_at, approval_wait_ms,
75
+ prompt, model_id, agent_type, input_tokens, output_tokens, exit_code, error_message,
61
76
  created_at, updated_at
62
77
  ) VALUES (
63
78
  @id, @agent_run_id, @phase, @started_at, @completed_at, @duration_ms,
64
79
  @waiting_approval_at, @approval_wait_ms,
80
+ @prompt, @model_id, @agent_type, @input_tokens, @output_tokens, @exit_code, @error_message,
65
81
  @created_at, @updated_at
66
82
  )
67
83
  `);
@@ -82,6 +98,22 @@ let SQLitePhaseTimingRepository = class SQLitePhaseTimingRepository {
82
98
  setClauses.push('duration_ms = @duration_ms');
83
99
  params.duration_ms = updates.durationMs;
84
100
  }
101
+ if (updates.inputTokens !== undefined) {
102
+ setClauses.push('input_tokens = @input_tokens');
103
+ params.input_tokens = Number(updates.inputTokens);
104
+ }
105
+ if (updates.outputTokens !== undefined) {
106
+ setClauses.push('output_tokens = @output_tokens');
107
+ params.output_tokens = Number(updates.outputTokens);
108
+ }
109
+ if (updates.exitCode !== undefined) {
110
+ setClauses.push('exit_code = @exit_code');
111
+ params.exit_code = updates.exitCode;
112
+ }
113
+ if (updates.errorMessage !== undefined) {
114
+ setClauses.push('error_message = @error_message');
115
+ params.error_message = updates.errorMessage;
116
+ }
85
117
  const stmt = this.db.prepare(`UPDATE phase_timings SET ${setClauses.join(', ')} WHERE id = @id`);
86
118
  stmt.run(params);
87
119
  }
@@ -1 +1 @@
1
- {"version":3,"file":"sqlite-settings.repository.d.ts","sourceRoot":"","sources":["../../../../../../packages/core/src/infrastructure/repositories/sqlite-settings.repository.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,QAAQ,MAAM,gBAAgB,CAAC;AAE3C,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,8EAA8E,CAAC;AACxH,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,kCAAkC,CAAC;AAOjE;;;GAGG;AACH,qBACa,wBAAyB,YAAW,mBAAmB;IACtD,OAAO,CAAC,QAAQ,CAAC,EAAE;gBAAF,EAAE,EAAE,QAAQ,CAAC,QAAQ;IAElD;;;;;;OAMG;IACG,UAAU,CAAC,QAAQ,EAAE,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC;IAmEnD;;;;OAIG;IACG,IAAI,IAAI,OAAO,CAAC,QAAQ,GAAG,IAAI,CAAC;IAgBtC;;;;;OAKG;IACG,MAAM,CAAC,QAAQ,EAAE,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC;CA4EhD"}
1
+ {"version":3,"file":"sqlite-settings.repository.d.ts","sourceRoot":"","sources":["../../../../../../packages/core/src/infrastructure/repositories/sqlite-settings.repository.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,QAAQ,MAAM,gBAAgB,CAAC;AAE3C,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,8EAA8E,CAAC;AACxH,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,kCAAkC,CAAC;AAOjE;;;GAGG;AACH,qBACa,wBAAyB,YAAW,mBAAmB;IACtD,OAAO,CAAC,QAAQ,CAAC,EAAE;gBAAF,EAAE,EAAE,QAAQ,CAAC,QAAQ;IAElD;;;;;;OAMG;IACG,UAAU,CAAC,QAAQ,EAAE,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC;IAmEnD;;;;OAIG;IACG,IAAI,IAAI,OAAO,CAAC,QAAQ,GAAG,IAAI,CAAC;IAgBtC;;;;;OAKG;IACG,MAAM,CAAC,QAAQ,EAAE,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC;CA6EhD"}
@@ -46,7 +46,7 @@ let SQLiteSettingsRepository = class SQLiteSettingsRepository {
46
46
  id, created_at, updated_at,
47
47
  model_analyze, model_requirements, model_plan, model_implement, model_default,
48
48
  user_name, user_email, user_github_username,
49
- env_default_editor, env_shell_preference,
49
+ env_default_editor, env_shell_preference, env_terminal_preference,
50
50
  sys_auto_update, sys_log_level,
51
51
  agent_type, agent_auth_method, agent_token,
52
52
  notif_in_app_enabled, notif_browser_enabled, notif_desktop_enabled,
@@ -70,7 +70,7 @@ let SQLiteSettingsRepository = class SQLiteSettingsRepository {
70
70
  @id, @created_at, @updated_at,
71
71
  @model_analyze, @model_requirements, @model_plan, @model_implement, @model_default,
72
72
  @user_name, @user_email, @user_github_username,
73
- @env_default_editor, @env_shell_preference,
73
+ @env_default_editor, @env_shell_preference, @env_terminal_preference,
74
74
  @sys_auto_update, @sys_log_level,
75
75
  @agent_type, @agent_auth_method, @agent_token,
76
76
  @notif_in_app_enabled, @notif_browser_enabled, @notif_desktop_enabled,
@@ -141,6 +141,7 @@ let SQLiteSettingsRepository = class SQLiteSettingsRepository {
141
141
  user_github_username = @user_github_username,
142
142
  env_default_editor = @env_default_editor,
143
143
  env_shell_preference = @env_shell_preference,
144
+ env_terminal_preference = @env_terminal_preference,
144
145
  sys_auto_update = @sys_auto_update,
145
146
  sys_log_level = @sys_log_level,
146
147
  agent_type = @agent_type,
@@ -1 +1 @@
1
- {"version":3,"file":"dev-executor.service.d.ts","sourceRoot":"","sources":["../../../../../../../../../packages/core/src/infrastructure/services/agents/common/executors/dev-executor.service.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,SAAS,EAAE,YAAY,EAAE,MAAM,2CAA2C,CAAC;AACzF,OAAO,KAAK,EACV,cAAc,EACd,qBAAqB,EACrB,oBAAoB,EACpB,yBAAyB,EAC1B,MAAM,4EAA4E,CAAC;AAwIpF,qBAAa,uBAAwB,YAAW,cAAc;IAC5D,QAAQ,CAAC,SAAS,EAAE,SAAS,CAAsB;IACnD,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAS;;IAM3B,OAAO,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,qBAAqB,GAAG,OAAO,CAAC,oBAAoB,CAAC;IAOvF,aAAa,CAClB,MAAM,EAAE,MAAM,EACd,OAAO,CAAC,EAAE,qBAAqB,GAC9B,aAAa,CAAC,yBAAyB,CAAC;IAK3C,eAAe,CAAC,QAAQ,EAAE,YAAY,GAAG,OAAO;IAIhD,OAAO,CAAC,QAAQ;CAmEjB"}
1
+ {"version":3,"file":"dev-executor.service.d.ts","sourceRoot":"","sources":["../../../../../../../../../packages/core/src/infrastructure/services/agents/common/executors/dev-executor.service.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,SAAS,EAAE,YAAY,EAAE,MAAM,2CAA2C,CAAC;AACzF,OAAO,KAAK,EACV,cAAc,EACd,qBAAqB,EACrB,oBAAoB,EACpB,yBAAyB,EAC1B,MAAM,4EAA4E,CAAC;AAwIpF,qBAAa,uBAAwB,YAAW,cAAc;IAC5D,QAAQ,CAAC,SAAS,EAAE,SAAS,CAAsB;IACnD,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAS;;IAM3B,OAAO,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,qBAAqB,GAAG,OAAO,CAAC,oBAAoB,CAAC;IAcvF,aAAa,CAClB,MAAM,EAAE,MAAM,EACd,OAAO,CAAC,EAAE,qBAAqB,GAC9B,aAAa,CAAC,yBAAyB,CAAC;IAK3C,eAAe,CAAC,QAAQ,EAAE,YAAY,GAAG,OAAO;IAIhD,OAAO,CAAC,QAAQ;CAmEjB"}
@@ -131,7 +131,14 @@ export class DevAgentExecutorService {
131
131
  if (this.delayMs > 0) {
132
132
  await new Promise((resolve) => setTimeout(resolve, this.delayMs));
133
133
  }
134
- return { result: this.dispatch(prompt) };
134
+ const result = this.dispatch(prompt);
135
+ return {
136
+ result,
137
+ usage: {
138
+ inputTokens: Math.floor(prompt.length * 1.3),
139
+ outputTokens: Math.floor(result.length * 1.3),
140
+ },
141
+ };
135
142
  }
136
143
  async *executeStream(prompt, options) {
137
144
  const result = await this.execute(prompt, options);
@@ -1 +1 @@
1
- {"version":3,"file":"ci-watch-fix-loop.d.ts","sourceRoot":"","sources":["../../../../../../../../../../packages/core/src/infrastructure/services/agents/feature-agent/nodes/merge/ci-watch-fix-loop.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,+DAA+D,CAAC;AACpG,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,yEAAyE,CAAC;AAClH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,iEAAiE,CAAC;AAKrG,OAAO,EAAE,QAAQ,EAAE,KAAK,WAAW,EAAE,MAAM,8BAA8B,CAAC;AAC1E,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAErD,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,+DAA+D,CAAC;AAK3G,MAAM,WAAW,cAAc;IAC7B,QAAQ,EAAE,cAAc,CAAC;IACzB,YAAY,EAAE,aAAa,CAAC;IAC5B,iBAAiB,EAAE,IAAI,CAAC,kBAAkB,EAAE,UAAU,GAAG,QAAQ,CAAC,CAAC;CACpE;AAED,MAAM,WAAW,gBAAgB;IAC/B,GAAG,EAAE,MAAM,CAAC;IACZ,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,qBAAqB,CAAC;IAC/B,OAAO,EAAE,OAAO,CAAC,UAAU,CAAC,IAAI,CAAC,kBAAkB,EAAE,UAAU,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;IAC/E,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,gBAAgB,EAAE,MAAM,CAAC;IACzB,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,GAAG,EAAE,UAAU,CAAC;CACjB;AAED,MAAM,MAAM,gBAAgB,GAAG,MAAM,GAAG,UAAU,GAAG,QAAQ,GAAG,SAAS,GAAG,WAAW,GAAG,SAAS,CAAC;AAEpG,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,EAAE,QAAQ,CAAC;IACnB,aAAa,EAAE,MAAM,CAAC;IACtB,YAAY,EAAE,WAAW,EAAE,CAAC;IAC5B,WAAW,EAAE,gBAAgB,CAAC;CAC/B;AAED;;;;;GAKG;AACH,wBAAsB,iBAAiB,CACrC,IAAI,EAAE,cAAc,EACpB,MAAM,EAAE,gBAAgB,GACvB,OAAO,CAAC,gBAAgB,CAAC,CA6I3B"}
1
+ {"version":3,"file":"ci-watch-fix-loop.d.ts","sourceRoot":"","sources":["../../../../../../../../../../packages/core/src/infrastructure/services/agents/feature-agent/nodes/merge/ci-watch-fix-loop.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,+DAA+D,CAAC;AACpG,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,yEAAyE,CAAC;AAClH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,iEAAiE,CAAC;AAKrG,OAAO,EAAE,QAAQ,EAAE,KAAK,WAAW,EAAE,MAAM,8BAA8B,CAAC;AAC1E,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAErD,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,+DAA+D,CAAC;AAK3G,MAAM,WAAW,cAAc;IAC7B,QAAQ,EAAE,cAAc,CAAC;IACzB,YAAY,EAAE,aAAa,CAAC;IAC5B,iBAAiB,EAAE,IAAI,CAAC,kBAAkB,EAAE,UAAU,GAAG,QAAQ,CAAC,CAAC;CACpE;AAED,MAAM,WAAW,gBAAgB;IAC/B,GAAG,EAAE,MAAM,CAAC;IACZ,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,qBAAqB,CAAC;IAC/B,OAAO,EAAE,OAAO,CAAC,UAAU,CAAC,IAAI,CAAC,kBAAkB,EAAE,UAAU,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;IAC/E,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,gBAAgB,EAAE,MAAM,CAAC;IACzB,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,GAAG,EAAE,UAAU,CAAC;CACjB;AAED,MAAM,MAAM,gBAAgB,GAAG,MAAM,GAAG,UAAU,GAAG,QAAQ,GAAG,SAAS,GAAG,WAAW,GAAG,SAAS,CAAC;AAEpG,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,EAAE,QAAQ,CAAC;IACnB,aAAa,EAAE,MAAM,CAAC;IACtB,YAAY,EAAE,WAAW,EAAE,CAAC;IAC5B,WAAW,EAAE,gBAAgB,CAAC;CAC/B;AAED;;;;;GAKG;AACH,wBAAsB,iBAAiB,CACrC,IAAI,EAAE,cAAc,EACpB,MAAM,EAAE,gBAAgB,GACvB,OAAO,CAAC,gBAAgB,CAAC,CA8I3B"}
@@ -23,6 +23,7 @@ export async function runCiWatchFixLoop(deps, params) {
23
23
  const maxAttempts = settings.workflow?.ciMaxFixAttempts ?? 3;
24
24
  const timeoutMs = settings.workflow?.ciWatchTimeoutMs ?? 600_000;
25
25
  const logMaxChars = settings.workflow?.ciLogMaxChars ?? 50_000;
26
+ const pollInterval = settings.workflow?.ciWatchPollIntervalSeconds ?? 30;
26
27
  let ciFixAttempts = params.existingAttempts;
27
28
  const ciFixHistory = [];
28
29
  let ciFixStatus;
@@ -67,7 +68,7 @@ export async function runCiWatchFixLoop(deps, params) {
67
68
  // Initial CI watch
68
69
  let watchResult;
69
70
  try {
70
- watchResult = await gitPrService.watchCi(cwd, branch, timeoutMs);
71
+ watchResult = await gitPrService.watchCi(cwd, branch, timeoutMs, pollInterval);
71
72
  }
72
73
  catch (err) {
73
74
  if (err instanceof GitPrError && err.code === GitPrErrorCode.CI_TIMEOUT) {
@@ -111,7 +112,7 @@ export async function runCiWatchFixLoop(deps, params) {
111
112
  // Watch CI after fix
112
113
  let fixWatchResult;
113
114
  try {
114
- fixWatchResult = await gitPrService.watchCi(cwd, branch, timeoutMs);
115
+ fixWatchResult = await gitPrService.watchCi(cwd, branch, timeoutMs, pollInterval);
115
116
  }
116
117
  catch (err) {
117
118
  if (err instanceof GitPrError && err.code === GitPrErrorCode.CI_TIMEOUT) {
@@ -1 +1 @@
1
- {"version":3,"file":"merge.node.d.ts","sourceRoot":"","sources":["../../../../../../../../../../packages/core/src/infrastructure/services/agents/feature-agent/nodes/merge/merge.node.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAGH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,+DAA+D,CAAC;AACpG,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AACxD,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,yEAAyE,CAAC;AAClH,OAAO,KAAK,EACV,WAAW,EACX,aAAa,EACd,MAAM,iEAAiE,CAAC;AAkBzE,OAAO,KAAK,EAAE,6BAA6B,EAAE,MAAM,uEAAuE,CAAC;AAE3H,MAAM,WAAW,aAAa;IAC5B,QAAQ,EAAE,cAAc,CAAC;IACzB,cAAc,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,KAAK,OAAO,CAAC,WAAW,CAAC,CAAC;IAC1E,SAAS,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;IAC7C,gBAAgB,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC;IACnD,iBAAiB,EAAE,IAAI,CAAC,kBAAkB,EAAE,UAAU,GAAG,QAAQ,CAAC,CAAC;IACnE;;OAEG;IACH,gBAAgB,EAAE,CAChB,GAAG,EAAE,MAAM,EACX,aAAa,EAAE,MAAM,EACrB,UAAU,EAAE,MAAM,EAClB,aAAa,EAAE,MAAM,EACrB,SAAS,CAAC,EAAE,OAAO,KAChB,OAAO,CAAC,IAAI,CAAC,CAAC;IACnB;;;OAGG;IACH,WAAW,EAAE,CACX,GAAG,EAAE,MAAM,EACX,aAAa,EAAE,MAAM,EACrB,UAAU,EAAE,MAAM,EAClB,eAAe,CAAC,EAAE,MAAM,KACrB,OAAO,CAAC,OAAO,CAAC,CAAC;IACtB;;OAEG;IACH,QAAQ,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC;IACxD,YAAY,EAAE,aAAa,CAAC;IAC5B,6BAA6B,EAAE,IAAI,CAAC,6BAA6B,EAAE,SAAS,CAAC,CAAC;CAC/E;AAED;;;;;GAKG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE,aAAa,IAGnC,OAAO,iBAAiB,KAAG,OAAO,CAAC,OAAO,CAAC,iBAAiB,CAAC,CAAC,CA8R7E"}
1
+ {"version":3,"file":"merge.node.d.ts","sourceRoot":"","sources":["../../../../../../../../../../packages/core/src/infrastructure/services/agents/feature-agent/nodes/merge/merge.node.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAGH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,+DAA+D,CAAC;AACpG,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AACxD,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,yEAAyE,CAAC;AAClH,OAAO,KAAK,EACV,WAAW,EACX,aAAa,EACd,MAAM,iEAAiE,CAAC;AAmBzE,OAAO,KAAK,EAAE,6BAA6B,EAAE,MAAM,uEAAuE,CAAC;AAE3H,MAAM,WAAW,aAAa;IAC5B,QAAQ,EAAE,cAAc,CAAC;IACzB,cAAc,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,KAAK,OAAO,CAAC,WAAW,CAAC,CAAC;IAC1E,SAAS,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;IAC7C,gBAAgB,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC;IACnD,iBAAiB,EAAE,IAAI,CAAC,kBAAkB,EAAE,UAAU,GAAG,QAAQ,CAAC,CAAC;IACnE;;OAEG;IACH,gBAAgB,EAAE,CAChB,GAAG,EAAE,MAAM,EACX,aAAa,EAAE,MAAM,EACrB,UAAU,EAAE,MAAM,EAClB,aAAa,EAAE,MAAM,EACrB,SAAS,CAAC,EAAE,OAAO,KAChB,OAAO,CAAC,IAAI,CAAC,CAAC;IACnB;;;OAGG;IACH,WAAW,EAAE,CACX,GAAG,EAAE,MAAM,EACX,aAAa,EAAE,MAAM,EACrB,UAAU,EAAE,MAAM,EAClB,eAAe,CAAC,EAAE,MAAM,KACrB,OAAO,CAAC,OAAO,CAAC,CAAC;IACtB;;OAEG;IACH,QAAQ,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC;IACxD,YAAY,EAAE,aAAa,CAAC;IAC5B,6BAA6B,EAAE,IAAI,CAAC,6BAA6B,EAAE,SAAS,CAAC,CAAC;CAC/E;AAED;;;;;GAKG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE,aAAa,IAGnC,OAAO,iBAAiB,KAAG,OAAO,CAAC,OAAO,CAAC,iBAAiB,CAAC,CAAC,CAmT7E"}
@@ -21,6 +21,7 @@ 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';
23
23
  import { runCiWatchFixLoop } from './ci-watch-fix-loop.js';
24
+ import { getSettings } from '../../../../../services/settings.service.js';
24
25
  /**
25
26
  * Factory that creates the merge node function.
26
27
  *
@@ -67,9 +68,14 @@ export function createMergeNode(deps) {
67
68
  }
68
69
  const messages = [];
69
70
  const startTime = Date.now();
70
- const mergeTimingId = await recordPhaseStart('merge');
71
+ let totalInputTokens = 0;
72
+ let totalOutputTokens = 0;
73
+ const { executor } = deps;
74
+ const mergeTimingId = await recordPhaseStart('merge', {
75
+ agentType: executor.agentType,
76
+ modelId: state.model,
77
+ });
71
78
  try {
72
- const { executor } = deps;
73
79
  const cwd = state.worktreePath;
74
80
  const feature = await deps.featureRepository.findById(state.featureId);
75
81
  const branch = feature?.branch ?? `feat/${state.featureId}`;
@@ -98,6 +104,8 @@ export function createMergeNode(deps) {
98
104
  const commitResult = await retryExecute(executor, commitPushPrPrompt, options, {
99
105
  logger: log,
100
106
  });
107
+ totalInputTokens += commitResult.usage?.inputTokens ?? 0;
108
+ totalOutputTokens += commitResult.usage?.outputTokens ?? 0;
101
109
  commitHash = parseCommitHash(commitResult.result) ?? state.commitHash;
102
110
  messages.push(`[merge] Agent completed commit/push/PR operations`);
103
111
  if (effectiveState.openPr) {
@@ -122,8 +130,9 @@ export function createMergeNode(deps) {
122
130
  messages.push(`[merge] PR created: ${prUrl}`);
123
131
  }
124
132
  }
125
- // --- CI watch/fix loop (when push or openPr is enabled) ---
126
- if (effectiveState.push || effectiveState.openPr) {
133
+ // --- CI watch/fix loop (when push or openPr is enabled and CI watch is not disabled) ---
134
+ const ciWatchEnabled = getSettings().workflow?.ciWatchEnabled !== false;
135
+ if (ciWatchEnabled && (effectiveState.push || effectiveState.openPr)) {
127
136
  const ciResult = await runCiWatchFixLoop({
128
137
  executor,
129
138
  gitPrService: deps.gitPrService,
@@ -171,7 +180,11 @@ export function createMergeNode(deps) {
171
180
  // --- Merge approval gate ---
172
181
  if (shouldInterrupt('merge', state.approvalGates)) {
173
182
  log.info('Interrupting for merge approval');
174
- await recordPhaseEnd(mergeTimingId, Date.now() - startTime);
183
+ await recordPhaseEnd(mergeTimingId, Date.now() - startTime, {
184
+ inputTokens: totalInputTokens || undefined,
185
+ outputTokens: totalOutputTokens || undefined,
186
+ exitCode: 'success',
187
+ });
175
188
  await recordApprovalWaitStart(mergeTimingId);
176
189
  const diffSummary = await deps.getDiffSummary(cwd, baseBranch);
177
190
  interrupt({
@@ -250,7 +263,11 @@ export function createMergeNode(deps) {
250
263
  }
251
264
  }
252
265
  const elapsed = ((Date.now() - startTime) / 1000).toFixed(1);
253
- await recordPhaseEnd(mergeTimingId, Date.now() - startTime);
266
+ await recordPhaseEnd(mergeTimingId, Date.now() - startTime, {
267
+ inputTokens: totalInputTokens || undefined,
268
+ outputTokens: totalOutputTokens || undefined,
269
+ exitCode: 'success',
270
+ });
254
271
  messages.push(`[merge] Complete (${elapsed}s)`);
255
272
  log.info(`Merge flow complete (${elapsed}s)`);
256
273
  return {
@@ -274,7 +291,12 @@ export function createMergeNode(deps) {
274
291
  const message = err instanceof Error ? err.message : String(err);
275
292
  const elapsed = ((Date.now() - startTime) / 1000).toFixed(1);
276
293
  log.error(`Merge failed: ${message} (${elapsed}s)`);
277
- await recordPhaseEnd(mergeTimingId, Date.now() - startTime);
294
+ await recordPhaseEnd(mergeTimingId, Date.now() - startTime, {
295
+ inputTokens: totalInputTokens || undefined,
296
+ outputTokens: totalOutputTokens || undefined,
297
+ exitCode: 'error',
298
+ errorMessage: message.slice(0, 1000),
299
+ });
278
300
  throw err;
279
301
  }
280
302
  };
@@ -1 +1 @@
1
- {"version":3,"file":"node-helpers.d.ts","sourceRoot":"","sources":["../../../../../../../../../packages/core/src/infrastructure/services/agents/feature-agent/nodes/node-helpers.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"node-helpers.d.ts","sourceRoot":"","sources":["../../../../../../../../../packages/core/src/infrastructure/services/agents/feature-agent/nodes/node-helpers.ts"],"names":[],"mappings":"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"}
@@ -407,20 +407,28 @@ export function executeNode(nodeName, executor, buildPrompt) {
407
407
  }
408
408
  }
409
409
  const startTime = Date.now();
410
- // Record phase start (no-op if timing context not set)
411
- const timingId = await recordPhaseStart(nodeName);
410
+ const resumePrefix = buildResumeContext(state.resumeReason);
411
+ const prompt = resumePrefix + buildPrompt(state, log);
412
+ const options = buildExecutorOptions(state, undefined, nodeName);
413
+ // Record phase start with pre-execution metadata
414
+ const timingId = await recordPhaseStart(nodeName, {
415
+ prompt,
416
+ modelId: state.model,
417
+ agentType: executor.agentType,
418
+ });
412
419
  try {
413
- const resumePrefix = buildResumeContext(state.resumeReason);
414
- const prompt = resumePrefix + buildPrompt(state, log);
415
- const options = buildExecutorOptions(state, undefined, nodeName);
416
420
  log.info(`Executing agent at cwd=${options.cwd}`);
417
421
  log.info(`Prompt length: ${prompt.length} chars`);
418
422
  const result = await executor.execute(prompt, options);
419
423
  const durationMs = Date.now() - startTime;
420
424
  const elapsed = (durationMs / 1000).toFixed(1);
421
425
  log.info(`Complete (${result.result.length} chars, ${elapsed}s)`);
422
- // Record phase completion
423
- await recordPhaseEnd(timingId, durationMs);
426
+ // Record phase completion with post-execution metadata
427
+ await recordPhaseEnd(timingId, durationMs, {
428
+ inputTokens: result.usage?.inputTokens,
429
+ outputTokens: result.usage?.outputTokens,
430
+ exitCode: 'success',
431
+ });
424
432
  // Mark phase complete BEFORE interrupting so that on resume the
425
433
  // node detects the work is already done and returns early.
426
434
  markPhaseComplete(state.specDir, nodeName, log);
@@ -455,7 +463,10 @@ export function executeNode(nodeName, executor, buildPrompt) {
455
463
  const elapsed = (durationMs / 1000).toFixed(1);
456
464
  log.error(`${message} (after ${elapsed}s)`);
457
465
  // Record phase end even on failure so timing shows duration, not "running"
458
- await recordPhaseEnd(timingId, durationMs);
466
+ await recordPhaseEnd(timingId, durationMs, {
467
+ exitCode: 'error',
468
+ errorMessage: message.slice(0, 1000),
469
+ });
459
470
  // Throw so LangGraph does NOT checkpoint this node as "completed".
460
471
  // The worker catch block marks the run as failed, and on resume
461
472
  // LangGraph re-executes from the last successfully checkpointed node.
@@ -1,9 +1,12 @@
1
1
  /**
2
2
  * Merge Node Prompt Builders
3
3
  *
4
- * Builds prompts for the two agent calls in the merge node:
4
+ * Builds prompts for agent calls in the merge node:
5
5
  * 1. buildCommitPushPrPrompt — commit (always), push (conditional), PR create (conditional)
6
- * 2. buildMergeSquashPromptmerge/squash PR or branch
6
+ * 2. buildCiWatchFixPromptdiagnose and fix CI failures
7
+ *
8
+ * NOTE: The actual PR merge and local squash-merge are handled directly by
9
+ * GitPrService.mergePr() and GitPrService.localMergeSquash() — not via agent prompts.
7
10
  */
8
11
  import { type Evidence } from '../../../../../../domain/generated/output.js';
9
12
  import type { FeatureAgentState } from '../../state.js';
@@ -41,12 +44,4 @@ export declare function buildCommitPushPrPrompt(state: FeatureAgentState, branch
41
44
  * @param branch - Feature branch name to push to after fixing
42
45
  */
43
46
  export declare function buildCiWatchFixPrompt(failureLogs: string, attemptNumber: number, maxAttempts: number, branch: string): string;
44
- /**
45
- * Build a prompt for the merge/squash agent call.
46
- *
47
- * When a PR exists, uses `gh pr merge` (remote operation — no local merge needed).
48
- * When no PR exists, performs a local merge in the ORIGINAL repo directory
49
- * (not the worktree, which IS the feature branch).
50
- */
51
- export declare function buildMergeSquashPrompt(state: FeatureAgentState, branch: string, baseBranch: string, hasRemote?: boolean): string;
52
47
  //# sourceMappingURL=merge-prompts.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"merge-prompts.d.ts","sourceRoot":"","sources":["../../../../../../../../../../packages/core/src/infrastructure/services/agents/feature-agent/nodes/prompts/merge-prompts.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAGH,OAAO,EAAgB,KAAK,QAAQ,EAAE,MAAM,8BAA8B,CAAC;AAE3E,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AAwCxD;;;GAGG;AACH,wBAAgB,oBAAoB,CAAC,SAAS,EAAE,MAAM,GAAG;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,CAU9F;AAuCD;;;;;GAKG;AACH,wBAAgB,qBAAqB,CACnC,QAAQ,EAAE,QAAQ,EAAE,EACpB,MAAM,CAAC,EAAE,MAAM,EACf,OAAO,CAAC,EAAE,MAAM,GACf,MAAM,CAUR;AAED;;;;;GAKG;AACH,wBAAgB,uBAAuB,CACrC,KAAK,EAAE,iBAAiB,EACxB,MAAM,EAAE,MAAM,EACd,UAAU,EAAE,MAAM,EAClB,OAAO,CAAC,EAAE,MAAM,GACf,MAAM,CAmER;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,qBAAqB,CACnC,WAAW,EAAE,MAAM,EACnB,aAAa,EAAE,MAAM,EACrB,WAAW,EAAE,MAAM,EACnB,MAAM,EAAE,MAAM,GACb,MAAM,CA0BR;AAED;;;;;;GAMG;AACH,wBAAgB,sBAAsB,CACpC,KAAK,EAAE,iBAAiB,EACxB,MAAM,EAAE,MAAM,EACd,UAAU,EAAE,MAAM,EAClB,SAAS,UAAQ,GAChB,MAAM,CAkER"}
1
+ {"version":3,"file":"merge-prompts.d.ts","sourceRoot":"","sources":["../../../../../../../../../../packages/core/src/infrastructure/services/agents/feature-agent/nodes/prompts/merge-prompts.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAGH,OAAO,EAAgB,KAAK,QAAQ,EAAE,MAAM,8BAA8B,CAAC;AAE3E,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AAwCxD;;;GAGG;AACH,wBAAgB,oBAAoB,CAAC,SAAS,EAAE,MAAM,GAAG;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,CAU9F;AAuCD;;;;;GAKG;AACH,wBAAgB,qBAAqB,CACnC,QAAQ,EAAE,QAAQ,EAAE,EACpB,MAAM,CAAC,EAAE,MAAM,EACf,OAAO,CAAC,EAAE,MAAM,GACf,MAAM,CAUR;AAED;;;;;GAKG;AACH,wBAAgB,uBAAuB,CACrC,KAAK,EAAE,iBAAiB,EACxB,MAAM,EAAE,MAAM,EACd,UAAU,EAAE,MAAM,EAClB,OAAO,CAAC,EAAE,MAAM,GACf,MAAM,CAmER;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,qBAAqB,CACnC,WAAW,EAAE,MAAM,EACnB,aAAa,EAAE,MAAM,EACrB,WAAW,EAAE,MAAM,EACnB,MAAM,EAAE,MAAM,GACb,MAAM,CA0BR"}
@@ -1,9 +1,12 @@
1
1
  /**
2
2
  * Merge Node Prompt Builders
3
3
  *
4
- * Builds prompts for the two agent calls in the merge node:
4
+ * Builds prompts for agent calls in the merge node:
5
5
  * 1. buildCommitPushPrPrompt — commit (always), push (conditional), PR create (conditional)
6
- * 2. buildMergeSquashPromptmerge/squash PR or branch
6
+ * 2. buildCiWatchFixPromptdiagnose and fix CI failures
7
+ *
8
+ * NOTE: The actual PR merge and local squash-merge are handled directly by
9
+ * GitPrService.mergePr() and GitPrService.localMergeSquash() — not via agent prompts.
7
10
  */
8
11
  import yaml from 'js-yaml';
9
12
  import { EvidenceType } from '../../../../../../domain/generated/output.js';
@@ -215,74 +218,3 @@ ${failureLogs}
215
218
  - Do NOT create a new branch — push directly to \`${branch}\`
216
219
  - If the failure is unclear, make your best diagnosis and explain your reasoning in the commit message`;
217
220
  }
218
- /**
219
- * Build a prompt for the merge/squash agent call.
220
- *
221
- * When a PR exists, uses `gh pr merge` (remote operation — no local merge needed).
222
- * When no PR exists, performs a local merge in the ORIGINAL repo directory
223
- * (not the worktree, which IS the feature branch).
224
- */
225
- export function buildMergeSquashPrompt(state, branch, baseBranch, hasRemote = false) {
226
- if (state.prUrl && state.prNumber) {
227
- // PR path: remote merge via GitHub CLI — no local merge needed
228
- return `You are merging a pull request via the GitHub CLI.
229
-
230
- ## PR to Merge
231
-
232
- - PR URL: ${state.prUrl}
233
- - PR Number: #${state.prNumber}
234
-
235
- ## Instructions
236
-
237
- 1. Merge the PR using squash merge with auto-merge: \`gh pr merge ${state.prNumber} --squash --delete-branch --auto\`
238
- - The --auto flag queues the merge to execute automatically once all branch protection requirements (CI checks, reviews, etc.) are satisfied
239
- 2. If the merge command fails, report the error clearly
240
-
241
- ## Constraints
242
-
243
- - Use squash merge strategy to keep history clean
244
- - Report the merge result clearly`;
245
- }
246
- // Non-PR path: local merge in the ORIGINAL repo (not the worktree)
247
- const originalRepo = state.repositoryPath;
248
- const fetchSteps = hasRemote
249
- ? `2. Fetch latest: \`git fetch origin\`
250
- 3. Checkout the base branch: \`git checkout ${baseBranch}\`
251
- 4. Pull latest base: \`git pull origin ${baseBranch}\`
252
- 5. Merge the feature branch: \`git merge --squash ${branch}\`
253
- 6. If merge conflicts are encountered, resolve them manually and complete the merge
254
- 7. Commit the squash merge with a descriptive conventional commit message
255
- 8. Delete the feature branch after successful merge: \`git branch -d ${branch}\``
256
- : `2. Checkout the base branch: \`git checkout ${baseBranch}\`
257
- 3. Merge the feature branch: \`git merge --squash ${branch}\`
258
- 4. If merge conflicts are encountered, resolve them manually and complete the merge
259
- 5. Commit the squash merge with a descriptive conventional commit message
260
- 6. Delete the feature branch after successful merge: \`git branch -d ${branch}\``;
261
- return `You are performing a local merge in the original repository directory.
262
-
263
- IMPORTANT: You MUST run all git commands in the original repository directory, NOT in any worktree.
264
-
265
- ## Branch to Merge
266
-
267
- - Feature branch: \`${branch}\`
268
- - Base branch: \`${baseBranch}\`
269
-
270
- ## Working Directory
271
-
272
- ${originalRepo}
273
-
274
- ## Instructions
275
-
276
- 1. Change to the original repository: \`cd ${originalRepo}\`
277
- ${fetchSteps}
278
-
279
- ## Constraints
280
-
281
- - Use squash merge strategy to keep history clean
282
- - All commands MUST run in \`${originalRepo}\` (the original repo), NOT in the worktree
283
- - NEVER remove, modify, or prune git worktrees — they are managed by the system
284
- - Do NOT try to \`git checkout\` the feature branch — \`git merge --squash\` reads from it without checking it out
285
- - If conflicts arise during merge, attempt to resolve them intelligently
286
- - Do NOT modify any source code beyond what is needed for conflict resolution
287
- - Report the merge result clearly`;
288
- }
@@ -21,6 +21,12 @@ export declare function setPhaseTimingContext(runId: string, repository: IPhaseT
21
21
  * Clear the phase timing context. Useful for testing.
22
22
  */
23
23
  export declare function clearPhaseTimingContext(): void;
24
+ /** Pre-execution metadata recorded at phase start. */
25
+ export interface PhaseStartMetadata {
26
+ prompt?: string;
27
+ modelId?: string;
28
+ agentType?: string;
29
+ }
24
30
  /**
25
31
  * Record the start of a phase. Returns the timing record ID (for later update)
26
32
  * or null if context is not set or save fails.
@@ -28,12 +34,20 @@ export declare function clearPhaseTimingContext(): void;
28
34
  * Automatically appends an iteration suffix (`:2`, `:3`, …) when the same
29
35
  * phase has already been recorded for this run (e.g. after a rejection loop).
30
36
  */
31
- export declare function recordPhaseStart(phase: string): Promise<string | null>;
37
+ export declare function recordPhaseStart(phase: string, metadata?: PhaseStartMetadata): Promise<string | null>;
38
+ /** Post-execution metadata recorded at phase end. */
39
+ export interface PhaseEndMetadata {
40
+ inputTokens?: number;
41
+ outputTokens?: number;
42
+ exitCode?: string;
43
+ errorMessage?: string;
44
+ }
32
45
  /**
33
- * Record the end of a phase. Updates the timing record with completedAt and durationMs.
46
+ * Record the end of a phase. Updates the timing record with completedAt, durationMs,
47
+ * and optional execution metadata (token usage, exit code, error).
34
48
  * No-op if timingId is null (phase start was skipped or failed).
35
49
  */
36
- export declare function recordPhaseEnd(timingId: string | null, durationMs: number): Promise<void>;
50
+ export declare function recordPhaseEnd(timingId: string | null, durationMs: number, metadata?: PhaseEndMetadata): Promise<void>;
37
51
  /**
38
52
  * Record an instant lifecycle event (e.g., run:started, run:stopped, run:crashed).
39
53
  * These are phase timing records with zero duration, used to mark events in the timeline.
@@ -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;;;;;;GAMG;AACH,wBAAsB,gBAAgB,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAsB5E;AAED;;;GAGG;AACH,wBAAsB,cAAc,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAW/F;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,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,CAef;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"}
@@ -63,7 +63,7 @@ async function resolveIterationPhase(phase, runId, repository) {
63
63
  * Automatically appends an iteration suffix (`:2`, `:3`, …) when the same
64
64
  * phase has already been recorded for this run (e.g. after a rejection loop).
65
65
  */
66
- export async function recordPhaseStart(phase) {
66
+ export async function recordPhaseStart(phase, metadata) {
67
67
  if (!contextRunId || !contextRepository)
68
68
  return null;
69
69
  const id = randomUUID();
@@ -77,6 +77,9 @@ export async function recordPhaseStart(phase) {
77
77
  startedAt: now,
78
78
  createdAt: now,
79
79
  updatedAt: now,
80
+ ...(metadata?.prompt != null && { prompt: metadata.prompt }),
81
+ ...(metadata?.modelId != null && { modelId: metadata.modelId }),
82
+ ...(metadata?.agentType != null && { agentType: metadata.agentType }),
80
83
  });
81
84
  lastTimingId = id;
82
85
  return id;
@@ -87,16 +90,21 @@ export async function recordPhaseStart(phase) {
87
90
  }
88
91
  }
89
92
  /**
90
- * Record the end of a phase. Updates the timing record with completedAt and durationMs.
93
+ * Record the end of a phase. Updates the timing record with completedAt, durationMs,
94
+ * and optional execution metadata (token usage, exit code, error).
91
95
  * No-op if timingId is null (phase start was skipped or failed).
92
96
  */
93
- export async function recordPhaseEnd(timingId, durationMs) {
97
+ export async function recordPhaseEnd(timingId, durationMs, metadata) {
94
98
  if (!timingId || !contextRepository)
95
99
  return;
96
100
  try {
97
101
  await contextRepository.update(timingId, {
98
102
  completedAt: new Date(),
99
103
  durationMs: BigInt(durationMs),
104
+ ...(metadata?.inputTokens != null && { inputTokens: BigInt(metadata.inputTokens) }),
105
+ ...(metadata?.outputTokens != null && { outputTokens: BigInt(metadata.outputTokens) }),
106
+ ...(metadata?.exitCode != null && { exitCode: metadata.exitCode }),
107
+ ...(metadata?.errorMessage != null && { errorMessage: metadata.errorMessage }),
100
108
  });
101
109
  }
102
110
  catch {
@@ -30,6 +30,13 @@ export declare class ClaudeCodeSessionRepository implements IAgentSessionReposit
30
30
  isSupported(): boolean;
31
31
  list(options?: ListSessionsOptions): Promise<AgentSession[]>;
32
32
  findById(id: string, options?: GetSessionOptions): Promise<AgentSession | null>;
33
+ /**
34
+ * Collect session files only from the directory matching the given project path.
35
+ * Claude Code encodes project paths as directory names by replacing '/', '\', and '.'
36
+ * with '-'. e.g. /home/user/.shep/repos/abc/wt/feat-x → -home-user--shep-repos-abc-wt-feat-x
37
+ * This avoids scanning all 100+ project directories.
38
+ */
39
+ private collectSessionFilesForPath;
33
40
  /** Collect all depth-1 .jsonl session files with mtime from all project directories */
34
41
  private collectSessionFiles;
35
42
  /** Collect depth-1 .jsonl files from a single project directory with stat for mtime */
@@ -1 +1 @@
1
- {"version":3,"file":"claude-code-session.repository.d.ts","sourceRoot":"","sources":["../../../../../../../../packages/core/src/infrastructure/services/agents/sessions/claude-code-session.repository.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAOH,OAAO,KAAK,EACV,YAAY,EAGb,MAAM,wCAAwC,CAAC;AAChD,OAAO,KAAK,EACV,uBAAuB,EACvB,mBAAmB,EACnB,iBAAiB,EAClB,MAAM,mFAAmF,CAAC;AA6B3F,gFAAgF;AAChF,MAAM,WAAW,eAAe;IAC9B,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAClC,gBAAgB,EAAE,MAAM,CAAC;IACzB,qBAAqB,EAAE,MAAM,CAAC;CAC/B;AAED,qBACa,2BAA4B,YAAW,uBAAuB;IAC7D,OAAO,CAAC,QAAQ,CAAC,QAAQ;gBAAR,QAAQ,GAAE,MAAuD;IAE9F,WAAW,IAAI,OAAO;IAIhB,IAAI,CAAC,OAAO,CAAC,EAAE,mBAAmB,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC;IAuB5D,QAAQ,CAAC,EAAE,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,iBAAiB,GAAG,OAAO,CAAC,YAAY,GAAG,IAAI,CAAC;IAmBrF,uFAAuF;YACzE,mBAAmB;IAyBjC,uFAAuF;YACzE,yBAAyB;IAsBvC;;;;OAIG;YACW,eAAe;IAkD7B;;;;OAIG;YACW,gBAAgB;IA6H9B;;;;OAIG;IACH,OAAO,CAAC,kBAAkB;IA8B1B,0DAA0D;IAC1D,OAAO,CAAC,cAAc;CAQvB"}
1
+ {"version":3,"file":"claude-code-session.repository.d.ts","sourceRoot":"","sources":["../../../../../../../../packages/core/src/infrastructure/services/agents/sessions/claude-code-session.repository.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAOH,OAAO,KAAK,EACV,YAAY,EAGb,MAAM,wCAAwC,CAAC;AAChD,OAAO,KAAK,EACV,uBAAuB,EACvB,mBAAmB,EACnB,iBAAiB,EAClB,MAAM,mFAAmF,CAAC;AA6B3F,gFAAgF;AAChF,MAAM,WAAW,eAAe;IAC9B,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAClC,gBAAgB,EAAE,MAAM,CAAC;IACzB,qBAAqB,EAAE,MAAM,CAAC;CAC/B;AAED,qBACa,2BAA4B,YAAW,uBAAuB;IAC7D,OAAO,CAAC,QAAQ,CAAC,QAAQ;gBAAR,QAAQ,GAAE,MAAuD;IAE9F,WAAW,IAAI,OAAO;IAIhB,IAAI,CAAC,OAAO,CAAC,EAAE,mBAAmB,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC;IA6B5D,QAAQ,CAAC,EAAE,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,iBAAiB,GAAG,OAAO,CAAC,YAAY,GAAG,IAAI,CAAC;IAmBrF;;;;;OAKG;YACW,0BAA0B;IAiBxC,uFAAuF;YACzE,mBAAmB;IAyBjC,uFAAuF;YACzE,yBAAyB;IAsBvC;;;;OAIG;YACW,eAAe;IAkD7B;;;;OAIG;YACW,gBAAgB;IA6H9B;;;;OAIG;IACH,OAAO,CAAC,kBAAkB;IA8B1B,0DAA0D;IAC1D,OAAO,CAAC,cAAc;CAQvB"}
@@ -35,19 +35,21 @@ let ClaudeCodeSessionRepository = class ClaudeCodeSessionRepository {
35
35
  }
36
36
  async list(options) {
37
37
  const limit = options?.limit ?? 20;
38
- const fileInfos = await this.collectSessionFiles();
38
+ const filterPath = options?.projectPath;
39
+ // When filtering by path, use the directory naming convention to scan only the
40
+ // matching project directory instead of all 100+ directories. Claude Code encodes
41
+ // project paths as directory names by replacing '/' with '-'.
42
+ const fileInfos = filterPath
43
+ ? await this.collectSessionFilesForPath(filterPath)
44
+ : await this.collectSessionFiles();
39
45
  fileInfos.sort((a, b) => b.mtime.getTime() - a.mtime.getTime());
40
- const topFiles = limit === 0 ? fileInfos : fileInfos.slice(0, limit);
46
+ // Apply limit before full parsing
47
+ const toParse = limit > 0 ? fileInfos.slice(0, limit) : fileInfos;
48
+ const parseResults = await Promise.allSettled(toParse.map((fi) => this.parseSessionFile(fi, { includeMessages: false })));
41
49
  const sessions = [];
42
- for (const fileInfo of topFiles) {
43
- try {
44
- const session = await this.parseSessionFile(fileInfo, { includeMessages: false });
45
- if (session !== null) {
46
- sessions.push(session);
47
- }
48
- }
49
- catch {
50
- // Malformed or unreadable file — skip silently
50
+ for (const result of parseResults) {
51
+ if (result.status === 'fulfilled' && result.value !== null) {
52
+ sessions.push(result.value);
51
53
  }
52
54
  }
53
55
  return sessions;
@@ -70,6 +72,28 @@ let ClaudeCodeSessionRepository = class ClaudeCodeSessionRepository {
70
72
  return null;
71
73
  }
72
74
  }
75
+ /**
76
+ * Collect session files only from the directory matching the given project path.
77
+ * Claude Code encodes project paths as directory names by replacing '/', '\', and '.'
78
+ * with '-'. e.g. /home/user/.shep/repos/abc/wt/feat-x → -home-user--shep-repos-abc-wt-feat-x
79
+ * This avoids scanning all 100+ project directories.
80
+ */
81
+ async collectSessionFilesForPath(projectPath) {
82
+ // Normalize: resolve ~ and convert path separators
83
+ const normalizedPath = projectPath.startsWith('~')
84
+ ? path.join(os.homedir(), projectPath.slice(1))
85
+ : projectPath;
86
+ // Claude Code replaces '/', '\', and '.' with '-' in directory names
87
+ const dirName = normalizedPath.replace(/[/\\.]/g, '-');
88
+ const projectDir = path.join(this.basePath, dirName);
89
+ try {
90
+ return await this.collectDepthOneJsonlFiles(projectDir);
91
+ }
92
+ catch {
93
+ // Directory doesn't exist — no sessions for this path
94
+ return [];
95
+ }
96
+ }
73
97
  /** Collect all depth-1 .jsonl session files with mtime from all project directories */
74
98
  async collectSessionFiles() {
75
99
  let entries;