@kaitranntt/ccs 8.9.0-dev.2 → 8.9.0-dev.4

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 (88) hide show
  1. package/README.md +3 -3
  2. package/dist/cliproxy/binary/install-lifecycle-lock.d.ts +2 -0
  3. package/dist/cliproxy/binary/install-lifecycle-lock.d.ts.map +1 -0
  4. package/dist/cliproxy/binary/install-lifecycle-lock.js +63 -0
  5. package/dist/cliproxy/binary/install-lifecycle-lock.js.map +1 -0
  6. package/dist/cliproxy/binary/installer.d.ts +13 -1
  7. package/dist/cliproxy/binary/installer.d.ts.map +1 -1
  8. package/dist/cliproxy/binary/installer.js +81 -42
  9. package/dist/cliproxy/binary/installer.js.map +1 -1
  10. package/dist/cliproxy/binary/lifecycle.d.ts +6 -1
  11. package/dist/cliproxy/binary/lifecycle.d.ts.map +1 -1
  12. package/dist/cliproxy/binary/lifecycle.js +13 -10
  13. package/dist/cliproxy/binary/lifecycle.js.map +1 -1
  14. package/dist/cliproxy/binary-manager.d.ts +2 -0
  15. package/dist/cliproxy/binary-manager.d.ts.map +1 -1
  16. package/dist/cliproxy/binary-manager.js +31 -29
  17. package/dist/cliproxy/binary-manager.js.map +1 -1
  18. package/dist/cliproxy/model-catalog.d.ts.map +1 -1
  19. package/dist/cliproxy/model-catalog.js +11 -0
  20. package/dist/cliproxy/model-catalog.js.map +1 -1
  21. package/dist/cliproxy/services/binary-service.d.ts.map +1 -1
  22. package/dist/cliproxy/services/binary-service.js +24 -20
  23. package/dist/cliproxy/services/binary-service.js.map +1 -1
  24. package/dist/cliproxy/services/catalog-cache.d.ts.map +1 -1
  25. package/dist/cliproxy/services/catalog-cache.js +2 -0
  26. package/dist/cliproxy/services/catalog-cache.js.map +1 -1
  27. package/dist/cliproxy/types/binary-types.d.ts +1 -0
  28. package/dist/cliproxy/types/binary-types.d.ts.map +1 -1
  29. package/dist/delegation/delegation-handler.d.ts.map +1 -1
  30. package/dist/delegation/delegation-handler.js +12 -2
  31. package/dist/delegation/delegation-handler.js.map +1 -1
  32. package/dist/shared/provider-preset-catalog.d.ts +2 -1
  33. package/dist/shared/provider-preset-catalog.d.ts.map +1 -1
  34. package/dist/shared/provider-preset-catalog.js +18 -1
  35. package/dist/shared/provider-preset-catalog.js.map +1 -1
  36. package/dist/ui/assets/{Trans-dQ5QXCeL.js → Trans-FLv2w3dw.js} +1 -1
  37. package/dist/ui/assets/{accounts-DMMNI7g4.js → accounts-DBh5i2Zr.js} +1 -1
  38. package/dist/ui/assets/{alert-dialog-BIWuuEiP.js → alert-dialog-C8In2Dky.js} +1 -1
  39. package/dist/ui/assets/{api-BKTghVxS.js → api-CBa0QPvv.js} +1 -1
  40. package/dist/ui/assets/{auth-section-BKDcPs0P.js → auth-section-MEQNL05y.js} +1 -1
  41. package/dist/ui/assets/{backups-section-DB1N4X1P.js → backups-section-BnlS-f6m.js} +1 -1
  42. package/dist/ui/assets/{channels-dhk_rRcA.js → channels-aJ113Jtk.js} +1 -1
  43. package/dist/ui/assets/{checkbox-h1pwW_6m.js → checkbox-Cd8DKZ16.js} +1 -1
  44. package/dist/ui/assets/{claude-extension-WLOGl6eK.js → claude-extension-DeT_Bm_E.js} +1 -1
  45. package/dist/ui/assets/{cliproxy-CE_mZIGU.js → cliproxy-CuI1w6DX.js} +3 -3
  46. package/dist/ui/assets/{cliproxy-ai-providers-DVkAmHVF.js → cliproxy-ai-providers-D-2Ld8l3.js} +1 -1
  47. package/dist/ui/assets/{cliproxy-control-panel-D25OT5u5.js → cliproxy-control-panel-SyiCqWru.js} +1 -1
  48. package/dist/ui/assets/{codex-Bqc25al7.js → codex-BDTiihlO.js} +1 -1
  49. package/dist/ui/assets/{confirm-dialog-BnAIV9ZB.js → confirm-dialog-Clzjl59k.js} +1 -1
  50. package/dist/ui/assets/{copilot-BdjZjuRs.js → copilot-C5KMkej4.js} +1 -1
  51. package/dist/ui/assets/{cursor-DTbIQ-d7.js → cursor-KegOEAYC.js} +1 -1
  52. package/dist/ui/assets/{droid-DAjrpAjP.js → droid-CjX_C0rC.js} +1 -1
  53. package/dist/ui/assets/{globalenv-section-BzirfKtN.js → globalenv-section-BA1QfBO4.js} +1 -1
  54. package/dist/ui/assets/{health-CDCop1Et.js → health-zR1UbNO6.js} +1 -1
  55. package/dist/ui/assets/{index-Dkee4NQG.js → index-BbgNiTTN.js} +1 -1
  56. package/dist/ui/assets/{index-BhGdNER3.js → index-C3jY24_T.js} +1 -1
  57. package/dist/ui/assets/{index-B4yjQknk.js → index-C6uKi0_1.js} +30 -30
  58. package/dist/ui/assets/{index-bC8F80OC.js → index-CFN4-b-A.js} +1 -1
  59. package/dist/ui/assets/{index-BF4hYrQf.js → index-DCOLWXwe.js} +1 -1
  60. package/dist/ui/assets/{index-vdkPayvk.js → index-DkNx0NGg.js} +1 -1
  61. package/dist/ui/assets/{index-DMGiMF5C.js → index-i_1SHWbm.js} +1 -1
  62. package/dist/ui/assets/{logs-Bb1BaiFq.js → logs-wg1TS54M.js} +1 -1
  63. package/dist/ui/assets/{masked-input-DxWhb6sQ.js → masked-input-G5YflQq4.js} +1 -1
  64. package/dist/ui/assets/{proxy-status-widget-Dj_46CdP.js → proxy-status-widget-Cf-5bvvM.js} +1 -1
  65. package/dist/ui/assets/{raw-json-settings-editor-panel-BeZJbsnO.js → raw-json-settings-editor-panel-B87u361s.js} +1 -1
  66. package/dist/ui/assets/{searchable-select-CcXdAHJm.js → searchable-select-BrATjmlv.js} +1 -1
  67. package/dist/ui/assets/{separator-O1g2RdCE.js → separator-ChO-L4M_.js} +1 -1
  68. package/dist/ui/assets/{shared-Ct6UqE0N.js → shared-DMGBJS46.js} +1 -1
  69. package/dist/ui/assets/{table-D4ZJKsoh.js → table-Bpoa543F.js} +1 -1
  70. package/dist/ui/assets/{updates-jnNBispr.js → updates-C4uNxHTS.js} +1 -1
  71. package/dist/ui/assets/{use-accounts-DXwh5f2t.js → use-accounts-CsWPcF31.js} +1 -1
  72. package/dist/ui/icons/orcarouter.svg +1 -0
  73. package/dist/ui/index.html +1 -1
  74. package/dist/utils/hooks/image-analysis-backend-resolver.d.ts.map +1 -1
  75. package/dist/utils/hooks/image-analysis-backend-resolver.js +6 -0
  76. package/dist/utils/hooks/image-analysis-backend-resolver.js.map +1 -1
  77. package/dist/utils/hooks/image-analysis-runtime-status.d.ts.map +1 -1
  78. package/dist/utils/hooks/image-analysis-runtime-status.js +8 -3
  79. package/dist/utils/hooks/image-analysis-runtime-status.js.map +1 -1
  80. package/dist/utils/package-manager-detector.d.ts.map +1 -1
  81. package/dist/utils/package-manager-detector.js +6 -2
  82. package/dist/utils/package-manager-detector.js.map +1 -1
  83. package/dist/web-server/services/cliproxy-dashboard-install-service.d.ts +5 -0
  84. package/dist/web-server/services/cliproxy-dashboard-install-service.d.ts.map +1 -1
  85. package/dist/web-server/services/cliproxy-dashboard-install-service.js +53 -36
  86. package/dist/web-server/services/cliproxy-dashboard-install-service.js.map +1 -1
  87. package/package.json +4 -1
  88. package/scripts/dev-release.sh +1 -1
package/README.md CHANGED
@@ -64,8 +64,8 @@ CCS gives you one stable command surface while letting you switch between:
64
64
  - multiple Claude subscriptions and isolated account contexts
65
65
  - OAuth providers like Codex, xAI/Grok, Kiro, Claude, Kimi, and more, with legacy
66
66
  Copilot compatibility for existing setups
67
- - API and local-model profiles like GLM, Kimi, OpenRouter, Ollama, llama.cpp,
68
- Novita, Fireworks AI, and Alibaba Coding Plan
67
+ - API and local-model profiles like GLM, Kimi, OpenRouter, OrcaRouter, Ollama,
68
+ llama.cpp, Novita, Fireworks AI, and Alibaba Coding Plan
69
69
 
70
70
  Qwen Code account linking is not available in the bundled CLIProxy runtime yet;
71
71
  use an API-key Qwen profile such as Alibaba Coding Plan for Qwen models.
@@ -228,4 +228,4 @@ ccs ollama "summarize these logs"
228
228
 
229
229
  ## Star History
230
230
 
231
- [![Star History Chart](https://api.star-history.com/svg?repos=kaitranntt/ccs&type=date&legend=top-left)](https://www.star-history.com/#kaitranntt/ccs&type=date&legend=top-left)
231
+ [![Star History Chart](https://star-history.dera.page/svg?repos=kaitranntt/ccs&type=date&legend=top-left)](https://star-history.dera.page/#kaitranntt/ccs&type=date&legend=top-left)
@@ -0,0 +1,2 @@
1
+ export declare function withInstallLifecycleLock<T>(lockTarget: string, operation: () => Promise<T>): Promise<T>;
2
+ //# sourceMappingURL=install-lifecycle-lock.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"install-lifecycle-lock.d.ts","sourceRoot":"","sources":["../../../src/cliproxy/binary/install-lifecycle-lock.ts"],"names":[],"mappings":"AAOA,wBAAsB,wBAAwB,CAAC,CAAC,EAC9C,UAAU,EAAE,MAAM,EAClB,SAAS,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,GAC1B,OAAO,CAAC,CAAC,CAAC,CA0BZ"}
@@ -0,0 +1,63 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || function (mod) {
19
+ if (mod && mod.__esModule) return mod;
20
+ var result = {};
21
+ if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
22
+ __setModuleDefault(result, mod);
23
+ return result;
24
+ };
25
+ Object.defineProperty(exports, "__esModule", { value: true });
26
+ exports.withInstallLifecycleLock = void 0;
27
+ const async_hooks_1 = require("async_hooks");
28
+ const fs = __importStar(require("fs"));
29
+ const path = __importStar(require("path"));
30
+ const lockfile = __importStar(require("proper-lockfile"));
31
+ const heldInstallLocks = new async_hooks_1.AsyncLocalStorage();
32
+ async function withInstallLifecycleLock(lockTarget, operation) {
33
+ const resolvedTarget = path.resolve(lockTarget);
34
+ const held = heldInstallLocks.getStore();
35
+ if (held?.has(resolvedTarget))
36
+ return operation();
37
+ fs.mkdirSync(resolvedTarget, { recursive: true });
38
+ const release = await lockfile.lock(resolvedTarget, {
39
+ stale: 10 * 60 * 1000,
40
+ retries: { retries: 60, factor: 1, minTimeout: 250, maxTimeout: 250 },
41
+ });
42
+ const nextHeld = new Set(held);
43
+ nextHeld.add(resolvedTarget);
44
+ let operationError;
45
+ try {
46
+ return await heldInstallLocks.run(nextHeld, operation);
47
+ }
48
+ catch (error) {
49
+ operationError = error;
50
+ throw error;
51
+ }
52
+ finally {
53
+ try {
54
+ await release();
55
+ }
56
+ catch (error) {
57
+ if (!operationError)
58
+ throw error;
59
+ }
60
+ }
61
+ }
62
+ exports.withInstallLifecycleLock = withInstallLifecycleLock;
63
+ //# sourceMappingURL=install-lifecycle-lock.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"install-lifecycle-lock.js","sourceRoot":"","sources":["../../../src/cliproxy/binary/install-lifecycle-lock.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,6CAAgD;AAChD,uCAAyB;AACzB,2CAA6B;AAC7B,0DAA4C;AAE5C,MAAM,gBAAgB,GAAG,IAAI,+BAAiB,EAAe,CAAC;AAEvD,KAAK,UAAU,wBAAwB,CAC5C,UAAkB,EAClB,SAA2B;IAE3B,MAAM,cAAc,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;IAChD,MAAM,IAAI,GAAG,gBAAgB,CAAC,QAAQ,EAAE,CAAC;IACzC,IAAI,IAAI,EAAE,GAAG,CAAC,cAAc,CAAC;QAAE,OAAO,SAAS,EAAE,CAAC;IAElD,EAAE,CAAC,SAAS,CAAC,cAAc,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAClD,MAAM,OAAO,GAAG,MAAM,QAAQ,CAAC,IAAI,CAAC,cAAc,EAAE;QAClD,KAAK,EAAE,EAAE,GAAG,EAAE,GAAG,IAAI;QACrB,OAAO,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE,MAAM,EAAE,CAAC,EAAE,UAAU,EAAE,GAAG,EAAE,UAAU,EAAE,GAAG,EAAE;KACtE,CAAC,CAAC;IACH,MAAM,QAAQ,GAAG,IAAI,GAAG,CAAC,IAAI,CAAC,CAAC;IAC/B,QAAQ,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC;IAC7B,IAAI,cAAuB,CAAC;IAE5B,IAAI,CAAC;QACH,OAAO,MAAM,gBAAgB,CAAC,GAAG,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAC;IACzD,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,cAAc,GAAG,KAAK,CAAC;QACvB,MAAM,KAAK,CAAC;IACd,CAAC;YAAS,CAAC;QACT,IAAI,CAAC;YACH,MAAM,OAAO,EAAE,CAAC;QAClB,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,CAAC,cAAc;gBAAE,MAAM,KAAK,CAAC;QACnC,CAAC;IACH,CAAC;AACH,CAAC;AA7BD,4DA6BC"}
@@ -2,12 +2,23 @@
2
2
  * Binary Installer
3
3
  * Handles downloading, verifying, and extracting binary.
4
4
  */
5
+ /// <reference types="node" />
6
+ import * as fs from 'fs';
5
7
  import { BinaryManagerConfig } from '../types';
6
8
  import { detectPlatform } from '../binary/platform-detector';
9
+ import { downloadWithRetry } from './downloader';
10
+ import { verifyChecksum } from './verifier';
11
+ import { extractArchive } from './extractor';
12
+ interface DownloadAndInstallDeps {
13
+ downloadWithRetryFn?: typeof downloadWithRetry;
14
+ verifyChecksumFn?: typeof verifyChecksum;
15
+ extractArchiveFn?: typeof extractArchive;
16
+ renameSyncFn?: typeof fs.renameSync;
17
+ }
7
18
  /**
8
19
  * Download and install the binary
9
20
  */
10
- export declare function downloadAndInstall(config: BinaryManagerConfig, verbose?: boolean): Promise<void>;
21
+ export declare function downloadAndInstall(config: BinaryManagerConfig, verbose?: boolean, deps?: DownloadAndInstallDeps): Promise<void>;
11
22
  import type { CLIProxyBackend } from '../types';
12
23
  /** Delete binary (for cleanup or reinstall) */
13
24
  export declare function deleteBinary(binPath: string, verbose?: boolean, backend?: CLIProxyBackend): void;
@@ -22,4 +33,5 @@ export declare function getBinaryInfo(binPath: string, version: string, backend?
22
33
  platform: ReturnType<typeof detectPlatform>;
23
34
  checksum: string;
24
35
  } | null>;
36
+ export {};
25
37
  //# sourceMappingURL=installer.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"installer.d.ts","sourceRoot":"","sources":["../../../src/cliproxy/binary/installer.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAIH,OAAO,EAAE,mBAAmB,EAAE,MAAM,UAAU,CAAC;AAC/C,OAAO,EACL,cAAc,EAKf,MAAM,6BAA6B,CAAC;AAQrC;;GAEG;AACH,wBAAsB,kBAAkB,CACtC,MAAM,EAAE,mBAAmB,EAC3B,OAAO,UAAQ,GACd,OAAO,CAAC,IAAI,CAAC,CAkFf;AAED,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,UAAU,CAAC;AAEhD,+CAA+C;AAC/C,wBAAgB,YAAY,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,UAAQ,EAAE,OAAO,CAAC,EAAE,eAAe,GAAG,IAAI,CAgB9F;AAED,sBAAsB;AACtB,wBAAgB,aAAa,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,eAAe,GAAG,MAAM,CAGhF;AAED,6BAA6B;AAC7B,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,eAAe,GAAG,OAAO,CAErF;AAED,mCAAmC;AACnC,wBAAsB,aAAa,CACjC,OAAO,EAAE,MAAM,EACf,OAAO,EAAE,MAAM,EACf,OAAO,CAAC,EAAE,eAAe,GACxB,OAAO,CAAC;IACT,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,UAAU,CAAC,OAAO,cAAc,CAAC,CAAC;IAC5C,QAAQ,EAAE,MAAM,CAAC;CAClB,GAAG,IAAI,CAAC,CAQR"}
1
+ {"version":3,"file":"installer.d.ts","sourceRoot":"","sources":["../../../src/cliproxy/binary/installer.ts"],"names":[],"mappings":"AAAA;;;GAGG;;AAEH,OAAO,KAAK,EAAE,MAAM,IAAI,CAAC;AAGzB,OAAO,EAAE,mBAAmB,EAAE,MAAM,UAAU,CAAC;AAC/C,OAAO,EACL,cAAc,EAKf,MAAM,6BAA6B,CAAC;AACrC,OAAO,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAC;AACjD,OAAO,EAAE,cAAc,EAAmB,MAAM,YAAY,CAAC;AAC7D,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAK7C,UAAU,sBAAsB;IAC9B,mBAAmB,CAAC,EAAE,OAAO,iBAAiB,CAAC;IAC/C,gBAAgB,CAAC,EAAE,OAAO,cAAc,CAAC;IACzC,gBAAgB,CAAC,EAAE,OAAO,cAAc,CAAC;IACzC,YAAY,CAAC,EAAE,OAAO,EAAE,CAAC,UAAU,CAAC;CACrC;AAED;;GAEG;AACH,wBAAsB,kBAAkB,CACtC,MAAM,EAAE,mBAAmB,EAC3B,OAAO,UAAQ,EACf,IAAI,GAAE,sBAA2B,GAChC,OAAO,CAAC,IAAI,CAAC,CAkHf;AAED,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,UAAU,CAAC;AAEhD,+CAA+C;AAC/C,wBAAgB,YAAY,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,UAAQ,EAAE,OAAO,CAAC,EAAE,eAAe,GAAG,IAAI,CAmB9F;AAED,sBAAsB;AACtB,wBAAgB,aAAa,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,eAAe,GAAG,MAAM,CAGhF;AAED,6BAA6B;AAC7B,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,eAAe,GAAG,OAAO,CAErF;AAED,mCAAmC;AACnC,wBAAsB,aAAa,CACjC,OAAO,EAAE,MAAM,EACf,OAAO,EAAE,MAAM,EACf,OAAO,CAAC,EAAE,eAAe,GACxB,OAAO,CAAC;IACT,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,UAAU,CAAC,OAAO,cAAc,CAAC,CAAC;IAC5C,QAAQ,EAAE,MAAM,CAAC;CAClB,GAAG,IAAI,CAAC,CAQR"}
@@ -30,83 +30,122 @@ Object.defineProperty(exports, "__esModule", { value: true });
30
30
  exports.getBinaryInfo = exports.isBinaryInstalled = exports.getBinaryPath = exports.deleteBinary = exports.downloadAndInstall = void 0;
31
31
  const fs = __importStar(require("fs"));
32
32
  const path = __importStar(require("path"));
33
+ const lockfile = __importStar(require("proper-lockfile"));
33
34
  const platform_detector_1 = require("../binary/platform-detector");
34
35
  const downloader_1 = require("./downloader");
35
36
  const verifier_1 = require("./verifier");
36
37
  const extractor_1 = require("./extractor");
37
- const version_cache_1 = require("./version-cache");
38
38
  const progress_indicator_1 = require("../../utils/progress-indicator");
39
39
  const ui_1 = require("../../utils/ui");
40
+ const error_types_1 = require("../../errors/error-types");
40
41
  /**
41
42
  * Download and install the binary
42
43
  */
43
- async function downloadAndInstall(config, verbose = false) {
44
+ async function downloadAndInstall(config, verbose = false, deps = {}) {
44
45
  const backend = config.backend ?? platform_detector_1.DEFAULT_BACKEND;
45
46
  const platform = (0, platform_detector_1.detectPlatform)(config.version, backend);
46
47
  const downloadUrl = (0, platform_detector_1.getDownloadUrl)(config.version, backend);
47
48
  const checksumsUrl = (0, platform_detector_1.getChecksumsUrl)(config.version, backend);
48
49
  const backendLabel = backend === 'plus' ? 'CLIProxy Plus' : 'CLIProxy';
50
+ const downloadWithRetryFn = deps.downloadWithRetryFn ?? downloader_1.downloadWithRetry;
51
+ const verifyChecksumFn = deps.verifyChecksumFn ?? verifier_1.verifyChecksum;
52
+ const extractArchiveFn = deps.extractArchiveFn ?? extractor_1.extractArchive;
53
+ const renameSyncFn = deps.renameSyncFn ?? fs.renameSync;
49
54
  fs.mkdirSync(config.binPath, { recursive: true });
50
- // Delete existing binary before install to prevent mismatched binaries.
51
- // Abort if binary is currently running (ETXTBSY) — cannot replace in-use binary.
52
- // Happens in Docker when dashboard tries to update while bootstrap's instance is active.
53
- const existingBinary = path.join(config.binPath, (0, platform_detector_1.getExecutableName)(backend));
54
- if (fs.existsSync(existingBinary)) {
55
- try {
56
- fs.unlinkSync(existingBinary);
57
- if (verbose)
58
- console.error(`[cliproxy] Removed existing binary: ${existingBinary}`);
59
- }
60
- catch (error) {
61
- const code = error instanceof Error && 'code' in error ? error.code : '';
62
- // ETXTBSY: Linux-specific error when unlinking a running executable.
63
- // EBUSY on Windows may mean something different (mount point, etc.),
64
- // so only treat ETXTBSY as "binary in use" to avoid misleading messages.
65
- if (code === 'ETXTBSY') {
66
- if (verbose)
67
- console.error(`[cliproxy] Binary is running, cannot replace: ${existingBinary}`);
68
- throw new Error('CLIProxy binary is currently running and cannot be replaced. Restart the container to apply the update.');
69
- }
70
- throw error;
71
- }
72
- }
73
- const archivePath = path.join(config.binPath, `cliproxy-archive.${platform.extension}`);
55
+ const releaseLock = await lockfile.lock(config.binPath, {
56
+ stale: 10 * 60 * 1000,
57
+ retries: { retries: 60, factor: 1, minTimeout: 250, maxTimeout: 250 },
58
+ });
59
+ let stagingPath;
74
60
  const spinner = new progress_indicator_1.ProgressIndicator(`Downloading ${backendLabel} v${config.version}`);
75
- spinner.start();
61
+ let installError;
76
62
  try {
77
- const result = await (0, downloader_1.downloadWithRetry)(downloadUrl, archivePath, {
63
+ for (const entry of fs.readdirSync(config.binPath)) {
64
+ if (entry.startsWith('.cliproxy-install-')) {
65
+ fs.rmSync(path.join(config.binPath, entry), { recursive: true, force: true });
66
+ }
67
+ }
68
+ stagingPath = fs.mkdtempSync(path.join(config.binPath, '.cliproxy-install-'));
69
+ const archivePath = path.join(stagingPath, `cliproxy-archive.${platform.extension}`);
70
+ const stagedBinary = path.join(stagingPath, (0, platform_detector_1.getExecutableName)(backend));
71
+ const stagedVersion = path.join(stagingPath, '.version');
72
+ const installedBinary = path.join(config.binPath, (0, platform_detector_1.getExecutableName)(backend));
73
+ const installedVersion = path.join(config.binPath, '.version');
74
+ const backupBinary = path.join(stagingPath, '.previous-binary');
75
+ const hadInstalledBinary = fs.existsSync(installedBinary);
76
+ spinner.start();
77
+ const result = await downloadWithRetryFn(downloadUrl, archivePath, {
78
78
  maxRetries: config.maxRetries,
79
79
  verbose,
80
80
  });
81
81
  if (!result.success) {
82
82
  spinner.fail('Download failed');
83
- throw new Error(result.error || 'Download failed after retries');
83
+ throw new error_types_1.NetworkError(result.error || 'Download failed after retries', downloadUrl);
84
84
  }
85
85
  spinner.update('Verifying checksum');
86
- const checksumResult = await (0, verifier_1.verifyChecksum)(archivePath, platform.binaryName, checksumsUrl, verbose);
86
+ const checksumResult = await verifyChecksumFn(archivePath, platform.binaryName, checksumsUrl, verbose);
87
87
  if (!checksumResult.valid) {
88
88
  spinner.fail('Checksum mismatch');
89
- fs.unlinkSync(archivePath);
90
- throw new Error(`Checksum mismatch for ${platform.binaryName}\nExpected: ${checksumResult.expected}\n` +
91
- `Actual: ${checksumResult.actual}\n\nManual download: ${downloadUrl}`);
89
+ throw new error_types_1.BinaryError(`Checksum mismatch for ${platform.binaryName}\nExpected: ${checksumResult.expected}\n` +
90
+ `Actual: ${checksumResult.actual}\n\nManual download: ${downloadUrl}`, stagedBinary);
92
91
  }
93
92
  spinner.update('Extracting binary');
94
- await (0, extractor_1.extractArchive)(archivePath, config.binPath, platform.extension, verbose, backend);
95
- spinner.succeed(`${backendLabel} ready`);
96
- fs.unlinkSync(archivePath);
97
- const binaryPath = path.join(config.binPath, (0, platform_detector_1.getExecutableName)(backend));
98
- if (platform.os !== 'windows' && fs.existsSync(binaryPath)) {
99
- fs.chmodSync(binaryPath, 0o755);
93
+ await extractArchiveFn(archivePath, stagingPath, platform.extension, verbose, backend);
94
+ if (!fs.existsSync(stagedBinary) || !fs.statSync(stagedBinary).isFile()) {
95
+ throw new error_types_1.BinaryError(`Extracted archive did not contain ${(0, platform_detector_1.getExecutableName)(backend)}`, stagedBinary);
96
+ }
97
+ if (platform.os !== 'windows') {
98
+ fs.chmodSync(stagedBinary, 0o755);
100
99
  if (verbose)
101
- console.error(`[cliproxy] Set executable permissions: ${binaryPath}`);
100
+ console.error(`[cliproxy] Set executable permissions: ${stagedBinary}`);
102
101
  }
103
- (0, version_cache_1.writeInstalledVersion)(config.binPath, config.version);
102
+ fs.writeFileSync(stagedVersion, config.version, 'utf8');
103
+ if (hadInstalledBinary) {
104
+ fs.copyFileSync(installedBinary, backupBinary);
105
+ if (platform.os !== 'windows')
106
+ fs.chmodSync(backupBinary, 0o755);
107
+ }
108
+ renameSyncFn(stagedBinary, installedBinary);
109
+ try {
110
+ renameSyncFn(stagedVersion, installedVersion);
111
+ }
112
+ catch (error) {
113
+ if (hadInstalledBinary) {
114
+ renameSyncFn(backupBinary, installedBinary);
115
+ }
116
+ else {
117
+ fs.unlinkSync(installedBinary);
118
+ }
119
+ throw error;
120
+ }
121
+ spinner.succeed(`${backendLabel} ready`);
104
122
  console.log((0, ui_1.ok)(`${backendLabel} v${config.version} installed successfully`));
105
123
  }
106
124
  catch (error) {
125
+ installError = error;
107
126
  spinner.fail('Installation failed');
108
127
  throw error;
109
128
  }
129
+ finally {
130
+ let cleanupError;
131
+ try {
132
+ if (stagingPath)
133
+ fs.rmSync(stagingPath, { recursive: true, force: true });
134
+ }
135
+ catch (error) {
136
+ cleanupError = error;
137
+ }
138
+ finally {
139
+ try {
140
+ await releaseLock();
141
+ }
142
+ catch (error) {
143
+ cleanupError ?? (cleanupError = error);
144
+ }
145
+ }
146
+ if (!installError && cleanupError)
147
+ throw cleanupError;
148
+ }
110
149
  }
111
150
  exports.downloadAndInstall = downloadAndInstall;
112
151
  /** Delete binary (for cleanup or reinstall) */
@@ -122,7 +161,7 @@ function deleteBinary(binPath, verbose = false, backend) {
122
161
  catch (error) {
123
162
  const code = error instanceof Error && 'code' in error ? error.code : '';
124
163
  if (code === 'ETXTBSY') {
125
- throw new Error('CLIProxy binary is currently running and cannot be deleted.');
164
+ throw new error_types_1.BinaryError('CLIProxy binary is currently running and cannot be deleted.', binaryPath);
126
165
  }
127
166
  throw error;
128
167
  }
@@ -1 +1 @@
1
- {"version":3,"file":"installer.js","sourceRoot":"","sources":["../../../src/cliproxy/binary/installer.ts"],"names":[],"mappings":";AAAA;;;GAGG;;;;;;;;;;;;;;;;;;;;;;;;;;AAEH,uCAAyB;AACzB,2CAA6B;AAE7B,mEAMqC;AACrC,6CAAiD;AACjD,yCAA6D;AAC7D,2CAA6C;AAC7C,mDAAwD;AACxD,uEAAmE;AACnE,uCAAoC;AAEpC;;GAEG;AACI,KAAK,UAAU,kBAAkB,CACtC,MAA2B,EAC3B,OAAO,GAAG,KAAK;IAEf,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,IAAI,mCAAe,CAAC;IAClD,MAAM,QAAQ,GAAG,IAAA,kCAAc,EAAC,MAAM,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;IACzD,MAAM,WAAW,GAAG,IAAA,kCAAc,EAAC,MAAM,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;IAC5D,MAAM,YAAY,GAAG,IAAA,mCAAe,EAAC,MAAM,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;IAC9D,MAAM,YAAY,GAAG,OAAO,KAAK,MAAM,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,UAAU,CAAC;IAEvE,EAAE,CAAC,SAAS,CAAC,MAAM,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAElD,wEAAwE;IACxE,iFAAiF;IACjF,yFAAyF;IACzF,MAAM,cAAc,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,IAAA,qCAAiB,EAAC,OAAO,CAAC,CAAC,CAAC;IAC7E,IAAI,EAAE,CAAC,UAAU,CAAC,cAAc,CAAC,EAAE,CAAC;QAClC,IAAI,CAAC;YACH,EAAE,CAAC,UAAU,CAAC,cAAc,CAAC,CAAC;YAC9B,IAAI,OAAO;gBAAE,OAAO,CAAC,KAAK,CAAC,uCAAuC,cAAc,EAAE,CAAC,CAAC;QACtF,CAAC;QAAC,OAAO,KAAc,EAAE,CAAC;YACxB,MAAM,IAAI,GACR,KAAK,YAAY,KAAK,IAAI,MAAM,IAAI,KAAK,CAAC,CAAC,CAAE,KAA0B,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC;YACpF,qEAAqE;YACrE,qEAAqE;YACrE,yEAAyE;YACzE,IAAI,IAAI,KAAK,SAAS,EAAE,CAAC;gBACvB,IAAI,OAAO;oBACT,OAAO,CAAC,KAAK,CAAC,iDAAiD,cAAc,EAAE,CAAC,CAAC;gBACnF,MAAM,IAAI,KAAK,CACb,yGAAyG,CAC1G,CAAC;YACJ,CAAC;YACD,MAAM,KAAK,CAAC;QACd,CAAC;IACH,CAAC;IAED,MAAM,WAAW,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,oBAAoB,QAAQ,CAAC,SAAS,EAAE,CAAC,CAAC;IACxF,MAAM,OAAO,GAAG,IAAI,sCAAiB,CAAC,eAAe,YAAY,KAAK,MAAM,CAAC,OAAO,EAAE,CAAC,CAAC;IACxF,OAAO,CAAC,KAAK,EAAE,CAAC;IAEhB,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,IAAA,8BAAiB,EAAC,WAAW,EAAE,WAAW,EAAE;YAC/D,UAAU,EAAE,MAAM,CAAC,UAAU;YAC7B,OAAO;SACR,CAAC,CAAC;QACH,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;YACpB,OAAO,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC;YAChC,MAAM,IAAI,KAAK,CAAC,MAAM,CAAC,KAAK,IAAI,+BAA+B,CAAC,CAAC;QACnE,CAAC;QAED,OAAO,CAAC,MAAM,CAAC,oBAAoB,CAAC,CAAC;QACrC,MAAM,cAAc,GAAG,MAAM,IAAA,yBAAc,EACzC,WAAW,EACX,QAAQ,CAAC,UAAU,EACnB,YAAY,EACZ,OAAO,CACR,CAAC;QAEF,IAAI,CAAC,cAAc,CAAC,KAAK,EAAE,CAAC;YAC1B,OAAO,CAAC,IAAI,CAAC,mBAAmB,CAAC,CAAC;YAClC,EAAE,CAAC,UAAU,CAAC,WAAW,CAAC,CAAC;YAC3B,MAAM,IAAI,KAAK,CACb,yBAAyB,QAAQ,CAAC,UAAU,eAAe,cAAc,CAAC,QAAQ,IAAI;gBACpF,aAAa,cAAc,CAAC,MAAM,wBAAwB,WAAW,EAAE,CAC1E,CAAC;QACJ,CAAC;QAED,OAAO,CAAC,MAAM,CAAC,mBAAmB,CAAC,CAAC;QACpC,MAAM,IAAA,0BAAc,EAAC,WAAW,EAAE,MAAM,CAAC,OAAO,EAAE,QAAQ,CAAC,SAAS,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;QACxF,OAAO,CAAC,OAAO,CAAC,GAAG,YAAY,QAAQ,CAAC,CAAC;QACzC,EAAE,CAAC,UAAU,CAAC,WAAW,CAAC,CAAC;QAE3B,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,IAAA,qCAAiB,EAAC,OAAO,CAAC,CAAC,CAAC;QACzE,IAAI,QAAQ,CAAC,EAAE,KAAK,SAAS,IAAI,EAAE,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;YAC3D,EAAE,CAAC,SAAS,CAAC,UAAU,EAAE,KAAK,CAAC,CAAC;YAChC,IAAI,OAAO;gBAAE,OAAO,CAAC,KAAK,CAAC,0CAA0C,UAAU,EAAE,CAAC,CAAC;QACrF,CAAC;QAED,IAAA,qCAAqB,EAAC,MAAM,CAAC,OAAO,EAAE,MAAM,CAAC,OAAO,CAAC,CAAC;QACtD,OAAO,CAAC,GAAG,CAAC,IAAA,OAAE,EAAC,GAAG,YAAY,KAAK,MAAM,CAAC,OAAO,yBAAyB,CAAC,CAAC,CAAC;IAC/E,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,IAAI,CAAC,qBAAqB,CAAC,CAAC;QACpC,MAAM,KAAK,CAAC;IACd,CAAC;AACH,CAAC;AArFD,gDAqFC;AAID,+CAA+C;AAC/C,SAAgB,YAAY,CAAC,OAAe,EAAE,OAAO,GAAG,KAAK,EAAE,OAAyB;IACtF,MAAM,gBAAgB,GAAG,OAAO,IAAI,mCAAe,CAAC;IACpD,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,IAAA,qCAAiB,EAAC,gBAAgB,CAAC,CAAC,CAAC;IAC3E,IAAI,EAAE,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;QAC9B,IAAI,CAAC;YACH,EAAE,CAAC,UAAU,CAAC,UAAU,CAAC,CAAC;YAC1B,IAAI,OAAO;gBAAE,OAAO,CAAC,KAAK,CAAC,uBAAuB,UAAU,EAAE,CAAC,CAAC;QAClE,CAAC;QAAC,OAAO,KAAc,EAAE,CAAC;YACxB,MAAM,IAAI,GACR,KAAK,YAAY,KAAK,IAAI,MAAM,IAAI,KAAK,CAAC,CAAC,CAAE,KAA0B,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC;YACpF,IAAI,IAAI,KAAK,SAAS,EAAE,CAAC;gBACvB,MAAM,IAAI,KAAK,CAAC,6DAA6D,CAAC,CAAC;YACjF,CAAC;YACD,MAAM,KAAK,CAAC;QACd,CAAC;IACH,CAAC;AACH,CAAC;AAhBD,oCAgBC;AAED,sBAAsB;AACtB,SAAgB,aAAa,CAAC,OAAe,EAAE,OAAyB;IACtE,MAAM,gBAAgB,GAAG,OAAO,IAAI,mCAAe,CAAC;IACpD,OAAO,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,IAAA,qCAAiB,EAAC,gBAAgB,CAAC,CAAC,CAAC;AACjE,CAAC;AAHD,sCAGC;AAED,6BAA6B;AAC7B,SAAgB,iBAAiB,CAAC,OAAe,EAAE,OAAyB;IAC1E,OAAO,EAAE,CAAC,UAAU,CAAC,aAAa,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC;AACxD,CAAC;AAFD,8CAEC;AAED,mCAAmC;AAC5B,KAAK,UAAU,aAAa,CACjC,OAAe,EACf,OAAe,EACf,OAAyB;IAOzB,MAAM,gBAAgB,GAAG,OAAO,IAAI,mCAAe,CAAC;IACpD,MAAM,UAAU,GAAG,aAAa,CAAC,OAAO,EAAE,gBAAgB,CAAC,CAAC;IAC5D,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,UAAU,CAAC;QAAE,OAAO,IAAI,CAAC;IAE5C,MAAM,QAAQ,GAAG,IAAA,kCAAc,EAAC,SAAS,EAAE,gBAAgB,CAAC,CAAC;IAC7D,MAAM,QAAQ,GAAG,MAAM,IAAA,0BAAe,EAAC,UAAU,CAAC,CAAC;IACnD,OAAO,EAAE,IAAI,EAAE,UAAU,EAAE,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,CAAC;AAC3D,CAAC;AAjBD,sCAiBC"}
1
+ {"version":3,"file":"installer.js","sourceRoot":"","sources":["../../../src/cliproxy/binary/installer.ts"],"names":[],"mappings":"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"}
@@ -3,9 +3,14 @@
3
3
  * Handles ensuring binary availability and auto-updates.
4
4
  */
5
5
  import { BinaryManagerConfig } from '../types';
6
+ import { downloadAndInstall } from './installer';
6
7
  /**
7
8
  * Ensure binary is available (download if missing, update if outdated)
8
9
  * @returns Path to executable binary
9
10
  */
10
- export declare function ensureBinary(config: BinaryManagerConfig): Promise<string>;
11
+ interface EnsureBinaryDeps {
12
+ downloadAndInstallFn?: typeof downloadAndInstall;
13
+ }
14
+ export declare function ensureBinary(config: BinaryManagerConfig, deps?: EnsureBinaryDeps): Promise<string>;
15
+ export {};
11
16
  //# sourceMappingURL=lifecycle.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"lifecycle.d.ts","sourceRoot":"","sources":["../../../src/cliproxy/binary/lifecycle.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,EAAE,mBAAmB,EAAmB,MAAM,UAAU,CAAC;AA+FhE;;;GAGG;AACH,wBAAsB,YAAY,CAAC,MAAM,EAAE,mBAAmB,GAAG,OAAO,CAAC,MAAM,CAAC,CA4D/E"}
1
+ {"version":3,"file":"lifecycle.d.ts","sourceRoot":"","sources":["../../../src/cliproxy/binary/lifecycle.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,EAAE,mBAAmB,EAAmB,MAAM,UAAU,CAAC;AAOhE,OAAO,EAAE,kBAAkB,EAAiB,MAAM,aAAa,CAAC;AAyFhE;;;GAGG;AACH,UAAU,gBAAgB;IACxB,oBAAoB,CAAC,EAAE,OAAO,kBAAkB,CAAC;CAClD;AAED,wBAAsB,YAAY,CAChC,MAAM,EAAE,mBAAmB,EAC3B,IAAI,GAAE,gBAAqB,GAC1B,OAAO,CAAC,MAAM,CAAC,CAoEjB"}
@@ -34,6 +34,7 @@ const installer_1 = require("./installer");
34
34
  const ui_1 = require("../../utils/ui");
35
35
  const stats_fetcher_1 = require("../services/stats-fetcher");
36
36
  const port_manager_1 = require("../config/port-manager");
37
+ const error_types_1 = require("../../errors/error-types");
37
38
  const platform_detector_1 = require("../binary/platform-detector");
38
39
  /** Log helper */
39
40
  function log(message, verbose) {
@@ -97,24 +98,26 @@ async function handleAutoUpdate(config, verbose) {
97
98
  else {
98
99
  console.log((0, ui_1.info)(updateMsg));
99
100
  console.log((0, ui_1.info)(`Updating ${backendLabel}...`));
100
- (0, installer_1.deleteBinary)(config.binPath, verbose, backend);
101
+ // The installer stages and validates the replacement before atomically swapping it.
101
102
  config.version = targetVersion;
102
103
  await (0, installer_1.downloadAndInstall)(config, verbose);
103
104
  }
104
105
  }
105
- /**
106
- * Ensure binary is available (download if missing, update if outdated)
107
- * @returns Path to executable binary
108
- */
109
- async function ensureBinary(config) {
106
+ async function ensureBinary(config, deps = {}) {
110
107
  const verbose = config.verbose;
111
108
  const backend = config.backend ?? platform_detector_1.DEFAULT_BACKEND;
112
109
  const binaryPath = (0, installer_1.getBinaryPath)(config.binPath, backend);
110
+ const downloadAndInstallFn = deps.downloadAndInstallFn ?? installer_1.downloadAndInstall;
113
111
  // Binary exists - check for updates unless forceVersion
114
112
  if (fs.existsSync(binaryPath)) {
115
113
  log(`Binary exists: ${binaryPath}`, verbose);
114
+ if (config.replaceExisting) {
115
+ log(`Force version mode: installing specified version ${config.version}`, verbose);
116
+ await downloadAndInstallFn(config, verbose);
117
+ return binaryPath;
118
+ }
116
119
  if (config.forceVersion) {
117
- log('Force version mode: skipping auto-update', verbose);
120
+ log(`Pinned version mode: using installed version ${config.version}`, verbose);
118
121
  return binaryPath;
119
122
  }
120
123
  if (config.skipAutoUpdate) {
@@ -132,8 +135,8 @@ async function ensureBinary(config) {
132
135
  }
133
136
  // Binary missing
134
137
  if (!config.allowInstall) {
135
- throw new Error(`${getBackendLabel(backend)} binary is not installed locally. ` +
136
- 'Run "ccs cliproxy install" when you have network access.');
138
+ throw new error_types_1.BinaryError(`${getBackendLabel(backend)} binary is not installed locally. ` +
139
+ 'Run "ccs cliproxy install" when you have network access.', binaryPath);
137
140
  }
138
141
  // Only log download intent when a download will actually happen
139
142
  log('Binary not found, downloading...', verbose);
@@ -156,7 +159,7 @@ async function ensureBinary(config) {
156
159
  else {
157
160
  log(`Force version mode: using specified version ${config.version}`, verbose);
158
161
  }
159
- await (0, installer_1.downloadAndInstall)(config, verbose);
162
+ await downloadAndInstallFn(config, verbose);
160
163
  return binaryPath;
161
164
  }
162
165
  exports.ensureBinary = ensureBinary;
@@ -1 +1 @@
1
- {"version":3,"file":"lifecycle.js","sourceRoot":"","sources":["../../../src/cliproxy/binary/lifecycle.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"lifecycle.js","sourceRoot":"","sources":["../../../src/cliproxy/binary/lifecycle.ts"],"names":[],"mappings":"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"}
@@ -27,6 +27,7 @@ export declare function getStoredConfiguredBackend(): CLIProxyBackend;
27
27
  * community fork instead of degrading to original.
28
28
  */
29
29
  export declare function getConfiguredBackend(options?: ResolveLocalBackendOptions): CLIProxyBackend;
30
+ export declare function withCliproxyInstallLifecycleLock<T>(backend: CLIProxyBackend, operation: () => Promise<T>): Promise<T>;
30
31
  /**
31
32
  * Binary Manager class for CLIProxyAPI binary lifecycle
32
33
  */
@@ -67,6 +68,7 @@ interface InstallCliproxyVersionDeps {
67
68
  formatInfo?: typeof info;
68
69
  formatWarn?: typeof warn;
69
70
  getInstalledVersion?: typeof getInstalledCliproxyVersion;
71
+ withInstallLifecycleLockFn?: typeof withCliproxyInstallLifecycleLock;
70
72
  }
71
73
  /** Install a specific version of CLIProxyAPI */
72
74
  export declare function installCliproxyVersion(version: string, verbose?: boolean, backend?: CLIProxyBackend, deps?: InstallCliproxyVersionDeps): Promise<void>;
@@ -1 +1 @@
1
- {"version":3,"file":"binary-manager.d.ts","sourceRoot":"","sources":["../../src/cliproxy/binary-manager.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"binary-manager.d.ts","sourceRoot":"","sources":["../../src/cliproxy/binary-manager.ts"],"names":[],"mappings":"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"}
@@ -29,7 +29,7 @@ var __importStar = (this && this.__importStar) || function (mod) {
29
29
  return result;
30
30
  };
31
31
  Object.defineProperty(exports, "__esModule", { value: true });
32
- exports.migrateVersionPin = exports.isVersionPinned = exports.clearPinnedVersion = exports.savePinnedVersion = exports.getPinnedVersion = exports.getVersionPinPath = exports.checkCliproxyUpdate = exports.fetchLatestCliproxyVersion = exports.installCliproxyVersion = exports.getInstalledCliproxyVersion = exports.getCLIProxyPath = exports.isCLIProxyInstalled = exports.ensureCLIProxyBinary = exports.BinaryManager = exports.getConfiguredBackend = exports.getStoredConfiguredBackend = exports.resolveLocalBackend = exports.syncPlusFallbackStateIfNeeded = exports.getPlusBackendUnavailableMessage = exports.CLIPROXY_PLUS_TRACKING_URL = exports.CLIPROXY_PLUS_FORK_URL = exports.CLIPROXY_PLUS_FALLBACK_TRACKING_URL = exports.CLIPROXY_DELETED_PLUS_REPO = void 0;
32
+ exports.migrateVersionPin = exports.isVersionPinned = exports.clearPinnedVersion = exports.savePinnedVersion = exports.getPinnedVersion = exports.getVersionPinPath = exports.checkCliproxyUpdate = exports.fetchLatestCliproxyVersion = exports.installCliproxyVersion = exports.getInstalledCliproxyVersion = exports.getCLIProxyPath = exports.isCLIProxyInstalled = exports.ensureCLIProxyBinary = exports.BinaryManager = exports.withCliproxyInstallLifecycleLock = exports.getConfiguredBackend = exports.getStoredConfiguredBackend = exports.resolveLocalBackend = exports.syncPlusFallbackStateIfNeeded = exports.getPlusBackendUnavailableMessage = exports.CLIPROXY_PLUS_TRACKING_URL = exports.CLIPROXY_PLUS_FORK_URL = exports.CLIPROXY_PLUS_FALLBACK_TRACKING_URL = exports.CLIPROXY_DELETED_PLUS_REPO = void 0;
33
33
  const fs = __importStar(require("fs"));
34
34
  const path = __importStar(require("path"));
35
35
  const ui_1 = require("../utils/ui");
@@ -47,6 +47,7 @@ Object.defineProperty(exports, "getVersionPinPath", { enumerable: true, get: fun
47
47
  Object.defineProperty(exports, "migrateVersionPin", { enumerable: true, get: function () { return binary_1.migrateVersionPin; } });
48
48
  const version_cache_1 = require("./binary/version-cache");
49
49
  const config_loader_facade_1 = require("../config/config-loader-facade");
50
+ const install_lifecycle_lock_1 = require("./binary/install-lifecycle-lock");
50
51
  exports.CLIPROXY_DELETED_PLUS_REPO = 'router-for-me/CLIProxyAPIPlus';
51
52
  exports.CLIPROXY_PLUS_FALLBACK_TRACKING_URL = 'https://github.com/kaitranntt/ccs/issues/1062';
52
53
  exports.CLIPROXY_PLUS_FORK_URL = 'https://github.com/kaitranntt/CLIProxyAPIPlus';
@@ -153,6 +154,11 @@ function getBackendBinDir(backend = platform_detector_1.DEFAULT_BACKEND) {
153
154
  const baseDir = (0, config_generator_1.getBinDir)();
154
155
  return `${baseDir}/${backend}`;
155
156
  }
157
+ async function withCliproxyInstallLifecycleLock(backend, operation) {
158
+ const lockTarget = path.join((0, config_generator_1.getBinDir)(), `.install-lifecycle-${backend}`);
159
+ return (0, install_lifecycle_lock_1.withInstallLifecycleLock)(lockTarget, operation);
160
+ }
161
+ exports.withCliproxyInstallLifecycleLock = withCliproxyInstallLifecycleLock;
156
162
  /** Default configuration (uses backend from config.yaml or defaults to `DEFAULT_BACKEND`) */
157
163
  function createDefaultConfig(backend = platform_detector_1.DEFAULT_BACKEND) {
158
164
  const backendConfig = platform_detector_1.BACKEND_CONFIG[backend];
@@ -163,6 +169,7 @@ function createDefaultConfig(backend = platform_detector_1.DEFAULT_BACKEND) {
163
169
  maxRetries: 3,
164
170
  verbose: false,
165
171
  forceVersion: false,
172
+ replaceExisting: false,
166
173
  skipAutoUpdate: false,
167
174
  allowInstall: true,
168
175
  backend, // Pass backend for installer to use correct download URL
@@ -254,39 +261,34 @@ exports.getInstalledCliproxyVersion = getInstalledCliproxyVersion;
254
261
  async function installCliproxyVersion(version, verbose = false, backend, deps = {}) {
255
262
  const configuredBackend = backend ?? getConfiguredOrDefaultBackend();
256
263
  const effectiveBackend = resolveLocalBackend(configuredBackend, { notifyOnPlus: true });
257
- const manager = deps.createManager?.({ version, verbose, forceVersion: true }, effectiveBackend) ??
258
- new BinaryManager({ version, verbose, forceVersion: true }, effectiveBackend);
264
+ const manager = deps.createManager?.({ version, verbose, forceVersion: true, replaceExisting: true }, effectiveBackend) ??
265
+ new BinaryManager({ version, verbose, forceVersion: true, replaceExisting: true }, effectiveBackend);
259
266
  const stopProxyFn = deps.stopProxyFn ?? proxy_lifecycle_service_1.stopProxy;
260
267
  const waitForPortFreeFn = deps.waitForPortFreeFn ?? port_utils_1.waitForPortFree;
261
268
  const formatInfo = deps.formatInfo ?? ui_1.info;
262
269
  const formatWarn = deps.formatWarn ?? ui_1.warn;
263
- const getInstalledVersion = deps.getInstalledVersion ?? getInstalledCliproxyVersion;
264
- // Always attempt a best-effort stop first so we also catch untracked proxies
265
- // that are running without a session lock.
266
- if (verbose)
267
- console.log(formatInfo('Stopping running CLIProxy before update...'));
268
- const result = await stopProxyFn();
269
- if (result.stopped) {
270
- const stoppedPort = result.port ?? (0, port_manager_1.resolveLifecyclePort)();
271
- // Wait for port to be fully released
272
- const portFree = await waitForPortFreeFn(stoppedPort, 5000);
273
- if (!portFree && verbose) {
274
- console.log(formatWarn('Port did not free up in time, proceeding anyway...'));
275
- }
276
- }
277
- else if (verbose && result.error && result.error !== 'No active CLIProxy session found') {
278
- console.log(formatWarn(`Could not stop proxy: ${result.error}`));
279
- }
280
- if (manager.isBinaryInstalled()) {
281
- const label = effectiveBackend === 'plus' ? 'CLIProxy Plus' : 'CLIProxy';
270
+ const withLifecycleLock = deps.withInstallLifecycleLockFn ?? withCliproxyInstallLifecycleLock;
271
+ await withLifecycleLock(effectiveBackend, async () => {
272
+ // Always attempt a best-effort stop first so we also catch untracked proxies
273
+ // that are running without a session lock.
282
274
  if (verbose)
283
- console.log(formatInfo(`Removing existing ${label} v${getInstalledVersion(effectiveBackend)}`));
284
- manager.deleteBinary();
285
- }
286
- await manager.ensureBinary();
287
- if (verbose) {
288
- console.log(formatInfo('New version will be active on next CLIProxy command'));
289
- }
275
+ console.log(formatInfo('Stopping running CLIProxy before update...'));
276
+ const result = await stopProxyFn();
277
+ if (result.stopped) {
278
+ const stoppedPort = result.port ?? (0, port_manager_1.resolveLifecyclePort)();
279
+ const portFree = await waitForPortFreeFn(stoppedPort, 5000);
280
+ if (!portFree && verbose) {
281
+ console.log(formatWarn('Port did not free up in time, proceeding anyway...'));
282
+ }
283
+ }
284
+ else if (verbose && result.error && result.error !== 'No active CLIProxy session found') {
285
+ console.log(formatWarn(`Could not stop proxy: ${result.error}`));
286
+ }
287
+ await manager.ensureBinary();
288
+ if (verbose) {
289
+ console.log(formatInfo('New version will be active on next CLIProxy command'));
290
+ }
291
+ });
290
292
  }
291
293
  exports.installCliproxyVersion = installCliproxyVersion;
292
294
  /** Fetch the latest CLIProxyAPI version from GitHub API */