@shipit-ai/cli 1.166.1 → 1.167.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (577) hide show
  1. package/README.md +26 -5
  2. package/apis/json-schema/AgentConfig.yaml +3 -0
  3. package/apis/json-schema/AgentPermissionSettings.yaml +23 -0
  4. package/apis/json-schema/AgentType.yaml +0 -1
  5. package/apis/json-schema/ClaudeCodePermissionMode.yaml +9 -0
  6. package/apis/json-schema/CodexPermissionMode.yaml +8 -0
  7. package/apis/json-schema/CopilotPermissionMode.yaml +8 -0
  8. package/apis/json-schema/CursorPermissionMode.yaml +7 -0
  9. package/apis/json-schema/Feature.yaml +3 -0
  10. package/apis/json-schema/GeminiPermissionMode.yaml +8 -0
  11. package/apis/json-schema/RovoDevPermissionMode.yaml +8 -0
  12. package/dist/packages/core/src/application/ports/output/agents/agent-executor.interface.d.ts +8 -0
  13. package/dist/packages/core/src/application/ports/output/agents/agent-executor.interface.d.ts.map +1 -1
  14. package/dist/packages/core/src/application/ports/output/agents/feature-agent-process.interface.d.ts +1 -0
  15. package/dist/packages/core/src/application/ports/output/agents/feature-agent-process.interface.d.ts.map +1 -1
  16. package/dist/packages/core/src/application/ports/output/agents/interactive-agent-executor.interface.d.ts +3 -0
  17. package/dist/packages/core/src/application/ports/output/agents/interactive-agent-executor.interface.d.ts.map +1 -1
  18. package/dist/packages/core/src/application/ports/output/services/index.d.ts +1 -0
  19. package/dist/packages/core/src/application/ports/output/services/index.d.ts.map +1 -1
  20. package/dist/packages/core/src/application/ports/output/services/settings-reader.interface.d.ts +13 -0
  21. package/dist/packages/core/src/application/ports/output/services/settings-reader.interface.d.ts.map +1 -0
  22. package/dist/packages/core/src/application/ports/output/services/settings-reader.interface.js +1 -0
  23. package/dist/packages/core/src/application/use-cases/agents/configure-agent.use-case.d.ts.map +1 -1
  24. package/dist/packages/core/src/application/use-cases/agents/configure-agent.use-case.js +4 -6
  25. package/dist/packages/core/src/application/use-cases/features/check-and-unblock-features.use-case.d.ts.map +1 -1
  26. package/dist/packages/core/src/application/use-cases/features/check-and-unblock-features.use-case.js +1 -0
  27. package/dist/packages/core/src/application/use-cases/features/create/create-feature.use-case.d.ts.map +1 -1
  28. package/dist/packages/core/src/application/use-cases/features/create/create-feature.use-case.js +21 -2
  29. package/dist/packages/core/src/application/use-cases/features/create/types.d.ts +2 -0
  30. package/dist/packages/core/src/application/use-cases/features/create/types.d.ts.map +1 -1
  31. package/dist/packages/core/src/application/use-cases/features/resume-feature.use-case.d.ts.map +1 -1
  32. package/dist/packages/core/src/application/use-cases/features/resume-feature.use-case.js +1 -0
  33. package/dist/packages/core/src/application/use-cases/features/start-feature.use-case.d.ts.map +1 -1
  34. package/dist/packages/core/src/application/use-cases/features/start-feature.use-case.js +1 -0
  35. package/dist/packages/core/src/application/use-cases/settings/complete-onboarding.use-case.d.ts +2 -0
  36. package/dist/packages/core/src/application/use-cases/settings/complete-onboarding.use-case.d.ts.map +1 -1
  37. package/dist/packages/core/src/application/use-cases/settings/complete-onboarding.use-case.js +23 -0
  38. package/dist/packages/core/src/domain/factories/settings-defaults.factory.d.ts.map +1 -1
  39. package/dist/packages/core/src/domain/factories/settings-defaults.factory.js +9 -1
  40. package/dist/packages/core/src/domain/generated/output.d.ts +68 -2
  41. package/dist/packages/core/src/domain/generated/output.d.ts.map +1 -1
  42. package/dist/packages/core/src/domain/generated/output.js +36 -1
  43. package/dist/packages/core/src/infrastructure/di/modules/agents.module.d.ts.map +1 -1
  44. package/dist/packages/core/src/infrastructure/di/modules/agents.module.js +4 -2
  45. package/dist/packages/core/src/infrastructure/di/modules/services.module.d.ts.map +1 -1
  46. package/dist/packages/core/src/infrastructure/di/modules/services.module.js +2 -0
  47. package/dist/packages/core/src/infrastructure/persistence/sqlite/mappers/feature.mapper.d.ts +1 -0
  48. package/dist/packages/core/src/infrastructure/persistence/sqlite/mappers/feature.mapper.d.ts.map +1 -1
  49. package/dist/packages/core/src/infrastructure/persistence/sqlite/mappers/feature.mapper.js +4 -0
  50. package/dist/packages/core/src/infrastructure/persistence/sqlite/mappers/settings.mapper.d.ts +6 -0
  51. package/dist/packages/core/src/infrastructure/persistence/sqlite/mappers/settings.mapper.d.ts.map +1 -1
  52. package/dist/packages/core/src/infrastructure/persistence/sqlite/mappers/settings.mapper.js +31 -0
  53. package/dist/packages/core/src/infrastructure/persistence/sqlite/migrations/052-add-agent-permission-modes.d.ts +21 -0
  54. package/dist/packages/core/src/infrastructure/persistence/sqlite/migrations/052-add-agent-permission-modes.d.ts.map +1 -0
  55. package/dist/packages/core/src/infrastructure/persistence/sqlite/migrations/052-add-agent-permission-modes.js +35 -0
  56. package/dist/packages/core/src/infrastructure/persistence/sqlite/migrations/053-add-feature-permission-mode.d.ts +14 -0
  57. package/dist/packages/core/src/infrastructure/persistence/sqlite/migrations/053-add-feature-permission-mode.d.ts.map +1 -0
  58. package/dist/packages/core/src/infrastructure/persistence/sqlite/migrations/053-add-feature-permission-mode.js +19 -0
  59. package/dist/packages/core/src/infrastructure/services/agents/analyze-repo/analyze-repository-graph.d.ts +3 -1
  60. package/dist/packages/core/src/infrastructure/services/agents/analyze-repo/analyze-repository-graph.d.ts.map +1 -1
  61. package/dist/packages/core/src/infrastructure/services/agents/analyze-repo/analyze-repository-graph.js +18 -7
  62. package/dist/packages/core/src/infrastructure/services/agents/common/agent-executor-factory.service.d.ts +1 -1
  63. package/dist/packages/core/src/infrastructure/services/agents/common/agent-executor-factory.service.d.ts.map +1 -1
  64. package/dist/packages/core/src/infrastructure/services/agents/common/agent-executor-factory.service.js +1 -6
  65. package/dist/packages/core/src/infrastructure/services/agents/common/agent-permissions.d.ts +21 -0
  66. package/dist/packages/core/src/infrastructure/services/agents/common/agent-permissions.d.ts.map +1 -0
  67. package/dist/packages/core/src/infrastructure/services/agents/common/agent-permissions.js +49 -0
  68. package/dist/packages/core/src/infrastructure/services/agents/common/agent-runner.service.d.ts +3 -1
  69. package/dist/packages/core/src/infrastructure/services/agents/common/agent-runner.service.d.ts.map +1 -1
  70. package/dist/packages/core/src/infrastructure/services/agents/common/agent-runner.service.js +4 -3
  71. package/dist/packages/core/src/infrastructure/services/agents/common/agent-validator.service.d.ts.map +1 -1
  72. package/dist/packages/core/src/infrastructure/services/agents/common/agent-validator.service.js +0 -3
  73. package/dist/packages/core/src/infrastructure/services/agents/common/executors/claude-code-executor.service.d.ts.map +1 -1
  74. package/dist/packages/core/src/infrastructure/services/agents/common/executors/claude-code-executor.service.js +11 -0
  75. package/dist/packages/core/src/infrastructure/services/agents/common/executors/claude-code-interactive-executor.service.d.ts.map +1 -1
  76. package/dist/packages/core/src/infrastructure/services/agents/common/executors/claude-code-interactive-executor.service.js +1 -1
  77. package/dist/packages/core/src/infrastructure/services/agents/common/executors/codex-cli-executor.service.d.ts.map +1 -1
  78. package/dist/packages/core/src/infrastructure/services/agents/common/executors/codex-cli-executor.service.js +4 -1
  79. package/dist/packages/core/src/infrastructure/services/agents/common/executors/copilot-cli-executor.service.d.ts.map +1 -1
  80. package/dist/packages/core/src/infrastructure/services/agents/common/executors/copilot-cli-executor.service.js +11 -4
  81. package/dist/packages/core/src/infrastructure/services/agents/common/executors/cursor-executor.service.d.ts.map +1 -1
  82. package/dist/packages/core/src/infrastructure/services/agents/common/executors/cursor-executor.service.js +11 -1
  83. package/dist/packages/core/src/infrastructure/services/agents/common/executors/gemini-cli-executor.service.d.ts.map +1 -1
  84. package/dist/packages/core/src/infrastructure/services/agents/common/executors/gemini-cli-executor.service.js +2 -1
  85. package/dist/packages/core/src/infrastructure/services/agents/common/executors/rovo-dev-executor.service.d.ts.map +1 -1
  86. package/dist/packages/core/src/infrastructure/services/agents/common/executors/rovo-dev-executor.service.js +11 -4
  87. package/dist/packages/core/src/infrastructure/services/agents/common/structured-agent-caller.service.d.ts +3 -1
  88. package/dist/packages/core/src/infrastructure/services/agents/common/structured-agent-caller.service.d.ts.map +1 -1
  89. package/dist/packages/core/src/infrastructure/services/agents/common/structured-agent-caller.service.js +13 -6
  90. package/dist/packages/core/src/infrastructure/services/agents/conflict-resolution/conflict-resolution.service.d.ts +3 -1
  91. package/dist/packages/core/src/infrastructure/services/agents/conflict-resolution/conflict-resolution.service.d.ts.map +1 -1
  92. package/dist/packages/core/src/infrastructure/services/agents/conflict-resolution/conflict-resolution.service.js +12 -3
  93. package/dist/packages/core/src/infrastructure/services/agents/feature-agent/fast-feature-agent-graph.d.ts +5 -0
  94. package/dist/packages/core/src/infrastructure/services/agents/feature-agent/fast-feature-agent-graph.d.ts.map +1 -1
  95. package/dist/packages/core/src/infrastructure/services/agents/feature-agent/feature-agent-graph.d.ts +18 -1
  96. package/dist/packages/core/src/infrastructure/services/agents/feature-agent/feature-agent-graph.d.ts.map +1 -1
  97. package/dist/packages/core/src/infrastructure/services/agents/feature-agent/feature-agent-process.service.d.ts +1 -0
  98. package/dist/packages/core/src/infrastructure/services/agents/feature-agent/feature-agent-process.service.d.ts.map +1 -1
  99. package/dist/packages/core/src/infrastructure/services/agents/feature-agent/feature-agent-process.service.js +3 -0
  100. package/dist/packages/core/src/infrastructure/services/agents/feature-agent/feature-agent-worker.d.ts +1 -0
  101. package/dist/packages/core/src/infrastructure/services/agents/feature-agent/feature-agent-worker.d.ts.map +1 -1
  102. package/dist/packages/core/src/infrastructure/services/agents/feature-agent/feature-agent-worker.js +8 -0
  103. package/dist/packages/core/src/infrastructure/services/agents/feature-agent/nodes/evidence.node.d.ts +3 -1
  104. package/dist/packages/core/src/infrastructure/services/agents/feature-agent/nodes/evidence.node.d.ts.map +1 -1
  105. package/dist/packages/core/src/infrastructure/services/agents/feature-agent/nodes/evidence.node.js +3 -2
  106. package/dist/packages/core/src/infrastructure/services/agents/feature-agent/nodes/merge/ci-watch-fix-loop.d.ts +3 -0
  107. package/dist/packages/core/src/infrastructure/services/agents/feature-agent/nodes/merge/ci-watch-fix-loop.d.ts.map +1 -1
  108. package/dist/packages/core/src/infrastructure/services/agents/feature-agent/nodes/merge/ci-watch-fix-loop.js +1 -1
  109. package/dist/packages/core/src/infrastructure/services/agents/feature-agent/nodes/merge/merge.node.d.ts +3 -0
  110. package/dist/packages/core/src/infrastructure/services/agents/feature-agent/nodes/merge/merge.node.d.ts.map +1 -1
  111. package/dist/packages/core/src/infrastructure/services/agents/feature-agent/nodes/merge/merge.node.js +2 -1
  112. package/dist/packages/core/src/infrastructure/services/agents/feature-agent/nodes/node-helpers.d.ts +11 -3
  113. package/dist/packages/core/src/infrastructure/services/agents/feature-agent/nodes/node-helpers.d.ts.map +1 -1
  114. package/dist/packages/core/src/infrastructure/services/agents/feature-agent/nodes/node-helpers.js +20 -5
  115. package/dist/packages/core/src/infrastructure/services/agents/feature-agent/nodes/repair.node.d.ts.map +1 -1
  116. package/dist/packages/core/src/infrastructure/services/agents/feature-agent/nodes/repair.node.js +6 -0
  117. package/dist/packages/core/src/infrastructure/services/agents/feature-agent/state.d.ts +1 -0
  118. package/dist/packages/core/src/infrastructure/services/agents/feature-agent/state.d.ts.map +1 -1
  119. package/dist/packages/core/src/infrastructure/services/agents/feature-agent/state.js +4 -0
  120. package/dist/packages/core/src/infrastructure/services/external/github-repository.service.d.ts.map +1 -1
  121. package/dist/packages/core/src/infrastructure/services/external/github-repository.service.js +14 -3
  122. package/dist/packages/core/src/infrastructure/services/settings-reader.service.d.ts +7 -0
  123. package/dist/packages/core/src/infrastructure/services/settings-reader.service.d.ts.map +1 -0
  124. package/dist/packages/core/src/infrastructure/services/settings-reader.service.js +25 -0
  125. package/dist/src/presentation/cli/commands/feat/new.command.d.ts.map +1 -1
  126. package/dist/src/presentation/cli/commands/feat/new.command.js +18 -0
  127. package/dist/src/presentation/cli/commands/feat/show.command.d.ts.map +1 -1
  128. package/dist/src/presentation/cli/commands/feat/show.command.js +2 -1
  129. package/dist/src/presentation/cli/commands/settings/agent.command.js +2 -2
  130. package/dist/src/presentation/cli/commands/settings/index.d.ts.map +1 -1
  131. package/dist/src/presentation/cli/commands/settings/index.js +3 -1
  132. package/dist/src/presentation/cli/commands/settings/permission-modes.d.ts +19 -0
  133. package/dist/src/presentation/cli/commands/settings/permission-modes.d.ts.map +1 -0
  134. package/dist/src/presentation/cli/commands/settings/permission-modes.js +38 -0
  135. package/dist/src/presentation/cli/commands/settings/permissions.command.d.ts +16 -0
  136. package/dist/src/presentation/cli/commands/settings/permissions.command.d.ts.map +1 -0
  137. package/dist/src/presentation/cli/commands/settings/permissions.command.js +147 -0
  138. package/dist/src/presentation/tui/prompts/agent-select.prompt.d.ts +4 -10
  139. package/dist/src/presentation/tui/prompts/agent-select.prompt.d.ts.map +1 -1
  140. package/dist/src/presentation/tui/prompts/agent-select.prompt.js +8 -13
  141. package/dist/src/presentation/tui/wizards/onboarding/onboarding.wizard.d.ts +5 -3
  142. package/dist/src/presentation/tui/wizards/onboarding/onboarding.wizard.d.ts.map +1 -1
  143. package/dist/src/presentation/tui/wizards/onboarding/onboarding.wizard.js +10 -5
  144. package/dist/src/presentation/tui/wizards/onboarding/steps/agent-permissions.step.d.ts +17 -0
  145. package/dist/src/presentation/tui/wizards/onboarding/steps/agent-permissions.step.d.ts.map +1 -0
  146. package/dist/src/presentation/tui/wizards/onboarding/steps/agent-permissions.step.js +48 -0
  147. package/dist/src/presentation/tui/wizards/onboarding/types.d.ts +2 -0
  148. package/dist/src/presentation/tui/wizards/onboarding/types.d.ts.map +1 -1
  149. package/dist/src/presentation/web/app/actions/agent-permissions.d.ts +14 -0
  150. package/dist/src/presentation/web/app/actions/agent-permissions.d.ts.map +1 -0
  151. package/dist/src/presentation/web/app/actions/agent-permissions.js +181 -0
  152. package/dist/src/presentation/web/app/actions/check-agent-auth.d.ts.map +1 -1
  153. package/dist/src/presentation/web/app/actions/check-agent-auth.js +2 -5
  154. package/dist/src/presentation/web/app/actions/check-agent-tool.js +1 -1
  155. package/dist/src/presentation/web/app/actions/deploy-repository.d.ts.map +1 -1
  156. package/dist/src/presentation/web/app/actions/deploy-repository.js +14 -7
  157. package/dist/src/presentation/web/app/actions/get-all-agent-models.d.ts.map +1 -1
  158. package/dist/src/presentation/web/app/actions/get-all-agent-models.js +2 -17
  159. package/dist/src/presentation/web/app/actions/get-merge-review-data.d.ts.map +1 -1
  160. package/dist/src/presentation/web/app/actions/get-merge-review-data.js +67 -23
  161. package/dist/src/presentation/web/app/actions/open-folder.d.ts.map +1 -1
  162. package/dist/src/presentation/web/app/actions/open-folder.js +12 -4
  163. package/dist/src/presentation/web/app/actions/open-shell.d.ts.map +1 -1
  164. package/dist/src/presentation/web/app/actions/open-shell.js +47 -7
  165. package/dist/src/presentation/web/app/api/agent-events/route.d.ts.map +1 -1
  166. package/dist/src/presentation/web/app/api/agent-events/route.js +2 -6
  167. package/dist/src/presentation/web/app/api/attachments/upload-from-path/route.d.ts.map +1 -1
  168. package/dist/src/presentation/web/app/api/attachments/upload-from-path/route.js +21 -17
  169. package/dist/src/presentation/web/app/api/deployment-logs/route.d.ts.map +1 -1
  170. package/dist/src/presentation/web/app/api/deployment-logs/route.js +2 -6
  171. package/dist/src/presentation/web/app/api/directory/list/route.d.ts.map +1 -1
  172. package/dist/src/presentation/web/app/api/directory/list/route.js +39 -24
  173. package/dist/src/presentation/web/app/api/interactive/chat/[featureId]/stream/route.d.ts.map +1 -1
  174. package/dist/src/presentation/web/app/api/interactive/chat/[featureId]/stream/route.js +2 -6
  175. package/dist/src/presentation/web/app/api/interactive/sessions/[id]/stream/route.d.ts.map +1 -1
  176. package/dist/src/presentation/web/app/api/interactive/sessions/[id]/stream/route.js +2 -6
  177. package/dist/src/presentation/web/components/common/feature-create-drawer/feature-create-drawer.d.ts.map +1 -1
  178. package/dist/src/presentation/web/components/common/feature-create-drawer/feature-create-drawer.js +1 -1
  179. package/dist/src/presentation/web/components/common/feature-create-drawer/types.d.ts +2 -0
  180. package/dist/src/presentation/web/components/common/feature-create-drawer/types.d.ts.map +1 -1
  181. package/dist/src/presentation/web/components/common/feature-create-drawer/use-feature-create-form.d.ts +2 -0
  182. package/dist/src/presentation/web/components/common/feature-create-drawer/use-feature-create-form.d.ts.map +1 -1
  183. package/dist/src/presentation/web/components/common/feature-create-drawer/use-feature-create-form.js +6 -0
  184. package/dist/src/presentation/web/components/common/feature-create-drawer/workflow-options-section.d.ts +7 -1
  185. package/dist/src/presentation/web/components/common/feature-create-drawer/workflow-options-section.d.ts.map +1 -1
  186. package/dist/src/presentation/web/components/common/feature-create-drawer/workflow-options-section.js +24 -3
  187. package/dist/src/presentation/web/components/common/feature-create-drawer/workflow-options-section.stories.d.ts.map +1 -1
  188. package/dist/src/presentation/web/components/common/feature-create-drawer/workflow-options-section.stories.js +3 -0
  189. package/dist/src/presentation/web/components/common/feature-list-item/feature-list-item.stories.js +2 -2
  190. package/dist/src/presentation/web/components/common/feature-node/agent-type-icons.d.ts +2 -2
  191. package/dist/src/presentation/web/components/common/feature-node/agent-type-icons.d.ts.map +1 -1
  192. package/dist/src/presentation/web/components/common/feature-node/agent-type-icons.js +4 -11
  193. package/dist/src/presentation/web/components/common/feature-node/agent-type-icons.stories.d.ts +1 -1
  194. package/dist/src/presentation/web/components/common/feature-node/agent-type-icons.stories.d.ts.map +1 -1
  195. package/dist/src/presentation/web/components/common/feature-node/agent-type-icons.stories.js +5 -6
  196. package/dist/src/presentation/web/components/common/feature-node/feature-node-state-config.d.ts +2 -0
  197. package/dist/src/presentation/web/components/common/feature-node/feature-node-state-config.d.ts.map +1 -1
  198. package/dist/src/presentation/web/components/common/feature-node/feature-node.d.ts.map +1 -1
  199. package/dist/src/presentation/web/components/common/feature-node/feature-node.js +2 -2
  200. package/dist/src/presentation/web/components/common/feature-node/feature-node.stories.js +10 -10
  201. package/dist/src/presentation/web/components/features/control-center/control-center.stories.js +1 -1
  202. package/dist/src/presentation/web/components/features/features-canvas/features-canvas.stories.js +2 -2
  203. package/dist/src/presentation/web/components/features/settings/AgentModelPicker/AgentModelPicker.stories.d.ts +1 -1
  204. package/dist/src/presentation/web/components/features/settings/AgentModelPicker/AgentModelPicker.stories.d.ts.map +1 -1
  205. package/dist/src/presentation/web/components/features/settings/AgentModelPicker/AgentModelPicker.stories.js +3 -3
  206. package/dist/src/presentation/web/components/features/settings/agent-permission-picker.d.ts +8 -0
  207. package/dist/src/presentation/web/components/features/settings/agent-permission-picker.d.ts.map +1 -0
  208. package/dist/src/presentation/web/components/features/settings/agent-permission-picker.js +33 -0
  209. package/dist/src/presentation/web/components/features/settings/agent-permission-picker.stories.d.ts +15 -0
  210. package/dist/src/presentation/web/components/features/settings/agent-permission-picker.stories.d.ts.map +1 -0
  211. package/dist/src/presentation/web/components/features/settings/agent-permission-picker.stories.js +75 -0
  212. package/dist/src/presentation/web/components/features/settings/agent-settings-section.d.ts.map +1 -1
  213. package/dist/src/presentation/web/components/features/settings/agent-settings-section.js +32 -4
  214. package/dist/src/presentation/web/components/features/settings/agent-settings-section.stories.d.ts +1 -1
  215. package/dist/src/presentation/web/components/features/settings/agent-settings-section.stories.d.ts.map +1 -1
  216. package/dist/src/presentation/web/components/features/settings/agent-settings-section.stories.js +2 -2
  217. package/dist/src/presentation/web/components/layouts/app-sidebar/app-sidebar.stories.js +2 -2
  218. package/dist/src/presentation/web/lib/path-sanitizers.d.ts +50 -0
  219. package/dist/src/presentation/web/lib/path-sanitizers.d.ts.map +1 -0
  220. package/dist/src/presentation/web/lib/path-sanitizers.js +137 -0
  221. package/dist/translations/ar/cli.json +16 -0
  222. package/dist/translations/ar/tui.json +12 -10
  223. package/dist/translations/ar/web.json +15 -0
  224. package/dist/translations/de/cli.json +16 -0
  225. package/dist/translations/de/tui.json +13 -5
  226. package/dist/translations/de/web.json +15 -0
  227. package/dist/translations/en/cli.json +16 -0
  228. package/dist/translations/en/tui.json +12 -10
  229. package/dist/translations/en/web.json +15 -0
  230. package/dist/translations/es/cli.json +16 -0
  231. package/dist/translations/es/tui.json +12 -10
  232. package/dist/translations/es/web.json +15 -0
  233. package/dist/translations/fr/cli.json +16 -0
  234. package/dist/translations/fr/tui.json +12 -10
  235. package/dist/translations/fr/web.json +15 -0
  236. package/dist/translations/he/cli.json +16 -0
  237. package/dist/translations/he/tui.json +12 -10
  238. package/dist/translations/he/web.json +15 -0
  239. package/dist/translations/pt/cli.json +16 -0
  240. package/dist/translations/pt/tui.json +12 -10
  241. package/dist/translations/pt/web.json +15 -0
  242. package/dist/translations/ru/cli.json +16 -0
  243. package/dist/translations/ru/tui.json +12 -10
  244. package/dist/translations/ru/web.json +15 -0
  245. package/dist/tsconfig.build.tsbuildinfo +1 -1
  246. package/package.json +6 -6
  247. package/web/.next/BUILD_ID +1 -1
  248. package/web/.next/build-manifest.json +3 -3
  249. package/web/.next/fallback-build-manifest.json +3 -3
  250. package/web/.next/prerender-manifest.json +3 -3
  251. package/web/.next/required-server-files.js +2 -2
  252. package/web/.next/required-server-files.json +2 -2
  253. package/web/.next/server/app/(dashboard)/@drawer/adopt/page/server-reference-manifest.json +29 -29
  254. package/web/.next/server/app/(dashboard)/@drawer/adopt/page.js +3 -4
  255. package/web/.next/server/app/(dashboard)/@drawer/adopt/page.js.nft.json +1 -1
  256. package/web/.next/server/app/(dashboard)/@drawer/adopt/page_client-reference-manifest.js +1 -1
  257. package/web/.next/server/app/(dashboard)/@drawer/chat/page/server-reference-manifest.json +27 -27
  258. package/web/.next/server/app/(dashboard)/@drawer/chat/page.js +3 -4
  259. package/web/.next/server/app/(dashboard)/@drawer/chat/page.js.nft.json +1 -1
  260. package/web/.next/server/app/(dashboard)/@drawer/chat/page_client-reference-manifest.js +1 -1
  261. package/web/.next/server/app/(dashboard)/@drawer/create/page/server-reference-manifest.json +72 -60
  262. package/web/.next/server/app/(dashboard)/@drawer/create/page.js +4 -4
  263. package/web/.next/server/app/(dashboard)/@drawer/create/page.js.nft.json +1 -1
  264. package/web/.next/server/app/(dashboard)/@drawer/create/page_client-reference-manifest.js +1 -1
  265. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/[tab]/page/server-reference-manifest.json +37 -37
  266. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/[tab]/page.js +4 -4
  267. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/[tab]/page.js.nft.json +1 -1
  268. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/[tab]/page_client-reference-manifest.js +1 -1
  269. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page/server-reference-manifest.json +37 -37
  270. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page.js +4 -4
  271. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page.js.nft.json +1 -1
  272. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page_client-reference-manifest.js +1 -1
  273. package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/[tab]/page/server-reference-manifest.json +28 -28
  274. package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/[tab]/page.js +3 -4
  275. package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/[tab]/page.js.nft.json +1 -1
  276. package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/[tab]/page_client-reference-manifest.js +1 -1
  277. package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page/server-reference-manifest.json +28 -28
  278. package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page.js +3 -4
  279. package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page.js.nft.json +1 -1
  280. package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page_client-reference-manifest.js +1 -1
  281. package/web/.next/server/app/(dashboard)/chat/page/server-reference-manifest.json +27 -27
  282. package/web/.next/server/app/(dashboard)/chat/page.js +3 -4
  283. package/web/.next/server/app/(dashboard)/chat/page.js.nft.json +1 -1
  284. package/web/.next/server/app/(dashboard)/chat/page_client-reference-manifest.js +1 -1
  285. package/web/.next/server/app/(dashboard)/create/page/server-reference-manifest.json +72 -60
  286. package/web/.next/server/app/(dashboard)/create/page.js +4 -4
  287. package/web/.next/server/app/(dashboard)/create/page.js.nft.json +1 -1
  288. package/web/.next/server/app/(dashboard)/create/page_client-reference-manifest.js +1 -1
  289. package/web/.next/server/app/(dashboard)/feature/[featureId]/[tab]/page/server-reference-manifest.json +37 -37
  290. package/web/.next/server/app/(dashboard)/feature/[featureId]/[tab]/page.js +4 -4
  291. package/web/.next/server/app/(dashboard)/feature/[featureId]/[tab]/page.js.nft.json +1 -1
  292. package/web/.next/server/app/(dashboard)/feature/[featureId]/[tab]/page_client-reference-manifest.js +1 -1
  293. package/web/.next/server/app/(dashboard)/feature/[featureId]/page/server-reference-manifest.json +37 -37
  294. package/web/.next/server/app/(dashboard)/feature/[featureId]/page.js +4 -4
  295. package/web/.next/server/app/(dashboard)/feature/[featureId]/page.js.nft.json +1 -1
  296. package/web/.next/server/app/(dashboard)/feature/[featureId]/page_client-reference-manifest.js +1 -1
  297. package/web/.next/server/app/(dashboard)/page/server-reference-manifest.json +27 -27
  298. package/web/.next/server/app/(dashboard)/page.js +3 -4
  299. package/web/.next/server/app/(dashboard)/page.js.nft.json +1 -1
  300. package/web/.next/server/app/(dashboard)/page_client-reference-manifest.js +1 -1
  301. package/web/.next/server/app/(dashboard)/repository/[repositoryId]/[tab]/page/server-reference-manifest.json +28 -28
  302. package/web/.next/server/app/(dashboard)/repository/[repositoryId]/[tab]/page.js +3 -4
  303. package/web/.next/server/app/(dashboard)/repository/[repositoryId]/[tab]/page.js.nft.json +1 -1
  304. package/web/.next/server/app/(dashboard)/repository/[repositoryId]/[tab]/page_client-reference-manifest.js +1 -1
  305. package/web/.next/server/app/(dashboard)/repository/[repositoryId]/page/server-reference-manifest.json +28 -28
  306. package/web/.next/server/app/(dashboard)/repository/[repositoryId]/page.js +3 -4
  307. package/web/.next/server/app/(dashboard)/repository/[repositoryId]/page.js.nft.json +1 -1
  308. package/web/.next/server/app/(dashboard)/repository/[repositoryId]/page_client-reference-manifest.js +1 -1
  309. package/web/.next/server/app/_global-error.html +1 -1
  310. package/web/.next/server/app/_global-error.rsc +1 -1
  311. package/web/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +1 -1
  312. package/web/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  313. package/web/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  314. package/web/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  315. package/web/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  316. package/web/.next/server/app/_not-found/page/server-reference-manifest.json +6 -6
  317. package/web/.next/server/app/_not-found/page.js +2 -3
  318. package/web/.next/server/app/_not-found/page.js.nft.json +1 -1
  319. package/web/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  320. package/web/.next/server/app/api/agent-events/route.js +2 -1
  321. package/web/.next/server/app/api/agent-events/route.js.nft.json +1 -1
  322. package/web/.next/server/app/api/attachments/preview/route.js +1 -1
  323. package/web/.next/server/app/api/attachments/preview/route.js.nft.json +1 -1
  324. package/web/.next/server/app/api/attachments/upload-from-path/route.js +1 -1
  325. package/web/.next/server/app/api/attachments/upload-from-path/route.js.nft.json +1 -1
  326. package/web/.next/server/app/api/deployment-logs/route.js +2 -1
  327. package/web/.next/server/app/api/deployment-logs/route.js.nft.json +1 -1
  328. package/web/.next/server/app/api/dialog/pick-files/route.js +1 -1
  329. package/web/.next/server/app/api/dialog/pick-files/route.js.nft.json +1 -1
  330. package/web/.next/server/app/api/directory/list/route.js +1 -1
  331. package/web/.next/server/app/api/directory/list/route.js.nft.json +1 -1
  332. package/web/.next/server/app/api/evidence/route.js +1 -1
  333. package/web/.next/server/app/api/evidence/route.js.nft.json +1 -1
  334. package/web/.next/server/app/api/graph-data/route.js +1 -1
  335. package/web/.next/server/app/api/graph-data/route.js.nft.json +1 -1
  336. package/web/.next/server/app/api/interactive/chat/[featureId]/messages/route.js +1 -1
  337. package/web/.next/server/app/api/interactive/chat/[featureId]/messages/route.js.nft.json +1 -1
  338. package/web/.next/server/app/api/interactive/chat/[featureId]/stream/route.js +2 -1
  339. package/web/.next/server/app/api/interactive/chat/[featureId]/stream/route.js.nft.json +1 -1
  340. package/web/.next/server/app/api/interactive/sessions/[id]/stream/route.js +2 -1
  341. package/web/.next/server/app/api/interactive/sessions/[id]/stream/route.js.nft.json +1 -1
  342. package/web/.next/server/app/api/sessions-batch/route.js +1 -1
  343. package/web/.next/server/app/api/sessions-batch/route.js.nft.json +1 -1
  344. package/web/.next/server/app/settings/page/server-reference-manifest.json +11 -11
  345. package/web/.next/server/app/settings/page.js +3 -4
  346. package/web/.next/server/app/settings/page.js.nft.json +1 -1
  347. package/web/.next/server/app/settings/page_client-reference-manifest.js +1 -1
  348. package/web/.next/server/app/skills/page/server-reference-manifest.json +11 -11
  349. package/web/.next/server/app/skills/page.js +3 -3
  350. package/web/.next/server/app/skills/page.js.nft.json +1 -1
  351. package/web/.next/server/app/skills/page_client-reference-manifest.js +1 -1
  352. package/web/.next/server/app/tools/page/server-reference-manifest.json +11 -11
  353. package/web/.next/server/app/tools/page.js +3 -3
  354. package/web/.next/server/app/tools/page.js.nft.json +1 -1
  355. package/web/.next/server/app/tools/page_client-reference-manifest.js +1 -1
  356. package/web/.next/server/app/version/page/server-reference-manifest.json +6 -6
  357. package/web/.next/server/app/version/page.js +2 -3
  358. package/web/.next/server/app/version/page.js.nft.json +1 -1
  359. package/web/.next/server/app/version/page_client-reference-manifest.js +1 -1
  360. package/web/.next/server/chunks/11es_next_dist_esm_build_templates_app-route_067cwst.js +1 -1
  361. package/web/.next/server/chunks/11es_next_dist_esm_build_templates_app-route_067cwst.js.map +1 -1
  362. package/web/.next/server/chunks/{[root-of-the-server]__02xmnal._.js → [root-of-the-server]__08cpfre._.js} +2 -2
  363. package/web/.next/server/chunks/[root-of-the-server]__0_-chcy._.js +3 -0
  364. package/web/.next/server/chunks/[root-of-the-server]__0_-chcy._.js.map +1 -0
  365. package/web/.next/server/chunks/[root-of-the-server]__0aft8l4._.js +9 -0
  366. package/web/.next/server/chunks/{[root-of-the-server]__0_6fhza._.js.map → [root-of-the-server]__0aft8l4._.js.map} +1 -1
  367. package/web/.next/server/chunks/[root-of-the-server]__0e9p7em._.js +3 -0
  368. package/web/.next/server/chunks/[root-of-the-server]__0e9p7em._.js.map +1 -0
  369. package/web/.next/server/chunks/{[root-of-the-server]__0.2exzi._.js → [root-of-the-server]__0gfvkg8._.js} +2 -2
  370. package/web/.next/server/chunks/{[root-of-the-server]__0ip_e1x._.js → [root-of-the-server]__0hcp97v._.js} +2 -2
  371. package/web/.next/server/chunks/{[root-of-the-server]__09118p2._.js → [root-of-the-server]__0iel39d._.js} +2 -2
  372. package/web/.next/server/chunks/[root-of-the-server]__0kc8ify._.js +12 -0
  373. package/web/.next/server/chunks/[root-of-the-server]__0kc8ify._.js.map +1 -0
  374. package/web/.next/server/chunks/[root-of-the-server]__0r5uk_8._.js +9 -0
  375. package/web/.next/server/chunks/[root-of-the-server]__0r5uk_8._.js.map +1 -0
  376. package/web/.next/server/chunks/[root-of-the-server]__0tb~wwk._.js +1 -1
  377. package/web/.next/server/chunks/{[root-of-the-server]__04jjtl_._.js → [root-of-the-server]__0u1jyv9._.js} +2 -2
  378. package/web/.next/server/chunks/{[root-of-the-server]__07suer1._.js → [root-of-the-server]__0zu_byw._.js} +2 -2
  379. package/web/.next/server/chunks/[root-of-the-server]__13e2_kk._.js +18 -0
  380. package/web/.next/server/chunks/[root-of-the-server]__13e2_kk._.js.map +1 -0
  381. package/web/.next/server/chunks/ssr/0j.8_web_components_common_control-center-drawer_create-drawer-client_tsx_0g70fc5._.js +1 -1
  382. package/web/.next/server/chunks/ssr/0j.8_web_components_common_control-center-drawer_create-drawer-client_tsx_0g70fc5._.js.map +1 -1
  383. package/web/.next/server/chunks/ssr/0j.8_web_components_common_control-center-drawer_feature-drawer-client_tsx_104cna.._.js +2 -2
  384. package/web/.next/server/chunks/ssr/0j.8_web_components_common_control-center-drawer_feature-drawer-client_tsx_104cna.._.js.map +1 -1
  385. package/web/.next/server/chunks/ssr/0ukq_presentation_web_components_features_settings_settings-page-client_tsx_0j1uius._.js +1 -1
  386. package/web/.next/server/chunks/ssr/0ukq_presentation_web_components_features_settings_settings-page-client_tsx_0j1uius._.js.map +1 -1
  387. package/web/.next/server/chunks/ssr/{_01mq~sm._.js → 11es_next_0q-kz~8._.js} +2 -2
  388. package/web/.next/server/chunks/ssr/11es_next_0q-kz~8._.js.map +1 -0
  389. package/web/.next/server/chunks/ssr/11y9_components_common_control-center-drawer_repository-drawer-client_tsx_09z.znp._.js +1 -1
  390. package/web/.next/server/chunks/ssr/11y9_components_common_control-center-drawer_repository-drawer-client_tsx_09z.znp._.js.map +1 -1
  391. package/web/.next/server/chunks/ssr/[root-of-the-server]__02.89uf._.js +4 -0
  392. package/web/.next/server/chunks/ssr/[root-of-the-server]__02.89uf._.js.map +1 -0
  393. package/web/.next/server/chunks/ssr/[root-of-the-server]__04rq9lr._.js +4 -0
  394. package/web/.next/server/chunks/ssr/[root-of-the-server]__04rq9lr._.js.map +1 -0
  395. package/web/.next/server/chunks/ssr/[root-of-the-server]__05_qc0n._.js +4 -0
  396. package/web/.next/server/chunks/ssr/[root-of-the-server]__05_qc0n._.js.map +1 -0
  397. package/web/.next/server/chunks/ssr/[root-of-the-server]__0c0xoi_._.js +3 -0
  398. package/web/.next/server/chunks/ssr/[root-of-the-server]__0c0xoi_._.js.map +1 -0
  399. package/web/.next/server/chunks/ssr/{[root-of-the-server]__0qh.wn.._.js → [root-of-the-server]__0q3-gz.._.js} +2 -2
  400. package/web/.next/server/chunks/ssr/[root-of-the-server]__0r5zhk.._.js +4 -0
  401. package/web/.next/server/chunks/ssr/[root-of-the-server]__0r5zhk.._.js.map +1 -0
  402. package/web/.next/server/chunks/ssr/[root-of-the-server]__0rv1gci._.js +1 -1
  403. package/web/.next/server/chunks/ssr/[root-of-the-server]__0rvrr1j._.js +4 -0
  404. package/web/.next/server/chunks/ssr/[root-of-the-server]__0rvrr1j._.js.map +1 -0
  405. package/web/.next/server/chunks/ssr/[root-of-the-server]__0tq2syh._.js +4 -0
  406. package/web/.next/server/chunks/ssr/[root-of-the-server]__0tq2syh._.js.map +1 -0
  407. package/web/.next/server/chunks/ssr/[root-of-the-server]__0uy_5rw._.js +4 -0
  408. package/web/.next/server/chunks/ssr/[root-of-the-server]__0uy_5rw._.js.map +1 -0
  409. package/web/.next/server/chunks/ssr/[root-of-the-server]__12j29w-._.js +4 -0
  410. package/web/.next/server/chunks/ssr/[root-of-the-server]__12j29w-._.js.map +1 -0
  411. package/web/.next/server/chunks/ssr/_00k65h-._.js.map +1 -1
  412. package/web/.next/server/chunks/ssr/_01sesw0._.js +1 -1
  413. package/web/.next/server/chunks/ssr/_01sesw0._.js.map +1 -1
  414. package/web/.next/server/chunks/ssr/_069y.js._.js +6 -0
  415. package/web/.next/server/chunks/ssr/_069y.js._.js.map +1 -0
  416. package/web/.next/server/chunks/ssr/_0__4si~._.js +4 -0
  417. package/web/.next/server/chunks/ssr/_0__4si~._.js.map +1 -0
  418. package/web/.next/server/chunks/ssr/_0_m17kl._.js +4 -0
  419. package/web/.next/server/chunks/ssr/_0_m17kl._.js.map +1 -0
  420. package/web/.next/server/chunks/ssr/_0d4miu.._.js +4 -0
  421. package/web/.next/server/chunks/ssr/_0d4miu.._.js.map +1 -0
  422. package/web/.next/server/chunks/ssr/_0e8ern9._.js +4 -0
  423. package/web/.next/server/chunks/ssr/_0e8ern9._.js.map +1 -0
  424. package/web/.next/server/chunks/ssr/{_0e4npv~._.js → _0l10ccg._.js} +2 -2
  425. package/web/.next/server/chunks/ssr/_0l10ccg._.js.map +1 -0
  426. package/web/.next/server/chunks/ssr/_0mo6j.n._.js +3 -0
  427. package/web/.next/server/chunks/ssr/_0mo6j.n._.js.map +1 -0
  428. package/web/.next/server/chunks/ssr/{_0nvrqsj._.js → _0mvhe_2._.js} +2 -2
  429. package/web/.next/server/chunks/ssr/{_0nvrqsj._.js.map → _0mvhe_2._.js.map} +1 -1
  430. package/web/.next/server/chunks/ssr/{_109n-y4._.js → _0n.magx._.js} +2 -2
  431. package/web/.next/server/chunks/ssr/_0n.magx._.js.map +1 -0
  432. package/web/.next/server/chunks/ssr/_0p3~u8u._.js +6 -0
  433. package/web/.next/server/chunks/ssr/_0p3~u8u._.js.map +1 -0
  434. package/web/.next/server/chunks/ssr/_0r.3n~3._.js +4 -0
  435. package/web/.next/server/chunks/ssr/_0r.3n~3._.js.map +1 -0
  436. package/web/.next/server/chunks/ssr/_0t59q8r._.js +4 -0
  437. package/web/.next/server/chunks/ssr/_0t59q8r._.js.map +1 -0
  438. package/web/.next/server/chunks/ssr/_0tcccbb._.js +3 -0
  439. package/web/.next/server/chunks/ssr/_0tcccbb._.js.map +1 -0
  440. package/web/.next/server/chunks/ssr/_0vyfc4b._.js +1 -1
  441. package/web/.next/server/chunks/ssr/_0vyfc4b._.js.map +1 -1
  442. package/web/.next/server/chunks/ssr/_0w-_hww._.js +1 -1
  443. package/web/.next/server/chunks/ssr/_0w-_hww._.js.map +1 -1
  444. package/web/.next/server/chunks/ssr/_0zk-h5w._.js +4 -0
  445. package/web/.next/server/chunks/ssr/_0zk-h5w._.js.map +1 -0
  446. package/web/.next/server/chunks/ssr/_0~7lwu_._.js +1 -1
  447. package/web/.next/server/chunks/ssr/_0~7lwu_._.js.map +1 -1
  448. package/web/.next/server/chunks/ssr/_1161g9x._.js +4 -0
  449. package/web/.next/server/chunks/ssr/_1161g9x._.js.map +1 -0
  450. package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_skills_page_actions_05m2q~u.js +3 -0
  451. package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_skills_page_actions_05m2q~u.js.map +1 -0
  452. package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_tools_page_actions_0.6zk.t.js +3 -0
  453. package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_tools_page_actions_0.6zk.t.js.map +1 -0
  454. package/web/.next/server/chunks/ssr/src_presentation_web_app_actions_approve-feature_ts_0pjb_re._.js +3 -0
  455. package/web/.next/server/chunks/ssr/src_presentation_web_app_actions_approve-feature_ts_0pjb_re._.js.map +1 -0
  456. package/web/.next/server/chunks/ssr/src_presentation_web_app_actions_open-ide_ts_0w2wqvu._.js +1 -1
  457. package/web/.next/server/chunks/ssr/src_presentation_web_app_actions_open-ide_ts_0w2wqvu._.js.map +1 -1
  458. package/web/.next/server/chunks/ssr/src_presentation_web_components_features_control-center_0l3oxx9._.js +1 -1
  459. package/web/.next/server/chunks/ssr/src_presentation_web_components_features_control-center_0l3oxx9._.js.map +1 -1
  460. package/web/.next/server/middleware-build-manifest.js +3 -3
  461. package/web/.next/server/pages/500.html +1 -1
  462. package/web/.next/server/server-reference-manifest.js +1 -1
  463. package/web/.next/server/server-reference-manifest.json +127 -109
  464. package/web/.next/static/chunks/{0awttldb-.7m..js → 0.8ue6wwr7ni~.js} +1 -1
  465. package/web/.next/static/chunks/{0d-2jp.f._l2e.js → 028x3z97mchhz.js} +1 -1
  466. package/web/.next/static/chunks/044f5piy5pt5t.js +1 -0
  467. package/web/.next/static/chunks/04~sw.nhpwy6s.css +1 -0
  468. package/web/.next/static/chunks/05enics63g._-.js +7 -0
  469. package/web/.next/static/chunks/0_.x~txb5da7d.js +1 -0
  470. package/web/.next/static/chunks/0_9k2ybutuphq.js +1 -0
  471. package/web/.next/static/chunks/{14g1l3~6i5251.js → 0hti2r43x0~b7.js} +2 -2
  472. package/web/.next/static/chunks/0jo5-_q.1n69j.js +1 -0
  473. package/web/.next/static/chunks/{0t8zwgaz.d1s5.js → 0n3u~4ytndfyd.js} +1 -1
  474. package/web/.next/static/chunks/{0nk2r-18.7g6r.js → 0pyz97q7eg0jz.js} +1 -1
  475. package/web/.next/static/chunks/0qqe9hx_txhso.js +1 -0
  476. package/web/.next/static/chunks/{0ntgq3d_.m5el.js → 0vx7ldqj8436q.js} +2 -2
  477. package/web/.next/static/chunks/11~m1ei9bh269.js +3 -0
  478. package/web/.next/static/chunks/{09dqgshddfxff.js → 13w6ziae82sjy.js} +1 -1
  479. package/web/.next/static/chunks/16.83v.xq8bn9.js +1 -0
  480. package/dist/packages/core/src/infrastructure/services/agents/common/executors/dev-executor.service.d.ts +0 -12
  481. package/dist/packages/core/src/infrastructure/services/agents/common/executors/dev-executor.service.d.ts.map +0 -1
  482. package/dist/packages/core/src/infrastructure/services/agents/common/executors/dev-executor.service.js +0 -233
  483. package/dist/packages/core/src/infrastructure/services/agents/common/executors/fixtures/plan.fixture.d.ts +0 -8
  484. package/dist/packages/core/src/infrastructure/services/agents/common/executors/fixtures/plan.fixture.d.ts.map +0 -1
  485. package/dist/packages/core/src/infrastructure/services/agents/common/executors/fixtures/plan.fixture.js +0 -94
  486. package/dist/packages/core/src/infrastructure/services/agents/common/executors/fixtures/research.fixture.d.ts +0 -8
  487. package/dist/packages/core/src/infrastructure/services/agents/common/executors/fixtures/research.fixture.d.ts.map +0 -1
  488. package/dist/packages/core/src/infrastructure/services/agents/common/executors/fixtures/research.fixture.js +0 -140
  489. package/dist/packages/core/src/infrastructure/services/agents/common/executors/fixtures/spec-analyze.fixture.d.ts +0 -8
  490. package/dist/packages/core/src/infrastructure/services/agents/common/executors/fixtures/spec-analyze.fixture.d.ts.map +0 -1
  491. package/dist/packages/core/src/infrastructure/services/agents/common/executors/fixtures/spec-analyze.fixture.js +0 -81
  492. package/dist/packages/core/src/infrastructure/services/agents/common/executors/fixtures/spec-requirements.fixture.d.ts +0 -8
  493. package/dist/packages/core/src/infrastructure/services/agents/common/executors/fixtures/spec-requirements.fixture.d.ts.map +0 -1
  494. package/dist/packages/core/src/infrastructure/services/agents/common/executors/fixtures/spec-requirements.fixture.js +0 -131
  495. package/dist/packages/core/src/infrastructure/services/agents/common/executors/fixtures/tasks.fixture.d.ts +0 -6
  496. package/dist/packages/core/src/infrastructure/services/agents/common/executors/fixtures/tasks.fixture.d.ts.map +0 -1
  497. package/dist/packages/core/src/infrastructure/services/agents/common/executors/fixtures/tasks.fixture.js +0 -146
  498. package/web/.next/server/chunks/[root-of-the-server]__0-3b27b._.js +0 -9
  499. package/web/.next/server/chunks/[root-of-the-server]__0-3b27b._.js.map +0 -1
  500. package/web/.next/server/chunks/[root-of-the-server]__0_6fhza._.js +0 -9
  501. package/web/.next/server/chunks/[root-of-the-server]__0esdmru._.js +0 -12
  502. package/web/.next/server/chunks/[root-of-the-server]__0esdmru._.js.map +0 -1
  503. package/web/.next/server/chunks/[root-of-the-server]__0l1p8bx._.js +0 -3
  504. package/web/.next/server/chunks/[root-of-the-server]__0l1p8bx._.js.map +0 -1
  505. package/web/.next/server/chunks/[root-of-the-server]__0p~owgt._.js +0 -18
  506. package/web/.next/server/chunks/[root-of-the-server]__0p~owgt._.js.map +0 -1
  507. package/web/.next/server/chunks/[root-of-the-server]__0rru~m.._.js +0 -3
  508. package/web/.next/server/chunks/[root-of-the-server]__0rru~m.._.js.map +0 -1
  509. package/web/.next/server/chunks/ssr/0j.8_web__next-internal_server_app_(dashboard)_@drawer_adopt_page_actions_00~eq5i.js +0 -3
  510. package/web/.next/server/chunks/ssr/0j.8_web__next-internal_server_app_(dashboard)_@drawer_adopt_page_actions_00~eq5i.js.map +0 -1
  511. package/web/.next/server/chunks/ssr/0j.8_web__next-internal_server_app_(dashboard)_@drawer_chat_page_actions_0979_c..js +0 -3
  512. package/web/.next/server/chunks/ssr/0j.8_web__next-internal_server_app_(dashboard)_@drawer_chat_page_actions_0979_c..js.map +0 -1
  513. package/web/.next/server/chunks/ssr/0j.8_web__next-internal_server_app_(dashboard)_chat_page_actions_0dqll_1.js +0 -3
  514. package/web/.next/server/chunks/ssr/0j.8_web__next-internal_server_app_(dashboard)_chat_page_actions_0dqll_1.js.map +0 -1
  515. package/web/.next/server/chunks/ssr/[root-of-the-server]__045sv4b._.js +0 -3
  516. package/web/.next/server/chunks/ssr/[root-of-the-server]__045sv4b._.js.map +0 -1
  517. package/web/.next/server/chunks/ssr/[root-of-the-server]__0d_0_fp._.js +0 -3
  518. package/web/.next/server/chunks/ssr/[root-of-the-server]__0d_0_fp._.js.map +0 -1
  519. package/web/.next/server/chunks/ssr/[root-of-the-server]__0l4d7e.._.js +0 -3
  520. package/web/.next/server/chunks/ssr/[root-of-the-server]__0l4d7e.._.js.map +0 -1
  521. package/web/.next/server/chunks/ssr/[root-of-the-server]__0o3qggc._.js +0 -3
  522. package/web/.next/server/chunks/ssr/[root-of-the-server]__0o3qggc._.js.map +0 -1
  523. package/web/.next/server/chunks/ssr/[root-of-the-server]__0r32z03._.js +0 -3
  524. package/web/.next/server/chunks/ssr/[root-of-the-server]__0r32z03._.js.map +0 -1
  525. package/web/.next/server/chunks/ssr/[root-of-the-server]__12g8h3_._.js +0 -4
  526. package/web/.next/server/chunks/ssr/[root-of-the-server]__12g8h3_._.js.map +0 -1
  527. package/web/.next/server/chunks/ssr/_0.rsra~._.js +0 -3
  528. package/web/.next/server/chunks/ssr/_0.rsra~._.js.map +0 -1
  529. package/web/.next/server/chunks/ssr/_01mq~sm._.js.map +0 -1
  530. package/web/.next/server/chunks/ssr/_0a-ddx-._.js +0 -3
  531. package/web/.next/server/chunks/ssr/_0a-ddx-._.js.map +0 -1
  532. package/web/.next/server/chunks/ssr/_0e4npv~._.js.map +0 -1
  533. package/web/.next/server/chunks/ssr/_0jpbsh_._.js +0 -4
  534. package/web/.next/server/chunks/ssr/_0jpbsh_._.js.map +0 -1
  535. package/web/.next/server/chunks/ssr/_109n-y4._.js.map +0 -1
  536. package/web/.next/server/chunks/ssr/src_presentation_web_0.e4~xc._.js +0 -3
  537. package/web/.next/server/chunks/ssr/src_presentation_web_0.e4~xc._.js.map +0 -1
  538. package/web/.next/server/chunks/ssr/src_presentation_web_00dvh.m._.js +0 -3
  539. package/web/.next/server/chunks/ssr/src_presentation_web_00dvh.m._.js.map +0 -1
  540. package/web/.next/server/chunks/ssr/src_presentation_web_06b6~lt._.js +0 -5
  541. package/web/.next/server/chunks/ssr/src_presentation_web_06b6~lt._.js.map +0 -1
  542. package/web/.next/server/chunks/ssr/src_presentation_web_08fy2mf._.js +0 -3
  543. package/web/.next/server/chunks/ssr/src_presentation_web_08fy2mf._.js.map +0 -1
  544. package/web/.next/server/chunks/ssr/src_presentation_web_0f~udu1._.js +0 -3
  545. package/web/.next/server/chunks/ssr/src_presentation_web_0f~udu1._.js.map +0 -1
  546. package/web/.next/server/chunks/ssr/src_presentation_web_0qys821._.js +0 -5
  547. package/web/.next/server/chunks/ssr/src_presentation_web_0qys821._.js.map +0 -1
  548. package/web/.next/server/chunks/ssr/src_presentation_web_0q~dt0o._.js +0 -3
  549. package/web/.next/server/chunks/ssr/src_presentation_web_0q~dt0o._.js.map +0 -1
  550. package/web/.next/server/chunks/ssr/src_presentation_web_11jrkxt._.js +0 -3
  551. package/web/.next/server/chunks/ssr/src_presentation_web_11jrkxt._.js.map +0 -1
  552. package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_(dashboard)_page_actions_1199d3x.js +0 -3
  553. package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_(dashboard)_page_actions_1199d3x.js.map +0 -1
  554. package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app__not-found_page_actions_0m2jqxx.js +0 -3
  555. package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app__not-found_page_actions_0m2jqxx.js.map +0 -1
  556. package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_version_page_actions_0krkh_0.js +0 -3
  557. package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_version_page_actions_0krkh_0.js.map +0 -1
  558. package/web/.next/server/chunks/ssr/src_presentation_web_app_actions_load-settings_ts_0b8f3pf._.js +0 -3
  559. package/web/.next/server/chunks/ssr/src_presentation_web_app_actions_load-settings_ts_0b8f3pf._.js.map +0 -1
  560. package/web/.next/static/chunks/00dg6gti40.3i.js +0 -1
  561. package/web/.next/static/chunks/0_--5mgqukm__.js +0 -1
  562. package/web/.next/static/chunks/0_c5~n__lz4ks.js +0 -1
  563. package/web/.next/static/chunks/0ist7260j__0m.js +0 -3
  564. package/web/.next/static/chunks/0j_0i2qsrwh-c.js +0 -1
  565. package/web/.next/static/chunks/0njrgvmyafrod.js +0 -1
  566. package/web/.next/static/chunks/0r5dju6f1-i38.css +0 -1
  567. package/web/.next/static/chunks/0t.pzrmeoq6th.js +0 -7
  568. /package/web/.next/server/chunks/{[root-of-the-server]__02xmnal._.js.map → [root-of-the-server]__08cpfre._.js.map} +0 -0
  569. /package/web/.next/server/chunks/{[root-of-the-server]__0.2exzi._.js.map → [root-of-the-server]__0gfvkg8._.js.map} +0 -0
  570. /package/web/.next/server/chunks/{[root-of-the-server]__0ip_e1x._.js.map → [root-of-the-server]__0hcp97v._.js.map} +0 -0
  571. /package/web/.next/server/chunks/{[root-of-the-server]__09118p2._.js.map → [root-of-the-server]__0iel39d._.js.map} +0 -0
  572. /package/web/.next/server/chunks/{[root-of-the-server]__04jjtl_._.js.map → [root-of-the-server]__0u1jyv9._.js.map} +0 -0
  573. /package/web/.next/server/chunks/{[root-of-the-server]__07suer1._.js.map → [root-of-the-server]__0zu_byw._.js.map} +0 -0
  574. /package/web/.next/server/chunks/ssr/{[root-of-the-server]__0qh.wn.._.js.map → [root-of-the-server]__0q3-gz.._.js.map} +0 -0
  575. /package/web/.next/static/{ZpPnD_b687G9xVr2nzrds → ksBer6au8b_fS1_7dCF2D}/_buildManifest.js +0 -0
  576. /package/web/.next/static/{ZpPnD_b687G9xVr2nzrds → ksBer6au8b_fS1_7dCF2D}/_clientMiddlewareManifest.js +0 -0
  577. /package/web/.next/static/{ZpPnD_b687G9xVr2nzrds → ksBer6au8b_fS1_7dCF2D}/_ssgManifest.js +0 -0
@@ -0,0 +1,181 @@
1
+ 'use server';
2
+ import { resolve } from '../../lib/server-container.js';
3
+ import { updateSettings as updateSettingsSingleton } from '../../../../../packages/core/src/infrastructure/services/settings.service.js';
4
+ import { revalidatePath } from 'next/cache';
5
+ import { AgentType, ClaudeCodePermissionMode, CursorPermissionMode, GeminiPermissionMode, CodexPermissionMode, CopilotPermissionMode, RovoDevPermissionMode, } from '../../../../../packages/core/src/domain/generated/output.js';
6
+ const VALID_MODES = {
7
+ [AgentType.ClaudeCode]: [
8
+ {
9
+ value: ClaudeCodePermissionMode.BypassPermissions,
10
+ label: 'Bypass permissions',
11
+ description: 'Skip all permission checks. Fastest for batch runs.',
12
+ batchSafe: true,
13
+ },
14
+ {
15
+ value: ClaudeCodePermissionMode.AcceptEdits,
16
+ label: 'Accept edits',
17
+ description: 'Auto-approve file edits; prompt for shell/network.',
18
+ batchSafe: false,
19
+ },
20
+ {
21
+ value: ClaudeCodePermissionMode.Plan,
22
+ label: 'Plan',
23
+ description: 'Read-only; proposes changes without acting.',
24
+ batchSafe: false,
25
+ },
26
+ {
27
+ value: ClaudeCodePermissionMode.Default,
28
+ label: 'Default',
29
+ description: 'Prompt for everything except reads.',
30
+ batchSafe: false,
31
+ },
32
+ ],
33
+ [AgentType.Cursor]: [
34
+ {
35
+ value: CursorPermissionMode.Yolo,
36
+ label: 'Yolo',
37
+ description: 'Write files and execute commands autonomously.',
38
+ batchSafe: true,
39
+ },
40
+ {
41
+ value: CursorPermissionMode.Propose,
42
+ label: 'Propose',
43
+ description: 'Read and analyze; output a diff without writing.',
44
+ batchSafe: true,
45
+ },
46
+ ],
47
+ [AgentType.GeminiCli]: [
48
+ {
49
+ value: GeminiPermissionMode.Yolo,
50
+ label: 'Yolo',
51
+ description: 'Auto-approve all tool calls.',
52
+ batchSafe: true,
53
+ },
54
+ {
55
+ value: GeminiPermissionMode.AutoEdit,
56
+ label: 'Auto-edit',
57
+ description: 'Auto-approve edits; prompt for shell.',
58
+ batchSafe: false,
59
+ },
60
+ {
61
+ value: GeminiPermissionMode.Default,
62
+ label: 'Default',
63
+ description: 'Prompt for every tool call.',
64
+ batchSafe: false,
65
+ },
66
+ ],
67
+ [AgentType.CodexCli]: [
68
+ {
69
+ value: CodexPermissionMode.DangerFullAccess,
70
+ label: 'Full access',
71
+ description: 'No sandbox. Unrestricted access.',
72
+ batchSafe: true,
73
+ },
74
+ {
75
+ value: CodexPermissionMode.WorkspaceWrite,
76
+ label: 'Workspace write',
77
+ description: 'Writes inside worktree, no network.',
78
+ batchSafe: true,
79
+ },
80
+ {
81
+ value: CodexPermissionMode.ReadOnly,
82
+ label: 'Read only',
83
+ description: 'Cannot modify anything.',
84
+ batchSafe: true,
85
+ },
86
+ ],
87
+ [AgentType.CopilotCli]: [
88
+ {
89
+ value: CopilotPermissionMode.Yolo,
90
+ label: 'Yolo',
91
+ description: 'Disable all permission prompts.',
92
+ batchSafe: true,
93
+ },
94
+ {
95
+ value: CopilotPermissionMode.AllowPaths,
96
+ label: 'Allow paths',
97
+ description: 'Filesystem access auto-approved; shell prompts.',
98
+ batchSafe: false,
99
+ },
100
+ {
101
+ value: CopilotPermissionMode.Prompt,
102
+ label: 'Prompt',
103
+ description: 'Built-in tool category defaults.',
104
+ batchSafe: false,
105
+ },
106
+ ],
107
+ [AgentType.RovoDev]: [
108
+ {
109
+ value: RovoDevPermissionMode.Yolo,
110
+ label: 'Yolo',
111
+ description: 'Bypass all prompts.',
112
+ batchSafe: true,
113
+ },
114
+ {
115
+ value: RovoDevPermissionMode.Shadow,
116
+ label: 'Shadow',
117
+ description: 'Temporary workspace clone. Experimental.',
118
+ batchSafe: false,
119
+ },
120
+ {
121
+ value: RovoDevPermissionMode.Config,
122
+ label: 'Config',
123
+ description: 'Respect ~/.rovodev/config.yml settings.',
124
+ batchSafe: false,
125
+ },
126
+ ],
127
+ };
128
+ /** Agent type to AgentPermissionSettings key mapping */
129
+ const AGENT_TYPE_TO_PERMISSION_KEY = {
130
+ [AgentType.ClaudeCode]: 'claudeCode',
131
+ [AgentType.Cursor]: 'cursor',
132
+ [AgentType.GeminiCli]: 'geminiCli',
133
+ [AgentType.CodexCli]: 'codexCli',
134
+ [AgentType.CopilotCli]: 'copilotCli',
135
+ [AgentType.RovoDev]: 'rovoDev',
136
+ };
137
+ export async function getAgentPermissionOptions(agentType) {
138
+ return VALID_MODES[agentType] ?? [];
139
+ }
140
+ export async function getCurrentAgentPermissionMode(agentType) {
141
+ const loadUseCase = resolve('LoadSettingsUseCase');
142
+ const settings = await loadUseCase.execute();
143
+ const key = AGENT_TYPE_TO_PERMISSION_KEY[agentType];
144
+ if (!key)
145
+ return undefined;
146
+ return settings.agent?.permissions?.[key];
147
+ }
148
+ export async function setAgentPermissionMode(agentType, mode) {
149
+ try {
150
+ const key = AGENT_TYPE_TO_PERMISSION_KEY[agentType];
151
+ if (!key) {
152
+ return { success: false, error: `Unsupported agent type: ${agentType}` };
153
+ }
154
+ const modes = VALID_MODES[agentType];
155
+ if (!modes?.some((m) => m.value === mode)) {
156
+ return { success: false, error: `Invalid permission mode: ${mode}` };
157
+ }
158
+ const loadUseCase = resolve('LoadSettingsUseCase');
159
+ const current = await loadUseCase.execute();
160
+ const updatedSettings = {
161
+ ...current,
162
+ agent: {
163
+ ...current.agent,
164
+ permissions: {
165
+ ...current.agent?.permissions,
166
+ [key]: mode,
167
+ },
168
+ },
169
+ updatedAt: new Date(),
170
+ };
171
+ const updateUseCase = resolve('UpdateSettingsUseCase');
172
+ await updateUseCase.execute(updatedSettings);
173
+ updateSettingsSingleton(updatedSettings);
174
+ revalidatePath('/', 'layout');
175
+ return { success: true };
176
+ }
177
+ catch (error) {
178
+ const message = error instanceof Error ? error.message : 'Failed to update permission mode';
179
+ return { success: false, error: message };
180
+ }
181
+ }
@@ -1 +1 @@
1
- {"version":3,"file":"check-agent-auth.d.ts","sourceRoot":"","sources":["../../../../../../src/presentation/web/app/actions/check-agent-auth.ts"],"names":[],"mappings":"AAWA,MAAM,WAAW,eAAe;IAC9B,SAAS,EAAE,MAAM,CAAC;IAClB,+CAA+C;IAC/C,SAAS,EAAE,OAAO,CAAC;IACnB,8CAA8C;IAC9C,aAAa,EAAE,OAAO,CAAC;IACvB,yCAAyC;IACzC,KAAK,EAAE,MAAM,CAAC;IACd,gDAAgD;IAChD,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,0FAA0F;IAC1F,cAAc,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,wDAAwD;IACxD,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;CAC5B;AA+ID;;;GAGG;AACH,wBAAsB,cAAc,IAAI,OAAO,CAAC,eAAe,CAAC,CA4H/D"}
1
+ {"version":3,"file":"check-agent-auth.d.ts","sourceRoot":"","sources":["../../../../../../src/presentation/web/app/actions/check-agent-auth.ts"],"names":[],"mappings":"AAWA,MAAM,WAAW,eAAe;IAC9B,SAAS,EAAE,MAAM,CAAC;IAClB,+CAA+C;IAC/C,SAAS,EAAE,OAAO,CAAC;IACnB,8CAA8C;IAC9C,aAAa,EAAE,OAAO,CAAC;IACvB,yCAAyC;IACzC,KAAK,EAAE,MAAM,CAAC;IACd,gDAAgD;IAChD,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,0FAA0F;IAC1F,cAAc,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,wDAAwD;IACxD,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;CAC5B;AA4ID;;;GAGG;AACH,wBAAsB,cAAc,IAAI,OAAO,CAAC,eAAe,CAAC,CA4H/D"}
@@ -12,9 +12,6 @@ const AGENT_LABELS = {
12
12
  cursor: 'Cursor CLI',
13
13
  'gemini-cli': 'Gemini CLI',
14
14
  'rovo-dev': 'Rovo Dev CLI',
15
- aider: 'Aider',
16
- continue: 'Continue',
17
- dev: 'Demo',
18
15
  };
19
16
  const AGENT_TOOL_MAP = {
20
17
  'claude-code': 'claude-code',
@@ -92,7 +89,7 @@ function tier1AuthCheck(agentType) {
92
89
  return existsSync(acliDir) ? 'file' : false;
93
90
  }
94
91
  default:
95
- // dev, aider, continue — assume no auth needed
92
+ // Unknown agents — assume no auth needed
96
93
  return 'env-var';
97
94
  }
98
95
  }
@@ -169,7 +166,7 @@ export async function checkAgentAuth() {
169
166
  const label = AGENT_LABELS[agentType] ?? agentType;
170
167
  const toolId = AGENT_TOOL_MAP[agentType] ?? null;
171
168
  const binaryName = AGENT_BINARY_MAP[agentType] ?? null;
172
- // Dev/demo agents — always good
169
+ // Agents without a tool mapping — always good
173
170
  if (!toolId) {
174
171
  return {
175
172
  agentType,
@@ -22,7 +22,7 @@ const AGENT_BINARY_MAP = {
22
22
  export async function checkAgentTool(agentType) {
23
23
  const toolId = AGENT_TOOL_MAP[agentType] ?? null;
24
24
  const binaryName = AGENT_BINARY_MAP[agentType] ?? null;
25
- // Dev agent and unknown agents don't need a tool
25
+ // Agents without a tool mapping don't need a tool check
26
26
  if (!toolId) {
27
27
  return { agentType, toolId: null, tool: null, installed: true, binaryName: null };
28
28
  }
@@ -1 +1 @@
1
- {"version":3,"file":"deploy-repository.d.ts","sourceRoot":"","sources":["../../../../../../src/presentation/web/app/actions/deploy-repository.ts"],"names":[],"mappings":"AAOA,OAAO,EAAE,eAAe,EAAE,MAAM,yCAAyC,CAAC;AAK1E,wBAAsB,gBAAgB,CACpC,cAAc,EAAE,MAAM,GACrB,OAAO,CAAC;IAAE,OAAO,EAAE,OAAO,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,eAAe,CAAA;CAAE,CAAC,CAiCxE"}
1
+ {"version":3,"file":"deploy-repository.d.ts","sourceRoot":"","sources":["../../../../../../src/presentation/web/app/actions/deploy-repository.ts"],"names":[],"mappings":"AAOA,OAAO,EAAE,eAAe,EAAE,MAAM,yCAAyC,CAAC;AAK1E,wBAAsB,gBAAgB,CACpC,cAAc,EAAE,MAAM,GACrB,OAAO,CAAC;IAAE,OAAO,EAAE,OAAO,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,eAAe,CAAA;CAAE,CAAC,CAuCxE"}
@@ -1,5 +1,5 @@
1
1
  'use server';
2
- import { existsSync } from 'node:fs';
2
+ import { realpathSync } from 'node:fs';
3
3
  import { isAbsolute } from 'node:path';
4
4
  import { resolve } from '../../lib/server-container.js';
5
5
  import { createDeploymentLogger } from '../../lib/core-utils.js';
@@ -12,12 +12,19 @@ export async function deployRepository(repositoryPath) {
12
12
  log.warn('rejected — not an absolute path');
13
13
  return { success: false, error: 'repositoryPath must be an absolute path' };
14
14
  }
15
+ // Resolve through realpath() up-front. Every subsequent use references
16
+ // the symlink-resolved absolute path, not the raw user input. This is the
17
+ // sanitizer CodeQL's js/path-injection analysis recognizes.
18
+ let resolvedPath;
15
19
  try {
16
- if (!existsSync(repositoryPath)) {
17
- log.warn(`directory does not exist: "${repositoryPath}"`);
18
- return { success: false, error: `Directory does not exist: ${repositoryPath}` };
19
- }
20
- if (isSameShipitAiInstance(repositoryPath)) {
20
+ resolvedPath = realpathSync(repositoryPath);
21
+ }
22
+ catch {
23
+ log.warn(`directory does not exist: "${repositoryPath}"`);
24
+ return { success: false, error: 'Directory does not exist' };
25
+ }
26
+ try {
27
+ if (isSameShipitAiInstance(resolvedPath)) {
21
28
  log.warn('rejected — target is the running ShipIT instance');
22
29
  return {
23
30
  success: false,
@@ -26,7 +33,7 @@ export async function deployRepository(repositoryPath) {
26
33
  }
27
34
  log.info('directory exists, calling deploymentService.start()');
28
35
  const deploymentService = resolve('IDeploymentService');
29
- deploymentService.start(repositoryPath, repositoryPath, 'repository');
36
+ deploymentService.start(resolvedPath, resolvedPath, 'repository');
30
37
  log.info('start() returned successfully — state=Booting');
31
38
  return { success: true, state: DeploymentState.Booting };
32
39
  }
@@ -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":"AAOA,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;IACpB,SAAS,EAAE,OAAO,CAAC;CACpB;AAoCD,wBAAsB,iBAAiB,IAAI,OAAO,CAAC,eAAe,EAAE,CAAC,CAmDpE"}
1
+ {"version":3,"file":"get-all-agent-models.d.ts","sourceRoot":"","sources":["../../../../../../src/presentation/web/app/actions/get-all-agent-models.ts"],"names":[],"mappings":"AAOA,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;IACpB,SAAS,EAAE,OAAO,CAAC;CACpB;AAkCD,wBAAsB,iBAAiB,IAAI,OAAO,CAAC,eAAe,EAAE,CAAC,CAsCpE"}
@@ -8,9 +8,8 @@ const AGENT_LABELS = {
8
8
  cursor: 'Cursor CLI',
9
9
  'gemini-cli': 'Gemini CLI',
10
10
  'rovo-dev': 'Rovo Dev CLI',
11
- dev: 'Demo',
12
11
  };
13
- /** Sort weight — higher = further down. Demo always last. */
12
+ /** Sort weight — lower = further up in the list. */
14
13
  const AGENT_ORDER = {
15
14
  'claude-code': 0,
16
15
  'codex-cli': 1,
@@ -18,7 +17,6 @@ const AGENT_ORDER = {
18
17
  cursor: 3,
19
18
  'gemini-cli': 4,
20
19
  'rovo-dev': 5,
21
- dev: 99,
22
20
  };
23
21
  /**
24
22
  * Maps agent types to their corresponding tool IDs for availability checks.
@@ -45,25 +43,12 @@ export async function getAllAgentModels() {
45
43
  ...getModelMeta(id),
46
44
  })),
47
45
  }))
48
- .map((g) => {
49
- // Dev agent gets fun demo models
50
- if (g.agentType === 'dev' && g.models.length === 0) {
51
- return {
52
- ...g,
53
- models: [
54
- { id: 'gpt-8', ...getModelMeta('gpt-8') },
55
- { id: 'opus-7', ...getModelMeta('opus-7') },
56
- ],
57
- };
58
- }
59
- return g;
60
- })
61
46
  .filter((g) => g.models.length > 0);
62
47
  // Check which agents are actually installed
63
48
  const toolService = resolve('IToolInstallerService');
64
49
  const groupsWithStatus = await Promise.all(groups.map(async (group) => {
65
50
  const toolId = AGENT_TOOL_IDS[group.agentType];
66
- if (!toolId || group.agentType === 'dev') {
51
+ if (!toolId) {
67
52
  return { ...group, installed: true };
68
53
  }
69
54
  try {
@@ -1 +1 @@
1
- {"version":3,"file":"get-merge-review-data.d.ts","sourceRoot":"","sources":["../../../../../../src/presentation/web/app/actions/get-merge-review-data.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EACV,eAAe,EAEhB,MAAM,sDAAsD,CAAC;AAI9D,KAAK,wBAAwB,GAAG,eAAe,GAAG;IAAE,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC;AAqCpE,wBAAsB,kBAAkB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,wBAAwB,CAAC,CA4G7F"}
1
+ {"version":3,"file":"get-merge-review-data.d.ts","sourceRoot":"","sources":["../../../../../../src/presentation/web/app/actions/get-merge-review-data.ts"],"names":[],"mappings":"AASA,OAAO,KAAK,EACV,eAAe,EAEhB,MAAM,sDAAsD,CAAC;AAI9D,KAAK,wBAAwB,GAAG,eAAe,GAAG;IAAE,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC;AAwDpE,wBAAsB,kBAAkB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,wBAAwB,CAAC,CAwI7F"}
@@ -1,12 +1,17 @@
1
1
  'use server';
2
2
  import { createHash } from 'node:crypto';
3
- import { readFileSync, existsSync } from 'node:fs';
3
+ import { readFileSync } from 'node:fs';
4
4
  import { basename, join, dirname } from 'node:path';
5
5
  import { resolve } from '../../lib/server-container.js';
6
+ import { realpathOrNull, isWithinRoot } from '../../lib/path-sanitizers.js';
6
7
  import { computeWorktreePath, getShipitAiHomeDir } from '../../lib/core-utils.js';
7
8
  /**
8
9
  * Compute the ShipIT evidence directory for a given repository and feature.
9
10
  * Path: ~/.shipit-ai/repos/<sha256-hash-prefix>/evidence/<featureId>/
11
+ *
12
+ * The sha256 hash of the repository path makes the resulting directory name
13
+ * deterministic and hex-only, neutralizing any path-injection risk from the
14
+ * repositoryPath input. The featureId is a UUID from the DB lookup.
10
15
  */
11
16
  function computeEvidenceDir(repositoryPath, featureId) {
12
17
  const repoHash = createHash('sha256').update(repositoryPath).digest('hex').slice(0, 16);
@@ -19,21 +24,34 @@ function computeEvidenceDir(repositoryPath, featureId) {
19
24
  * deleted so those paths no longer resolve. The evidence files were also saved
20
25
  * to the ShipIT evidence dir with the same filename, so we map relative paths
21
26
  * to absolute paths there.
27
+ *
28
+ * IMPORTANT: the returned paths must remain in the SAME form as the
29
+ * `/api/evidence` route expects (it uses `path.resolve` + `.startsWith`
30
+ * against the unresolved `SHIPIT_AI_HOME/repos` root). Do not pass
31
+ * realpath-resolved paths here, because on macOS `SHIPIT_AI_HOME=/tmp/...`
32
+ * resolves to `/private/tmp/...` and the evidence route's prefix check
33
+ * would reject the realpath'd form. Basename-only containment (strip any
34
+ * directory traversal via `basename()` then `join()` with the known-safe
35
+ * `evidenceDir`) is sufficient sanitization for this taint source because
36
+ * `basename()` cannot return a path-traversal string.
22
37
  */
23
38
  function normalizeEvidencePaths(evidence, evidenceDir) {
24
39
  return evidence.map((e) => {
40
+ // If the manifest path is absolute and already present on disk, keep
41
+ // it verbatim — this preserves the original reference and matches the
42
+ // pre-fix behavior for already-migrated evidence. We do NOT realpath
43
+ // the result because the evidence route does not realpath its input,
44
+ // and mismatching normalization forms would cause 404s.
25
45
  if (e.relativePath.startsWith('/')) {
26
- // Already absolute — check if the file exists; if not, try the evidence dir
27
- if (existsSync(e.relativePath))
28
- return e;
29
- const fallback = join(evidenceDir, basename(e.relativePath)).replace(/\\/g, '/');
30
- if (existsSync(fallback))
31
- return { ...e, relativePath: fallback };
32
46
  return e;
33
47
  }
34
- // Relative path — resolve to evidence dir using the filename
35
- const absolutePath = join(evidenceDir, basename(e.relativePath)).replace(/\\/g, '/');
36
- return { ...e, relativePath: absolutePath };
48
+ // Relative path — map to evidenceDir using basename() only. `basename`
49
+ // strips any directory components including `..` sequences, so the
50
+ // joined result is guaranteed to live directly inside evidenceDir
51
+ // regardless of what the manifest file contained.
52
+ const safeName = basename(e.relativePath);
53
+ const target = join(evidenceDir, safeName).replace(/\\/g, '/');
54
+ return { ...e, relativePath: target };
37
55
  });
38
56
  }
39
57
  export async function getMergeReviewData(featureId) {
@@ -88,19 +106,45 @@ export async function getMergeReviewData(featureId) {
88
106
  : null;
89
107
  if (evidenceDir) {
90
108
  try {
91
- const manifestPath = join(evidenceDir, 'manifest.json');
92
- if (existsSync(manifestPath)) {
93
- const raw = JSON.parse(readFileSync(manifestPath, 'utf-8'));
94
- const normalized = normalizeEvidencePaths(raw, evidenceDir);
95
- // Deduplicate: same type + relativePath means the same evidence entry
96
- const seen = new Set();
97
- evidence = normalized.filter((e) => {
98
- const key = `${e.type}:${e.relativePath}`;
99
- if (seen.has(key))
100
- return false;
101
- seen.add(key);
102
- return true;
103
- });
109
+ // SECURITY: validate the manifest we're about to read lives inside
110
+ // SHIPIT_AI_HOME. computeEvidenceDir() already hashes repositoryPath
111
+ // to a hex directory name, but we still run a realpath containment
112
+ // check because CodeQL's js/path-injection analysis recognizes the
113
+ // realpathOrNull + isWithinRoot pair as a sanitizer chain.
114
+ //
115
+ // Resolve-once semantics: realpath the shipit home dir and the
116
+ // evidence dir exactly once each, then reuse those resolved values
117
+ // for every subsequent containment check. This avoids both the
118
+ // extra syscalls and the TOCTOU window that a recursive resolve-
119
+ // and-check helper would introduce.
120
+ //
121
+ // IMPORTANT: the resolved paths are used ONLY for the read-time
122
+ // security check. The unresolved `evidenceDir` is what we pass to
123
+ // normalizeEvidencePaths so the paths returned to the client match
124
+ // what the /api/evidence route expects — see the comment on
125
+ // normalizeEvidencePaths for the full rationale.
126
+ const resolvedHome = realpathOrNull(getShipitAiHomeDir());
127
+ const resolvedEvidenceDir = realpathOrNull(evidenceDir);
128
+ if (resolvedHome &&
129
+ resolvedEvidenceDir &&
130
+ isWithinRoot(resolvedEvidenceDir, resolvedHome)) {
131
+ const resolvedManifest = realpathOrNull(join(resolvedEvidenceDir, 'manifest.json'));
132
+ if (resolvedManifest && isWithinRoot(resolvedManifest, resolvedEvidenceDir)) {
133
+ // codeql[js/path-injection] -- resolvedManifest validated by realpathOrNull + isWithinRoot(resolvedManifest, resolvedEvidenceDir) on line 159; featureId flows through SHA-256 hash in computeEvidenceDir
134
+ const raw = JSON.parse(readFileSync(resolvedManifest, 'utf-8'));
135
+ // Pass the UNRESOLVED evidenceDir so returned paths share the
136
+ // same root form the evidence route's prefix check expects.
137
+ const normalized = normalizeEvidencePaths(raw, evidenceDir);
138
+ // Deduplicate: same type + relativePath means the same evidence entry
139
+ const seen = new Set();
140
+ evidence = normalized.filter((e) => {
141
+ const key = `${e.type}:${e.relativePath}`;
142
+ if (seen.has(key))
143
+ return false;
144
+ seen.add(key);
145
+ return true;
146
+ });
147
+ }
104
148
  }
105
149
  }
106
150
  catch {
@@ -1 +1 @@
1
- {"version":3,"file":"open-folder.d.ts","sourceRoot":"","sources":["../../../../../../src/presentation/web/app/actions/open-folder.ts"],"names":[],"mappings":"AAiBA,wBAAsB,UAAU,CAC9B,cAAc,EAAE,MAAM,GACrB,OAAO,CAAC;IAAE,OAAO,EAAE,OAAO,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,CAkC9D"}
1
+ {"version":3,"file":"open-folder.d.ts","sourceRoot":"","sources":["../../../../../../src/presentation/web/app/actions/open-folder.ts"],"names":[],"mappings":"AAiBA,wBAAsB,UAAU,CAC9B,cAAc,EAAE,MAAM,GACrB,OAAO,CAAC;IAAE,OAAO,EAAE,OAAO,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,CAyC9D"}
@@ -1,5 +1,5 @@
1
1
  'use server';
2
- import { existsSync } from 'node:fs';
2
+ import { realpathSync } from 'node:fs';
3
3
  import { platform } from 'node:os';
4
4
  import { isAbsolute, normalize } from 'node:path';
5
5
  import { spawn } from 'node:child_process';
@@ -17,7 +17,15 @@ export async function openFolder(repositoryPath) {
17
17
  return { success: false, error: 'repositoryPath must be an absolute path' };
18
18
  }
19
19
  try {
20
- if (!existsSync(repositoryPath)) {
20
+ // Resolve through realpath() up-front. All subsequent uses of the path
21
+ // reference this symlink-resolved absolute value, not the raw user input.
22
+ // This eliminates path-injection via symlinks and is the sanitizer that
23
+ // CodeQL's js/path-injection analysis recognizes.
24
+ let resolvedPath;
25
+ try {
26
+ resolvedPath = realpathSync(repositoryPath);
27
+ }
28
+ catch {
21
29
  return { success: false, error: 'Directory not found' };
22
30
  }
23
31
  const entry = FOLDER_COMMANDS[platform()];
@@ -29,14 +37,14 @@ export async function openFolder(repositoryPath) {
29
37
  }
30
38
  // Normalize to platform-native separators — explorer.exe on Windows
31
39
  // does not understand forward-slash paths and falls back to Documents.
32
- const nativePath = normalize(repositoryPath);
40
+ const nativePath = normalize(resolvedPath);
33
41
  const child = spawn(entry.cmd, entry.args(nativePath), {
34
42
  detached: true,
35
43
  stdio: 'ignore',
36
44
  });
37
45
  child.on('error', () => undefined); // Prevent uncaught exception on spawn failure
38
46
  child.unref();
39
- return { success: true, path: repositoryPath };
47
+ return { success: true, path: resolvedPath };
40
48
  }
41
49
  catch (error) {
42
50
  const message = error instanceof Error ? error.message : 'Failed to open folder';
@@ -1 +1 @@
1
- {"version":3,"file":"open-shell.d.ts","sourceRoot":"","sources":["../../../../../../src/presentation/web/app/actions/open-shell.ts"],"names":[],"mappings":"AA0BA,UAAU,cAAc;IACtB,cAAc,EAAE,MAAM,CAAC;IACvB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,wBAAsB,SAAS,CAC7B,KAAK,EAAE,cAAc,GACpB,OAAO,CAAC;IAAE,OAAO,EAAE,OAAO,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,CA6E9E"}
1
+ {"version":3,"file":"open-shell.d.ts","sourceRoot":"","sources":["../../../../../../src/presentation/web/app/actions/open-shell.ts"],"names":[],"mappings":"AAmDA,UAAU,cAAc;IACtB,cAAc,EAAE,MAAM,CAAC;IACvB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,wBAAsB,SAAS,CAC7B,KAAK,EAAE,cAAc,GACpB,OAAO,CAAC;IAAE,OAAO,EAAE,OAAO,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,CA4F9E"}
@@ -1,10 +1,34 @@
1
1
  'use server';
2
- import { existsSync } from 'node:fs';
2
+ import { realpathSync } from 'node:fs';
3
3
  import { platform } from 'node:os';
4
4
  import { isAbsolute } from 'node:path';
5
5
  import { spawn } from 'node:child_process';
6
6
  import { computeWorktreePath } from '../../lib/core-utils.js';
7
7
  import { resolve } from '../../lib/server-container.js';
8
+ /**
9
+ * Resolve the target path through realpath() so that any symlink traversal
10
+ * happens up-front and the resulting absolute path is the authoritative
11
+ * value used for all subsequent spawn operations. Returns null if the path
12
+ * does not exist or cannot be resolved.
13
+ */
14
+ function resolveTargetPath(repositoryPath, branch) {
15
+ try {
16
+ const base = branch ? computeWorktreePath(repositoryPath, branch) : repositoryPath;
17
+ return realpathSync(base);
18
+ }
19
+ catch {
20
+ return null;
21
+ }
22
+ }
23
+ /**
24
+ * POSIX shell-escape a path for safe inclusion in a shell:true command string.
25
+ * Wraps in single quotes and escapes embedded single quotes using the
26
+ * standard '\'' pattern. All tool configurations that opt into shell:true
27
+ * use POSIX-style commands (`cd {dir} && exec <tool>`) and run on Unix only.
28
+ */
29
+ function shellEscapePosixPath(p) {
30
+ return `'${p.replace(/'/g, `'\\''`)}'`;
31
+ }
8
32
  // Fallback commands for the "system" terminal when no tool metadata entry exists.
9
33
  // Uses a record lookup instead of if/else to prevent the bundler from
10
34
  // tree-shaking platform branches at build time. Turbopack evaluates
@@ -28,9 +52,12 @@ export async function openShell(input) {
28
52
  const settings = await loadSettings.execute();
29
53
  const shell = settings.environment.shellPreference;
30
54
  const terminalPref = settings.environment.terminalPreference ?? 'system';
31
- const targetPath = branch ? computeWorktreePath(repositoryPath, branch) : repositoryPath;
32
- if (!existsSync(targetPath)) {
33
- return { success: false, error: `Path does not exist: ${targetPath}` };
55
+ // Resolve the target path through realpath() up-front. From this point
56
+ // on, `targetPath` is the authoritative, symlink-resolved absolute path
57
+ // used for every spawn call never the raw user-supplied value.
58
+ const targetPath = resolveTargetPath(repositoryPath, branch);
59
+ if (!targetPath) {
60
+ return { success: false, error: 'Path does not exist' };
34
61
  }
35
62
  // Try to find the terminal in tool metadata via DI container.
36
63
  // Using DI (not a direct import from tool-metadata) ensures that
@@ -42,9 +69,16 @@ export async function openShell(input) {
42
69
  const service = resolve('IToolInstallerService');
43
70
  const config = service.getTerminalOpenConfig(terminalPref);
44
71
  if (config?.openDirectory.includes('{dir}')) {
45
- const resolved = config.openDirectory.replace('{dir}', targetPath);
46
72
  if (config.shell) {
47
- const child = spawn(resolved, [], {
73
+ // For shell:true tools (claude-code, codex-cli, etc.) the tool
74
+ // config is a POSIX shell string like `cd {dir} && exec claude`.
75
+ // Shell-escape the path to prevent command injection: a malicious
76
+ // path like `/tmp; rm -rf /` becomes `'/tmp; rm -rf /'` which the
77
+ // shell treats as a single literal argument to `cd`.
78
+ const escapedPath = shellEscapePosixPath(targetPath);
79
+ const command = config.openDirectory.replaceAll('{dir}', escapedPath);
80
+ // codeql[js/command-line-injection] -- targetPath from realpathSync (must exist on disk); shell-escaped via single-quote wrapping in shellEscapePosixPath; localhost-only server action
81
+ const child = spawn(command, [], {
48
82
  detached: true,
49
83
  stdio: 'ignore',
50
84
  shell: true,
@@ -53,7 +87,13 @@ export async function openShell(input) {
53
87
  child.unref();
54
88
  }
55
89
  else {
56
- const [command, ...args] = resolved.split(/\s+/);
90
+ // For non-shell tools (alacritty, kitty, etc.) the config is a
91
+ // whitespace-separated command. Split first, then substitute {dir}
92
+ // INTO AN ARGV ELEMENT (never back into a concatenated string).
93
+ // CodeQL recognizes the argv-form of spawn as sanitized input.
94
+ const tokens = config.openDirectory.split(/\s+/).filter(Boolean);
95
+ const command = tokens[0];
96
+ const args = tokens.slice(1).map((t) => t.replaceAll('{dir}', targetPath));
57
97
  const child = spawn(command, args, {
58
98
  detached: true,
59
99
  stdio: 'ignore',
@@ -1 +1 @@
1
- {"version":3,"file":"route.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/app/api/agent-events/route.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AASH,eAAO,MAAM,OAAO,kBAAkB,CAAC;AAKvC,+EAA+E;AAC/E,YAAY,EAAE,uBAAuB,EAAE,MAAM,yEAAyE,CAAC;AAEvH,wBAAgB,GAAG,CAAC,OAAO,EAAE,OAAO,GAAG,QAAQ,CAoG9C"}
1
+ {"version":3,"file":"route.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/app/api/agent-events/route.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAUH,eAAO,MAAM,OAAO,kBAAkB,CAAC;AAKvC,+EAA+E;AAC/E,YAAY,EAAE,uBAAuB,EAAE,MAAM,yEAAyE,CAAC;AAEvH,wBAAgB,GAAG,CAAC,OAAO,EAAE,OAAO,GAAG,QAAQ,CA+F9C"}
@@ -16,6 +16,7 @@
16
16
  * - Cleans up intervals on client disconnect
17
17
  */
18
18
  import { resolve } from '../../../lib/server-container.js';
19
+ import { apiError } from '../../../lib/api-helpers.js';
19
20
  // Force dynamic — SSE streams must never be statically optimized or cached
20
21
  export const dynamic = 'force-dynamic';
21
22
  const POLL_INTERVAL_MS = 2_000;
@@ -100,11 +101,6 @@ export function GET(request) {
100
101
  });
101
102
  }
102
103
  catch (error) {
103
- // eslint-disable-next-line no-console
104
- console.error('[SSE route] GET handler error:', error);
105
- return new Response(JSON.stringify({ error: String(error) }), {
106
- status: 500,
107
- headers: { 'Content-Type': 'application/json' },
108
- });
104
+ return apiError(500, 'Failed to open agent events stream', error);
109
105
  }
110
106
  }
@@ -1 +1 @@
1
- {"version":3,"file":"route.d.ts","sourceRoot":"","sources":["../../../../../../../../src/presentation/web/app/api/attachments/upload-from-path/route.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAmF3C,wBAAsB,IAAI,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,YAAY,CAAC,CA4ElE"}
1
+ {"version":3,"file":"route.d.ts","sourceRoot":"","sources":["../../../../../../../../src/presentation/web/app/api/attachments/upload-from-path/route.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAoF3C,wBAAsB,IAAI,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,YAAY,CAAC,CA8ElE"}