@shepai/cli 1.116.1 → 1.116.3-pr363.85106c9

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 (188) hide show
  1. package/apis/json-schema/AnalyzeRepoTimeouts.yaml +10 -0
  2. package/apis/json-schema/StageTimeouts.yaml +35 -0
  3. package/apis/json-schema/WorkflowConfig.yaml +6 -0
  4. package/dist/packages/core/src/domain/generated/output.d.ts +46 -0
  5. package/dist/packages/core/src/domain/generated/output.d.ts.map +1 -1
  6. package/dist/packages/core/src/infrastructure/persistence/sqlite/mappers/settings.mapper.d.ts +7 -0
  7. package/dist/packages/core/src/infrastructure/persistence/sqlite/mappers/settings.mapper.d.ts.map +1 -1
  8. package/dist/packages/core/src/infrastructure/persistence/sqlite/mappers/settings.mapper.js +44 -0
  9. package/dist/packages/core/src/infrastructure/persistence/sqlite/migrations/035-add-stage-timeout-ms.d.ts +22 -0
  10. package/dist/packages/core/src/infrastructure/persistence/sqlite/migrations/035-add-stage-timeout-ms.d.ts.map +1 -0
  11. package/dist/packages/core/src/infrastructure/persistence/sqlite/migrations/035-add-stage-timeout-ms.js +53 -0
  12. package/dist/packages/core/src/infrastructure/persistence/sqlite/migrations.d.ts.map +1 -1
  13. package/dist/packages/core/src/infrastructure/persistence/sqlite/migrations.js +15 -6
  14. package/dist/packages/core/src/infrastructure/repositories/sqlite-settings.repository.d.ts.map +1 -1
  15. package/dist/packages/core/src/infrastructure/repositories/sqlite-settings.repository.js +15 -0
  16. package/dist/packages/core/src/infrastructure/services/agents/analyze-repo/analyze-repository-graph.d.ts.map +1 -1
  17. package/dist/packages/core/src/infrastructure/services/agents/analyze-repo/analyze-repository-graph.js +15 -0
  18. package/dist/packages/core/src/infrastructure/services/agents/common/executors/claude-code-executor.service.d.ts.map +1 -1
  19. package/dist/packages/core/src/infrastructure/services/agents/common/executors/claude-code-executor.service.js +9 -4
  20. package/dist/packages/core/src/infrastructure/services/agents/common/executors/gemini-cli-executor.service.d.ts.map +1 -1
  21. package/dist/packages/core/src/infrastructure/services/agents/common/executors/gemini-cli-executor.service.js +13 -4
  22. package/dist/packages/core/src/infrastructure/services/agents/feature-agent/nodes/node-helpers.d.ts +11 -1
  23. package/dist/packages/core/src/infrastructure/services/agents/feature-agent/nodes/node-helpers.d.ts.map +1 -1
  24. package/dist/packages/core/src/infrastructure/services/agents/feature-agent/nodes/node-helpers.js +42 -3
  25. package/dist/packages/core/src/infrastructure/services/git/worktree.service.d.ts.map +1 -1
  26. package/dist/packages/core/src/infrastructure/services/git/worktree.service.js +3 -0
  27. package/dist/src/presentation/web/app/actions/open-shell.d.ts.map +1 -1
  28. package/dist/src/presentation/web/app/actions/open-shell.js +4 -1
  29. package/dist/src/presentation/web/components/features/settings/settings-page-client.d.ts.map +1 -1
  30. package/dist/src/presentation/web/components/features/settings/settings-page-client.js +75 -2
  31. package/dist/src/presentation/web/components/features/settings/settings-page-client.stories.d.ts +1 -0
  32. package/dist/src/presentation/web/components/features/settings/settings-page-client.stories.d.ts.map +1 -1
  33. package/dist/src/presentation/web/components/features/settings/settings-page-client.stories.js +23 -0
  34. package/dist/src/presentation/web/components/features/settings/timeout-slider.d.ts +11 -0
  35. package/dist/src/presentation/web/components/features/settings/timeout-slider.d.ts.map +1 -0
  36. package/dist/src/presentation/web/components/features/settings/timeout-slider.js +63 -0
  37. package/dist/src/presentation/web/components/features/settings/timeout-slider.stories.d.ts +10 -0
  38. package/dist/src/presentation/web/components/features/settings/timeout-slider.stories.d.ts.map +1 -0
  39. package/dist/src/presentation/web/components/features/settings/timeout-slider.stories.js +24 -0
  40. package/dist/src/presentation/web/components/features/settings/workflow-settings-section.d.ts.map +1 -1
  41. package/dist/src/presentation/web/components/features/settings/workflow-settings-section.js +97 -2
  42. package/dist/src/presentation/web/components/features/settings/workflow-settings-section.stories.d.ts.map +1 -1
  43. package/dist/src/presentation/web/components/features/settings/workflow-settings-section.stories.js +22 -0
  44. package/dist/src/presentation/web/components/ui/slider.d.ts +5 -0
  45. package/dist/src/presentation/web/components/ui/slider.d.ts.map +1 -0
  46. package/dist/src/presentation/web/components/ui/slider.js +10 -0
  47. package/dist/src/presentation/web/components/ui/slider.stories.d.ts +7 -0
  48. package/dist/src/presentation/web/components/ui/slider.stories.d.ts.map +1 -0
  49. package/dist/src/presentation/web/components/ui/slider.stories.js +15 -0
  50. package/dist/tsconfig.build.tsbuildinfo +1 -1
  51. package/package.json +1 -1
  52. package/web/.next/BUILD_ID +1 -1
  53. package/web/.next/build-manifest.json +2 -2
  54. package/web/.next/fallback-build-manifest.json +2 -2
  55. package/web/.next/prerender-manifest.json +3 -3
  56. package/web/.next/required-server-files.js +3 -3
  57. package/web/.next/required-server-files.json +3 -3
  58. package/web/.next/server/app/(dashboard)/@drawer/create/page/server-reference-manifest.json +20 -20
  59. package/web/.next/server/app/(dashboard)/@drawer/create/page.js.nft.json +1 -1
  60. package/web/.next/server/app/(dashboard)/@drawer/create/page_client-reference-manifest.js +1 -1
  61. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/[tab]/page/server-reference-manifest.json +26 -26
  62. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/[tab]/page.js.nft.json +1 -1
  63. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/[tab]/page_client-reference-manifest.js +1 -1
  64. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page/server-reference-manifest.json +26 -26
  65. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page.js.nft.json +1 -1
  66. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page_client-reference-manifest.js +1 -1
  67. package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page/server-reference-manifest.json +18 -18
  68. package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page.js.nft.json +1 -1
  69. package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page_client-reference-manifest.js +1 -1
  70. package/web/.next/server/app/(dashboard)/create/page/server-reference-manifest.json +20 -20
  71. package/web/.next/server/app/(dashboard)/create/page.js.nft.json +1 -1
  72. package/web/.next/server/app/(dashboard)/create/page_client-reference-manifest.js +1 -1
  73. package/web/.next/server/app/(dashboard)/feature/[featureId]/[tab]/page/server-reference-manifest.json +26 -26
  74. package/web/.next/server/app/(dashboard)/feature/[featureId]/[tab]/page.js.nft.json +1 -1
  75. package/web/.next/server/app/(dashboard)/feature/[featureId]/[tab]/page_client-reference-manifest.js +1 -1
  76. package/web/.next/server/app/(dashboard)/feature/[featureId]/page/server-reference-manifest.json +26 -26
  77. package/web/.next/server/app/(dashboard)/feature/[featureId]/page.js.nft.json +1 -1
  78. package/web/.next/server/app/(dashboard)/feature/[featureId]/page_client-reference-manifest.js +1 -1
  79. package/web/.next/server/app/(dashboard)/page/server-reference-manifest.json +18 -18
  80. package/web/.next/server/app/(dashboard)/page.js.nft.json +1 -1
  81. package/web/.next/server/app/(dashboard)/page_client-reference-manifest.js +1 -1
  82. package/web/.next/server/app/(dashboard)/repository/[repositoryId]/page/server-reference-manifest.json +18 -18
  83. package/web/.next/server/app/(dashboard)/repository/[repositoryId]/page.js.nft.json +1 -1
  84. package/web/.next/server/app/(dashboard)/repository/[repositoryId]/page_client-reference-manifest.js +1 -1
  85. package/web/.next/server/app/_global-error.html +2 -2
  86. package/web/.next/server/app/_global-error.rsc +1 -1
  87. package/web/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +1 -1
  88. package/web/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  89. package/web/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  90. package/web/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  91. package/web/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  92. package/web/.next/server/app/_not-found/page/server-reference-manifest.json +1 -1
  93. package/web/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  94. package/web/.next/server/app/api/attachments/preview/route.js.nft.json +1 -1
  95. package/web/.next/server/app/api/evidence/route.js.nft.json +1 -1
  96. package/web/.next/server/app/settings/page/server-reference-manifest.json +5 -5
  97. package/web/.next/server/app/settings/page.js.nft.json +1 -1
  98. package/web/.next/server/app/settings/page_client-reference-manifest.js +1 -1
  99. package/web/.next/server/app/skills/page/server-reference-manifest.json +6 -6
  100. package/web/.next/server/app/skills/page.js.nft.json +1 -1
  101. package/web/.next/server/app/skills/page_client-reference-manifest.js +1 -1
  102. package/web/.next/server/app/tools/page/server-reference-manifest.json +6 -6
  103. package/web/.next/server/app/tools/page.js.nft.json +1 -1
  104. package/web/.next/server/app/tools/page_client-reference-manifest.js +1 -1
  105. package/web/.next/server/app/version/page/server-reference-manifest.json +1 -1
  106. package/web/.next/server/app/version/page_client-reference-manifest.js +1 -1
  107. package/web/.next/server/chunks/[root-of-the-server]__7d5492a0._.js.map +1 -1
  108. package/web/.next/server/chunks/[root-of-the-server]__a402b567._.js +1 -1
  109. package/web/.next/server/chunks/[root-of-the-server]__cd67a84c._.js.map +1 -1
  110. package/web/.next/server/chunks/ssr/744ca_web_components_common_control-center-drawer_create-drawer-client_tsx_5e26fc0a._.js +1 -1
  111. package/web/.next/server/chunks/ssr/744ca_web_components_common_control-center-drawer_create-drawer-client_tsx_5e26fc0a._.js.map +1 -1
  112. package/web/.next/server/chunks/ssr/8ba4b_server_app_(dashboard)_@drawer_repository_[repositoryId]_page_actions_a1104008.js +1 -1
  113. package/web/.next/server/chunks/ssr/8ba4b_server_app_(dashboard)_@drawer_repository_[repositoryId]_page_actions_a1104008.js.map +1 -1
  114. package/web/.next/server/chunks/ssr/8ba4b_server_app_(dashboard)_repository_[repositoryId]_page_actions_92642200.js +1 -1
  115. package/web/.next/server/chunks/ssr/8ba4b_server_app_(dashboard)_repository_[repositoryId]_page_actions_92642200.js.map +1 -1
  116. package/web/.next/server/chunks/ssr/[root-of-the-server]__039967e3._.js +1 -1
  117. package/web/.next/server/chunks/ssr/[root-of-the-server]__039967e3._.js.map +1 -1
  118. package/web/.next/server/chunks/ssr/[root-of-the-server]__07a39ff2._.js +1 -1
  119. package/web/.next/server/chunks/ssr/[root-of-the-server]__11033878._.js +1 -1
  120. package/web/.next/server/chunks/ssr/[root-of-the-server]__11033878._.js.map +1 -1
  121. package/web/.next/server/chunks/ssr/[root-of-the-server]__24dd0927._.js +2 -2
  122. package/web/.next/server/chunks/ssr/[root-of-the-server]__24dd0927._.js.map +1 -1
  123. package/web/.next/server/chunks/ssr/[root-of-the-server]__2773312c._.js +1 -1
  124. package/web/.next/server/chunks/ssr/[root-of-the-server]__2773312c._.js.map +1 -1
  125. package/web/.next/server/chunks/ssr/[root-of-the-server]__5d87af2e._.js +1 -1
  126. package/web/.next/server/chunks/ssr/[root-of-the-server]__6367aea0._.js +1 -1
  127. package/web/.next/server/chunks/ssr/[root-of-the-server]__6367aea0._.js.map +1 -1
  128. package/web/.next/server/chunks/ssr/[root-of-the-server]__89e8a5cc._.js +2 -2
  129. package/web/.next/server/chunks/ssr/[root-of-the-server]__89e8a5cc._.js.map +1 -1
  130. package/web/.next/server/chunks/ssr/[root-of-the-server]__aad040c0._.js +2 -2
  131. package/web/.next/server/chunks/ssr/[root-of-the-server]__aad040c0._.js.map +1 -1
  132. package/web/.next/server/chunks/ssr/[root-of-the-server]__cbd8062c._.js +1 -1
  133. package/web/.next/server/chunks/ssr/[root-of-the-server]__cbd8062c._.js.map +1 -1
  134. package/web/.next/server/chunks/ssr/[root-of-the-server]__e70c5627._.js +1 -1
  135. package/web/.next/server/chunks/ssr/[root-of-the-server]__e70c5627._.js.map +1 -1
  136. package/web/.next/server/chunks/ssr/[root-of-the-server]__fdc75809._.js +1 -1
  137. package/web/.next/server/chunks/ssr/[root-of-the-server]__fdc75809._.js.map +1 -1
  138. package/web/.next/server/chunks/ssr/_01135432._.js +3 -0
  139. package/web/.next/server/chunks/ssr/{_8e762bfa._.js.map → _01135432._.js.map} +1 -1
  140. package/web/.next/server/chunks/ssr/_135edb9c._.js +1 -1
  141. package/web/.next/server/chunks/ssr/_135edb9c._.js.map +1 -1
  142. package/web/.next/server/chunks/ssr/_1bb131c4._.js.map +1 -1
  143. package/web/.next/server/chunks/ssr/_250a63ae._.js.map +1 -1
  144. package/web/.next/server/chunks/ssr/_702c2c99._.js +3 -0
  145. package/web/.next/server/chunks/ssr/{_c1fbab88._.js.map → _702c2c99._.js.map} +1 -1
  146. package/web/.next/server/chunks/ssr/_8dacd1e7._.js +1 -1
  147. package/web/.next/server/chunks/ssr/_8dacd1e7._.js.map +1 -1
  148. package/web/.next/server/chunks/ssr/{_9f6e3d20._.js → _c2439667._.js} +2 -2
  149. package/web/.next/server/chunks/ssr/{_9f6e3d20._.js.map → _c2439667._.js.map} +1 -1
  150. package/web/.next/server/chunks/ssr/_cc77a143._.js +1 -1
  151. package/web/.next/server/chunks/ssr/_cc77a143._.js.map +1 -1
  152. package/web/.next/server/chunks/ssr/_f4d222d6._.js +1 -1
  153. package/web/.next/server/chunks/ssr/b1a17_presentation_web_components_features_settings_settings-page-client_tsx_6ed9d5f8._.js +1 -1
  154. package/web/.next/server/chunks/ssr/b1a17_presentation_web_components_features_settings_settings-page-client_tsx_6ed9d5f8._.js.map +1 -1
  155. package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_(dashboard)_page_actions_888633e1.js +1 -1
  156. package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_(dashboard)_page_actions_888633e1.js.map +1 -1
  157. package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_skills_page_actions_1fa8042e.js +1 -1
  158. package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_skills_page_actions_1fa8042e.js.map +1 -1
  159. package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_tools_page_actions_24684200.js +1 -1
  160. package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_tools_page_actions_24684200.js.map +1 -1
  161. package/web/.next/server/chunks/ssr/src_presentation_web_ce7cbc3c._.js +2 -2
  162. package/web/.next/server/chunks/ssr/src_presentation_web_ce7cbc3c._.js.map +1 -1
  163. package/web/.next/server/chunks/ssr/src_presentation_web_components_bf50c527._.js +1 -1
  164. package/web/.next/server/chunks/ssr/src_presentation_web_components_de814675._.js +1 -1
  165. package/web/.next/server/chunks/ssr/src_presentation_web_components_features_control-center_7ac3562e._.js +1 -1
  166. package/web/.next/server/chunks/ssr/src_presentation_web_components_features_control-center_7ac3562e._.js.map +1 -1
  167. package/web/.next/server/chunks/ssr/src_presentation_web_e2604413._.js +2 -2
  168. package/web/.next/server/chunks/ssr/src_presentation_web_e2604413._.js.map +1 -1
  169. package/web/.next/server/pages/500.html +2 -2
  170. package/web/.next/server/server-reference-manifest.js +1 -1
  171. package/web/.next/server/server-reference-manifest.json +31 -31
  172. package/web/.next/static/chunks/{3c962e81416806a3.js → 0ca9c86fe62b2aa1.js} +2 -2
  173. package/web/.next/static/chunks/{35bf7817ea1c468d.js → 0df52a849081a0c7.js} +1 -1
  174. package/web/.next/static/chunks/{3375766cc7dda1d8.js → 30ce6c4b201d3dcd.js} +2 -2
  175. package/web/.next/static/chunks/{b830ce63d018922d.js → 4f0877b0db1c0baa.js} +1 -1
  176. package/web/.next/static/chunks/{17fd217453792496.js → 689d15b2a2a17204.js} +1 -1
  177. package/web/.next/static/chunks/{814f40e65ab8e09e.js → 6a24a1551c8cadd0.js} +1 -1
  178. package/web/.next/static/chunks/{3fc8dae693118412.js → 982f4ca978409634.js} +1 -1
  179. package/web/.next/static/chunks/{5d83ac35ca137033.js → bc010ddb1cc22e9d.js} +1 -1
  180. package/web/.next/static/chunks/{57b45edf86522369.css → cad75bc266e09536.css} +1 -1
  181. package/web/.next/static/chunks/d79a665acb1e29df.js +1 -0
  182. package/web/.next/static/chunks/{b5357e9cc8668be7.js → e6cf4ce99c4eb2fe.js} +1 -1
  183. package/web/.next/server/chunks/ssr/_8e762bfa._.js +0 -3
  184. package/web/.next/server/chunks/ssr/_c1fbab88._.js +0 -3
  185. package/web/.next/static/chunks/33479aee057faf05.js +0 -1
  186. /package/web/.next/static/{oySSHprbXXpmQhRjypXRR → MOoHAuSI-Lr1yZYqDhKEL}/_buildManifest.js +0 -0
  187. /package/web/.next/static/{oySSHprbXXpmQhRjypXRR → MOoHAuSI-Lr1yZYqDhKEL}/_clientMiddlewareManifest.json +0 -0
  188. /package/web/.next/static/{oySSHprbXXpmQhRjypXRR → MOoHAuSI-Lr1yZYqDhKEL}/_ssgManifest.js +0 -0
@@ -23,10 +23,20 @@ export type NodeLogger = ReturnType<typeof createNodeLogger>;
23
23
  * Safely read a file from the spec directory. Returns empty string if file doesn't exist.
24
24
  */
25
25
  export declare function readSpecFile(specDir: string, filename: string): string;
26
+ /**
27
+ * Resolve the timeout for a specific stage.
28
+ * Reads per-stage timeout from settings (workflow.stageTimeouts.<stage>Ms),
29
+ * falling back to DEFAULT_STAGE_TIMEOUT_MS when not configured.
30
+ */
31
+ export declare function getStageTimeoutMs(nodeName: string): number;
26
32
  /**
27
33
  * Build executor options with cwd. Each node gets a clean agent context.
34
+ * The timeout is resolved per-stage from settings (workflow.stageTimeouts)
35
+ * with a fallback to DEFAULT_STAGE_TIMEOUT_MS (10 min).
36
+ *
37
+ * When no `nodeName` is provided, the current node from state is used.
28
38
  */
29
- export declare function buildExecutorOptions(state: FeatureAgentState, overrides?: Partial<Pick<AgentExecutionOptions, 'timeout'>>): AgentExecutionOptions;
39
+ export declare function buildExecutorOptions(state: FeatureAgentState, overrides?: Partial<Pick<AgentExecutionOptions, 'timeout'>>, nodeName?: string): AgentExecutionOptions;
30
40
  /**
31
41
  * Parse YAML with automatic sanitization of common AI-generated issues.
32
42
  * First attempts normal parsing; on failure, sanitizes unquoted braces
@@ -1 +1 @@
1
- {"version":3,"file":"node-helpers.d.ts","sourceRoot":"","sources":["../../../../../../../../../packages/core/src/infrastructure/services/agents/feature-agent/nodes/node-helpers.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAMH,OAAO,KAAK,EACV,cAAc,EACd,qBAAqB,EACrB,oBAAoB,EACrB,MAAM,+DAA+D,CAAC;AACvE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,8BAA8B,CAAC;AAClE,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAUrD;;;;GAIG;AACH,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,MAAM;IAE7C,4DAA4D;gBAChD,IAAI;kBAGF,MAAM,GAAG,IAAI;mBAIZ,MAAM,GAAG,IAAI;EAK/B;AAED,MAAM,MAAM,UAAU,GAAG,UAAU,CAAC,OAAO,gBAAgB,CAAC,CAAC;AAE7D;;GAEG;AACH,wBAAgB,YAAY,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,CAMtE;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAClC,KAAK,EAAE,iBAAiB,EACxB,SAAS,CAAC,EAAE,OAAO,CAAC,IAAI,CAAC,qBAAqB,EAAE,SAAS,CAAC,CAAC,GAC1D,qBAAqB,CAQvB;AAeD;;;;GAIG;AACH,wBAAgB,YAAY,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAQrD;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,eAAe,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,aAAa,GAAG,SAAS,GAAG,OAAO,CAQ3F;AAMD,MAAM,MAAM,aAAa,GAAG,eAAe,GAAG,mBAAmB,GAAG,eAAe,GAAG,SAAS,CAAC;AAMhG;;;;;;;GAOG;AACH,wBAAgB,aAAa,CAAC,YAAY,EAAE,MAAM,GAAG,aAAa,CAKjE;AAED,MAAM,WAAW,YAAY;IAC3B,wDAAwD;IACxD,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,kFAAkF;IAClF,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,0CAA0C;IAC1C,MAAM,CAAC,EAAE,UAAU,CAAC;CACrB;AAED;;;;;;GAMG;AACH,wBAAsB,YAAY,CAChC,QAAQ,EAAE,cAAc,EACxB,MAAM,EAAE,MAAM,EACd,OAAO,EAAE,qBAAqB,EAC9B,SAAS,CAAC,EAAE,YAAY,GACvB,OAAO,CAAC,oBAAoB,CAAC,CA6B/B;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,EAAE,CAW5D;AAED;;;GAGG;AACH,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,GAAG,CAAC,EAAE,UAAU,GAAG,IAAI,CAqB5F;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI;IAAE,QAAQ,EAAE,IAAI,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAA;CAAE,CAOhG;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,GAAG,CAAC,EAAE,UAAU,GAAG,IAAI,CAwB1F;AAED;;;GAGG;AACH,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,IAAI,CAa5F;AAED;;;;;GAKG;AACH,wBAAgB,oBAAoB,CAAC,IAAI,EAAE;IACzC,IAAI,EAAE,OAAO,CAAC;IACd,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,UAAU,EAAE,MAAM,CAAC;IACnB,6FAA6F;IAC7F,gBAAgB,CAAC,EAAE,OAAO,CAAC;CAC5B,GAAG,MAAM,CAiCT;AAED;;;;;GAKG;AACH,wBAAgB,kBAAkB,CAAC,YAAY,EAAE,MAAM,GAAG,SAAS,GAAG,MAAM,CAa3E;AAED;;;;;;;GAOG;AACH,wBAAgB,WAAW,CACzB,QAAQ,EAAE,MAAM,EAChB,QAAQ,EAAE,cAAc,EACxB,WAAW,EAAE,CAAC,KAAK,EAAE,iBAAiB,EAAE,GAAG,EAAE,UAAU,KAAK,MAAM,GACjE,CAAC,KAAK,EAAE,iBAAiB,KAAK,OAAO,CAAC,OAAO,CAAC,iBAAiB,CAAC,CAAC,CAqHnE"}
1
+ {"version":3,"file":"node-helpers.d.ts","sourceRoot":"","sources":["../../../../../../../../../packages/core/src/infrastructure/services/agents/feature-agent/nodes/node-helpers.ts"],"names":[],"mappings":"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"}
@@ -8,6 +8,7 @@ import yaml from 'js-yaml';
8
8
  import { readFileSync, writeFileSync, renameSync, unlinkSync } from 'node:fs';
9
9
  import { join } from 'node:path';
10
10
  import { interrupt, isGraphBubbleUp } from '@langchain/langgraph';
11
+ import { hasSettings, getSettings } from '../../../../services/settings.service.js';
11
12
  import { reportNodeStart } from '../heartbeat.js';
12
13
  import { recordPhaseStart, recordPhaseEnd, recordApprovalWaitStart, } from '../phase-timing-context.js';
13
14
  import { updateNodeLifecycle } from '../lifecycle-context.js';
@@ -44,14 +45,52 @@ export function readSpecFile(specDir, filename) {
44
45
  return '';
45
46
  }
46
47
  }
48
+ /** Default timeout per agent call (30 minutes) — prevents infinite hangs. */
49
+ const DEFAULT_STAGE_TIMEOUT_MS = 1_800_000;
50
+ /**
51
+ * Map from node name to the corresponding StageTimeouts field.
52
+ * `fast-implement` reuses the implement timeout; `evidence` also reuses implement.
53
+ */
54
+ const STAGE_TIMEOUT_KEY = {
55
+ analyze: 'analyzeMs',
56
+ requirements: 'requirementsMs',
57
+ research: 'researchMs',
58
+ plan: 'planMs',
59
+ implement: 'implementMs',
60
+ 'fast-implement': 'implementMs',
61
+ evidence: 'implementMs',
62
+ merge: 'mergeMs',
63
+ };
64
+ /**
65
+ * Resolve the timeout for a specific stage.
66
+ * Reads per-stage timeout from settings (workflow.stageTimeouts.<stage>Ms),
67
+ * falling back to DEFAULT_STAGE_TIMEOUT_MS when not configured.
68
+ */
69
+ export function getStageTimeoutMs(nodeName) {
70
+ if (!hasSettings())
71
+ return DEFAULT_STAGE_TIMEOUT_MS;
72
+ const timeouts = getSettings().workflow?.stageTimeouts;
73
+ if (!timeouts)
74
+ return DEFAULT_STAGE_TIMEOUT_MS;
75
+ const key = STAGE_TIMEOUT_KEY[nodeName];
76
+ if (!key)
77
+ return DEFAULT_STAGE_TIMEOUT_MS;
78
+ return timeouts[key] ?? DEFAULT_STAGE_TIMEOUT_MS;
79
+ }
47
80
  /**
48
81
  * Build executor options with cwd. Each node gets a clean agent context.
82
+ * The timeout is resolved per-stage from settings (workflow.stageTimeouts)
83
+ * with a fallback to DEFAULT_STAGE_TIMEOUT_MS (10 min).
84
+ *
85
+ * When no `nodeName` is provided, the current node from state is used.
49
86
  */
50
- export function buildExecutorOptions(state, overrides) {
87
+ export function buildExecutorOptions(state, overrides, nodeName) {
88
+ const stage = nodeName ?? state.currentNode ?? '';
89
+ const stageTimeout = getStageTimeoutMs(stage);
51
90
  return {
52
91
  cwd: state.worktreePath || state.repositoryPath,
53
92
  maxTurns: 5000,
54
- timeout: 1_800_000, // 30 minutes per agent call — prevents infinite hangs
93
+ timeout: stageTimeout,
55
94
  ...(state.model ? { model: state.model } : {}),
56
95
  ...overrides,
57
96
  };
@@ -373,7 +412,7 @@ export function executeNode(nodeName, executor, buildPrompt) {
373
412
  try {
374
413
  const resumePrefix = buildResumeContext(state.resumeReason);
375
414
  const prompt = resumePrefix + buildPrompt(state, log);
376
- const options = buildExecutorOptions(state);
415
+ const options = buildExecutorOptions(state, undefined, nodeName);
377
416
  log.info(`Executing agent at cwd=${options.cwd}`);
378
417
  log.info(`Prompt length: ${prompt.length} chars`);
379
418
  const result = await executor.execute(prompt, options);
@@ -1 +1 @@
1
- {"version":3,"file":"worktree.service.d.ts","sourceRoot":"","sources":["../../../../../../../packages/core/src/infrastructure/services/git/worktree.service.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AASH,OAAO,KAAK,EACV,gBAAgB,EAChB,YAAY,EACb,MAAM,0EAA0E,CAAC;AAQlF;;;GAGG;AACH,MAAM,MAAM,YAAY,GAAG,CACzB,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,MAAM,EAAE,EACd,OAAO,CAAC,EAAE,MAAM,KACb,OAAO,CAAC;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC,CAAC;AAEjD,qBACa,eAAgB,YAAW,gBAAgB;IAClB,OAAO,CAAC,QAAQ,CAAC,QAAQ;gBAAR,QAAQ,EAAE,YAAY;IAErE,MAAM,CACV,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,MAAM,EACd,YAAY,EAAE,MAAM,EACpB,UAAU,CAAC,EAAE,MAAM,GAClB,OAAO,CAAC,YAAY,CAAC;IAuBlB,MAAM,CAAC,QAAQ,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC;IAW9E,KAAK,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAQtC,IAAI,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC;IAO/C,MAAM,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAK1D,YAAY,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAWhE,kBAAkB,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAWtE,mBAAmB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAqC1D,eAAe,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM;IAQzD,OAAO,CAAC,mBAAmB;IA2B3B,OAAO,CAAC,aAAa;IAgCrB,OAAO,CAAC,kBAAkB;IAI1B,OAAO,CAAC,qBAAqB;CAsB9B"}
1
+ {"version":3,"file":"worktree.service.d.ts","sourceRoot":"","sources":["../../../../../../../packages/core/src/infrastructure/services/git/worktree.service.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AASH,OAAO,KAAK,EACV,gBAAgB,EAChB,YAAY,EACb,MAAM,0EAA0E,CAAC;AAQlF;;;GAGG;AACH,MAAM,MAAM,YAAY,GAAG,CACzB,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,MAAM,EAAE,EACd,OAAO,CAAC,EAAE,MAAM,KACb,OAAO,CAAC;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC,CAAC;AAEjD,qBACa,eAAgB,YAAW,gBAAgB;IAClB,OAAO,CAAC,QAAQ,CAAC,QAAQ;gBAAR,QAAQ,EAAE,YAAY;IAErE,MAAM,CACV,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,MAAM,EACd,YAAY,EAAE,MAAM,EACpB,UAAU,CAAC,EAAE,MAAM,GAClB,OAAO,CAAC,YAAY,CAAC;IAuBlB,MAAM,CAAC,QAAQ,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC;IAW9E,KAAK,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAQtC,IAAI,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC;IAO/C,MAAM,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAK1D,YAAY,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAWhE,kBAAkB,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAWtE,mBAAmB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAwC1D,eAAe,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM;IAQzD,OAAO,CAAC,mBAAmB;IA2B3B,OAAO,CAAC,aAAa;IAgCrB,OAAO,CAAC,kBAAkB;IAI1B,OAAO,CAAC,qBAAqB;CAsB9B"}
@@ -129,6 +129,9 @@ let WorktreeService = class WorktreeService {
129
129
  }
130
130
  await this.execFile('git', ['config', 'user.name', GIT_AUTO_INIT_USER], { cwd: repoPath });
131
131
  await this.execFile('git', ['config', 'user.email', GIT_AUTO_INIT_EMAIL], { cwd: repoPath });
132
+ // Stage any existing files so they appear in the worktree after creation.
133
+ // --allow-empty ensures the commit succeeds even if the directory is empty.
134
+ await this.execFile('git', ['add', '.'], { cwd: repoPath });
132
135
  await this.execFile('git', ['commit', '--allow-empty', '--no-gpg-sign', '-m', 'Initial commit'], { cwd: repoPath });
133
136
  }
134
137
  catch (error) {
@@ -1 +1 @@
1
- {"version":3,"file":"open-shell.d.ts","sourceRoot":"","sources":["../../../../../../src/presentation/web/app/actions/open-shell.ts"],"names":[],"mappings":"AAmBA,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,CAoC9E"}
1
+ {"version":3,"file":"open-shell.d.ts","sourceRoot":"","sources":["../../../../../../src/presentation/web/app/actions/open-shell.ts"],"names":[],"mappings":"AAsBA,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,CAoC9E"}
@@ -12,7 +12,10 @@ import { computeWorktreePath } from '../../../../../packages/core/src/infrastruc
12
12
  const SHELL_COMMANDS = {
13
13
  darwin: { cmd: 'open', args: (p) => ['-a', 'Terminal', p] },
14
14
  linux: { cmd: 'x-terminal-emulator', args: (p) => [`--working-directory=${p}`] },
15
- win32: { cmd: 'powershell', args: (p) => ['-NoExit', '-Command', `Set-Location "${p}"`] },
15
+ win32: {
16
+ cmd: 'cmd.exe',
17
+ args: (p) => ['/c', 'start', 'powershell', '-NoExit', '-Command', `Set-Location "${p}"`],
18
+ },
16
19
  };
17
20
  export async function openShell(input) {
18
21
  const { repositoryPath, branch } = input;
@@ -1 +1 @@
1
- {"version":3,"file":"settings-page-client.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/features/settings/settings-page-client.tsx"],"names":[],"mappings":"AAqCA,OAAO,KAAK,EACV,QAAQ,EAGT,MAAM,sCAAsC,CAAC;AAyB9C,MAAM,WAAW,uBAAuB;IACtC,QAAQ,EAAE,QAAQ,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;CACpB;AA6QD,wBAAgB,kBAAkB,CAAC,EAAE,QAAQ,EAAE,QAAQ,EAAE,UAAU,EAAE,EAAE,uBAAuB,2CAi1B7F"}
1
+ {"version":3,"file":"settings-page-client.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/features/settings/settings-page-client.tsx"],"names":[],"mappings":"AAuCA,OAAO,KAAK,EACV,QAAQ,EAGT,MAAM,sCAAsC,CAAC;AA0B9C,MAAM,WAAW,uBAAuB;IACtC,QAAQ,EAAE,QAAQ,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;CACpB;AA6QD,wBAAgB,kBAAkB,CAAC,EAAE,QAAQ,EAAE,QAAQ,EAAE,UAAU,EAAE,EAAE,uBAAuB,2CA4iC7F"}
@@ -1,7 +1,7 @@
1
1
  'use client';
2
2
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
3
  import { useState, useTransition, useRef, useEffect, useCallback } from 'react';
4
- import { Eye, EyeOff, Check, Bot, Terminal, GitBranch, Activity, Bell, Flag, Database, Minus, Plus, ExternalLink, Settings2, } from 'lucide-react';
4
+ import { Eye, EyeOff, Check, Bot, Terminal, GitBranch, Activity, Bell, Flag, Database, Minus, Plus, ExternalLink, Settings2, Timer, } from 'lucide-react';
5
5
  import { toast } from 'sonner';
6
6
  import { cn } from '../../../lib/utils.js';
7
7
  import { Label } from '../../ui/label.js';
@@ -14,6 +14,7 @@ import { updateSettingsAction } from '../../../app/actions/update-settings.js';
14
14
  import { AgentAuthMethod, EditorType } from '../../../../../../packages/core/src/domain/generated/output.js';
15
15
  import { getEditorTypeIcon } from '../../common/editor-type-icons.js';
16
16
  import { AgentModelPicker } from '../../features/settings/AgentModelPicker/index.js';
17
+ import { TimeoutSlider } from '../../features/settings/timeout-slider.js';
17
18
  const AUTH_METHOD_OPTIONS = [
18
19
  { value: AgentAuthMethod.Session, label: 'Session' },
19
20
  { value: AgentAuthMethod.Token, label: 'Token' },
@@ -30,6 +31,7 @@ const SECTIONS = [
30
31
  { id: 'environment', label: 'Environment', icon: Terminal },
31
32
  { id: 'workflow', label: 'Workflow', icon: GitBranch },
32
33
  { id: 'ci', label: 'CI', icon: Activity },
34
+ { id: 'stage-timeouts', label: 'Timeouts', icon: Timer },
33
35
  { id: 'notifications', label: 'Notifications', icon: Bell },
34
36
  { id: 'feature-flags', label: 'Flags', icon: Flag },
35
37
  { id: 'database', label: 'Database', icon: Database },
@@ -137,6 +139,18 @@ export function SettingsPageClient({ settings, shepHome, dbFileSize }) {
137
139
  ? String(Math.round(settings.workflow.ciWatchTimeoutMs / 1000))
138
140
  : '');
139
141
  const [ciLogMax, setCiLogMax] = useState(settings.workflow.ciLogMaxChars != null ? String(settings.workflow.ciLogMaxChars) : '');
142
+ // Feature agent per-stage timeout states (stored in seconds for display, converted to ms on save)
143
+ // Defaults: feature agent stages = 1_800_000 ms (1800s), analyze-repo = 600_000 ms (600s)
144
+ const stageTimeoutsConfig = settings.workflow.stageTimeouts;
145
+ const [analyzeTimeout, setAnalyzeTimeout] = useState(String(Math.round((stageTimeoutsConfig?.analyzeMs ?? 1_800_000) / 1000)));
146
+ const [requirementsTimeout, setRequirementsTimeout] = useState(String(Math.round((stageTimeoutsConfig?.requirementsMs ?? 1_800_000) / 1000)));
147
+ const [researchTimeout, setResearchTimeout] = useState(String(Math.round((stageTimeoutsConfig?.researchMs ?? 1_800_000) / 1000)));
148
+ const [planTimeout, setPlanTimeout] = useState(String(Math.round((stageTimeoutsConfig?.planMs ?? 1_800_000) / 1000)));
149
+ const [implementTimeout, setImplementTimeout] = useState(String(Math.round((stageTimeoutsConfig?.implementMs ?? 1_800_000) / 1000)));
150
+ const [mergeTimeout, setMergeTimeout] = useState(String(Math.round((stageTimeoutsConfig?.mergeMs ?? 1_800_000) / 1000)));
151
+ // Analyze-repo agent timeout state
152
+ const analyzeRepoConfig = settings.workflow.analyzeRepoTimeouts;
153
+ const [analyzeRepoTimeout, setAnalyzeRepoTimeout] = useState(String(Math.round((analyzeRepoConfig?.analyzeMs ?? 600_000) / 1000)));
140
154
  // Notification state
141
155
  const [inApp, setInApp] = useState(settings.notifications.inApp.enabled);
142
156
  const [browser, setBrowser] = useState(settings.notifications.browser.enabled);
@@ -150,6 +164,27 @@ export function SettingsPageClient({ settings, shepHome, dbFileSize }) {
150
164
  ? String(Math.round(settings.workflow.ciWatchTimeoutMs / 1000))
151
165
  : '';
152
166
  const originalCiLogMax = settings.workflow.ciLogMaxChars != null ? String(settings.workflow.ciLogMaxChars) : '';
167
+ const originalAnalyzeTimeout = stageTimeoutsConfig?.analyzeMs != null
168
+ ? String(Math.round(stageTimeoutsConfig.analyzeMs / 1000))
169
+ : '';
170
+ const originalRequirementsTimeout = stageTimeoutsConfig?.requirementsMs != null
171
+ ? String(Math.round(stageTimeoutsConfig.requirementsMs / 1000))
172
+ : '';
173
+ const originalResearchTimeout = stageTimeoutsConfig?.researchMs != null
174
+ ? String(Math.round(stageTimeoutsConfig.researchMs / 1000))
175
+ : '';
176
+ const originalPlanTimeout = stageTimeoutsConfig?.planMs != null
177
+ ? String(Math.round(stageTimeoutsConfig.planMs / 1000))
178
+ : '';
179
+ const originalImplementTimeout = stageTimeoutsConfig?.implementMs != null
180
+ ? String(Math.round(stageTimeoutsConfig.implementMs / 1000))
181
+ : '';
182
+ const originalMergeTimeout = stageTimeoutsConfig?.mergeMs != null
183
+ ? String(Math.round(stageTimeoutsConfig.mergeMs / 1000))
184
+ : '';
185
+ const originalAnalyzeRepoTimeout = analyzeRepoConfig?.analyzeMs != null
186
+ ? String(Math.round(analyzeRepoConfig.analyzeMs / 1000))
187
+ : '';
153
188
  function parseOptionalInt(value) {
154
189
  if (value === '')
155
190
  return undefined;
@@ -165,6 +200,12 @@ export function SettingsPageClient({ settings, shepHome, dbFileSize }) {
165
200
  }
166
201
  return { agent: result };
167
202
  }
203
+ function secondsToMs(val) {
204
+ if (val === undefined)
205
+ return undefined;
206
+ const n = parseOptionalInt(val);
207
+ return n != null ? n * 1000 : undefined;
208
+ }
168
209
  // Workflow helpers
169
210
  function buildWorkflowPayload(overrides = {}) {
170
211
  const timeoutSeconds = parseOptionalInt(overrides.ciTimeout ?? ciTimeout);
@@ -182,6 +223,17 @@ export function SettingsPageClient({ settings, shepHome, dbFileSize }) {
182
223
  ciMaxFixAttempts: parseOptionalInt(overrides.ciMaxFix ?? ciMaxFix),
183
224
  ciWatchTimeoutMs: timeoutSeconds != null ? timeoutSeconds * 1000 : undefined,
184
225
  ciLogMaxChars: parseOptionalInt(overrides.ciLogMax ?? ciLogMax),
226
+ stageTimeouts: {
227
+ analyzeMs: secondsToMs(overrides.analyzeTimeout ?? analyzeTimeout),
228
+ requirementsMs: secondsToMs(overrides.requirementsTimeout ?? requirementsTimeout),
229
+ researchMs: secondsToMs(overrides.researchTimeout ?? researchTimeout),
230
+ planMs: secondsToMs(overrides.planTimeout ?? planTimeout),
231
+ implementMs: secondsToMs(overrides.implementTimeout ?? implementTimeout),
232
+ mergeMs: secondsToMs(overrides.mergeTimeout ?? mergeTimeout),
233
+ },
234
+ analyzeRepoTimeouts: {
235
+ analyzeMs: secondsToMs(overrides.analyzeRepoTimeout ?? analyzeRepoTimeout),
236
+ },
185
237
  },
186
238
  };
187
239
  }
@@ -320,7 +372,28 @@ export function SettingsPageClient({ settings, shepHome, dbFileSize }) {
320
372
  label: 'CI security gates',
321
373
  href: 'https://github.com/shep-ai/cli/blob/main/specs/003-cicd-security-gates/spec.md',
322
374
  },
323
- ], children: "When a feature completes, the agent can watch CI and auto-fix failures. These limits prevent runaway retries and control how much log output is sent to the agent for analysis." })] }), _jsxs("div", { id: "section-notifications", className: "grid scroll-mt-18 grid-cols-1 gap-x-5 rounded-lg lg:grid-cols-[1fr_280px]", children: [_jsxs(SettingsSection, { icon: Bell, title: "Notifications", description: "How and when you get notified", testId: "notification-settings-section", children: [_jsx(SubsectionLabel, { children: "Channels" }), _jsx(SwitchRow, { label: "In-app", description: "Notifications inside the Shep UI", id: "notif-in-app", testId: "switch-in-app", checked: inApp, onChange: (v) => {
375
+ ], children: "When a feature completes, the agent can watch CI and auto-fix failures. These limits prevent runaway retries and control how much log output is sent to the agent for analysis." })] }), _jsxs("div", { id: "section-stage-timeouts", className: "grid scroll-mt-18 grid-cols-1 gap-x-5 rounded-lg lg:grid-cols-[1fr_280px]", children: [_jsxs(SettingsSection, { icon: Timer, title: "Stage Timeouts", description: "Maximum execution time per agent stage", testId: "stage-timeouts-settings-section", children: [_jsx(SubsectionLabel, { children: "Feature Agent" }), _jsx(SettingsRow, { label: "Analyze", description: "Repository analysis timeout", htmlFor: "timeout-analyze", children: _jsx(TimeoutSlider, { id: "timeout-analyze", testId: "timeout-analyze-input", value: analyzeTimeout, onChange: setAnalyzeTimeout, onBlur: () => {
376
+ if (analyzeTimeout !== originalAnalyzeTimeout)
377
+ save(buildWorkflowPayload({ analyzeTimeout }));
378
+ }, defaultSeconds: 1800 }) }), _jsx(SettingsRow, { label: "Requirements", description: "Requirements gathering timeout", htmlFor: "timeout-requirements", children: _jsx(TimeoutSlider, { id: "timeout-requirements", testId: "timeout-requirements-input", value: requirementsTimeout, onChange: setRequirementsTimeout, onBlur: () => {
379
+ if (requirementsTimeout !== originalRequirementsTimeout)
380
+ save(buildWorkflowPayload({ requirementsTimeout }));
381
+ }, defaultSeconds: 1800 }) }), _jsx(SettingsRow, { label: "Research", description: "Technical research timeout", htmlFor: "timeout-research", children: _jsx(TimeoutSlider, { id: "timeout-research", testId: "timeout-research-input", value: researchTimeout, onChange: setResearchTimeout, onBlur: () => {
382
+ if (researchTimeout !== originalResearchTimeout)
383
+ save(buildWorkflowPayload({ researchTimeout }));
384
+ }, defaultSeconds: 1800 }) }), _jsx(SettingsRow, { label: "Plan", description: "Implementation planning timeout", htmlFor: "timeout-plan", children: _jsx(TimeoutSlider, { id: "timeout-plan", testId: "timeout-plan-input", value: planTimeout, onChange: setPlanTimeout, onBlur: () => {
385
+ if (planTimeout !== originalPlanTimeout)
386
+ save(buildWorkflowPayload({ planTimeout }));
387
+ }, defaultSeconds: 1800 }) }), _jsx(SettingsRow, { label: "Implement", description: "Code implementation timeout", htmlFor: "timeout-implement", children: _jsx(TimeoutSlider, { id: "timeout-implement", testId: "timeout-implement-input", value: implementTimeout, onChange: setImplementTimeout, onBlur: () => {
388
+ if (implementTimeout !== originalImplementTimeout)
389
+ save(buildWorkflowPayload({ implementTimeout }));
390
+ }, defaultSeconds: 1800 }) }), _jsx(SettingsRow, { label: "Merge", description: "PR creation and merge timeout", htmlFor: "timeout-merge", children: _jsx(TimeoutSlider, { id: "timeout-merge", testId: "timeout-merge-input", value: mergeTimeout, onChange: setMergeTimeout, onBlur: () => {
391
+ if (mergeTimeout !== originalMergeTimeout)
392
+ save(buildWorkflowPayload({ mergeTimeout }));
393
+ }, defaultSeconds: 1800 }) }), _jsx(SubsectionLabel, { children: "Analyze Repository Agent" }), _jsx(SettingsRow, { label: "Analyze", description: "Repository analysis timeout", htmlFor: "timeout-analyze-repo", children: _jsx(TimeoutSlider, { id: "timeout-analyze-repo", testId: "timeout-analyze-repo-input", value: analyzeRepoTimeout, onChange: setAnalyzeRepoTimeout, onBlur: () => {
394
+ if (analyzeRepoTimeout !== originalAnalyzeRepoTimeout)
395
+ save(buildWorkflowPayload({ analyzeRepoTimeout }));
396
+ }, defaultSeconds: 600 }) })] }), _jsx(SectionHint, { children: "Each agent has independently configurable stage timeouts. When a stage exceeds its timeout, the agent is terminated. Longer timeouts are useful for complex implementations. Feature agent defaults to 30 minutes per stage. Analyze repository agent defaults to 10 minutes." })] }), _jsxs("div", { id: "section-notifications", className: "grid scroll-mt-18 grid-cols-1 gap-x-5 rounded-lg lg:grid-cols-[1fr_280px]", children: [_jsxs(SettingsSection, { icon: Bell, title: "Notifications", description: "How and when you get notified", testId: "notification-settings-section", children: [_jsx(SubsectionLabel, { children: "Channels" }), _jsx(SwitchRow, { label: "In-app", description: "Notifications inside the Shep UI", id: "notif-in-app", testId: "switch-in-app", checked: inApp, onChange: (v) => {
324
397
  setInApp(v);
325
398
  save(buildNotificationPayload({ inApp: v }));
326
399
  } }), _jsx(SwitchRow, { label: "Browser", description: "Push notifications via the browser", id: "notif-browser", testId: "switch-browser", checked: browser, onChange: (v) => {
@@ -13,4 +13,5 @@ type Story = StoryObj<typeof meta>;
13
13
  export declare const Default: Story;
14
14
  export declare const AllSections: Story;
15
15
  export declare const EvidenceEnabled: Story;
16
+ export declare const CustomTimeouts: Story;
16
17
  //# sourceMappingURL=settings-page-client.stories.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"settings-page-client.stories.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/features/settings/settings-page-client.stories.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAQ,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AACvD,OAAO,EAAE,kBAAkB,EAAE,MAAM,wBAAwB,CAAC;AAM5D,QAAA,MAAM,IAAI;;;;;;;CAOiC,CAAC;AAE5C,eAAe,IAAI,CAAC;AACpB,KAAK,KAAK,GAAG,QAAQ,CAAC,OAAO,IAAI,CAAC,CAAC;AAEnC,eAAO,MAAM,OAAO,EAAE,KAMrB,CAAC;AAEF,eAAO,MAAM,WAAW,EAAE,KAkBzB,CAAC;AAEF,eAAO,MAAM,eAAe,EAAE,KAa7B,CAAC"}
1
+ {"version":3,"file":"settings-page-client.stories.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/features/settings/settings-page-client.stories.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAQ,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AACvD,OAAO,EAAE,kBAAkB,EAAE,MAAM,wBAAwB,CAAC;AAM5D,QAAA,MAAM,IAAI;;;;;;;CAOiC,CAAC;AAE5C,eAAe,IAAI,CAAC;AACpB,KAAK,KAAK,GAAG,QAAQ,CAAC,OAAO,IAAI,CAAC,CAAC;AAEnC,eAAO,MAAM,OAAO,EAAE,KAMrB,CAAC;AAEF,eAAO,MAAM,WAAW,EAAE,KAkBzB,CAAC;AAEF,eAAO,MAAM,eAAe,EAAE,KAa7B,CAAC;AAEF,eAAO,MAAM,cAAc,EAAE,KAsB5B,CAAC"}
@@ -51,3 +51,26 @@ export const EvidenceEnabled = {
51
51
  dbFileSize: '2.4 MB',
52
52
  },
53
53
  };
54
+ export const CustomTimeouts = {
55
+ args: {
56
+ settings: {
57
+ ...defaultSettings,
58
+ workflow: {
59
+ ...defaultSettings.workflow,
60
+ stageTimeouts: {
61
+ analyzeMs: 300000,
62
+ requirementsMs: 600000,
63
+ researchMs: 900000,
64
+ planMs: 600000,
65
+ implementMs: 1800000,
66
+ mergeMs: 600000,
67
+ },
68
+ analyzeRepoTimeouts: {
69
+ analyzeMs: 300000,
70
+ },
71
+ },
72
+ },
73
+ shepHome: '/home/user/.shep',
74
+ dbFileSize: '2.4 MB',
75
+ },
76
+ };
@@ -0,0 +1,11 @@
1
+ export interface TimeoutSliderProps {
2
+ id: string;
3
+ testId: string;
4
+ /** Current value in seconds (as a string for form compatibility) */
5
+ value: string;
6
+ onChange: (value: string) => void;
7
+ onBlur: () => void;
8
+ defaultSeconds?: number;
9
+ }
10
+ export declare function TimeoutSlider({ id, testId, value, onChange, onBlur, defaultSeconds, }: TimeoutSliderProps): import("react/jsx-runtime").JSX.Element;
11
+ //# sourceMappingURL=timeout-slider.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"timeout-slider.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/features/settings/timeout-slider.tsx"],"names":[],"mappings":"AAwCA,MAAM,WAAW,kBAAkB;IACjC,EAAE,EAAE,MAAM,CAAC;IACX,MAAM,EAAE,MAAM,CAAC;IACf,oEAAoE;IACpE,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IAClC,MAAM,EAAE,MAAM,IAAI,CAAC;IACnB,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB;AAWD,wBAAgB,aAAa,CAAC,EAC5B,EAAE,EACF,MAAM,EACN,KAAK,EACL,QAAQ,EACR,MAAM,EACN,cAAqB,GACtB,EAAE,kBAAkB,2CAyCpB"}
@@ -0,0 +1,63 @@
1
+ 'use client';
2
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
+ import { useState, useCallback } from 'react';
4
+ import { Slider } from '../../ui/slider.js';
5
+ /** Fixed duration presets in seconds — slider snaps to these values */
6
+ const PRESETS = [
7
+ 60, // 1m
8
+ 120, // 2m
9
+ 300, // 5m
10
+ 600, // 10m
11
+ 900, // 15m
12
+ 1800, // 30m
13
+ 2700, // 45m
14
+ 3600, // 1h
15
+ 7200, // 2h
16
+ 10800, // 3h
17
+ 14400, // 4h
18
+ 21600, // 6h
19
+ 28800, // 8h
20
+ 43200, // 12h
21
+ 86400, // 24h
22
+ ];
23
+ const SLIDER_MAX = PRESETS.length - 1;
24
+ /** Find the closest preset index for a given seconds value */
25
+ function secondsToIndex(seconds) {
26
+ let closest = 0;
27
+ let minDiff = Math.abs(seconds - PRESETS[0]);
28
+ for (let i = 1; i < PRESETS.length; i++) {
29
+ const diff = Math.abs(seconds - PRESETS[i]);
30
+ if (diff < minDiff) {
31
+ minDiff = diff;
32
+ closest = i;
33
+ }
34
+ }
35
+ return closest;
36
+ }
37
+ function formatDuration(totalSeconds) {
38
+ const hours = Math.floor(totalSeconds / 3600);
39
+ const minutes = Math.round((totalSeconds % 3600) / 60);
40
+ if (hours === 0)
41
+ return `${minutes}m`;
42
+ if (minutes === 0)
43
+ return `${hours}h`;
44
+ return `${hours}h ${minutes}m`;
45
+ }
46
+ export function TimeoutSlider({ id, testId, value, onChange, onBlur, defaultSeconds = 1800, }) {
47
+ const numValue = value === '' ? defaultSeconds : parseInt(value, 10);
48
+ const seconds = numValue || defaultSeconds;
49
+ // Local index state prevents snap-back during drag — updates immediately
50
+ // without waiting for the parent to re-render with the new value.
51
+ const [localIndex, setLocalIndex] = useState(() => secondsToIndex(seconds));
52
+ // Sync from props only when the resolved index actually differs
53
+ // (e.g. external reset or server push). Avoids overwriting during drag.
54
+ const propsIndex = secondsToIndex(seconds);
55
+ if (propsIndex !== localIndex && PRESETS[localIndex] !== seconds) {
56
+ setLocalIndex(propsIndex);
57
+ }
58
+ const handleChange = useCallback(([i]) => {
59
+ setLocalIndex(i);
60
+ onChange(String(PRESETS[i]));
61
+ }, [onChange]);
62
+ return (_jsxs("div", { className: "flex w-55 items-center gap-2", children: [_jsx(Slider, { id: id, "data-testid": testId, min: 0, max: SLIDER_MAX, step: 1, value: [localIndex], onValueChange: handleChange, onValueCommit: () => onBlur(), className: "min-w-0 flex-1" }), _jsx("span", { className: "text-muted-foreground shrink-0 text-right text-xs tabular-nums", children: formatDuration(PRESETS[localIndex]) })] }));
63
+ }
@@ -0,0 +1,10 @@
1
+ import type { Meta, StoryObj } from '@storybook/react';
2
+ import { TimeoutSlider } from './timeout-slider.js';
3
+ declare const meta: Meta<typeof TimeoutSlider>;
4
+ export default meta;
5
+ type Story = StoryObj<typeof TimeoutSlider>;
6
+ export declare const Default: Story;
7
+ export declare const ShortTimeout: Story;
8
+ export declare const LongTimeout: Story;
9
+ export declare const AllStages: Story;
10
+ //# sourceMappingURL=timeout-slider.stories.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"timeout-slider.stories.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/features/settings/timeout-slider.stories.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AACvD,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAEjD,QAAA,MAAM,IAAI,EAAE,IAAI,CAAC,OAAO,aAAa,CAGpC,CAAC;AAEF,eAAe,IAAI,CAAC;AACpB,KAAK,KAAK,GAAG,QAAQ,CAAC,OAAO,aAAa,CAAC,CAAC;AA6B5C,eAAO,MAAM,OAAO,EAAE,KAErB,CAAC;AAEF,eAAO,MAAM,YAAY,EAAE,KAE1B,CAAC;AAEF,eAAO,MAAM,WAAW,EAAE,KAEzB,CAAC;AAEF,eAAO,MAAM,SAAS,EAAE,KAWvB,CAAC"}
@@ -0,0 +1,24 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { useState } from 'react';
3
+ import { TimeoutSlider } from './timeout-slider.js';
4
+ const meta = {
5
+ title: 'Features/Settings/TimeoutSlider',
6
+ component: TimeoutSlider,
7
+ };
8
+ export default meta;
9
+ function TimeoutSliderDemo({ label = 'Analyze', defaultSeconds = 1800, }) {
10
+ const [value, setValue] = useState(String(defaultSeconds));
11
+ return (_jsx("div", { style: { maxWidth: 500 }, children: _jsxs("div", { style: { display: 'flex', alignItems: 'center', justifyContent: 'space-between', gap: 16 }, children: [_jsx("span", { style: { fontSize: 14 }, children: label }), _jsx(TimeoutSlider, { id: "demo-slider", testId: "demo-slider-input", value: value, onChange: setValue, onBlur: () => undefined, defaultSeconds: defaultSeconds })] }) }));
12
+ }
13
+ export const Default = {
14
+ render: () => _jsx(TimeoutSliderDemo, {}),
15
+ };
16
+ export const ShortTimeout = {
17
+ render: () => _jsx(TimeoutSliderDemo, { label: "Analyze Repo", defaultSeconds: 600 }),
18
+ };
19
+ export const LongTimeout = {
20
+ render: () => _jsx(TimeoutSliderDemo, { label: "Implement", defaultSeconds: 5400 }),
21
+ };
22
+ export const AllStages = {
23
+ render: () => (_jsxs("div", { style: { maxWidth: 500, display: 'flex', flexDirection: 'column', gap: 16 }, children: [_jsx(TimeoutSliderDemo, { label: "Analyze", defaultSeconds: 1800 }), _jsx(TimeoutSliderDemo, { label: "Requirements", defaultSeconds: 1800 }), _jsx(TimeoutSliderDemo, { label: "Research", defaultSeconds: 1800 }), _jsx(TimeoutSliderDemo, { label: "Plan", defaultSeconds: 1800 }), _jsx(TimeoutSliderDemo, { label: "Implement", defaultSeconds: 1800 }), _jsx(TimeoutSliderDemo, { label: "Merge", defaultSeconds: 1800 })] })),
24
+ };
@@ -1 +1 @@
1
- {"version":3,"file":"workflow-settings-section.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/features/settings/workflow-settings-section.tsx"],"names":[],"mappings":"AAWA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,sCAAsC,CAAC;AAE3E,MAAM,WAAW,4BAA4B;IAC3C,QAAQ,EAAE,cAAc,CAAC;CAC1B;AAED,wBAAgB,uBAAuB,CAAC,EAAE,QAAQ,EAAE,EAAE,4BAA4B,2CAgQjF"}
1
+ {"version":3,"file":"workflow-settings-section.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/features/settings/workflow-settings-section.tsx"],"names":[],"mappings":"AAYA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,sCAAsC,CAAC;AAE3E,MAAM,WAAW,4BAA4B;IAC3C,QAAQ,EAAE,cAAc,CAAC;CAC1B;AAED,wBAAgB,uBAAuB,CAAC,EAAE,QAAQ,EAAE,EAAE,4BAA4B,2CA0ajF"}