@shepai/cli 1.176.0 → 1.177.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 (192) hide show
  1. package/dist/eslint.config.mjs +2 -0
  2. package/dist/packages/core/src/application/ports/output/services/i-browser-opener.d.ts +28 -0
  3. package/dist/packages/core/src/application/ports/output/services/i-browser-opener.d.ts.map +1 -0
  4. package/dist/packages/core/src/application/ports/output/services/i-browser-opener.js +13 -0
  5. package/dist/packages/core/src/application/ports/output/services/i-desktop-notifier.d.ts +29 -0
  6. package/dist/packages/core/src/application/ports/output/services/i-desktop-notifier.d.ts.map +1 -0
  7. package/dist/packages/core/src/application/ports/output/services/i-desktop-notifier.js +13 -0
  8. package/dist/packages/core/src/application/ports/output/services/index.d.ts +2 -0
  9. package/dist/packages/core/src/application/ports/output/services/index.d.ts.map +1 -1
  10. package/dist/packages/core/src/infrastructure/di/container.d.ts.map +1 -1
  11. package/dist/packages/core/src/infrastructure/di/container.js +5 -0
  12. package/dist/packages/core/src/infrastructure/services/agents/feature-agent/feature-agent-graph.d.ts.map +1 -1
  13. package/dist/packages/core/src/infrastructure/services/agents/feature-agent/feature-agent-graph.js +20 -6
  14. package/dist/packages/core/src/infrastructure/services/agents/feature-agent/feature-agent-worker.d.ts.map +1 -1
  15. package/dist/packages/core/src/infrastructure/services/agents/feature-agent/feature-agent-worker.js +27 -4
  16. package/dist/packages/core/src/infrastructure/services/browser-opener.service.d.ts +2 -1
  17. package/dist/packages/core/src/infrastructure/services/browser-opener.service.d.ts.map +1 -1
  18. package/dist/packages/core/src/infrastructure/services/notifications/desktop-notifier.d.ts +2 -1
  19. package/dist/packages/core/src/infrastructure/services/notifications/desktop-notifier.d.ts.map +1 -1
  20. package/dist/src/presentation/cli/commands/daemon/start-daemon.d.ts +1 -1
  21. package/dist/src/presentation/cli/commands/daemon/start-daemon.js +2 -3
  22. package/dist/src/presentation/cli/commands/ui.command.js +1 -2
  23. package/dist/tsconfig.build.tsbuildinfo +1 -1
  24. package/package.json +10 -2
  25. package/web/.next/BUILD_ID +1 -1
  26. package/web/.next/build-manifest.json +2 -2
  27. package/web/.next/fallback-build-manifest.json +2 -2
  28. package/web/.next/prerender-manifest.json +3 -3
  29. package/web/.next/required-server-files.js +2 -2
  30. package/web/.next/required-server-files.json +2 -2
  31. package/web/.next/server/app/(dashboard)/@drawer/adopt/page/server-reference-manifest.json +29 -29
  32. package/web/.next/server/app/(dashboard)/@drawer/adopt/page.js.nft.json +1 -1
  33. package/web/.next/server/app/(dashboard)/@drawer/adopt/page_client-reference-manifest.js +1 -1
  34. package/web/.next/server/app/(dashboard)/@drawer/chat/page/server-reference-manifest.json +27 -27
  35. package/web/.next/server/app/(dashboard)/@drawer/chat/page.js.nft.json +1 -1
  36. package/web/.next/server/app/(dashboard)/@drawer/chat/page_client-reference-manifest.js +1 -1
  37. package/web/.next/server/app/(dashboard)/@drawer/create/page/server-reference-manifest.json +30 -30
  38. package/web/.next/server/app/(dashboard)/@drawer/create/page.js.nft.json +1 -1
  39. package/web/.next/server/app/(dashboard)/@drawer/create/page_client-reference-manifest.js +1 -1
  40. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/[tab]/page/server-reference-manifest.json +38 -38
  41. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/[tab]/page.js.nft.json +1 -1
  42. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/[tab]/page_client-reference-manifest.js +1 -1
  43. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page/server-reference-manifest.json +38 -38
  44. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page.js.nft.json +1 -1
  45. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page_client-reference-manifest.js +1 -1
  46. package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/[tab]/page/server-reference-manifest.json +28 -28
  47. package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/[tab]/page.js.nft.json +1 -1
  48. package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/[tab]/page_client-reference-manifest.js +1 -1
  49. package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page/server-reference-manifest.json +28 -28
  50. package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page.js.nft.json +1 -1
  51. package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page_client-reference-manifest.js +1 -1
  52. package/web/.next/server/app/(dashboard)/chat/page/server-reference-manifest.json +27 -27
  53. package/web/.next/server/app/(dashboard)/chat/page.js.nft.json +1 -1
  54. package/web/.next/server/app/(dashboard)/chat/page_client-reference-manifest.js +1 -1
  55. package/web/.next/server/app/(dashboard)/create/page/server-reference-manifest.json +30 -30
  56. package/web/.next/server/app/(dashboard)/create/page.js.nft.json +1 -1
  57. package/web/.next/server/app/(dashboard)/create/page_client-reference-manifest.js +1 -1
  58. package/web/.next/server/app/(dashboard)/feature/[featureId]/[tab]/page/server-reference-manifest.json +38 -38
  59. package/web/.next/server/app/(dashboard)/feature/[featureId]/[tab]/page.js.nft.json +1 -1
  60. package/web/.next/server/app/(dashboard)/feature/[featureId]/[tab]/page_client-reference-manifest.js +1 -1
  61. package/web/.next/server/app/(dashboard)/feature/[featureId]/page/server-reference-manifest.json +38 -38
  62. package/web/.next/server/app/(dashboard)/feature/[featureId]/page.js.nft.json +1 -1
  63. package/web/.next/server/app/(dashboard)/feature/[featureId]/page_client-reference-manifest.js +1 -1
  64. package/web/.next/server/app/(dashboard)/page/server-reference-manifest.json +27 -27
  65. package/web/.next/server/app/(dashboard)/page.js.nft.json +1 -1
  66. package/web/.next/server/app/(dashboard)/page_client-reference-manifest.js +1 -1
  67. package/web/.next/server/app/(dashboard)/repository/[repositoryId]/[tab]/page/server-reference-manifest.json +28 -28
  68. package/web/.next/server/app/(dashboard)/repository/[repositoryId]/[tab]/page.js.nft.json +1 -1
  69. package/web/.next/server/app/(dashboard)/repository/[repositoryId]/[tab]/page_client-reference-manifest.js +1 -1
  70. package/web/.next/server/app/(dashboard)/repository/[repositoryId]/page/server-reference-manifest.json +28 -28
  71. package/web/.next/server/app/(dashboard)/repository/[repositoryId]/page.js.nft.json +1 -1
  72. package/web/.next/server/app/(dashboard)/repository/[repositoryId]/page_client-reference-manifest.js +1 -1
  73. package/web/.next/server/app/_global-error.html +2 -2
  74. package/web/.next/server/app/_global-error.rsc +1 -1
  75. package/web/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +1 -1
  76. package/web/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  77. package/web/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  78. package/web/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  79. package/web/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  80. package/web/.next/server/app/_not-found/page/server-reference-manifest.json +6 -6
  81. package/web/.next/server/app/_not-found/page.js.nft.json +1 -1
  82. package/web/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  83. package/web/.next/server/app/features/page/server-reference-manifest.json +6 -6
  84. package/web/.next/server/app/features/page.js.nft.json +1 -1
  85. package/web/.next/server/app/features/page_client-reference-manifest.js +1 -1
  86. package/web/.next/server/app/settings/page/server-reference-manifest.json +9 -9
  87. package/web/.next/server/app/settings/page.js.nft.json +1 -1
  88. package/web/.next/server/app/settings/page_client-reference-manifest.js +1 -1
  89. package/web/.next/server/app/skills/page/server-reference-manifest.json +13 -13
  90. package/web/.next/server/app/skills/page.js.nft.json +1 -1
  91. package/web/.next/server/app/skills/page_client-reference-manifest.js +1 -1
  92. package/web/.next/server/app/tools/page/server-reference-manifest.json +11 -11
  93. package/web/.next/server/app/tools/page.js.nft.json +1 -1
  94. package/web/.next/server/app/tools/page_client-reference-manifest.js +1 -1
  95. package/web/.next/server/app/version/page/server-reference-manifest.json +6 -6
  96. package/web/.next/server/app/version/page.js.nft.json +1 -1
  97. package/web/.next/server/app/version/page_client-reference-manifest.js +1 -1
  98. package/web/.next/server/chunks/[root-of-the-server]__a402b567._.js +1 -1
  99. package/web/.next/server/chunks/ssr/744ca_web__next-internal_server_app_(dashboard)_@drawer_adopt_page_actions_ad0071c9.js +1 -1
  100. package/web/.next/server/chunks/ssr/744ca_web__next-internal_server_app_(dashboard)_@drawer_adopt_page_actions_ad0071c9.js.map +1 -1
  101. package/web/.next/server/chunks/ssr/744ca_web__next-internal_server_app_(dashboard)_@drawer_chat_page_actions_90d98b2b.js +1 -1
  102. package/web/.next/server/chunks/ssr/744ca_web__next-internal_server_app_(dashboard)_@drawer_chat_page_actions_90d98b2b.js.map +1 -1
  103. package/web/.next/server/chunks/ssr/744ca_web__next-internal_server_app_(dashboard)_chat_page_actions_d3828105.js +1 -1
  104. package/web/.next/server/chunks/ssr/744ca_web__next-internal_server_app_(dashboard)_chat_page_actions_d3828105.js.map +1 -1
  105. package/web/.next/server/chunks/ssr/744ca_web_components_common_control-center-drawer_create-drawer-client_tsx_5e26fc0a._.js +1 -1
  106. package/web/.next/server/chunks/ssr/744ca_web_components_common_control-center-drawer_create-drawer-client_tsx_5e26fc0a._.js.map +1 -1
  107. package/web/.next/server/chunks/ssr/744ca_web_components_common_control-center-drawer_feature-drawer-client_tsx_e9755fc8._.js +2 -2
  108. package/web/.next/server/chunks/ssr/744ca_web_components_common_control-center-drawer_feature-drawer-client_tsx_e9755fc8._.js.map +1 -1
  109. package/web/.next/server/chunks/ssr/[root-of-the-server]__1cd4327c._.js +1 -1
  110. package/web/.next/server/chunks/ssr/[root-of-the-server]__1cd4327c._.js.map +1 -1
  111. package/web/.next/server/chunks/ssr/[root-of-the-server]__1f389e5d._.js +1 -1
  112. package/web/.next/server/chunks/ssr/[root-of-the-server]__1f389e5d._.js.map +1 -1
  113. package/web/.next/server/chunks/ssr/[root-of-the-server]__357d99f9._.js +1 -1
  114. package/web/.next/server/chunks/ssr/[root-of-the-server]__51ec77a8._.js +1 -1
  115. package/web/.next/server/chunks/ssr/[root-of-the-server]__51ec77a8._.js.map +1 -1
  116. package/web/.next/server/chunks/ssr/[root-of-the-server]__540c615f._.js +2 -2
  117. package/web/.next/server/chunks/ssr/[root-of-the-server]__66047a1b._.js +1 -1
  118. package/web/.next/server/chunks/ssr/[root-of-the-server]__66047a1b._.js.map +1 -1
  119. package/web/.next/server/chunks/ssr/[root-of-the-server]__6c7d3936._.js +1 -1
  120. package/web/.next/server/chunks/ssr/[root-of-the-server]__6c7d3936._.js.map +1 -1
  121. package/web/.next/server/chunks/ssr/[root-of-the-server]__a932cd3a._.js +1 -1
  122. package/web/.next/server/chunks/ssr/[root-of-the-server]__a932cd3a._.js.map +1 -1
  123. package/web/.next/server/chunks/ssr/[root-of-the-server]__aa72e794._.js +1 -1
  124. package/web/.next/server/chunks/ssr/[root-of-the-server]__aa72e794._.js.map +1 -1
  125. package/web/.next/server/chunks/ssr/[root-of-the-server]__b7b96453._.js +1 -1
  126. package/web/.next/server/chunks/ssr/[root-of-the-server]__b7b96453._.js.map +1 -1
  127. package/web/.next/server/chunks/ssr/_05c23ad9._.js +1 -1
  128. package/web/.next/server/chunks/ssr/_05c23ad9._.js.map +1 -1
  129. package/web/.next/server/chunks/ssr/_16eb4fec._.js +1 -1
  130. package/web/.next/server/chunks/ssr/_16eb4fec._.js.map +1 -1
  131. package/web/.next/server/chunks/ssr/{_8f0d3f07._.js → _19a779c6._.js} +2 -2
  132. package/web/.next/server/chunks/ssr/{_8f0d3f07._.js.map → _19a779c6._.js.map} +1 -1
  133. package/web/.next/server/chunks/ssr/{_388d1127._.js → _3fc2374c._.js} +2 -2
  134. package/web/.next/server/chunks/ssr/{_388d1127._.js.map → _3fc2374c._.js.map} +1 -1
  135. package/web/.next/server/chunks/ssr/_4cbb7f95._.js +1 -1
  136. package/web/.next/server/chunks/ssr/_4cbb7f95._.js.map +1 -1
  137. package/web/.next/server/chunks/ssr/_56b9d60f._.js +1 -1
  138. package/web/.next/server/chunks/ssr/_56b9d60f._.js.map +1 -1
  139. package/web/.next/server/chunks/ssr/{_98d94927._.js → _57b1af27._.js} +2 -2
  140. package/web/.next/server/chunks/ssr/{_98d94927._.js.map → _57b1af27._.js.map} +1 -1
  141. package/web/.next/server/chunks/ssr/_6abfa39e._.js +1 -1
  142. package/web/.next/server/chunks/ssr/_f8c55130._.js +1 -1
  143. package/web/.next/server/chunks/ssr/b1a17_presentation_web_components_features_settings_settings-page-client_tsx_6ed9d5f8._.js +1 -1
  144. package/web/.next/server/chunks/ssr/b1a17_presentation_web_components_features_settings_settings-page-client_tsx_6ed9d5f8._.js.map +1 -1
  145. package/web/.next/server/chunks/ssr/f3a1f_components_common_control-center-drawer_repository-drawer-client_tsx_39a00c03._.js +1 -1
  146. package/web/.next/server/chunks/ssr/f3a1f_components_common_control-center-drawer_repository-drawer-client_tsx_39a00c03._.js.map +1 -1
  147. package/web/.next/server/chunks/ssr/src_presentation_web_17d39233._.js +1 -1
  148. package/web/.next/server/chunks/ssr/src_presentation_web_17d39233._.js.map +1 -1
  149. package/web/.next/server/chunks/ssr/src_presentation_web_54b02639._.js +2 -2
  150. package/web/.next/server/chunks/ssr/src_presentation_web_54b02639._.js.map +1 -1
  151. package/web/.next/server/chunks/ssr/src_presentation_web_7b7b9e3b._.js +2 -2
  152. package/web/.next/server/chunks/ssr/src_presentation_web_7b7b9e3b._.js.map +1 -1
  153. package/web/.next/server/chunks/ssr/src_presentation_web_807cba76._.js +1 -1
  154. package/web/.next/server/chunks/ssr/src_presentation_web_807cba76._.js.map +1 -1
  155. package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_(dashboard)_page_actions_90b5e66e.js +1 -1
  156. package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_(dashboard)_page_actions_90b5e66e.js.map +1 -1
  157. package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_skills_page_actions_4ce30db7.js +1 -1
  158. package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_skills_page_actions_4ce30db7.js.map +1 -1
  159. package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_tools_page_actions_e4032193.js +1 -1
  160. package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_tools_page_actions_e4032193.js.map +1 -1
  161. package/web/.next/server/chunks/ssr/src_presentation_web_app_actions_open-ide_ts_baaca5d5._.js +1 -1
  162. package/web/.next/server/chunks/ssr/src_presentation_web_components_895e5bfa._.js +1 -1
  163. package/web/.next/server/chunks/ssr/src_presentation_web_components_895e5bfa._.js.map +1 -1
  164. package/web/.next/server/chunks/ssr/src_presentation_web_components_features_control-center_7ac3562e._.js +1 -1
  165. package/web/.next/server/chunks/ssr/src_presentation_web_components_features_control-center_7ac3562e._.js.map +1 -1
  166. package/web/.next/server/chunks/ssr/src_presentation_web_components_features_skills_8a174cac._.js +1 -1
  167. package/web/.next/server/chunks/ssr/src_presentation_web_components_features_skills_8a174cac._.js.map +1 -1
  168. package/web/.next/server/chunks/ssr/src_presentation_web_e1cd1869._.js +1 -1
  169. package/web/.next/server/chunks/ssr/src_presentation_web_e1cd1869._.js.map +1 -1
  170. package/web/.next/server/chunks/ssr/src_presentation_web_e3a30e30._.js +1 -1
  171. package/web/.next/server/chunks/ssr/src_presentation_web_e3a30e30._.js.map +1 -1
  172. package/web/.next/server/pages/500.html +2 -2
  173. package/web/.next/server/server-reference-manifest.js +1 -1
  174. package/web/.next/server/server-reference-manifest.json +50 -50
  175. package/web/.next/static/chunks/{302f474e4978cc80.js → 0a706f8508eae0a8.js} +3 -3
  176. package/web/.next/static/chunks/{eda9ee3c22b71a69.js → 0d0e2661bd167e0f.js} +1 -1
  177. package/web/.next/static/chunks/{f17d2d0279b8db35.js → 18f429029d702545.js} +1 -1
  178. package/web/.next/static/chunks/{eab3d361f7a24510.js → 3fc5b2287f192799.js} +1 -1
  179. package/web/.next/static/chunks/{4ff21d16947ec853.js → 4c20d4cd4786a0c8.js} +1 -1
  180. package/web/.next/static/chunks/{236744ff71b1aadf.js → 77d6506c7d1f711f.js} +1 -1
  181. package/web/.next/static/chunks/{2cfc6022d74e2716.js → 829d2f8ef2715f2f.js} +2 -2
  182. package/web/.next/static/chunks/{885bb8fc631bf477.js → b5a916fec4cdc897.js} +1 -1
  183. package/web/.next/static/chunks/{71a07df9dcb42227.js → b5d355eb59916926.js} +2 -2
  184. package/web/.next/static/chunks/{6304540c7cf2b46a.js → c0e4cd44851a9293.js} +1 -1
  185. package/web/.next/static/chunks/ddd34e939acc204f.js +1 -0
  186. package/web/.next/static/chunks/{afa7e5d2a48cabc7.js → eaa1b979d63d322b.js} +1 -1
  187. package/web/.next/static/chunks/{476873a9bac35ec8.js → ef897f150084ef85.js} +1 -1
  188. package/web/.next/static/chunks/{0ffb3738269e15c3.js → efd57b6ffc7cbd54.js} +1 -1
  189. package/web/.next/static/chunks/626277ca9a4cc477.js +0 -1
  190. /package/web/.next/static/{36ONyC02R4wfFe7iWMQLU → UZ2czjiAnEl1RF-HTzHyA}/_buildManifest.js +0 -0
  191. /package/web/.next/static/{36ONyC02R4wfFe7iWMQLU → UZ2czjiAnEl1RF-HTzHyA}/_clientMiddlewareManifest.json +0 -0
  192. /package/web/.next/static/{36ONyC02R4wfFe7iWMQLU → UZ2czjiAnEl1RF-HTzHyA}/_ssgManifest.js +0 -0
@@ -27,6 +27,8 @@ export default tseslint.config(
27
27
  ignores: [
28
28
  // Build outputs
29
29
  'dist/**',
30
+ 'packages/*/dist/**',
31
+ 'packages/*/release/**',
30
32
  'build/**',
31
33
  'web/**',
32
34
  '**/.next/**',
@@ -0,0 +1,28 @@
1
+ /**
2
+ * Browser Opener Interface
3
+ *
4
+ * Output port for opening URLs in the user's default browser.
5
+ * Infrastructure layer provides concrete implementations:
6
+ * - BrowserOpenerService — default, uses platform-specific commands (open, xdg-open, cmd start)
7
+ * - ElectronBrowserOpener — used when running inside Electron (focuses BrowserWindow or shell.openExternal)
8
+ *
9
+ * Following Clean Architecture:
10
+ * - Application layer depends on this interface
11
+ * - Infrastructure layer provides concrete implementations
12
+ */
13
+ /**
14
+ * Port interface for opening URLs in the user's browser or app window.
15
+ *
16
+ * Implementations must:
17
+ * - Handle errors gracefully (log, never throw)
18
+ * - Degrade gracefully in non-interactive environments (CI, piped I/O)
19
+ */
20
+ export interface IBrowserOpener {
21
+ /**
22
+ * Open a URL in the user's default browser or application window.
23
+ *
24
+ * @param url - The URL to open
25
+ */
26
+ open(url: string): void;
27
+ }
28
+ //# sourceMappingURL=i-browser-opener.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"i-browser-opener.d.ts","sourceRoot":"","sources":["../../../../../../../../packages/core/src/application/ports/output/services/i-browser-opener.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH;;;;;;GAMG;AACH,MAAM,WAAW,cAAc;IAC7B;;;;OAIG;IACH,IAAI,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAAC;CACzB"}
@@ -0,0 +1,13 @@
1
+ /**
2
+ * Browser Opener Interface
3
+ *
4
+ * Output port for opening URLs in the user's default browser.
5
+ * Infrastructure layer provides concrete implementations:
6
+ * - BrowserOpenerService — default, uses platform-specific commands (open, xdg-open, cmd start)
7
+ * - ElectronBrowserOpener — used when running inside Electron (focuses BrowserWindow or shell.openExternal)
8
+ *
9
+ * Following Clean Architecture:
10
+ * - Application layer depends on this interface
11
+ * - Infrastructure layer provides concrete implementations
12
+ */
13
+ export {};
@@ -0,0 +1,29 @@
1
+ /**
2
+ * Desktop Notifier Interface
3
+ *
4
+ * Output port for sending native OS desktop notifications.
5
+ * Infrastructure layer provides concrete implementations:
6
+ * - DesktopNotifier (node-notifier) — default for CLI/web contexts
7
+ * - ElectronDesktopNotifier — used when running inside Electron
8
+ *
9
+ * Following Clean Architecture:
10
+ * - Application layer depends on this interface
11
+ * - Infrastructure layer provides concrete implementations
12
+ */
13
+ /**
14
+ * Port interface for sending native OS desktop notifications.
15
+ *
16
+ * Implementations must:
17
+ * - Sanitize input to prevent injection (shell metacharacters, length limits)
18
+ * - Handle errors gracefully (log, never throw)
19
+ */
20
+ export interface IDesktopNotifier {
21
+ /**
22
+ * Send a native OS desktop notification.
23
+ *
24
+ * @param title - Notification title
25
+ * @param body - Notification body text
26
+ */
27
+ send(title: string, body: string): void;
28
+ }
29
+ //# sourceMappingURL=i-desktop-notifier.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"i-desktop-notifier.d.ts","sourceRoot":"","sources":["../../../../../../../../packages/core/src/application/ports/output/services/i-desktop-notifier.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH;;;;;;GAMG;AACH,MAAM,WAAW,gBAAgB;IAC/B;;;;;OAKG;IACH,IAAI,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;CACzC"}
@@ -0,0 +1,13 @@
1
+ /**
2
+ * Desktop Notifier Interface
3
+ *
4
+ * Output port for sending native OS desktop notifications.
5
+ * Infrastructure layer provides concrete implementations:
6
+ * - DesktopNotifier (node-notifier) — default for CLI/web contexts
7
+ * - ElectronDesktopNotifier — used when running inside Electron
8
+ *
9
+ * Following Clean Architecture:
10
+ * - Application layer depends on this interface
11
+ * - Infrastructure layer provides concrete implementations
12
+ */
13
+ export {};
@@ -21,4 +21,6 @@ export type { IGitHubRepositoryService, GitHubRepo, GitHubOrganization, ListUser
21
21
  export { GitHubAuthError, GitHubCloneError, GitHubUrlParseError, GitHubRepoListError, } from './github-repository-service.interface.js';
22
22
  export type { IInteractiveSessionService, StreamChunk, UnsubscribeFn, ChatState, } from './interactive-session-service.interface.js';
23
23
  export type { ISkillInjectorService, SkillInjectionResult } from './skill-injector.interface.js';
24
+ export type { IDesktopNotifier } from './i-desktop-notifier.js';
25
+ export type { IBrowserOpener } from './i-browser-opener.js';
24
26
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../../../../packages/core/src/application/ports/output/services/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,YAAY,EAAE,qBAAqB,EAAE,aAAa,EAAE,MAAM,uCAAuC,CAAC;AAClG,OAAO,EACL,iBAAiB,EACjB,kBAAkB,EAClB,wBAAwB,EACxB,4BAA4B,GAC7B,MAAM,uCAAuC,CAAC;AAC/C,YAAY,EACV,uBAAuB,EACvB,qBAAqB,GACtB,MAAM,iCAAiC,CAAC;AACzC,YAAY,EAAE,eAAe,EAAE,MAAM,gCAAgC,CAAC;AACtE,YAAY,EAAE,iBAAiB,EAAE,MAAM,mCAAmC,CAAC;AAC3E,YAAY,EAAE,gBAAgB,EAAE,YAAY,EAAE,MAAM,iCAAiC,CAAC;AACtF,OAAO,EAAE,aAAa,EAAE,iBAAiB,EAAE,MAAM,iCAAiC,CAAC;AACnF,YAAY,EAAE,qBAAqB,EAAE,sBAAsB,EAAE,MAAM,6BAA6B,CAAC;AACjG,YAAY,EAAE,oBAAoB,EAAE,MAAM,qCAAqC,CAAC;AAChF,YAAY,EACV,aAAa,EACb,QAAQ,EACR,cAAc,EACd,WAAW,EACX,aAAa,EACb,cAAc,GACf,MAAM,+BAA+B,CAAC;AACvC,OAAO,EAAE,UAAU,EAAE,cAAc,EAAE,MAAM,+BAA+B,CAAC;AAC3E,YAAY,EACV,mBAAmB,EACnB,cAAc,EACd,eAAe,EACf,gBAAgB,EAChB,eAAe,GAChB,MAAM,qCAAqC,CAAC;AAC7C,YAAY,EAAE,cAAc,EAAE,WAAW,EAAE,MAAM,+BAA+B,CAAC;AACjF,YAAY,EAAE,kBAAkB,EAAE,gBAAgB,EAAE,MAAM,mCAAmC,CAAC;AAC9F,YAAY,EACV,wBAAwB,EACxB,UAAU,EACV,kBAAkB,EAClB,2BAA2B,EAC3B,YAAY,EACZ,eAAe,GAChB,MAAM,0CAA0C,CAAC;AAClD,OAAO,EACL,eAAe,EACf,gBAAgB,EAChB,mBAAmB,EACnB,mBAAmB,GACpB,MAAM,0CAA0C,CAAC;AAClD,YAAY,EACV,0BAA0B,EAC1B,WAAW,EACX,aAAa,EACb,SAAS,GACV,MAAM,4CAA4C,CAAC;AACpD,YAAY,EAAE,qBAAqB,EAAE,oBAAoB,EAAE,MAAM,+BAA+B,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../../../../packages/core/src/application/ports/output/services/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,YAAY,EAAE,qBAAqB,EAAE,aAAa,EAAE,MAAM,uCAAuC,CAAC;AAClG,OAAO,EACL,iBAAiB,EACjB,kBAAkB,EAClB,wBAAwB,EACxB,4BAA4B,GAC7B,MAAM,uCAAuC,CAAC;AAC/C,YAAY,EACV,uBAAuB,EACvB,qBAAqB,GACtB,MAAM,iCAAiC,CAAC;AACzC,YAAY,EAAE,eAAe,EAAE,MAAM,gCAAgC,CAAC;AACtE,YAAY,EAAE,iBAAiB,EAAE,MAAM,mCAAmC,CAAC;AAC3E,YAAY,EAAE,gBAAgB,EAAE,YAAY,EAAE,MAAM,iCAAiC,CAAC;AACtF,OAAO,EAAE,aAAa,EAAE,iBAAiB,EAAE,MAAM,iCAAiC,CAAC;AACnF,YAAY,EAAE,qBAAqB,EAAE,sBAAsB,EAAE,MAAM,6BAA6B,CAAC;AACjG,YAAY,EAAE,oBAAoB,EAAE,MAAM,qCAAqC,CAAC;AAChF,YAAY,EACV,aAAa,EACb,QAAQ,EACR,cAAc,EACd,WAAW,EACX,aAAa,EACb,cAAc,GACf,MAAM,+BAA+B,CAAC;AACvC,OAAO,EAAE,UAAU,EAAE,cAAc,EAAE,MAAM,+BAA+B,CAAC;AAC3E,YAAY,EACV,mBAAmB,EACnB,cAAc,EACd,eAAe,EACf,gBAAgB,EAChB,eAAe,GAChB,MAAM,qCAAqC,CAAC;AAC7C,YAAY,EAAE,cAAc,EAAE,WAAW,EAAE,MAAM,+BAA+B,CAAC;AACjF,YAAY,EAAE,kBAAkB,EAAE,gBAAgB,EAAE,MAAM,mCAAmC,CAAC;AAC9F,YAAY,EACV,wBAAwB,EACxB,UAAU,EACV,kBAAkB,EAClB,2BAA2B,EAC3B,YAAY,EACZ,eAAe,GAChB,MAAM,0CAA0C,CAAC;AAClD,OAAO,EACL,eAAe,EACf,gBAAgB,EAChB,mBAAmB,EACnB,mBAAmB,GACpB,MAAM,0CAA0C,CAAC;AAClD,YAAY,EACV,0BAA0B,EAC1B,WAAW,EACX,aAAa,EACb,SAAS,GACV,MAAM,4CAA4C,CAAC;AACpD,YAAY,EAAE,qBAAqB,EAAE,oBAAoB,EAAE,MAAM,+BAA+B,CAAC;AACjG,YAAY,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAChE,YAAY,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"container.d.ts","sourceRoot":"","sources":["../../../../../../packages/core/src/infrastructure/di/container.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,kBAAkB,CAAC;AAC1B,OAAO,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC;AAyJrC;;;;;;GAMG;AACH,wBAAsB,mBAAmB,IAAI,OAAO,CAAC,OAAO,SAAS,CAAC,CAucrE;AAED;;;GAGG;AACH,wBAAgB,sBAAsB,IAAI,OAAO,CAEhD;AAED;;;GAGG;AACH,OAAO,EAAE,SAAS,EAAE,CAAC"}
1
+ {"version":3,"file":"container.d.ts","sourceRoot":"","sources":["../../../../../../packages/core/src/infrastructure/di/container.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,kBAAkB,CAAC;AAC1B,OAAO,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC;AA2JrC;;;;;;GAMG;AACH,wBAAsB,mBAAmB,IAAI,OAAO,CAAC,OAAO,SAAS,CAAC,CA4crE;AAED;;;GAGG;AACH,wBAAgB,sBAAsB,IAAI,OAAO,CAEhD;AAED;;;GAGG;AACH,OAAO,EAAE,SAAS,EAAE,CAAC"}
@@ -30,6 +30,7 @@ import { DaemonPidService } from '../services/daemon/daemon-pid.service.js';
30
30
  import { DeploymentService } from '../services/deployment/deployment.service.js';
31
31
  import { AttachmentStorageService } from '../services/attachment-storage.service.js';
32
32
  import { GitHubRepositoryService } from '../services/external/github-repository.service.js';
33
+ import { BrowserOpenerService } from '../services/browser-opener.service.js';
33
34
  import { AgentExecutorFactory } from '../services/agents/common/agent-executor-factory.service.js';
34
35
  import { AgentExecutorProvider } from '../services/agents/common/agent-executor-provider.service.js';
35
36
  import { StructuredAgentCallerService } from '../services/agents/common/structured-agent-caller.service.js';
@@ -287,6 +288,10 @@ export async function initializeContainer() {
287
288
  return new NotificationService(bus, desktopNotif);
288
289
  },
289
290
  });
291
+ // Register browser opener service
292
+ container.register('IBrowserOpener', {
293
+ useFactory: () => new BrowserOpenerService(),
294
+ });
290
295
  // Register use cases (singletons for performance)
291
296
  container.registerSingleton(InitializeSettingsUseCase);
292
297
  container.registerSingleton(LoadSettingsUseCase);
@@ -1 +1 @@
1
- {"version":3,"file":"feature-agent-graph.d.ts","sourceRoot":"","sources":["../../../../../../../../packages/core/src/infrastructure/services/agents/feature-agent/feature-agent-graph.ts"],"names":[],"mappings":"AAAA,OAAO,EAA0B,KAAK,mBAAmB,EAAE,MAAM,sBAAsB,CAAC;AACxF,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,+DAA+D,CAAC;AAOpG,OAAO,EAAmB,KAAK,aAAa,EAAE,MAAM,6BAA6B,CAAC;AAclF,OAAO,EAAE,sBAAsB,EAAE,KAAK,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAE5E;;;GAGG;AACH,MAAM,WAAW,qBAAqB;IACpC,QAAQ,EAAE,cAAc,CAAC;IACzB,aAAa,CAAC,EAAE,IAAI,CAAC,aAAa,EAAE,UAAU,CAAC,CAAC;CACjD;AAwID;;;;;;;;;;;;GAYG;AACH,wBAAgB,uBAAuB,CACrC,cAAc,EAAE,qBAAqB,GAAG,cAAc,EACtD,YAAY,CAAC,EAAE,mBAAmB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;qBAgFnC"}
1
+ {"version":3,"file":"feature-agent-graph.d.ts","sourceRoot":"","sources":["../../../../../../../../packages/core/src/infrastructure/services/agents/feature-agent/feature-agent-graph.ts"],"names":[],"mappings":"AAAA,OAAO,EAA0B,KAAK,mBAAmB,EAAE,MAAM,sBAAsB,CAAC;AACxF,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,+DAA+D,CAAC;AAOpG,OAAO,EAAmB,KAAK,aAAa,EAAE,MAAM,6BAA6B,CAAC;AAelF,OAAO,EAAE,sBAAsB,EAAE,KAAK,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAE5E;;;GAGG;AACH,MAAM,WAAW,qBAAqB;IACpC,QAAQ,EAAE,cAAc,CAAC;IACzB,aAAa,CAAC,EAAE,IAAI,CAAC,aAAa,EAAE,UAAU,CAAC,CAAC;CACjD;AAwJD;;;;;;;;;;;;GAYG;AACH,wBAAgB,uBAAuB,CACrC,cAAc,EAAE,qBAAqB,GAAG,cAAc,EACtD,YAAY,CAAC,EAAE,mBAAmB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;qBAsFnC"}
@@ -11,7 +11,7 @@ import { createRepairNode } from './nodes/repair.node.js';
11
11
  import { validateSpecAnalyze, validateSpecRequirements } from './nodes/schemas/spec.schema.js';
12
12
  import { validateResearch } from './nodes/schemas/research.schema.js';
13
13
  import { validatePlan, validateTasks } from './nodes/schemas/plan.schema.js';
14
- import { readSpecFile, safeYamlLoad, createNodeLogger, getCompletedPhases, } from './nodes/node-helpers.js';
14
+ import { readSpecFile, safeYamlLoad, createNodeLogger, getCompletedPhases, clearCompletedPhase, } from './nodes/node-helpers.js';
15
15
  // Re-export state types for consumers
16
16
  export { FeatureAgentAnnotation } from './state.js';
17
17
  /**
@@ -33,12 +33,26 @@ function routeReexecution(selfNode, nextNode) {
33
33
  * Factory that creates a conditional edge function for validation routing.
34
34
  *
35
35
  * Routes to successNode on pass, repairNode on fail, throws after maxRetries.
36
+ *
37
+ * When retries are exhausted, clears the producer node's completedPhases entry
38
+ * before throwing. This ensures that on resume, the producer node re-executes
39
+ * the full agent instead of skipping (because `executeNode` checks
40
+ * completedPhases). Without this, a phase that produced empty/unfilled output
41
+ * would be permanently stuck: the repair node can only fix formatting, not
42
+ * generate content from scratch, and the producer would skip on every retry.
36
43
  */
37
- function routeValidation(successNode, repairNode, maxRetries = 3) {
44
+ function routeValidation(successNode, repairNode, producerNode, maxRetries = 3) {
45
+ const log = createNodeLogger('routeValidation');
38
46
  return (state) => {
39
47
  if (state.lastValidationErrors.length === 0)
40
48
  return successNode;
41
49
  if (state.validationRetries >= maxRetries) {
50
+ // Clear the producer's completed phase so that on resume the producer
51
+ // node re-executes the full agent instead of skipping.
52
+ if (producerNode) {
53
+ log.info(`Clearing completed phase '${producerNode}' so retry re-runs the agent`);
54
+ clearCompletedPhase(state.specDir, producerNode, log);
55
+ }
42
56
  throw new Error(`Validation failed after ${maxRetries} repair attempts for '${state.lastValidationTarget}': ${state.lastValidationErrors.join('; ')}`);
43
57
  }
44
58
  return repairNode;
@@ -174,16 +188,16 @@ export function createFeatureAgentGraph(depsOrExecutor, checkpointer) {
174
188
  // --- Edges: linear flow with validation gates ---
175
189
  .addEdge(START, 'analyze')
176
190
  .addEdge('analyze', 'validate_spec_analyze')
177
- .addConditionalEdges('validate_spec_analyze', routeValidation('requirements', 'repair_spec_analyze'))
191
+ .addConditionalEdges('validate_spec_analyze', routeValidation('requirements', 'repair_spec_analyze', 'analyze'))
178
192
  .addEdge('repair_spec_analyze', 'validate_spec_analyze')
179
193
  .addConditionalEdges('requirements', routeReexecution('requirements', 'validate_spec_requirements'))
180
- .addConditionalEdges('validate_spec_requirements', routeValidation('research', 'repair_spec_requirements'))
194
+ .addConditionalEdges('validate_spec_requirements', routeValidation('research', 'repair_spec_requirements', 'requirements'))
181
195
  .addEdge('repair_spec_requirements', 'validate_spec_requirements')
182
196
  .addEdge('research', 'validate_research')
183
- .addConditionalEdges('validate_research', routeValidation('plan', 'repair_research'))
197
+ .addConditionalEdges('validate_research', routeValidation('plan', 'repair_research', 'research'))
184
198
  .addEdge('repair_research', 'validate_research')
185
199
  .addConditionalEdges('plan', routeReexecution('plan', 'validate_plan_tasks'))
186
- .addConditionalEdges('validate_plan_tasks', routeValidation('implement', 'repair_plan_tasks'))
200
+ .addConditionalEdges('validate_plan_tasks', routeValidation('implement', 'repair_plan_tasks', 'plan'))
187
201
  .addEdge('repair_plan_tasks', 'validate_plan_tasks');
188
202
  // --- Merge node: wired when deps are provided ---
189
203
  if (deps.mergeNodeDeps) {
@@ -1 +1 @@
1
- {"version":3,"file":"feature-agent-worker.d.ts","sourceRoot":"","sources":["../../../../../../../../packages/core/src/infrastructure/services/agents/feature-agent/feature-agent-worker.ts"],"names":[],"mappings":";AACA;;;;;;;;GAQG;AAEH,OAAO,kBAAkB,CAAC;AAgB1B,OAAO,EAAiC,KAAK,SAAS,EAAE,MAAM,8BAA8B,CAAC;AAW7F,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,8BAA8B,CAAC;AAElE,MAAM,WAAW,UAAU;IACzB,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,aAAa,CAAC,EAAE,aAAa,CAAC;IAC9B,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,mBAAmB,CAAC,EAAE,OAAO,CAAC;IAC9B,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,SAAS,CAAC,EAAE,SAAS,CAAC;IACtB,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED;;;GAGG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,UAAU,CAkF1D;AAgCD;;;GAGG;AACH,wBAAsB,SAAS,CAAC,IAAI,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC,CAuS/D"}
1
+ {"version":3,"file":"feature-agent-worker.d.ts","sourceRoot":"","sources":["../../../../../../../../packages/core/src/infrastructure/services/agents/feature-agent/feature-agent-worker.ts"],"names":[],"mappings":";AACA;;;;;;;;GAQG;AAEH,OAAO,kBAAkB,CAAC;AAiB1B,OAAO,EAAiC,KAAK,SAAS,EAAE,MAAM,8BAA8B,CAAC;AAW7F,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,8BAA8B,CAAC;AAElE,MAAM,WAAW,UAAU;IACzB,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,aAAa,CAAC,EAAE,aAAa,CAAC;IAC9B,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,mBAAmB,CAAC,EAAE,OAAO,CAAC;IAC9B,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,SAAS,CAAC,EAAE,SAAS,CAAC;IACtB,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED;;;GAGG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,UAAU,CAkF1D;AAgCD;;;GAGG;AACH,wBAAsB,SAAS,CAAC,IAAI,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC,CAiU/D"}
@@ -11,6 +11,7 @@
11
11
  import 'reflect-metadata';
12
12
  import { join } from 'node:path';
13
13
  import { homedir } from 'node:os';
14
+ import { unlinkSync } from 'node:fs';
14
15
  import { Command } from '@langchain/langgraph';
15
16
  import { initializeContainer, container } from '../../../di/container.js';
16
17
  import { createFeatureAgentGraph } from './feature-agent-graph.js';
@@ -273,10 +274,32 @@ export async function runWorker(args) {
273
274
  result = await graph.invoke(new Command({ resume: resumeValue, update: stateUpdate }), graphConfig);
274
275
  }
275
276
  else if (args.resume) {
276
- // Resume from error — re-invoke with initial state; LangGraph continues
277
- // from the last successfully checkpointed node.
278
- log('Resuming graph from error checkpoint...');
279
- result = await graph.invoke({
277
+ // Resume from error — delete the stale checkpoint and re-invoke from
278
+ // scratch. Each producer node checks its completedPhases entry and skips
279
+ // if already done, so completed phases replay instantly. The phase that
280
+ // failed has its completedPhases entry cleared by routeValidation (or was
281
+ // never marked complete if the executor threw), so it re-executes fully.
282
+ //
283
+ // Why delete the checkpoint instead of resuming from it:
284
+ // When a validate/repair loop exhausts retries and throws, the checkpoint
285
+ // captures the validation node with maxed-out retries. Resuming from that
286
+ // checkpoint would re-evaluate the same conditional edge and throw again
287
+ // immediately — the user's retry would be stuck in an infinite loop.
288
+ log('Deleting stale checkpoint for fresh resume...');
289
+ try {
290
+ unlinkSync(checkpointPath);
291
+ log('Checkpoint deleted successfully');
292
+ }
293
+ catch {
294
+ log('No checkpoint to delete (first run or already cleaned)');
295
+ }
296
+ // Re-create checkpointer after deleting the old DB
297
+ const freshCheckpointer = createCheckpointer(checkpointPath);
298
+ const freshGraph = args.fast
299
+ ? createFastFeatureAgentGraph(graphDeps, freshCheckpointer)
300
+ : createFeatureAgentGraph(graphDeps, freshCheckpointer);
301
+ log('Resuming graph with fresh checkpoint...');
302
+ result = await freshGraph.invoke({
280
303
  featureId: args.featureId,
281
304
  repositoryPath: args.repo,
282
305
  worktreePath: args.worktreePath ?? args.repo,
@@ -1,11 +1,12 @@
1
1
  import { type ChildProcess } from 'node:child_process';
2
+ import type { IBrowserOpener } from '../../application/ports/output/services/i-browser-opener.js';
2
3
  export interface BrowserOpenerDeps {
3
4
  platform: NodeJS.Platform;
4
5
  execFile: (cmd: string, args: readonly string[], callback: (error: Error | null) => void) => ChildProcess;
5
6
  warn: (msg: string) => void;
6
7
  isTTY: boolean;
7
8
  }
8
- export declare class BrowserOpenerService {
9
+ export declare class BrowserOpenerService implements IBrowserOpener {
9
10
  private deps;
10
11
  constructor(deps?: Partial<BrowserOpenerDeps>);
11
12
  open(url: string): void;
@@ -1 +1 @@
1
- {"version":3,"file":"browser-opener.service.d.ts","sourceRoot":"","sources":["../../../../../../packages/core/src/infrastructure/services/browser-opener.service.ts"],"names":[],"mappings":"AAAA,OAAO,EAA0B,KAAK,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAE/E,MAAM,WAAW,iBAAiB;IAChC,QAAQ,EAAE,MAAM,CAAC,QAAQ,CAAC;IAC1B,QAAQ,EAAE,CACR,GAAG,EAAE,MAAM,EACX,IAAI,EAAE,SAAS,MAAM,EAAE,EACvB,QAAQ,EAAE,CAAC,KAAK,EAAE,KAAK,GAAG,IAAI,KAAK,IAAI,KACpC,YAAY,CAAC;IAClB,IAAI,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CAAC;IAC5B,KAAK,EAAE,OAAO,CAAC;CAChB;AAgBD,qBAAa,oBAAoB;IAC/B,OAAO,CAAC,IAAI,CAAoB;gBAEpB,IAAI,GAAE,OAAO,CAAC,iBAAiB,CAAM;IAIjD,IAAI,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI;CAcxB"}
1
+ {"version":3,"file":"browser-opener.service.d.ts","sourceRoot":"","sources":["../../../../../../packages/core/src/infrastructure/services/browser-opener.service.ts"],"names":[],"mappings":"AAAA,OAAO,EAA0B,KAAK,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAC/E,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,6DAA6D,CAAC;AAElG,MAAM,WAAW,iBAAiB;IAChC,QAAQ,EAAE,MAAM,CAAC,QAAQ,CAAC;IAC1B,QAAQ,EAAE,CACR,GAAG,EAAE,MAAM,EACX,IAAI,EAAE,SAAS,MAAM,EAAE,EACvB,QAAQ,EAAE,CAAC,KAAK,EAAE,KAAK,GAAG,IAAI,KAAK,IAAI,KACpC,YAAY,CAAC;IAClB,IAAI,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CAAC;IAC5B,KAAK,EAAE,OAAO,CAAC;CAChB;AAgBD,qBAAa,oBAAqB,YAAW,cAAc;IACzD,OAAO,CAAC,IAAI,CAAoB;gBAEpB,IAAI,GAAE,OAAO,CAAC,iBAAiB,CAAM;IAIjD,IAAI,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI;CAcxB"}
@@ -9,7 +9,8 @@
9
9
  * - Title truncated to 100 chars, body to 500 chars
10
10
  * - Errors are caught and logged (never thrown)
11
11
  */
12
- export declare class DesktopNotifier {
12
+ import type { IDesktopNotifier } from '../../../application/ports/output/services/i-desktop-notifier.js';
13
+ export declare class DesktopNotifier implements IDesktopNotifier {
13
14
  /**
14
15
  * Send a native OS desktop notification.
15
16
  *
@@ -1 +1 @@
1
- {"version":3,"file":"desktop-notifier.d.ts","sourceRoot":"","sources":["../../../../../../../packages/core/src/infrastructure/services/notifications/desktop-notifier.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAQH,qBAAa,eAAe;IAC1B;;;;;OAKG;IACH,IAAI,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,IAAI;IAYvC,OAAO,CAAC,QAAQ;CAIjB"}
1
+ {"version":3,"file":"desktop-notifier.d.ts","sourceRoot":"","sources":["../../../../../../../packages/core/src/infrastructure/services/notifications/desktop-notifier.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAGH,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,kEAAkE,CAAC;AAMzG,qBAAa,eAAgB,YAAW,gBAAgB;IACtD;;;;;OAKG;IACH,IAAI,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,IAAI;IAYvC,OAAO,CAAC,QAAQ;CAIjB"}
@@ -14,7 +14,7 @@
14
14
  * 4. Wait briefly to confirm the child is alive; surface stderr on crash
15
15
  * 5. Write daemon.json atomically via IDaemonService
16
16
  * 6. Print formatted URL to stdout
17
- * 7. Open browser via BrowserOpenerService
17
+ * 7. Open browser via IBrowserOpener (resolved from DI container)
18
18
  */
19
19
  export interface StartDaemonOptions {
20
20
  port?: number;
@@ -14,14 +14,13 @@
14
14
  * 4. Wait briefly to confirm the child is alive; surface stderr on crash
15
15
  * 5. Write daemon.json atomically via IDaemonService
16
16
  * 6. Print formatted URL to stdout
17
- * 7. Open browser via BrowserOpenerService
17
+ * 7. Open browser via IBrowserOpener (resolved from DI container)
18
18
  */
19
19
  import { spawn } from 'node:child_process';
20
20
  import { closeSync, openSync, renameSync, existsSync } from 'node:fs';
21
21
  import http from 'node:http';
22
22
  import { container } from '../../../../../packages/core/src/infrastructure/di/container.js';
23
23
  import { findAvailablePort, DEFAULT_PORT } from '../../../../../packages/core/src/infrastructure/services/port.service.js';
24
- import { BrowserOpenerService } from '../../../../../packages/core/src/infrastructure/services/browser-opener.service.js';
25
24
  import { getDaemonLogPath } from '../../../../../packages/core/src/infrastructure/services/filesystem/shep-directory.service.js';
26
25
  import { fmt, messages, spinner } from '../../ui/index.js';
27
26
  import { getCliI18n } from '../../i18n.js';
@@ -116,7 +115,7 @@ export async function startDaemon(opts = {}) {
116
115
  }
117
116
  }
118
117
  messages.newline();
119
- const opener = new BrowserOpenerService({ warn: messages.warning });
118
+ const opener = container.resolve('IBrowserOpener');
120
119
  opener.open(url);
121
120
  }
122
121
  /**
@@ -23,7 +23,6 @@ import { initializeNotificationWatcher, getNotificationWatcher, } from '../../..
23
23
  import { initializePrSyncWatcher, getPrSyncWatcher, } from '../../../../packages/core/src/infrastructure/services/pr-sync/pr-sync-watcher.service.js';
24
24
  import { initializeAutoArchiveWatcher, getAutoArchiveWatcher, } from '../../../../packages/core/src/infrastructure/services/auto-archive/auto-archive-watcher.service.js';
25
25
  import { getExistingConnection } from '../../../../packages/core/src/infrastructure/persistence/sqlite/connection.js';
26
- import { BrowserOpenerService } from '../../../../packages/core/src/infrastructure/services/browser-opener.service.js';
27
26
  import { colors, fmt, messages } from '../ui/index.js';
28
27
  import { getCliI18n } from '../i18n.js';
29
28
  function parsePort(value) {
@@ -83,7 +82,7 @@ Examples:
83
82
  messages.newline();
84
83
  // Auto-open browser (unless --no-open)
85
84
  if (options.open !== false) {
86
- const opener = new BrowserOpenerService({ warn: messages.warning });
85
+ const opener = container.resolve('IBrowserOpener');
87
86
  opener.open(url);
88
87
  }
89
88
  // Handle graceful shutdown via SIGINT/SIGTERM