@shepai/cli 1.152.0 → 1.153.0-pr468.72ce36b

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 (263) hide show
  1. package/apis/json-schema/AgentType.yaml +1 -0
  2. package/dist/packages/core/src/application/ports/output/repositories/interactive-session-repository.interface.d.ts +5 -0
  3. package/dist/packages/core/src/application/ports/output/repositories/interactive-session-repository.interface.d.ts.map +1 -1
  4. package/dist/packages/core/src/application/ports/output/services/interactive-session-service.interface.d.ts +5 -0
  5. package/dist/packages/core/src/application/ports/output/services/interactive-session-service.interface.d.ts.map +1 -1
  6. package/dist/packages/core/src/domain/generated/output.d.ts +1 -0
  7. package/dist/packages/core/src/domain/generated/output.d.ts.map +1 -1
  8. package/dist/packages/core/src/domain/generated/output.js +1 -0
  9. package/dist/packages/core/src/infrastructure/di/container.d.ts.map +1 -1
  10. package/dist/packages/core/src/infrastructure/di/container.js +4 -0
  11. package/dist/packages/core/src/infrastructure/repositories/sqlite-interactive-session.repository.d.ts +1 -0
  12. package/dist/packages/core/src/infrastructure/repositories/sqlite-interactive-session.repository.d.ts.map +1 -1
  13. package/dist/packages/core/src/infrastructure/repositories/sqlite-interactive-session.repository.js +15 -0
  14. package/dist/packages/core/src/infrastructure/services/agents/common/agent-executor-factory.service.d.ts.map +1 -1
  15. package/dist/packages/core/src/infrastructure/services/agents/common/agent-executor-factory.service.js +22 -0
  16. package/dist/packages/core/src/infrastructure/services/agents/common/agent-validator.service.d.ts.map +1 -1
  17. package/dist/packages/core/src/infrastructure/services/agents/common/agent-validator.service.js +1 -0
  18. package/dist/packages/core/src/infrastructure/services/agents/common/executors/claude-code-interactive-executor.service.d.ts.map +1 -1
  19. package/dist/packages/core/src/infrastructure/services/agents/common/executors/claude-code-interactive-executor.service.js +8 -0
  20. package/dist/packages/core/src/infrastructure/services/agents/common/executors/codex-cli-executor.service.d.ts +65 -0
  21. package/dist/packages/core/src/infrastructure/services/agents/common/executors/codex-cli-executor.service.d.ts.map +1 -0
  22. package/dist/packages/core/src/infrastructure/services/agents/common/executors/codex-cli-executor.service.js +655 -0
  23. package/dist/packages/core/src/infrastructure/services/agents/sessions/codex-cli-session.repository.d.ts +62 -0
  24. package/dist/packages/core/src/infrastructure/services/agents/sessions/codex-cli-session.repository.d.ts.map +1 -0
  25. package/dist/packages/core/src/infrastructure/services/agents/sessions/codex-cli-session.repository.js +356 -0
  26. package/dist/packages/core/src/infrastructure/services/interactive/interactive-session.service.d.ts +1 -0
  27. package/dist/packages/core/src/infrastructure/services/interactive/interactive-session.service.d.ts.map +1 -1
  28. package/dist/packages/core/src/infrastructure/services/interactive/interactive-session.service.js +51 -5
  29. package/dist/src/presentation/tui/prompts/agent-select.prompt.d.ts +6 -2
  30. package/dist/src/presentation/tui/prompts/agent-select.prompt.d.ts.map +1 -1
  31. package/dist/src/presentation/tui/prompts/agent-select.prompt.js +7 -2
  32. package/dist/src/presentation/web/app/actions/get-all-agent-models.d.ts.map +1 -1
  33. package/dist/src/presentation/web/app/actions/get-all-agent-models.js +4 -2
  34. package/dist/src/presentation/web/app/api/interactive/chat/turn-statuses/route.d.ts +4 -5
  35. package/dist/src/presentation/web/app/api/interactive/chat/turn-statuses/route.d.ts.map +1 -1
  36. package/dist/src/presentation/web/app/api/interactive/chat/turn-statuses/route.js +5 -13
  37. package/dist/src/presentation/web/components/common/feature-drawer-tabs/event-log-viewer.d.ts.map +1 -1
  38. package/dist/src/presentation/web/components/common/feature-drawer-tabs/event-log-viewer.js +26 -1
  39. package/dist/src/presentation/web/components/common/feature-drawer-tabs/event-log-viewer.stories.d.ts +2 -0
  40. package/dist/src/presentation/web/components/common/feature-drawer-tabs/event-log-viewer.stories.d.ts.map +1 -1
  41. package/dist/src/presentation/web/components/common/feature-drawer-tabs/event-log-viewer.stories.js +21 -0
  42. package/dist/src/presentation/web/components/common/feature-node/agent-type-icons.d.ts +1 -1
  43. package/dist/src/presentation/web/components/common/feature-node/agent-type-icons.d.ts.map +1 -1
  44. package/dist/src/presentation/web/components/common/feature-node/agent-type-icons.js +2 -0
  45. package/dist/src/presentation/web/components/common/feature-node/agent-type-icons.stories.d.ts.map +1 -1
  46. package/dist/src/presentation/web/components/common/feature-node/agent-type-icons.stories.js +1 -0
  47. package/dist/src/presentation/web/components/common/floating-action-button/floating-action-button.d.ts +8 -2
  48. package/dist/src/presentation/web/components/common/floating-action-button/floating-action-button.d.ts.map +1 -1
  49. package/dist/src/presentation/web/components/common/floating-action-button/floating-action-button.js +10 -7
  50. package/dist/src/presentation/web/components/common/repository-node/repository-node.d.ts.map +1 -1
  51. package/dist/src/presentation/web/components/common/repository-node/repository-node.js +2 -3
  52. package/dist/src/presentation/web/components/features/chat/ChatSheet.d.ts.map +1 -1
  53. package/dist/src/presentation/web/components/features/chat/ChatSheet.js +43 -30
  54. package/dist/src/presentation/web/components/features/control-center/control-center-inner.d.ts.map +1 -1
  55. package/dist/src/presentation/web/components/features/control-center/control-center-inner.js +66 -3
  56. package/dist/src/presentation/web/components/features/features-canvas/canvas-toolbar.d.ts +1 -6
  57. package/dist/src/presentation/web/components/features/features-canvas/canvas-toolbar.d.ts.map +1 -1
  58. package/dist/src/presentation/web/components/features/features-canvas/canvas-toolbar.js +5 -6
  59. package/dist/src/presentation/web/components/features/features-canvas/features-canvas.js +1 -1
  60. package/dist/src/presentation/web/components/features/settings/AgentModelPicker/AgentModelPicker.stories.d.ts +1 -0
  61. package/dist/src/presentation/web/components/features/settings/AgentModelPicker/AgentModelPicker.stories.d.ts.map +1 -1
  62. package/dist/src/presentation/web/components/features/settings/AgentModelPicker/AgentModelPicker.stories.js +7 -0
  63. package/dist/src/presentation/web/components/features/settings/agent-settings-section.d.ts.map +1 -1
  64. package/dist/src/presentation/web/components/features/settings/agent-settings-section.js +1 -0
  65. package/dist/src/presentation/web/components/features/settings/agent-settings-section.stories.d.ts +1 -0
  66. package/dist/src/presentation/web/components/features/settings/agent-settings-section.stories.d.ts.map +1 -1
  67. package/dist/src/presentation/web/components/features/settings/agent-settings-section.stories.js +8 -0
  68. package/dist/src/presentation/web/components/layouts/app-shell/app-shell.d.ts.map +1 -1
  69. package/dist/src/presentation/web/components/layouts/app-shell/app-shell.js +9 -5
  70. package/dist/src/presentation/web/hooks/turn-statuses-provider.d.ts +4 -8
  71. package/dist/src/presentation/web/hooks/turn-statuses-provider.d.ts.map +1 -1
  72. package/dist/src/presentation/web/hooks/turn-statuses-provider.js +4 -4
  73. package/dist/src/presentation/web/hooks/use-turn-statuses.d.ts +4 -5
  74. package/dist/src/presentation/web/hooks/use-turn-statuses.d.ts.map +1 -1
  75. package/dist/src/presentation/web/hooks/use-turn-statuses.js +7 -12
  76. package/dist/src/presentation/web/lib/parse-log-line.d.ts +1 -1
  77. package/dist/src/presentation/web/lib/parse-log-line.d.ts.map +1 -1
  78. package/dist/src/presentation/web/lib/parse-log-line.js +1 -1
  79. package/dist/tsconfig.build.tsbuildinfo +1 -1
  80. package/package.json +1 -1
  81. package/web/.next/BUILD_ID +1 -1
  82. package/web/.next/build-manifest.json +2 -2
  83. package/web/.next/fallback-build-manifest.json +2 -2
  84. package/web/.next/prerender-manifest.json +3 -3
  85. package/web/.next/required-server-files.js +3 -3
  86. package/web/.next/required-server-files.json +3 -3
  87. package/web/.next/server/app/(dashboard)/@drawer/adopt/page/server-reference-manifest.json +28 -28
  88. package/web/.next/server/app/(dashboard)/@drawer/adopt/page.js.nft.json +1 -1
  89. package/web/.next/server/app/(dashboard)/@drawer/adopt/page_client-reference-manifest.js +1 -1
  90. package/web/.next/server/app/(dashboard)/@drawer/chat/page/server-reference-manifest.json +26 -26
  91. package/web/.next/server/app/(dashboard)/@drawer/chat/page.js.nft.json +1 -1
  92. package/web/.next/server/app/(dashboard)/@drawer/chat/page_client-reference-manifest.js +1 -1
  93. package/web/.next/server/app/(dashboard)/@drawer/create/page/server-reference-manifest.json +29 -29
  94. package/web/.next/server/app/(dashboard)/@drawer/create/page.js.nft.json +1 -1
  95. package/web/.next/server/app/(dashboard)/@drawer/create/page_client-reference-manifest.js +1 -1
  96. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/[tab]/page/server-reference-manifest.json +36 -36
  97. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/[tab]/page.js.nft.json +1 -1
  98. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/[tab]/page_client-reference-manifest.js +1 -1
  99. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page/server-reference-manifest.json +36 -36
  100. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page.js.nft.json +1 -1
  101. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page_client-reference-manifest.js +1 -1
  102. package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/[tab]/page/server-reference-manifest.json +26 -26
  103. package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/[tab]/page.js.nft.json +1 -1
  104. package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/[tab]/page_client-reference-manifest.js +1 -1
  105. package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page/server-reference-manifest.json +26 -26
  106. package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page.js.nft.json +1 -1
  107. package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page_client-reference-manifest.js +1 -1
  108. package/web/.next/server/app/(dashboard)/chat/page/server-reference-manifest.json +26 -26
  109. package/web/.next/server/app/(dashboard)/chat/page.js.nft.json +1 -1
  110. package/web/.next/server/app/(dashboard)/chat/page_client-reference-manifest.js +1 -1
  111. package/web/.next/server/app/(dashboard)/create/page/server-reference-manifest.json +29 -29
  112. package/web/.next/server/app/(dashboard)/create/page.js.nft.json +1 -1
  113. package/web/.next/server/app/(dashboard)/create/page_client-reference-manifest.js +1 -1
  114. package/web/.next/server/app/(dashboard)/feature/[featureId]/[tab]/page/server-reference-manifest.json +36 -36
  115. package/web/.next/server/app/(dashboard)/feature/[featureId]/[tab]/page.js.nft.json +1 -1
  116. package/web/.next/server/app/(dashboard)/feature/[featureId]/[tab]/page_client-reference-manifest.js +1 -1
  117. package/web/.next/server/app/(dashboard)/feature/[featureId]/page/server-reference-manifest.json +36 -36
  118. package/web/.next/server/app/(dashboard)/feature/[featureId]/page.js.nft.json +1 -1
  119. package/web/.next/server/app/(dashboard)/feature/[featureId]/page_client-reference-manifest.js +1 -1
  120. package/web/.next/server/app/(dashboard)/page/server-reference-manifest.json +26 -26
  121. package/web/.next/server/app/(dashboard)/page.js.nft.json +1 -1
  122. package/web/.next/server/app/(dashboard)/page_client-reference-manifest.js +1 -1
  123. package/web/.next/server/app/(dashboard)/repository/[repositoryId]/[tab]/page/server-reference-manifest.json +26 -26
  124. package/web/.next/server/app/(dashboard)/repository/[repositoryId]/[tab]/page.js.nft.json +1 -1
  125. package/web/.next/server/app/(dashboard)/repository/[repositoryId]/[tab]/page_client-reference-manifest.js +1 -1
  126. package/web/.next/server/app/(dashboard)/repository/[repositoryId]/page/server-reference-manifest.json +26 -26
  127. package/web/.next/server/app/(dashboard)/repository/[repositoryId]/page.js.nft.json +1 -1
  128. package/web/.next/server/app/(dashboard)/repository/[repositoryId]/page_client-reference-manifest.js +1 -1
  129. package/web/.next/server/app/_global-error.html +2 -2
  130. package/web/.next/server/app/_global-error.rsc +1 -1
  131. package/web/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +1 -1
  132. package/web/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  133. package/web/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  134. package/web/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  135. package/web/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  136. package/web/.next/server/app/_not-found/page/server-reference-manifest.json +5 -5
  137. package/web/.next/server/app/_not-found/page.js.nft.json +1 -1
  138. package/web/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  139. package/web/.next/server/app/api/attachments/preview/route.js.nft.json +1 -1
  140. package/web/.next/server/app/api/evidence/route.js.nft.json +1 -1
  141. package/web/.next/server/app/api/graph-data/route.js.nft.json +1 -1
  142. package/web/.next/server/app/api/interactive/chat/[featureId]/messages/route.js.nft.json +1 -1
  143. package/web/.next/server/app/settings/page/server-reference-manifest.json +8 -8
  144. package/web/.next/server/app/settings/page.js.nft.json +1 -1
  145. package/web/.next/server/app/settings/page_client-reference-manifest.js +1 -1
  146. package/web/.next/server/app/skills/page/server-reference-manifest.json +10 -10
  147. package/web/.next/server/app/skills/page.js.nft.json +1 -1
  148. package/web/.next/server/app/skills/page_client-reference-manifest.js +1 -1
  149. package/web/.next/server/app/tools/page/server-reference-manifest.json +10 -10
  150. package/web/.next/server/app/tools/page.js.nft.json +1 -1
  151. package/web/.next/server/app/tools/page_client-reference-manifest.js +1 -1
  152. package/web/.next/server/app/version/page/server-reference-manifest.json +5 -5
  153. package/web/.next/server/app/version/page.js.nft.json +1 -1
  154. package/web/.next/server/app/version/page_client-reference-manifest.js +1 -1
  155. package/web/.next/server/chunks/[root-of-the-server]__a402b567._.js +1 -1
  156. package/web/.next/server/chunks/[root-of-the-server]__ab4951b1._.js +1 -1
  157. package/web/.next/server/chunks/[root-of-the-server]__ab4951b1._.js.map +1 -1
  158. package/web/.next/server/chunks/[root-of-the-server]__beda892a._.js +1 -1
  159. package/web/.next/server/chunks/[root-of-the-server]__beda892a._.js.map +1 -1
  160. package/web/.next/server/chunks/[root-of-the-server]__cd67a84c._.js +1 -1
  161. package/web/.next/server/chunks/[root-of-the-server]__cd67a84c._.js.map +1 -1
  162. package/web/.next/server/chunks/ssr/744ca_web_components_common_control-center-drawer_create-drawer-client_tsx_5e26fc0a._.js +1 -1
  163. package/web/.next/server/chunks/ssr/744ca_web_components_common_control-center-drawer_create-drawer-client_tsx_5e26fc0a._.js.map +1 -1
  164. package/web/.next/server/chunks/ssr/744ca_web_components_common_control-center-drawer_feature-drawer-client_tsx_e9755fc8._.js +3 -3
  165. package/web/.next/server/chunks/ssr/744ca_web_components_common_control-center-drawer_feature-drawer-client_tsx_e9755fc8._.js.map +1 -1
  166. package/web/.next/server/chunks/ssr/[root-of-the-server]__0b150ddf._.js.map +1 -1
  167. package/web/.next/server/chunks/ssr/[root-of-the-server]__17ed7ed1._.js +1 -1
  168. package/web/.next/server/chunks/ssr/[root-of-the-server]__17ed7ed1._.js.map +1 -1
  169. package/web/.next/server/chunks/ssr/[root-of-the-server]__28d0d265._.js +2 -2
  170. package/web/.next/server/chunks/ssr/[root-of-the-server]__28d0d265._.js.map +1 -1
  171. package/web/.next/server/chunks/ssr/[root-of-the-server]__357d99f9._.js +1 -1
  172. package/web/.next/server/chunks/ssr/[root-of-the-server]__42bf1807._.js +1 -1
  173. package/web/.next/server/chunks/ssr/[root-of-the-server]__42bf1807._.js.map +1 -1
  174. package/web/.next/server/chunks/ssr/[root-of-the-server]__56b70465._.js +1 -1
  175. package/web/.next/server/chunks/ssr/[root-of-the-server]__56b70465._.js.map +1 -1
  176. package/web/.next/server/chunks/ssr/[root-of-the-server]__88f7e8e6._.js +1 -1
  177. package/web/.next/server/chunks/ssr/[root-of-the-server]__88f7e8e6._.js.map +1 -1
  178. package/web/.next/server/chunks/ssr/[root-of-the-server]__8b0aac03._.js +1 -1
  179. package/web/.next/server/chunks/ssr/[root-of-the-server]__8b0aac03._.js.map +1 -1
  180. package/web/.next/server/chunks/ssr/[root-of-the-server]__c30f1f82._.js +1 -1
  181. package/web/.next/server/chunks/ssr/[root-of-the-server]__c30f1f82._.js.map +1 -1
  182. package/web/.next/server/chunks/ssr/[root-of-the-server]__f80bfc75._.js +1 -1
  183. package/web/.next/server/chunks/ssr/[root-of-the-server]__f80bfc75._.js.map +1 -1
  184. package/web/.next/server/chunks/ssr/[root-of-the-server]__f8dd4422._.js +3 -0
  185. package/web/.next/server/chunks/ssr/[root-of-the-server]__f8dd4422._.js.map +1 -0
  186. package/web/.next/server/chunks/ssr/_05c23ad9._.js +1 -1
  187. package/web/.next/server/chunks/ssr/_05c23ad9._.js.map +1 -1
  188. package/web/.next/server/chunks/ssr/_16eb4fec._.js +1 -1
  189. package/web/.next/server/chunks/ssr/_16eb4fec._.js.map +1 -1
  190. package/web/.next/server/chunks/ssr/_3a0b989f._.js +2 -2
  191. package/web/.next/server/chunks/ssr/_3a0b989f._.js.map +1 -1
  192. package/web/.next/server/chunks/ssr/{_cf1c5b73._.js → _45afffa1._.js} +2 -2
  193. package/web/.next/server/chunks/ssr/{_cf1c5b73._.js.map → _45afffa1._.js.map} +1 -1
  194. package/web/.next/server/chunks/ssr/_56b9d60f._.js +1 -1
  195. package/web/.next/server/chunks/ssr/_56b9d60f._.js.map +1 -1
  196. package/web/.next/server/chunks/ssr/_5f69c13f._.js +1 -1
  197. package/web/.next/server/chunks/ssr/_5f69c13f._.js.map +1 -1
  198. package/web/.next/server/chunks/ssr/_7c5b97c6._.js +1 -1
  199. package/web/.next/server/chunks/ssr/_7c5b97c6._.js.map +1 -1
  200. package/web/.next/server/chunks/ssr/_82c57f10._.js +1 -1
  201. package/web/.next/server/chunks/ssr/_82c57f10._.js.map +1 -1
  202. package/web/.next/server/chunks/ssr/_9495d50b._.js +1 -1
  203. package/web/.next/server/chunks/ssr/_9495d50b._.js.map +1 -1
  204. package/web/.next/server/chunks/ssr/_a0e3f7e4._.js +1 -1
  205. package/web/.next/server/chunks/ssr/_a0e3f7e4._.js.map +1 -1
  206. package/web/.next/server/chunks/ssr/_ac4a3873._.js +1 -1
  207. package/web/.next/server/chunks/ssr/_ca0aa7f0._.js +1 -1
  208. package/web/.next/server/chunks/ssr/_ca0aa7f0._.js.map +1 -1
  209. package/web/.next/server/chunks/ssr/_cb1b56ff._.js +3 -0
  210. package/web/.next/server/chunks/ssr/{_f78b4b9d._.js.map → _cb1b56ff._.js.map} +1 -1
  211. package/web/.next/server/chunks/ssr/_cb5a021e._.js +1 -1
  212. package/web/.next/server/chunks/ssr/_cb5a021e._.js.map +1 -1
  213. package/web/.next/server/chunks/ssr/{_5fce01a7._.js → _cb98ca72._.js} +2 -2
  214. package/web/.next/server/chunks/ssr/{_5fce01a7._.js.map → _cb98ca72._.js.map} +1 -1
  215. package/web/.next/server/chunks/ssr/_d4b20e29._.js.map +1 -1
  216. package/web/.next/server/chunks/ssr/_d86175ae._.js +1 -1
  217. package/web/.next/server/chunks/ssr/_d86175ae._.js.map +1 -1
  218. package/web/.next/server/chunks/ssr/_d8bedf13._.js +1 -1
  219. package/web/.next/server/chunks/ssr/_d8bedf13._.js.map +1 -1
  220. package/web/.next/server/chunks/ssr/_e9a73a63._.js +1 -1
  221. package/web/.next/server/chunks/ssr/_e9a73a63._.js.map +1 -1
  222. package/web/.next/server/chunks/ssr/_fa7efce3._.js +2 -2
  223. package/web/.next/server/chunks/ssr/_fa7efce3._.js.map +1 -1
  224. package/web/.next/server/chunks/ssr/b1a17_presentation_web_components_features_settings_settings-page-client_tsx_6ed9d5f8._.js +1 -1
  225. package/web/.next/server/chunks/ssr/b1a17_presentation_web_components_features_settings_settings-page-client_tsx_6ed9d5f8._.js.map +1 -1
  226. package/web/.next/server/chunks/ssr/src_presentation_web_324a47da._.js +3 -0
  227. package/web/.next/server/chunks/ssr/src_presentation_web_324a47da._.js.map +1 -0
  228. package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_skills_page_actions_cdc632e3.js +1 -1
  229. package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_skills_page_actions_cdc632e3.js.map +1 -1
  230. package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_tools_page_actions_39ca0924.js +1 -1
  231. package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_tools_page_actions_39ca0924.js.map +1 -1
  232. package/web/.next/server/chunks/ssr/src_presentation_web_app_actions_open-ide_ts_baaca5d5._.js +1 -1
  233. package/web/.next/server/chunks/ssr/src_presentation_web_components_357e3eb0._.js +1 -1
  234. package/web/.next/server/chunks/ssr/src_presentation_web_components_357e3eb0._.js.map +1 -1
  235. package/web/.next/server/chunks/ssr/src_presentation_web_components_features_control-center_7ac3562e._.js +1 -1
  236. package/web/.next/server/chunks/ssr/src_presentation_web_components_features_control-center_7ac3562e._.js.map +1 -1
  237. package/web/.next/server/pages/500.html +2 -2
  238. package/web/.next/server/server-reference-manifest.js +1 -1
  239. package/web/.next/server/server-reference-manifest.json +45 -45
  240. package/web/.next/static/chunks/{a2257ffb1349f838.js → 19e276d1db01686c.js} +1 -1
  241. package/web/.next/static/chunks/{bdd340ad42a34b41.js → 2d971ae371d47be6.js} +1 -1
  242. package/web/.next/static/chunks/{f9a80d3854a8d453.js → 56b4a56ab5ec232c.js} +1 -1
  243. package/web/.next/static/chunks/{277a7f64d4ec189d.js → 644d66ef35bcf689.js} +1 -1
  244. package/web/.next/static/chunks/{80c4c8b3a5c8e0b6.js → 6b21720f1af9d81d.js} +1 -1
  245. package/web/.next/static/chunks/6e873694566b5b29.js +1 -0
  246. package/web/.next/static/chunks/812aef7275df9f5c.js +1 -0
  247. package/web/.next/static/chunks/8590bd2e69b24b9e.css +1 -0
  248. package/web/.next/static/chunks/{ef1c9f43aafff65f.js → 8ad4f8b8b02e48e3.js} +3 -3
  249. package/web/.next/static/chunks/{6bf775818e4ad42e.js → a02bfd8c7a760ec5.js} +1 -1
  250. package/web/.next/static/chunks/bc7522e582566e5b.js +7 -0
  251. package/web/.next/static/chunks/{1b4429259bbf3064.js → c054c1cf57e444e3.js} +2 -2
  252. package/web/.next/static/chunks/{f33efe6a12242a8a.js → e6564e0bc86474b2.js} +1 -1
  253. package/web/public/icons/agents/openai.svg +3 -0
  254. package/web/.next/server/chunks/ssr/[root-of-the-server]__563f2f7a._.js +0 -3
  255. package/web/.next/server/chunks/ssr/[root-of-the-server]__563f2f7a._.js.map +0 -1
  256. package/web/.next/server/chunks/ssr/_f78b4b9d._.js +0 -3
  257. package/web/.next/static/chunks/4908997348bd55f8.js +0 -1
  258. package/web/.next/static/chunks/76858a51f2fbe99a.js +0 -7
  259. package/web/.next/static/chunks/a919a9df4ab12a5c.css +0 -1
  260. package/web/.next/static/chunks/ee20803fb301d59e.js +0 -1
  261. /package/web/.next/static/{lPbWG8a1RwBDDcvRngp58 → k_Awt-2YfRvvLIUlgT2bA}/_buildManifest.js +0 -0
  262. /package/web/.next/static/{lPbWG8a1RwBDDcvRngp58 → k_Awt-2YfRvvLIUlgT2bA}/_clientMiddlewareManifest.json +0 -0
  263. /package/web/.next/static/{lPbWG8a1RwBDDcvRngp58 → k_Awt-2YfRvvLIUlgT2bA}/_ssgManifest.js +0 -0
@@ -0,0 +1,62 @@
1
+ /**
2
+ * Codex CLI Session Repository
3
+ *
4
+ * Infrastructure implementation of IAgentSessionRepository for OpenAI Codex CLI.
5
+ * Reads JSONL session rollout files from `$CODEX_HOME/sessions/` (or `~/.codex/sessions/`
6
+ * when CODEX_HOME is not set) and the session index from `$CODEX_HOME/session_index.jsonl`.
7
+ *
8
+ * Directory structure:
9
+ * $CODEX_HOME/session_index.jsonl — one JSON object per line with {id, thread_name, updated_at}
10
+ * $CODEX_HOME/sessions/YYYY/MM/DD/rollout-<timestamp>-<session-id>.jsonl
11
+ *
12
+ * Rollout file events:
13
+ * - session_meta: session metadata (id, cwd, cli_version, model_provider)
14
+ * - event_msg: lifecycle events (task_started, etc.)
15
+ * - response_item: messages (role: user/assistant/developer), function_call, function_call_output
16
+ * - turn_context: per-turn context (cwd, model, sandbox_policy)
17
+ */
18
+ import type { AgentSession } from '../../../../domain/generated/output.js';
19
+ import type { IAgentSessionRepository, ListSessionsOptions, GetSessionOptions } from '../../../../application/ports/output/agents/agent-session-repository.interface.js';
20
+ export declare class CodexCliSessionRepository implements IAgentSessionRepository {
21
+ private readonly basePath;
22
+ constructor(basePath?: string);
23
+ /**
24
+ * Resolve the Codex home directory.
25
+ * Uses CODEX_HOME env var if set, otherwise defaults to ~/.codex
26
+ */
27
+ static resolveCodexHome(): string;
28
+ isSupported(): boolean;
29
+ list(options?: ListSessionsOptions): Promise<AgentSession[]>;
30
+ findById(id: string, options?: GetSessionOptions): Promise<AgentSession | null>;
31
+ /** Read and parse the session_index.jsonl file */
32
+ private readSessionIndex;
33
+ /** Convert a session index entry to a lightweight AgentSession */
34
+ private indexEntryToSession;
35
+ /**
36
+ * Recursively collect all rollout .jsonl files from the sessions/ directory.
37
+ * Structure: sessions/YYYY/MM/DD/rollout-<timestamp>-<id>.jsonl
38
+ */
39
+ private collectSessionFiles;
40
+ /** Recursively walk a directory tree collecting .jsonl rollout files */
41
+ private walkDirectory;
42
+ /**
43
+ * Extract session ID from a rollout filename.
44
+ * Format: rollout-YYYY-MM-DDTHH-MM-SS-<session-id>.jsonl
45
+ * The session ID is the UUID portion after the timestamp.
46
+ */
47
+ private extractSessionIdFromFilename;
48
+ /**
49
+ * Find a session rollout file by ID.
50
+ * Scans the sessions/ directory recursively for a file containing the given ID.
51
+ */
52
+ private findSessionFile;
53
+ /**
54
+ * Parse a Codex CLI rollout JSONL file into an AgentSession.
55
+ */
56
+ private parseRolloutFile;
57
+ /** Extract text from Codex content blocks */
58
+ private extractTextFromContent;
59
+ /** Replace home directory prefix with ~ */
60
+ private abbreviatePath;
61
+ }
62
+ //# sourceMappingURL=codex-cli-session.repository.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"codex-cli-session.repository.d.ts","sourceRoot":"","sources":["../../../../../../../../packages/core/src/infrastructure/services/agents/sessions/codex-cli-session.repository.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAMH,OAAO,KAAK,EACV,YAAY,EAGb,MAAM,wCAAwC,CAAC;AAChD,OAAO,KAAK,EACV,uBAAuB,EACvB,mBAAmB,EACnB,iBAAiB,EAClB,MAAM,mFAAmF,CAAC;AA0C3F,qBACa,yBAA0B,YAAW,uBAAuB;IAC3D,OAAO,CAAC,QAAQ,CAAC,QAAQ;gBAAR,QAAQ,GAAE,MAAqD;IAE5F;;;OAGG;IACH,MAAM,CAAC,gBAAgB,IAAI,MAAM;IAIjC,WAAW,IAAI,OAAO;IAIhB,IAAI,CAAC,OAAO,CAAC,EAAE,mBAAmB,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC;IA8C5D,QAAQ,CAAC,EAAE,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,iBAAiB,GAAG,OAAO,CAAC,YAAY,GAAG,IAAI,CAAC;IAmBrF,kDAAkD;YACpC,gBAAgB;IAoB9B,kEAAkE;IAClE,OAAO,CAAC,mBAAmB;IAa3B;;;OAGG;YACW,mBAAmB;IAajC,wEAAwE;YAC1D,aAAa;IAsC3B;;;;OAIG;IACH,OAAO,CAAC,4BAA4B;IASpC;;;OAGG;YACW,eAAe;IAqB7B;;OAEG;YACW,gBAAgB;IAgI9B,6CAA6C;IAC7C,OAAO,CAAC,sBAAsB;IAW9B,2CAA2C;IAC3C,OAAO,CAAC,cAAc;CAQvB"}
@@ -0,0 +1,356 @@
1
+ /**
2
+ * Codex CLI Session Repository
3
+ *
4
+ * Infrastructure implementation of IAgentSessionRepository for OpenAI Codex CLI.
5
+ * Reads JSONL session rollout files from `$CODEX_HOME/sessions/` (or `~/.codex/sessions/`
6
+ * when CODEX_HOME is not set) and the session index from `$CODEX_HOME/session_index.jsonl`.
7
+ *
8
+ * Directory structure:
9
+ * $CODEX_HOME/session_index.jsonl — one JSON object per line with {id, thread_name, updated_at}
10
+ * $CODEX_HOME/sessions/YYYY/MM/DD/rollout-<timestamp>-<session-id>.jsonl
11
+ *
12
+ * Rollout file events:
13
+ * - session_meta: session metadata (id, cwd, cli_version, model_provider)
14
+ * - event_msg: lifecycle events (task_started, etc.)
15
+ * - response_item: messages (role: user/assistant/developer), function_call, function_call_output
16
+ * - turn_context: per-turn context (cwd, model, sandbox_policy)
17
+ */
18
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
19
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
20
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
21
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
22
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
23
+ };
24
+ var __metadata = (this && this.__metadata) || function (k, v) {
25
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
26
+ };
27
+ var CodexCliSessionRepository_1;
28
+ import * as fs from 'node:fs/promises';
29
+ import * as os from 'node:os';
30
+ import * as path from 'node:path';
31
+ import { injectable } from 'tsyringe';
32
+ let CodexCliSessionRepository = CodexCliSessionRepository_1 = class CodexCliSessionRepository {
33
+ basePath;
34
+ constructor(basePath = CodexCliSessionRepository_1.resolveCodexHome()) {
35
+ this.basePath = basePath;
36
+ }
37
+ /**
38
+ * Resolve the Codex home directory.
39
+ * Uses CODEX_HOME env var if set, otherwise defaults to ~/.codex
40
+ */
41
+ static resolveCodexHome() {
42
+ return process.env.CODEX_HOME ?? path.join(os.homedir(), '.codex');
43
+ }
44
+ isSupported() {
45
+ return true;
46
+ }
47
+ async list(options) {
48
+ const limit = options?.limit ?? 20;
49
+ // First try the session index for fast listing
50
+ const indexEntries = await this.readSessionIndex();
51
+ if (indexEntries.length > 0) {
52
+ // Deduplicate: keep the latest entry per session ID
53
+ const latestById = new Map();
54
+ for (const entry of indexEntries) {
55
+ latestById.set(entry.id, entry);
56
+ }
57
+ // Sort by updated_at descending
58
+ const sorted = [...latestById.values()].sort((a, b) => {
59
+ const aTime = a.updated_at ? new Date(a.updated_at).getTime() : 0;
60
+ const bTime = b.updated_at ? new Date(b.updated_at).getTime() : 0;
61
+ return bTime - aTime;
62
+ });
63
+ const toReturn = limit > 0 ? sorted.slice(0, limit) : sorted;
64
+ // Build lightweight sessions from index (no need to parse full rollout files)
65
+ return toReturn.map((entry) => this.indexEntryToSession(entry));
66
+ }
67
+ // Fallback: scan rollout files directly
68
+ const fileInfos = await this.collectSessionFiles();
69
+ fileInfos.sort((a, b) => b.mtime.getTime() - a.mtime.getTime());
70
+ const toParse = limit > 0 ? fileInfos.slice(0, limit) : fileInfos;
71
+ const parseResults = await Promise.allSettled(toParse.map((fi) => this.parseRolloutFile(fi, { includeMessages: false })));
72
+ const sessions = [];
73
+ for (const result of parseResults) {
74
+ if (result.status === 'fulfilled' && result.value !== null) {
75
+ sessions.push(result.value);
76
+ }
77
+ }
78
+ return sessions;
79
+ }
80
+ async findById(id, options) {
81
+ const messageLimit = options?.messageLimit ?? 20;
82
+ const match = await this.findSessionFile(id);
83
+ if (match === null)
84
+ return null;
85
+ try {
86
+ const stat = await fs.stat(match.filePath);
87
+ const fileInfo = {
88
+ id: match.resolvedId,
89
+ filePath: match.filePath,
90
+ mtime: stat.mtime,
91
+ };
92
+ return await this.parseRolloutFile(fileInfo, { includeMessages: true, messageLimit });
93
+ }
94
+ catch {
95
+ return null;
96
+ }
97
+ }
98
+ /** Read and parse the session_index.jsonl file */
99
+ async readSessionIndex() {
100
+ const indexPath = path.join(this.basePath, 'session_index.jsonl');
101
+ try {
102
+ const content = await fs.readFile(indexPath, 'utf-8');
103
+ const entries = [];
104
+ for (const line of content.split('\n')) {
105
+ const trimmed = line.trim();
106
+ if (!trimmed)
107
+ continue;
108
+ try {
109
+ entries.push(JSON.parse(trimmed));
110
+ }
111
+ catch {
112
+ // Skip malformed lines
113
+ }
114
+ }
115
+ return entries;
116
+ }
117
+ catch {
118
+ return [];
119
+ }
120
+ }
121
+ /** Convert a session index entry to a lightweight AgentSession */
122
+ indexEntryToSession(entry) {
123
+ const updatedAt = entry.updated_at ? new Date(entry.updated_at) : new Date();
124
+ return {
125
+ id: entry.id,
126
+ agentType: 'codex-cli',
127
+ projectPath: '',
128
+ messageCount: 0,
129
+ createdAt: updatedAt,
130
+ updatedAt,
131
+ preview: entry.thread_name,
132
+ };
133
+ }
134
+ /**
135
+ * Recursively collect all rollout .jsonl files from the sessions/ directory.
136
+ * Structure: sessions/YYYY/MM/DD/rollout-<timestamp>-<id>.jsonl
137
+ */
138
+ async collectSessionFiles() {
139
+ const sessionsDir = path.join(this.basePath, 'sessions');
140
+ const fileInfos = [];
141
+ try {
142
+ await this.walkDirectory(sessionsDir, fileInfos);
143
+ }
144
+ catch {
145
+ // sessions directory doesn't exist
146
+ }
147
+ return fileInfos;
148
+ }
149
+ /** Recursively walk a directory tree collecting .jsonl rollout files */
150
+ async walkDirectory(dir, results) {
151
+ let entries;
152
+ try {
153
+ entries = await fs.readdir(dir, { withFileTypes: true, encoding: 'utf-8' });
154
+ }
155
+ catch {
156
+ return;
157
+ }
158
+ const promises = [];
159
+ for (const entry of entries) {
160
+ const fullPath = path.join(dir, entry.name);
161
+ if (entry.isDirectory()) {
162
+ promises.push(this.walkDirectory(fullPath, results));
163
+ }
164
+ else if (entry.isFile() &&
165
+ entry.name.endsWith('.jsonl') &&
166
+ entry.name.startsWith('rollout-')) {
167
+ promises.push(fs
168
+ .stat(fullPath)
169
+ .then((stat) => {
170
+ const sessionId = this.extractSessionIdFromFilename(entry.name);
171
+ if (sessionId) {
172
+ results.push({ id: sessionId, filePath: fullPath, mtime: stat.mtime });
173
+ }
174
+ })
175
+ .catch(() => {
176
+ // Skip files we can't stat
177
+ }));
178
+ }
179
+ }
180
+ await Promise.allSettled(promises);
181
+ }
182
+ /**
183
+ * Extract session ID from a rollout filename.
184
+ * Format: rollout-YYYY-MM-DDTHH-MM-SS-<session-id>.jsonl
185
+ * The session ID is the UUID portion after the timestamp.
186
+ */
187
+ extractSessionIdFromFilename(filename) {
188
+ // rollout-2026-03-24T12-25-16-019d1f60-95de-7141-a648-e3e2fe3da012.jsonl
189
+ // The UUID starts after the timestamp prefix (rollout-YYYY-MM-DDTHH-MM-SS-)
190
+ const withoutExt = filename.replace(/\.jsonl$/, '');
191
+ // Match: rollout-<date>T<time>-<uuid>
192
+ const match = withoutExt.match(/^rollout-\d{4}-\d{2}-\d{2}T\d{2}-\d{2}-\d{2}-(.+)$/);
193
+ return match ? match[1] : null;
194
+ }
195
+ /**
196
+ * Find a session rollout file by ID.
197
+ * Scans the sessions/ directory recursively for a file containing the given ID.
198
+ */
199
+ async findSessionFile(id) {
200
+ const fileInfos = await this.collectSessionFiles();
201
+ // Exact match first
202
+ for (const fi of fileInfos) {
203
+ if (fi.id === id) {
204
+ return { filePath: fi.filePath, resolvedId: fi.id };
205
+ }
206
+ }
207
+ // Prefix match
208
+ const matches = fileInfos.filter((fi) => fi.id.startsWith(id));
209
+ if (matches.length === 1) {
210
+ return { filePath: matches[0].filePath, resolvedId: matches[0].id };
211
+ }
212
+ return null;
213
+ }
214
+ /**
215
+ * Parse a Codex CLI rollout JSONL file into an AgentSession.
216
+ */
217
+ async parseRolloutFile(fileInfo, options) {
218
+ const content = await fs.readFile(fileInfo.filePath, 'utf-8');
219
+ const lines = content.split('\n').filter((l) => l.trim().length > 0);
220
+ let cwd;
221
+ let _cliVersion;
222
+ let firstMessageAt;
223
+ let lastMessageAt;
224
+ let preview;
225
+ let messageCount = 0;
226
+ const messages = [];
227
+ for (const line of lines) {
228
+ let entry;
229
+ try {
230
+ entry = JSON.parse(line);
231
+ }
232
+ catch {
233
+ continue;
234
+ }
235
+ const type = entry.type;
236
+ const timestamp = entry.timestamp ? new Date(entry.timestamp) : fileInfo.mtime;
237
+ if (type === 'session_meta') {
238
+ const payload = entry.payload;
239
+ if (payload?.cwd)
240
+ cwd = payload.cwd;
241
+ if (payload?.cli_version)
242
+ _cliVersion = payload.cli_version;
243
+ continue;
244
+ }
245
+ if (type === 'turn_context') {
246
+ // Use turn context cwd as fallback
247
+ if (!cwd && entry.payload?.cwd)
248
+ cwd = entry.payload.cwd;
249
+ continue;
250
+ }
251
+ if (type === 'response_item') {
252
+ const payload = entry.payload;
253
+ if (!payload)
254
+ continue;
255
+ // Only count user and assistant messages (skip developer/system)
256
+ if (payload.type === 'message' &&
257
+ (payload.role === 'user' || payload.role === 'assistant')) {
258
+ messageCount++;
259
+ firstMessageAt ??= timestamp;
260
+ lastMessageAt = timestamp;
261
+ // Extract preview from first user message
262
+ if (payload.role === 'user' && preview === undefined) {
263
+ preview = this.extractTextFromContent(payload.content);
264
+ }
265
+ if (options.includeMessages) {
266
+ messages.push({
267
+ uuid: entry.payload?.call_id ?? `${fileInfo.id}-${messageCount}`,
268
+ role: payload.role,
269
+ content: this.extractTextFromContent(payload.content),
270
+ timestamp,
271
+ });
272
+ }
273
+ }
274
+ // Count function calls as part of conversation but don't add as messages
275
+ if (payload.type === 'function_call') {
276
+ messageCount++;
277
+ lastMessageAt = timestamp;
278
+ if (options.includeMessages) {
279
+ const toolName = payload.name ?? 'unknown_tool';
280
+ messages.push({
281
+ uuid: payload.call_id ?? `${fileInfo.id}-${messageCount}`,
282
+ role: 'assistant',
283
+ content: `[tool: ${toolName}] ${payload.arguments ?? ''}`,
284
+ timestamp,
285
+ });
286
+ }
287
+ }
288
+ if (payload.type === 'function_call_output') {
289
+ lastMessageAt = timestamp;
290
+ if (options.includeMessages) {
291
+ const output = payload.output ?? '';
292
+ const truncated = output.length > 500 ? `${output.slice(0, 497)}...` : output;
293
+ messages.push({
294
+ uuid: payload.call_id ?? `${fileInfo.id}-result-${messageCount}`,
295
+ role: 'assistant',
296
+ content: `[tool-result] ${truncated}`,
297
+ timestamp,
298
+ });
299
+ }
300
+ }
301
+ }
302
+ }
303
+ if (cwd === undefined) {
304
+ // Can't determine project path — too sparse
305
+ return null;
306
+ }
307
+ let messagesToReturn = messages;
308
+ if (options.includeMessages && options.messageLimit !== undefined && options.messageLimit > 0) {
309
+ messagesToReturn = messages.slice(-options.messageLimit);
310
+ }
311
+ const session = {
312
+ id: fileInfo.id,
313
+ agentType: 'codex-cli',
314
+ projectPath: this.abbreviatePath(cwd),
315
+ messageCount,
316
+ createdAt: firstMessageAt ?? fileInfo.mtime,
317
+ updatedAt: lastMessageAt ?? fileInfo.mtime,
318
+ };
319
+ if (preview !== undefined)
320
+ session.preview = preview;
321
+ if (firstMessageAt !== undefined)
322
+ session.firstMessageAt = firstMessageAt;
323
+ if (lastMessageAt !== undefined)
324
+ session.lastMessageAt = lastMessageAt;
325
+ if (options.includeMessages)
326
+ session.messages = messagesToReturn;
327
+ return session;
328
+ }
329
+ /** Extract text from Codex content blocks */
330
+ extractTextFromContent(content) {
331
+ if (!content || !Array.isArray(content))
332
+ return '';
333
+ const parts = [];
334
+ for (const block of content) {
335
+ if ((block.type === 'input_text' || block.type === 'output_text') && block.text) {
336
+ parts.push(block.text);
337
+ }
338
+ }
339
+ return parts.join('\n');
340
+ }
341
+ /** Replace home directory prefix with ~ */
342
+ abbreviatePath(filePath) {
343
+ const home = os.homedir();
344
+ if (filePath === home)
345
+ return '~';
346
+ if (filePath.startsWith(`${home}${path.sep}`)) {
347
+ return `~${filePath.slice(home.length)}`;
348
+ }
349
+ return filePath;
350
+ }
351
+ };
352
+ CodexCliSessionRepository = CodexCliSessionRepository_1 = __decorate([
353
+ injectable(),
354
+ __metadata("design:paramtypes", [String])
355
+ ], CodexCliSessionRepository);
356
+ export { CodexCliSessionRepository };
@@ -66,6 +66,7 @@ export declare class InteractiveSessionService implements IInteractiveSessionSer
66
66
  stopByFeature(featureId: string): Promise<void>;
67
67
  markRead(featureId: string): Promise<void>;
68
68
  getTurnStatuses(featureIds: string[]): Promise<Map<string, string>>;
69
+ getAllActiveTurnStatuses(): Promise<Map<string, string>>;
69
70
  /** Find the in-memory state for an active session for a feature. */
70
71
  private findActiveStateForFeature;
71
72
  /** Resolve the agent type from an explicit override or settings. */
@@ -1 +1 @@
1
- {"version":3,"file":"interactive-session.service.d.ts","sourceRoot":"","sources":["../../../../../../../packages/core/src/infrastructure/services/interactive/interactive-session.service.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"interactive-session.service.d.ts","sourceRoot":"","sources":["../../../../../../../packages/core/src/infrastructure/services/interactive/interactive-session.service.ts"],"names":[],"mappings":"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"}
@@ -103,6 +103,8 @@ export class InteractiveSessionService {
103
103
  currentAssistantBuffer: '',
104
104
  toolEventsLog: [],
105
105
  subscribers: new Set(),
106
+ turnInProgress: false,
107
+ turnQueue: [],
106
108
  };
107
109
  this.sessions.set(session.id, state);
108
110
  // Fire-and-forget the async boot sequence. The API returns the session
@@ -343,11 +345,13 @@ export class InteractiveSessionService {
343
345
  }
344
346
  // eslint-disable-next-line no-console
345
347
  console.log(`[InteractiveSession] stopSession called for ${sessionId} (feature: ${state.featureId})`, new Error().stack?.split('\n').slice(1, 4).join(' <- '));
346
- // Abort any active stream iteration
348
+ // Abort any active stream iteration and clear pending turns
347
349
  if (state.streamAbort) {
348
350
  state.streamAbort.abort();
349
351
  state.streamAbort = undefined;
350
352
  }
353
+ state.turnQueue.length = 0;
354
+ state.turnInProgress = false;
351
355
  this.clearTimer(state);
352
356
  // Cache agentSessionId so resumption works when session restarts
353
357
  if (state.agentSessionId) {
@@ -391,8 +395,14 @@ export class InteractiveSessionService {
391
395
  // Reset idle timer on user activity
392
396
  this.resetTimer(state);
393
397
  await this.sessionRepo.updateLastActivity(sessionId, now);
394
- // Execute turn via SDK handle fire-and-forget, response streams to subscribers
395
- void this.executeAndPersistTurn(state, content);
398
+ // Guard: only one turn at a time per session (SDK stream is not concurrent-safe)
399
+ if (state.turnInProgress) {
400
+ state.turnQueue.push(content);
401
+ }
402
+ else {
403
+ state.turnInProgress = true;
404
+ void this.executeAndPersistTurn(state, content);
405
+ }
396
406
  return message;
397
407
  }
398
408
  /**
@@ -555,6 +565,24 @@ export class InteractiveSessionService {
555
565
  state.toolEventsLog = [];
556
566
  state.subscribers.forEach((sub) => sub({ delta: '', done: true }));
557
567
  }
568
+ else if (!responseText) {
569
+ // Stream ended without any response — SDK session likely died.
570
+ // Mark as error so the next message triggers a fresh session.
571
+ // eslint-disable-next-line no-console
572
+ console.error(`[InteractiveSession] stream ended without response for session ${state.sessionId} — session may have died`);
573
+ state.subscribers.forEach((sub) => sub({ delta: '', done: true, log: 'Session disconnected — will restart on next message' }));
574
+ if (state.agentSessionId) {
575
+ this.stoppedAgentSessionIds.set(state.featureId, state.agentSessionId);
576
+ }
577
+ this.sessions.delete(state.sessionId);
578
+ try {
579
+ await this.sessionRepo.updateStatus(state.sessionId, InteractiveSessionStatus.error);
580
+ }
581
+ catch {
582
+ // Best-effort DB update
583
+ }
584
+ return; // Skip queue drain — session is dead
585
+ }
558
586
  }
559
587
  catch (err) {
560
588
  // If session was already stopped, ignore
@@ -563,6 +591,15 @@ export class InteractiveSessionService {
563
591
  // eslint-disable-next-line no-console
564
592
  console.error(`[InteractiveSession] turn failed for session ${state.sessionId}:`, err);
565
593
  }
594
+ finally {
595
+ // Release the turn lock and drain the queue
596
+ state.turnInProgress = false;
597
+ if (this.sessions.has(state.sessionId) && state.turnQueue.length > 0) {
598
+ const nextContent = state.turnQueue.shift();
599
+ state.turnInProgress = true;
600
+ void this.executeAndPersistTurn(state, nextContent);
601
+ }
602
+ }
566
603
  }
567
604
  async getMessages(featureId, limit) {
568
605
  return this.messageRepo.findByFeatureId(featureId, limit);
@@ -609,10 +646,16 @@ export class InteractiveSessionService {
609
646
  if (state) {
610
647
  const dbSession = await this.sessionRepo.findById(state.sessionId);
611
648
  if (dbSession?.status === InteractiveSessionStatus.ready) {
612
- // Session ready — send to agent
649
+ // Session ready — send to agent (guarded: one turn at a time)
613
650
  this.resetTimer(state);
614
651
  await this.sessionRepo.updateLastActivity(state.sessionId, now);
615
- void this.executeAndPersistTurn(state, content);
652
+ if (state.turnInProgress) {
653
+ state.turnQueue.push(content);
654
+ }
655
+ else {
656
+ state.turnInProgress = true;
657
+ void this.executeAndPersistTurn(state, content);
658
+ }
616
659
  }
617
660
  else if (dbSession?.status === InteractiveSessionStatus.booting) {
618
661
  // Session booting — queue the message
@@ -750,6 +793,9 @@ export class InteractiveSessionService {
750
793
  async getTurnStatuses(featureIds) {
751
794
  return this.sessionRepo.getTurnStatuses(featureIds);
752
795
  }
796
+ async getAllActiveTurnStatuses() {
797
+ return this.sessionRepo.getAllActiveTurnStatuses();
798
+ }
753
799
  /** Find the in-memory state for an active session for a feature. */
754
800
  findActiveStateForFeature(featureId) {
755
801
  for (const state of this.sessions.values()) {
@@ -8,8 +8,8 @@ import { AgentType } from '../../../../packages/core/src/domain/generated/output
8
8
  /**
9
9
  * Creates the @inquirer/select configuration for selecting an AI coding agent.
10
10
  *
11
- * Only Claude Code is currently available. Other agents are shown as
12
- * disabled with a "Coming Soon" badge.
11
+ * Active agents are selectable. Agents not yet implemented are shown
12
+ * as disabled with a "Coming Soon" badge.
13
13
  */
14
14
  export declare function createAgentSelectConfig(): {
15
15
  readonly message: "Select your AI coding agent";
@@ -21,6 +21,10 @@ export declare function createAgentSelectConfig(): {
21
21
  readonly name: "Gemini CLI";
22
22
  readonly value: AgentType.GeminiCli;
23
23
  readonly description: "Google Gemini CLI";
24
+ }, {
25
+ readonly name: "Codex CLI";
26
+ readonly value: AgentType.CodexCli;
27
+ readonly description: "OpenAI's Codex CLI terminal agent (GPT models)";
24
28
  }, {
25
29
  readonly name: "Cursor";
26
30
  readonly value: AgentType.Cursor;
@@ -1 +1 @@
1
- {"version":3,"file":"agent-select.prompt.d.ts","sourceRoot":"","sources":["../../../../../src/presentation/tui/prompts/agent-select.prompt.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,SAAS,EAAE,MAAM,8BAA8B,CAAC;AAGzD;;;;;GAKG;AACH,wBAAgB,uBAAuB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAqCtC"}
1
+ {"version":3,"file":"agent-select.prompt.d.ts","sourceRoot":"","sources":["../../../../../src/presentation/tui/prompts/agent-select.prompt.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,SAAS,EAAE,MAAM,8BAA8B,CAAC;AAGzD;;;;;GAKG;AACH,wBAAgB,uBAAuB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EA0CtC"}
@@ -9,8 +9,8 @@ import { shepTheme } from '../themes/shep.theme.js';
9
9
  /**
10
10
  * Creates the @inquirer/select configuration for selecting an AI coding agent.
11
11
  *
12
- * Only Claude Code is currently available. Other agents are shown as
13
- * disabled with a "Coming Soon" badge.
12
+ * Active agents are selectable. Agents not yet implemented are shown
13
+ * as disabled with a "Coming Soon" badge.
14
14
  */
15
15
  export function createAgentSelectConfig() {
16
16
  return {
@@ -26,6 +26,11 @@ export function createAgentSelectConfig() {
26
26
  value: AgentType.GeminiCli,
27
27
  description: 'Google Gemini CLI',
28
28
  },
29
+ {
30
+ name: 'Codex CLI',
31
+ value: AgentType.CodexCli,
32
+ description: "OpenAI's Codex CLI terminal agent (GPT models)",
33
+ },
29
34
  {
30
35
  name: 'Cursor',
31
36
  value: AgentType.Cursor,
@@ -1 +1 @@
1
- {"version":3,"file":"get-all-agent-models.d.ts","sourceRoot":"","sources":["../../../../../../src/presentation/web/app/actions/get-all-agent-models.ts"],"names":[],"mappings":"AAMA,MAAM,WAAW,SAAS;IACxB,EAAE,EAAE,MAAM,CAAC;IACX,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,eAAe;IAC9B,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,SAAS,EAAE,CAAC;CACrB;AAiBD,wBAAsB,iBAAiB,IAAI,OAAO,CAAC,eAAe,EAAE,CAAC,CA+BpE"}
1
+ {"version":3,"file":"get-all-agent-models.d.ts","sourceRoot":"","sources":["../../../../../../src/presentation/web/app/actions/get-all-agent-models.ts"],"names":[],"mappings":"AAMA,MAAM,WAAW,SAAS;IACxB,EAAE,EAAE,MAAM,CAAC;IACX,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,eAAe;IAC9B,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,SAAS,EAAE,CAAC;CACrB;AAmBD,wBAAsB,iBAAiB,IAAI,OAAO,CAAC,eAAe,EAAE,CAAC,CA+BpE"}
@@ -3,6 +3,7 @@ import { resolve } from '../../lib/server-container.js';
3
3
  import { getModelMeta } from '../../lib/model-metadata.js';
4
4
  const AGENT_LABELS = {
5
5
  'claude-code': 'Claude Code',
6
+ 'codex-cli': 'Codex CLI',
6
7
  cursor: 'Cursor CLI',
7
8
  'gemini-cli': 'Gemini CLI',
8
9
  dev: 'Demo',
@@ -10,8 +11,9 @@ const AGENT_LABELS = {
10
11
  /** Sort weight — higher = further down. Demo always last. */
11
12
  const AGENT_ORDER = {
12
13
  'claude-code': 0,
13
- cursor: 1,
14
- 'gemini-cli': 2,
14
+ 'codex-cli': 1,
15
+ cursor: 2,
16
+ 'gemini-cli': 3,
15
17
  dev: 99,
16
18
  };
17
19
  export async function getAllAgentModels() {
@@ -1,13 +1,12 @@
1
1
  /**
2
2
  * Bulk turn-status API.
3
3
  *
4
- * GET /api/interactive/chat/turn-statuses?featureIds=id1,id2,...
4
+ * GET /api/interactive/chat/turn-statuses
5
5
  *
6
- * Returns a map of featureId turnStatus ('idle' | 'processing' | 'unread')
7
- * for all requested features. Used by UI dot indicators on chat buttons.
6
+ * Returns ALL non-idle turn statuses as { featureId: turnStatus }.
7
+ * No parameters needed the backend knows which sessions are active.
8
8
  */
9
- import type { NextRequest } from 'next/server';
10
9
  import { NextResponse } from 'next/server';
11
10
  export declare const dynamic = "force-dynamic";
12
- export declare function GET(request: NextRequest): Promise<NextResponse>;
11
+ export declare function GET(): Promise<NextResponse>;
13
12
  //# sourceMappingURL=route.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"route.d.ts","sourceRoot":"","sources":["../../../../../../../../../src/presentation/web/app/api/interactive/chat/turn-statuses/route.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAC/C,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAI3C,eAAO,MAAM,OAAO,kBAAkB,CAAC;AAEvC,wBAAsB,GAAG,CAAC,OAAO,EAAE,WAAW,GAAG,OAAO,CAAC,YAAY,CAAC,CA8BrE"}
1
+ {"version":3,"file":"route.d.ts","sourceRoot":"","sources":["../../../../../../../../../src/presentation/web/app/api/interactive/chat/turn-statuses/route.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAI3C,eAAO,MAAM,OAAO,kBAAkB,CAAC;AAEvC,wBAAsB,GAAG,IAAI,OAAO,CAAC,YAAY,CAAC,CAoBjD"}