@shepai/cli 1.108.0-pr336.a464893 → 1.108.0-pr340.8db5169

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 (155) hide show
  1. package/dist/packages/core/src/application/use-cases/upgrade/upgrade-cli.use-case.d.ts +9 -1
  2. package/dist/packages/core/src/application/use-cases/upgrade/upgrade-cli.use-case.d.ts.map +1 -1
  3. package/dist/packages/core/src/application/use-cases/upgrade/upgrade-cli.use-case.js +31 -2
  4. package/dist/packages/core/src/infrastructure/di/container.d.ts.map +1 -1
  5. package/dist/packages/core/src/infrastructure/di/container.js +2 -1
  6. package/dist/packages/core/src/infrastructure/platform.d.ts +7 -0
  7. package/dist/packages/core/src/infrastructure/platform.d.ts.map +1 -0
  8. package/dist/packages/core/src/infrastructure/platform.js +6 -0
  9. package/dist/packages/core/src/infrastructure/services/agents/common/executors/claude-code-executor.service.d.ts.map +1 -1
  10. package/dist/packages/core/src/infrastructure/services/agents/common/executors/claude-code-executor.service.js +2 -1
  11. package/dist/packages/core/src/infrastructure/services/agents/common/executors/cursor-executor.service.d.ts.map +1 -1
  12. package/dist/packages/core/src/infrastructure/services/agents/common/executors/cursor-executor.service.js +2 -1
  13. package/dist/packages/core/src/infrastructure/services/git/worktree.service.d.ts.map +1 -1
  14. package/dist/packages/core/src/infrastructure/services/git/worktree.service.js +2 -1
  15. package/dist/packages/core/src/infrastructure/services/web-server.service.d.ts.map +1 -1
  16. package/dist/packages/core/src/infrastructure/services/web-server.service.js +2 -1
  17. package/dist/src/presentation/web/app/api/cli-upgrade/route.d.ts.map +1 -1
  18. package/dist/src/presentation/web/app/api/cli-upgrade/route.js +14 -1
  19. package/dist/src/presentation/web/components/common/version-badge/version-badge.d.ts.map +1 -1
  20. package/dist/src/presentation/web/components/common/version-badge/version-badge.js +6 -1
  21. package/dist/src/presentation/web/components/common/version-badge/version-badge.stories.d.ts.map +1 -1
  22. package/dist/src/presentation/web/components/common/version-badge/version-badge.stories.js +7 -0
  23. package/dist/src/presentation/web/hooks/use-cli-upgrade.d.ts +1 -1
  24. package/dist/src/presentation/web/hooks/use-cli-upgrade.d.ts.map +1 -1
  25. package/dist/src/presentation/web/hooks/use-cli-upgrade.js +40 -1
  26. package/dist/tsconfig.build.tsbuildinfo +1 -1
  27. package/package.json +1 -1
  28. package/web/.next/BUILD_ID +1 -1
  29. package/web/.next/build-manifest.json +2 -2
  30. package/web/.next/fallback-build-manifest.json +2 -2
  31. package/web/.next/prerender-manifest.json +3 -3
  32. package/web/.next/required-server-files.js +1 -1
  33. package/web/.next/required-server-files.json +1 -1
  34. package/web/.next/server/app/(dashboard)/@drawer/create/page/server-reference-manifest.json +20 -20
  35. package/web/.next/server/app/(dashboard)/@drawer/create/page.js.nft.json +1 -1
  36. package/web/.next/server/app/(dashboard)/@drawer/create/page_client-reference-manifest.js +1 -1
  37. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/[tab]/page/server-reference-manifest.json +26 -26
  38. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/[tab]/page.js.nft.json +1 -1
  39. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/[tab]/page_client-reference-manifest.js +1 -1
  40. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page/server-reference-manifest.json +26 -26
  41. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page.js.nft.json +1 -1
  42. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page_client-reference-manifest.js +1 -1
  43. package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page/server-reference-manifest.json +18 -18
  44. package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page.js.nft.json +1 -1
  45. package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page_client-reference-manifest.js +1 -1
  46. package/web/.next/server/app/(dashboard)/create/page/server-reference-manifest.json +20 -20
  47. package/web/.next/server/app/(dashboard)/create/page.js.nft.json +1 -1
  48. package/web/.next/server/app/(dashboard)/create/page_client-reference-manifest.js +1 -1
  49. package/web/.next/server/app/(dashboard)/feature/[featureId]/[tab]/page/server-reference-manifest.json +26 -26
  50. package/web/.next/server/app/(dashboard)/feature/[featureId]/[tab]/page.js.nft.json +1 -1
  51. package/web/.next/server/app/(dashboard)/feature/[featureId]/[tab]/page_client-reference-manifest.js +1 -1
  52. package/web/.next/server/app/(dashboard)/feature/[featureId]/page/server-reference-manifest.json +26 -26
  53. package/web/.next/server/app/(dashboard)/feature/[featureId]/page.js.nft.json +1 -1
  54. package/web/.next/server/app/(dashboard)/feature/[featureId]/page_client-reference-manifest.js +1 -1
  55. package/web/.next/server/app/(dashboard)/page/server-reference-manifest.json +18 -18
  56. package/web/.next/server/app/(dashboard)/page.js.nft.json +1 -1
  57. package/web/.next/server/app/(dashboard)/page_client-reference-manifest.js +1 -1
  58. package/web/.next/server/app/(dashboard)/repository/[repositoryId]/page/server-reference-manifest.json +18 -18
  59. package/web/.next/server/app/(dashboard)/repository/[repositoryId]/page.js.nft.json +1 -1
  60. package/web/.next/server/app/(dashboard)/repository/[repositoryId]/page_client-reference-manifest.js +1 -1
  61. package/web/.next/server/app/_global-error.html +2 -2
  62. package/web/.next/server/app/_global-error.rsc +1 -1
  63. package/web/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +1 -1
  64. package/web/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  65. package/web/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  66. package/web/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  67. package/web/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  68. package/web/.next/server/app/_not-found/page/server-reference-manifest.json +1 -1
  69. package/web/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  70. package/web/.next/server/app/settings/page/server-reference-manifest.json +5 -5
  71. package/web/.next/server/app/settings/page.js.nft.json +1 -1
  72. package/web/.next/server/app/settings/page_client-reference-manifest.js +1 -1
  73. package/web/.next/server/app/skills/page/server-reference-manifest.json +6 -6
  74. package/web/.next/server/app/skills/page_client-reference-manifest.js +1 -1
  75. package/web/.next/server/app/tools/page/server-reference-manifest.json +6 -6
  76. package/web/.next/server/app/tools/page_client-reference-manifest.js +1 -1
  77. package/web/.next/server/app/version/page/server-reference-manifest.json +1 -1
  78. package/web/.next/server/app/version/page_client-reference-manifest.js +1 -1
  79. package/web/.next/server/chunks/[root-of-the-server]__a402b567._.js +1 -1
  80. package/web/.next/server/chunks/[root-of-the-server]__d2c18946._.js +7 -4
  81. package/web/.next/server/chunks/[root-of-the-server]__d2c18946._.js.map +1 -1
  82. package/web/.next/server/chunks/ssr/744ca_web_components_common_control-center-drawer_create-drawer-client_tsx_5e26fc0a._.js +1 -1
  83. package/web/.next/server/chunks/ssr/744ca_web_components_common_control-center-drawer_create-drawer-client_tsx_5e26fc0a._.js.map +1 -1
  84. package/web/.next/server/chunks/ssr/8ba4b_server_app_(dashboard)_@drawer_repository_[repositoryId]_page_actions_a1104008.js +1 -1
  85. package/web/.next/server/chunks/ssr/8ba4b_server_app_(dashboard)_@drawer_repository_[repositoryId]_page_actions_a1104008.js.map +1 -1
  86. package/web/.next/server/chunks/ssr/8ba4b_server_app_(dashboard)_repository_[repositoryId]_page_actions_92642200.js +1 -1
  87. package/web/.next/server/chunks/ssr/8ba4b_server_app_(dashboard)_repository_[repositoryId]_page_actions_92642200.js.map +1 -1
  88. package/web/.next/server/chunks/ssr/[root-of-the-server]__039967e3._.js +1 -1
  89. package/web/.next/server/chunks/ssr/[root-of-the-server]__039967e3._.js.map +1 -1
  90. package/web/.next/server/chunks/ssr/[root-of-the-server]__07a39ff2._.js +1 -1
  91. package/web/.next/server/chunks/ssr/[root-of-the-server]__11033878._.js +1 -1
  92. package/web/.next/server/chunks/ssr/[root-of-the-server]__11033878._.js.map +1 -1
  93. package/web/.next/server/chunks/ssr/[root-of-the-server]__24dd0927._.js +2 -2
  94. package/web/.next/server/chunks/ssr/[root-of-the-server]__2773312c._.js +1 -1
  95. package/web/.next/server/chunks/ssr/[root-of-the-server]__2773312c._.js.map +1 -1
  96. package/web/.next/server/chunks/ssr/[root-of-the-server]__5d87af2e._.js +1 -1
  97. package/web/.next/server/chunks/ssr/[root-of-the-server]__845a9d2a._.js +1 -1
  98. package/web/.next/server/chunks/ssr/[root-of-the-server]__845a9d2a._.js.map +1 -1
  99. package/web/.next/server/chunks/ssr/[root-of-the-server]__89e8a5cc._.js +2 -2
  100. package/web/.next/server/chunks/ssr/[root-of-the-server]__aad040c0._.js +2 -2
  101. package/web/.next/server/chunks/ssr/[root-of-the-server]__aad040c0._.js.map +1 -1
  102. package/web/.next/server/chunks/ssr/[root-of-the-server]__cbd8062c._.js +1 -1
  103. package/web/.next/server/chunks/ssr/[root-of-the-server]__cbd8062c._.js.map +1 -1
  104. package/web/.next/server/chunks/ssr/[root-of-the-server]__e70c5627._.js +1 -1
  105. package/web/.next/server/chunks/ssr/[root-of-the-server]__e70c5627._.js.map +1 -1
  106. package/web/.next/server/chunks/ssr/[root-of-the-server]__fdc75809._.js +1 -1
  107. package/web/.next/server/chunks/ssr/[root-of-the-server]__fdc75809._.js.map +1 -1
  108. package/web/.next/server/chunks/ssr/_135edb9c._.js +1 -1
  109. package/web/.next/server/chunks/ssr/_135edb9c._.js.map +1 -1
  110. package/web/.next/server/chunks/ssr/{_9f46dbc9._.js → _1e479e1e._.js} +2 -2
  111. package/web/.next/server/chunks/ssr/{_9f46dbc9._.js.map → _1e479e1e._.js.map} +1 -1
  112. package/web/.next/server/chunks/ssr/{_39d321e6._.js → _5ec9eb58._.js} +2 -2
  113. package/web/.next/server/chunks/ssr/{_39d321e6._.js.map → _5ec9eb58._.js.map} +1 -1
  114. package/web/.next/server/chunks/ssr/_8dacd1e7._.js +1 -1
  115. package/web/.next/server/chunks/ssr/_8dacd1e7._.js.map +1 -1
  116. package/web/.next/server/chunks/ssr/{_ade2278d._.js → _b40d3a2a._.js} +2 -2
  117. package/web/.next/server/chunks/ssr/{_ade2278d._.js.map → _b40d3a2a._.js.map} +1 -1
  118. package/web/.next/server/chunks/ssr/_cc77a143._.js +1 -1
  119. package/web/.next/server/chunks/ssr/_cc77a143._.js.map +1 -1
  120. package/web/.next/server/chunks/ssr/b1a17_presentation_web_components_features_settings_settings-page-client_tsx_6ed9d5f8._.js +1 -1
  121. package/web/.next/server/chunks/ssr/b1a17_presentation_web_components_features_settings_settings-page-client_tsx_6ed9d5f8._.js.map +1 -1
  122. package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_(dashboard)_page_actions_888633e1.js +1 -1
  123. package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_(dashboard)_page_actions_888633e1.js.map +1 -1
  124. package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_skills_page_actions_1fa8042e.js +1 -1
  125. package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_skills_page_actions_1fa8042e.js.map +1 -1
  126. package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_tools_page_actions_24684200.js +1 -1
  127. package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_tools_page_actions_24684200.js.map +1 -1
  128. package/web/.next/server/chunks/ssr/src_presentation_web_ce7cbc3c._.js +2 -2
  129. package/web/.next/server/chunks/ssr/src_presentation_web_ce7cbc3c._.js.map +1 -1
  130. package/web/.next/server/chunks/ssr/src_presentation_web_components_bf50c527._.js +1 -1
  131. package/web/.next/server/chunks/ssr/src_presentation_web_components_de814675._.js +1 -1
  132. package/web/.next/server/chunks/ssr/src_presentation_web_components_e599bb8c._.js +1 -1
  133. package/web/.next/server/chunks/ssr/src_presentation_web_components_e599bb8c._.js.map +1 -1
  134. package/web/.next/server/chunks/ssr/src_presentation_web_components_features_control-center_7ac3562e._.js +1 -1
  135. package/web/.next/server/chunks/ssr/src_presentation_web_components_features_control-center_7ac3562e._.js.map +1 -1
  136. package/web/.next/server/chunks/ssr/src_presentation_web_e2604413._.js +2 -2
  137. package/web/.next/server/chunks/ssr/src_presentation_web_e2604413._.js.map +1 -1
  138. package/web/.next/server/pages/500.html +2 -2
  139. package/web/.next/server/server-reference-manifest.js +1 -1
  140. package/web/.next/server/server-reference-manifest.json +31 -31
  141. package/web/.next/static/chunks/{04714f9562cf5739.js → 09666a074b524443.js} +1 -1
  142. package/web/.next/static/chunks/{1feb8891fbe8a9c8.js → 4f50ece4f1864060.js} +1 -1
  143. package/web/.next/static/chunks/{d18f4971ec3821a5.js → 53ec07012221519d.js} +1 -1
  144. package/web/.next/static/chunks/{0e094363c9e715fb.js → 704fa1154b3c85f7.js} +1 -1
  145. package/web/.next/static/chunks/{e7f05857443e9636.js → 790ea16995745106.js} +1 -1
  146. package/web/.next/static/chunks/{aaf2919cd109cea1.js → 87c8d610736ac118.js} +1 -1
  147. package/web/.next/static/chunks/{a231079d305a2fb0.js → 9100308889c48177.js} +1 -1
  148. package/web/.next/static/chunks/bb855bbee5f9e6ea.js +1 -0
  149. package/web/.next/static/chunks/{c4ccc44799712e61.js → d47f680b9b2156f8.js} +1 -1
  150. package/web/.next/static/chunks/{50bb2f60395f35f9.js → df7992847d83ebe3.js} +2 -2
  151. package/web/.next/static/chunks/{19a9745417896984.js → e68fb0eefc403f19.js} +1 -1
  152. package/web/.next/static/chunks/3bb35e0689e8b6b7.js +0 -1
  153. /package/web/.next/static/{-OiME7M6tZA1U0r_dP9Zb → 2zLwzoi3zvO049VYa4HS0}/_buildManifest.js +0 -0
  154. /package/web/.next/static/{-OiME7M6tZA1U0r_dP9Zb → 2zLwzoi3zvO049VYa4HS0}/_clientMiddlewareManifest.json +0 -0
  155. /package/web/.next/static/{-OiME7M6tZA1U0r_dP9Zb → 2zLwzoi3zvO049VYa4HS0}/_ssgManifest.js +0 -0
@@ -11,6 +11,7 @@
11
11
  * 4. Return result with old/new version info
12
12
  */
13
13
  import type { IVersionService } from '../../ports/output/services/version-service.interface.js';
14
+ import type { IDaemonService } from '../../ports/output/services/daemon-service.interface.js';
14
15
  export interface UpgradeResult {
15
16
  status: 'up-to-date' | 'upgraded' | 'error';
16
17
  currentVersion: string;
@@ -19,9 +20,16 @@ export interface UpgradeResult {
19
20
  }
20
21
  export declare class UpgradeCliUseCase {
21
22
  private readonly versionService;
22
- constructor(versionService: IVersionService);
23
+ private readonly daemonService;
24
+ constructor(versionService: IVersionService, daemonService: IDaemonService);
23
25
  execute(onOutput?: (data: string) => void): Promise<UpgradeResult>;
24
26
  private getLatestVersion;
27
+ /**
28
+ * Schedule a daemon self-restart after upgrade.
29
+ * Reads the current daemon port, spawns a new daemon process with the
30
+ * upgraded code, then exits the current process after a brief delay.
31
+ */
32
+ scheduleDaemonRestart(): Promise<void>;
25
33
  private runNpmInstall;
26
34
  }
27
35
  //# sourceMappingURL=upgrade-cli.use-case.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"upgrade-cli.use-case.d.ts","sourceRoot":"","sources":["../../../../../../../packages/core/src/application/use-cases/upgrade/upgrade-cli.use-case.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAIH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,0DAA0D,CAAC;AAEhG,MAAM,WAAW,aAAa;IAC5B,MAAM,EAAE,YAAY,GAAG,UAAU,GAAG,OAAO,CAAC;IAC5C,cAAc,EAAE,MAAM,CAAC;IACvB,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAID,qBACa,iBAAiB;IAG1B,OAAO,CAAC,QAAQ,CAAC,cAAc;gBAAd,cAAc,EAAE,eAAe;IAG5C,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,GAAG,OAAO,CAAC,aAAa,CAAC;IAkCxE,OAAO,CAAC,gBAAgB;IA6CxB,OAAO,CAAC,aAAa;CAuBtB"}
1
+ {"version":3,"file":"upgrade-cli.use-case.d.ts","sourceRoot":"","sources":["../../../../../../../packages/core/src/application/use-cases/upgrade/upgrade-cli.use-case.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAIH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,0DAA0D,CAAC;AAChG,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,yDAAyD,CAAC;AAE9F,MAAM,WAAW,aAAa;IAC5B,MAAM,EAAE,YAAY,GAAG,UAAU,GAAG,OAAO,CAAC;IAC5C,cAAc,EAAE,MAAM,CAAC;IACvB,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAOD,qBACa,iBAAiB;IAG1B,OAAO,CAAC,QAAQ,CAAC,cAAc;IAE/B,OAAO,CAAC,QAAQ,CAAC,aAAa;gBAFb,cAAc,EAAE,eAAe,EAE/B,aAAa,EAAE,cAAc;IAG1C,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,GAAG,OAAO,CAAC,aAAa,CAAC;IAkCxE,OAAO,CAAC,gBAAgB;IA6CxB;;;;OAIG;IACG,qBAAqB,IAAI,OAAO,CAAC,IAAI,CAAC;IA2B5C,OAAO,CAAC,aAAa;CAuBtB"}
@@ -25,10 +25,14 @@ var __param = (this && this.__param) || function (paramIndex, decorator) {
25
25
  import { injectable, inject } from 'tsyringe';
26
26
  import { spawn } from 'node:child_process';
27
27
  const VERSION_CHECK_TIMEOUT_MS = 10_000;
28
+ /** Delay (ms) before the current process exits to allow the SSE response to flush. */
29
+ const SELF_RESTART_DELAY_MS = 1_000;
28
30
  let UpgradeCliUseCase = class UpgradeCliUseCase {
29
31
  versionService;
30
- constructor(versionService) {
32
+ daemonService;
33
+ constructor(versionService, daemonService) {
31
34
  this.versionService = versionService;
35
+ this.daemonService = daemonService;
32
36
  }
33
37
  async execute(onOutput) {
34
38
  const { version: currentVersion } = this.versionService.getVersion();
@@ -100,6 +104,30 @@ let UpgradeCliUseCase = class UpgradeCliUseCase {
100
104
  });
101
105
  });
102
106
  }
107
+ /**
108
+ * Schedule a daemon self-restart after upgrade.
109
+ * Reads the current daemon port, spawns a new daemon process with the
110
+ * upgraded code, then exits the current process after a brief delay.
111
+ */
112
+ async scheduleDaemonRestart() {
113
+ const state = await this.daemonService.read();
114
+ const port = state?.port;
115
+ // Delete daemon.json so the new process can write a fresh one
116
+ await this.daemonService.delete();
117
+ // Spawn new daemon process using the upgraded CLI binary.
118
+ // Use process.argv[1] which points to the shep CLI entry point —
119
+ // after npm install this resolves to the upgraded version on disk.
120
+ const child = spawn(process.execPath, [...process.execArgv, process.argv[1], '_serve', ...(port ? ['--port', String(port)] : [])], {
121
+ detached: true,
122
+ stdio: 'ignore',
123
+ windowsHide: true,
124
+ });
125
+ child.unref();
126
+ // Give the response stream time to flush, then exit the current process
127
+ setTimeout(() => {
128
+ process.exit(0);
129
+ }, SELF_RESTART_DELAY_MS);
130
+ }
103
131
  runNpmInstall(onOutput) {
104
132
  return new Promise((resolve, reject) => {
105
133
  const child = spawn('npm', ['i', '-g', '@shepai/cli@latest'], {
@@ -123,6 +151,7 @@ let UpgradeCliUseCase = class UpgradeCliUseCase {
123
151
  UpgradeCliUseCase = __decorate([
124
152
  injectable(),
125
153
  __param(0, inject('IVersionService')),
126
- __metadata("design:paramtypes", [Object])
154
+ __param(1, inject('IDaemonService')),
155
+ __metadata("design:paramtypes", [Object, Object])
127
156
  ], UpgradeCliUseCase);
128
157
  export { UpgradeCliUseCase };
@@ -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;AAkHrC;;;;;;GAMG;AACH,wBAAsB,mBAAmB,IAAI,OAAO,CAAC,OAAO,SAAS,CAAC,CAgUrE;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;AAmHrC;;;;;;GAMG;AACH,wBAAsB,mBAAmB,IAAI,OAAO,CAAC,OAAO,SAAS,CAAC,CA+TrE;AAED;;;GAGG;AACH,wBAAgB,sBAAsB,IAAI,OAAO,CAEhD;AAED;;;GAGG;AACH,OAAO,EAAE,SAAS,EAAE,CAAC"}
@@ -18,6 +18,7 @@ import { SQLiteRepositoryRepository } from '../repositories/sqlite-repository.re
18
18
  import { AgentValidatorService } from '../services/agents/common/agent-validator.service.js';
19
19
  import { promisify } from 'node:util';
20
20
  import { execFile } from 'node:child_process';
21
+ import { IS_WINDOWS } from '../platform.js';
21
22
  import { VersionService } from '../services/version.service.js';
22
23
  import { WorktreeService } from '../services/git/worktree.service.js';
23
24
  import { ToolInstallerServiceImpl } from '../services/tool-installer/tool-installer.service.js';
@@ -129,7 +130,7 @@ export async function initializeContainer() {
129
130
  // On Windows, agent CLIs ship as .cmd/.ps1 scripts (e.g. cursor's `agent.cmd`).
130
131
  // execFile without shell: true cannot resolve .cmd extensions, causing ENOENT.
131
132
  const execFileAsync = promisify(execFile);
132
- const execFn = process.platform === 'win32'
133
+ const execFn = IS_WINDOWS
133
134
  ? (file, args, options) => execFileAsync(file, args, { ...options, shell: true, windowsHide: true })
134
135
  : execFileAsync;
135
136
  container.registerInstance('ExecFunction', execFn);
@@ -0,0 +1,7 @@
1
+ /**
2
+ * Platform detection constants.
3
+ *
4
+ * Evaluated once at module load — safe to use in hot paths.
5
+ */
6
+ export declare const IS_WINDOWS: boolean;
7
+ //# sourceMappingURL=platform.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"platform.d.ts","sourceRoot":"","sources":["../../../../../packages/core/src/infrastructure/platform.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,eAAO,MAAM,UAAU,SAA+B,CAAC"}
@@ -0,0 +1,6 @@
1
+ /**
2
+ * Platform detection constants.
3
+ *
4
+ * Evaluated once at module load — safe to use in hot paths.
5
+ */
6
+ export const IS_WINDOWS = process.platform === 'win32';
@@ -1 +1 @@
1
- {"version":3,"file":"claude-code-executor.service.d.ts","sourceRoot":"","sources":["../../../../../../../../../packages/core/src/infrastructure/services/agents/common/executors/claude-code-executor.service.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,YAAY,EAAE,MAAM,2CAA2C,CAAC;AACzF,OAAO,KAAK,EACV,cAAc,EACd,qBAAqB,EACrB,oBAAoB,EACpB,yBAAyB,EAC1B,MAAM,4EAA4E,CAAC;AACpF,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAYjD;;;GAGG;AACH,qBAAa,yBAA0B,YAAW,cAAc;IAMlD,OAAO,CAAC,QAAQ,CAAC,KAAK;IALlC,QAAQ,CAAC,SAAS,EAAE,SAAS,CAA8B;IAE3D,4EAA4E;IAC5E,OAAO,CAAC,MAAM,CAAS;gBAEM,KAAK,EAAE,aAAa;IAEjD,4EAA4E;IAC5E,OAAO,CAAC,GAAG;IAML,OAAO,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,qBAAqB,GAAG,OAAO,CAAC,oBAAoB,CAAC;IAmHtF,aAAa,CAClB,MAAM,EAAE,MAAM,EACd,OAAO,CAAC,EAAE,qBAAqB,GAC9B,aAAa,CAAC,yBAAyB,CAAC;IA+F3C;;;OAGG;IACH,OAAO,CAAC,cAAc;IAmCtB,eAAe,CAAC,OAAO,EAAE,YAAY,GAAG,OAAO;IAI/C,OAAO,CAAC,SAAS;IAajB,OAAO,CAAC,eAAe;IAUvB,OAAO,CAAC,iBAAiB;IAyBzB,OAAO,CAAC,eAAe;IAiCvB,OAAO,CAAC,eAAe;CAkExB"}
1
+ {"version":3,"file":"claude-code-executor.service.d.ts","sourceRoot":"","sources":["../../../../../../../../../packages/core/src/infrastructure/services/agents/common/executors/claude-code-executor.service.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,YAAY,EAAE,MAAM,2CAA2C,CAAC;AACzF,OAAO,KAAK,EACV,cAAc,EACd,qBAAqB,EACrB,oBAAoB,EACpB,yBAAyB,EAC1B,MAAM,4EAA4E,CAAC;AACpF,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAajD;;;GAGG;AACH,qBAAa,yBAA0B,YAAW,cAAc;IAMlD,OAAO,CAAC,QAAQ,CAAC,KAAK;IALlC,QAAQ,CAAC,SAAS,EAAE,SAAS,CAA8B;IAE3D,4EAA4E;IAC5E,OAAO,CAAC,MAAM,CAAS;gBAEM,KAAK,EAAE,aAAa;IAEjD,4EAA4E;IAC5E,OAAO,CAAC,GAAG;IAML,OAAO,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,qBAAqB,GAAG,OAAO,CAAC,oBAAoB,CAAC;IAmHtF,aAAa,CAClB,MAAM,EAAE,MAAM,EACd,OAAO,CAAC,EAAE,qBAAqB,GAC9B,aAAa,CAAC,yBAAyB,CAAC;IA+F3C;;;OAGG;IACH,OAAO,CAAC,cAAc;IAmCtB,eAAe,CAAC,OAAO,EAAE,YAAY,GAAG,OAAO;IAI/C,OAAO,CAAC,SAAS;IAajB,OAAO,CAAC,eAAe;IAUvB,OAAO,CAAC,iBAAiB;IAyBzB,OAAO,CAAC,eAAe;IAiCvB,OAAO,CAAC,eAAe;CAkExB"}
@@ -9,6 +9,7 @@
9
9
  * to enable testability without mocking node:child_process directly.
10
10
  */
11
11
  import { getCurrentPhase, getLogPrefix } from '../../feature-agent/log-context.js';
12
+ import { IS_WINDOWS } from '../../../../platform.js';
12
13
  /** Features supported by Claude Code CLI */
13
14
  const SUPPORTED_FEATURES = new Set([
14
15
  'session-resume',
@@ -297,7 +298,7 @@ export class ClaudeCodeExecutorService {
297
298
  // Do NOT use shell=true — it causes DEP0190 argument escaping issues
298
299
  // and mangles prompts with special characters. The claude CLI is a
299
300
  // native .exe, so spawn() finds it on PATH without shell.
300
- if (process.platform === 'win32') {
301
+ if (IS_WINDOWS) {
301
302
  spawnOpts.windowsHide = true;
302
303
  }
303
304
  // Strip CLAUDECODE env var to prevent "nested session" error when shep
@@ -1 +1 @@
1
- {"version":3,"file":"cursor-executor.service.d.ts","sourceRoot":"","sources":["../../../../../../../../../packages/core/src/infrastructure/services/agents/common/executors/cursor-executor.service.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,YAAY,EAAE,MAAM,2CAA2C,CAAC;AACzF,OAAO,KAAK,EACV,cAAc,EACd,qBAAqB,EACrB,oBAAoB,EACpB,yBAAyB,EAC1B,MAAM,4EAA4E,CAAC;AACpF,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAsBjD;;;GAGG;AACH,qBAAa,qBAAsB,YAAW,cAAc;IAM9C,OAAO,CAAC,QAAQ,CAAC,KAAK;IALlC,QAAQ,CAAC,SAAS,EAAE,SAAS,CAAyB;IAEtD,4EAA4E;IAC5E,OAAO,CAAC,MAAM,CAAS;gBAEM,KAAK,EAAE,aAAa;IAEjD,4EAA4E;IAC5E,OAAO,CAAC,GAAG;IAMX,eAAe,CAAC,OAAO,EAAE,YAAY,GAAG,OAAO;IAIzC,OAAO,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,qBAAqB,GAAG,OAAO,CAAC,oBAAoB,CAAC;IA0GtF,aAAa,CAClB,MAAM,EAAE,MAAM,EACd,OAAO,CAAC,EAAE,qBAAqB,GAC9B,aAAa,CAAC,yBAAyB,CAAC;IA8E3C;;OAEG;IACH,OAAO,CAAC,cAAc;IAkCtB,OAAO,CAAC,SAAS;IASjB,OAAO,CAAC,eAAe;IAOvB,OAAO,CAAC,iBAAiB;IAoBzB,OAAO,CAAC,eAAe;CAgDxB"}
1
+ {"version":3,"file":"cursor-executor.service.d.ts","sourceRoot":"","sources":["../../../../../../../../../packages/core/src/infrastructure/services/agents/common/executors/cursor-executor.service.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,YAAY,EAAE,MAAM,2CAA2C,CAAC;AACzF,OAAO,KAAK,EACV,cAAc,EACd,qBAAqB,EACrB,oBAAoB,EACpB,yBAAyB,EAC1B,MAAM,4EAA4E,CAAC;AACpF,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAuBjD;;;GAGG;AACH,qBAAa,qBAAsB,YAAW,cAAc;IAM9C,OAAO,CAAC,QAAQ,CAAC,KAAK;IALlC,QAAQ,CAAC,SAAS,EAAE,SAAS,CAAyB;IAEtD,4EAA4E;IAC5E,OAAO,CAAC,MAAM,CAAS;gBAEM,KAAK,EAAE,aAAa;IAEjD,4EAA4E;IAC5E,OAAO,CAAC,GAAG;IAMX,eAAe,CAAC,OAAO,EAAE,YAAY,GAAG,OAAO;IAIzC,OAAO,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,qBAAqB,GAAG,OAAO,CAAC,oBAAoB,CAAC;IA0GtF,aAAa,CAClB,MAAM,EAAE,MAAM,EACd,OAAO,CAAC,EAAE,qBAAqB,GAC9B,aAAa,CAAC,yBAAyB,CAAC;IA8E3C;;OAEG;IACH,OAAO,CAAC,cAAc;IAkCtB,OAAO,CAAC,SAAS;IASjB,OAAO,CAAC,eAAe;IAOvB,OAAO,CAAC,iBAAiB;IAoBzB,OAAO,CAAC,eAAe;CAgDxB"}
@@ -9,6 +9,7 @@
9
9
  * to enable testability without mocking node:child_process directly.
10
10
  */
11
11
  import { getCurrentPhase, getLogPrefix } from '../../feature-agent/log-context.js';
12
+ import { IS_WINDOWS } from '../../../../platform.js';
12
13
  /**
13
14
  * Map canonical model IDs (used across shep) to Cursor CLI model names.
14
15
  * Cursor uses short names like "sonnet-4.6" instead of "claude-sonnet-4-6".
@@ -276,7 +277,7 @@ export class CursorExecutorService {
276
277
  spawnOpts.cwd = options.cwd;
277
278
  // On Windows, the cursor agent is a .cmd script which requires shell: true
278
279
  // to resolve via PATH. Also hide the console window.
279
- if (process.platform === 'win32') {
280
+ if (IS_WINDOWS) {
280
281
  spawnOpts.shell = true;
281
282
  spawnOpts.windowsHide = true;
282
283
  }
@@ -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;AAOlF;;;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,YAAY,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC;IAW5D,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;IAMzD,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,YAAY,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC;IAW5D,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;IAMzD,OAAO,CAAC,mBAAmB;IA2B3B,OAAO,CAAC,aAAa;IAgCrB,OAAO,CAAC,kBAAkB;IAI1B,OAAO,CAAC,qBAAqB;CAsB9B"}
@@ -25,6 +25,7 @@ const GIT_AUTO_INIT_USER = 'shep-ai[bot]';
25
25
  const GIT_AUTO_INIT_EMAIL = 'bot@shep.bot';
26
26
  import { WorktreeError, WorktreeErrorCode, } from '../../../application/ports/output/services/worktree-service.interface.js';
27
27
  import { getShepHomeDir } from '../filesystem/shep-directory.service.js';
28
+ import { IS_WINDOWS } from '../../platform.js';
28
29
  let WorktreeService = class WorktreeService {
29
30
  execFile;
30
31
  constructor(execFile) {
@@ -181,7 +182,7 @@ let WorktreeService = class WorktreeService {
181
182
  normalizeWorktreePath(input) {
182
183
  // On Windows, git outputs forward slashes but path.normalize uses backslashes.
183
184
  // Normalize to forward slashes before comparing, case-insensitive.
184
- if (process.platform === 'win32') {
185
+ if (IS_WINDOWS) {
185
186
  let normalized = path.normalize(input).replace(/\\/g, '/').replace(/\/+$/, '');
186
187
  try {
187
188
  normalized = realpathSync(normalized).replace(/\\/g, '/');
@@ -1 +1 @@
1
- {"version":3,"file":"web-server.service.d.ts","sourceRoot":"","sources":["../../../../../../packages/core/src/infrastructure/services/web-server.service.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAGH,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,IAAI,MAAM,WAAW,CAAC;AAG7B,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,yEAAyE,CAAC;AAIjH,MAAM,WAAW,aAAa;IAC5B,aAAa,EAAE,OAAO,IAAI,CAAC;IAC3B,gBAAgB,EAAE,OAAO,IAAI,CAAC,YAAY,CAAC;CAC5C;AAOD;;;;;;;;;GASG;AACH,wBAAgB,aAAa,IAAI;IAAE,GAAG,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,OAAO,CAAA;CAAE,CAsB7D;AAED,qBACa,gBAAiB,YAAW,iBAAiB;IACxD,OAAO,CAAC,GAAG,CAAwB;IACnC,OAAO,CAAC,MAAM,CAA4B;IAC1C,OAAO,CAAC,cAAc,CAAS;IAC/B,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAgB;gBAEzB,IAAI,GAAE,OAAO,CAAC,aAAa,CAAM;IAI7C;;;;;OAKG;IACG,KAAK,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,UAAO,GAAG,OAAO,CAAC,IAAI,CAAC;IA0CjE;;;OAGG;IACG,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;CAuB5B"}
1
+ {"version":3,"file":"web-server.service.d.ts","sourceRoot":"","sources":["../../../../../../packages/core/src/infrastructure/services/web-server.service.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAGH,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,IAAI,MAAM,WAAW,CAAC;AAG7B,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,yEAAyE,CAAC;AAKjH,MAAM,WAAW,aAAa;IAC5B,aAAa,EAAE,OAAO,IAAI,CAAC;IAC3B,gBAAgB,EAAE,OAAO,IAAI,CAAC,YAAY,CAAC;CAC5C;AAOD;;;;;;;;;GASG;AACH,wBAAgB,aAAa,IAAI;IAAE,GAAG,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,OAAO,CAAA;CAAE,CAsB7D;AAED,qBACa,gBAAiB,YAAW,iBAAiB;IACxD,OAAO,CAAC,GAAG,CAAwB;IACnC,OAAO,CAAC,MAAM,CAA4B;IAC1C,OAAO,CAAC,cAAc,CAAS;IAC/B,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAgB;gBAEzB,IAAI,GAAE,OAAO,CAAC,aAAa,CAAM;IAI7C;;;;;OAKG;IACG,KAAK,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,UAAO,GAAG,OAAO,CAAC,IAAI,CAAC;IA0CjE;;;OAGG;IACG,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;CAuB5B"}
@@ -22,6 +22,7 @@ import next from 'next';
22
22
  import http from 'node:http';
23
23
  import path from 'node:path';
24
24
  import fs from 'node:fs';
25
+ import { IS_WINDOWS } from '../platform.js';
25
26
  const defaultDeps = {
26
27
  createNextApp: next,
27
28
  createHttpServer: http.createServer,
@@ -76,7 +77,7 @@ let WebServerService = class WebServerService {
76
77
  // the absolute path (can't compute relative across drives), and path.join
77
78
  // produces a mangled path like D:\project\C:\...\web\. Fix by ensuring
78
79
  // CWD is on the same drive as dir.
79
- if (process.platform === 'win32') {
80
+ if (IS_WINDOWS) {
80
81
  const getDriveLetter = (p) => p.match(/^[a-zA-Z]:/)?.[0]?.toUpperCase();
81
82
  const cwdDrive = getDriveLetter(process.cwd());
82
83
  const dirDrive = getDriveLetter(dir);
@@ -1 +1 @@
1
- {"version":3,"file":"route.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/app/api/cli-upgrade/route.ts"],"names":[],"mappings":"AAIA,eAAO,MAAM,OAAO,kBAAkB,CAAC;AAEvC,wBAAsB,IAAI,IAAI,OAAO,CAAC,QAAQ,CAAC,CA+B9C"}
1
+ {"version":3,"file":"route.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/app/api/cli-upgrade/route.ts"],"names":[],"mappings":"AAIA,eAAO,MAAM,OAAO,kBAAkB,CAAC;AAEvC,wBAAsB,IAAI,IAAI,OAAO,CAAC,QAAQ,CAAC,CA4C9C"}
@@ -11,13 +11,26 @@ export async function POST() {
11
11
  controller.enqueue(encoder.encode(`data: ${chunk.replace(/\n/g, '\ndata: ')}\n\n`));
12
12
  });
13
13
  controller.enqueue(encoder.encode(`event: done\ndata: ${JSON.stringify(result)}\n\n`));
14
+ // If the upgrade succeeded, schedule a daemon self-restart so the
15
+ // new version is loaded automatically — no manual restart needed.
16
+ if (result.status === 'upgraded') {
17
+ controller.enqueue(encoder.encode(`event: restarting\ndata: restarting\n\n`));
18
+ controller.close();
19
+ await useCase.scheduleDaemonRestart();
20
+ return;
21
+ }
14
22
  }
15
23
  catch (error) {
16
24
  const message = error instanceof Error ? error.message : 'Upgrade failed';
17
25
  controller.enqueue(encoder.encode(`event: done\ndata: ${JSON.stringify({ status: 'error', currentVersion: '', latestVersion: null, errorMessage: message })}\n\n`));
18
26
  }
19
27
  finally {
20
- controller.close();
28
+ try {
29
+ controller.close();
30
+ }
31
+ catch {
32
+ // Already closed (e.g. after restart path)
33
+ }
21
34
  }
22
35
  },
23
36
  });
@@ -1 +1 @@
1
- {"version":3,"file":"version-badge.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/common/version-badge/version-badge.tsx"],"names":[],"mappings":"AAMA,MAAM,WAAW,iBAAiB;IAChC,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,wBAAgB,YAAY,CAAC,EAC3B,OAAO,EACP,MAAM,EACN,UAAU,EACV,KAAa,EACb,WAA2B,EAC3B,WAAW,EACX,YAAY,GACb,EAAE,iBAAiB,2CA2EnB"}
1
+ {"version":3,"file":"version-badge.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/common/version-badge/version-badge.tsx"],"names":[],"mappings":"AAMA,MAAM,WAAW,iBAAiB;IAChC,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,wBAAgB,YAAY,CAAC,EAC3B,OAAO,EACP,MAAM,EACN,UAAU,EACV,KAAa,EACb,WAA2B,EAC3B,WAAW,EACX,YAAY,GACb,EAAE,iBAAiB,2CAyFnB"}
@@ -10,9 +10,14 @@ export function VersionBadge({ version, branch, commitHash, isDev = false, packa
10
10
  // In dev mode show "1.92.2-dev", in production show "v1.92.2"
11
11
  const displayVersion = isDev ? `${version}-dev` : `v${version}`;
12
12
  const isUpgrading = upgradeStatus === 'upgrading';
13
+ const isRestarting = upgradeStatus === 'restarting';
13
14
  const didUpgrade = upgradeStatus === 'upgraded';
14
15
  const upgradeError = upgradeStatus === 'error';
15
- return (_jsx(TooltipProvider, { delayDuration: 200, children: _jsxs(Tooltip, { children: [_jsx(TooltipTrigger, { asChild: true, children: _jsxs("span", { className: "text-muted-foreground/80 hover:text-muted-foreground relative cursor-default text-[11px] leading-tight transition-colors", "data-testid": "version-label", children: [displayVersion, updateAvailable && !didUpgrade ? (_jsx("span", { className: "absolute -top-0.5 -right-1.5 size-1.5 rounded-full bg-emerald-400", "data-testid": "update-dot" })) : null] }) }), _jsxs(TooltipContent, { side: "right", className: "max-w-[280px] space-y-1 p-3 text-left", children: [_jsx("div", { className: "mb-1.5 text-xs font-semibold", children: packageName }), description ? (_jsx("div", { className: "text-[10px] leading-snug opacity-70", children: description })) : null, _jsxs("div", { className: "border-t border-white/10 pt-1.5", children: [_jsx(Row, { label: "Version", value: displayVersion }), isDev && branch ? _jsx(Row, { label: "Branch", value: branch }) : null, isDev && shortHash ? _jsx(Row, { label: "Commit", value: shortHash, mono: true }) : null, isDev && instancePath ? _jsx(Row, { label: "Path", value: instancePath, mono: true }) : null, latest ? (_jsx(Row, { label: "Latest", value: `v${latest}`, highlight: updateAvailable })) : null] }), didUpgrade ? (_jsx("div", { className: "border-t border-white/10 pt-1.5", children: _jsx("span", { className: "text-[10px] font-medium text-emerald-400", "data-testid": "upgrade-success", children: "Upgraded successfully \u2014 restart to apply" }) })) : upgradeError ? (_jsx("div", { className: "border-t border-white/10 pt-1.5", children: _jsx("span", { className: "text-[10px] font-medium text-red-400", "data-testid": "upgrade-error", children: "Upgrade failed" }) })) : updateAvailable ? (_jsx("div", { className: "border-t border-white/10 pt-1.5", children: _jsx("button", { type: "button", onClick: startUpgrade, disabled: isUpgrading, className: "inline-flex items-center gap-1 text-[10px] font-medium text-emerald-400 transition-colors hover:text-emerald-300 disabled:opacity-50", "data-testid": "upgrade-button", children: isUpgrading ? 'Upgrading...' : `Upgrade to v${latest}` }) })) : null] })] }) }));
16
+ return (_jsx(TooltipProvider, { delayDuration: 200, children: _jsxs(Tooltip, { children: [_jsx(TooltipTrigger, { asChild: true, children: _jsxs("span", { className: "text-muted-foreground/80 hover:text-muted-foreground relative cursor-default text-[11px] leading-tight transition-colors", "data-testid": "version-label", children: [displayVersion, updateAvailable && !didUpgrade && !isRestarting ? (_jsx("span", { className: "absolute -top-0.5 -right-1.5 size-1.5 rounded-full bg-emerald-400", "data-testid": "update-dot" })) : null] }) }), _jsxs(TooltipContent, { side: "right", className: "max-w-[280px] space-y-1 p-3 text-left", children: [_jsx("div", { className: "mb-1.5 text-xs font-semibold", children: packageName }), description ? (_jsx("div", { className: "text-[10px] leading-snug opacity-70", children: description })) : null, _jsxs("div", { className: "border-t border-white/10 pt-1.5", children: [_jsx(Row, { label: "Version", value: displayVersion }), isDev && branch ? _jsx(Row, { label: "Branch", value: branch }) : null, isDev && shortHash ? _jsx(Row, { label: "Commit", value: shortHash, mono: true }) : null, isDev && instancePath ? _jsx(Row, { label: "Path", value: instancePath, mono: true }) : null, latest ? (_jsx(Row, { label: "Latest", value: `v${latest}`, highlight: updateAvailable })) : null] }), isRestarting ? (_jsx("div", { className: "border-t border-white/10 pt-1.5", children: _jsx("span", { className: "text-[10px] font-medium text-emerald-400", "data-testid": "upgrade-restarting", children: "Restarting..." }) })) : didUpgrade ? (_jsx("div", { className: "border-t border-white/10 pt-1.5", children: _jsx("span", { className: "text-[10px] font-medium text-emerald-400", "data-testid": "upgrade-success", children: "Upgraded successfully" }) })) : upgradeError ? (_jsx("div", { className: "border-t border-white/10 pt-1.5", children: _jsx("span", { className: "text-[10px] font-medium text-red-400", "data-testid": "upgrade-error", children: "Upgrade failed" }) })) : updateAvailable ? (_jsx("div", { className: "border-t border-white/10 pt-1.5", children: _jsx("button", { type: "button", onClick: startUpgrade, disabled: isUpgrading || isRestarting, className: "inline-flex items-center gap-1 text-[10px] font-medium text-emerald-400 transition-colors hover:text-emerald-300 disabled:opacity-50", "data-testid": "upgrade-button", children: isUpgrading
17
+ ? 'Upgrading...'
18
+ : isRestarting
19
+ ? 'Restarting...'
20
+ : `Upgrade to v${latest}` }) })) : null] })] }) }));
16
21
  }
17
22
  function Row({ label, value, highlight, mono, }) {
18
23
  return (_jsxs("div", { className: "flex items-center justify-between gap-4 text-[10px]", children: [_jsx("span", { className: "opacity-60", children: label }), _jsx("span", { className: [
@@ -1 +1 @@
1
- {"version":3,"file":"version-badge.stories.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/common/version-badge/version-badge.stories.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,QAAQ,EAAa,MAAM,kBAAkB,CAAC;AAClE,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAwD/C,QAAA,MAAM,IAAI,EAAE,IAAI,CAAC,OAAO,YAAY,CAOnC,CAAC;AAEF,eAAe,IAAI,CAAC;AACpB,KAAK,KAAK,GAAG,QAAQ,CAAC,OAAO,YAAY,CAAC,CAAC;AAE3C,mFAAmF;AACnF,eAAO,MAAM,UAAU,EAAE,KAOxB,CAAC;AAEF,wFAAwF;AACxF,eAAO,MAAM,WAAW,EAAE,KAWzB,CAAC;AAEF,mEAAmE;AACnE,eAAO,MAAM,UAAU,EAAE,KAWxB,CAAC;AAEF,yCAAyC;AACzC,eAAO,MAAM,OAAO,EAAE,KAKrB,CAAC;AAEF,sFAAsF;AACtF,eAAO,MAAM,eAAe,EAAE,KAO7B,CAAC;AAEF,oFAAoF;AACpF,eAAO,MAAM,kBAAkB,EAAE,KAWhC,CAAC;AAEF,kEAAkE;AAClE,eAAO,MAAM,UAAU,EAAE,KAOxB,CAAC"}
1
+ {"version":3,"file":"version-badge.stories.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/common/version-badge/version-badge.stories.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,QAAQ,EAAa,MAAM,kBAAkB,CAAC;AAClE,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AA+D/C,QAAA,MAAM,IAAI,EAAE,IAAI,CAAC,OAAO,YAAY,CAOnC,CAAC;AAEF,eAAe,IAAI,CAAC;AACpB,KAAK,KAAK,GAAG,QAAQ,CAAC,OAAO,YAAY,CAAC,CAAC;AAE3C,mFAAmF;AACnF,eAAO,MAAM,UAAU,EAAE,KAOxB,CAAC;AAEF,wFAAwF;AACxF,eAAO,MAAM,WAAW,EAAE,KAWzB,CAAC;AAEF,mEAAmE;AACnE,eAAO,MAAM,UAAU,EAAE,KAWxB,CAAC;AAEF,yCAAyC;AACzC,eAAO,MAAM,OAAO,EAAE,KAKrB,CAAC;AAEF,sFAAsF;AACtF,eAAO,MAAM,eAAe,EAAE,KAO7B,CAAC;AAEF,oFAAoF;AACpF,eAAO,MAAM,kBAAkB,EAAE,KAWhC,CAAC;AAEF,kEAAkE;AAClE,eAAO,MAAM,UAAU,EAAE,KAOxB,CAAC"}
@@ -22,6 +22,7 @@ function withNpmVersion(latest) {
22
22
  controller.enqueue(encoder.encode(`data: Upgrading to v${latest}...\n\n`));
23
23
  setTimeout(() => {
24
24
  controller.enqueue(encoder.encode(`event: done\ndata: ${JSON.stringify({ status: 'upgraded', currentVersion: '1.90.0', latestVersion: latest })}\n\n`));
25
+ controller.enqueue(encoder.encode(`event: restarting\ndata: restarting\n\n`));
25
26
  controller.close();
26
27
  }, 1000);
27
28
  },
@@ -31,6 +32,12 @@ function withNpmVersion(latest) {
31
32
  headers: { 'Content-Type': 'text/event-stream' },
32
33
  });
33
34
  }
35
+ if (url.includes('/api/version')) {
36
+ return new Response(JSON.stringify({ version: latest }), {
37
+ status: 200,
38
+ headers: { 'Content-Type': 'application/json' },
39
+ });
40
+ }
34
41
  return originalFetch(input, init);
35
42
  });
36
43
  return _jsx(Story, {});
@@ -1,4 +1,4 @@
1
- export type UpgradeStatus = 'idle' | 'upgrading' | 'upgraded' | 'up-to-date' | 'error';
1
+ export type UpgradeStatus = 'idle' | 'upgrading' | 'restarting' | 'upgraded' | 'up-to-date' | 'error';
2
2
  export interface CliUpgradeState {
3
3
  status: UpgradeStatus;
4
4
  output: string;
@@ -1 +1 @@
1
- {"version":3,"file":"use-cli-upgrade.d.ts","sourceRoot":"","sources":["../../../../../src/presentation/web/hooks/use-cli-upgrade.ts"],"names":[],"mappings":"AAIA,MAAM,MAAM,aAAa,GAAG,MAAM,GAAG,WAAW,GAAG,UAAU,GAAG,YAAY,GAAG,OAAO,CAAC;AAEvF,MAAM,WAAW,eAAe;IAC9B,MAAM,EAAE,aAAa,CAAC;IACtB,MAAM,EAAE,MAAM,CAAC;IACf,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,iBAAiB;IAChC,YAAY,EAAE,MAAM,IAAI,CAAC;CAC1B;AAED,wBAAgB,aAAa,IAAI,eAAe,GAAG,iBAAiB,CA6EnE"}
1
+ {"version":3,"file":"use-cli-upgrade.d.ts","sourceRoot":"","sources":["../../../../../src/presentation/web/hooks/use-cli-upgrade.ts"],"names":[],"mappings":"AAIA,MAAM,MAAM,aAAa,GACrB,MAAM,GACN,WAAW,GACX,YAAY,GACZ,UAAU,GACV,YAAY,GACZ,OAAO,CAAC;AAOZ,MAAM,WAAW,eAAe;IAC9B,MAAM,EAAE,aAAa,CAAC;IACtB,MAAM,EAAE,MAAM,CAAC;IACf,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,iBAAiB;IAChC,YAAY,EAAE,MAAM,IAAI,CAAC;CAC1B;AA4BD,wBAAgB,aAAa,IAAI,eAAe,GAAG,iBAAiB,CAuFnE"}
@@ -1,16 +1,46 @@
1
1
  'use client';
2
2
  import { useCallback, useRef, useState } from 'react';
3
+ /** How often to poll the server during restart (ms). */
4
+ const RESTART_POLL_MS = 500;
5
+ /** Maximum time to wait for the server to come back after restart (ms). */
6
+ const RESTART_TIMEOUT_MS = 30_000;
7
+ /**
8
+ * Poll the server until it responds, then reload the page.
9
+ */
10
+ function waitForServerAndReload(timeoutMs, pollMs) {
11
+ const deadline = Date.now() + timeoutMs;
12
+ const poll = () => {
13
+ if (Date.now() > deadline)
14
+ return;
15
+ fetch('/api/version', { method: 'GET', cache: 'no-store' })
16
+ .then((res) => {
17
+ if (res.ok) {
18
+ window.location.reload();
19
+ }
20
+ else {
21
+ setTimeout(poll, pollMs);
22
+ }
23
+ })
24
+ .catch(() => {
25
+ setTimeout(poll, pollMs);
26
+ });
27
+ };
28
+ // Brief initial delay to let the old server shut down
29
+ setTimeout(poll, pollMs);
30
+ }
3
31
  export function useCliUpgrade() {
4
32
  const [status, setStatus] = useState('idle');
5
33
  const [output, setOutput] = useState('');
6
34
  const [errorMessage, setErrorMessage] = useState();
7
35
  const abortRef = useRef(null);
36
+ const restartingRef = useRef(false);
8
37
  const startUpgrade = useCallback(() => {
9
- if (status === 'upgrading')
38
+ if (status === 'upgrading' || status === 'restarting')
10
39
  return;
11
40
  setStatus('upgrading');
12
41
  setOutput('');
13
42
  setErrorMessage(undefined);
43
+ restartingRef.current = false;
14
44
  const controller = new AbortController();
15
45
  abortRef.current = controller;
16
46
  fetch('/api/cli-upgrade', { method: 'POST', signal: controller.signal })
@@ -31,6 +61,12 @@ export function useCliUpgrade() {
31
61
  const lines = buffer.split('\n');
32
62
  buffer = lines.pop() ?? '';
33
63
  for (const line of lines) {
64
+ if (line.startsWith('event: restarting')) {
65
+ restartingRef.current = true;
66
+ setStatus('restarting');
67
+ waitForServerAndReload(RESTART_TIMEOUT_MS, RESTART_POLL_MS);
68
+ continue;
69
+ }
34
70
  if (line.startsWith('event: done')) {
35
71
  // Next data line contains the final result
36
72
  continue;
@@ -60,6 +96,9 @@ export function useCliUpgrade() {
60
96
  }
61
97
  })
62
98
  .catch((err) => {
99
+ // If we're in restarting state, the connection dropping is expected
100
+ if (restartingRef.current)
101
+ return;
63
102
  if (err instanceof DOMException && err.name === 'AbortError')
64
103
  return;
65
104
  setStatus('error');