@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.
- package/dist/eslint.config.mjs +2 -0
- package/dist/packages/core/src/application/ports/output/services/i-browser-opener.d.ts +28 -0
- package/dist/packages/core/src/application/ports/output/services/i-browser-opener.d.ts.map +1 -0
- package/dist/packages/core/src/application/ports/output/services/i-browser-opener.js +13 -0
- package/dist/packages/core/src/application/ports/output/services/i-desktop-notifier.d.ts +29 -0
- package/dist/packages/core/src/application/ports/output/services/i-desktop-notifier.d.ts.map +1 -0
- package/dist/packages/core/src/application/ports/output/services/i-desktop-notifier.js +13 -0
- package/dist/packages/core/src/application/ports/output/services/index.d.ts +2 -0
- package/dist/packages/core/src/application/ports/output/services/index.d.ts.map +1 -1
- package/dist/packages/core/src/infrastructure/di/container.d.ts.map +1 -1
- package/dist/packages/core/src/infrastructure/di/container.js +5 -0
- package/dist/packages/core/src/infrastructure/services/agents/feature-agent/feature-agent-graph.d.ts.map +1 -1
- package/dist/packages/core/src/infrastructure/services/agents/feature-agent/feature-agent-graph.js +20 -6
- package/dist/packages/core/src/infrastructure/services/agents/feature-agent/feature-agent-worker.d.ts.map +1 -1
- package/dist/packages/core/src/infrastructure/services/agents/feature-agent/feature-agent-worker.js +27 -4
- package/dist/packages/core/src/infrastructure/services/browser-opener.service.d.ts +2 -1
- package/dist/packages/core/src/infrastructure/services/browser-opener.service.d.ts.map +1 -1
- package/dist/packages/core/src/infrastructure/services/notifications/desktop-notifier.d.ts +2 -1
- package/dist/packages/core/src/infrastructure/services/notifications/desktop-notifier.d.ts.map +1 -1
- package/dist/src/presentation/cli/commands/daemon/start-daemon.d.ts +1 -1
- package/dist/src/presentation/cli/commands/daemon/start-daemon.js +2 -3
- package/dist/src/presentation/cli/commands/ui.command.js +1 -2
- package/dist/tsconfig.build.tsbuildinfo +1 -1
- package/package.json +10 -2
- package/web/.next/BUILD_ID +1 -1
- package/web/.next/build-manifest.json +2 -2
- package/web/.next/fallback-build-manifest.json +2 -2
- package/web/.next/prerender-manifest.json +3 -3
- package/web/.next/required-server-files.js +2 -2
- package/web/.next/required-server-files.json +2 -2
- package/web/.next/server/app/(dashboard)/@drawer/adopt/page/server-reference-manifest.json +29 -29
- package/web/.next/server/app/(dashboard)/@drawer/adopt/page.js.nft.json +1 -1
- package/web/.next/server/app/(dashboard)/@drawer/adopt/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/(dashboard)/@drawer/chat/page/server-reference-manifest.json +27 -27
- package/web/.next/server/app/(dashboard)/@drawer/chat/page.js.nft.json +1 -1
- package/web/.next/server/app/(dashboard)/@drawer/chat/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/(dashboard)/@drawer/create/page/server-reference-manifest.json +30 -30
- package/web/.next/server/app/(dashboard)/@drawer/create/page.js.nft.json +1 -1
- package/web/.next/server/app/(dashboard)/@drawer/create/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/[tab]/page/server-reference-manifest.json +38 -38
- package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/[tab]/page.js.nft.json +1 -1
- package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/[tab]/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page/server-reference-manifest.json +38 -38
- package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page.js.nft.json +1 -1
- package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/[tab]/page/server-reference-manifest.json +28 -28
- package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/[tab]/page.js.nft.json +1 -1
- package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/[tab]/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page/server-reference-manifest.json +28 -28
- package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page.js.nft.json +1 -1
- package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/(dashboard)/chat/page/server-reference-manifest.json +27 -27
- package/web/.next/server/app/(dashboard)/chat/page.js.nft.json +1 -1
- package/web/.next/server/app/(dashboard)/chat/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/(dashboard)/create/page/server-reference-manifest.json +30 -30
- package/web/.next/server/app/(dashboard)/create/page.js.nft.json +1 -1
- package/web/.next/server/app/(dashboard)/create/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/(dashboard)/feature/[featureId]/[tab]/page/server-reference-manifest.json +38 -38
- package/web/.next/server/app/(dashboard)/feature/[featureId]/[tab]/page.js.nft.json +1 -1
- package/web/.next/server/app/(dashboard)/feature/[featureId]/[tab]/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/(dashboard)/feature/[featureId]/page/server-reference-manifest.json +38 -38
- package/web/.next/server/app/(dashboard)/feature/[featureId]/page.js.nft.json +1 -1
- package/web/.next/server/app/(dashboard)/feature/[featureId]/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/(dashboard)/page/server-reference-manifest.json +27 -27
- package/web/.next/server/app/(dashboard)/page.js.nft.json +1 -1
- package/web/.next/server/app/(dashboard)/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/(dashboard)/repository/[repositoryId]/[tab]/page/server-reference-manifest.json +28 -28
- package/web/.next/server/app/(dashboard)/repository/[repositoryId]/[tab]/page.js.nft.json +1 -1
- package/web/.next/server/app/(dashboard)/repository/[repositoryId]/[tab]/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/(dashboard)/repository/[repositoryId]/page/server-reference-manifest.json +28 -28
- package/web/.next/server/app/(dashboard)/repository/[repositoryId]/page.js.nft.json +1 -1
- package/web/.next/server/app/(dashboard)/repository/[repositoryId]/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/_global-error.html +2 -2
- package/web/.next/server/app/_global-error.rsc +1 -1
- package/web/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +1 -1
- package/web/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
- package/web/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
- package/web/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
- package/web/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
- package/web/.next/server/app/_not-found/page/server-reference-manifest.json +6 -6
- package/web/.next/server/app/_not-found/page.js.nft.json +1 -1
- package/web/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/features/page/server-reference-manifest.json +6 -6
- package/web/.next/server/app/features/page.js.nft.json +1 -1
- package/web/.next/server/app/features/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/settings/page/server-reference-manifest.json +9 -9
- package/web/.next/server/app/settings/page.js.nft.json +1 -1
- package/web/.next/server/app/settings/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/skills/page/server-reference-manifest.json +13 -13
- package/web/.next/server/app/skills/page.js.nft.json +1 -1
- package/web/.next/server/app/skills/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/tools/page/server-reference-manifest.json +11 -11
- package/web/.next/server/app/tools/page.js.nft.json +1 -1
- package/web/.next/server/app/tools/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/version/page/server-reference-manifest.json +6 -6
- package/web/.next/server/app/version/page.js.nft.json +1 -1
- package/web/.next/server/app/version/page_client-reference-manifest.js +1 -1
- package/web/.next/server/chunks/[root-of-the-server]__a402b567._.js +1 -1
- package/web/.next/server/chunks/ssr/744ca_web__next-internal_server_app_(dashboard)_@drawer_adopt_page_actions_ad0071c9.js +1 -1
- package/web/.next/server/chunks/ssr/744ca_web__next-internal_server_app_(dashboard)_@drawer_adopt_page_actions_ad0071c9.js.map +1 -1
- package/web/.next/server/chunks/ssr/744ca_web__next-internal_server_app_(dashboard)_@drawer_chat_page_actions_90d98b2b.js +1 -1
- package/web/.next/server/chunks/ssr/744ca_web__next-internal_server_app_(dashboard)_@drawer_chat_page_actions_90d98b2b.js.map +1 -1
- package/web/.next/server/chunks/ssr/744ca_web__next-internal_server_app_(dashboard)_chat_page_actions_d3828105.js +1 -1
- package/web/.next/server/chunks/ssr/744ca_web__next-internal_server_app_(dashboard)_chat_page_actions_d3828105.js.map +1 -1
- package/web/.next/server/chunks/ssr/744ca_web_components_common_control-center-drawer_create-drawer-client_tsx_5e26fc0a._.js +1 -1
- package/web/.next/server/chunks/ssr/744ca_web_components_common_control-center-drawer_create-drawer-client_tsx_5e26fc0a._.js.map +1 -1
- package/web/.next/server/chunks/ssr/744ca_web_components_common_control-center-drawer_feature-drawer-client_tsx_e9755fc8._.js +2 -2
- package/web/.next/server/chunks/ssr/744ca_web_components_common_control-center-drawer_feature-drawer-client_tsx_e9755fc8._.js.map +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__1cd4327c._.js +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__1cd4327c._.js.map +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__1f389e5d._.js +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__1f389e5d._.js.map +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__357d99f9._.js +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__51ec77a8._.js +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__51ec77a8._.js.map +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__540c615f._.js +2 -2
- package/web/.next/server/chunks/ssr/[root-of-the-server]__66047a1b._.js +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__66047a1b._.js.map +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__6c7d3936._.js +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__6c7d3936._.js.map +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__a932cd3a._.js +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__a932cd3a._.js.map +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__aa72e794._.js +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__aa72e794._.js.map +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__b7b96453._.js +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__b7b96453._.js.map +1 -1
- package/web/.next/server/chunks/ssr/_05c23ad9._.js +1 -1
- package/web/.next/server/chunks/ssr/_05c23ad9._.js.map +1 -1
- package/web/.next/server/chunks/ssr/_16eb4fec._.js +1 -1
- package/web/.next/server/chunks/ssr/_16eb4fec._.js.map +1 -1
- package/web/.next/server/chunks/ssr/{_8f0d3f07._.js → _19a779c6._.js} +2 -2
- package/web/.next/server/chunks/ssr/{_8f0d3f07._.js.map → _19a779c6._.js.map} +1 -1
- package/web/.next/server/chunks/ssr/{_388d1127._.js → _3fc2374c._.js} +2 -2
- package/web/.next/server/chunks/ssr/{_388d1127._.js.map → _3fc2374c._.js.map} +1 -1
- package/web/.next/server/chunks/ssr/_4cbb7f95._.js +1 -1
- package/web/.next/server/chunks/ssr/_4cbb7f95._.js.map +1 -1
- package/web/.next/server/chunks/ssr/_56b9d60f._.js +1 -1
- package/web/.next/server/chunks/ssr/_56b9d60f._.js.map +1 -1
- package/web/.next/server/chunks/ssr/{_98d94927._.js → _57b1af27._.js} +2 -2
- package/web/.next/server/chunks/ssr/{_98d94927._.js.map → _57b1af27._.js.map} +1 -1
- package/web/.next/server/chunks/ssr/_6abfa39e._.js +1 -1
- package/web/.next/server/chunks/ssr/_f8c55130._.js +1 -1
- package/web/.next/server/chunks/ssr/b1a17_presentation_web_components_features_settings_settings-page-client_tsx_6ed9d5f8._.js +1 -1
- package/web/.next/server/chunks/ssr/b1a17_presentation_web_components_features_settings_settings-page-client_tsx_6ed9d5f8._.js.map +1 -1
- package/web/.next/server/chunks/ssr/f3a1f_components_common_control-center-drawer_repository-drawer-client_tsx_39a00c03._.js +1 -1
- package/web/.next/server/chunks/ssr/f3a1f_components_common_control-center-drawer_repository-drawer-client_tsx_39a00c03._.js.map +1 -1
- package/web/.next/server/chunks/ssr/src_presentation_web_17d39233._.js +1 -1
- package/web/.next/server/chunks/ssr/src_presentation_web_17d39233._.js.map +1 -1
- package/web/.next/server/chunks/ssr/src_presentation_web_54b02639._.js +2 -2
- package/web/.next/server/chunks/ssr/src_presentation_web_54b02639._.js.map +1 -1
- package/web/.next/server/chunks/ssr/src_presentation_web_7b7b9e3b._.js +2 -2
- package/web/.next/server/chunks/ssr/src_presentation_web_7b7b9e3b._.js.map +1 -1
- package/web/.next/server/chunks/ssr/src_presentation_web_807cba76._.js +1 -1
- package/web/.next/server/chunks/ssr/src_presentation_web_807cba76._.js.map +1 -1
- package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_(dashboard)_page_actions_90b5e66e.js +1 -1
- package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_(dashboard)_page_actions_90b5e66e.js.map +1 -1
- package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_skills_page_actions_4ce30db7.js +1 -1
- package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_skills_page_actions_4ce30db7.js.map +1 -1
- package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_tools_page_actions_e4032193.js +1 -1
- package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_tools_page_actions_e4032193.js.map +1 -1
- package/web/.next/server/chunks/ssr/src_presentation_web_app_actions_open-ide_ts_baaca5d5._.js +1 -1
- package/web/.next/server/chunks/ssr/src_presentation_web_components_895e5bfa._.js +1 -1
- package/web/.next/server/chunks/ssr/src_presentation_web_components_895e5bfa._.js.map +1 -1
- package/web/.next/server/chunks/ssr/src_presentation_web_components_features_control-center_7ac3562e._.js +1 -1
- package/web/.next/server/chunks/ssr/src_presentation_web_components_features_control-center_7ac3562e._.js.map +1 -1
- package/web/.next/server/chunks/ssr/src_presentation_web_components_features_skills_8a174cac._.js +1 -1
- package/web/.next/server/chunks/ssr/src_presentation_web_components_features_skills_8a174cac._.js.map +1 -1
- package/web/.next/server/chunks/ssr/src_presentation_web_e1cd1869._.js +1 -1
- package/web/.next/server/chunks/ssr/src_presentation_web_e1cd1869._.js.map +1 -1
- package/web/.next/server/chunks/ssr/src_presentation_web_e3a30e30._.js +1 -1
- package/web/.next/server/chunks/ssr/src_presentation_web_e3a30e30._.js.map +1 -1
- package/web/.next/server/pages/500.html +2 -2
- package/web/.next/server/server-reference-manifest.js +1 -1
- package/web/.next/server/server-reference-manifest.json +50 -50
- package/web/.next/static/chunks/{302f474e4978cc80.js → 0a706f8508eae0a8.js} +3 -3
- package/web/.next/static/chunks/{eda9ee3c22b71a69.js → 0d0e2661bd167e0f.js} +1 -1
- package/web/.next/static/chunks/{f17d2d0279b8db35.js → 18f429029d702545.js} +1 -1
- package/web/.next/static/chunks/{eab3d361f7a24510.js → 3fc5b2287f192799.js} +1 -1
- package/web/.next/static/chunks/{4ff21d16947ec853.js → 4c20d4cd4786a0c8.js} +1 -1
- package/web/.next/static/chunks/{236744ff71b1aadf.js → 77d6506c7d1f711f.js} +1 -1
- package/web/.next/static/chunks/{2cfc6022d74e2716.js → 829d2f8ef2715f2f.js} +2 -2
- package/web/.next/static/chunks/{885bb8fc631bf477.js → b5a916fec4cdc897.js} +1 -1
- package/web/.next/static/chunks/{71a07df9dcb42227.js → b5d355eb59916926.js} +2 -2
- package/web/.next/static/chunks/{6304540c7cf2b46a.js → c0e4cd44851a9293.js} +1 -1
- package/web/.next/static/chunks/ddd34e939acc204f.js +1 -0
- package/web/.next/static/chunks/{afa7e5d2a48cabc7.js → eaa1b979d63d322b.js} +1 -1
- package/web/.next/static/chunks/{476873a9bac35ec8.js → ef897f150084ef85.js} +1 -1
- package/web/.next/static/chunks/{0ffb3738269e15c3.js → efd57b6ffc7cbd54.js} +1 -1
- package/web/.next/static/chunks/626277ca9a4cc477.js +0 -1
- /package/web/.next/static/{36ONyC02R4wfFe7iWMQLU → UZ2czjiAnEl1RF-HTzHyA}/_buildManifest.js +0 -0
- /package/web/.next/static/{36ONyC02R4wfFe7iWMQLU → UZ2czjiAnEl1RF-HTzHyA}/_clientMiddlewareManifest.json +0 -0
- /package/web/.next/static/{36ONyC02R4wfFe7iWMQLU → UZ2czjiAnEl1RF-HTzHyA}/_ssgManifest.js +0 -0
package/dist/eslint.config.mjs
CHANGED
|
@@ -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;
|
|
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;
|
|
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"}
|
package/dist/packages/core/src/infrastructure/services/agents/feature-agent/feature-agent-graph.js
CHANGED
|
@@ -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;
|
|
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"}
|
package/dist/packages/core/src/infrastructure/services/agents/feature-agent/feature-agent-worker.js
CHANGED
|
@@ -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 —
|
|
277
|
-
//
|
|
278
|
-
|
|
279
|
-
|
|
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;
|
|
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
|
-
|
|
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
|
*
|
package/dist/packages/core/src/infrastructure/services/notifications/desktop-notifier.d.ts.map
CHANGED
|
@@ -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;
|
|
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
|
|
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
|
|
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 =
|
|
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 =
|
|
85
|
+
const opener = container.resolve('IBrowserOpener');
|
|
87
86
|
opener.open(url);
|
|
88
87
|
}
|
|
89
88
|
// Handle graceful shutdown via SIGINT/SIGTERM
|