@shepai/cli 1.170.0 → 1.171.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/packages/core/src/application/use-cases/upgrade/upgrade-cli.use-case.d.ts +1 -0
- package/dist/packages/core/src/application/use-cases/upgrade/upgrade-cli.use-case.d.ts.map +1 -1
- package/dist/packages/core/src/application/use-cases/upgrade/upgrade-cli.use-case.js +59 -2
- package/dist/src/presentation/cli/commands/upgrade.command.d.ts.map +1 -1
- package/dist/src/presentation/cli/commands/upgrade.command.js +68 -3
- package/dist/translations/ar/cli.json +2 -0
- package/dist/translations/de/cli.json +2 -0
- package/dist/translations/en/cli.json +2 -0
- package/dist/translations/es/cli.json +2 -0
- package/dist/translations/fr/cli.json +2 -0
- package/dist/translations/he/cli.json +2 -0
- package/dist/translations/pt/cli.json +2 -0
- package/dist/translations/ru/cli.json +2 -0
- package/dist/tsconfig.build.tsbuildinfo +1 -1
- package/package.json +1 -1
- 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_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]__4fb81977._.js +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__4fb81977._.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]__7dcd0917._.js +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__7dcd0917._.js.map +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__92ffd5ee._.js +2 -2
- package/web/.next/server/chunks/ssr/[root-of-the-server]__92ffd5ee._.js.map +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__b020c17d._.js +2 -2
- package/web/.next/server/chunks/ssr/[root-of-the-server]__b020c17d._.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/[root-of-the-server]__ba7f5873._.js +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__ba7f5873._.js.map +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__c5e09f6f._.js +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__c5e09f6f._.js.map +1 -1
- package/web/.next/server/chunks/ssr/_02e01240._.js +1 -1
- package/web/.next/server/chunks/ssr/_02e01240._.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/_18886033._.js +1 -1
- package/web/.next/server/chunks/ssr/_18886033._.js.map +1 -1
- package/web/.next/server/chunks/ssr/_22e00a14._.js +1 -1
- package/web/.next/server/chunks/ssr/_22e00a14._.js.map +1 -1
- package/web/.next/server/chunks/ssr/{_deabc145._.js → _49447b3c._.js} +2 -2
- package/web/.next/server/chunks/ssr/{_deabc145._.js.map → _49447b3c._.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/_a5a5901d._.js +1 -1
- package/web/.next/server/chunks/ssr/_a5a5901d._.js.map +1 -1
- package/web/.next/server/chunks/ssr/_ad09f271._.js +1 -1
- package/web/.next/server/chunks/ssr/_ad09f271._.js.map +1 -1
- package/web/.next/server/chunks/ssr/_c3f595c6._.js +1 -1
- package/web/.next/server/chunks/ssr/_c3f595c6._.js.map +1 -1
- package/web/.next/server/chunks/ssr/{_0d7dd23b._.js → _d50cde79._.js} +2 -2
- package/web/.next/server/chunks/ssr/{_0d7dd23b._.js.map → _d50cde79._.js.map} +1 -1
- package/web/.next/server/chunks/ssr/_df737cce._.js +1 -1
- package/web/.next/server/chunks/ssr/_ea9e1556._.js +1 -1
- package/web/.next/server/chunks/ssr/_ea9e1556._.js.map +1 -1
- package/web/.next/server/chunks/ssr/_f1ba9be6._.js +2 -2
- package/web/.next/server/chunks/ssr/_f1ba9be6._.js.map +1 -1
- package/web/.next/server/chunks/ssr/_f33cd07e._.js +2 -2
- package/web/.next/server/chunks/ssr/_f33cd07e._.js.map +1 -1
- package/web/.next/server/chunks/ssr/{_77ae079a._.js → _f778f3ef._.js} +2 -2
- package/web/.next/server/chunks/ssr/{_77ae079a._.js.map → _f778f3ef._.js.map} +1 -1
- package/web/.next/server/chunks/ssr/_f8b45233._.js +1 -1
- package/web/.next/server/chunks/ssr/_f8b45233._.js.map +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_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/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/{a3802d6f8677cd04.js → 02fe1303471793b9.js} +2 -2
- package/web/.next/static/chunks/{06a86173379e6c51.js → 0ce50b34df07306b.js} +1 -1
- package/web/.next/static/chunks/{16ed73f9880b7d63.js → 18d4601f068c700d.js} +1 -1
- package/web/.next/static/chunks/{8e12deeabf6624e9.js → 24dd6b3021c2d849.js} +1 -1
- package/web/.next/static/chunks/{74e5b5c7950efbc1.js → 3d182168cdc4c15c.js} +1 -1
- package/web/.next/static/chunks/{f51250616da82bd2.js → 4383bcae769740e7.js} +1 -1
- package/web/.next/static/chunks/{2b2f3a70ebd6ac1c.js → 5983ef48d50d2d2a.js} +1 -1
- package/web/.next/static/chunks/{f9da308b3033c57a.js → 67a430796dea42a7.js} +1 -1
- package/web/.next/static/chunks/{ca23a8642f750548.js → 6ee5d45de67d3547.js} +2 -2
- package/web/.next/static/chunks/{7a6854bb07182777.js → 9705f2a5695a4995.js} +1 -1
- package/web/.next/static/chunks/a80bbfca8ee3d79b.js +1 -0
- package/web/.next/static/chunks/{3d1df5c349d855eb.js → aa077ab14015a8fd.js} +1 -1
- package/web/.next/static/chunks/{c5a0b452afc8fe47.js → b93a918712cd4987.js} +1 -1
- package/web/.next/static/chunks/{f29814a72404ea2b.js → bb962a996814718a.js} +1 -1
- package/web/.next/static/chunks/{b0a6fce5425f8d3a.js → eff45ffddd85918c.js} +1 -1
- package/web/.next/static/chunks/9c6f8f49799efd3a.js +0 -1
- /package/web/.next/static/{0KDwNT3AGQmFGIwjHx99r → akDn2qFk1krSwrjt4345P}/_buildManifest.js +0 -0
- /package/web/.next/static/{0KDwNT3AGQmFGIwjHx99r → akDn2qFk1krSwrjt4345P}/_clientMiddlewareManifest.json +0 -0
- /package/web/.next/static/{0KDwNT3AGQmFGIwjHx99r → akDn2qFk1krSwrjt4345P}/_ssgManifest.js +0 -0
|
@@ -24,6 +24,7 @@ export declare class UpgradeCliUseCase {
|
|
|
24
24
|
constructor(versionService: IVersionService, daemonService: IDaemonService);
|
|
25
25
|
execute(onOutput?: (data: string) => void): Promise<UpgradeResult>;
|
|
26
26
|
private getLatestVersion;
|
|
27
|
+
private preDownloadPackage;
|
|
27
28
|
/**
|
|
28
29
|
* Schedule a daemon self-restart after upgrade.
|
|
29
30
|
* Reads the current daemon port, spawns a new daemon process with the
|
|
@@ -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;
|
|
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;AAOH,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;AAQD,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;IAyCxE,OAAO,CAAC,gBAAgB;IA6CxB,OAAO,CAAC,kBAAkB;IAwD1B;;;;OAIG;IACG,qBAAqB,IAAI,OAAO,CAAC,IAAI,CAAC;IA2B5C,OAAO,CAAC,aAAa;CAuBtB"}
|
|
@@ -24,7 +24,11 @@ var __param = (this && this.__param) || function (paramIndex, decorator) {
|
|
|
24
24
|
};
|
|
25
25
|
import { injectable, inject } from 'tsyringe';
|
|
26
26
|
import { spawn } from 'node:child_process';
|
|
27
|
+
import { mkdtempSync, rmSync } from 'node:fs';
|
|
28
|
+
import { tmpdir } from 'node:os';
|
|
29
|
+
import { join } from 'node:path';
|
|
27
30
|
const VERSION_CHECK_TIMEOUT_MS = 10_000;
|
|
31
|
+
const NPM_CACHE_ADD_TIMEOUT_MS = 120_000;
|
|
28
32
|
/** Delay (ms) before the current process exits to allow the SSE response to flush. */
|
|
29
33
|
const SELF_RESTART_DELAY_MS = 1_000;
|
|
30
34
|
let UpgradeCliUseCase = class UpgradeCliUseCase {
|
|
@@ -43,8 +47,14 @@ let UpgradeCliUseCase = class UpgradeCliUseCase {
|
|
|
43
47
|
onOutput?.(`Already up to date (v${currentVersion})\n`);
|
|
44
48
|
return { status: 'up-to-date', currentVersion, latestVersion };
|
|
45
49
|
}
|
|
46
|
-
// 3.
|
|
50
|
+
// 3. Pre-download the package into npm cache before install
|
|
47
51
|
const target = latestVersion ? `v${latestVersion}` : 'latest';
|
|
52
|
+
onOutput?.(`Downloading @shepai/cli@latest...\n`);
|
|
53
|
+
const cached = await this.preDownloadPackage();
|
|
54
|
+
if (!cached) {
|
|
55
|
+
onOutput?.('Pre-download did not complete — proceeding with install...\n');
|
|
56
|
+
}
|
|
57
|
+
// 4. Run install (fast if cached)
|
|
48
58
|
onOutput?.(`Upgrading from v${currentVersion} to ${target}...\n`);
|
|
49
59
|
try {
|
|
50
60
|
const exitCode = await this.runNpmInstall(onOutput);
|
|
@@ -104,6 +114,53 @@ let UpgradeCliUseCase = class UpgradeCliUseCase {
|
|
|
104
114
|
});
|
|
105
115
|
});
|
|
106
116
|
}
|
|
117
|
+
preDownloadPackage() {
|
|
118
|
+
let tmpDir;
|
|
119
|
+
try {
|
|
120
|
+
tmpDir = mkdtempSync(join(tmpdir(), 'shep-upgrade-'));
|
|
121
|
+
}
|
|
122
|
+
catch {
|
|
123
|
+
return Promise.resolve(false);
|
|
124
|
+
}
|
|
125
|
+
const cleanup = () => {
|
|
126
|
+
try {
|
|
127
|
+
rmSync(tmpDir, { recursive: true, force: true });
|
|
128
|
+
}
|
|
129
|
+
catch {
|
|
130
|
+
/* best-effort */
|
|
131
|
+
}
|
|
132
|
+
};
|
|
133
|
+
return new Promise((resolve) => {
|
|
134
|
+
let settled = false;
|
|
135
|
+
const child = spawn('npm', ['install', '--prefix', tmpDir, '--ignore-scripts', '@shepai/cli@latest'], {
|
|
136
|
+
stdio: ['ignore', 'ignore', 'pipe'],
|
|
137
|
+
});
|
|
138
|
+
const timeout = setTimeout(() => {
|
|
139
|
+
if (!settled) {
|
|
140
|
+
settled = true;
|
|
141
|
+
child.kill();
|
|
142
|
+
cleanup();
|
|
143
|
+
resolve(false);
|
|
144
|
+
}
|
|
145
|
+
}, NPM_CACHE_ADD_TIMEOUT_MS);
|
|
146
|
+
child.on('close', (code) => {
|
|
147
|
+
if (!settled) {
|
|
148
|
+
settled = true;
|
|
149
|
+
clearTimeout(timeout);
|
|
150
|
+
cleanup();
|
|
151
|
+
resolve(code === 0);
|
|
152
|
+
}
|
|
153
|
+
});
|
|
154
|
+
child.on('error', () => {
|
|
155
|
+
if (!settled) {
|
|
156
|
+
settled = true;
|
|
157
|
+
clearTimeout(timeout);
|
|
158
|
+
cleanup();
|
|
159
|
+
resolve(false);
|
|
160
|
+
}
|
|
161
|
+
});
|
|
162
|
+
});
|
|
163
|
+
}
|
|
107
164
|
/**
|
|
108
165
|
* Schedule a daemon self-restart after upgrade.
|
|
109
166
|
* Reads the current daemon port, spawns a new daemon process with the
|
|
@@ -130,7 +187,7 @@ let UpgradeCliUseCase = class UpgradeCliUseCase {
|
|
|
130
187
|
}
|
|
131
188
|
runNpmInstall(onOutput) {
|
|
132
189
|
return new Promise((resolve, reject) => {
|
|
133
|
-
const child = spawn('npm', ['i', '-g', '@shepai/cli@latest'], {
|
|
190
|
+
const child = spawn('npm', ['i', '-g', '@shepai/cli@latest', '--prefer-offline'], {
|
|
134
191
|
stdio: ['ignore', 'pipe', 'pipe'],
|
|
135
192
|
});
|
|
136
193
|
child.stdout?.on('data', (data) => {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"upgrade.command.d.ts","sourceRoot":"","sources":["../../../../../src/presentation/cli/commands/upgrade.command.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,KAAK,IAAI,YAAY,EAAqB,MAAM,oBAAoB,CAAC;
|
|
1
|
+
{"version":3,"file":"upgrade.command.d.ts","sourceRoot":"","sources":["../../../../../src/presentation/cli/commands/upgrade.command.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,KAAK,IAAI,YAAY,EAAqB,MAAM,oBAAoB,CAAC;AAY9E,KAAK,OAAO,GAAG,OAAO,YAAY,CAAC;AA8InC;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,OAAO,GAAE,OAAsB,GAAG,OAAO,CA6E7E"}
|
|
@@ -8,12 +8,16 @@
|
|
|
8
8
|
*/
|
|
9
9
|
import { Command } from 'commander';
|
|
10
10
|
import { spawn as defaultSpawn } from 'node:child_process';
|
|
11
|
+
import { mkdtempSync, rmSync } from 'node:fs';
|
|
12
|
+
import { tmpdir } from 'node:os';
|
|
13
|
+
import { join } from 'node:path';
|
|
11
14
|
import { container } from '../../../../packages/core/src/infrastructure/di/container.js';
|
|
12
15
|
import { messages } from '../ui/index.js';
|
|
13
16
|
import { getCliI18n } from '../i18n.js';
|
|
14
17
|
import { stopDaemon } from './daemon/stop-daemon.js';
|
|
15
18
|
import { startDaemon } from './daemon/start-daemon.js';
|
|
16
19
|
const VERSION_CHECK_TIMEOUT_MS = 10_000;
|
|
20
|
+
const NPM_CACHE_ADD_TIMEOUT_MS = 120_000;
|
|
17
21
|
/** On Windows, npm is a .cmd batch file — spawn() needs shell: true to resolve it. */
|
|
18
22
|
const IS_WINDOWS = process.platform === 'win32';
|
|
19
23
|
/**
|
|
@@ -61,13 +65,67 @@ function getLatestVersion(spawnFn) {
|
|
|
61
65
|
});
|
|
62
66
|
});
|
|
63
67
|
}
|
|
68
|
+
/**
|
|
69
|
+
* Pre-download the package AND all transitive dependencies into npm's cache.
|
|
70
|
+
* Uses `npm install --prefix <tmpdir>` which resolves the full dependency tree
|
|
71
|
+
* and populates the cache. The temp directory is cleaned up afterwards.
|
|
72
|
+
* Returns true if the pre-download succeeded, false otherwise (fail-open).
|
|
73
|
+
*/
|
|
74
|
+
function preDownloadPackage(spawnFn) {
|
|
75
|
+
let tmpDir;
|
|
76
|
+
try {
|
|
77
|
+
tmpDir = mkdtempSync(join(tmpdir(), 'shep-upgrade-'));
|
|
78
|
+
}
|
|
79
|
+
catch {
|
|
80
|
+
return Promise.resolve(false);
|
|
81
|
+
}
|
|
82
|
+
const cleanup = () => {
|
|
83
|
+
try {
|
|
84
|
+
rmSync(tmpDir, { recursive: true, force: true });
|
|
85
|
+
}
|
|
86
|
+
catch {
|
|
87
|
+
/* best-effort */
|
|
88
|
+
}
|
|
89
|
+
};
|
|
90
|
+
return new Promise((resolve) => {
|
|
91
|
+
let settled = false;
|
|
92
|
+
const child = spawnFn('npm', ['install', '--prefix', tmpDir, '--ignore-scripts', '@shepai/cli@latest'], {
|
|
93
|
+
stdio: ['ignore', 'ignore', 'pipe'],
|
|
94
|
+
...(IS_WINDOWS && { shell: true }),
|
|
95
|
+
});
|
|
96
|
+
const timeout = setTimeout(() => {
|
|
97
|
+
if (!settled) {
|
|
98
|
+
settled = true;
|
|
99
|
+
child.kill();
|
|
100
|
+
cleanup();
|
|
101
|
+
resolve(false);
|
|
102
|
+
}
|
|
103
|
+
}, NPM_CACHE_ADD_TIMEOUT_MS);
|
|
104
|
+
child.on('close', (code) => {
|
|
105
|
+
if (!settled) {
|
|
106
|
+
settled = true;
|
|
107
|
+
clearTimeout(timeout);
|
|
108
|
+
cleanup();
|
|
109
|
+
resolve(code === 0);
|
|
110
|
+
}
|
|
111
|
+
});
|
|
112
|
+
child.on('error', () => {
|
|
113
|
+
if (!settled) {
|
|
114
|
+
settled = true;
|
|
115
|
+
clearTimeout(timeout);
|
|
116
|
+
cleanup();
|
|
117
|
+
resolve(false);
|
|
118
|
+
}
|
|
119
|
+
});
|
|
120
|
+
});
|
|
121
|
+
}
|
|
64
122
|
/**
|
|
65
123
|
* Run npm i -g @shepai/cli@latest with inherited stdio.
|
|
66
124
|
* Returns the exit code, or rejects on spawn error.
|
|
67
125
|
*/
|
|
68
126
|
function runNpmInstall(spawnFn) {
|
|
69
127
|
return new Promise((resolve, reject) => {
|
|
70
|
-
const child = spawnFn('npm', ['i', '-g', '@shepai/cli@latest'], {
|
|
128
|
+
const child = spawnFn('npm', ['i', '-g', '@shepai/cli@latest', '--prefer-offline'], {
|
|
71
129
|
stdio: 'inherit',
|
|
72
130
|
...(IS_WINDOWS && { shell: true }),
|
|
73
131
|
});
|
|
@@ -107,7 +165,14 @@ export function createUpgradeCommand(spawnFn = defaultSpawn) {
|
|
|
107
165
|
else {
|
|
108
166
|
messages.info(t('cli:commands.upgrade.upgradingToLatest', { current: currentVersion }));
|
|
109
167
|
}
|
|
110
|
-
// 4.
|
|
168
|
+
// 4. Pre-download the package into npm cache BEFORE stopping the daemon.
|
|
169
|
+
// This minimizes downtime — the actual install will read from cache.
|
|
170
|
+
messages.info(t('cli:commands.upgrade.downloadingPackage'));
|
|
171
|
+
const cached = await preDownloadPackage(spawnFn);
|
|
172
|
+
if (!cached) {
|
|
173
|
+
messages.warning(t('cli:commands.upgrade.downloadFailed'));
|
|
174
|
+
}
|
|
175
|
+
// 5. Check daemon state and stop if running
|
|
111
176
|
const daemonService = container.resolve('IDaemonService');
|
|
112
177
|
const daemonState = await daemonService.read();
|
|
113
178
|
const daemonWasRunning = daemonState !== null && daemonService.isAlive(daemonState.pid);
|
|
@@ -116,7 +181,7 @@ export function createUpgradeCommand(spawnFn = defaultSpawn) {
|
|
|
116
181
|
messages.info(t('cli:commands.upgrade.stoppingDaemon'));
|
|
117
182
|
await stopDaemon(daemonService);
|
|
118
183
|
}
|
|
119
|
-
//
|
|
184
|
+
// 6. Run npm i -g @shepai/cli@latest; always restore daemon in finally
|
|
120
185
|
let installExitCode = 1;
|
|
121
186
|
try {
|
|
122
187
|
installExitCode = await runNpmInstall(spawnFn);
|
|
@@ -567,6 +567,8 @@
|
|
|
567
567
|
"alreadyUpToDate": "محدّث بالفعل (v{{version}})",
|
|
568
568
|
"upgradingFromTo": "الترقية من v{{current}} إلى v{{latest}}",
|
|
569
569
|
"upgradingToLatest": "الترقية من v{{current}} إلى الأحدث",
|
|
570
|
+
"downloadingPackage": "جارٍ تنزيل الإصدار الجديد...",
|
|
571
|
+
"downloadFailed": "لم يكتمل التنزيل المسبق — المتابعة بالتثبيت",
|
|
570
572
|
"stoppingDaemon": "جارٍ إيقاف الخدمة الخلفية قبل الترقية...",
|
|
571
573
|
"restartingDaemon": "جارٍ إعادة تشغيل الخدمة الخلفية...",
|
|
572
574
|
"daemonRestarted": "تمت إعادة تشغيل الخدمة الخلفية بنجاح.",
|
|
@@ -567,6 +567,8 @@
|
|
|
567
567
|
"alreadyUpToDate": "Bereits aktuell (v{{version}})",
|
|
568
568
|
"upgradingFromTo": "Aktualisierung von v{{current}} auf v{{latest}}",
|
|
569
569
|
"upgradingToLatest": "Aktualisierung von v{{current}} auf die neueste Version",
|
|
570
|
+
"downloadingPackage": "Neue Version wird heruntergeladen...",
|
|
571
|
+
"downloadFailed": "Vorab-Download nicht abgeschlossen — Installation wird fortgesetzt",
|
|
570
572
|
"stoppingDaemon": "Dienst wird vor Aktualisierung gestoppt...",
|
|
571
573
|
"restartingDaemon": "Dienst wird neu gestartet...",
|
|
572
574
|
"daemonRestarted": "Dienst erfolgreich neu gestartet.",
|
|
@@ -567,6 +567,8 @@
|
|
|
567
567
|
"alreadyUpToDate": "Already up to date (v{{version}})",
|
|
568
568
|
"upgradingFromTo": "Upgrading from v{{current}} to v{{latest}}",
|
|
569
569
|
"upgradingToLatest": "Upgrading from v{{current}} to latest",
|
|
570
|
+
"downloadingPackage": "Downloading new version...",
|
|
571
|
+
"downloadFailed": "Pre-download did not complete — proceeding with install",
|
|
570
572
|
"stoppingDaemon": "Stopping daemon before upgrade...",
|
|
571
573
|
"restartingDaemon": "Restarting daemon...",
|
|
572
574
|
"daemonRestarted": "Daemon restarted successfully.",
|
|
@@ -567,6 +567,8 @@
|
|
|
567
567
|
"alreadyUpToDate": "Ya está actualizado (v{{version}})",
|
|
568
568
|
"upgradingFromTo": "Actualizando de v{{current}} a v{{latest}}",
|
|
569
569
|
"upgradingToLatest": "Actualizando de v{{current}} a la última versión",
|
|
570
|
+
"downloadingPackage": "Descargando nueva versión...",
|
|
571
|
+
"downloadFailed": "La descarga previa no se completó — continuando con la instalación",
|
|
570
572
|
"stoppingDaemon": "Deteniendo el demonio antes de actualizar...",
|
|
571
573
|
"restartingDaemon": "Reiniciando el demonio...",
|
|
572
574
|
"daemonRestarted": "Demonio reiniciado exitosamente.",
|
|
@@ -567,6 +567,8 @@
|
|
|
567
567
|
"alreadyUpToDate": "Déjà à jour (v{{version}})",
|
|
568
568
|
"upgradingFromTo": "Mise à jour de v{{current}} vers v{{latest}}",
|
|
569
569
|
"upgradingToLatest": "Mise à jour de v{{current}} vers la dernière version",
|
|
570
|
+
"downloadingPackage": "Téléchargement de la nouvelle version...",
|
|
571
|
+
"downloadFailed": "Le pré-téléchargement n'a pas abouti — poursuite de l'installation",
|
|
570
572
|
"stoppingDaemon": "Arrêt du démon avant la mise à jour...",
|
|
571
573
|
"restartingDaemon": "Redémarrage du démon...",
|
|
572
574
|
"daemonRestarted": "Démon redémarré avec succès.",
|
|
@@ -567,6 +567,8 @@
|
|
|
567
567
|
"alreadyUpToDate": "כבר מעודכן (v{{version}})",
|
|
568
568
|
"upgradingFromTo": "משדרג מ-v{{current}} ל-v{{latest}}",
|
|
569
569
|
"upgradingToLatest": "משדרג מ-v{{current}} לגרסה האחרונה",
|
|
570
|
+
"downloadingPackage": "מוריד גרסה חדשה...",
|
|
571
|
+
"downloadFailed": "ההורדה המוקדמת לא הושלמה — ממשיך בהתקנה",
|
|
570
572
|
"stoppingDaemon": "עוצר תהליך לפני שדרוג...",
|
|
571
573
|
"restartingDaemon": "מפעיל מחדש תהליך...",
|
|
572
574
|
"daemonRestarted": "התהליך הופעל מחדש בהצלחה.",
|
|
@@ -567,6 +567,8 @@
|
|
|
567
567
|
"alreadyUpToDate": "Já está atualizado (v{{version}})",
|
|
568
568
|
"upgradingFromTo": "Atualizando de v{{current}} para v{{latest}}",
|
|
569
569
|
"upgradingToLatest": "Atualizando de v{{current}} para a mais recente",
|
|
570
|
+
"downloadingPackage": "Baixando nova versão...",
|
|
571
|
+
"downloadFailed": "Download prévio não concluído — prosseguindo com a instalação",
|
|
570
572
|
"stoppingDaemon": "Parando daemon antes da atualização...",
|
|
571
573
|
"restartingDaemon": "Reiniciando daemon...",
|
|
572
574
|
"daemonRestarted": "Daemon reiniciado com sucesso.",
|
|
@@ -567,6 +567,8 @@
|
|
|
567
567
|
"alreadyUpToDate": "Уже актуальная версия (v{{version}})",
|
|
568
568
|
"upgradingFromTo": "Обновление с v{{current}} до v{{latest}}",
|
|
569
569
|
"upgradingToLatest": "Обновление с v{{current}} до последней версии",
|
|
570
|
+
"downloadingPackage": "Загрузка новой версии...",
|
|
571
|
+
"downloadFailed": "Предварительная загрузка не завершена — продолжение установки",
|
|
570
572
|
"stoppingDaemon": "Остановка демона перед обновлением...",
|
|
571
573
|
"restartingDaemon": "Перезапуск демона...",
|
|
572
574
|
"daemonRestarted": "Демон успешно перезапущен.",
|